Пример #1
0
        internal Stream FinishFragmentedMsg(Stream fragment, out GiopHeader combinedHeader)
        {
            FragmentedMsgDesc result = AddFragmentInternal(fragment, true);

            combinedHeader = result.CombinedHeader;
            return(result.Target);
        }
Пример #2
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);
            }
        }
Пример #3
0
        /// <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;
            }
        }