Module: wine Branch: master Commit: f4d3dd2cd6492d2092ec3f08bdbe9d0ff529dc1d URL: http://source.winehq.org/git/wine.git/?a=commit;h=f4d3dd2cd6492d2092ec3f08bd...
Author: Owen Rudge orudge@codeweavers.com Date: Thu May 18 22:38:43 2017 +0100
wsdapi: Add initial implementation of IWSDXMLContext and WSDXMLCreateContext.
Signed-off-by: Owen Rudge orudge@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wsdapi/wsdapi.spec | 2 +- dlls/wsdapi/xml.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++++ include/wsdxml.idl | 2 + 3 files changed, 134 insertions(+), 1 deletion(-)
diff --git a/dlls/wsdapi/wsdapi.spec b/dlls/wsdapi/wsdapi.spec index 8ee17cb..fd89be7 100644 --- a/dlls/wsdapi/wsdapi.spec +++ b/dlls/wsdapi/wsdapi.spec @@ -40,6 +40,6 @@ @ stdcall WSDXMLAddSibling(ptr ptr) @ stdcall WSDXMLBuildAnyForSingleElement(ptr ptr ptr) @ stdcall WSDXMLCleanupElement(ptr) -@ stub WSDXMLCreateContext +@ stdcall WSDXMLCreateContext(ptr) @ stub WSDXMLGetNameFromBuiltinNamespace @ stub WSDXMLGetValueFromAny diff --git a/dlls/wsdapi/xml.c b/dlls/wsdapi/xml.c index 1cc45b8..4b150d4 100644 --- a/dlls/wsdapi/xml.c +++ b/dlls/wsdapi/xml.c @@ -213,3 +213,134 @@ HRESULT WINAPI WSDXMLCleanupElement(WSDXML_ELEMENT *pAny) WSDFreeLinkedMemory(pAny); return S_OK; } + +/* IWSDXMLContext implementation */ + +typedef struct IWSDXMLContextImpl +{ + IWSDXMLContext IWSDXMLContext_iface; + LONG ref; +} IWSDXMLContextImpl; + +static inline IWSDXMLContextImpl *impl_from_IWSDXMLContext(IWSDXMLContext *iface) +{ + return CONTAINING_RECORD(iface, IWSDXMLContextImpl, IWSDXMLContext_iface); +} + +static HRESULT WINAPI IWSDXMLContextImpl_QueryInterface(IWSDXMLContext *iface, REFIID riid, void **ppv) +{ + IWSDXMLContextImpl *This = impl_from_IWSDXMLContext(iface); + + TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppv); + + if (!ppv) + { + WARN("Invalid parameter\n"); + return E_INVALIDARG; + } + + *ppv = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IWSDXMLContext)) + { + *ppv = &This->IWSDXMLContext_iface; + } + else + { + WARN("Unknown IID %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI IWSDXMLContextImpl_AddRef(IWSDXMLContext *iface) +{ + IWSDXMLContextImpl *This = impl_from_IWSDXMLContext(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + return ref; +} + +static ULONG WINAPI IWSDXMLContextImpl_Release(IWSDXMLContext *iface) +{ + IWSDXMLContextImpl *This = impl_from_IWSDXMLContext(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if (ref == 0) + { + WSDFreeLinkedMemory(This); + } + + return ref; +} + +static HRESULT WINAPI IWSDXMLContextImpl_AddNamespace(IWSDXMLContext *iface, LPCWSTR pszUri, LPCWSTR pszSuggestedPrefix, WSDXML_NAMESPACE **ppNamespace) +{ + FIXME("(%p, %s, %s, %p)\n", iface, debugstr_w(pszUri), debugstr_w(pszSuggestedPrefix), ppNamespace); + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDXMLContextImpl_AddNameToNamespace(IWSDXMLContext *iface, LPCWSTR pszUri, LPCWSTR pszName, WSDXML_NAME **ppName) +{ + FIXME("(%p, %s, %s, %p)\n", iface, debugstr_w(pszUri), debugstr_w(pszName), ppName); + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDXMLContextImpl_SetNamespaces(IWSDXMLContext *iface, const PCWSDXML_NAMESPACE *pNamespaces, WORD wNamespacesCount, BYTE bLayerNumber) +{ + FIXME("(%p, %p, %d, %d)\n", iface, pNamespaces, wNamespacesCount, bLayerNumber); + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDXMLContextImpl_SetTypes(IWSDXMLContext *iface, const PCWSDXML_TYPE *pTypes, DWORD dwTypesCount, BYTE bLayerNumber) +{ + FIXME("(%p, %p, %d, %d)\n", iface, pTypes, dwTypesCount, bLayerNumber); + return E_NOTIMPL; +} + +static const IWSDXMLContextVtbl xmlcontext_vtbl = +{ + IWSDXMLContextImpl_QueryInterface, + IWSDXMLContextImpl_AddRef, + IWSDXMLContextImpl_Release, + IWSDXMLContextImpl_AddNamespace, + IWSDXMLContextImpl_AddNameToNamespace, + IWSDXMLContextImpl_SetNamespaces, + IWSDXMLContextImpl_SetTypes +}; + +HRESULT WINAPI WSDXMLCreateContext(IWSDXMLContext **ppContext) +{ + IWSDXMLContextImpl *obj; + + TRACE("(%p)", ppContext); + + if (ppContext == NULL) + { + WARN("Invalid parameter: ppContext == NULL\n"); + return E_POINTER; + } + + *ppContext = NULL; + + obj = WSDAllocateLinkedMemory(NULL, sizeof(*obj)); + + if (!obj) + { + return E_OUTOFMEMORY; + } + + obj->IWSDXMLContext_iface.lpVtbl = &xmlcontext_vtbl; + obj->ref = 1; + + *ppContext = &obj->IWSDXMLContext_iface; + TRACE("Returning iface %p\n", *ppContext); + + return S_OK; +} diff --git a/include/wsdxml.idl b/include/wsdxml.idl index e86d54b..33bd1d9 100644 --- a/include/wsdxml.idl +++ b/include/wsdxml.idl @@ -39,3 +39,5 @@ interface IWSDXMLContext : IUnknown
HRESULT SetTypes([in, size_is(dwTypesCount)] const PCWSDXML_TYPE* pTypes, [in] DWORD dwTypesCount, [in] BYTE bLayerNumber); }; + +cpp_quote("HRESULT WINAPI WSDXMLCreateContext(IWSDXMLContext **ppContext);")