ReactOS 0.4.16-dev-2208-g6350669
element.c File Reference
#include <stdarg.h>
#include <libxml/parser.h>
#include <libxml/xmlerror.h>
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winnls.h"
#include "ole2.h"
#include "msxml6.h"
#include "msxml_private.h"
#include "wine/debug.h"
Include dependency graph for element.c:

Go to the source code of this file.

Classes

struct  _domelem
 

Macros

#define COBJMACROS
 

Typedefs

typedef struct _domelem domelem
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (msxml)
 
static domelemimpl_from_IXMLDOMElement (IXMLDOMElement *iface)
 
static xmlNodePtr get_element (const domelem *This)
 
static HRESULT WINAPI domelem_QueryInterface (IXMLDOMElement *iface, REFIID riid, void **ppvObject)
 
static ULONG WINAPI domelem_AddRef (IXMLDOMElement *iface)
 
static ULONG WINAPI domelem_Release (IXMLDOMElement *iface)
 
static HRESULT WINAPI domelem_GetTypeInfoCount (IXMLDOMElement *iface, UINT *pctinfo)
 
static HRESULT WINAPI domelem_GetTypeInfo (IXMLDOMElement *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
 
static HRESULT WINAPI domelem_GetIDsOfNames (IXMLDOMElement *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
 
static HRESULT WINAPI domelem_Invoke (IXMLDOMElement *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
 
static HRESULT WINAPI domelem_get_nodeName (IXMLDOMElement *iface, BSTR *p)
 
static HRESULT WINAPI domelem_get_nodeValue (IXMLDOMElement *iface, VARIANT *value)
 
static HRESULT WINAPI domelem_put_nodeValue (IXMLDOMElement *iface, VARIANT value)
 
static HRESULT WINAPI domelem_get_nodeType (IXMLDOMElement *iface, DOMNodeType *domNodeType)
 
static HRESULT WINAPI domelem_get_parentNode (IXMLDOMElement *iface, IXMLDOMNode **parent)
 
static HRESULT WINAPI domelem_get_childNodes (IXMLDOMElement *iface, IXMLDOMNodeList **outList)
 
static HRESULT WINAPI domelem_get_firstChild (IXMLDOMElement *iface, IXMLDOMNode **domNode)
 
static HRESULT WINAPI domelem_get_lastChild (IXMLDOMElement *iface, IXMLDOMNode **domNode)
 
static HRESULT WINAPI domelem_get_previousSibling (IXMLDOMElement *iface, IXMLDOMNode **domNode)
 
static HRESULT WINAPI domelem_get_nextSibling (IXMLDOMElement *iface, IXMLDOMNode **domNode)
 
static HRESULT WINAPI domelem_get_attributes (IXMLDOMElement *iface, IXMLDOMNamedNodeMap **map)
 
static HRESULT WINAPI domelem_insertBefore (IXMLDOMElement *iface, IXMLDOMNode *newNode, VARIANT refChild, IXMLDOMNode **old_node)
 
static HRESULT WINAPI domelem_replaceChild (IXMLDOMElement *iface, IXMLDOMNode *newNode, IXMLDOMNode *oldNode, IXMLDOMNode **outOldNode)
 
static HRESULT WINAPI domelem_removeChild (IXMLDOMElement *iface, IXMLDOMNode *child, IXMLDOMNode **oldChild)
 
static HRESULT WINAPI domelem_appendChild (IXMLDOMElement *iface, IXMLDOMNode *child, IXMLDOMNode **outChild)
 
static HRESULT WINAPI domelem_hasChildNodes (IXMLDOMElement *iface, VARIANT_BOOL *ret)
 
static HRESULT WINAPI domelem_get_ownerDocument (IXMLDOMElement *iface, IXMLDOMDocument **doc)
 
static HRESULT WINAPI domelem_cloneNode (IXMLDOMElement *iface, VARIANT_BOOL deep, IXMLDOMNode **outNode)
 
static HRESULT WINAPI domelem_get_nodeTypeString (IXMLDOMElement *iface, BSTR *p)
 
static HRESULT WINAPI domelem_get_text (IXMLDOMElement *iface, BSTR *p)
 
static HRESULT WINAPI domelem_put_text (IXMLDOMElement *iface, BSTR p)
 
static HRESULT WINAPI domelem_get_specified (IXMLDOMElement *iface, VARIANT_BOOL *isSpecified)
 
static HRESULT WINAPI domelem_get_definition (IXMLDOMElement *iface, IXMLDOMNode **definitionNode)
 
static BYTE hex_to_byte (xmlChar c)
 
static BYTE base64_to_byte (xmlChar c)
 
static HRESULT variant_from_dt (XDR_DT dt, xmlChar *str, VARIANT *v)
 
static XDR_DT element_get_dt (xmlNodePtr node)
 
static HRESULT WINAPI domelem_get_nodeTypedValue (IXMLDOMElement *iface, VARIANT *v)
 
static HRESULT encode_base64 (const BYTE *buf, int len, BSTR *ret)
 
static HRESULT encode_binhex (const BYTE *buf, int len, BSTR *ret)
 
static HRESULT WINAPI domelem_put_nodeTypedValue (IXMLDOMElement *iface, VARIANT value)
 
static HRESULT WINAPI domelem_get_dataType (IXMLDOMElement *iface, VARIANT *typename)
 
static HRESULT WINAPI domelem_put_dataType (IXMLDOMElement *iface, BSTR dtName)
 
static HRESULT WINAPI domelem_get_xml (IXMLDOMElement *iface, BSTR *p)
 
static HRESULT WINAPI domelem_transformNode (IXMLDOMElement *iface, IXMLDOMNode *node, BSTR *p)
 
static HRESULT WINAPI domelem_selectNodes (IXMLDOMElement *iface, BSTR p, IXMLDOMNodeList **outList)
 
static HRESULT WINAPI domelem_selectSingleNode (IXMLDOMElement *iface, BSTR p, IXMLDOMNode **outNode)
 
static HRESULT WINAPI domelem_get_parsed (IXMLDOMElement *iface, VARIANT_BOOL *isParsed)
 
static HRESULT WINAPI domelem_get_namespaceURI (IXMLDOMElement *iface, BSTR *p)
 
static HRESULT WINAPI domelem_get_prefix (IXMLDOMElement *iface, BSTR *prefix)
 
static HRESULT WINAPI domelem_get_baseName (IXMLDOMElement *iface, BSTR *name)
 
static HRESULT WINAPI domelem_transformNodeToObject (IXMLDOMElement *iface, IXMLDOMNode *domNode, VARIANT var1)
 
static HRESULT WINAPI domelem_get_tagName (IXMLDOMElement *iface, BSTR *p)
 
static HRESULT WINAPI domelem_getAttribute (IXMLDOMElement *iface, BSTR name, VARIANT *value)
 
static HRESULT WINAPI domelem_setAttribute (IXMLDOMElement *iface, BSTR name, VARIANT value)
 
static HRESULT WINAPI domelem_removeAttribute (IXMLDOMElement *iface, BSTR p)
 
static HRESULT WINAPI domelem_getAttributeNode (IXMLDOMElement *iface, BSTR p, IXMLDOMAttribute **attributeNode)
 
static HRESULT WINAPI domelem_setAttributeNode (IXMLDOMElement *iface, IXMLDOMAttribute *attribute, IXMLDOMAttribute **old)
 
static HRESULT WINAPI domelem_removeAttributeNode (IXMLDOMElement *iface, IXMLDOMAttribute *domAttribute, IXMLDOMAttribute **attributeNode)
 
static HRESULT WINAPI domelem_getElementsByTagName (IXMLDOMElement *iface, BSTR tagName, IXMLDOMNodeList **resultList)
 
static HRESULT WINAPI domelem_normalize (IXMLDOMElement *iface)
 
static HRESULT domelem_get_qualified_item (const xmlNodePtr node, BSTR name, BSTR uri, IXMLDOMNode **item)
 
static HRESULT domelem_get_named_item (const xmlNodePtr node, BSTR name, IXMLDOMNode **item)
 
static HRESULT domelem_set_named_item (xmlNodePtr node, IXMLDOMNode *newItem, IXMLDOMNode **namedItem)
 
static HRESULT domelem_remove_qualified_item (xmlNodePtr node, BSTR name, BSTR uri, IXMLDOMNode **item)
 
static HRESULT domelem_remove_named_item (xmlNodePtr node, BSTR name, IXMLDOMNode **item)
 
static HRESULT domelem_get_item (const xmlNodePtr node, LONG index, IXMLDOMNode **item)
 
static HRESULT domelem_get_length (const xmlNodePtr node, LONG *length)
 
static HRESULT domelem_next_node (const xmlNodePtr node, LONG *iter, IXMLDOMNode **nextNode)
 
IUnknowncreate_element (xmlNodePtr element)
 

Variables

static const xmlChar DT_prefix [] = "dt"
 
static const xmlChar DT_nsURI [] = "urn:schemas-microsoft-com:datatypes"
 
static const struct nodemap_funcs domelem_attr_map
 
static const tid_t domelem_se_tids []
 
static const struct IXMLDOMElementVtbl domelem_vtbl
 
static const tid_t domelem_iface_tids []
 
static dispex_static_data_t domelem_dispex
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 21 of file element.c.

Typedef Documentation

◆ domelem

Function Documentation

◆ base64_to_byte()

static BYTE base64_to_byte ( xmlChar  c)
inlinestatic

Definition at line 438 of file element.c.

439{
440 if(c == '+') return 62;
441 if(c == '/') return 63;
442 if(c <= '9') return c-'0'+52;
443 if(c <= 'Z') return c-'A';
444 return c-'a'+26;
445}
const GLubyte * c
Definition: glext.h:8905

Referenced by variant_from_dt().

◆ create_element()

IUnknown * create_element ( xmlNodePtr  element)

Definition at line 1942 of file element.c.

1943{
1944 domelem *This;
1945
1946 This = malloc(sizeof *This);
1947 if ( !This )
1948 return NULL;
1949
1950 This->IXMLDOMElement_iface.lpVtbl = &domelem_vtbl;
1951 This->ref = 1;
1952
1953 init_xmlnode(&This->node, element, (IXMLDOMNode*)&This->IXMLDOMElement_iface, &domelem_dispex);
1954
1955 return (IUnknown*)&This->IXMLDOMElement_iface;
1956}
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
static const struct IXMLDOMElementVtbl domelem_vtbl
Definition: element.c:1531
static dispex_static_data_t domelem_dispex
Definition: element.c:1935
void init_xmlnode(xmlnode *, xmlNodePtr, IXMLDOMNode *, dispex_static_data_t *)
Definition: node.c:1647

◆ domelem_AddRef()

static ULONG WINAPI domelem_AddRef ( IXMLDOMElement iface)
static

Definition at line 103 of file element.c.

104{
107
108 TRACE("%p, refcount %ld.\n", iface, ref);
109
110 return ref;
111}
#define InterlockedIncrement
Definition: armddk.h:53
static domelem * impl_from_IXMLDOMElement(IXMLDOMElement *iface)
Definition: element.c:58
long LONG
Definition: pedump.c:60
#define TRACE(s)
Definition: solgame.cpp:4
Definition: send.c:48

◆ domelem_appendChild()

static HRESULT WINAPI domelem_appendChild ( IXMLDOMElement iface,
IXMLDOMNode child,
IXMLDOMNode **  outChild 
)
static

Definition at line 346 of file element.c.

349{
351 TRACE("(%p)->(%p %p)\n", This, child, outChild);
352 return node_append_child(&This->node, child, outChild);
353}
static HWND child
Definition: cursoricon.c:298
HRESULT node_append_child(xmlnode *, IXMLDOMNode *, IXMLDOMNode **)
Definition: node.c:639

◆ domelem_cloneNode()

static HRESULT WINAPI domelem_cloneNode ( IXMLDOMElement iface,
VARIANT_BOOL  deep,
IXMLDOMNode **  outNode 
)
static

Definition at line 373 of file element.c.

376{
378 TRACE("(%p)->(%d %p)\n", This, deep, outNode);
379 return node_clone( &This->node, deep, outNode );
380}
HRESULT node_clone(xmlnode *, VARIANT_BOOL, IXMLDOMNode **)
Definition: node.c:679

◆ domelem_get_attributes()

static HRESULT WINAPI domelem_get_attributes ( IXMLDOMElement iface,
IXMLDOMNamedNodeMap **  map 
)
static

Definition at line 282 of file element.c.

285{
287
288 TRACE("(%p)->(%p)\n", This, map);
289
290 *map = create_nodemap(This->node.node, &domelem_attr_map);
291 return S_OK;
292}
Definition: _map.h:48
static const struct nodemap_funcs domelem_attr_map
Definition: element.c:50
#define S_OK
Definition: intsafe.h:52
IXMLDOMNamedNodeMap * create_nodemap(xmlNodePtr, const struct nodemap_funcs *)
Definition: nodemap.c:431

◆ domelem_get_baseName()

static HRESULT WINAPI domelem_get_baseName ( IXMLDOMElement iface,
BSTR name 
)
static

Definition at line 1157 of file element.c.

1160{
1162 TRACE("(%p)->(%p)\n", This, name);
1163 return node_get_base_name( &This->node, name );
1164}
HRESULT node_get_base_name(xmlnode *, BSTR *)
Definition: node.c:1622
Definition: name.c:39

◆ domelem_get_childNodes()

static HRESULT WINAPI domelem_get_childNodes ( IXMLDOMElement iface,
IXMLDOMNodeList **  outList 
)
static

Definition at line 227 of file element.c.

230{
232
233 TRACE("(%p)->(%p)\n", This, outList);
234
235 return node_get_child_nodes(&This->node, outList);
236}
HRESULT node_get_child_nodes(xmlnode *, IXMLDOMNodeList **)
Definition: node.c:353

◆ domelem_get_dataType()

static HRESULT WINAPI domelem_get_dataType ( IXMLDOMElement iface,
VARIANT typename 
)
static

Definition at line 942 of file element.c.

945{
947 XDR_DT dt;
948
949 TRACE("(%p)->(%p)\n", This, typename);
950
951 if (!typename)
952 return E_INVALIDARG;
953
955 switch (dt)
956 {
957 case DT_BIN_BASE64:
958 case DT_BIN_HEX:
959 case DT_BOOLEAN:
960 case DT_CHAR:
961 case DT_DATE:
962 case DT_DATE_TZ:
963 case DT_DATETIME:
964 case DT_DATETIME_TZ:
965 case DT_FIXED_14_4:
966 case DT_FLOAT:
967 case DT_I1:
968 case DT_I2:
969 case DT_I4:
970 case DT_I8:
971 case DT_INT:
972 case DT_NUMBER:
973 case DT_R4:
974 case DT_R8:
975 case DT_TIME:
976 case DT_TIME_TZ:
977 case DT_UI1:
978 case DT_UI2:
979 case DT_UI4:
980 case DT_UI8:
981 case DT_URI:
982 case DT_UUID:
983 V_VT(typename) = VT_BSTR;
984 V_BSTR(typename) = SysAllocString(dt_to_bstr(dt));
985
986 if (!V_BSTR(typename))
987 return E_OUTOFMEMORY;
988 break;
989 default:
990 /* Other types (DTD equivalents) do not return anything here,
991 * but the pointer part of the VARIANT is set to NULL */
992 V_VT(typename) = VT_NULL;
993 V_BSTR(typename) = NULL;
994 break;
995 }
996 return (V_VT(typename) != VT_NULL) ? S_OK : S_FALSE;
997}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
@ VT_BSTR
Definition: compat.h:2303
@ VT_NULL
Definition: compat.h:2296
static xmlNodePtr get_element(const domelem *This)
Definition: element.c:63
static XDR_DT element_get_dt(xmlNodePtr node)
Definition: element.c:676
enum _XDR_DT XDR_DT
@ DT_I4
Definition: msxml_private.h:57
@ DT_TIME_TZ
Definition: msxml_private.h:71
@ DT_NUMBER
Definition: msxml_private.h:66
@ DT_FIXED_14_4
Definition: msxml_private.h:53
@ DT_URI
Definition: msxml_private.h:76
@ DT_DATE_TZ
Definition: msxml_private.h:47
@ DT_UI4
Definition: msxml_private.h:74
@ DT_R8
Definition: msxml_private.h:68
@ DT_DATETIME_TZ
Definition: msxml_private.h:49
@ DT_FLOAT
Definition: msxml_private.h:54
@ DT_DATETIME
Definition: msxml_private.h:48
@ DT_BIN_HEX
Definition: msxml_private.h:43
@ DT_I1
Definition: msxml_private.h:55
@ DT_UI8
Definition: msxml_private.h:75
@ DT_DATE
Definition: msxml_private.h:46
@ DT_UI2
Definition: msxml_private.h:73
@ DT_BIN_BASE64
Definition: msxml_private.h:42
@ DT_I2
Definition: msxml_private.h:56
@ DT_R4
Definition: msxml_private.h:67
@ DT_UI1
Definition: msxml_private.h:72
@ DT_BOOLEAN
Definition: msxml_private.h:44
@ DT_CHAR
Definition: msxml_private.h:45
@ DT_TIME
Definition: msxml_private.h:70
@ DT_I8
Definition: msxml_private.h:58
@ DT_INT
Definition: msxml_private.h:62
@ DT_UUID
Definition: msxml_private.h:77
OLECHAR const * dt_to_bstr(XDR_DT dt)
Definition: schema.c:577
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define S_FALSE
Definition: winerror.h:3451

◆ domelem_get_definition()

static HRESULT WINAPI domelem_get_definition ( IXMLDOMElement iface,
IXMLDOMNode **  definitionNode 
)
static

Definition at line 422 of file element.c.

425{
427 FIXME("(%p)->(%p)\n", This, definitionNode);
428 return E_NOTIMPL;
429}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ domelem_get_firstChild()

static HRESULT WINAPI domelem_get_firstChild ( IXMLDOMElement iface,
IXMLDOMNode **  domNode 
)
static

Definition at line 238 of file element.c.

241{
243
244 TRACE("(%p)->(%p)\n", This, domNode);
245
246 return node_get_first_child(&This->node, domNode);
247}
HRESULT node_get_first_child(xmlnode *, IXMLDOMNode **)
Definition: node.c:365

◆ domelem_get_item()

static HRESULT domelem_get_item ( const xmlNodePtr  node,
LONG  index,
IXMLDOMNode **  item 
)
static

Definition at line 1792 of file element.c.

1793{
1794 xmlNsPtr ns, xmlns;
1795 xmlAttrPtr curr;
1796 LONG attrIndex;
1797 IUnknown *unk;
1798 HRESULT hr;
1799
1800 TRACE("%p, %ld, %p.\n", node, index, item);
1801
1802 *item = NULL;
1803
1804 if (index < 0)
1805 return S_FALSE;
1806
1807 attrIndex = 0;
1808 curr = node->properties;
1809 if (curr) {
1810 for (; attrIndex < index && curr->next != NULL; attrIndex++)
1811 curr = curr->next;
1812
1813 if (attrIndex == index) {
1814 *item = create_node( (xmlNodePtr) curr );
1815 return S_OK;
1816 }
1817 }
1818
1819 if (!node->nsDef)
1820 return S_FALSE;
1821
1822 ns = node->nsDef;
1823 while (attrIndex < index)
1824 {
1825 attrIndex++;
1826
1827 if (!ns->next)
1828 break;
1829
1830 ns = ns->next;
1831 }
1832
1833 if (attrIndex < index)
1834 return S_FALSE;
1835
1836 if (!ns->prefix) {
1837 xmlns = NULL;
1838 curr = xmlNewProp(NULL, BAD_CAST "xmlns", ns->href);
1839 } else {
1840 xmlns = xmlNewNs(NULL, BAD_CAST "http://www.w3.org/2000/xmlns/", BAD_CAST "xmlns");
1841 if (!xmlns)
1842 return E_OUTOFMEMORY;
1843
1844 curr = xmlNewNsProp(NULL, xmlns, ns->prefix, ns->href);
1845 }
1846 if (!curr) {
1847 xmlFreeNs(xmlns);
1848 return E_OUTOFMEMORY;
1849 }
1850 curr->doc = node->doc;
1851
1852 unk = create_attribute((xmlNodePtr)curr, TRUE);
1853 if (!unk) {
1854 xmlFreeNs(xmlns);
1855 xmlFreeProp(curr);
1856 return E_OUTOFMEMORY;
1857 }
1858
1859 hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMNode, (void**)item);
1860 IUnknown_Release(unk);
1861
1862 return hr;
1863}
#define TRUE
Definition: types.h:120
static const xmlChar xmlns[]
Definition: attribute.c:40
IUnknown * create_attribute(xmlNodePtr attribute, BOOL floating)
Definition: attribute.c:730
GLuint index
Definition: glext.h:6031
static HRESULT create_node(HTMLDocumentNode *, nsIDOMNode *, HTMLDOMNode **)
Definition: htmlnode.c:1216
if(dx< 0)
Definition: linetemp.h:194
HRESULT hr
Definition: shlfolder.c:183
Definition: mxnamespace.c:38
BSTR prefix
Definition: mxnamespace.c:39
Definition: dlist.c:348
void * next
Definition: dlist.c:360
#define BAD_CAST
Definition: xmlstring.h:35

◆ domelem_get_lastChild()

static HRESULT WINAPI domelem_get_lastChild ( IXMLDOMElement iface,
IXMLDOMNode **  domNode 
)
static

Definition at line 249 of file element.c.

252{
254
255 TRACE("(%p)->(%p)\n", This, domNode);
256
257 return node_get_last_child(&This->node, domNode);
258}
HRESULT node_get_last_child(xmlnode *, IXMLDOMNode **)
Definition: node.c:370

◆ domelem_get_length()

static HRESULT domelem_get_length ( const xmlNodePtr  node,
LONG length 
)
static

Definition at line 1865 of file element.c.

1866{
1867 xmlAttrPtr curr;
1868 LONG attrCount;
1869 xmlNsPtr ns;
1870
1871 TRACE("(%p)->(%p)\n", node, length);
1872
1873 if( !length )
1874 return E_INVALIDARG;
1875
1876 attrCount = 0;
1877 curr = node->properties;
1878 while (curr) {
1879 attrCount++;
1880 curr = curr->next;
1881 }
1882
1883 ns = node->nsDef;
1884 while (ns) {
1885 attrCount++;
1886 ns = ns->next;
1887 }
1888 *length = attrCount;
1889
1890 return S_OK;
1891}
GLuint GLsizei GLsizei * length
Definition: glext.h:6040

◆ domelem_get_named_item()

static HRESULT domelem_get_named_item ( const xmlNodePtr  node,
BSTR  name,
IXMLDOMNode **  item 
)
static

Definition at line 1629 of file element.c.

1630{
1631 xmlChar *nameA, *local, *prefix;
1632 BSTR uriW, localW;
1633 xmlNsPtr ns;
1634 HRESULT hr;
1635
1636 TRACE("(%p)->(%s %p)\n", node, debugstr_w(name), item );
1637
1638 nameA = xmlchar_from_wchar(name);
1639 local = xmlSplitQName2(nameA, &prefix);
1640 free(nameA);
1641
1642 if (!local)
1644
1645 /* try to get namespace uri for supplied qualified name */
1646 ns = xmlSearchNs(node->doc, node, prefix);
1647
1648 xmlFree(prefix);
1649
1650 if (!ns)
1651 {
1652 xmlFree(local);
1653 if (item) *item = NULL;
1654 return item ? S_FALSE : E_INVALIDARG;
1655 }
1656
1657 uriW = bstr_from_xmlChar(ns->href);
1658 localW = bstr_from_xmlChar(local);
1659 xmlFree(local);
1660
1661 TRACE("got qualified node %s, uri=%s\n", debugstr_w(localW), debugstr_w(uriW));
1662
1663 hr = domelem_get_qualified_item(node, localW, uriW, item);
1664
1665 SysFreeString(localW);
1666 SysFreeString(uriW);
1667
1668 return hr;
1669}
#define free
Definition: debug_ros.c:5
OLECHAR * BSTR
Definition: compat.h:2293
static HRESULT domelem_get_qualified_item(const xmlNodePtr node, BSTR name, BSTR uri, IXMLDOMNode **item)
Definition: element.c:1587
#define local
Definition: zutil.h:30
#define debugstr_w
Definition: kernel32.h:32
static BSTR bstr_from_xmlChar(const xmlChar *str)
static xmlChar * xmlchar_from_wchar(const WCHAR *str)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
xmlFreeFunc xmlFree
Definition: globals.c:184
Character const *const prefix
Definition: tempnam.cpp:195
unsigned char xmlChar
Definition: xmlstring.h:28

◆ domelem_get_namespaceURI()

static HRESULT WINAPI domelem_get_namespaceURI ( IXMLDOMElement iface,
BSTR p 
)
static

Definition at line 1139 of file element.c.

1142{
1144 TRACE("(%p)->(%p)\n", This, p);
1145 return node_get_namespaceURI(&This->node, p);
1146}
GLfloat GLfloat p
Definition: glext.h:8902
HRESULT node_get_namespaceURI(xmlnode *, BSTR *)
Definition: node.c:1589

◆ domelem_get_nextSibling()

static HRESULT WINAPI domelem_get_nextSibling ( IXMLDOMElement iface,
IXMLDOMNode **  domNode 
)
static

Definition at line 271 of file element.c.

274{
276
277 TRACE("(%p)->(%p)\n", This, domNode);
278
279 return node_get_next_sibling(&This->node, domNode);
280}
HRESULT node_get_next_sibling(xmlnode *, IXMLDOMNode **)
Definition: node.c:380

◆ domelem_get_nodeName()

static HRESULT WINAPI domelem_get_nodeName ( IXMLDOMElement iface,
BSTR p 
)
static

Definition at line 168 of file element.c.

171{
173
174 TRACE("(%p)->(%p)\n", This, p);
175
176 return node_get_nodeName(&This->node, p);
177}
HRESULT node_get_nodeName(xmlnode *, BSTR *)
Definition: node.c:178

◆ domelem_get_nodeType()

static HRESULT WINAPI domelem_get_nodeType ( IXMLDOMElement iface,
DOMNodeType domNodeType 
)
static

Definition at line 204 of file element.c.

207{
209
210 TRACE("(%p)->(%p)\n", This, domNodeType);
211
212 *domNodeType = NODE_ELEMENT;
213 return S_OK;
214}
@ NODE_ELEMENT
Definition: msxml6.idl:113

◆ domelem_get_nodeTypedValue()

static HRESULT WINAPI domelem_get_nodeTypedValue ( IXMLDOMElement iface,
VARIANT v 
)
static

Definition at line 722 of file element.c.

725{
727 XDR_DT dt;
729 HRESULT hr;
730
731 TRACE("(%p)->(%p)\n", This, v);
732
733 if(!v) return E_INVALIDARG;
734
735 V_VT(v) = VT_NULL;
736
738
739 if (dt == DT_INVALID)
740 {
741 if (SUCCEEDED(hr = node_get_text(&This->node, &V_BSTR(v))))
742 V_VT(v) = VT_BSTR;
743 return hr;
744 }
745 content = xmlNodeGetContent(get_element(This));
746 hr = variant_from_dt(dt, content, v);
748
749 return hr;
750}
content
Definition: atl_ax.c:994
static HRESULT variant_from_dt(XDR_DT dt, xmlChar *str, VARIANT *v)
Definition: element.c:447
const GLdouble * v
Definition: gl.h:2040
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT node_get_text(const xmlnode *, BSTR *)
Definition: node.c:842
@ DT_INVALID
Definition: msxml_private.h:41

◆ domelem_get_nodeTypeString()

static HRESULT WINAPI domelem_get_nodeTypeString ( IXMLDOMElement iface,
BSTR p 
)
static

Definition at line 382 of file element.c.

385{
387 static const WCHAR elementW[] = {'e','l','e','m','e','n','t',0};
388
389 TRACE("(%p)->(%p)\n", This, p);
390
391 return return_bstr(elementW, p);
392}
static HRESULT return_bstr(const WCHAR *value, BSTR *p)
Definition: msxml_dispex.h:115
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ domelem_get_nodeValue()

static HRESULT WINAPI domelem_get_nodeValue ( IXMLDOMElement iface,
VARIANT value 
)
static

Definition at line 179 of file element.c.

182{
184
185 TRACE("(%p)->(%p)\n", This, value);
186
187 if(!value)
188 return E_INVALIDARG;
189
190 V_VT(value) = VT_NULL;
191 V_BSTR(value) = NULL; /* tests show that we should do this */
192 return S_FALSE;
193}
Definition: pdh_main.c:96

◆ domelem_get_ownerDocument()

static HRESULT WINAPI domelem_get_ownerDocument ( IXMLDOMElement iface,
IXMLDOMDocument **  doc 
)
static

Definition at line 364 of file element.c.

367{
369 TRACE("(%p)->(%p)\n", This, doc);
370 return node_get_owner_doc(&This->node, doc);
371}
HRESULT node_get_owner_doc(const xmlnode *, IXMLDOMDocument **)
Definition: node.c:672

◆ domelem_get_parentNode()

static HRESULT WINAPI domelem_get_parentNode ( IXMLDOMElement iface,
IXMLDOMNode **  parent 
)
static

Definition at line 216 of file element.c.

219{
221
222 TRACE("(%p)->(%p)\n", This, parent);
223
224 return node_get_parent(&This->node, parent);
225}
r parent
Definition: btrfs.c:3010
HRESULT node_get_parent(xmlnode *, IXMLDOMNode **)
Definition: node.c:348

◆ domelem_get_parsed()

static HRESULT WINAPI domelem_get_parsed ( IXMLDOMElement iface,
VARIANT_BOOL isParsed 
)
static

Definition at line 1129 of file element.c.

1132{
1134 FIXME("(%p)->(%p) stub!\n", This, isParsed);
1135 *isParsed = VARIANT_TRUE;
1136 return S_OK;
1137}

◆ domelem_get_prefix()

static HRESULT WINAPI domelem_get_prefix ( IXMLDOMElement iface,
BSTR prefix 
)
static

Definition at line 1148 of file element.c.

1151{
1153 TRACE("(%p)->(%p)\n", This, prefix);
1154 return node_get_prefix( &This->node, prefix );
1155}
HRESULT node_get_prefix(xmlnode *, BSTR *)
Definition: node.c:1606

◆ domelem_get_previousSibling()

static HRESULT WINAPI domelem_get_previousSibling ( IXMLDOMElement iface,
IXMLDOMNode **  domNode 
)
static

Definition at line 260 of file element.c.

263{
265
266 TRACE("(%p)->(%p)\n", This, domNode);
267
268 return node_get_previous_sibling(&This->node, domNode);
269}
HRESULT node_get_previous_sibling(xmlnode *, IXMLDOMNode **)
Definition: node.c:375

◆ domelem_get_qualified_item()

static HRESULT domelem_get_qualified_item ( const xmlNodePtr  node,
BSTR  name,
BSTR  uri,
IXMLDOMNode **  item 
)
static

Definition at line 1587 of file element.c.

1589{
1590 xmlAttrPtr attr;
1591 xmlChar *nameA;
1592 xmlChar *href;
1593
1594 TRACE("(%p)->(%s %s %p)\n", node, debugstr_w(name), debugstr_w(uri), item);
1595
1596 if (!name || !item) return E_INVALIDARG;
1597
1598 if (uri && *uri)
1599 {
1600 href = xmlchar_from_wchar(uri);
1601 if (!href) return E_OUTOFMEMORY;
1602 }
1603 else
1604 href = NULL;
1605
1606 nameA = xmlchar_from_wchar(name);
1607 if (!nameA)
1608 {
1609 free(href);
1610 return E_OUTOFMEMORY;
1611 }
1612
1613 attr = xmlHasNsProp(node, nameA, href);
1614
1615 free(nameA);
1616 free(href);
1617
1618 if (!attr)
1619 {
1620 *item = NULL;
1621 return S_FALSE;
1622 }
1623
1624 *item = create_node((xmlNodePtr)attr);
1625
1626 return S_OK;
1627}
const char * uri
Definition: sec_mgr.c:1588
Definition: cookie.c:202

Referenced by domelem_get_named_item().

◆ domelem_get_specified()

static HRESULT WINAPI domelem_get_specified ( IXMLDOMElement iface,
VARIANT_BOOL isSpecified 
)
static

Definition at line 412 of file element.c.

415{
417 FIXME("(%p)->(%p) stub!\n", This, isSpecified);
418 *isSpecified = VARIANT_TRUE;
419 return S_OK;
420}

◆ domelem_get_tagName()

static HRESULT WINAPI domelem_get_tagName ( IXMLDOMElement iface,
BSTR p 
)
static

Definition at line 1175 of file element.c.

1178{
1180 xmlNodePtr element;
1181 const xmlChar *prefix;
1182 xmlChar *qname;
1183
1184 TRACE("(%p)->(%p)\n", This, p );
1185
1186 if (!p) return E_INVALIDARG;
1187
1189 if ( !element )
1190 return E_FAIL;
1191
1192 prefix = element->ns ? element->ns->prefix : NULL;
1193 qname = xmlBuildQName(element->name, prefix, NULL, 0);
1194
1195 *p = bstr_from_xmlChar(qname);
1196 if (qname != element->name) xmlFree(qname);
1197
1198 return *p ? S_OK : E_OUTOFMEMORY;
1199}
#define E_FAIL
Definition: ddrawi.h:102
struct list ns
Definition: writer.c:91

◆ domelem_get_text()

static HRESULT WINAPI domelem_get_text ( IXMLDOMElement iface,
BSTR p 
)
static

Definition at line 394 of file element.c.

397{
399 TRACE("(%p)->(%p)\n", This, p);
400 return node_get_text(&This->node, p);
401}

◆ domelem_get_xml()

static HRESULT WINAPI domelem_get_xml ( IXMLDOMElement iface,
BSTR p 
)
static

Definition at line 1091 of file element.c.

1094{
1096
1097 TRACE("(%p)->(%p)\n", This, p);
1098
1099 return node_get_xml(&This->node, TRUE, p);
1100}
HRESULT node_get_xml(xmlnode *, BOOL, BSTR *)
Definition: node.c:936

◆ domelem_getAttribute()

static HRESULT WINAPI domelem_getAttribute ( IXMLDOMElement iface,
BSTR  name,
VARIANT value 
)
static

Definition at line 1201 of file element.c.

1204{
1206 xmlNodePtr element;
1207 xmlChar *xml_name, *xml_value = NULL;
1208 xmlChar *local, *prefix;
1209 HRESULT hr = S_FALSE;
1210 xmlNsPtr ns;
1211
1212 TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), value);
1213
1214 if(!value || !name)
1215 return E_INVALIDARG;
1216
1218 if ( !element )
1219 return E_FAIL;
1220
1221 V_BSTR(value) = NULL;
1222 V_VT(value) = VT_NULL;
1223
1224 xml_name = xmlchar_from_wchar( name );
1225
1226 if(!xmlValidateNameValue(xml_name))
1227 hr = E_FAIL;
1228 else
1229 {
1230 if ((local = xmlSplitQName2(xml_name, &prefix)))
1231 {
1232 if (xmlStrEqual(prefix, BAD_CAST "xmlns"))
1233 {
1234 ns = xmlSearchNs(element->doc, element, local);
1235 if (ns)
1236 xml_value = xmlStrdup(ns->href);
1237 }
1238 else
1239 {
1240 ns = xmlSearchNs(element->doc, element, prefix);
1241 if (ns)
1242 xml_value = xmlGetNsProp(element, local, ns->href);
1243 }
1244
1245 xmlFree(prefix);
1246 xmlFree(local);
1247 }
1248 else
1249 xml_value = xmlGetNsProp(element, xml_name, NULL);
1250 }
1251
1252 free(xml_name);
1253 if(xml_value)
1254 {
1255 V_VT(value) = VT_BSTR;
1256 V_BSTR(value) = bstr_from_xmlChar( xml_value );
1257 xmlFree(xml_value);
1258 hr = S_OK;
1259 }
1260
1261 return hr;
1262}
XMLPUBFUN int xmlStrEqual(const xmlChar *str1, const xmlChar *str2)
Definition: xmlstring.c:162
XMLPUBFUN xmlChar * xmlStrdup(const xmlChar *cur)
Definition: xmlstring.c:69

◆ domelem_getAttributeNode()

static HRESULT WINAPI domelem_getAttributeNode ( IXMLDOMElement iface,
BSTR  p,
IXMLDOMAttribute **  attributeNode 
)
static

Definition at line 1348 of file element.c.

1351{
1353 xmlChar *local, *prefix, *nameA;
1354 HRESULT hr = S_FALSE;
1355 xmlNodePtr element;
1356 xmlAttrPtr attr;
1357
1358 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), attributeNode);
1359
1361 if (!element) return E_FAIL;
1362
1363 if (attributeNode) *attributeNode = NULL;
1364
1365 nameA = xmlchar_from_wchar(p);
1366 if (!xmlValidateNameValue(nameA))
1367 {
1368 free(nameA);
1369 return E_FAIL;
1370 }
1371
1372 if (!attributeNode)
1373 {
1374 free(nameA);
1375 return S_FALSE;
1376 }
1377
1378 *attributeNode = NULL;
1379
1380 local = xmlSplitQName2(nameA, &prefix);
1381
1382 if (local)
1383 {
1384 /* try to get namespace for supplied qualified name */
1385 xmlNsPtr ns = xmlSearchNs(element->doc, element, prefix);
1386 xmlFree(prefix);
1387
1388 attr = xmlHasNsProp(element, local, ns ? ns->href : NULL);
1389 xmlFree(local);
1390 }
1391 else
1392 {
1393 attr = xmlHasProp(element, nameA);
1394 /* attribute has attached namespace and we requested non-qualified
1395 name - it's a failure case */
1396 if (attr && attr->ns) attr = NULL;
1397 }
1398
1399 free(nameA);
1400
1401 if (attr)
1402 {
1403 IUnknown *unk = create_attribute((xmlNodePtr)attr, FALSE);
1404 hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMAttribute, (void**)attributeNode);
1405 IUnknown_Release(unk);
1406 }
1407
1408 return hr;
1409}
#define FALSE
Definition: types.h:117

