Wrap always_inline and noinline attributes in compiler checks and use MSVC equivalent.
[mono.git] / mcs / class / System.Runtime.Serialization.Formatters.Soap / System.Runtime.Serialization.Formatters.Soap / SoapFormatter.cs
1 // created on 07/04/2003 at 17:16\r
2 //\r
3 //      System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
4 //\r
5 //      Authors:\r
6 //              Jean-Marc Andre (jean-marc.andre@polymtl.ca)\r
7 //\r
8 \r
9 //\r
10 // Permission is hereby granted, free of charge, to any person obtaining\r
11 // a copy of this software and associated documentation files (the\r
12 // "Software"), to deal in the Software without restriction, including\r
13 // without limitation the rights to use, copy, modify, merge, publish,\r
14 // distribute, sublicense, and/or sell copies of the Software, and to\r
15 // permit persons to whom the Software is furnished to do so, subject to\r
16 // the following conditions:\r
17 // \r
18 // The above copyright notice and this permission notice shall be\r
19 // included in all copies or substantial portions of the Software.\r
20 // \r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
28 //\r
29 \r
30 using System;\r
31 using System.IO;\r
32 using System.Reflection;\r
33 using System.Runtime.InteropServices;\r
34 using System.Runtime.Remoting;\r
35 using System.Runtime.Serialization;\r
36 using System.Runtime.Remoting.Messaging;\r
37 using System.Xml.Serialization;\r
38 using System.Threading;\r
39 using System.Globalization;\r
40 \r
41 \r
42 namespace System.Runtime.Serialization.Formatters.Soap {\r
43         enum RemMessageType {\r
44                 MethodCall, MethodResponse, ServerFault, NotRecognize\r
45         }\r
46         \r
47         public sealed class SoapFormatter: IRemotingFormatter, IFormatter {\r
48                 private SerializationBinder _binder;\r
49                 private StreamingContext _context;\r
50                 private ISurrogateSelector _selector;\r
51                 private FormatterAssemblyStyle _assemblyFormat = FormatterAssemblyStyle.Full;\r
52                 private FormatterTypeStyle _typeFormat = FormatterTypeStyle.TypesWhenNeeded;\r
53                 private ISoapMessage _topObject = null;\r
54                 \r
55                 TypeFilterLevel _filterLevel = TypeFilterLevel.Low;\r
56 \r
57                 public SoapFormatter() {\r
58                         _selector = null;\r
59                         _context = new StreamingContext(StreamingContextStates.All);\r
60                 }\r
61                 \r
62                 public SoapFormatter(ISurrogateSelector selector, StreamingContext context) {\r
63                         _selector = selector;\r
64                         _context = context;\r
65                 }\r
66                 \r
67                 public object Deserialize(Stream serializationStream) {\r
68                         return Deserialize(serializationStream, null);\r
69                 }\r
70                 \r
71                 public object Deserialize(Stream serializationStream, HeaderHandler handler) {\r
72                         object objReturn = null;\r
73                         SoapReader soapReader = new SoapReader(_binder, _selector, _context);\r
74                         CultureInfo savedCi = CultureInfo.CurrentCulture;\r
75                         try {\r
76                                 Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");\r
77                                 objReturn = soapReader.Deserialize(serializationStream, _topObject);\r
78                         }\r
79                         finally {\r
80                                 Thread.CurrentThread.CurrentCulture = savedCi;\r
81                         }\r
82                         return objReturn;\r
83                 }\r
84                 \r
85                 \r
86                 \r
87                 public void Serialize(Stream serializationStream, object graph) {\r
88                         Serialize(serializationStream, graph, null);\r
89                 }\r
90                 \r
91                 public void Serialize(Stream serializationStream, object graph, Header[] headers) {\r
92                         if(serializationStream == null)\r
93                                 throw new ArgumentNullException("serializationStream");\r
94                         if(!serializationStream.CanWrite)\r
95                                 throw new SerializationException("Can't write in the serialization stream");\r
96                         if(graph == null)\r
97                                 throw new ArgumentNullException("graph");\r
98                         SoapWriter soapWriter = new SoapWriter(serializationStream, _selector, _context, _topObject);\r
99                         CultureInfo savedCi = CultureInfo.CurrentCulture;\r
100                         try {\r
101                                 Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");\r
102                                 soapWriter.Serialize (graph, headers, _typeFormat, _assemblyFormat);\r
103                         }\r
104                         finally {\r
105                                 Thread.CurrentThread.CurrentCulture = savedCi;\r
106                         }\r
107                         \r
108                 }\r
109                 \r
110                 public ISurrogateSelector SurrogateSelector {\r
111                         get {\r
112                                 return _selector;\r
113                         }\r
114                         set {\r
115                                 _selector = value;\r
116                         }\r
117                 }\r
118                 \r
119                 \r
120                 public SerializationBinder Binder {\r
121                         get {\r
122                                 return _binder;\r
123                         }\r
124                         set {\r
125                                 _binder = value;\r
126                         }\r
127                 }\r
128                 \r
129                 public StreamingContext Context {\r
130                         get {\r
131                                 return _context;\r
132                         }\r
133                         set {\r
134                                 _context = value;\r
135                         }\r
136                 }\r
137                 \r
138                 public ISoapMessage TopObject {\r
139                         get {\r
140                                 return _topObject;\r
141                         }\r
142                         set {\r
143                                 _topObject = value;\r
144                         }\r
145                 }\r
146                 \r
147                 [MonoTODO ("Interpret this")]\r
148                 public TypeFilterLevel FilterLevel {\r
149                         get {\r
150                                 return _filterLevel;\r
151                         }\r
152                         set {\r
153                                 _filterLevel = value;\r
154                         }\r
155                 }\r
156                 \r
157                 public FormatterAssemblyStyle AssemblyFormat\r
158                 {\r
159                         get {\r
160                                 return _assemblyFormat;\r
161                         }\r
162                         set {\r
163                                 _assemblyFormat = value;\r
164                         }\r
165                 }\r
166 \r
167                 public FormatterTypeStyle TypeFormat\r
168                 {\r
169                         get \r
170                         {\r
171                                 return _typeFormat;\r
172                         }\r
173                         set \r
174                         {\r
175                                 _typeFormat = value;\r
176                         }\r
177                 }\r
178 \r
179         }\r
180 }\r