From: Mohamad Al-Jaf mohamadaljaf@gmail.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56914 --- dlls/windows.web/json_value.c | 152 +++++++++++++++++++++++++++++++++- dlls/windows.web/tests/web.c | 11 +-- 2 files changed, 152 insertions(+), 11 deletions(-)
diff --git a/dlls/windows.web/json_value.c b/dlls/windows.web/json_value.c index 98d41d2c7cf..62de3210d4b 100644 --- a/dlls/windows.web/json_value.c +++ b/dlls/windows.web/json_value.c @@ -115,6 +115,142 @@ static const struct IActivationFactoryVtbl factory_vtbl = factory_ActivateInstance, };
+struct json_value +{ + IJsonValue IJsonValue_iface; + LONG ref; + + HSTRING string_value; +}; + +static inline struct json_value *impl_from_IJsonValue( IJsonValue *iface ) +{ + return CONTAINING_RECORD( iface, struct json_value, IJsonValue_iface ); +} + +static HRESULT WINAPI json_value_QueryInterface( IJsonValue *iface, REFIID iid, void **out ) +{ + struct json_value *impl = impl_from_IJsonValue( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IJsonValue )) + { + *out = &impl->IJsonValue_iface; + IInspectable_AddRef( *out ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI json_value_AddRef( IJsonValue *iface ) +{ + struct json_value *impl = impl_from_IJsonValue( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI json_value_Release( IJsonValue *iface ) +{ + struct json_value *impl = impl_from_IJsonValue( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + + if (!ref) + { + WindowsDeleteString( impl->string_value ); + free( impl ); + } + return ref; +} + +static HRESULT WINAPI json_value_GetIids( IJsonValue *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_value_GetRuntimeClassName( IJsonValue *iface, HSTRING *class_name ) +{ + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_value_GetTrustLevel( IJsonValue *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_value_get_ValueType( IJsonValue *iface, JsonValueType *value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_value_Stringify( IJsonValue *iface, HSTRING *value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_value_GetString( IJsonValue *iface, HSTRING *value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_value_GetNumber( IJsonValue *iface, DOUBLE *value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_value_GetBoolean( IJsonValue *iface, boolean *value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_value_GetArray( IJsonValue *iface, IJsonArray **value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_value_GetObject( IJsonValue *iface, IJsonObject **value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static const struct IJsonValueVtbl json_value_vtbl = +{ + json_value_QueryInterface, + json_value_AddRef, + json_value_Release, + /* IInspectable methods */ + json_value_GetIids, + json_value_GetRuntimeClassName, + json_value_GetTrustLevel, + /* IJsonValue methods */ + json_value_get_ValueType, + json_value_Stringify, + json_value_GetString, + json_value_GetNumber, + json_value_GetBoolean, + json_value_GetArray, + json_value_GetObject, +}; + DEFINE_IINSPECTABLE( json_value_statics, IJsonValueStatics, struct json_value_statics, IActivationFactory_iface )
static HRESULT WINAPI json_value_statics_Parse( IJsonValueStatics *iface, HSTRING input, IJsonValue **value ) @@ -143,8 +279,20 @@ static HRESULT WINAPI json_value_statics_CreateNumberValue( IJsonValueStatics *i
static HRESULT WINAPI json_value_statics_CreateStringValue( IJsonValueStatics *iface, HSTRING input, IJsonValue **value ) { - FIXME( "iface %p, input %s, value %p stub!\n", iface, debugstr_hstring( input ), value ); - return E_NOTIMPL; + struct json_value *impl; + + TRACE( "iface %p, input %s, value %p\n", iface, debugstr_hstring( input ), value ); + + if (!value) return E_POINTER; + if (!(impl = calloc( 1, sizeof(*impl) ))) return E_OUTOFMEMORY; + + impl->IJsonValue_iface.lpVtbl = &json_value_vtbl; + impl->ref = 1; + WindowsDuplicateString( input, &impl->string_value ); + + *value = &impl->IJsonValue_iface; + TRACE( "created IJsonValue %p.\n", *value ); + return S_OK; }
static const struct IJsonValueStaticsVtbl json_value_statics_vtbl = diff --git a/dlls/windows.web/tests/web.c b/dlls/windows.web/tests/web.c index 76a01bd8bef..0f50423bb30 100644 --- a/dlls/windows.web/tests/web.c +++ b/dlls/windows.web/tests/web.c @@ -118,24 +118,17 @@ static void test_JsonValueStatics(void) ok( hr == S_OK, "got hr %#lx.\n", hr );
hr = IJsonValueStatics_CreateStringValue( json_value_statics, NULL, (IJsonValue **)&json_value ); - todo_wine ok( hr == S_OK, "got hr %#lx.\n", hr ); hr = WindowsCreateString( L"Wine", wcslen( L"Wine" ), &str ); ok( hr == S_OK, "got hr %#lx.\n", hr ); hr = IJsonValueStatics_CreateStringValue( json_value_statics, str, NULL ); - todo_wine ok( hr == E_POINTER, "got hr %#lx.\n", hr ); hr = IJsonValueStatics_CreateStringValue( json_value_statics, str, (IJsonValue **)&json_value ); - todo_wine ok( hr == S_OK, "got hr %#lx.\n", hr ); WindowsDeleteString( str );
- if (json_value) - { - ref = IJsonValue_Release( json_value ); - todo_wine - ok( ref == 0, "got ref %ld.\n", ref ); - } + ref = IJsonValue_Release( json_value ); + ok( ref == 0, "got ref %ld.\n", ref ); ref = IJsonValueStatics_Release( json_value_statics ); ok( ref == 2, "got ref %ld.\n", ref ); ref = IActivationFactory_Release( factory );