Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.ServiceModel.Channels;
- using System.Text;
- using System.Web;
- using System.Xml;
- namespace InfoCaster.SocialProxy.lib
- {
- public class MixedMessageEncoder : MessageEncoder
- {
- public override string ContentType
- {
- get { throw new NotImplementedException(); }
- }
- public override string MediaType
- {
- get { throw new NotImplementedException(); }
- }
- public override MessageVersion MessageVersion
- {
- get { throw new NotImplementedException(); }
- }
- MessageEncoder _textEncoder;
- MessageEncoder _mtomEncoder;
- static bool IsMtomMessage(string contentType)
- {
- return contentType.IndexOf("type=\"application/xop+xml\"", StringComparison.OrdinalIgnoreCase) >= 0;
- }
- public MixedMessageEncoder(MessageVersion messageVersion, XmlDictionaryReaderQuotas readerQuotas)
- {
- TextMessageEncodingBindingElement textEncoderBindingElement = new TextMessageEncodingBindingElement(messageVersion, Encoding.UTF8);
- MtomMessageEncodingBindingElement mtomEncoderBindingElement = new MtomMessageEncodingBindingElement(messageVersion, Encoding.UTF8);
- readerQuotas.CopyTo(mtomEncoderBindingElement.ReaderQuotas);
- readerQuotas.CopyTo(textEncoderBindingElement.ReaderQuotas);
- _mtomEncoder = mtomEncoderBindingElement.CreateMessageEncoderFactory().Encoder;
- _textEncoder = textEncoderBindingElement.CreateMessageEncoderFactory().Encoder;
- }
- public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
- {
- Message result = this._mtomEncoder.ReadMessage(buffer, bufferManager, contentType);
- result.Properties.Add(TextOrMtomEncodingBindingElement.IsIncomingMessageMtomPropertyName, IsMtomMessage(contentType));
- return result;
- }
- public override Message ReadMessage(System.IO.Stream stream, int maxSizeOfHeaders, string contentType)
- {
- throw new NotImplementedException();
- }
- public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
- {
- if (this.ShouldWriteMtom(message))
- {
- using (MemoryStream ms = new MemoryStream())
- {
- XmlDictionaryWriter mtomWriter = CreateMtomWriter(ms, message);
- message.WriteMessage(mtomWriter);
- mtomWriter.Flush();
- byte[] buffer = bufferManager.TakeBuffer((int)ms.Position + messageOffset);
- Array.Copy(ms.GetBuffer(), 0, buffer, messageOffset, (int)ms.Position);
- return new ArraySegment<byte>(buffer, messageOffset, (int)ms.Position);
- }
- }
- else
- {
- return this._textEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset);
- }
- }
- public override void WriteMessage(Message message, System.IO.Stream stream)
- {
- throw new NotImplementedException();
- }
- bool ShouldWriteMtom(Message message)
- {
- object temp;
- return message.Properties.TryGetValue(TextOrMtomEncodingBindingElement.IsIncomingMessageMtomPropertyName, out temp) && (bool)temp;
- }
- XmlDictionaryWriter CreateMtomWriter(Stream stream, Message message)
- {
- string boundary = message.Properties[TextOrMtomEncodingBindingElement.MtomBoundaryPropertyName] as string;
- string startUri = message.Properties[TextOrMtomEncodingBindingElement.MtomStartUriPropertyName] as string;
- string startInfo = message.Properties[TextOrMtomEncodingBindingElement.MtomStartInfoPropertyName] as string;
- return XmlDictionaryWriter.CreateMtomWriter(stream, Encoding.UTF8, int.MaxValue, startInfo, boundary, startUri, false, false);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement