From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/windows.web/json_object.c | 147 ++++++++++++++++++++++++++++++++- dlls/windows.web/tests/web.c | 13 ++- 2 files changed, 157 insertions(+), 3 deletions(-)
diff --git a/dlls/windows.web/json_object.c b/dlls/windows.web/json_object.c index b8d56d41052..3d63cffd4f4 100644 --- a/dlls/windows.web/json_object.c +++ b/dlls/windows.web/json_object.c @@ -22,6 +22,136 @@
WINE_DEFAULT_DEBUG_CHANNEL(web);
+struct json_object +{ + IJsonObject IJsonObject_iface; + LONG ref; +}; + +static inline struct json_object *impl_from_IJsonObject( IJsonObject *iface ) +{ + return CONTAINING_RECORD( iface, struct json_object, IJsonObject_iface ); +} + +static HRESULT WINAPI json_object_statics_QueryInterface( IJsonObject *iface, REFIID iid, void **out ) +{ + struct json_object *impl = impl_from_IJsonObject( 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_IJsonObject )) + { + *out = &impl->IJsonObject_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_object_statics_AddRef( IJsonObject *iface ) +{ + struct json_object *impl = impl_from_IJsonObject( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI json_object_statics_Release( IJsonObject *iface ) +{ + struct json_object *impl = impl_from_IJsonObject( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p, ref %lu.\n", iface, ref ); + + if (!ref) free( impl ); + return ref; +} + +static HRESULT WINAPI json_object_statics_GetIids( IJsonObject *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_object_statics_GetRuntimeClassName( IJsonObject *iface, HSTRING *class_name ) +{ + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_object_statics_GetTrustLevel( IJsonObject *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_object_statics_GetNamedValue( IJsonObject *iface, HSTRING name, IJsonValue **value ) +{ + FIXME( "iface %p, name %s, value %p stub!\n", iface, debugstr_hstring( name ), value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_object_statics_SetNamedValue( IJsonObject *iface, HSTRING name, IJsonValue *value ) +{ + FIXME( "iface %p, name %s, value %p stub!\n", iface, debugstr_hstring( name ), value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_object_statics_GetNamedObject( IJsonObject *iface, HSTRING name, IJsonObject **value ) +{ + FIXME( "iface %p, name %s, value %p stub!\n", iface, debugstr_hstring( name ), value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_object_statics_GetNamedArray( IJsonObject *iface, HSTRING name, IJsonArray **value ) +{ + FIXME( "iface %p, name %s, value %p stub!\n", iface, debugstr_hstring( name ), value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_object_statics_GetNamedString( IJsonObject *iface, HSTRING name, HSTRING *value ) +{ + FIXME( "iface %p, name %s, value %p stub!\n", iface, debugstr_hstring( name ), value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_object_statics_GetNamedNumber( IJsonObject *iface, HSTRING name, DOUBLE *value ) +{ + FIXME( "iface %p, name %s, value %p stub!\n", iface, debugstr_hstring( name ), value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI json_object_statics_GetNamedBoolean( IJsonObject *iface, HSTRING name, boolean *value ) +{ + FIXME( "iface %p, name %s, value %p stub!\n", iface, debugstr_hstring( name ), value ); + return E_NOTIMPL; +} + +static const struct IJsonObjectVtbl json_object_statics_vtbl = +{ + json_object_statics_QueryInterface, + json_object_statics_AddRef, + json_object_statics_Release, + /* IInspectable methods */ + json_object_statics_GetIids, + json_object_statics_GetRuntimeClassName, + json_object_statics_GetTrustLevel, + /* IJsonObject methods */ + json_object_statics_GetNamedValue, + json_object_statics_SetNamedValue, + json_object_statics_GetNamedObject, + json_object_statics_GetNamedArray, + json_object_statics_GetNamedString, + json_object_statics_GetNamedNumber, + json_object_statics_GetNamedBoolean, +}; + struct json_object_statics { IActivationFactory IActivationFactory_iface; @@ -90,8 +220,21 @@ static HRESULT WINAPI factory_GetTrustLevel( IActivationFactory *iface, TrustLev
static HRESULT WINAPI factory_ActivateInstance( IActivationFactory *iface, IInspectable **instance ) { - FIXME( "iface %p, instance %p stub!\n", iface, instance ); - return E_NOTIMPL; + struct json_object *impl; + + TRACE( "iface %p, instance %p.\n", iface, instance ); + + if (!(impl = calloc( 1, sizeof(*impl) ))) + { + *instance = NULL; + return E_OUTOFMEMORY; + } + + impl->IJsonObject_iface.lpVtbl = &json_object_statics_vtbl; + impl->ref = 1; + + *instance = (IInspectable *)&impl->IJsonObject_iface; + return S_OK; }
static const struct IActivationFactoryVtbl factory_vtbl = diff --git a/dlls/windows.web/tests/web.c b/dlls/windows.web/tests/web.c index ab63861132a..ec9bc990fe5 100644 --- a/dlls/windows.web/tests/web.c +++ b/dlls/windows.web/tests/web.c @@ -49,6 +49,7 @@ static void test_JsonObjectStatics(void) { static const WCHAR *json_object_name = L"Windows.Data.Json.JsonObject"; IActivationFactory *factory = (void *)0xdeadbeef; + IInspectable *inspectable = (void *)0xdeadbeef; IJsonObject *json_object = (void *)0xdeadbeef; HSTRING str; HRESULT hr; @@ -58,7 +59,6 @@ static void test_JsonObjectStatics(void) ok( hr == S_OK, "got hr %#lx.\n", hr );
hr = RoGetActivationFactory( str, &IID_IActivationFactory, (void **)&factory ); - WindowsDeleteString( str ); ok( hr == S_OK || broken( hr == REGDB_E_CLASSNOTREG ), "got hr %#lx.\n", hr ); if (hr == REGDB_E_CLASSNOTREG) { @@ -73,6 +73,17 @@ static void test_JsonObjectStatics(void) hr = IActivationFactory_QueryInterface( factory, &IID_IJsonObject, (void **)&json_object ); ok( hr == E_NOINTERFACE, "got hr %#lx.\n", hr );
+ hr = RoActivateInstance( str, &inspectable ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + WindowsDeleteString( str ); + + hr = IInspectable_QueryInterface( inspectable, &IID_IJsonObject, (void **)&json_object ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + + check_interface( inspectable, &IID_IAgileObject ); + + IJsonObject_Release( json_object ); + IInspectable_Release( inspectable ); ref = IActivationFactory_Release( factory ); ok( ref == 1, "got ref %ld.\n", ref ); }