mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-25 09:41:15 +00:00
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:
parent
f6289a65a1
commit
e395d2f42a
2 changed files with 37 additions and 27 deletions
|
@ -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];
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue