Пример #1
0
        /// <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);
            }
        }