private 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); }
private 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); }