Esempio n. 1
0
        private bool ProcessPDataTF(PDataTFRead pdu)
        {
        	try
            {
            	byte pcid = 0;
                foreach (PDV pdv in pdu.PDVs)
                {
                    pcid = pdv.PCID;
	                if (pdv.IsCommand)
	                {
		                if (_dimse.CommandData == null)
			                _dimse.CommandData = new ChunkStream();

		                _dimse.CommandData.AddChunk(pdv.Value);

		                if (_dimse.Command == null)
		                {
			                _dimse.Command = new DicomAttributeCollection(0x00000000, 0x0000FFFF);
		                }

		                if (_dimse.CommandReader == null)
		                {
			                _dimse.CommandReader = new DicomStreamReader(_dimse.CommandData)
				                {
					                TransferSyntax = TransferSyntax.ImplicitVrLittleEndian,
					                Dataset = _dimse.Command
				                };
		                }

		                DicomReadStatus stat =
			                _dimse.CommandReader.Read(null, DicomReadOptions.UseDictionaryForExplicitUN);
		                if (stat == DicomReadStatus.UnknownError)
		                {
			                Platform.Log(LogLevel.Error, "Unexpected parsing error when reading command group elements.");
			                return false;
		                }
		                _assoc.TotalBytesRead += (UInt64) pdv.PDVLength - 6;
		                if (DimseMessageReceiving != null)
			                DimseMessageReceiving(_assoc, pcid);

		                if (pdv.IsLastFragment)
		                {
			                if (stat == DicomReadStatus.NeedMoreData)
			                {
				                Platform.Log(LogLevel.Error,
				                             "Unexpected end of StreamReader.  More data needed ({0} bytes, last tag read {1}) after reading last PDV fragment.",
				                             _dimse.CommandReader.BytesNeeded, _dimse.CommandReader.LastTagRead.ToString());
				                return false;
			                }
			                _dimse.CommandData = null;
			                _dimse.CommandReader = null;

			                bool isLast = true;
			                if (_dimse.Command.Contains(DicomTags.DataSetType))
			                {
				                if (_dimse.Command[DicomTags.DataSetType].GetUInt16(0, 0x0) != 0x0101)
					                isLast = false;
			                }

			                OnReceiveDimseCommand(pcid, _dimse.Command);

			                if (isLast)
			                {
				                bool ret = OnReceiveDimse(pcid, _dimse.Command, _dimse.Dataset);
				                if (!ret)
					                Platform.Log(LogLevel.Error, "Error with OnReceiveDimse");

				                LogSendReceive(true, _dimse.Command, _dimse.Dataset);

				                //_assoc.TotalBytesRead += (UInt64)total;

				                _dimse = null;
				                return ret;
			                }
		                }
	                }
	                else
	                {
		                if (_dimse.DatasetData == null)
			                _dimse.DatasetData = new ChunkStream();

		                if (_dimse.Dataset == null)
			                _dimse.Dataset = new DicomAttributeCollection(0x00040000, 0xFFFFFFFF);

		                if (_dimse.DatasetReader == null)
		                {
			                _dimse.DatasetReader = new DicomStreamReader(_dimse.DatasetData)
				                {
					                TransferSyntax = _assoc.GetAcceptedTransferSyntax(pdv.PCID),
					                Dataset = _dimse.Dataset
				                };
		                }

						if (!_dimse.DatasetReader.EncounteredStopTag)
		                {
			                _dimse.DatasetData.AddChunk(pdv.Value);

			                _dimse.ParseDatasetStatus = _dimse.DatasetReader.Read(_dimse.DatasetStopTag, DicomReadOptions.UseDictionaryForExplicitUN);
			                if (_dimse.ParseDatasetStatus == DicomReadStatus.UnknownError)
			                {
				                Platform.Log(LogLevel.Error, "Unexpected parsing error when reading DataSet.");
				                return false;
			                }
		                }

		                _assoc.TotalBytesRead += (UInt64) pdv.PDVLength - 6;
                        if (DimseMessageReceiving != null)
                            DimseMessageReceiving(_assoc, pcid);

		                bool ret = true;
						if (_dimse.StreamMessage)
						{
							if (_dimse.IsNewDimse)
							{
								byte[] fileGroup2 = CreateFileHeader(pcid, _dimse.Command);
								ret = OnReceiveFileStream(pcid, _dimse.Command, _dimse.Dataset, fileGroup2, 0, fileGroup2.Length, _dimse.DatasetReader.EncounteredStopTag, _dimse.IsNewDimse, false);
								_dimse.IsNewDimse = false;
							}

							ret = ret && OnReceiveFileStream(pcid, _dimse.Command, _dimse.Dataset, pdv.Value.Array, pdv.Value.Index, pdv.Value.Count, _dimse.DatasetReader.EncounteredStopTag, false, pdv.IsLastFragment);
							if (!ret)
								Platform.Log(LogLevel.Error, "Error with OnReceiveFileStream");
						}

                        if (pdv.IsLastFragment)
                        {
							if (_dimse.ParseDatasetStatus == DicomReadStatus.NeedMoreData)
                            {
                            	Platform.Log(LogLevel.Error,
                            	             "Unexpected end of StreamReader.  More data needed ({0} bytes, last tag read {1}) after reading last PDV fragment.",
											 _dimse.DatasetReader.BytesNeeded, _dimse.DatasetReader.LastTagRead.ToString());
                                return false;
                            }
                            _dimse.CommandData = null;
                            _dimse.CommandReader = null;

                            LogSendReceive(true, _dimse.Command, _dimse.Dataset);

	                        if (!_dimse.StreamMessage)
	                        {
		                        ret = OnReceiveDimse(pcid, _dimse.Command, _dimse.Dataset);
		                        if (!ret)
			                        Platform.Log(LogLevel.Error, "Error with OnReceiveDimse");
	                        }
	                        else
	                        {
								if (MessageReceived != null)
									MessageReceived(_assoc, new DicomMessage(_dimse.Command, _dimse.Dataset));
	                        }

							_dimse = null;
							return ret;
                        }

						if (!ret) return false;
	                }
                }

                return true;
            }
            catch (Exception e)
            {
                //do something here!
				Platform.Log(LogLevel.Error, e, "Unexpected exception processing P-DATA PDU");
                return false;
            }
        }
