Advertisement
kipusoep

MixedMessageEncoder

Apr 13th, 2012
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.59 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.ServiceModel.Channels;
  6. using System.Text;
  7. using System.Web;
  8. using System.Xml;
  9.  
  10. namespace InfoCaster.SocialProxy.lib
  11. {
  12.     public class MixedMessageEncoder : MessageEncoder
  13.     {
  14.         public override string ContentType
  15.         {
  16.             get { throw new NotImplementedException(); }
  17.         }
  18.  
  19.         public override string MediaType
  20.         {
  21.             get { throw new NotImplementedException(); }
  22.         }
  23.  
  24.         public override MessageVersion MessageVersion
  25.         {
  26.             get { throw new NotImplementedException(); }
  27.         }
  28.  
  29.         MessageEncoder _textEncoder;
  30.         MessageEncoder _mtomEncoder;
  31.  
  32.         static bool IsMtomMessage(string contentType)
  33.         {
  34.             return contentType.IndexOf("type=\"application/xop+xml\"", StringComparison.OrdinalIgnoreCase) >= 0;
  35.         }
  36.  
  37.         public MixedMessageEncoder(MessageVersion messageVersion, XmlDictionaryReaderQuotas readerQuotas)
  38.         {
  39.             TextMessageEncodingBindingElement textEncoderBindingElement = new TextMessageEncodingBindingElement(messageVersion, Encoding.UTF8);
  40.             MtomMessageEncodingBindingElement mtomEncoderBindingElement = new MtomMessageEncodingBindingElement(messageVersion, Encoding.UTF8);
  41.      
  42.             readerQuotas.CopyTo(mtomEncoderBindingElement.ReaderQuotas);
  43.             readerQuotas.CopyTo(textEncoderBindingElement.ReaderQuotas);
  44.    
  45.             _mtomEncoder = mtomEncoderBindingElement.CreateMessageEncoderFactory().Encoder;
  46.             _textEncoder = textEncoderBindingElement.CreateMessageEncoderFactory().Encoder;
  47.         }
  48.  
  49.         public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
  50.         {
  51.             Message result = this._mtomEncoder.ReadMessage(buffer, bufferManager, contentType);
  52.             result.Properties.Add(TextOrMtomEncodingBindingElement.IsIncomingMessageMtomPropertyName, IsMtomMessage(contentType));
  53.             return result;
  54.         }
  55.  
  56.         public override Message ReadMessage(System.IO.Stream stream, int maxSizeOfHeaders, string contentType)
  57.         {
  58.             throw new NotImplementedException();
  59.         }
  60.  
  61.         public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
  62.         {
  63.             if (this.ShouldWriteMtom(message))
  64.             {
  65.                 using (MemoryStream ms = new MemoryStream())
  66.                 {
  67.                     XmlDictionaryWriter mtomWriter = CreateMtomWriter(ms, message);
  68.                     message.WriteMessage(mtomWriter);
  69.                     mtomWriter.Flush();
  70.                     byte[] buffer = bufferManager.TakeBuffer((int)ms.Position + messageOffset);
  71.                     Array.Copy(ms.GetBuffer(), 0, buffer, messageOffset, (int)ms.Position);
  72.                     return new ArraySegment<byte>(buffer, messageOffset, (int)ms.Position);
  73.                 }
  74.             }
  75.             else
  76.             {
  77.                 return this._textEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset);
  78.             }
  79.         }
  80.  
  81.         public override void WriteMessage(Message message, System.IO.Stream stream)
  82.         {
  83.             throw new NotImplementedException();
  84.         }
  85.  
  86.         bool ShouldWriteMtom(Message message)
  87.         {
  88.             object temp;
  89.             return message.Properties.TryGetValue(TextOrMtomEncodingBindingElement.IsIncomingMessageMtomPropertyName, out temp) && (bool)temp;
  90.         }
  91.  
  92.         XmlDictionaryWriter CreateMtomWriter(Stream stream, Message message)
  93.         {
  94.             string boundary = message.Properties[TextOrMtomEncodingBindingElement.MtomBoundaryPropertyName] as string;
  95.             string startUri = message.Properties[TextOrMtomEncodingBindingElement.MtomStartUriPropertyName] as string;
  96.             string startInfo = message.Properties[TextOrMtomEncodingBindingElement.MtomStartInfoPropertyName] as string;
  97.             return XmlDictionaryWriter.CreateMtomWriter(stream, Encoding.UTF8, int.MaxValue, startInfo, boundary, startUri, false, false);
  98.         }
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement