Owen Rudge : wsdapi: Implement WSDXMLAddChild, Sibling, BuildAnyForSingleElement, CleanupElement.
Alexandre Julliard
julliard at winehq.org
Mon May 8 17:21:23 CDT 2017
Module: wine
Branch: master
Commit: e47e132d1bc0218e28e5d7764aec7d887d5450ac
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e47e132d1bc0218e28e5d7764aec7d887d5450ac
Author: Owen Rudge <orudge at codeweavers.com>
Date: Wed May 3 23:55:30 2017 +0100
wsdapi: Implement WSDXMLAddChild, Sibling, BuildAnyForSingleElement, CleanupElement.
Signed-off-by: Owen Rudge <orudge at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wsdapi/Makefile.in | 3 +-
dlls/wsdapi/wsdapi.spec | 8 +-
dlls/wsdapi/xml.c | 215 ++++++++++++++++++++++++++++++++++++++++++++++++
include/wsdutil.h | 5 ++
include/wsdxmldom.h | 7 ++
5 files changed, 233 insertions(+), 5 deletions(-)
diff --git a/dlls/wsdapi/Makefile.in b/dlls/wsdapi/Makefile.in
index 7d63fe2..764682d 100644
--- a/dlls/wsdapi/Makefile.in
+++ b/dlls/wsdapi/Makefile.in
@@ -5,4 +5,5 @@ IMPORTS = kernel32
C_SRCS = \
discovery.c \
main.c \
- memory.c
+ memory.c \
+ xml.c
diff --git a/dlls/wsdapi/wsdapi.spec b/dlls/wsdapi/wsdapi.spec
index 7145f7d..8ee17cb 100644
--- a/dlls/wsdapi/wsdapi.spec
+++ b/dlls/wsdapi/wsdapi.spec
@@ -36,10 +36,10 @@
@ stub WSDSetConfigurationOption
@ stub WSDUriDecode
@ stub WSDUriEncode
-@ stub WSDXMLAddChild
-@ stub WSDXMLAddSibling
-@ stub WSDXMLBuildAnyForSingleElement
-@ stub WSDXMLCleanupElement
+@ stdcall WSDXMLAddChild(ptr ptr)
+@ stdcall WSDXMLAddSibling(ptr ptr)
+@ stdcall WSDXMLBuildAnyForSingleElement(ptr ptr ptr)
+@ stdcall WSDXMLCleanupElement(ptr)
@ stub WSDXMLCreateContext
@ stub WSDXMLGetNameFromBuiltinNamespace
@ stub WSDXMLGetValueFromAny
diff --git a/dlls/wsdapi/xml.c b/dlls/wsdapi/xml.c
new file mode 100644
index 0000000..1cc45b8
--- /dev/null
+++ b/dlls/wsdapi/xml.c
@@ -0,0 +1,215 @@
+/*
+ * Web Services on Devices
+ *
+ * Copyright 2017 Owen Rudge for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+#include "wsdapi.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wsdapi);
+
+#define WSD_MAX_TEXT_LENGTH 8192
+
+static LPWSTR duplicate_string(void *parentMemoryBlock, LPCWSTR value)
+{
+ int valueLen;
+ LPWSTR dup;
+
+ valueLen = lstrlenW(value) + 1;
+
+ dup = WSDAllocateLinkedMemory(parentMemoryBlock, valueLen * sizeof(WCHAR));
+
+ if (dup) memcpy(dup, value, valueLen * sizeof(WCHAR));
+ return dup;
+}
+
+static WSDXML_NAME *duplicate_name(void *parentMemoryBlock, WSDXML_NAME *name)
+{
+ WSDXML_NAME *dup;
+
+ dup = WSDAllocateLinkedMemory(parentMemoryBlock, sizeof(WSDXML_NAME));
+
+ if (dup == NULL)
+ {
+ return NULL;
+ }
+
+ dup->Space = name->Space;
+ dup->LocalName = duplicate_string(dup, name->LocalName);
+
+ if (dup->LocalName == NULL)
+ {
+ WSDFreeLinkedMemory(dup);
+ return NULL;
+ }
+
+ return dup;
+}
+
+HRESULT WINAPI WSDXMLAddChild(WSDXML_ELEMENT *pParent, WSDXML_ELEMENT *pChild)
+{
+ WSDXML_NODE *currentNode;
+
+ TRACE("(%p, %p)\n", pParent, pChild);
+
+ if ((pParent == NULL) || (pChild == NULL) || (pChild->Node.Parent != NULL))
+ {
+ return E_INVALIDARG;
+ }
+
+ /* See if the parent already has a child */
+ currentNode = pParent->FirstChild;
+
+ if (currentNode == NULL)
+ {
+ pParent->FirstChild = (WSDXML_NODE *)pChild;
+ }
+ else
+ {
+ /* Find the last sibling node and make this child the next sibling */
+ WSDXMLAddSibling((WSDXML_ELEMENT *)currentNode, pChild);
+ }
+
+ pChild->Node.Parent = pParent;
+
+ /* Link the memory allocations */
+ WSDAttachLinkedMemory(pParent, pChild);
+
+ return S_OK;
+}
+
+HRESULT WINAPI WSDXMLAddSibling(WSDXML_ELEMENT *pFirst, WSDXML_ELEMENT *pSecond)
+{
+ WSDXML_NODE *currentNode;
+
+ TRACE("(%p, %p)\n", pFirst, pSecond);
+
+ if ((pFirst == NULL) || (pSecond == NULL))
+ {
+ return E_INVALIDARG;
+ }
+
+ /* See if the first node already has a sibling */
+ currentNode = pFirst->Node.Next;
+
+ if (currentNode == NULL)
+ {
+ pFirst->Node.Next = (WSDXML_NODE *)pSecond;
+ }
+ else
+ {
+ /* Find the last sibling node and make the second element the next sibling */
+ while (1)
+ {
+ if (currentNode->Next == NULL)
+ {
+ currentNode->Next = (WSDXML_NODE *)pSecond;
+ break;
+ }
+
+ currentNode = currentNode->Next;
+ }
+ }
+
+ /* Reparent the second node under the first */
+ pSecond->Node.Parent = pFirst->Node.Parent;
+
+ /* Link the memory allocations */
+ WSDAttachLinkedMemory(pFirst->Node.Parent, pSecond);
+
+ return S_OK;
+}
+
+HRESULT WINAPI WSDXMLBuildAnyForSingleElement(WSDXML_NAME *pElementName, LPCWSTR pszText, WSDXML_ELEMENT **ppAny)
+{
+ WSDXML_TEXT *child;
+
+ TRACE("(%p, %s, %p)\n", pElementName, debugstr_w(pszText), ppAny);
+
+ if ((pElementName == NULL) || ((pszText != NULL) && (lstrlenW(pszText) > WSD_MAX_TEXT_LENGTH)))
+ {
+ return E_INVALIDARG;
+ }
+
+ if (ppAny == NULL)
+ {
+ return E_POINTER;
+ }
+
+ *ppAny = WSDAllocateLinkedMemory(NULL, sizeof(WSDXML_ELEMENT));
+
+ if (*ppAny == NULL)
+ {
+ return E_OUTOFMEMORY;
+ }
+
+ ZeroMemory(*ppAny, sizeof(WSDXML_ELEMENT));
+
+ (*ppAny)->Name = duplicate_name(*ppAny, pElementName);
+
+ if ((*ppAny)->Name == NULL)
+ {
+ WSDFreeLinkedMemory(*ppAny);
+ return E_OUTOFMEMORY;
+ }
+
+ if (pszText != NULL)
+ {
+ child = WSDAllocateLinkedMemory(*ppAny, sizeof(WSDXML_TEXT));
+
+ if (child == NULL)
+ {
+ WSDFreeLinkedMemory(*ppAny);
+ return E_OUTOFMEMORY;
+ }
+
+ child->Node.Parent = *ppAny;
+ child->Node.Next = NULL;
+ child->Node.Type = TextType;
+ child->Text = duplicate_string(child, pszText);
+
+ if (child->Text == NULL)
+ {
+ WSDFreeLinkedMemory(*ppAny);
+ return E_OUTOFMEMORY;
+ }
+
+ (*ppAny)->FirstChild = (WSDXML_NODE *)child;
+ }
+
+ return S_OK;
+}
+
+HRESULT WINAPI WSDXMLCleanupElement(WSDXML_ELEMENT *pAny)
+{
+ TRACE("(%p)\n", pAny);
+
+ if (pAny == NULL)
+ {
+ return E_INVALIDARG;
+ }
+
+ WSDFreeLinkedMemory(pAny);
+ return S_OK;
+}
diff --git a/include/wsdutil.h b/include/wsdutil.h
index 8a89eb1..2980d40 100644
--- a/include/wsdutil.h
+++ b/include/wsdutil.h
@@ -24,4 +24,9 @@ void WINAPI WSDAttachLinkedMemory(void *pParent, void *pChild);
void WINAPI WSDDetachLinkedMemory(void *pVoid);
void WINAPI WSDFreeLinkedMemory(void *pVoid);
+HRESULT WINAPI WSDXMLAddChild(WSDXML_ELEMENT *pParent, WSDXML_ELEMENT *pChild);
+HRESULT WINAPI WSDXMLAddSibling(WSDXML_ELEMENT *pFirst, WSDXML_ELEMENT *pSecond);
+HRESULT WINAPI WSDXMLBuildAnyForSingleElement(WSDXML_NAME *pElementName, LPCWSTR pszText, WSDXML_ELEMENT **ppAny);
+HRESULT WINAPI WSDXMLCleanupElement(WSDXML_ELEMENT *pAny);
+
#endif
diff --git a/include/wsdxmldom.h b/include/wsdxmldom.h
index e9fb3bd..8901236 100644
--- a/include/wsdxmldom.h
+++ b/include/wsdxmldom.h
@@ -26,6 +26,7 @@ typedef struct _WSDXML_PREFIX_MAPPING WSDXML_PREFIX_MAPPING;
typedef struct _WSDXML_ATTRIBUTE WSDXML_ATTRIBUTE;
typedef struct _WSDXML_NODE WSDXML_NODE;
typedef struct _WSDXML_ELEMENT WSDXML_ELEMENT;
+typedef struct _WSDXML_TEXT WSDXML_TEXT;
typedef const WSDXML_NAMESPACE *PCWSDXML_NAMESPACE;
typedef const WSDXML_TYPE *PCWSDXML_TYPE;
@@ -87,4 +88,10 @@ struct _WSDXML_ELEMENT
WSDXML_PREFIX_MAPPING *PrefixMappings;
};
+struct _WSDXML_TEXT
+{
+ WSDXML_NODE Node;
+ WCHAR *Text;
+};
+
#endif /* __WSDXMLDOM_H__ */
More information about the wine-cvs
mailing list