◆ domelem_getElementsByTagName()

static HRESULT WINAPI domelem_getElementsByTagName ( IXMLDOMElement iface,
BSTR  tagName,
IXMLDOMNodeList **  resultList 
)
static

Definition at line 1500 of file element.c.

1503{
1505 xmlChar *query;
1506 HRESULT hr;
1507 BOOL XPath;
1508
1509 TRACE("(%p)->(%s, %p)\n", This, debugstr_w(tagName), resultList);
1510
1511 if (!tagName || !resultList) return E_INVALIDARG;
1512
1513 XPath = is_xpathmode(get_element(This)->doc);
1515 query = tagName_to_XPath(tagName);
1516 hr = create_selection(get_element(This), query, resultList);
1517 xmlFree(query);
1518 set_xpathmode(get_element(This)->doc, XPath);
1519
1520 return hr;
1521}
void set_xpathmode(xmlDocPtr doc, BOOL xpath)
Definition: domdoc.c:230
xmlChar * tagName_to_XPath(const BSTR tagName)
Definition: domdoc.c:1955
BOOL is_xpathmode(const xmlDocPtr doc)
Definition: domdoc.c:225
unsigned int BOOL
Definition: ntddk_ex.h:94
HRESULT create_selection(xmlNodePtr, xmlChar *, IXMLDOMNodeList **)
Definition: selection.c:764

