HRESULT CPropertyValueInternalStatics::Deserialize()

in src/foundation/PropertyValueInternalStatics.cpp [516:693]


HRESULT CPropertyValueInternalStatics::Deserialize(
    std::istream& is,
    PropertyType type,
    IPropertyValue **ppPropertyValue)
{
    foundation_assert(ppPropertyValue);

    binary_deserializer bis(is);
    foundation::InspectablePtr spValue;

    switch (type)
    {
    case PropertyType_Empty:
        IFR_ASSERT(pv_util::CreateEmptyValue(spValue.GetAddressOf()));
        break;
    case PropertyType_UInt8:
        {
            UINT8 value = bis.deserializeByte();
            IFR_ASSERT(pv_util::CreateUInt8Value(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_Int16:
        {
            INT16 value = bis.deserializeInt16();
            IFR_ASSERT(pv_util::CreateInt16Value(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_UInt16:
        {
            UINT16 value = bis.deserializeUInt16();
            IFR_ASSERT(pv_util::CreateUInt16Value(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_Int32:
        {
            INT32 value = bis.deserializeInt();
            IFR_ASSERT(pv_util::CreateInt32Value(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_UInt32:
        {
            UINT32 value = bis.deserializeUInt();
            IFR_ASSERT(pv_util::CreateUInt32Value(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_Int64:
        {
            INT64 value = bis.deserializeInt64();
            IFR_ASSERT(pv_util::CreateInt64Value(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_UInt64:
        {
            UINT64 value = bis.deserializeUInt64();
            IFR_ASSERT(pv_util::CreateUInt64Value(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_Single:
        {
            FLOAT value = bis.deserializeSingle();
            IFR_ASSERT(pv_util::CreateSingleValue(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_Double:
        {
            DOUBLE value = bis.deserializeDouble();
            IFR_ASSERT(pv_util::CreateDoubleValue(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_Char16:
        {
            WCHAR value = bis.deserializeChar16();
            IFR_ASSERT(pv_util::CreateChar16Value(value,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_Boolean:
        {
            boolean boolValue = bis.deserializeBoolean();
            IFR_ASSERT(pv_util::CreateBooleanValue(boolValue,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_String:
        {
            foundation::string_t s = bis.deserializeString();
            IFR_ASSERT(pv_util::CreateStringValue(s.c_str(),spValue.GetAddressOf()));
        }
        break;
    case PropertyType_Guid:
        {
            IID iid = bis.deserializeIID();
            IFR_ASSERT(pv_util::CreateGuidValue(iid,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_DateTime:
        {
            foundation::DateTime dt;
            bis.get_istream().read((char *)&dt,sizeof(foundation::DateTime));
            IFR_ASSERT(pv_util::CreateDateTimeValue(dt,spValue.GetAddressOf()));
        }
        break;
    case PropertyType_UInt8Array:
        {
            DeserializeArray<foundation::UInt8ArrayWrapper,BYTE,&IPropertyValueStatics::CreateUInt8Array>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_Int16Array:
        {
            DeserializeArray<foundation::Int16ArrayWrapper,INT16,&IPropertyValueStatics::CreateInt16Array>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_UInt16Array:
        {
            DeserializeArray<foundation::UInt16ArrayWrapper,UINT16,&IPropertyValueStatics::CreateUInt16Array>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_Int32Array:
        {
            DeserializeArray<foundation::Int32ArrayWrapper,INT32,&IPropertyValueStatics::CreateInt32Array>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_UInt32Array:
        {
            DeserializeArray<foundation::UInt32ArrayWrapper,UINT32,&IPropertyValueStatics::CreateUInt32Array>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_Int64Array:
        {
            DeserializeArray<foundation::Int64ArrayWrapper,INT64,&IPropertyValueStatics::CreateInt64Array>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_UInt64Array:
        {
            DeserializeArray<foundation::UInt64ArrayWrapper,UINT64,&IPropertyValueStatics::CreateUInt64Array>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_SingleArray:
        {
            DeserializeArray<foundation::SingleArrayWrapper,FLOAT,&IPropertyValueStatics::CreateSingleArray>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_DoubleArray:
        {
            DeserializeArray<foundation::DoubleArrayWrapper,DOUBLE,&IPropertyValueStatics::CreateDoubleArray>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_BooleanArray:
        {
            DeserializeArray<foundation::ArrayWrapper<boolean>,boolean,&IPropertyValueStatics::CreateBooleanArray>(bis,spValue.GetAddressOf());
        }
        break;
    case PropertyType_StringArray:
        {
            UINT32 size = bis.deserializeUInt();
            std::vector<foundation::HStringPtr> hstring_array;
            hstring_array.resize(size);
            for (UINT32 index = 0; index < hstring_array.size(); ++index)
            {
                foundation::string_t str = bis.deserializeString();
                hstring_array[index] = foundation::HStringPtr(str.c_str());
            }
            IFR_ASSERT(pv_util::CreateStringArrayValue(
                (UINT32)hstring_array.size(), 
                hstring_array.size() ? (HSTRING *)hstring_array.front().GetAddressOfPtr() : nullptr, spValue.GetAddressOf()));
        }
        break;
    case PropertyType_Inspectable:
    case PropertyType_TimeSpan:
    case PropertyType_Point:
    case PropertyType_Size:
    case PropertyType_Rect:
    default:
        foundation_assert(false);
        return E_NOTIMPL;
    }
    foundation_assert(spValue != nullptr);
    IFR_ASSERT(foundation::QueryInterface(spValue,foundation_IID_IPropertyValue,ppPropertyValue));
    return S_OK;
}