public void Read(RawPDU raw)
{
uint l = raw.Length;
raw.ReadUInt16("Version");
raw.SkipBytes("Reserved", 2);
_assoc.CalledAE = raw.ReadString("Called AE", 16);
_assoc.CallingAE = raw.ReadString("Calling AE", 16);
raw.SkipBytes("Reserved", 32);
l -= 2 + 2 + 16 + 16 + 32;
while (l > 0) {
byte type = raw.ReadByte("Item-Type");
raw.SkipBytes("Reserved", 1);
ushort il = raw.ReadUInt16("Item-Length");
l -= 4 + (uint)il;
if (type == 0x10) {
// Application Context
raw.SkipBytes("Application Context", il);
} else
if (type == 0x20) {
// Presentation Context
byte id = raw.ReadByte("Presentation Context ID");
raw.SkipBytes("Reserved", 3);
il -= 4;
while (il > 0) {
byte pt = raw.ReadByte("Presentation Context Item-Type");
raw.SkipBytes("Reserved", 1);
ushort pl = raw.ReadUInt16("Presentation Context Item-Length");
string sx = raw.ReadString("Presentation Context Syntax UID", pl);
if (pt == 0x30) {
_assoc.AddPresentationContext(id, DicomUID.Lookup(sx));
} else if (pt == 0x40) {
_assoc.AddTransferSyntax(id, DicomTransferSyntax.Lookup(sx));
}
il -= (ushort)(4 + pl);
}
} else
if (type == 0x50) {
// User Information
while (il > 0) {
byte ut = raw.ReadByte("User Information Item-Type");
raw.SkipBytes("Reserved", 1);
ushort ul = raw.ReadUInt16("User Information Item-Length");
il -= (ushort)(4 + ul);
if (ut == 0x51) {
_assoc.MaximumPduLength = raw.ReadUInt32("Max PDU Length");
} else if (ut == 0x52) {
_assoc.ImplementationClass = new DicomUID(raw.ReadString("Implementation Class UID", ul), "Implementation Class UID", DicomUidType.Unknown);
} else if (ut == 0x55) {
_assoc.ImplementationVersion = raw.ReadString("Implementation Version", ul);
} else if (ut == 0x53) {
_assoc.AsyncOpsInvoked = raw.ReadUInt16("Asynchronous Operations Invoked");
_assoc.AsyncOpsPerformed = raw.ReadUInt16("Asynchronous Operations Performed");
} else if (ut == 0x54) {
raw.SkipBytes("SCU/SCP Role Selection", ul);
/*
ushort rsul = raw.ReadUInt16();
if ((rsul + 4) != ul) {
throw new DicomNetworkException("SCU/SCP role selection length (" + ul + " bytes) does not match uid length (" + rsul + " + 4 bytes)");
}
raw.ReadChars(rsul); // Abstract Syntax
raw.ReadByte(); // SCU role
raw.ReadByte(); // SCP role
*/
} else {
Debug.Log.Error("Unhandled user item: 0x{0:x2} ({1} + 4 bytes)", ut, ul);
raw.SkipBytes("Unhandled User Item", ul);
}
}
}
}
}