예제 #1
0
        private bool ProcessPDataTF(PDataTF 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;
                            }
                            if (isLast)
                            {
                                if (_dimse.IsNewDimse)
                                {
                                    OnReceiveDimseBegin(pcid, _dimse.Command, _dimse.Dataset);
                                }
                                OnReceiveDimseProgress(pcid, _dimse.Command, _dimse.Dataset);
                                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();

                        _dimse.DatasetData.AddChunk(pdv.Value);

                        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
                                                   	};
                        }

                        DicomReadStatus stat =
                            _dimse.DatasetReader.Read(null, DicomReadOptions.UseDictionaryForExplicitUN);
                        if (stat == 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);

                        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.DatasetReader.BytesNeeded, _dimse.DatasetReader.LastTagRead.ToString());
                                return false;
                            }
                            _dimse.CommandData = null;
                            _dimse.CommandReader = null;

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

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

                            _dimse = null;
                            return ret;
                        }
                    }
                }

                if (_dimse.IsNewDimse)
                {
                    OnReceiveDimseBegin(pcid, _dimse.Command, _dimse.Dataset);
                    _dimse.IsNewDimse = false;
                }
                else
                {
                    OnReceiveDimseProgress(pcid, _dimse.Command, _dimse.Dataset);
                }

                return true;
            }
            catch (Exception e)
            {
                //do something here!
				Platform.Log(LogLevel.Error, e, "Unexpected exception processing P-DATA PDU");
                return false;
            }
        }
예제 #2
0
        private bool ProcessNextPDU()
        {
            var raw = new RawPDU(_network);

            if (raw.Type == 0x04)
            {
                if (_dimse == null)
                {
                    _dimse = new DcmDimseInfo();
                    _assoc.TotalDimseReceived++;
                }
            }

            raw.ReadPDU();

            if (_multiThreaded)
            {
                _processingQueue.Enqueue(delegate
                                             {
                                                 ProcessRawPDU(raw);
                                             });
                return true;
            }
            return ProcessRawPDU(raw);
        }