Esempio n. 2
0
        private bool ProcessRawPDU(RawPDU raw)
        {
            try
            {
                Platform.Log(LogLevel.Debug, "Received PDU: {0}", raw.ToString());
                switch (raw.Type)
                {
                    case 0x01:
                        {
                            _assoc = new ServerAssociationParameters();
                            var pdu = new AAssociateRQ(_assoc);
                            pdu.Read(raw);
                            State = DicomAssociationState.Sta3_AwaitingLocalAAssociationResponsePrimative;
                            OnReceiveAssociateRequest(_assoc as ServerAssociationParameters);

                            if (State != DicomAssociationState.Sta13_AwaitingTransportConnectionClose &&
                                State != DicomAssociationState.Sta6_AssociationEstablished)
                            {
                                Platform.Log(LogLevel.Error, "Association incorrectly not accepted or rejected, aborting.");
                                return false;
                            }

                            //if derived class call SendAssociateAccept, it has fired this event
                            //if (AssociationEstablished != null)
                            //    AssociationEstablished(_assoc);

                            return true;
                        }
                    case 0x02:
                        {
                            var pdu = new AAssociateAC(_assoc);
                            pdu.Read(raw);
                            State = DicomAssociationState.Sta6_AssociationEstablished;

                            OnReceiveAssociateAccept(_assoc);

                            if (AssociationEstablished != null)
                                AssociationEstablished(_assoc);

                            return true;
                        }
                    case 0x03:
                        {
                            var pdu = new AAssociateRJ();
                            pdu.Read(raw);
                            State = DicomAssociationState.Sta13_AwaitingTransportConnectionClose;

                            if (AssociationRejected != null)
                                AssociationRejected(pdu.Source, pdu.Reason);

                            OnReceiveAssociateReject(pdu.Result, pdu.Source, pdu.Reason);

                            return true;
                        }
                    case 0x04:
                        {
                            var pdu = new PDataTFRead();
                            pdu.Read(raw);
                            return ProcessPDataTF(pdu);
                        }
                    case 0x05:
                        {
                            var pdu = new AReleaseRQ();
                            pdu.Read(raw);
                            State = DicomAssociationState.Sta8_AwaitingAReleaseRPLocalUser;

                            OnReceiveReleaseRequest();

                            return true;
                        }
                    case 0x06:
                        {
                            var pdu = new AReleaseRP();
                            pdu.Read(raw);
                            State = DicomAssociationState.Sta13_AwaitingTransportConnectionClose;

                            if (AssociationReleased != null)
                                AssociationReleased(_assoc);


                            OnReceiveReleaseResponse();

                            return true;
                        }
                    case 0x07:
                        {
                            var pdu = new AAbort();
                            pdu.Read(raw);
                            State = DicomAssociationState.Sta1_Idle;

                            if (AssociationAborted != null)
                                AssociationAborted(_assoc, pdu.Reason);

                            OnReceiveAbort(pdu.Source, pdu.Reason);

                            return true;
                        }
                    case 0xFF:
                        {
                            Platform.Log(LogLevel.Error, "Unexpected PDU type: 0xFF.  Potential parsing error.");
                            return false;
                        }
                    default:
                        throw new DicomNetworkException("Unknown PDU type");
                }
            }
            catch (Exception e)
            {
                OnNetworkError(e, true);

                if (NetworkError != null)
                    NetworkError(e);

                Platform.Log(LogLevel.Error, e, "Unexpected exception when processing PDU.");
                return false;
            }
        }