◆ domelem_GetIDsOfNames()

static HRESULT WINAPI domelem_GetIDsOfNames ( IXMLDOMElement iface,
REFIID  riid,
LPOLESTR rgszNames,
UINT  cNames,
LCID  lcid,
DISPID rgDispId 
)
static

Definition at line 147 of file element.c.

151{
153 return IDispatchEx_GetIDsOfNames(&This->node.dispex.IDispatchEx_iface,
154 riid, rgszNames, cNames, lcid, rgDispId);
155}
LCID lcid
Definition: locale.c:5656
REFIID riid
Definition: atlbase.h:39

◆ domelem_GetTypeInfo()

static HRESULT WINAPI domelem_GetTypeInfo ( IXMLDOMElement iface,
UINT  iTInfo,
LCID  lcid,
ITypeInfo **  ppTInfo 
)
static

Definition at line 137 of file element.c.

141{
143 return IDispatchEx_GetTypeInfo(&This->node.dispex.IDispatchEx_iface,
144 iTInfo, lcid, ppTInfo);
145}

◆ domelem_GetTypeInfoCount()

static HRESULT WINAPI domelem_GetTypeInfoCount ( IXMLDOMElement iface,
UINT pctinfo 
)
static

Definition at line 129 of file element.c.

132{
134 return IDispatchEx_GetTypeInfoCount(&This->node.dispex.IDispatchEx_iface, pctinfo);
135}

◆ domelem_hasChildNodes()

static HRESULT WINAPI domelem_hasChildNodes ( IXMLDOMElement iface,
VARIANT_BOOL ret 
)
static

Definition at line 355 of file element.c.

358{
360 TRACE("(%p)->(%p)\n", This, ret);
361 return node_has_childnodes(&This->node, ret);
362}
return ret
Definition: mutex.c:146
HRESULT node_has_childnodes(const xmlnode *, VARIANT_BOOL *)
Definition: node.c:658

◆ domelem_insertBefore()

static HRESULT WINAPI domelem_insertBefore ( IXMLDOMElement iface,
IXMLDOMNode newNode,
VARIANT  refChild,
IXMLDOMNode **  old_node 
)
static

Definition at line 294 of file element.c.

298{
301 HRESULT hr;
302
303 TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), old_node);
304
305 if (!newNode) return E_INVALIDARG;
306
307 hr = IXMLDOMNode_get_nodeType(newNode, &type);
308 if (hr != S_OK) return hr;
309
310 TRACE("new node type %d\n", type);
311 switch (type)
312 {
313 case NODE_DOCUMENT:
315 case NODE_ENTITY:
316 case NODE_NOTATION:
317 if (old_node) *old_node = NULL;
318 return E_FAIL;
319 default:
320 return node_insert_before(&This->node, newNode, &refChild, old_node);
321 }
322}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
static const char * debugstr_variant(const VARIANT *var)
Definition: container.c:46
enum tagDOMNodeType DOMNodeType
@ NODE_DOCUMENT_TYPE
Definition: msxml6.idl:122
@ NODE_ENTITY
Definition: msxml6.idl:118
@ NODE_DOCUMENT
Definition: msxml6.idl:121
@ NODE_NOTATION
Definition: msxml6.idl:124
HRESULT node_insert_before(xmlnode *, IXMLDOMNode *, const VARIANT *, IXMLDOMNode **)
Definition: node.c:432

◆ domelem_Invoke()

static HRESULT WINAPI domelem_Invoke ( IXMLDOMElement iface,
DISPID  dispIdMember,
REFIID  riid,
LCID  lcid,
WORD  wFlags,
DISPPARAMS *  pDispParams,
VARIANT pVarResult,
EXCEPINFO *  pExcepInfo,
UINT puArgErr 
)
static

Definition at line 157 of file element.c.

