added subNodes ivar to track ownership of nodes in a tree

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/branches/nsxml_using_libxml2@34513 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Doug Simons 2012-01-13 19:24:44 +00:00
parent 3464a615f5
commit f7aff866ac
3 changed files with 20 additions and 1 deletions

View file

@ -219,7 +219,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
[children release]; [children release];
internal->rootElement = (NSXMLElement*)root; internal->rootElement = (NSXMLElement*)root;
*/ */
xmlElementPtr newrootnode; xmlNodePtr newrootnode;
NSAssert(root != nil, NSInvalidArgumentException); NSAssert(root != nil, NSInvalidArgumentException);
// Set // Set
xmlDocSetRootElement(MY_DOC,[root _node]); xmlDocSetRootElement(MY_DOC,[root _node]);

View file

@ -34,6 +34,7 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
- (void *) _node; - (void *) _node;
- (void) _setNode: (void *)_anode; - (void) _setNode: (void *)_anode;
+ (NSXMLNode *) _objectForNode: (xmlNodePtr)node; + (NSXMLNode *) _objectForNode: (xmlNodePtr)node;
- (void) _addSubNode:(NSXMLNode *)subNode;
@end @end
@implementation NSXMLNode (Private) @implementation NSXMLNode (Private)
@ -50,6 +51,9 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
+ (NSXMLNode *) _objectForNode: (xmlNodePtr)node + (NSXMLNode *) _objectForNode: (xmlNodePtr)node
{ {
if (!node)
return nil;
xmlElementType type = node->type; xmlElementType type = node->type;
NSXMLNode *result = (id)node->_private; NSXMLNode *result = (id)node->_private;
xmlChar *name = NULL; xmlChar *name = NULL;
@ -57,6 +61,7 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
if(result == NULL) if(result == NULL)
{ {
NSXMLNode *parent = nil;
switch(type) switch(type)
{ {
case(XML_ELEMENT_NODE): case(XML_ELEMENT_NODE):
@ -73,10 +78,22 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
} }
node->_private = result; node->_private = result;
AUTORELEASE(result); AUTORELEASE(result);
if (node->parent)
parent = [self _objectForNode:node->parent];
[parent _addSubNode:result];
} }
return result; return result;
} }
- (void) _addSubNode:(NSXMLNode *)subNode
{
if (!internal->subNodes)
internal->subNodes = [[NSMutableArray alloc] init];
if ([internal->subNodes indexOfObjectIdenticalTo:subNode] == NSNotFound)
[internal->subNodes addObject:subNode];
}
@end @end
@implementation NSXMLNode @implementation NSXMLNode
@ -323,6 +340,7 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
[internal->children release]; [internal->children release];
[internal->objectValue release]; [internal->objectValue release];
[internal->stringValue release]; [internal->stringValue release];
[internal->subNodes release];
GS_DESTROY_INTERNAL(NSXMLNode); GS_DESTROY_INTERNAL(NSXMLNode);
} }
[super dealloc]; [super dealloc];

View file

@ -112,6 +112,7 @@ StringFromXMLString(const unsigned char *bytes, unsigned length)
NSXMLNode *nextSibling;\ NSXMLNode *nextSibling;\
NSUInteger options; \ NSUInteger options; \
void *node; \ void *node; \
NSMutableArray *subNodes; \
/* When using the non-fragile ABI, the instance variables are exposed to the /* When using the non-fragile ABI, the instance variables are exposed to the