public static bool TryGetNetObjectFromAmqpObject(object amqpObject, MappingType mappingType, out object netObject) { netObject = null; if (amqpObject == null) { return(false); } switch (SerializationUtilities.GetTypeId(amqpObject)) { case PropertyValueType.Byte: case PropertyValueType.SByte: case PropertyValueType.Int16: case PropertyValueType.Int32: case PropertyValueType.Int64: case PropertyValueType.UInt16: case PropertyValueType.UInt32: case PropertyValueType.UInt64: case PropertyValueType.Single: case PropertyValueType.Double: case PropertyValueType.Boolean: case PropertyValueType.Decimal: case PropertyValueType.Char: case PropertyValueType.Guid: case PropertyValueType.DateTime: case PropertyValueType.String: netObject = amqpObject; break; case PropertyValueType.Unknown: if (amqpObject is AmqpSymbol) { netObject = ((AmqpSymbol)amqpObject).Value; } else if (amqpObject is ArraySegment <byte> ) { ArraySegment <byte> binValue = (ArraySegment <byte>)amqpObject; if (binValue.Count == binValue.Array.Length) { netObject = binValue.Array; } else { byte[] buffer = new byte[binValue.Count]; Buffer.BlockCopy(binValue.Array, binValue.Offset, buffer, 0, binValue.Count); netObject = buffer; } } else if (amqpObject is DescribedType) { DescribedType describedType = (DescribedType)amqpObject; if (describedType.Descriptor is AmqpSymbol) { AmqpSymbol symbol = (AmqpSymbol)describedType.Descriptor; if (symbol.Equals((AmqpSymbol)UriName)) { netObject = new Uri((string)describedType.Value); } else if (symbol.Equals((AmqpSymbol)TimeSpanName)) { netObject = new TimeSpan((long)describedType.Value); } else if (symbol.Equals((AmqpSymbol)DateTimeOffsetName)) { netObject = new DateTimeOffset(new DateTime((long)describedType.Value, DateTimeKind.Utc)); } } } else if (mappingType == MappingType.ApplicationProperty) { throw FxTrace.Exception.AsError(new SerializationException(IotHubApiResources.GetString(ApiResources.FailedToSerializeUnsupportedType, amqpObject.GetType().FullName))); } else if (amqpObject is AmqpMap) { AmqpMap map = (AmqpMap)amqpObject; Dictionary <string, object> dictionary = new Dictionary <string, object>(); foreach (var pair in map) { dictionary.Add(pair.Key.ToString(), pair.Value); } netObject = dictionary; } else { netObject = amqpObject; } break; default: break; } return(netObject != null); }
public static bool TryGetNetObjectFromAmqpObject(object amqpObject, MappingType mappingType, out object netObject) { netObject = null; if (amqpObject == null) { return(false); } switch (SerializationUtilities.GetTypeId(amqpObject)) { case PropertyValueType.Byte: case PropertyValueType.SByte: case PropertyValueType.Char: case PropertyValueType.Int16: case PropertyValueType.UInt16: case PropertyValueType.Int32: case PropertyValueType.UInt32: case PropertyValueType.Int64: case PropertyValueType.UInt64: case PropertyValueType.Single: case PropertyValueType.Double: case PropertyValueType.Decimal: case PropertyValueType.Boolean: case PropertyValueType.Guid: case PropertyValueType.String: case PropertyValueType.DateTime: { netObject = amqpObject; return(netObject != null); } case PropertyValueType.Uri: case PropertyValueType.DateTimeOffset: case PropertyValueType.TimeSpan: case PropertyValueType.Stream: { return(netObject != null); } case PropertyValueType.Unknown: { if (amqpObject is AmqpSymbol) { netObject = ((AmqpSymbol)amqpObject).Value; return(netObject != null); } else if (amqpObject is ArraySegment <byte> ) { ArraySegment <byte> nums = (ArraySegment <byte>)amqpObject; if (nums.Count != (int)nums.Array.Length) { byte[] numArray = new byte[nums.Count]; Buffer.BlockCopy(nums.Array, nums.Offset, numArray, 0, nums.Count); netObject = numArray; return(netObject != null); } else { netObject = nums.Array; return(netObject != null); } } else if (!(amqpObject is DescribedType)) { if (mappingType == MappingType.ApplicationProperty) { throw Microsoft.ServiceBus.Messaging.FxTrace.Exception.AsError(new SerializationException(SRClient.FailedToSerializeUnsupportedType(amqpObject.GetType().FullName)), null); } if (!(amqpObject is AmqpMap)) { netObject = amqpObject; return(netObject != null); } else { AmqpMap amqpMaps = (AmqpMap)amqpObject; Dictionary <string, object> strs = new Dictionary <string, object>(); foreach (KeyValuePair <MapKey, object> keyValuePair in (IEnumerable <KeyValuePair <MapKey, object> >)amqpMaps) { strs.Add(keyValuePair.Key.ToString(), keyValuePair.Value); } netObject = strs; return(netObject != null); } } else { DescribedType describedType = (DescribedType)amqpObject; if (!(describedType.Descriptor is AmqpSymbol)) { return(netObject != null); } AmqpSymbol descriptor = (AmqpSymbol)describedType.Descriptor; if (descriptor.Equals("com.microsoft:uri")) { netObject = new Uri((string)describedType.Value); return(netObject != null); } else if (!descriptor.Equals("com.microsoft:timespan")) { if (!descriptor.Equals("com.microsoft:datetime-offset")) { return(netObject != null); } netObject = new DateTimeOffset(new DateTime((long)describedType.Value, DateTimeKind.Utc)); return(netObject != null); } else { netObject = new TimeSpan((long)describedType.Value); return(netObject != null); } } } default: { return(netObject != null); } } }
public static bool TryGetAmqpObjectFromNetObject(object netObject, MappingType mappingType, out object amqpObject) { amqpObject = null; if (netObject == null) { return(false); } switch (SerializationUtilities.GetTypeId(netObject)) { case PropertyValueType.Byte: case PropertyValueType.SByte: case PropertyValueType.Int16: case PropertyValueType.Int32: case PropertyValueType.Int64: case PropertyValueType.UInt16: case PropertyValueType.UInt32: case PropertyValueType.UInt64: case PropertyValueType.Single: case PropertyValueType.Double: case PropertyValueType.Boolean: case PropertyValueType.Decimal: case PropertyValueType.Char: case PropertyValueType.Guid: case PropertyValueType.DateTime: case PropertyValueType.String: amqpObject = netObject; break; case PropertyValueType.Stream: if (mappingType == MappingType.ApplicationProperty) { amqpObject = ReadStream((Stream)netObject); } break; case PropertyValueType.Uri: amqpObject = new DescribedType((AmqpSymbol)UriName, ((Uri)netObject).AbsoluteUri); break; case PropertyValueType.DateTimeOffset: amqpObject = new DescribedType((AmqpSymbol)DateTimeOffsetName, ((DateTimeOffset)netObject).UtcTicks); break; case PropertyValueType.TimeSpan: amqpObject = new DescribedType((AmqpSymbol)TimeSpanName, ((TimeSpan)netObject).Ticks); break; case PropertyValueType.Unknown: if (netObject is Stream) { if (mappingType == MappingType.ApplicationProperty) { amqpObject = ReadStream((Stream)netObject); } } else if (mappingType == MappingType.ApplicationProperty) { throw FxTrace.Exception.AsError(new SerializationException(IotHubApiResources.GetString(ApiResources.FailedToSerializeUnsupportedType, netObject.GetType().FullName))); } else if (netObject is byte[]) { amqpObject = new ArraySegment <byte>((byte[])netObject); } else if (netObject is IList) { // Array is also an IList amqpObject = netObject; } else if (netObject is IDictionary) { amqpObject = new AmqpMap((IDictionary)netObject); } break; default: break; } return(amqpObject != null); }
public static bool TryGetAmqpObjectFromNetObject(object netObject, MappingType mappingType, out object amqpObject) { amqpObject = null; if (netObject == null) { return(false); } switch (SerializationUtilities.GetTypeId(netObject)) { case PropertyValueType.Byte: case PropertyValueType.SByte: case PropertyValueType.Char: case PropertyValueType.Int16: case PropertyValueType.UInt16: case PropertyValueType.Int32: case PropertyValueType.UInt32: case PropertyValueType.Int64: case PropertyValueType.UInt64: case PropertyValueType.Single: case PropertyValueType.Double: case PropertyValueType.Decimal: case PropertyValueType.Boolean: case PropertyValueType.Guid: case PropertyValueType.String: case PropertyValueType.DateTime: { amqpObject = netObject; break; } case PropertyValueType.Uri: { amqpObject = new DescribedType((object)"com.microsoft:uri", ((Uri)netObject).AbsoluteUri); break; } case PropertyValueType.DateTimeOffset: { object obj = "com.microsoft:datetime-offset"; DateTimeOffset dateTimeOffset = (DateTimeOffset)netObject; amqpObject = new DescribedType(obj, (object)dateTimeOffset.UtcTicks); break; } case PropertyValueType.TimeSpan: { object obj1 = "com.microsoft:timespan"; TimeSpan timeSpan = (TimeSpan)netObject; amqpObject = new DescribedType(obj1, (object)timeSpan.Ticks); break; } case PropertyValueType.Stream: { if (mappingType != MappingType.ApplicationProperty) { break; } amqpObject = MessageConverter.ReadStream((Stream)netObject); break; } case PropertyValueType.Unknown: { if (!(netObject is Stream)) { if (mappingType == MappingType.ApplicationProperty) { throw Microsoft.ServiceBus.Messaging.FxTrace.Exception.AsError(new SerializationException(SRClient.FailedToSerializeUnsupportedType(netObject.GetType().FullName)), null); } if (netObject is byte[]) { amqpObject = new ArraySegment <byte>((byte[])netObject); break; } else if (!(netObject is IList)) { if (!(netObject is IDictionary)) { break; } amqpObject = new AmqpMap((IDictionary)netObject); break; } else { amqpObject = netObject; break; } } else { if (mappingType != MappingType.ApplicationProperty) { break; } amqpObject = MessageConverter.ReadStream((Stream)netObject); break; } } } return(amqpObject != null); }