162{
164 return IDispatchEx_Invoke(&This->node.dispex.IDispatchEx_iface,
165 dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
166}
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337

◆ domelem_next_node()

static HRESULT domelem_next_node ( const xmlNodePtr  node,
LONG iter,
IXMLDOMNode **  nextNode 
)
static

Definition at line 1893 of file element.c.

1894{
1895 xmlAttrPtr curr;
1896 LONG i;
1897
1898 TRACE("%p, %ld, %p.\n", node, *iter, nextNode);
1899
1900 *nextNode = NULL;
1901
1902 curr = node->properties;
1903 if (curr == NULL)
1904 return S_FALSE;
1905
1906 for (i = 0; i < *iter; i++) {
1907 if (curr->next == NULL)
1908 return S_FALSE;
1909 else
1910 curr = curr->next;
1911 }
1912
1913 (*iter)++;
1914 *nextNode = create_node((xmlNodePtr)curr);
1915
1916 return S_OK;
1917}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
struct define * next
Definition: compiler.c:65

◆ domelem_normalize()

static HRESULT WINAPI domelem_normalize ( IXMLDOMElement iface)
static

Definition at line 1523 of file element.c.

1525{
1527 FIXME("%p\n", This);
1528 return E_NOTIMPL;
1529}

◆ domelem_put_dataType()

static HRESULT WINAPI domelem_put_dataType ( IXMLDOMElement iface,
BSTR  dtName 
)
static

Definition at line 999 of file element.c.

1002{
1004 HRESULT hr = E_FAIL;
1005 xmlChar *str;
1006 XDR_DT dt;
1007
1008 TRACE("(%p)->(%s)\n", This, debugstr_w(dtName));
1009
1010 if(dtName == NULL)
1011 return E_INVALIDARG;
1012
1013 dt = bstr_to_dt(dtName, -1);
1014
1015 /* An example of this is. The Text in the node needs to be a 0 or 1 for a boolean type.
1016 This applies to changing types (string->bool) or setting a new one
1017 */
1018 str = xmlNodeGetContent(get_element(This));
1019 hr = dt_validate(dt, str);
1020 xmlFree(str);
1021
1022 /* Check all supported types. */
1023 if (hr == S_OK)
1024 {
1025 switch (dt)
1026 {
1027 case DT_BIN_BASE64:
1028 case DT_BIN_HEX:
1029 case DT_BOOLEAN:
1030 case DT_CHAR:
1031 case DT_DATE:
1032 case DT_DATE_TZ:
1033 case DT_DATETIME:
1034 case DT_DATETIME_TZ:
1035 case DT_FIXED_14_4:
1036 case DT_FLOAT:
1037 case DT_I1:
1038 case DT_I2:
1039 case DT_I4:
1040 case DT_I8:
1041 case DT_INT:
1042 case DT_NMTOKEN:
1043 case DT_NMTOKENS:
1044 case DT_NUMBER:
1045 case DT_R4:
1046 case DT_R8:
1047 case DT_STRING:
1048 case DT_TIME:
1049 case DT_TIME_TZ:
1050 case DT_UI1:
1051 case DT_UI2:
1052 case DT_UI4:
1053 case DT_UI8:
1054 case DT_URI:
1055 case DT_UUID:
1056 {
1057 xmlAttrPtr attr = xmlHasNsProp(get_element(This), DT_prefix, DT_nsURI);
1058 if (attr)
1059 {
1060 attr = xmlSetNsProp(get_element(This), attr->ns, DT_prefix, dt_to_str(dt));
1061 hr = S_OK;
1062 }
1063 else
1064 {
1065 xmlNsPtr ns = xmlNewNs(get_element(This), DT_nsURI, DT_prefix);
1066 if (ns)
1067 {
1068 attr = xmlNewNsProp(get_element(This), ns, DT_prefix, dt_to_str(dt));
1069 if (attr)
1070 {
1071 xmlAddChild(get_element(This), (xmlNodePtr)attr);
1072 hr = S_OK;
1073 }
1074 else
1075 ERR("Failed to create Attribute\n");
1076 }
1077 else
1078 ERR("Failed to create Namespace\n");
1079 }
1080 }
1081 break;
1082 default:
1083 FIXME("need to handle dt:%s\n", debugstr_dt(dt));
1084 break;
1085 }
1086 }
1087
1088 return hr;
1089}
#define ERR(fmt,...)
Definition: precomp.h:57
#define DT_STRING
Definition: datetime.c:117
static const xmlChar DT_prefix[]
Definition: element.c:40
static const xmlChar DT_nsURI[]
Definition: element.c:41
XDR_DT bstr_to_dt(OLECHAR const *bstr, int len)
Definition: schema.c:555
xmlChar const * dt_to_str(XDR_DT dt)
Definition: schema.c:569
HRESULT dt_validate(XDR_DT dt, xmlChar const *content)
Definition: schema.c:590
const char * debugstr_dt(XDR_DT dt)
Definition: schema.c:585
@ DT_NMTOKEN
Definition: msxml_private.h:63
@ DT_NMTOKENS
Definition: msxml_private.h:64
const WCHAR * str

◆ domelem_put_nodeTypedValue()

static HRESULT WINAPI domelem_put_nodeTypedValue ( IXMLDOMElement iface,
VARIANT  value 
)
static

Definition at line 836 of file element.c.

839{
841 XDR_DT dt;
842 HRESULT hr;
843
844 TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
845
847 switch (dt)
848 {
849 /* for untyped node coerce to BSTR and set */
850 case DT_INVALID:
851 case DT_INT:
852 if (V_VT(&value) != VT_BSTR)
853 {
857 if (hr == S_OK)
858 {
861 }
862 }
863 else
864 hr = node_set_content(&This->node, V_BSTR(&value));
865 break;
866 case DT_BIN_BASE64:
867 if (V_VT(&value) == VT_BSTR)
868 hr = node_set_content(&This->node, V_BSTR(&value));
869 else if (V_VT(&value) == (VT_UI1|VT_ARRAY))
870 {
872 LONG lbound, ubound;
873 BSTR encoded;
874 BYTE *ptr;
875 int len;
876
877 if (dim > 1)
878 FIXME("unexpected array dimension count %u\n", dim);
879
880 SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
881 SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
882
883 len = (ubound - lbound + 1)*SafeArrayGetElemsize(V_ARRAY(&value));
884
885 hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
886 if (FAILED(hr)) return hr;
887
888 hr = encode_base64(ptr, len, &encoded);
890 if (FAILED(hr)) return hr;
891
892 hr = node_set_content(&This->node, encoded);
893 SysFreeString(encoded);
894 }
895 else
896 {
897 FIXME("unhandled variant type %d for dt:%s\n", V_VT(&value), debugstr_dt(dt));
898 return E_NOTIMPL;
899 }
900 break;
901 case DT_BIN_HEX:
902 if (V_VT(&value) == (VT_UI1|VT_ARRAY))
903 {
905 LONG lbound, ubound;
906 BSTR encoded;
907 BYTE *ptr;
908 int len;
909
910 if (dim > 1)
911 FIXME("unexpected array dimension count %u\n", dim);
912
913 SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
914 SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
915
916 len = (ubound - lbound + 1)*SafeArrayGetElemsize(V_ARRAY(&value));
917
918 hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
919 if (FAILED(hr)) return hr;
920
921 hr = encode_binhex(ptr, len, &encoded);
923 if (FAILED(hr)) return hr;
924
925 hr = node_set_content(&This->node, encoded);
926 SysFreeString(encoded);
927 }
928 else
929 {
930 FIXME("unhandled variant type %d for dt:%s\n", V_VT(&value), debugstr_dt(dt));
931 return E_NOTIMPL;
932 }
933 break;
934 default:
935 FIXME("not implemented for dt:%s\n", debugstr_dt(dt));
936 return E_NOTIMPL;
937 }
938
939 return hr;
940}
@ VT_ARRAY
Definition: compat.h:2341
@ VT_UI1
Definition: compat.h:2311
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1033
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1137
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1168
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
Definition: safearray.c:1094
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1066
UINT WINAPI SafeArrayGetElemsize(SAFEARRAY *psa)
Definition: safearray.c:1114
static HRESULT encode_base64(const BYTE *buf, int len, BSTR *ret)
Definition: element.c:752
static HRESULT encode_binhex(const BYTE *buf, int len, BSTR *ret)
Definition: element.c:819
GLenum GLsizei len
Definition: glext.h:6722
#define FAILED(hr)
Definition: intsafe.h:51
static PVOID ptr
Definition: dispmode.c:27
HRESULT node_set_content(xmlnode *, LPCWSTR)
Definition: node.c:241
unsigned int UINT
Definition: ndis.h:50
#define V_ARRAY(A)
Definition: oleauto.h:222
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:962
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
unsigned char BYTE
Definition: xxhash.c:193

◆ domelem_put_nodeValue()

static HRESULT WINAPI domelem_put_nodeValue ( IXMLDOMElement iface,
VARIANT  value 
)
static

Definition at line 195 of file element.c.

198{
200 TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
201 return E_FAIL;
202}

◆ domelem_put_text()

static HRESULT WINAPI domelem_put_text ( IXMLDOMElement iface,
BSTR  p 
)
static

Definition at line 403 of file element.c.

406{
408 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
409 return node_put_text( &This->node, p );
410}
HRESULT node_put_text(xmlnode *, BSTR)
Definition: node.c:867

◆ domelem_QueryInterface()

static HRESULT WINAPI domelem_QueryInterface ( IXMLDOMElement iface,
REFIID  riid,
void **  ppvObject 
)
static

Definition at line 68 of file element.c.

72{
74
75 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
76
77 if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) ||
78 IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
81 {
82 *ppvObject = &This->IXMLDOMElement_iface;
83 }
84 else if(node_query_interface(&This->node, riid, ppvObject))
85 {
86 return *ppvObject ? S_OK : E_NOINTERFACE;
87 }
88 else if(IsEqualGUID( riid, &IID_ISupportErrorInfo ))
89 {
91 }
92 else
93 {
94 TRACE("interface %s not implemented\n", debugstr_guid(riid));
95 *ppvObject = NULL;
96 return E_NOINTERFACE;
97 }
98
99 IUnknown_AddRef( (IUnknown*)*ppvObject );
100 return S_OK;
101}
const GUID IID_IUnknown
static const tid_t domelem_se_tids[]
Definition: element.c:52
#define debugstr_guid
Definition: kernel32.h:35
BOOL node_query_interface(xmlnode *, REFIID, void **)
Definition: node.c:66
HRESULT node_create_supporterrorinfo(const tid_t *, void **)
const GUID IID_IDispatch
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ domelem_Release()

static ULONG WINAPI domelem_Release ( IXMLDOMElement iface)
static

Definition at line 113 of file element.c.

114{
117
118 TRACE("%p, refcount %lu.\n", iface, ref);
119
120 if (!ref)
121 {
122 destroy_xmlnode(&element->node);
123 free(element);
124 }
125
126 return ref;
127}
#define InterlockedDecrement
Definition: armddk.h:52
void destroy_xmlnode(xmlnode *)
Definition: node.c:1638
uint32_t ULONG
Definition: typedefs.h:59

◆ domelem_remove_named_item()

static HRESULT domelem_remove_named_item ( xmlNodePtr  node,
BSTR  name,
IXMLDOMNode **  item 
)
static

Definition at line 1751 of file element.c.

1752{
1753 xmlChar *nameA, *local, *prefix;
1754 BSTR uriW, localW;
1755 xmlNsPtr ns;
1756 HRESULT hr;
1757
1758 TRACE("(%p)->(%s %p)\n", node, debugstr_w(name), item);
1759
1760 nameA = xmlchar_from_wchar(name);
1761 local = xmlSplitQName2(nameA, &prefix);
1762 free(nameA);
1763
1764 if (!local)
1766
1767 ns = xmlSearchNs(node->doc, node, prefix);
1768
1769 xmlFree(prefix);
1770
1771 if (!ns)
1772 {
1773 xmlFree(local);
1774 if (item) *item = NULL;
1775 return item ? S_FALSE : E_INVALIDARG;
1776 }
1777
1778 uriW = bstr_from_xmlChar(ns->href);
1779 localW = bstr_from_xmlChar(local);
1780 xmlFree(local);
1781
1782 TRACE("removing qualified node %s, uri=%s\n", debugstr_w(localW), debugstr_w(uriW));
1783
1784 hr = domelem_remove_qualified_item(node, localW, uriW, item);
1785
1786 SysFreeString(localW);
1787 SysFreeString(uriW);
1788
1789 return hr;
1790}
static HRESULT domelem_remove_qualified_item(xmlNodePtr node, BSTR name, BSTR uri, IXMLDOMNode **item)
Definition: element.c:1701

◆ domelem_remove_qualified_item()

static HRESULT domelem_remove_qualified_item ( xmlNodePtr  node,
BSTR  name,
BSTR  uri,
IXMLDOMNode **  item 
)
static

Definition at line 1701 of file element.c.

1702{
1703 xmlChar *nameA, *href;
1704 xmlAttrPtr attr;
1705
1706 TRACE("(%p)->(%s %s %p)\n", node, debugstr_w(name), debugstr_w(uri), item);
1707
1708 if (!name) return E_INVALIDARG;
1709
1710 if (uri && *uri)
1711 {
1712 href = xmlchar_from_wchar(uri);
1713 if (!href) return E_OUTOFMEMORY;
1714 }
1715 else
1716 href = NULL;
1717
1718 nameA = xmlchar_from_wchar(name);
1719 if (!nameA)
1720 {
1721 free(href);
1722 return E_OUTOFMEMORY;
1723 }
1724
1725 attr = xmlHasNsProp(node, nameA, href);
1726
1727 free(nameA);
1728 free(href);
1729
1730 if (!attr)
1731 {
1732 if (item) *item = NULL;
1733 return S_FALSE;
1734 }
1735
1736 if (item)
1737 {
1738 xmlUnlinkNode( (xmlNodePtr) attr );
1739 xmldoc_add_orphan( attr->doc, (xmlNodePtr) attr );
1740 *item = create_node( (xmlNodePtr) attr );
1741 }
1742 else
1743 {
1744 if (xmlRemoveProp(attr) == -1)
1745 ERR("xmlRemoveProp failed\n");
1746 }
1747
1748 return S_OK;
1749}
HRESULT xmldoc_add_orphan(xmlDocPtr doc, xmlNodePtr node)
Definition: domdoc.c:658

Referenced by domelem_remove_named_item().

◆ domelem_removeAttribute()

static HRESULT WINAPI domelem_removeAttribute ( IXMLDOMElement iface,
BSTR  p 
)
static

Definition at line 1329 of file element.c.

1332{
1335 HRESULT hr;
1336
1337 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
1338
1339 hr = IXMLDOMElement_get_attributes(iface, &attr);
1340 if (hr != S_OK) return hr;
1341
1342 hr = IXMLDOMNamedNodeMap_removeNamedItem(attr, p, NULL);
1343 IXMLDOMNamedNodeMap_Release(attr);
1344
1345 return hr;
1346}

◆ domelem_removeAttributeNode()

static HRESULT WINAPI domelem_removeAttributeNode ( IXMLDOMElement iface,
IXMLDOMAttribute domAttribute,
IXMLDOMAttribute **  attributeNode 
)
static

Definition at line 1490 of file element.c.

1494{
1496 FIXME("(%p)->(%p %p)\n", This, domAttribute, attributeNode);
1497 return E_NOTIMPL;
1498}

◆ domelem_removeChild()

static HRESULT WINAPI domelem_removeChild ( IXMLDOMElement iface,
IXMLDOMNode child,
IXMLDOMNode **  oldChild 
)
static

Definition at line 337 of file element.c.

340{
342 TRACE("(%p)->(%p %p)\n", This, child, oldChild);
343 return node_remove_child(&This->node, child, oldChild);
344}
HRESULT node_remove_child(xmlnode *, IXMLDOMNode *, IXMLDOMNode **)
Definition: node.c:608

◆ domelem_replaceChild()

static HRESULT WINAPI domelem_replaceChild ( IXMLDOMElement iface,
IXMLDOMNode newNode,
IXMLDOMNode oldNode,
IXMLDOMNode **  outOldNode 
)
static

Definition at line 324 of file element.c.

329{
331
332 TRACE("(%p)->(%p %p %p)\n", This, newNode, oldNode, outOldNode);
333
334 return node_replace_child(&This->node, newNode, oldNode, outOldNode);
335}
HRESULT node_replace_child(xmlnode *, IXMLDOMNode *, IXMLDOMNode *, IXMLDOMNode **)
Definition: node.c:543

◆ domelem_selectNodes()

static HRESULT WINAPI domelem_selectNodes ( IXMLDOMElement iface,
BSTR  p,
IXMLDOMNodeList **  outList 
)
static

Definition at line 1111 of file element.c.

1114{
1116 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outList);
1117 return node_select_nodes(&This->node, p, outList);
1118}
HRESULT node_select_nodes(const xmlnode *, BSTR, IXMLDOMNodeList **)
Definition: node.c:1558

◆ domelem_selectSingleNode()

static HRESULT WINAPI domelem_selectSingleNode ( IXMLDOMElement iface,
BSTR  p,
IXMLDOMNode **  outNode 
)
static

Definition at line 1120 of file element.c.

1123{
1125 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outNode);
1126 return node_select_singlenode(&This->node, p, outNode);
1127}
HRESULT node_select_singlenode(const xmlnode *, BSTR, IXMLDOMNode **)
Definition: node.c:1572

◆ domelem_set_named_item()

static HRESULT domelem_set_named_item ( xmlNodePtr  node,
IXMLDOMNode newItem,
IXMLDOMNode **  namedItem 
)
static

Definition at line 1671 of file element.c.

1672{
1673 xmlNodePtr nodeNew;
1674 xmlnode *ThisNew;
1675
1676 TRACE("(%p)->(%p %p)\n", node, newItem, namedItem );
1677
1678 if(!newItem)
1679 return E_INVALIDARG;
1680
1681 if(namedItem) *namedItem = NULL;
1682
1683 /* Must be an Attribute */
1684 ThisNew = get_node_obj( newItem );
1685 if(!ThisNew) return E_FAIL;
1686
1687 if(ThisNew->node->type != XML_ATTRIBUTE_NODE)
1688 return E_FAIL;
1689
1690 if(!ThisNew->node->parent)
1691 if(xmldoc_remove_orphan(ThisNew->node->doc, ThisNew->node) != S_OK)
1692 WARN("%p is not an orphan of %p\n", ThisNew->node, ThisNew->node->doc);
1693
1694 nodeNew = xmlAddChild(node, ThisNew->node);
1695
1696 if(namedItem)
1697 *namedItem = create_node( nodeNew );
1698 return S_OK;
1699}
#define WARN(fmt,...)
Definition: precomp.h:61
HRESULT xmldoc_remove_orphan(xmlDocPtr doc, xmlNodePtr node)
Definition: domdoc.c:672
static HTMLDOMNode * get_node_obj(IHTMLDOMNode *)
Definition: htmlnode.c:1045
xmlNodePtr node

◆ domelem_setAttribute()

static HRESULT WINAPI domelem_setAttribute ( IXMLDOMElement iface,
BSTR  name,
VARIANT  value 
)
static

Definition at line 1264 of file element.c.

1267{
1269 xmlChar *xml_name, *xml_value, *local, *prefix;
1270 xmlNodePtr element;
1271 HRESULT hr = S_OK;
1272
1273 TRACE("(%p)->(%s %s)\n", This, debugstr_w(name), debugstr_variant(&value));
1274
1276 if ( !element )
1277 return E_FAIL;
1278
1279 if (V_VT(&value) != VT_BSTR)
1280 {
1281 VARIANT var;
1282
1283 VariantInit(&var);
1285 if (hr != S_OK)
1286 {
1287 FIXME("VariantChangeType failed\n");
1288 return hr;
1289 }
1290
1291 xml_value = xmlchar_from_wchar(V_BSTR(&var));
1292 VariantClear(&var);
1293 }
1294 else
1295 xml_value = xmlchar_from_wchar(V_BSTR(&value));
1296
1297 xml_name = xmlchar_from_wchar( name );
1298
1299 if ((local = xmlSplitQName2(xml_name, &prefix)))
1300 {
1301 static const xmlChar* xmlnsA = (const xmlChar*)"xmlns";
1302 xmlNsPtr ns = NULL;
1303
1304 /* it's not allowed to modify existing namespace definition */
1305 if (xmlStrEqual(prefix, xmlnsA))
1306 ns = xmlSearchNs(element->doc, element, local);
1307
1308 xmlFree(prefix);
1309 xmlFree(local);
1310
1311 if (ns)
1312 {
1313 int cmp = xmlStrEqual(ns->href, xml_value);
1314 free(xml_value);
1315 free(xml_name);
1316 return cmp ? S_OK : E_INVALIDARG;
1317 }
1318 }
1319
1320 if (!xmlSetNsProp(element, NULL, xml_name, xml_value))
1321 hr = E_FAIL;
1322
1323 free(xml_value);
1324 free(xml_name);
1325
1326 return hr;
1327}
const char * var
Definition: shader.c:5666
#define cmp(status, error)
Definition: error.c:114

◆ domelem_setAttributeNode()

static HRESULT WINAPI domelem_setAttributeNode ( IXMLDOMElement iface,
IXMLDOMAttribute attribute,
IXMLDOMAttribute **  old 
)
static

Definition at line 1411 of file element.c.

