msxml.dll: nextNode and reset functions
Colin Pitrat
colin.pitrat at bull.net
Thu Dec 21 11:05:04 CST 2006
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 );
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: colin.pitrat.vcf
Type: text/x-vcard
Size: 247 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-patches/attachments/20061221/42038aeb/colin.pitrat.vcf
More information about the wine-patches
mailing list