/// <summary> /// Parse PROP_VAL_UNION structure. /// </summary> /// <param name="ptr">A pointer points to the allocated memory.</param> /// <param name="proptype">Property Types.</param> /// <returns>Instance of PROP_VAL_UNION structure.</returns> public static PROP_VAL_UNION ParsePROP_VAL_UNION(IntPtr ptr, PropertyTypeValue proptype) { PROP_VAL_UNION pvu = new PROP_VAL_UNION(); switch (proptype) { case PropertyTypeValue.PtypInteger16: pvu.I = Marshal.ReadInt16(ptr); break; case PropertyTypeValue.PtypInteger32: pvu.L = Marshal.ReadInt32(ptr); break; case PropertyTypeValue.PtypBoolean: if (AdapterHelper.Transport.ToLower(System.Globalization.CultureInfo.CurrentCulture) != "mapi_http") { pvu.B = (ushort)Marshal.ReadInt16(ptr); } else { pvu.B = (byte)Marshal.ReadByte(ptr); } break; case PropertyTypeValue.PtypString8: pvu.LpszA = ParseString_r(ptr); break; case PropertyTypeValue.PtypBinary: pvu.Bin = ParseBinary_r(ptr); break; case PropertyTypeValue.PtypString: pvu.LpszW = ParseWString_r(ptr); break; case PropertyTypeValue.PtypGuid: if (AdapterHelper.Transport.ToLower(System.Globalization.CultureInfo.CurrentCulture) != "mapi_http") { IntPtr uidaddr = new IntPtr(Marshal.ReadInt32(ptr)); if (uidaddr == IntPtr.Zero) { pvu.Lpguid = null; } else { pvu.Lpguid = new FlatUID_r[1]; pvu.Lpguid[0] = ParseFlatUID_r(uidaddr); } } else { if (ptr == IntPtr.Zero) { pvu.Lpguid = null; } else { pvu.Lpguid = new FlatUID_r[1]; pvu.Lpguid[0] = ParseFlatUID_r(ptr); } } break; case PropertyTypeValue.PtypTime: pvu.Ft.LowDateTime = (uint)Marshal.ReadInt32(ptr); pvu.Ft.HighDateTime = (uint)Marshal.ReadInt32(ptr, sizeof(uint)); break; case PropertyTypeValue.PtypErrorCode: pvu.Err = Marshal.ReadInt32(ptr); break; case PropertyTypeValue.PtypMultipleInteger16: pvu.MVi = ParseShortArray_r(ptr); break; case PropertyTypeValue.PtypMultipleInteger32: pvu.MVl = ParseLongArray_r(ptr); break; case PropertyTypeValue.PtypMultipleString8: uint isFound = (uint)Marshal.ReadInt32(ptr); if (isFound == (uint)ErrorCodeValue.NotFound) { pvu.MVszA.CValues = 0; pvu.MVszA.LppszA = null; } else { pvu.MVszA = ParseStringArray_r(ptr); } break; case PropertyTypeValue.PtypMultipleBinary: pvu.MVbin = ParseBinaryArray_r(ptr); break; case PropertyTypeValue.PtypMultipleString: pvu.MVszW = ParseWStringArray_r(ptr); break; case PropertyTypeValue.PtypMultipleGuid: pvu.MVguid = ParseFlatUIDArray_r(ptr); break; case PropertyTypeValue.PtypNull: case PropertyTypeValue.PtypEmbeddedTable: pvu.Reserved = Marshal.ReadInt32(ptr); break; default: throw new ParseException("Parsing PROP_VAL_UNION failed!"); } return pvu; }
/// <summary> /// Parse PROP_VAL_UNION structure. /// </summary> /// <param name="propertyValue">The property value used for parsing.</param> /// <param name="proptype">The Property Types used for parsing.</param> /// <returns>Instance of PROP_VAL_UNION structure.</returns> public static PROP_VAL_UNION ParsePROP_VAL_UNION(AddressBookPropertyValue propertyValue, PropertyTypeValue proptype) { PROP_VAL_UNION pvu = new PROP_VAL_UNION(); IntPtr valuePtr = IntPtr.Zero; valuePtr = Marshal.AllocHGlobal(propertyValue.Value.Length); Marshal.Copy(propertyValue.Value, 0, valuePtr, propertyValue.Value.Length); pvu = AdapterHelper.ParsePROP_VAL_UNION(valuePtr, proptype); Marshal.FreeHGlobal(valuePtr); return pvu; }
/// <summary> /// Parse PROP_VAL_UNION structure. /// </summary> /// <param name="ptr">A pointer points to memory allocated.</param> /// <param name="proptype">Property Types.</param> /// <returns>Instance of PROP_VAL_UNION structure.</returns> public static PROP_VAL_UNION ParsePROP_VAL_UNION(IntPtr ptr, PropertyType proptype) { PROP_VAL_UNION pvu = new PROP_VAL_UNION(); switch (proptype) { case PropertyType.PtypInteger16: pvu.I = Marshal.ReadInt16(ptr); break; case PropertyType.PtypInteger32: pvu.L = Marshal.ReadInt32(ptr); break; case PropertyType.PtypBoolean: pvu.B = (ushort)Marshal.ReadInt16(ptr); break; case PropertyType.PtypString8: pvu.LpszA = Marshal.PtrToStringAnsi(new IntPtr(Marshal.ReadInt32(ptr))); break; case PropertyType.PtypBinary: pvu.Bin = ParseBinary_r(ptr); break; case PropertyType.PtypString: pvu.LpszW = Marshal.PtrToStringUni(new IntPtr(Marshal.ReadInt32(ptr))); break; case PropertyType.PtypGuid: IntPtr uidaddr = new IntPtr(Marshal.ReadInt32(ptr)); if (uidaddr == IntPtr.Zero) { pvu.Guid = null; } else { pvu.Guid = new FlatUID_r[1]; pvu.Guid[0] = ParseFlatUID_r(uidaddr); } break; case PropertyType.PtypTime: pvu.FileTime.LowDateTime = (uint)Marshal.ReadInt32(ptr); pvu.FileTime.HighDateTime = (uint)Marshal.ReadInt32(ptr, sizeof(uint)); break; case PropertyType.PtypErrorCode: pvu.ErrorCode = Marshal.ReadInt32(ptr); break; case PropertyType.PtypMultipleInteger16: pvu.MVi = ParseShortArray_r(ptr); break; case PropertyType.PtypMultipleInteger32: pvu.MVl = ParseLongArray_r(ptr); break; case PropertyType.PtypMultipleString8: pvu.MVszA = ParseStringArray_r(ptr); break; case PropertyType.PtypMultipleBinary: pvu.MVbin = ParseBinaryArray_r(ptr); break; case PropertyType.PtypMultipleString: pvu.MVszW = ParseWStringArray_r(ptr); break; case PropertyType.PtypMultipleGuid: pvu.MVguid = ParseFlatUIDArray_r(ptr); break; case PropertyType.PtypNull: case PropertyType.PtypEmbeddedTable: pvu.Reserved = Marshal.ReadInt32(ptr); break; default: throw new ParseException("Parsing PROP_VAL_UNION failed!"); } return(pvu); }