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);
        }
Example #3
0
        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);
        }