Ejemplo n.º 1
0
 public ServiceElementPDUs(PDU_DETAIL pdu, DateTime time)
 {
     //
     // Required for Windows Form Designer support
     //
     InitializeComponent();
     nametextBox.Text = pdu.CmdType;
     this.Text = pdu.CmdType + " PDUs List";
     foreach(PDU_DETAIL dataPdu in pdu.CmdPdusList)
     {
         //TimeSpan ts = dataPdu.timeStamp - time;
         //string timeStampStr = string.Format("{0:000}.{1:000}", (ts.Minutes * 60 + ts.Seconds), ts.Milliseconds);
         int pduIndex = dataPdu.PduIndex + 1;
         string displayStr = "[" + pduIndex.ToString() + "]" + " P-DATA-TF";
         cmdDataPduslistBox.Items.Add(displayStr);
         pduList.Add(dataPdu);
     }
 }
Ejemplo n.º 2
0
 /// <summary>
 /// Prepare PDU list for display
 /// </summary>
 /// <param name="pdu"></param>
 private void PreparePDUList(PDU_DETAIL pdu)
 {
     string displayStr = "";
     //TimeSpan ts = pdu.timeStamp - startTimeForFirstAssoc;
     //string timeStampStr = string.Format("{0:000}.{1:000}",(ts.Minutes *60 + ts.Seconds), ts.Milliseconds);
     int pduIndex = pdu.PduIndex + 1;
     switch(pdu.PduType)
     {
         case 1:
         {
             displayStr = "[" + pduIndex.ToString() + "]" + " A-ASSOCIATE-RQ";
             reqPduList.Items.Add(displayStr);
             reqList.Add(pdu);
             break;
         }
         case 2:
         {
             displayStr = "[" + pduIndex.ToString() + "]" + " A-ASSOCIATE-AC";
             accPduList.Items.Add(displayStr);
             accList.Add(pdu);
             break;
         }
         case 3:
         {
             displayStr = "[" + pduIndex.ToString() + "]" + " A-ASSOCIATE-RJ";
             if(pdu.PduDirection == 1)
             {
                 accPduList.Items.Add(displayStr);
                 accList.Add(pdu);
             }
             else
             {
                 reqPduList.Items.Add(displayStr);
                 reqList.Add(pdu);
             }
             break;
         }
         case 4:
         {
             displayStr = "[" + pduIndex.ToString() + "] " + pdu.CmdType;
             if(pdu.CmdPdusList.Count > 1)
             {
                 //TimeSpan t1 = ((PDU_DETAIL)pdu.CmdPdusList[0]).timeStamp - startTimeForFirstAssoc;
                 //TimeSpan t2 = ((PDU_DETAIL)pdu.CmdPdusList[pdu.CmdPdusList.Count - 1]).timeStamp - startTimeForFirstAssoc;
                 //string t1Str = string.Format("{0:000}.{1:000000}", (t1.Minutes * 60 + t1.Seconds), t1.Milliseconds);
                 //string t2Str = string.Format("{0:000}.{1:000000}", (t2.Minutes * 60 + t2.Seconds), t2.Milliseconds);
                 int p1 = ((PDU_DETAIL)pdu.CmdPdusList[0]).PduIndex + 1;
                 int p2 = ((PDU_DETAIL)pdu.CmdPdusList[pdu.CmdPdusList.Count - 1]).PduIndex + 1;
                 displayStr = "[" + p1.ToString() + "-" + p2.ToString() + "] " + pdu.CmdType;
             }
             if(pdu.PduDirection == 1)
             {
                 accPduList.Items.Add(displayStr);
                 accList.Add(pdu);
             }
             else
             {
                 reqPduList.Items.Add(displayStr);
                 reqList.Add(pdu);
             }
             break;
         }
         case 5:
         {
             displayStr = "[" + pduIndex.ToString() + "]" + " A-RELEASE-RQ";
             reqPduList.Items.Add(displayStr);
             reqList.Add(pdu);
             break;
         }
         case 6:
         {
             displayStr = "[" + pduIndex.ToString() + "]" + " A-RELEASE-RP";
             accPduList.Items.Add(displayStr);
             accList.Add(pdu);
             break;
         }
         case 7:
         {
             displayStr = "[" + pduIndex.ToString() + "]" + " A-ABORT";
             if(pdu.PduDirection == 1)
             {
                 accPduList.Items.Add(displayStr);
                 accList.Add(pdu);
             }
             else
             {
                 reqPduList.Items.Add(displayStr);
                 reqList.Add(pdu);
             }
             break;
         }
         default:
         {
             displayStr = "[" + pduIndex.ToString() + "]" + " P-UNKNOWN";
             if(pdu.PduDirection == 1)
             {
                 accPduList.Items.Add(displayStr);
                 accList.Add(pdu);
             }
             else
             {
                 reqPduList.Items.Add(displayStr);
                 reqList.Add(pdu);
             }
             break;
         }
     }
 }
