protected override void OnReceiveCMoveRequest(byte presentationID, ushort messageID, string destinationAE, DcmPriority priority, DcmDataset query)
{
Console.WriteLine(String.Format("{0} Receive C-Move from {1} (marked as anonymous:{2})", DateTime.Now, this.Associate.CallingAE, _flagAnonymousAccess));
Debug.WriteLine(query.Dump());
AEInfo recipientInfo = FindAE(destinationAE);
if (recipientInfo == null)
{
SendCMoveResponse(presentationID, messageID, DcmStatus.QueryRetrieveMoveDestinationUnknown, 0, 0, 0, 0);
Console.Write("Moving to:" + recipientInfo.Name + "> ");
return;
}
Console.Write("Moving to:" + recipientInfo.Name + "> ");
ushort imagesProcessed = 0;
ushort errorCount = 0;
ushort successCount = 0;
try
{
using (var database = new MedicalISDataContext())
{
var storeClient = new CStoreClient();
storeClient.CallingAE = "CURAPACS";
storeClient.CalledAE = destinationAE;
storeClient.PreferredTransferSyntax = recipientInfo.TransferSyntax;
storeClient.PreloadCount = 10;
storeClient.LogID = "store";
if (Settings.Default.DebugMove)
Dicom.Debug.InitializeConsoleDebugLogger();
if (_flagAnonymousAccess)
storeClient.DisableFileStreaming = true;
var files = GetFilePaths(database, query);
if (Settings.Default.UseFixedFolder)
{
files = Directory.GetFiles(Settings.Default.FixedFolderPath);
}
long totalSize = 0;
foreach (var f in files)
{
totalSize += new FileInfo(f).Length;
storeClient.AddFile(f);
}
int totalImageCount = (ushort) files.Count();
Console.Write("#{0} files > ", totalImageCount);
Stopwatch timer = Stopwatch.StartNew();
storeClient.OnCStoreRequestBegin = (c, i) =>
{
if (_flagAnonymousAccess)
{
var dataset = i.Dataset;
AnonymizeDatasetBasedOnStudyInfo(dataset);
}
};
storeClient.OnCStoreRequestComplete = (c, i) =>
{
timer.Stop();
if (i.HasError)
{
Console.WriteLine("Error:{0}", i.Error);
}
else
{
// Console.WriteLine("Done");
}
totalImageCount -= storeClient.PendingCount;
};
storeClient.OnCStoreResponseReceived = (c, i) =>
{
if (i.Status == DcmStatus.Success)
{
successCount++;
Console.Write(".");
}
else
{
errorCount++;
Console.Write("x");
}
};
storeClient.OnCStoreRequestProgress = (c, i, p) =>
{
//Console.WriteLine("{0}@{1}", p.BytesTransfered, c.Socket.LocalStats.ToString());
};
storeClient.OnCStoreRequestFailed = (c, i) =>
{
Console.WriteLine("");
Console.WriteLine("Failed. " + i.Error.ToString());
};
storeClient.Connect(recipientInfo.Ip, recipientInfo.Port, DcmSocketType.TCP);
if (storeClient.Wait())
{
}
timer.Stop();
double bytesPerSeconds = (double) totalSize/timer.Elapsed.TotalSeconds;
double MiBPerSecond = bytesPerSeconds/(1024.0*1024.0);
Console.WriteLine("");
Console.WriteLine("Done. {0} MiB/s (ImagesProcessed={1})", MiBPerSecond, imagesProcessed);
SendCMoveResponse(presentationID, messageID, DcmStatus.Success, 0, imagesProcessed, 0, 0);
storeClient.Close();
}
}
catch (Exception ex)
{
Console.WriteLine("");
Console.WriteLine("Failed. => " + ex.ToString());
SendCMoveResponse(presentationID, messageID, DcmStatus.ProcessingFailure, 0, imagesProcessed, 0, 0);
}
}