public void ProcessIncoming(int msecs)
{
int seq = transport.BeginRead ();
try {
int code = (byte)(Packers.Int8.unpack (transport));
ReplySlot slot;
if (!replies.TryGetValue (seq, out slot) ||
(slot.type != ReplySlotType.SLOT_EMPTY && slot.type != ReplySlotType.SLOT_DISCARDED)) {
throw new ProtocolError ("invalid reply sequence: " + seq);
}
Packers.AbstractPacker packer = (Packers.AbstractPacker)slot.value;
bool discard = (slot.type == ReplySlotType.SLOT_DISCARDED);
switch (code) {
case REPLY_SUCCESS:
if (packer == null) {
slot.value = null;
}
/*else if (packer == Packers.MockupPacker) {
slot.value = transport.ReadAll ();
}*/
else {
slot.value = packer.unpack (transport);
}
slot.type = ReplySlotType.SLOT_VALUE;
break;
case REPLY_PROTOCOL_ERROR:
throw (ProtocolError)loadProtocolError ();
case REPLY_PACKED_EXCEPTION:
slot.type = ReplySlotType.SLOT_EXCEPTION;
slot.value = loadPackedException ();
break;
case REPLY_GENERIC_EXCEPTION:
slot.type = ReplySlotType.SLOT_EXCEPTION;
slot.value = loadGenericException ();
break;
default:
throw new ProtocolError ("unknown reply code: " + code);
}
if (discard) {
replies.Remove (seq);
}
} finally {
transport.EndRead ();
}
}