2003-11-21: Jean-Marc Andre <jeanmarc.andre@cpe.fr>
[mono.git] / mcs / class / System.Runtime.Serialization.Formatters.Soap / System.Runtime.Serialization.Formatters.Soap / SoapFormatter.cs
index b9028a0a2230b5f8928eb415f2ebe78ca04c9529..c4ce7ca7bd7eaf5372065f4b48698308c3cfb5fb 100755 (executable)
-/****************************************************/\r
-/*Soapformatter class implementation                */\r
-/*Author: Jesús M. Rodríguez de la Vega             */\r
-/*gsus@brujula.net                                  */\r
-/****************************************************/\r
+// created on 07/04/2003 at 17:16\r
+//\r
+//     System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+//\r
+//     Authors:\r
+//             Jean-Marc Andre (jean-marc.andre@polymtl.ca)\r
+//\r
 \r
 using System;\r
-using System.Reflection;\r
-using System.Xml;\r
 using System.IO;\r
-using System.Runtime.Remoting.Messaging;\r
+using System.Reflection;\r
+using System.Runtime.Remoting;\r
 using System.Runtime.Serialization;\r
-using System.Runtime.Serialization.Formatters;\r
-\r
+using System.Runtime.Remoting.Messaging;\r
+using System.Xml.Serialization;\r
 \r
-namespace System.Runtime.Serialization.Formatters.soap\r
-{\r
-       public class SoapFormatter : IFormatter, IRemoteFormatter\r
-       {\r
-               private ObjectSerializer   ObjSerializer;       \r
-               private ObjectDeserializer ObjDeserializer;\r
-               /*this is the soapformater's properties               \r
-                 the Binder, Context and SurrogateSelector properties\r
-                 have not been declared yet*/\r
 \r
-               public FormatterAssemblyStyle AssemblyFormat\r
-               {\r
-                       get{return AssemblyFormat;}\r
-                       set{AssemblyFormat= value;}\r
+namespace System.Runtime.Serialization.Formatters.Soap {\r
+       enum RemMessageType {\r
+               MethodCall, MethodResponse, ServerFault, NotRecognize\r
+       }\r
+       \r
+       public class SoapFormatter: IRemotingFormatter, IFormatter {\r
+               private ObjectWriter _objWriter;\r
+               private SoapWriter _soapWriter;\r
+               private SerializationBinder _binder;\r
+               private StreamingContext _context;\r
+               private ISurrogateSelector _selector;\r
+               private FormatterAssemblyStyle _assemblyFormat = FormatterAssemblyStyle.Full;\r
+               private ISoapMessage _topObject;\r
+               \r
+               public SoapFormatter() {\r
+                       \r
                }\r
-\r
-               public ISoapMessage TopObject\r
-               {\r
-                       get{return TopObject;}\r
-                       set{TopObject= value;}\r
+               \r
+               public SoapFormatter(ISurrogateSelector selector, StreamingContext context):this() {\r
+                       _selector = selector;\r
+                       _context = context;\r
                }\r
-\r
-               public FormatterTypeStyle TypeFormat\r
-               {\r
-                       get{return TypeFormat;}\r
-                       set{TypeFormat= value;}\r
+               \r
+               ~SoapFormatter() {\r
                }\r
 \r
-               //the other constructor are not supplied yet\r
-               public SoapFormatter()\r
-               {                       \r
+       \r
+               public object Deserialize(Stream serializationStream) {\r
+                       return Deserialize(serializationStream, null);\r
                }\r
-                       \r
-               public void Serialize(Stream serializationStream, object graph)\r
-               {\r
-                       ObjSerializer= new ObjectSerializer(serializationStream);\r
-                       ObjSerializer.BeginWrite();\r
-                       ObjSerializer.Serialize(graph);\r
+               \r
+               public object Deserialize(Stream serializationStream, HeaderHandler handler) {\r
+                       SoapParser parser = new SoapParser(serializationStream);\r
+                       SoapReader soapReader = new SoapReader(parser);\r
+                       soapReader.Binder = _binder;\r
+                       \r
+                       \r
+                       if(_topObject != null) soapReader.TopObject = _topObject;\r
+                       ObjectReader reader = new ObjectReader(_selector, _context, soapReader);\r
+                       parser.Run();\r
+                       object objReturn = reader.TopObject;\r
+                       return objReturn;\r
                }\r
-\r
-               public object Deserialize(Stream serializationStream)                   \r
-               {\r
-                       ObjDeserializer= new ObjectDeserializer(serializationStream);\r
-                       return ObjDeserializer.Deserialize(serializationStream);\r
+               \r
+               \r
+               \r
+               public void Serialize(Stream serializationStream, object graph) {\r
+                       Serialize(serializationStream, graph, null);\r
+               }\r
+               \r
+               public void Serialize(Stream serializationStream, object graph, Header[] headers) {\r
+                       if(serializationStream == null)\r
+                               throw new ArgumentNullException("serializationStream");\r
+                       if(!serializationStream.CanWrite)\r
+                               throw new SerializationException("Can't write in the serialization stream");\r
+                       _soapWriter = new SoapWriter(serializationStream);\r
+                       _objWriter = new ObjectWriter((ISoapWriter) _soapWriter, _selector,  new StreamingContext(StreamingContextStates.File));\r
+                       _soapWriter.Writer = _objWriter;\r
+                       _objWriter.Serialize(graph);\r
+                       \r
+               }\r
+               \r
+               public ISurrogateSelector SurrogateSelector {\r
+                       get {\r
+                               return _selector;\r
+                       }\r
+                       set {\r
+                               _selector = value;\r
+                       }\r
+               }\r
+               \r
+               \r
+               public SerializationBinder Binder {\r
+                       get {\r
+                               return _binder;\r
+                       }\r
+                       set {\r
+                               _binder = value;\r
+                       }\r
+               }\r
+               \r
+               public StreamingContext Context {\r
+                       get {\r
+                               return _context;\r
+                       }\r
+                       set {\r
+                               _context = value;\r
+                       }\r
+               }\r
+               \r
+               public ISoapMessage TopObject {\r
+                       get {\r
+                               return _topObject;\r
+                       }\r
+                       set {\r
+                               _topObject = value;\r
+                       }\r
                }\r
                \r
+               [MonoTODO ("Interpret this")]\r
+               public FormatterAssemblyStyle AssemblyFormat\r
+               {\r
+                       get {\r
+                               return _assemblyFormat;\r
+                       }\r
+                       set {\r
+                               _assemblyFormat = value;\r
+                       }\r
+               }\r
+\r
        }\r
 }\r