internal Stream FinishFragmentedMsg(Stream fragment, out GiopHeader combinedHeader) { FragmentedMsgDesc result = AddFragmentInternal(fragment, true); combinedHeader = result.CombinedHeader; return(result.Target); }
/// <summary> /// adds a fragment to the combined message. /// </summary> /// <returns>the fragment description for the message</returns> private FragmentedMsgDesc AddFragmentInternal(Stream fragment, bool isLastFragment) { CdrInputStreamImpl cdrInput = new CdrInputStreamImpl(fragment); GiopHeader header = new GiopHeader(cdrInput); CheckGiop1_2OrLater(header); // GIOP 1.2 or newer: read request id from fragment msg header uint reqId = cdrInput.ReadULong(); int payLoadLength = (int)(header.ContentMsgLength - 4); lock (m_fragmentedMsgs.SyncRoot) { FragmentedMsgDesc fragmentDesc = (FragmentedMsgDesc)m_fragmentedMsgs[reqId]; if (fragmentDesc == null) { throw new IOException("illegal fragment; not found previous fragment for request-id: " + reqId); } if (!isLastFragment) { fragmentDesc.AddFragment(cdrInput, payLoadLength); } else { fragmentDesc.AddLastFragment(cdrInput, payLoadLength); // remove the desc for unfinished msg from table m_fragmentedMsgs.Remove(reqId); } return(fragmentDesc); } }
/// <summary>Start a new fragmented msg</summary> internal void StartFragment(Stream fragment) { CdrInputStreamImpl cdrInput = new CdrInputStreamImpl(fragment); GiopHeader header = new GiopHeader(cdrInput); CheckGiop1_2OrLater(header); // GIOP 1.2 or newer: read request id from msg; for giop 1.2, the requestId follows just // after the header for request, reply, locateRequest and locateReply; only those messages // can be fragmented uint reqId = cdrInput.ReadULong(); int payLoadLength = (int)(header.ContentMsgLength - 4); lock (m_fragmentedMsgs.SyncRoot) { FragmentedMsgDesc fragmentDesc = new FragmentedMsgDesc(cdrInput, payLoadLength, header, reqId); m_fragmentedMsgs[reqId] = fragmentDesc; } }
/// <summary>Start a new fragmented msg</summary> internal void StartFragment(Stream fragment) { CdrInputStreamImpl cdrInput = new CdrInputStreamImpl(fragment); GiopHeader header = new GiopHeader(cdrInput); CheckGiop1_2OrLater(header); // GIOP 1.2 or newer: read request id from msg; for giop 1.2, the requestId follows just // after the header for request, reply, locateRequest and locateReply; only those messages // can be fragmented uint reqId = cdrInput.ReadULong(); int payLoadLength = (int)(header.ContentMsgLength - 4); lock(m_fragmentedMsgs.SyncRoot) { FragmentedMsgDesc fragmentDesc = new FragmentedMsgDesc(cdrInput, payLoadLength, header, reqId); m_fragmentedMsgs[reqId] = fragmentDesc; } }