Ejemplo n.º 3
0
 private string GetPDUString(PDU_DETAIL pdu)
 {
     string pduStr;
     switch(pdu.PduType)
     {
         case 1:
         {
             pduStr = DumpRequestPDU(pdu.PduData, 6, pdu.PduLength);
             break;
         }
         case 2:
         {
             pduStr = DumpAcceptPDU(pdu.PduData, 6, pdu.PduLength);
             break;
         }
         case 3:
         {
             pduStr = DumpAssoRjPDU(pdu.PduData, 6, pdu.PduLength);
             break;
         }
         case 4:
         {
             pduStr = DumpDataPDU(pdu.PduData, 6, pdu.PduLength);
             break;
         }
         case 5:
         {
             pduStr = DumpAssoReleaseRqPDU(pdu.PduData, 6, pdu.PduLength);
             break;
         }
         case 6:
         {
             pduStr = DumpAssoReleaseRpPDU(pdu.PduData, 6, pdu.PduLength);
             break;
         }
         case 7:
         {
             pduStr = DumpAssoAbortPDU(pdu.PduData, 6, pdu.PduLength);
             break;
         }
         default:
         {
             pduStr = "P-UNKNOWN";
             break;
         }
     }
     return pduStr;
 }
Ejemplo n.º 4
0
        /// <summary>
        /// This is the main routine called from DICOM Analyzer layer for handling each PDU
        /// </summary>
        /// <param name="p"></param>
        /// <param name="Position"></param>
        /// <param name="length"></param>
        /// <param name="direction"></param>
        /// <param name="state"></param>
        public void HandlePDU(byte[] p, uint Position, uint length, int direction, TCPState state)
        {
            byte PDUType = p[Position];
            uint Index = Position + 2;
            uint PDULength = DICOMUtility.Get4BytesBigEndian( p , ref Index);
            uint FinalPosition = Position + length +6 ;  // include length of PDU header
            StringBuilder s = new StringBuilder(500);
            System.DateTime dt1 = state.GetTime(direction,Position);
            System.DateTime dt2 = state.GetTime(direction,Position+length-1);

            int pduLength = (int)PDULength + 6;
            byte[] pduData = new byte[pduLength];
            Array.Copy(p,Position,pduData,0,pduLength);

            //Populate PDU list
            PDU_DETAIL pduDetail = new PDU_DETAIL();
            pduDetail.PduType = PDUType;
            pduDetail.PduDirection = direction;
            pduDetail.PduIndex = PDUNumber;
            pduDetail.PduData = pduData;
            pduDetail.PduLength = PDULength + 6; //include length of PDU header
            pduDetail.startTime = startTimeForAssoc;
            pduDetail.timeStamp = System.DateTime.Now;

            if(PDUType != 4)
            {
                pduList.Add(pduDetail);
            }

            DumpPDU(p, Position, BaseFileName, direction, PDULength,PDUNumber++);

            s.Append(string.Format("{0} Type {1} PDU : Length = {2} : Direction = {3}\r\n",state.Signature[direction],PDUType,PDULength,(direction==0)?"OUT":"IN"));
            s.Append(string.Format("{0:dd-MMM-yy HH:mm:ss.ffffff} to {1:HH:mm:ss.ffffff}\r\n",dt1,dt2));

            bool send = true;

            switch(PDUType)
            {
                case 1:
                case 2:
                {
                    isLastDatasetFragmentRecd = false;
                    isDataSetRecd = false;
                    HandleRequestPDU(s, p,Position+6, PDULength, direction,PDUType);
                    PopulateAssociationInfo(PDUType);
                    break;
                }
                case 3:
                    s.Append("Association Rejection\r\n");
                    break;

                case 4:
                {
                    if(PDULength==6)
                    {
                        s.Append("Illegal empty PDV\r\n");
                    }

                    isDataSetRecd = true;

                    Position +=6;
                    bool isCmdDataPDU = false;
                    while(Position < FinalPosition)
                    {
                        uint PDVLen = DICOMUtility.Get4BytesBigEndian(p, ref Position);
                        byte PCID = p[Position++];
                        byte Flags = p[Position++];

                        s.Append("  PDV Length=" + PDVLen.ToString() );
                        s.Append("  PCID = " + PCID.ToString());
                        s.Append("  Type = " + ((Flags & 0x01)>0?"COMMAND":"DATA"));
                        s.Append((Flags & 0x02)>0?"  Last Fragment\r\n":"  Continues...\r\n");
                        send = false;

                        byte[] thisData = new byte[PDVLen-2];
                        Array.Copy(p,Position,thisData,0,PDVLen-2);
                        ByteData[direction].Add(thisData);

                        //Add only Dataset data
                        if((Flags & 0x01)== 0)
                        {
                            DatasetData.Add(thisData);
                        }

                        if((Position + (PDVLen - 2)) == FinalPosition)
                        {
                            if((Flags & 0x01)== 0)
                            {
                                if(commandType != "")
                                {
                                    if(isCmdDataPDU)
                                        pduDetail.CmdType = commandType + "[Command,Data]";
                                    else
                                        pduDetail.CmdType = commandType + "[Data]";
                                }

                                cmdPdusList.Add(pduDetail);
                            }

                            if((Flags & 0x02)>0)  // Last fragment
                            {
                                if((Flags & 0x01)>0)
                                {
                                    s.Append(DICOMCommandDump(ByteData[direction]));
                                    if(commandType != "")
                                        pduDetail.CmdType = commandType + "[Command]";

                                    pduList.Add(pduDetail);
                                }
                                else
                                {
                                    foreach(PDU_DETAIL pdu in cmdPdusList)
                                    {
                                        pduDetail.CmdPdusList.Add(pdu);
                                    }
                                    pduDetail.CmdType = ((PDU_DETAIL)cmdPdusList[0]).CmdType;
                                    pduDetail.TransferSyntaxDataset = TransferSyntax[PCID];

                                    foreach(byte[] data in DatasetData)
                                    {
                                        pduDetail.ByteDataDump.Add(data);
                                    }
                                    pduList.Add(pduDetail);

                                    cmdPdusList.Clear();
                                    isLastDatasetFragmentRecd = true;
                                    s.Append(DICOMDump(ByteData[direction],TransferSyntax[PCID]));
                                }

                                ByteData[direction].Clear();
                                DatasetData.Clear();
                                send = true;
                            }
                        }
                        else
                        {
                            //PDU contains both Command & Data PDV
                            isCmdDataPDU = true;
                            if((Flags & 0x01)>0)
                            {
                                s.Append(DICOMCommandDump(ByteData[direction]));
                            }
                            else
                            {
                                s.Append(DICOMDump(ByteData[direction],TransferSyntax[PCID]));
                            }
                        }
                        Position += (PDVLen - 2);
                    }
                    break;
                }
                case 5:
                {
                    //Check for incomplete byte stream
                    if( isDataSetRecd && (!isLastDatasetFragmentRecd))
                    {
                        HandleIncompleteByteStream();
                    }
                    s.Append("Association Release Request\r\n");
                    break;
                }
                case 6:
                {
                    //Check for incomplete byte stream
                    if(isDataSetRecd && (!isLastDatasetFragmentRecd))
                    {
                        HandleIncompleteByteStream();
                    }
                    s.Append("Association Release Acceptance\r\n");
                    break;
                }
                case 7:
                {
                    s.Append("Association Abort\r\n");
                    break;
                }

                default:
                    s.Append("Unknown PDU Type\r\n");
                    break;
            }
            Out(s.ToString(),send);
            LastPDU = PDUType;
        }
Ejemplo n.º 5
0
        void HandleIncompleteByteStream()
        {
            //Populate PDU list
            PDU_DETAIL pduDetail = new PDU_DETAIL();

            foreach(PDU_DETAIL pdu in cmdPdusList)
            {
                pduDetail.CmdPdusList.Add(pdu);
            }

            if (cmdPdusList.Count != 0)
            {
                pduDetail.PduType = ((PDU_DETAIL)cmdPdusList[0]).PduType;
                pduDetail.PduDirection = ((PDU_DETAIL)cmdPdusList[0]).PduDirection;
                pduDetail.CmdType = ((PDU_DETAIL)cmdPdusList[0]).CmdType;

                pduDetail.TransferSyntaxDataset = TransferSyntax[1];

                foreach(byte[] data in DatasetData)
                {
                    pduDetail.ByteDataDump.Add(data);
                }
                pduList.Add(pduDetail);

                cmdPdusList.Clear();
            }
            //s.Append(DICOMDump(ByteData[direction],TransferSyntax[PCID]));
        }