1415{
1417 static const WCHAR xmlnsW[] = {'x','m','l','n','s',0};
1418 xmlChar *name, *value;
1419 BSTR nameW, prefix;
1420 xmlnode *attr_node;
1421 xmlAttrPtr attr;
1423 HRESULT hr;
1424
1425 FIXME("(%p)->(%p %p): semi-stub\n", This, attribute, old);
1426
1427 if (!attribute) return E_INVALIDARG;
1428
1429 attr_node = get_node_obj((IXMLDOMNode*)attribute);
1430 if (!attr_node) return E_FAIL;
1431
1432 if (attr_node->parent)
1433 {
1434 WARN("attempt to add already used attribute\n");
1435 return E_FAIL;
1436 }
1437
1438 hr = IXMLDOMAttribute_get_nodeName(attribute, &nameW);
1439 if (hr != S_OK) return hr;
1440
1441 /* adding xmlns attribute doesn't change a tree or existing namespace definition */
1442 if (!wcscmp(nameW, xmlnsW))
1443 {
1445 return DISP_E_UNKNOWNNAME;
1446 }
1447
1448 hr = IXMLDOMAttribute_get_nodeValue(attribute, &valueW);
1449 if (hr != S_OK)
1450 {
1452 return hr;
1453 }
1454
1455 if (old) *old = NULL;
1456
1457 TRACE("attribute: %s=%s\n", debugstr_w(nameW), debugstr_w(V_BSTR(&valueW)));
1458
1459 hr = IXMLDOMAttribute_get_prefix(attribute, &prefix);
1460 if (hr == S_OK)
1461 {
1462 FIXME("namespaces not supported: %s\n", debugstr_w(prefix));
1464 }
1465
1468
1469 if (!name || !value)
1470 {
1473 free(name);
1474 free(value);
1475 return E_OUTOFMEMORY;
1476 }
1477
1478 attr = xmlSetNsProp(get_element(This), NULL, name, value);
1479 if (attr)
1480 attr_node->parent = (IXMLDOMNode*)iface;
1481
1484 free(name);
1485 free(value);
1486
1487 return attr ? S_OK : E_FAIL;
1488}
static const WCHAR nameW[]
Definition: main.c:49
static const WCHAR valueW[]
Definition: object.c:48
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1972
static WCHAR xmlnsW[]
Definition: reader.c:228
IXMLDOMNode * parent
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618

◆ domelem_transformNode()

static HRESULT WINAPI domelem_transformNode ( IXMLDOMElement iface,
IXMLDOMNode node,
BSTR p 
)
static

Definition at line 1102 of file element.c.

1105{
1107 TRACE("(%p)->(%p %p)\n", This, node, p);
1108 return node_transform_node(&This->node, node, p);
1109}
HRESULT node_transform_node(const xmlnode *, IXMLDOMNode *, BSTR *)
Definition: node.c:1553

◆ domelem_transformNodeToObject()

static HRESULT WINAPI domelem_transformNodeToObject ( IXMLDOMElement iface,
IXMLDOMNode domNode,
VARIANT  var1 
)
static

Definition at line 1166 of file element.c.

1169{
1171 FIXME("(%p)->(%p %s)\n", This, domNode, debugstr_variant(&var1));
1172 return E_NOTIMPL;
1173}

◆ element_get_dt()

static XDR_DT element_get_dt ( xmlNodePtr  node)
static

Definition at line 676 of file element.c.

677{
678 XDR_DT dt = DT_INVALID;
679
680 TRACE("(%p)\n", node);
681 if(node->type != XML_ELEMENT_NODE)
682 {
683 FIXME("invalid element node\n");
684 return dt;
685 }
686
687 if (node->ns && xmlStrEqual(node->ns->href, DT_nsURI))
688 {
689 dt = str_to_dt(node->name, -1);
690 }
691 else
692 {
693 xmlChar* pVal = xmlGetNsProp(node, BAD_CAST "dt", DT_nsURI);
694 if (pVal)
695 {
696 dt = str_to_dt(pVal, -1);
697 xmlFree(pVal);
698 }
699 else if (node->doc)
700 {
701 IXMLDOMDocument3* doc = (IXMLDOMDocument3*)create_domdoc((xmlNodePtr)node->doc);
702 if (doc)
703 {
704 VARIANT v;
705 VariantInit(&v);
706
707 if (IXMLDOMDocument3_get_schemas(doc, &v) == S_OK &&
708 V_VT(&v) == VT_DISPATCH)
709 {
711 }
712 VariantClear(&v);
713 IXMLDOMDocument3_Release(doc);
714 }
715 }
716 }
717
718 TRACE("=> dt:%s\n", debugstr_dt(dt));
719 return dt;
720}
@ VT_DISPATCH
Definition: compat.h:2304
IUnknown * create_domdoc(xmlNodePtr document)
Definition: domdoc.c:3813
XDR_DT SchemaCache_get_node_dt(IXMLDOMSchemaCollection2 *, xmlNodePtr)
Definition: schema.c:1561
XDR_DT str_to_dt(xmlChar const *str, int len)
Definition: schema.c:541
#define V_DISPATCH(A)
Definition: oleauto.h:239

Referenced by domelem_get_dataType(), domelem_get_nodeTypedValue(), and domelem_put_nodeTypedValue().

◆ encode_base64()

static HRESULT encode_base64 ( const BYTE buf,
int  len,
BSTR ret 
)
static

Definition at line 752 of file element.c.

753{
754 static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
755 const BYTE *d = buf;
756 int bytes, pad_bytes, div;
757 DWORD needed;
758 WCHAR *ptr;
759
760 bytes = (len*8 + 5)/6;
761 pad_bytes = (bytes % 4) ? 4 - (bytes % 4) : 0;
762
763 TRACE("%d, bytes is %d, pad bytes is %d\n", len, bytes, pad_bytes);
764 needed = bytes + pad_bytes + 1;
765
766 *ret = SysAllocStringLen(NULL, needed);
767 if (!*ret) return E_OUTOFMEMORY;
768
769 /* Three bytes of input give 4 chars of output */
770 div = len / 3;
771
772 ptr = *ret;
773 while (div > 0)
774 {
775 /* first char is the first 6 bits of the first byte*/
776 *ptr++ = b64[ ( d[0] >> 2) & 0x3f ];
777 /* second char is the last 2 bits of the first byte and the first 4
778 * bits of the second byte */
779 *ptr++ = b64[ ((d[0] << 4) & 0x30) | (d[1] >> 4 & 0x0f)];
780 /* third char is the last 4 bits of the second byte and the first 2
781 * bits of the third byte */
782 *ptr++ = b64[ ((d[1] << 2) & 0x3c) | (d[2] >> 6 & 0x03)];
783 /* fourth char is the remaining 6 bits of the third byte */
784 *ptr++ = b64[ d[2] & 0x3f];
785 d += 3;
786 div--;
787 }
788
789 switch (pad_bytes)
790 {
791 case 1:
792 /* first char is the first 6 bits of the first byte*/
793 *ptr++ = b64[ ( d[0] >> 2) & 0x3f ];
794 /* second char is the last 2 bits of the first byte and the first 4
795 * bits of the second byte */
796 *ptr++ = b64[ ((d[0] << 4) & 0x30) | (d[1] >> 4 & 0x0f)];
797 /* third char is the last 4 bits of the second byte padded with
798 * two zeroes */
799 *ptr++ = b64[ ((d[1] << 2) & 0x3c) ];
800 /* fourth char is a = to indicate one byte of padding */
801 *ptr++ = '=';
802 break;
803 case 2:
804 /* first char is the first 6 bits of the first byte*/
805 *ptr++ = b64[ ( d[0] >> 2) & 0x3f ];
806 /* second char is the last 2 bits of the first byte padded with
807 * four zeroes*/
808 *ptr++ = b64[ ((d[0] << 4) & 0x30)];
809 /* third char is = to indicate padding */
810 *ptr++ = '=';
811 /* fourth char is = to indicate padding */
812 *ptr++ = '=';
813 break;
814 }
815
816 return S_OK;
817}
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
static const char b64[]
Definition: base64.c:67
_ACRTIMP div_t __cdecl div(int, int)
Definition: math.c:2081
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define d
Definition: ke_i.h:81
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339

Referenced by domelem_put_nodeTypedValue().

◆ encode_binhex()

static HRESULT encode_binhex ( const BYTE buf,
int  len,
BSTR ret 
)
static

Definition at line 819 of file element.c.

820{
821 static const char byte_to_hex[16] = "0123456789abcdef";
822 int i;
823
825 if (!*ret) return E_OUTOFMEMORY;
826
827 for (i = 0; i < len; i++)
828 {
829 (*ret)[2*i] = byte_to_hex[buf[i] >> 4];
830 (*ret)[2*i+1] = byte_to_hex[0x0f & buf[i]];
831 }
832
833 return S_OK;
834}

Referenced by domelem_put_nodeTypedValue().

◆ get_element()

◆ hex_to_byte()

static BYTE hex_to_byte ( xmlChar  c)
inlinestatic

Definition at line 431 of file element.c.

432{
433 if(c <= '9') return c-'0';
434 if(c <= 'F') return c-'A'+10;
435 return c-'a'+10;
436}

Referenced by variant_from_dt().

◆ impl_from_IXMLDOMElement()

static domelem * impl_from_IXMLDOMElement ( IXMLDOMElement iface)
inlinestatic

Definition at line 58 of file element.c.

59{
60 return CONTAINING_RECORD(iface, domelem, IXMLDOMElement_iface);
61}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by domelem_AddRef(), domelem_appendChild(), domelem_cloneNode(), domelem_get_attributes(), domelem_get_baseName(), domelem_get_childNodes(), domelem_get_dataType(), domelem_get_definition(), domelem_get_firstChild(), domelem_get_lastChild(), domelem_get_namespaceURI(), domelem_get_nextSibling(), domelem_get_nodeName(), domelem_get_nodeType(), domelem_get_nodeTypedValue(), domelem_get_nodeTypeString(), domelem_get_nodeValue(), domelem_get_ownerDocument(), domelem_get_parentNode(), domelem_get_parsed(), domelem_get_prefix(), domelem_get_previousSibling(), domelem_get_specified(), domelem_get_tagName(), domelem_get_text(), domelem_get_xml(), domelem_getAttribute(), domelem_getAttributeNode(), domelem_getElementsByTagName(), domelem_GetIDsOfNames(), domelem_GetTypeInfo(), domelem_GetTypeInfoCount(), domelem_hasChildNodes(), domelem_insertBefore(), domelem_Invoke(), domelem_normalize(), domelem_put_dataType(), domelem_put_nodeTypedValue(), domelem_put_nodeValue(), domelem_put_text(), domelem_QueryInterface(), domelem_Release(), domelem_removeAttribute(), domelem_removeAttributeNode(), domelem_removeChild(), domelem_replaceChild(), domelem_selectNodes(), domelem_selectSingleNode(), domelem_setAttribute(), domelem_setAttributeNode(), domelem_transformNode(), and domelem_transformNodeToObject().

◆ variant_from_dt()

static HRESULT variant_from_dt ( XDR_DT  dt,
xmlChar str,
VARIANT v 
)
inlinestatic

Definition at line 447 of file element.c.

