|
|
@@ -28,36 +28,87 @@
|
|
|
// 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
|
|
|
{
|
|
|
- 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
|
|
|
+}
|