public void Run() { HeaderStreamingServiceClient client = null; studies = null; StudyInfo study = null; while (true) { Random r = new Random(); if (String.IsNullOrEmpty(FixedStudyInstanceUid)) { bool refresh = false; if (studies == null) { refresh = r.Next() % 10 == 0; } else { refresh = r.NextDouble() < (1.0f / studies.Count / 1000f); } if (refresh) { studies = new List <StudyInfo>(); CFindSCU cfind = new CFindSCU(); cfind.AETitle = LocalAE; cfind.OnResultReceive += new CFindSCU.ResultReceivedHandler(cfind_OnResultReceive); cfind.OnQueryCompleted += new CFindSCU.QueryCompletedHandler(cfind_OnQueryCompleted); cfind.Query(RemoteAE, RemoteHost, RemotePort); waitHandle.WaitOne(); } } else { studies = new List <StudyInfo>(); study = new StudyInfo(); study.StudyUid = FixedStudyInstanceUid; studies.Add(study); } if (studies != null && studies.Count > 0) { try { if (client == null) { client = new HeaderStreamingServiceClient(); client.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, Dns.GetHostName()); client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; } study = studies[r.Next(studies.Count - 1)]; HeaderStreamingParameters param = new HeaderStreamingParameters(); param.ServerAETitle = RemoteAE; param.StudyInstanceUID = study.StudyUid; param.ReferenceID = Guid.NewGuid().ToString(); TimeSpanStatistics ts = new TimeSpanStatistics(); ts.Start(); Console.WriteLine("************ RETRIEVING... {0} **************", LocalAE); Stream input = client.GetStudyHeader(LocalAE, param); if (input != null) { string outputdir = Path.Combine("./output", LocalAE); if (!Directory.Exists(outputdir)) { Directory.CreateDirectory(outputdir); } string temp = Path.Combine(outputdir, study.StudyUid + ".xml"); Console.WriteLine("Reading"); using (FileStream output = new FileStream(temp, FileMode.OpenOrCreate)) { GZipStream gzStream = new GZipStream(input, CompressionMode.Decompress); byte[] buffer = new byte[32 * 1024 * 1024]; int size = gzStream.Read(buffer, 0, buffer.Length); int count = 0; while (size > 0) { output.Write(buffer, 0, size); count += size; Console.Write("\r{0} KB", count / 1024); size = gzStream.Read(buffer, 0, buffer.Length); } output.Close(); } using (FileStream output = new FileStream(temp, FileMode.Open)) { XmlDocument doc = new XmlDocument(); Console.WriteLine("Reading into xml"); StudyXmlIo.Read(doc, output); Console.WriteLine("Done"); } } else { Console.WriteLine("{2} - {1,-16} {0,-64}... NOT FOUND", study.StudyUid, LocalAE, System.Diagnostics.Stopwatch.GetTimestamp()); } ts.End(); input.Close(); //File.Delete(temp); Console.WriteLine("{3} - {2,-16} {0,-64}... OK {1}", study.StudyUid, ts.FormattedValue, LocalAE, System.Diagnostics.Stopwatch.GetTimestamp()); } catch (TimeoutException) { // try again Console.WriteLine("{2} - {1,-16} {0,-64}... TIMEOUT", study.StudyUid, LocalAE, System.Diagnostics.Stopwatch.GetTimestamp()); } catch (Exception fault) { Console.WriteLine("{3} - {2,-16} {0,-64}... FAILED {1}", study.StudyUid, fault.Message, LocalAE, System.Diagnostics.Stopwatch.GetTimestamp()); if (client != null) { client.Abort(); client.Close(); client = null; } } Thread.Sleep(r.Next(Delay)); } else { Thread.Sleep(r.Next(1000, 3000)); } } }
private StudyXml RetrieveStudyXml(StudyLoaderArgs studyLoaderArgs) { var headerParams = new HeaderStreamingParameters { StudyInstanceUID = studyLoaderArgs.StudyInstanceUid, ServerAETitle = _serverAe.AETitle, ReferenceID = Guid.NewGuid().ToString(), IgnoreInUse = studyLoaderArgs.Options != null && studyLoaderArgs.Options.IgnoreInUse }; HeaderStreamingServiceClient client = null; try { string uri = String.Format(StreamingSettings.Default.FormatHeaderServiceUri, _serverAe.ScpParameters.HostName, _serverAe.StreamingParameters.HeaderServicePort); client = new HeaderStreamingServiceClient(new Uri(uri)); client.Open(); var studyXml = client.GetStudyXml(ServerDirectory.GetLocalServer().AETitle, headerParams); client.Close(); return(studyXml); } catch (FaultException <StudyIsInUseFault> e) { throw new InUseLoadStudyException(studyLoaderArgs.StudyInstanceUid, e); } catch (FaultException <StudyIsNearlineFault> e) { throw new NearlineLoadStudyException(studyLoaderArgs.StudyInstanceUid, e) { IsStudyBeingRestored = e.Detail.IsStudyBeingRestored }; } catch (FaultException <StudyNotFoundFault> e) { throw new NotFoundLoadStudyException(studyLoaderArgs.StudyInstanceUid, e); } catch (FaultException e) { //TODO: Some versions (pre-Team) of the ImageServer //throw a generic fault when a study is nearline, instead of the more specialized one. string message = e.Message.ToLower(); if (message.Contains("nearline")) { throw new NearlineLoadStudyException(studyLoaderArgs.StudyInstanceUid, e) { IsStudyBeingRestored = true } } ; //assume true in legacy case. throw new LoadStudyException(studyLoaderArgs.StudyInstanceUid, e); } catch (Exception e) { if (client != null) { client.Abort(); } throw new LoadStudyException(studyLoaderArgs.StudyInstanceUid, e); } }
private void PopulateSeries(string studyInstanceUid) { LogTextPanel.Text = ""; StatisticsLog.Text = ""; HeaderStreamingServiceClient proxy = null; try { proxy = new HeaderStreamingServiceClient(); HeaderStreamingParameters parms = new HeaderStreamingParameters(); parms.StudyInstanceUID = studyInstanceUid; parms.ServerAETitle = ServerAE.Text; parms.ReferenceID = Guid.NewGuid().ToString(); TimeSpanStatistics servicecall = new TimeSpanStatistics(); servicecall.Start(); Stream stream = proxy.GetStudyHeader(AETitle.Text, parms); servicecall.End(); var decompression = new TimeSpanStatistics(); decompression.Start(); //GZipStream gzipStream = new GZipStream(stream, CompressionMode.Decompress); var theMemento = new StudyXmlMemento(); StudyXmlIo.ReadGzip(theMemento, stream); //doc.Load(gzipStream); decompression.End(); var settings = new XmlWriterSettings(); //settings.Indent = true; settings.NewLineOnAttributes = false; settings.OmitXmlDeclaration = true; settings.Encoding = Encoding.UTF8; StringWriter sw = new StringWriter(); XmlWriter writer = XmlWriter.Create(sw, settings); theMemento.Document.WriteTo(writer); writer.Flush(); Log(sw.ToString()); TimeSpanStatistics loading = new TimeSpanStatistics(); loading.Start(); StudyXml xml = new StudyXml(); xml.SetMemento(theMemento); loading.End(); int sopCounter = 0; SeriesTree.Nodes.Clear(); foreach(SeriesXml series in xml) { TreeNode seriesNode = new TreeNode(series.SeriesInstanceUid); SeriesTree.Nodes.Add(seriesNode); foreach(InstanceXml instance in series) { TreeNode instanceNode = new TreeNode(instance.SopInstanceUid); seriesNode.Nodes.Add(instanceNode); sopCounter++; } } StatisticsLog.Text=""; StatisticsLog.Text += String.Format("\r\nHeader Size (Decompressed): {0} KB", sw.ToString().Length / 1024); StatisticsLog.Text += String.Format("\r\nWCF Service call : {0} ms", servicecall.Value.TotalMilliseconds); StatisticsLog.Text += String.Format("\r\nDecompression : {0} ms", decompression.Value.TotalMilliseconds); StatisticsLog.Text += String.Format("\r\nLoading StudyXml : {0} ms", loading.Value.TotalMilliseconds); SeriesLabel.Text = String.Format("Series : {0} \tInstances: {1}", SeriesTree.Nodes.Count, sopCounter); stream.Close(); } catch(FaultException<StudyIsInUseFault> ex) { timer1.Stop(); MessageBox.Show(String.Format("StudyIsInUseFault received:{0}\n\nState={1}" , ex.Message, ex.Detail.StudyState)); } catch (FaultException<StudyIsNearlineFault> ex) { timer1.Stop(); MessageBox.Show("StudyIsNearlineFault received:\n" + ex.Message); } catch (FaultException<StudyNotFoundFault> ex) { timer1.Stop(); MessageBox.Show("StudyNotFoundFault received:\n" + ex.Message); } catch (Exception ex) { timer1.Stop(); MessageBox.Show(ex.Message); } finally { if (proxy.State == CommunicationState.Opened) proxy.Close(); } }
private StudyXml RetrieveStudyXml(StudyLoaderArgs studyLoaderArgs) { var headerParams = new HeaderStreamingParameters { StudyInstanceUID = studyLoaderArgs.StudyInstanceUid, ServerAETitle = _serverAe.AETitle, ReferenceID = Guid.NewGuid().ToString() }; HeaderStreamingServiceClient client = null; try { string uri = String.Format(StreamingSettings.Default.FormatHeaderServiceUri, _serverAe.ScpParameters.HostName, _serverAe.StreamingParameters.HeaderServicePort); client = new HeaderStreamingServiceClient(new Uri(uri)); client.Open(); var studyXml = client.GetStudyXml(ServerDirectory.GetLocalServer().AETitle, headerParams); client.Close(); return studyXml; } catch (FaultException<StudyIsInUseFault> e) { throw new InUseLoadStudyException(studyLoaderArgs.StudyInstanceUid, e); } catch (FaultException<StudyIsNearlineFault> e) { throw new NearlineLoadStudyException(studyLoaderArgs.StudyInstanceUid, e) { IsStudyBeingRestored = e.Detail.IsStudyBeingRestored }; } catch (FaultException<StudyNotFoundFault> e) { throw new NotFoundLoadStudyException(studyLoaderArgs.StudyInstanceUid, e); } catch (FaultException e) { //TODO: Some versions (pre-Team) of the ImageServer //throw a generic fault when a study is nearline, instead of the more specialized one. string message = e.Message.ToLower(); if (message.Contains("nearline")) throw new NearlineLoadStudyException(studyLoaderArgs.StudyInstanceUid, e) { IsStudyBeingRestored = true }; //assume true in legacy case. throw new LoadStudyException(studyLoaderArgs.StudyInstanceUid, e); } catch (Exception e) { if (client != null) client.Abort(); throw new LoadStudyException(studyLoaderArgs.StudyInstanceUid, e); } }
private void PopulateSeries(string studyInstanceUid) { LogTextPanel.Text = ""; StatisticsLog.Text = ""; HeaderStreamingServiceClient proxy = null; try { proxy = new HeaderStreamingServiceClient(); HeaderStreamingParameters parms = new HeaderStreamingParameters(); parms.StudyInstanceUID = studyInstanceUid; parms.ServerAETitle = ServerAE.Text; parms.ReferenceID = Guid.NewGuid().ToString(); TimeSpanStatistics servicecall = new TimeSpanStatistics(); servicecall.Start(); Stream stream = proxy.GetStudyHeader(AETitle.Text, parms); servicecall.End(); var decompression = new TimeSpanStatistics(); decompression.Start(); //GZipStream gzipStream = new GZipStream(stream, CompressionMode.Decompress); var theMemento = new StudyXmlMemento(); StudyXmlIo.ReadGzip(theMemento, stream); //doc.Load(gzipStream); decompression.End(); var settings = new XmlWriterSettings(); //settings.Indent = true; settings.NewLineOnAttributes = false; settings.OmitXmlDeclaration = true; settings.Encoding = Encoding.UTF8; StringWriter sw = new StringWriter(); XmlWriter writer = XmlWriter.Create(sw, settings); theMemento.Document.WriteTo(writer); writer.Flush(); Log(sw.ToString()); TimeSpanStatistics loading = new TimeSpanStatistics(); loading.Start(); StudyXml xml = new StudyXml(); xml.SetMemento(theMemento); loading.End(); int sopCounter = 0; SeriesTree.Nodes.Clear(); foreach (SeriesXml series in xml) { TreeNode seriesNode = new TreeNode(series.SeriesInstanceUid); SeriesTree.Nodes.Add(seriesNode); foreach (InstanceXml instance in series) { TreeNode instanceNode = new TreeNode(instance.SopInstanceUid); seriesNode.Nodes.Add(instanceNode); sopCounter++; } } StatisticsLog.Text = ""; StatisticsLog.Text += String.Format("\r\nHeader Size (Decompressed): {0} KB", sw.ToString().Length / 1024); StatisticsLog.Text += String.Format("\r\nWCF Service call : {0} ms", servicecall.Value.TotalMilliseconds); StatisticsLog.Text += String.Format("\r\nDecompression : {0} ms", decompression.Value.TotalMilliseconds); StatisticsLog.Text += String.Format("\r\nLoading StudyXml : {0} ms", loading.Value.TotalMilliseconds); SeriesLabel.Text = String.Format("Series : {0} \tInstances: {1}", SeriesTree.Nodes.Count, sopCounter); stream.Close(); } catch (FaultException <StudyIsInUseFault> ex) { timer1.Stop(); MessageBox.Show(String.Format("StudyIsInUseFault received:{0}\n\nState={1}", ex.Message, ex.Detail.StudyState)); } catch (FaultException <StudyIsNearlineFault> ex) { timer1.Stop(); MessageBox.Show("StudyIsNearlineFault received:\n" + ex.Message); } catch (FaultException <StudyNotFoundFault> ex) { timer1.Stop(); MessageBox.Show("StudyNotFoundFault received:\n" + ex.Message); } catch (Exception ex) { timer1.Stop(); MessageBox.Show(ex.Message); } finally { if (proxy.State == CommunicationState.Opened) { proxy.Close(); } } }
public void Run() { HeaderStreamingServiceClient client = null; studies = null; StudyInfo study = null; while (true) { Random r = new Random(); if (String.IsNullOrEmpty(FixedStudyInstanceUid)) { bool refresh = false; if (studies == null) refresh = r.Next() % 10 == 0; else { refresh = r.NextDouble() < (1.0f/studies.Count/1000f); } if (refresh) { studies = new List<StudyInfo>(); CFindSCU cfind = new CFindSCU(); cfind.AETitle = LocalAE; cfind.OnResultReceive += new CFindSCU.ResultReceivedHandler(cfind_OnResultReceive); cfind.OnQueryCompleted += new CFindSCU.QueryCompletedHandler(cfind_OnQueryCompleted); cfind.Query(RemoteAE, RemoteHost, RemotePort); waitHandle.WaitOne(); } } else { studies = new List<StudyInfo>(); study = new StudyInfo(); study.StudyUid = FixedStudyInstanceUid; studies.Add(study); } if (studies!=null && studies.Count > 0) { try { if (client==null) { client = new HeaderStreamingServiceClient(); client.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, Dns.GetHostName()); client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; } study = studies[r.Next(studies.Count - 1)]; HeaderStreamingParameters param = new HeaderStreamingParameters(); param.ServerAETitle = RemoteAE; param.StudyInstanceUID = study.StudyUid; param.ReferenceID = Guid.NewGuid().ToString(); TimeSpanStatistics ts = new TimeSpanStatistics(); ts.Start(); Console.WriteLine("************ RETRIEVING... {0} **************", LocalAE); Stream input = client.GetStudyHeader(LocalAE, param); if (input!=null) { string outputdir = Path.Combine("./output", LocalAE); if (!Directory.Exists(outputdir)) Directory.CreateDirectory(outputdir); string temp = Path.Combine(outputdir, study.StudyUid + ".xml"); Console.WriteLine("Reading"); using (FileStream output = new FileStream(temp, FileMode.OpenOrCreate)) { GZipStream gzStream = new GZipStream(input, CompressionMode.Decompress); byte[] buffer = new byte[32*1024*1024]; int size = gzStream.Read(buffer, 0, buffer.Length); int count = 0; while(size>0) { output.Write(buffer, 0, size); count += size; Console.Write("\r{0} KB", count/1024); size = gzStream.Read(buffer, 0, buffer.Length); } output.Close(); } using (FileStream output = new FileStream(temp, FileMode.Open)) { XmlDocument doc = new XmlDocument(); Console.WriteLine("Reading into xml"); StudyXmlIo.Read(doc, output); Console.WriteLine("Done"); } } else { Console.WriteLine("{2} - {1,-16} {0,-64}... NOT FOUND", study.StudyUid, LocalAE, System.Diagnostics.Stopwatch.GetTimestamp()); } ts.End(); input.Close(); //File.Delete(temp); Console.WriteLine("{3} - {2,-16} {0,-64}... OK {1}", study.StudyUid, ts.FormattedValue, LocalAE, System.Diagnostics.Stopwatch.GetTimestamp()); } catch(TimeoutException) { // try again Console.WriteLine("{2} - {1,-16} {0,-64}... TIMEOUT", study.StudyUid, LocalAE, System.Diagnostics.Stopwatch.GetTimestamp()); } catch (Exception fault) { Console.WriteLine("{3} - {2,-16} {0,-64}... FAILED {1}", study.StudyUid, fault.Message, LocalAE, System.Diagnostics.Stopwatch.GetTimestamp()); if (client!=null) { client.Abort(); client.Close(); client = null; } } Thread.Sleep(r.Next(Delay)); } else { Thread.Sleep(r.Next(1000,3000)); } } }