448{
449 VARIANT src;
450 HRESULT hr = S_OK;
451 BOOL handled = FALSE;
452
454
455 switch (dt)
456 {
457 case DT_STRING:
458 case DT_NMTOKEN:
459 case DT_NMTOKENS:
460 case DT_NUMBER:
461 case DT_URI:
462 case DT_UUID:
463 {
464 V_VT(v) = VT_BSTR;
466
467 if(!V_BSTR(v))
468 return E_OUTOFMEMORY;
469 handled = TRUE;
470 }
471 break;
472 case DT_DATE:
473 case DT_DATE_TZ:
474 case DT_DATETIME:
475 case DT_DATETIME_TZ:
476 case DT_TIME:
477 case DT_TIME_TZ:
478 {
479 WCHAR *p, *e;
480 SYSTEMTIME st;
481 DOUBLE date = 0.0;
482
483 st.wYear = 1899;
484 st.wMonth = 12;
485 st.wDay = 30;
486 st.wDayOfWeek = st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;
487
488 V_VT(&src) = VT_BSTR;
490
491 if(!V_BSTR(&src))
492 return E_OUTOFMEMORY;
493
494 p = V_BSTR(&src);
495 e = p + SysStringLen(V_BSTR(&src));
496
497 if(p+4<e && *(p+4)=='-') /* parse date (yyyy-mm-dd) */
498 {
499 st.wYear = wcstol(p, NULL, 10);
500 st.wMonth = wcstol(p+5, NULL, 10);
501 st.wDay = wcstol(p+8, NULL, 10);
502 p += 10;
503
504 if(*p == 'T') p++;
505 }
506
507 if(p+2<e && *(p+2)==':') /* parse time (hh:mm:ss.?) */
508 {
509 st.wHour = wcstol(p, NULL, 10);
510 st.wMinute = wcstol(p+3, NULL, 10);
511 st.wSecond = wcstol(p+6, NULL, 10);
512 p += 8;
513
514 if(*p == '.')
515 {
516 p++;
517 while (*p >= '0' && *p <= '9') p++;
518 }
519 }
520
522 V_VT(v) = VT_DATE;
523 V_DATE(v) = date;
524
525 if(*p == '+') /* parse timezone offset (+hh:mm) */
526 V_DATE(v) += (DOUBLE)wcstol(p+1, NULL, 10)/24 + (DOUBLE)wcstol(p+4, NULL, 10)/1440;
527 else if(*p == '-') /* parse timezone offset (-hh:mm) */
528 V_DATE(v) -= (DOUBLE)wcstol(p+1, NULL, 10)/24 + (DOUBLE)wcstol(p+4, NULL, 10)/1440;
529
531 handled = TRUE;
532 }
533 break;
534 case DT_BIN_HEX:
535 {
536 SAFEARRAYBOUND sab;
537 int i, len;
538
539 len = xmlStrlen(str)/2;
540 sab.lLbound = 0;
541 sab.cElements = len;
542
543 V_VT(v) = (VT_ARRAY|VT_UI1);
544 V_ARRAY(v) = SafeArrayCreate(VT_UI1, 1, &sab);
545
546 if(!V_ARRAY(v))
547 return E_OUTOFMEMORY;
548
549 for(i=0; i<len; i++)
550 ((BYTE*)V_ARRAY(v)->pvData)[i] = (hex_to_byte(str[2*i])<<4)
551 + hex_to_byte(str[2*i+1]);
552 handled = TRUE;
553 }
554 break;
555 case DT_BIN_BASE64:
556 {
557 SAFEARRAYBOUND sab;
558 xmlChar *c1, *c2;
559 int i, len;
560
561 /* remove all formatting chars */
562 c1 = c2 = str;
563 len = 0;
564 while (*c2)
565 {
566 if ( *c2 == ' ' || *c2 == '\t' ||
567 *c2 == '\n' || *c2 == '\r' )
568 {
569 c2++;
570 continue;
571 }
572 *c1++ = *c2++;
573 len++;
574 }
575
576 /* skip padding */
577 if(str[len-2] == '=') i = 2;
578 else if(str[len-1] == '=') i = 1;
579 else i = 0;
580
581 sab.lLbound = 0;
582 sab.cElements = len/4*3-i;
583
584 V_VT(v) = (VT_ARRAY|VT_UI1);
585 V_ARRAY(v) = SafeArrayCreate(VT_UI1, 1, &sab);
586
587 if(!V_ARRAY(v))
588 return E_OUTOFMEMORY;
589
590 for(i=0; i<len/4; i++)
591 {
592 ((BYTE*)V_ARRAY(v)->pvData)[3*i] = (base64_to_byte(str[4*i])<<2)
593 + (base64_to_byte(str[4*i+1])>>4);
594 if(3*i+1 < sab.cElements)
595 ((BYTE*)V_ARRAY(v)->pvData)[3*i+1] = (base64_to_byte(str[4*i+1])<<4)
596 + (base64_to_byte(str[4*i+2])>>2);
597 if(3*i+2 < sab.cElements)
598 ((BYTE*)V_ARRAY(v)->pvData)[3*i+2] = (base64_to_byte(str[4*i+2])<<6)
599 + base64_to_byte(str[4*i+3]);
600 }
601 handled = TRUE;
602 }
603 break;
604 case DT_BOOLEAN:
605 V_VT(v) = VT_BOOL;
606 break;
607 case DT_FIXED_14_4:
608 V_VT(v) = VT_CY;
609 break;
610 case DT_I1:
611 V_VT(v) = VT_I1;
612 break;
613 case DT_I2:
614 V_VT(v) = VT_I2;
615 break;
616 case DT_I4:
617 case DT_INT:
618 V_VT(v) = VT_I4;
619 break;
620 case DT_I8:
621 V_VT(v) = VT_I8;
622 break;
623 case DT_R4:
624 V_VT(v) = VT_R4;
625 break;
626 case DT_FLOAT:
627 case DT_R8:
628 V_VT(v) = VT_R8;
629 break;
630 case DT_UI1:
631 V_VT(v) = VT_UI1;
632 break;
633 case DT_UI2:
634 V_VT(v) = VT_UI2;
635 break;
636 case DT_UI4:
637 V_VT(v) = VT_UI4;
638 break;
639 case DT_UI8:
640 V_VT(v) = VT_UI8;
641 break;
642 case DT_CHAR:
643 case DT_ENTITY:
644 case DT_ENTITIES:
645 case DT_ENUMERATION:
646 case DT_ID:
647 case DT_IDREF:
648 case DT_IDREFS:
649 case DT_NOTATION:
650 FIXME("need to handle dt:%s\n", debugstr_dt(dt));
651 V_VT(v) = VT_BSTR;
653 if (!V_BSTR(v))
654 return E_OUTOFMEMORY;
655 handled = TRUE;
656 break;
657 default:
658 WARN("unknown type %d\n", dt);
659 }
660
661 if (!handled)
662 {
663 V_VT(&src) = VT_BSTR;
665
666 if(!V_BSTR(&src))
667 return E_OUTOFMEMORY;
668
672 }
673 return hr;
674}
@ VT_UI8
Definition: compat.h:2315
@ VT_R4
Definition: compat.h:2299
@ VT_UI2
Definition: compat.h:2312
@ VT_R8
Definition: compat.h:2300
@ VT_CY
Definition: compat.h:2301
@ VT_I8
Definition: compat.h:2314
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_DATE
Definition: compat.h:2302
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UI4
Definition: compat.h:2313
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2747
SAFEARRAY *WINAPI SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsabound)
Definition: safearray.c:600
static BYTE base64_to_byte(xmlChar c)
Definition: element.c:438
static BYTE hex_to_byte(xmlChar c)
Definition: element.c:431
GLenum src
Definition: glext.h:6340
#define e
Definition: ke_i.h:82
__u16 date
Definition: mkdosfs.c:8
#define DOUBLE(x)
Definition: atom.c:30
@ DT_ID
Definition: msxml_private.h:59
@ DT_ENTITIES
Definition: msxml_private.h:51
@ DT_ENTITY
Definition: msxml_private.h:50
@ DT_ENUMERATION
Definition: msxml_private.h:52
@ DT_IDREF
Definition: msxml_private.h:60
@ DT_IDREFS
Definition: msxml_private.h:61
@ DT_NOTATION
Definition: msxml_private.h:65
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:196
#define V_DATE(A)
Definition: oleauto.h:231
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_ENGLISH_US
Definition: nls.h:222
WORD wMilliseconds
Definition: minwinbase.h:263
WORD wSecond
Definition: minwinbase.h:262
WORD wMinute
Definition: minwinbase.h:261
WORD wDayOfWeek
Definition: minwinbase.h:258
double DOUBLE
Definition: typedefs.h:70
HRESULT WINAPI VariantChangeTypeEx(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, LCID lcid, USHORT wFlags, VARTYPE vt)
Definition: variant.c:988
INT WINAPI SystemTimeToVariantTime(LPSYSTEMTIME lpSt, double *pDateOut)
Definition: variant.c:1286
XMLPUBFUN int xmlStrlen(const xmlChar *str)
Definition: xmlstring.c:428

Referenced by domelem_get_nodeTypedValue().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( msxml  )

Variable Documentation

◆ domelem_attr_map

static const struct nodemap_funcs domelem_attr_map
static
Initial value:
= {
}
static HRESULT domelem_remove_named_item(xmlNodePtr node, BSTR name, IXMLDOMNode **item)
Definition: element.c:1751
static HRESULT domelem_set_named_item(xmlNodePtr node, IXMLDOMNode *newItem, IXMLDOMNode **namedItem)
Definition: element.c:1671
static HRESULT domelem_get_length(const xmlNodePtr node, LONG *length)
Definition: element.c:1865
static HRESULT domelem_next_node(const xmlNodePtr node, LONG *iter, IXMLDOMNode **nextNode)
Definition: element.c:1893
static HRESULT domelem_get_item(const xmlNodePtr node, LONG index, IXMLDOMNode **item)
Definition: element.c:1792
static HRESULT domelem_get_named_item(const xmlNodePtr node, BSTR name, IXMLDOMNode **item)
Definition: element.c:1629

Definition at line 50 of file element.c.

Referenced by domelem_get_attributes().

◆ domelem_dispex

dispex_static_data_t domelem_dispex
static
Initial value:
= {
}
static const tid_t domelem_iface_tids[]
Definition: element.c:1930
@ IXMLDOMElement_tid
Definition: msxml_dispex.h:47

Definition at line 1935 of file element.c.

Referenced by create_element().

◆ domelem_iface_tids

const tid_t domelem_iface_tids[]
static
Initial value:

Definition at line 1930 of file element.c.

◆ domelem_se_tids

const tid_t domelem_se_tids[]
static
Initial value:

Definition at line 52 of file element.c.

Referenced by domelem_QueryInterface().

◆ domelem_vtbl

const struct IXMLDOMElementVtbl domelem_vtbl
static

Definition at line 1531 of file element.c.

Referenced by create_element().

◆ DT_nsURI

const xmlChar DT_nsURI[] = "urn:schemas-microsoft-com:datatypes"
static

Definition at line 41 of file element.c.

Referenced by domelem_put_dataType(), and element_get_dt().

◆ DT_prefix

const xmlChar DT_prefix[] = "dt"
static

Definition at line 40 of file element.c.

Referenced by domelem_put_dataType().