cleaned up a lot of things and fixed at least one crashing bug

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/branches/nsxml_using_libxml2@34519 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Doug Simons 2012-01-14 05:16:39 +00:00
parent f6289a65a1
commit e395d2f42a
2 changed files with 37 additions and 27 deletions

View file

@ -29,6 +29,8 @@
#import "GSInternal.h" #import "GSInternal.h"
GS_PRIVATE_INTERNAL(NSXMLElement) GS_PRIVATE_INTERNAL(NSXMLElement)
extern void clearPrivatePointers(xmlNodePtr aNode);
// Private methods to manage libxml pointers... // Private methods to manage libxml pointers...
@interface NSXMLNode (Private) @interface NSXMLNode (Private)
- (void *) _node; - (void *) _node;
@ -69,6 +71,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
NSString *name = @""; NSString *name = @"";
GS_CREATE_INTERNAL(NSXMLElement) GS_CREATE_INTERNAL(NSXMLElement)
internal->node = (void *)xmlNewNode(NULL,(xmlChar *)[name UTF8String]); internal->node = (void *)xmlNewNode(NULL,(xmlChar *)[name UTF8String]);
((xmlNodePtr)internal->node)->_private = self;
internal->objectValue = @""; internal->objectValue = @"";
} }
return [super initWithKind: kind options: theOptions]; return [super initWithKind: kind options: theOptions];
@ -83,6 +86,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
if ((self = [super initWithKind: NSXMLElementKind]) != nil) if ((self = [super initWithKind: NSXMLElementKind]) != nil)
{ {
internal->node = (void *)xmlNewNode(NULL,(xmlChar *)[name UTF8String]); internal->node = (void *)xmlNewNode(NULL,(xmlChar *)[name UTF8String]);
((xmlNodePtr)internal->node)->_private = self;
ASSIGNCOPY(internal->URI, URI); ASSIGNCOPY(internal->URI, URI);
internal->objectValue = @""; internal->objectValue = @"";
} }
@ -283,7 +287,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
if (index >= [self childCount]) if (index >= [self childCount])
{ {
[NSException raise: NSRangeException [NSException raise: NSRangeException
format: @"index to large"]; format: @"index too large"];
} }
child = [[self children] objectAtIndex: index]; child = [[self children] objectAtIndex: index];

View file

