OK, I finally managed to cross-compile and run this test under windows and under wine. The patch (test and functions) works well.
Colin Pitrat (Bull Services Telco) Bull, Architect of an Open World (TM) Tél : +33 (0) 1 30 80 72 93 www.bull.com
Colin Pitrat wrote:
New version of this patch, including corrections suggested by Huw Davies, a correction and the addition of a test case. However, I didn't run the test case under Windows because I have a problem when I run make crosstest : Undefined reference to _IID_IXMLDOMDocument and other similar messages with _IID_IXMLDOMNode, _IID_IXMLDOMElement...
Maybe this error is related to a previous one when running make crosstest in top directory, occuring for advpack : Can't find -lcabinet
Change Log: Add an iterator to _xmlnodemap struct Implement nextNode function that give nodes one by one Implement resetNode that reset the iterator Add a test case for these functions
Colin Pitrat (Bull Services Telco) Bull, Architect of an Open World (TM) Tél : +33 (0) 1 30 80 72 93 www.bull.com
Colin Pitrat wrote:
Change Log: Add an iterator to _xmlnodemap struct Implement nextNode function that give nodes one by one Implement resetNode that reset the iterator
It's my first patch, so please tell me if something is wrong. I saw on http://www.winehq.com/site/sending_patches that I should write a test case, but I don't know how to do this (do I need windows ? because I don't have it).
diff --git a/dlls/msxml3/nodemap.c b/dlls/msxml3/nodemap.c index 0797436..ead0138 100644 --- a/dlls/msxml3/nodemap.c +++ b/dlls/msxml3/nodemap.c @@ -44,6 +44,7 @@ typedef struct _xmlnodemap const struct ISupportErrorInfoVtbl *lpSEIVtbl; LONG ref; IXMLDOMNode *node;
- long iterator;
} xmlnodemap;
static inline xmlnodemap *impl_from_IXMLDOMNamedNodeMap( IXMLDOMNamedNodeMap *iface ) @@ -297,15 +298,47 @@ static HRESULT WINAPI xmlnodemap_nextNod IXMLDOMNamedNodeMap *iface, IXMLDOMNode** nextItem) {
- FIXME("\n");
- return E_NOTIMPL;
- xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
- xmlNodePtr node;
- xmlAttrPtr curr;
- long attrIndex;
- TRACE("%p %ld\n", This, This->iterator);
- *nextItem = NULL;
- node = xmlNodePtr_from_domnode( This->node, 0 );
- curr = node->properties;
- for (attrIndex = 0; attrIndex < This->iterator; attrIndex++) {
if (curr->next == NULL)
return S_FALSE;
else
curr = curr->next;
- }
- if (curr->next == NULL)
return S_FALSE;
- else
curr = curr->next;
- This->iterator++;
- *nextItem = create_node( (xmlNodePtr) curr );
- return S_OK;
}
static HRESULT WINAPI xmlnodemap_reset( IXMLDOMNamedNodeMap *iface ) {
- FIXME("\n");
- return E_NOTIMPL;
- xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
- TRACE("%p %ld\n", This, This->iterator);
- This->iterator = 0;
- return S_OK;
}
static HRESULT WINAPI xmlnodemap__newEnum(
diff --git a/dlls/msxml3/nodemap.c b/dlls/msxml3/nodemap.c index 0797436..5458542 100644 --- a/dlls/msxml3/nodemap.c +++ b/dlls/msxml3/nodemap.c @@ -44,6 +44,7 @@ typedef struct _xmlnodemap const struct ISupportErrorInfoVtbl *lpSEIVtbl; LONG ref; IXMLDOMNode *node;
- long iterator;
} xmlnodemap;
static inline xmlnodemap *impl_from_IXMLDOMNamedNodeMap( IXMLDOMNamedNodeMap *iface ) @@ -258,8 +259,8 @@ static HRESULT WINAPI xmlnodemap_get_len
first = node->properties; if (first == NULL) {
- *listLength = 0;
- return S_OK;
*listLength = 0;
return S_OK; }
curr = first;
@@ -297,15 +298,42 @@ static HRESULT WINAPI xmlnodemap_nextNod IXMLDOMNamedNodeMap *iface, IXMLDOMNode** nextItem) {
- FIXME("\n");
- return E_NOTIMPL;
- xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
- xmlNodePtr node;
- xmlAttrPtr curr;
- long attrIndex;
- TRACE("%p %ld\n", This, This->iterator);
- *nextItem = NULL;
- node = xmlNodePtr_from_domnode( This->node, 0 );
- curr = node->properties;
- for (attrIndex = 0; attrIndex < This->iterator; attrIndex++) {
if (curr->next == NULL)
return S_FALSE;
else
curr = curr->next;
- }
- This->iterator++;
- *nextItem = create_node( (xmlNodePtr) curr );
- return S_OK;
}
static HRESULT WINAPI xmlnodemap_reset( IXMLDOMNamedNodeMap *iface ) {
- FIXME("\n");
- return E_NOTIMPL;
- xmlnodemap *This = impl_from_IXMLDOMNamedNodeMap( iface );
- TRACE("%p %ld\n", This, This->iterator);
- This->iterator = 0;
- return S_OK;
}
static HRESULT WINAPI xmlnodemap__newEnum( @@ -389,6 +417,7 @@ IXMLDOMNamedNodeMap *create_nodemap( IXM nodemap->lpSEIVtbl = &support_error_vtbl; nodemap->node = node; nodemap->ref = 1;
nodemap->iterator = 0;
IXMLDOMNode_AddRef( node ); /* Since we AddRef a node here, we don't need to call xmldoc_add_ref() */
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index a2824fd..d8f08ac 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -114,7 +114,10 @@ static void test_domdoc( void ) r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); if( r != S_OK )
{
printf("CoCreateInstance failed : %d\n",r); return;
}
/* try some stupid things */ r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
@@ -411,7 +414,7 @@ todo_wine ok( node == NULL, "getNamedItem should have returned NULL\n"); SysFreeString( str );
- /* test indexed access of attributes */
/* test indexed access of attributes */ r = IXMLDOMNamedNodeMap_get_length( map, &count ); ok ( r == S_OK, "get_length wrong code\n"); ok ( count == 1, "get_length != 1\n");
@@ -434,6 +437,23 @@ todo_wine r = IXMLDOMNode_get_nodeName( node, NULL ); ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
/* test sequential access of attributes */
node = NULL;
r = IXMLDOMNamedNodeMap_nextNode( map, &node );
ok ( r == S_OK, "nextNode (first time) wrong code\n");
ok ( node != NULL, "nextNode, should be attribute\n");
r = IXMLDOMNamedNodeMap_nextNode( map, &node );
ok ( r != S_OK, "nextNode (second time) wrong code\n");
ok ( node == NULL, "nextNode, there is no attribute\n");
r = IXMLDOMNamedNodeMap_reset( map );
ok ( r == S_OK, "reset should return S_OK\n");
r = IXMLDOMNamedNodeMap_nextNode( map, &node );
ok ( r == S_OK, "nextNode (third time) wrong code\n");
ok ( node != NULL, "nextNode, should be attribute\n");
/* content doesn't matter here */ str = SysAllocString( szNonExistentFile ); r = IXMLDOMNode_get_nodeName( node, &str );