2008-07-01 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Protocols / SoapHeaderMapping.cs
index c169eec357063b86fe23d67b06c8a12036646234..41a8bb372a5fde11ae4170eef7cbe25d763f3adc 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
-
 using System.Reflection;
 
 namespace System.Web.Services.Protocols
 {
-       public sealed class SoapHeaderMapping
+#if NET_2_0
+       public
+#else
+       internal
+#endif
+       sealed class SoapHeaderMapping // It used to be HeaderInfo class until Mono 1.2
        {
-               internal SoapHeaderMapping ()
+               MemberInfo member;
+               Type header_type;
+               bool is_unknown_header;
+               SoapHeaderDirection direction;
+
+               internal SoapHeaderMapping (MemberInfo member, SoapHeaderAttribute attributeInfo)
+               {
+                       this.member = member;
+                       direction = attributeInfo.Direction;
+                       if (member is PropertyInfo)
+                               header_type = ((PropertyInfo) member).PropertyType;
+                       else
+                               header_type = ((FieldInfo) member).FieldType;
+                       
+                       if (HeaderType == typeof(SoapHeader) || HeaderType == typeof(SoapUnknownHeader) ||
+                               HeaderType == typeof(SoapHeader[]) || HeaderType == typeof(SoapUnknownHeader[]))
+                       {
+                               is_unknown_header = true;
+                       }
+                       else if (!typeof(SoapHeader).IsAssignableFrom (HeaderType))
+                               throw new InvalidOperationException (string.Format ("Header members type must be a SoapHeader subclass"));
+               }
+               
+               internal object GetHeaderValue (object ob)
                {
+                       if (member is PropertyInfo)
+                               return ((PropertyInfo) member).GetValue (ob, null);
+                       else
+                               return ((FieldInfo) member).GetValue (ob);
                }
 
-               [MonoTODO]
-               public bool Custom {
-                       get { throw new NotImplementedException (); }
+               internal void SetHeaderValue (object ob, SoapHeader header)
+               {
+                       object value = header;
+                       if (Custom && HeaderType.IsArray)
+                       {
+                               SoapUnknownHeader uheader = header as SoapUnknownHeader;
+                               SoapUnknownHeader[] array = (SoapUnknownHeader[]) GetHeaderValue (ob);
+                               if (array == null || array.Length == 0) {
+                                       value = new SoapUnknownHeader[] { uheader };
+                               }
+                               else {
+                                       SoapUnknownHeader[] newArray = new SoapUnknownHeader [array.Length+1];
+                                       Array.Copy (array, newArray, array.Length);
+                                       newArray [array.Length] = uheader;
+                                       value = newArray;
+                               }
+                       }
+                       
+                       if (member is PropertyInfo)
+                               ((PropertyInfo) member).SetValue (ob, value, null);
+                       else
+                               ((FieldInfo) member).SetValue (ob, value);
+               }
+               
+               public SoapHeaderDirection Direction
+               {
+                       get { return direction; }
                }
 
-               [MonoTODO]
-               public SoapHeaderDirection Direction {
-                       get { throw new NotImplementedException (); }
+               public MemberInfo MemberInfo {
+                       get { return member; }
                }
 
-               [MonoTODO]
                public Type HeaderType {
-                       get { throw new NotImplementedException (); }
+                       get { return header_type; }
                }
 
-               [MonoTODO]
-               public MemberInfo MemberInfo {
-                       get { throw new NotImplementedException (); }
+               public bool Custom {
+                       get { return is_unknown_header; }
                }
 
                [MonoTODO]
@@ -65,6 +116,5 @@ namespace System.Web.Services.Protocols
                        get { throw new NotImplementedException (); }
                }
        }
-}
 
-#endif
+}