public void FromBytes(WspBuffer buffer) { vType = buffer.ToStruct <CBaseStorageVariant_vType_Values>(); reserved1 = buffer.ToStruct <ushort>(); reserved2 = buffer.ToStruct <uint>(); DecodeCount(buffer); DecodeOffset(buffer); }
private static VT_VECTOR <T> GetVectorValue <T>(CBaseStorageVariant_vType_Values vType, WspBuffer buffer) where T : struct { var vector = new VT_VECTOR <T>(); vector.vVectorElements = buffer.ToStruct <uint>(); vector.vVectorData = new T[vector.vVectorElements]; for (var idx = 0; idx < vector.vVectorElements; idx++) { vector.vVectorData[idx] = (T)GetValue(vType, buffer); } return(vector); }
private object ReadValueByType(CBaseStorageVariant_vType_Values vType, int valueOffset, WspBuffer buffer) { if (vType.HasFlag(CBaseStorageVariant_vType_Values.VT_VECTOR) || vType.HasFlag(CBaseStorageVariant_vType_Values.VT_ARRAY)) { throw new NotImplementedException(); } object value = null; switch (vType) { case CBaseStorageVariant_vType_Values.VT_EMPTY: case CBaseStorageVariant_vType_Values.VT_NULL: break; case CBaseStorageVariant_vType_Values.VT_I1: value = buffer.Peek <sbyte>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_UI1: value = buffer.Peek <byte>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_I2: value = buffer.Peek <short>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_UI2: case CBaseStorageVariant_vType_Values.VT_BOOL: value = buffer.Peek <ushort>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_I4: case CBaseStorageVariant_vType_Values.VT_INT: value = buffer.Peek <int>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_R4: value = buffer.Peek <float>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_UI4: case CBaseStorageVariant_vType_Values.VT_UINT: case CBaseStorageVariant_vType_Values.VT_ERROR: value = buffer.Peek <uint>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_I8: value = buffer.Peek <long>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_UI8: value = buffer.Peek <ulong>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_R8: value = buffer.Peek <double>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_CY: // An 8-byte two's complement integer (vValue divided by 10,000). throw new NotImplementedException(); case CBaseStorageVariant_vType_Values.VT_DATE: value = DateTime.FromOADate(buffer.Peek <double>(valueOffset)).ToUniversalTime(); break; case CBaseStorageVariant_vType_Values.VT_FILETIME: value = DateTime.FromFileTime(buffer.Peek <long>(valueOffset)).ToUniversalTime(); break; case CBaseStorageVariant_vType_Values.VT_DECIMAL: value = buffer.Peek <DECIMAL>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_CLSID: value = buffer.Peek <Guid>(valueOffset); break; case CBaseStorageVariant_vType_Values.VT_BLOB: // A 4-byte unsigned integer count of bytes in the blob, followed by that many bytes of data. case CBaseStorageVariant_vType_Values.VT_BLOB_OBJECT: int blobSize = buffer.Peek <int>(valueOffset); value = buffer.ReadBytesFromOffset(valueOffset + 4, blobSize); break; case CBaseStorageVariant_vType_Values.VT_BSTR: int strSize = buffer.Peek <int>(valueOffset); var bytes = buffer.ReadBytesFromOffset(valueOffset + 4, strSize); // TODO: Just use UTF8 for a temporary solution // For vType set to VT_BSTR, this field is a set of characters in an OEM–selected character set. // The client and server MUST be configured to have interoperable character sets. // There is no requirement that it be null-terminated. value = System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length); break; case CBaseStorageVariant_vType_Values.VT_LPSTR: throw new NotImplementedException(); case CBaseStorageVariant_vType_Values.VT_LPWSTR: int strLength = GetNullTerminatedUnicodeStringLength(buffer, valueOffset); value = System.Text.Encoding.Unicode.GetString(buffer.ReadBytesFromOffset(valueOffset, strLength), 0, strLength); break; case CBaseStorageVariant_vType_Values.VT_COMPRESSED_LPWSTR: value = buffer.Peek <VT_COMPRESSED_LPWSTR>(valueOffset); break; } return(value); }
private static object GetVectorValue(CBaseStorageVariant_vType_Values vType, WspBuffer buffer) { object value = null; switch (vType) { case CBaseStorageVariant_vType_Values.VT_EMPTY: case CBaseStorageVariant_vType_Values.VT_NULL: break; case CBaseStorageVariant_vType_Values.VT_I1: value = GetVectorValue <sbyte>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_UI1: value = GetVectorValue <byte>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_I2: value = GetVectorValue <short>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_UI2: case CBaseStorageVariant_vType_Values.VT_BOOL: value = GetVectorValue <ushort>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_I4: case CBaseStorageVariant_vType_Values.VT_INT: value = GetVectorValue <int>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_R4: value = GetVectorValue <float>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_UI4: case CBaseStorageVariant_vType_Values.VT_UINT: case CBaseStorageVariant_vType_Values.VT_ERROR: value = GetVectorValue <uint>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_I8: case CBaseStorageVariant_vType_Values.VT_CY: value = GetVectorValue <long>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_UI8: value = GetVectorValue <ulong>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_R8: value = GetVectorValue <double>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_DATE: value = GetVectorValue <DateTime>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_FILETIME: value = GetVectorValue <DateTime>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_DECIMAL: value = GetVectorValue <DECIMAL>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_CLSID: value = GetVectorValue <Guid>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_BLOB: value = GetVectorValue <VT_BLOB>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_BLOB_OBJECT: value = GetVectorValue <VT_BLOB_OBJECT>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_BSTR: value = GetVectorValue <VT_BSTR>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_LPSTR: value = GetVectorValue <VT_LPSTR>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_LPWSTR: value = GetVectorValue <VT_LPWSTR>(vType, buffer); break; case CBaseStorageVariant_vType_Values.VT_COMPRESSED_LPWSTR: value = GetVectorValue <VT_COMPRESSED_LPWSTR>(vType, buffer); break; } return(value); }
private static object GetValue(CBaseStorageVariant_vType_Values vType, WspBuffer buffer) { object value = null; switch (vType) { case CBaseStorageVariant_vType_Values.VT_EMPTY: case CBaseStorageVariant_vType_Values.VT_NULL: break; case CBaseStorageVariant_vType_Values.VT_I1: value = buffer.ToStruct <sbyte>(); break; case CBaseStorageVariant_vType_Values.VT_UI1: value = buffer.ToStruct <byte>(); break; case CBaseStorageVariant_vType_Values.VT_I2: value = buffer.ToStruct <short>(); break; case CBaseStorageVariant_vType_Values.VT_UI2: case CBaseStorageVariant_vType_Values.VT_BOOL: value = buffer.ToStruct <ushort>(); break; case CBaseStorageVariant_vType_Values.VT_I4: case CBaseStorageVariant_vType_Values.VT_INT: value = buffer.ToStruct <int>(); break; case CBaseStorageVariant_vType_Values.VT_R4: value = buffer.ToStruct <float>(); break; case CBaseStorageVariant_vType_Values.VT_UI4: case CBaseStorageVariant_vType_Values.VT_UINT: case CBaseStorageVariant_vType_Values.VT_ERROR: value = buffer.ToStruct <uint>(); break; case CBaseStorageVariant_vType_Values.VT_I8: case CBaseStorageVariant_vType_Values.VT_CY: value = buffer.ToStruct <long>(); break; case CBaseStorageVariant_vType_Values.VT_UI8: value = buffer.ToStruct <ulong>(); break; case CBaseStorageVariant_vType_Values.VT_R8: value = buffer.ToStruct <double>(); break; case CBaseStorageVariant_vType_Values.VT_DATE: value = DateTime.FromOADate(buffer.ToStruct <double>()).ToUniversalTime(); break; case CBaseStorageVariant_vType_Values.VT_FILETIME: value = DateTime.FromFileTime(buffer.ToStruct <long>()).ToUniversalTime(); break; case CBaseStorageVariant_vType_Values.VT_DECIMAL: value = buffer.ToStruct <DECIMAL>(); break; case CBaseStorageVariant_vType_Values.VT_CLSID: value = buffer.ToStruct <Guid>(); break; case CBaseStorageVariant_vType_Values.VT_BLOB: var blob = new VT_BLOB(); blob.cbSize = buffer.ToStruct <uint>(); blob.blobData = buffer.ReadBytes((int)blob.cbSize); value = blob; break; case CBaseStorageVariant_vType_Values.VT_BLOB_OBJECT: var blobObj = new VT_BLOB_OBJECT(); blobObj.cbSize = buffer.ToStruct <uint>(); blobObj.blobData = buffer.ReadBytes((int)blobObj.cbSize); value = blobObj; break; case CBaseStorageVariant_vType_Values.VT_BSTR: var bstr = new VT_BSTR(); bstr.cbSize = buffer.ToStruct <uint>(); bstr.blobData = buffer.ReadBytes((int)bstr.cbSize); value = bstr; break; case CBaseStorageVariant_vType_Values.VT_LPSTR: var lpstr = new VT_LPSTR(); lpstr.cLen = buffer.ToStruct <uint>(); var strLength = GetNullTerminatedUnicodeStringLength(buffer, buffer.ReadOffset); lpstr._string = Encoding.Unicode.GetString(buffer.ReadBytes((int)(lpstr.cLen * 2)), 0, strLength); value = lpstr; break; case CBaseStorageVariant_vType_Values.VT_LPWSTR: var lpwstr = new VT_LPWSTR(); lpwstr.cLen = buffer.ToStruct <uint>(); strLength = GetNullTerminatedUnicodeStringLength(buffer, buffer.ReadOffset); lpwstr._string = Encoding.Unicode.GetString(buffer.ReadBytes((int)(lpwstr.cLen * 2)), 0, strLength); value = lpwstr; break; case CBaseStorageVariant_vType_Values.VT_COMPRESSED_LPWSTR: var compressedLpwstr = new VT_COMPRESSED_LPWSTR(); compressedLpwstr.ccLen = buffer.ToStruct <uint>(); compressedLpwstr.bytes = buffer.ReadBytes((int)compressedLpwstr.ccLen); value = compressedLpwstr; break; } return(value); }