// 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]
get { throw new NotImplementedException (); }
}
}
-}
-#endif
+}