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); } }
/// <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; } } }
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; }
/// <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; }
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])); }