Пример #1
0
        public void WriteSizedMessage(Message message)
        {
            lock (write_lock) {
                ResetWriteBuffer();

                buffer.WriteByte(SizedEnvelopeRecord);

                MemoryStream ms      = new MemoryStream();
                var          session = writer_session ?? new MyXmlBinaryWriterSession();
                writer_session = session;
                int writer_session_count = session.List.Count;
                var benc = Encoder as BinaryMessageEncoder;
                try {
                    if (benc != null)
                    {
                        benc.CurrentWriterSession = session;
                    }
                    Encoder.WriteMessage(message, ms);
                } finally {
                    if (benc != null)
                    {
                        benc.CurrentWriterSession = null;
                    }
                }

                // dictionary
                if (EncodingRecord == Soap12EncodingBinaryWithDictionary)
                {
                    MemoryStream msd = new MemoryStream();
                    BinaryWriter dw  = new BinaryWriter(msd);
                    for (int i = writer_session_count; i < session.List.Count; i++)
                    {
                        dw.Write(session.List [i].Value);
                    }
                    dw.Flush();

                    int length       = (int)(msd.Position + ms.Position);
                    var msda         = msd.ToArray();
                    int sizeOfLength = writer.GetSizeOfLength(msda.Length);

                    writer.WriteVariableInt(length + sizeOfLength);              // dictionary array also involves the size of itself.
                    WriteSizedChunk(msda, 0, msda.Length);
                }
                else
                {
                    writer.WriteVariableInt((int)ms.Position);
                }

                // message body
                var arr = ms.GetBuffer();
                writer.Write(arr, 0, (int)ms.Position);

                writer.Flush();

                s.Write(buffer.GetBuffer(), 0, (int)buffer.Position);
                s.Flush();
            }
        }
Пример #2
0
        public void WriteSizedMessage(Message message)
        {
            ResetWriteBuffer();

            if (EncodingRecord != 8)
            {
                throw new NotImplementedException(String.Format("Message encoding {0:X} is not implemented yet", EncodingRecord));
            }

            buffer.WriteByte(SizedEnvelopeRecord);

            MemoryStream ms      = new MemoryStream();
            var          session = writer_session ?? new MyXmlBinaryWriterSession();

            writer_session = session;
            int writer_session_count = session.List.Count;
            var benc = Encoder as BinaryMessageEncoder;

            try {
                if (benc != null)
                {
                    benc.CurrentWriterSession = session;
                }
                Encoder.WriteMessage(message, ms);
            } finally {
                benc.CurrentWriterSession = null;
            }

            // dictionary
            MemoryStream msd = new MemoryStream();
            BinaryWriter dw  = new BinaryWriter(msd);

            for (int i = writer_session_count; i < session.List.Count; i++)
            {
                dw.Write(session.List [i].Value);
            }
            dw.Flush();

            int length       = (int)(msd.Position + ms.Position);
            var msda         = msd.ToArray();
            int sizeOfLength = writer.GetSizeOfLength(msda.Length);

            writer.WriteVariableInt(length + sizeOfLength);              // dictionary array also involves the size of itself.
            WriteSizedChunk(msda, 0, msda.Length);
            // message body
            var arr = ms.GetBuffer();

            writer.Write(arr, 0, (int)ms.Position);

            writer.Flush();

            s.Write(buffer.GetBuffer(), 0, (int)buffer.Position);
            s.Flush();
        }