Ejemplo n.º 1
0
		    public void Unload()
			{
				lock (_syncLock)
				{
					_alreadyRetrieved = false;
					_retrieveResult = null;
				    ResetAttemptData();
				}
			}
Ejemplo n.º 2
0
			public byte[] GetUncompressedPixelData()
			{
                try
                {

                    //construct this object before the lock so there's no chance of deadlocking
                    //with the parent data source (because we are accessing its tags at the 
                    //same time as it's trying to get the pixel data).
                    FramePixelDataRetriever retriever = new FramePixelDataRetriever(this);

                    lock (_syncLock)
                    {
                        RetrievePixelDataResult result;
                        
                        if (_retrieveResult == null)
                        {
                            AbortAttemptIfNecessary();

                            ResetAttemptData();
                            _retrievesAttempted++;
                            
                            result = retriever.Retrieve();
                        }
                        else
                            result = _retrieveResult;

                        //free this memory up in case it's holding a compressed buffer.
                        _retrieveResult = null;

                        CodeClock clock = new CodeClock();
                        clock.Start();

                        //synchronize the call to decompress; it's really already synchronized by
                        //the parent b/c it's only called from CreateFrameNormalizedPixelData, but it doesn't hurt.
                        byte[] pixelData = result.GetPixelData();

                        clock.Stop();

                        Platform.Log(LogLevel.Debug,
                                     "[Decompress Info] Sop/Frame: {0}/{1}, Transfer Syntax: {2}, Uncompressed bytes: {3}, Elapsed (s): {4}",
                                     retriever.SopInstanceUid, FrameNumber, retriever.TransferSyntaxUid,
                                     pixelData.Length, clock.Seconds);

                        return pixelData;
                    }
                }
                catch(Exception ex)
                {
                    _lastError = ex;
                    throw;
                }
			}
Ejemplo n.º 3
0
			public void Retrieve()
			{
				if (!_alreadyRetrieved)
				{
					//construct this object before the lock so there's no chance of deadlocking
					//with the parent data source (because we are accessing it's tags at the 
					//same time as it's trying to get the pixel data).
					FramePixelDataRetriever retriever = new FramePixelDataRetriever(this);

					lock (_syncLock)
					{
                        if (!_alreadyRetrieved)
                        {
                            AbortAttemptIfNecessary();

                            
                            try
                            {
                                ResetAttemptData();
                                _retrievesAttempted++;
                                var start = DateTime.Now;
                                _retrieveResult = retriever.Retrieve();
                                var end = DateTime.Now;
                                _lastRetrievePerformanceInfo =
                                    new StreamingPerformanceInfo(start, end, _retrieveResult.MetaData.ContentLength);

                                _alreadyRetrieved = true;
                            }
                            catch (Exception ex)
                            {
                                _lastError = ex;
                                throw;
                            }
                        }
					}
				}
			}
Ejemplo n.º 4
0
		public ImageServerFramePixelData(RetrievePixelDataResult result)
		{
			InternalResult = result;
		}
Ejemplo n.º 5
0
        public RetrievePixelDataResult RetrievePixelData(string serverAE, string studyInstanceUID, string seriesInstanceUID, string sopInstanceUid, int frame)
        {
            try
            {
                CodeClock clock = new CodeClock();
                clock.Start();

                FrameStreamingResultMetaData result = new FrameStreamingResultMetaData();
                StringBuilder url = new StringBuilder();

                if (_baseUri.ToString().EndsWith("/"))
                {
                    url.AppendFormat("{0}{1}", _baseUri, serverAE);
                }
                else
                {
                    url.AppendFormat("{0}/{1}", _baseUri, serverAE);
                }

                url.AppendFormat("?requesttype=WADO&studyUID={0}&seriesUID={1}&objectUID={2}", studyInstanceUID, seriesInstanceUID, sopInstanceUid);
                url.AppendFormat("&frameNumber={0}", frame);
                url.AppendFormat("&contentType={0}", HttpUtility.HtmlEncode("application/clearcanvas"));

                result.Speed.Start();

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url.ToString());
                request.Accept    = "application/dicom,application/clearcanvas,image/jpeg";
                request.Timeout   = (int)TimeSpan.FromSeconds(StreamingSettings.Default.ClientTimeoutSeconds).TotalMilliseconds;
                request.KeepAlive = false;

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    throw new StreamingClientException(response.StatusCode, HttpUtility.HtmlDecode(response.StatusDescription));
                }

                Stream       responseStream = response.GetResponseStream();
                BinaryReader reader         = new BinaryReader(responseStream);
                byte[]       buffer         = reader.ReadBytes((int)response.ContentLength);
                reader.Close();
                responseStream.Close();
                response.Close();

                result.Speed.SetData(buffer.Length);
                result.Speed.End();

                result.ResponseMimeType  = response.ContentType;
                result.Status            = response.StatusCode;
                result.StatusDescription = response.StatusDescription;
                result.Uri           = response.ResponseUri;
                result.ContentLength = buffer.Length;
                result.IsLast        = (response.Headers["IsLast"] != null && bool.Parse(response.Headers["IsLast"]));

                clock.Stop();
                PerformanceReportBroker.PublishReport("Streaming", "RetrievePixelData", clock.Seconds);

                RetrievePixelDataResult pixelDataResult;
                if (response.Headers["Compressed"] != null && bool.Parse(response.Headers["Compressed"]))
                {
                    pixelDataResult = new RetrievePixelDataResult(CreateCompressedPixelData(response, buffer), result);
                }
                else
                {
                    pixelDataResult = new RetrievePixelDataResult(buffer, result);
                }

                return(pixelDataResult);
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response is HttpWebResponse)
                {
                    HttpWebResponse response = (HttpWebResponse)ex.Response;
                    throw new StreamingClientException(response.StatusCode, HttpUtility.HtmlDecode(response.StatusDescription));
                }
                throw new StreamingClientException(StreamingClientExceptionType.Network, ex);
            }
        }
