internal IotivityValueDictionary(OCRepPayload ocpayload) : this() { foreach (var item in FromOCRepPayload(ocpayload)) { Add(item.Key, item.Value); } }
internal static IEnumerable <KeyValuePair <string, object> > FromOCRepPayload(OCRepPayload ocpayload) { var values = ocpayload.values; while (values != IntPtr.Zero) { var payloadValue = Marshal.PtrToStructure <OCRepPayloadValue>(values); var value = payloadValue.value; switch (payloadValue.type) { case OCRepPayloadPropType.OCREP_PROP_NULL: yield return(new KeyValuePair <string, object>(payloadValue.name, null)); break; case OCRepPayloadPropType.OCREP_PROP_STRING: { var strvalue = Marshal.PtrToStringAnsi(value.ocByteStr); yield return(new KeyValuePair <string, object>(payloadValue.name, strvalue)); break; } case OCRepPayloadPropType.OCREP_PROP_BOOL: { bool bvalue = value.b; yield return(new KeyValuePair <string, object>(payloadValue.name, bvalue)); break; } case OCRepPayloadPropType.OCREP_PROP_DOUBLE: { double dvalue = value.d; yield return(new KeyValuePair <string, object>(payloadValue.name, dvalue)); break; } case OCRepPayloadPropType.OCREP_PROP_INT: { long lvalue = value.i; yield return(new KeyValuePair <string, object>(payloadValue.name, lvalue)); break; } case OCRepPayloadPropType.OCREP_PROP_ARRAY: { var arr = value.arr; int size = (int)arr.dimensions0; //var v = Marshal.PtrToStructure<OCRepPayloadValueArrayUnion>(arr.value); switch (arr.type) { case OCRepPayloadPropType.OCREP_PROP_DOUBLE: double[] avalue = new double[size]; Marshal.Copy(arr.value, avalue, 0, avalue.Length); yield return(new KeyValuePair <string, object>(payloadValue.name, avalue)); break; case OCRepPayloadPropType.OCREP_PROP_INT: var alvalue = new long[size]; Marshal.Copy(arr.value, alvalue, 0, alvalue.Length); yield return(new KeyValuePair <string, object>(payloadValue.name, alvalue)); break; default: throw new NotImplementedException("Cannot convert " + arr.type.ToString() + " array"); } //var a = Marshal.PtrToStructure<double[]>(arr); break; } case OCRepPayloadPropType.OCREP_PROP_BYTE_STRING: case OCRepPayloadPropType.OCREP_PROP_OBJECT: default: throw new NotImplementedException("Cannot convert " + payloadValue.type.ToString()); } values = payloadValue.next; } }