@ -70,12 +70,17 @@ void clearPrivatePointers(xmlNodePtr aNode)
xmlElementType type = node->type; xmlElementType type = node->type;
xmlChar *name = NULL; xmlChar *name = NULL;
// NSXMLNodeKind kind = 0; // NSXMLNodeKind kind = 0;
result = node->_private;
if(result == NULL) if(result == nil)
{ {
NSXMLNode *parent = nil; NSXMLNode *parent = nil;
switch(type) switch(type)
{ {
case(XML_DOCUMENT_NODE):
name = (xmlChar *)node->name;
result = [[self alloc] initWithKind: NSXMLDocumentKind];
break;
case(XML_ELEMENT_NODE): case(XML_ELEMENT_NODE):
name = (xmlChar *)node->name; name = (xmlChar *)node->name;
result = [[self alloc] initWithKind: NSXMLElementKind]; result = [[self alloc] initWithKind: NSXMLElementKind];
@ -374,7 +379,9 @@ void clearPrivatePointers(xmlNodePtr aNode)
{ {
if (GS_EXISTS_INTERNAL) if (GS_EXISTS_INTERNAL)
{ {
xmlNodePtr node = (xmlNodePtr)(internal->node);
[self detach]; [self detach];
node->_private = NULL;
[internal->URI release]; [internal->URI release];
[internal->objectValue release]; [internal->objectValue release];
[internal->subNodes release]; [internal->subNodes release];
@ -386,7 +393,8 @@ void clearPrivatePointers(xmlNodePtr aNode)
- (void) detach - (void) detach
{ {
xmlNodePtr node = (xmlNodePtr)(internal->node); xmlNodePtr node = (xmlNodePtr)(internal->node);
NSXMLNode *parent = node->parent->_private; // get our parent object if it exists xmlNodePtr parentNode = node->parent;
NSXMLNode *parent = (parentNode ? parentNode->_private : nil); // get our parent object if it exists
[parent _removeSubNode:self]; [parent _removeSubNode:self];
xmlUnlinkNode(node); xmlUnlinkNode(node);
/* /*
@ -552,11 +560,7 @@ void clearPrivatePointers(xmlNodePtr aNode)
- (NSString*) name - (NSString*) name
{ {
xmlNodePtr node = (xmlNodePtr)(internal->node); return StringFromXMLStringPtr(MY_NODE->name);
if (node->name)
return StringFromXMLString(node->name,strlen((char *)node->name));
else
return @"";
} }
- (NSXMLNode*) _nodeFollowingInNaturalDirection: (BOOL)forward - (NSXMLNode*) _nodeFollowingInNaturalDirection: (BOOL)forward
@ -626,11 +630,11 @@ void clearPrivatePointers(xmlNodePtr aNode)
- (NSXMLNode*) nextSibling - (NSXMLNode*) nextSibling
{ {
xmlNodePtr node = MY_NODE->next; xmlNodePtr next = MY_NODE->next;
if(node != NULL) if(next != NULL)
{ {
return [NSXMLNode _objectForNode:node->next]; return [NSXMLNode _objectForNode:next];
} }
return nil; return nil;
@ -658,24 +662,26 @@ void clearPrivatePointers(xmlNodePtr aNode)
- (NSXMLNode*) previousSibling - (NSXMLNode*) previousSibling
{ {
return internal->previousSibling; xmlNodePtr prev = MY_NODE->prev;
if(prev != NULL)
{
return [NSXMLNode _objectForNode:prev];
}
return nil;
} }
- (NSXMLDocument*) rootDocument - (NSXMLDocument*) rootDocument
{ {
xmlNodePtr node = (xmlNodePtr)(internal->node); xmlNodePtr node = MY_NODE;
NSXMLDocument *ancestor = [NSXMLNode _objectForNode:(node->doc)]; NSXMLDocument *ancestor = (NSXMLDocument *)[NSXMLNode _objectForNode:(xmlNodePtr)(node->doc)];
return (NSXMLDocument*)ancestor; return ancestor;
} }
- (NSString*) stringValue - (NSString*) stringValue
{ {
xmlNodePtr node = (xmlNodePtr)(internal->node); return StringFromXMLStringPtr(MY_NODE->content);
if (node->content)
return StringFromXMLString(node->content,strlen((char *)node->content));
else
return @"";
} }
- (NSString*) URI - (NSString*) URI
@ -703,7 +709,6 @@ void clearPrivatePointers(xmlNodePtr aNode)
len = buffer->use; len = buffer->use;
string = StringFromXMLString(buf,len); string = StringFromXMLString(buf,len);
xmlBufferFree(buffer); xmlBufferFree(buffer);
AUTORELEASE(string);
return string; return string;
} }
@ -717,9 +722,8 @@ void clearPrivatePointers(xmlNodePtr aNode)
{ {
if (NSXMLInvalidKind != internal->kind) if (NSXMLInvalidKind != internal->kind)
{ {
xmlNodePtr node = (xmlNodePtr)(internal->node); xmlNodePtr node = MY_NODE;
node->name = XMLStringCopy(name); xmlNodeSetName(node, XMLSTRING(name));
//ASSIGNCOPY(internal->name, name);
} }
} }
@ -741,16 +745,18 @@ void clearPrivatePointers(xmlNodePtr aNode)
xmlNodePtr node = MY_NODE; xmlNodePtr node = MY_NODE;
if (resolve == NO) if (resolve == NO)
{ {
node->content = (xmlChar *)[string UTF8String]; xmlNodeSetContent(node, XMLSTRING(string));
} }
else else
{ {
// need to actually resolve entities... // need to actually resolve entities...
node->content = (xmlChar *)[string UTF8String]; xmlChar *newstr = xmlEncodeSpecialChars(node->doc, XMLSTRING(string)); // is this the right functionality??
xmlNodeSetContent(node, newstr);
xmlMemFree(newstr);
} }
if (nil == string) if (nil == string)
{ {
node->content = (xmlChar *)[@"" UTF8String]; // string value may not be nil xmlNodeSetContent(node, XMLSTRING(@"")); // string value may not be nil
} }
} }