Ejemplo n.º 6
0
		public RetrievePixelDataResult RetrievePixelData(string serverAE, string studyInstanceUID, string seriesInstanceUID, string sopInstanceUid, int frame)
        {
			try
			{
				CodeClock clock = new CodeClock();
				clock.Start();

				FrameStreamingResultMetaData result = new FrameStreamingResultMetaData();
				StringBuilder url = new StringBuilder();

				if (_baseUri.ToString().EndsWith("/"))
				{
					url.AppendFormat("{0}{1}", _baseUri, serverAE);
				}
				else
				{
					url.AppendFormat("{0}/{1}", _baseUri, serverAE);
				}

				url.AppendFormat("?requesttype=WADO&studyUID={0}&seriesUID={1}&objectUID={2}", studyInstanceUID, seriesInstanceUID, sopInstanceUid);
				url.AppendFormat("&frameNumber={0}", frame);
				url.AppendFormat("&contentType={0}", HttpUtility.HtmlEncode("application/clearcanvas"));

				result.Speed.Start();

				HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url.ToString());
				request.Accept = "application/dicom,application/clearcanvas,image/jpeg";
				request.Timeout = (int) TimeSpan.FromSeconds(StreamingSettings.Default.ClientTimeoutSeconds).TotalMilliseconds;
				request.KeepAlive = false;

				HttpWebResponse response = (HttpWebResponse)request.GetResponse();

				if (response.StatusCode != HttpStatusCode.OK)
				{
					throw new StreamingClientException(response.StatusCode, HttpUtility.HtmlDecode(response.StatusDescription));
				}

				Stream responseStream = response.GetResponseStream();
				BinaryReader reader = new BinaryReader(responseStream);
				byte[] buffer = reader.ReadBytes((int) response.ContentLength);
				reader.Close();
				responseStream.Close();
				response.Close();

				result.Speed.SetData(buffer.Length);
				result.Speed.End();

				result.ResponseMimeType = response.ContentType;
				result.Status = response.StatusCode;
				result.StatusDescription = response.StatusDescription;
				result.Uri = response.ResponseUri;
				result.ContentLength = buffer.Length;
				result.IsLast = (response.Headers["IsLast"] != null && bool.Parse(response.Headers["IsLast"]));

				clock.Stop();
				PerformanceReportBroker.PublishReport("Streaming", "RetrievePixelData", clock.Seconds);

				RetrievePixelDataResult pixelDataResult;
				if (response.Headers["Compressed"] != null && bool.Parse(response.Headers["Compressed"]))
					pixelDataResult = new RetrievePixelDataResult(CreateCompressedPixelData(response, buffer), result);
				else
					pixelDataResult = new RetrievePixelDataResult(buffer, result);

				return pixelDataResult;
			}
			catch (WebException ex)
			{
				if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response is HttpWebResponse)
				{
					HttpWebResponse response = (HttpWebResponse) ex.Response;
					throw new StreamingClientException(response.StatusCode, HttpUtility.HtmlDecode(response.StatusDescription));
				}
				throw new StreamingClientException(StreamingClientExceptionType.Network, ex);
			}
		}