@@ -15,259 +15,14 @@ #include #include #import "OFXMLElement.h" #import "OFString.h" -#import "OFArray.h" -#import "OFAutoreleasePool.h" #import "OFExceptions.h" int _OFXMLElement_reference; -@implementation OFXMLAttribute -+ attributeWithName: (OFString*)name - prefix: (OFString*)prefix - namespace: (OFString*)ns - stringValue: (OFString*)value -{ - return [[[self alloc] initWithName: name - prefix: prefix - namespace: ns - stringValue: value] autorelease]; -} - -- initWithName: (OFString*)name_ - prefix: (OFString*)prefix_ - namespace: (OFString*)ns - stringValue: (OFString*)value -{ - self = [super init]; - - name = [name_ copy]; - prefix = [prefix_ copy]; - namespace = [ns copy]; - stringValue = [value copy]; - - return self; -} - -- (void)dealloc -{ - [name release]; - [prefix release]; - [namespace release]; - [stringValue release]; - - [super dealloc]; -} - -- (OFString*)name -{ - return [[name copy] autorelease]; -} - -- (OFString*)prefix -{ - return [[prefix copy] autorelease]; -} - -- (OFString*)namespace -{ - return [[namespace copy] autorelease]; -} - -- (OFString*)stringValue -{ - return [[stringValue copy] autorelease]; -} -@end - -@implementation OFXMLElement -+ elementWithName: (OFString*)name_ -{ - return [[[self alloc] initWithName: name_] autorelease]; -} - -+ elementWithName: (OFString*)name - stringValue: (OFString*)stringval -{ - return [[[self alloc] initWithName: name - stringValue: stringval] autorelease]; -} - -- init -{ - @throw [OFNotImplementedException newWithClass: isa - selector: _cmd]; -} - -- initWithName: (OFString*)name_ -{ - self = [super init]; - - name = [name_ copy]; - - return self; -} - -- initWithName: (OFString*)name_ - stringValue: (OFString*)stringval -{ - self = [super init]; - - name = [name_ copy]; - stringValue = [stringval copy]; - - return self; -} - -- (OFString*)string -{ - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; - char *str_c; - size_t len, i, j, attrs_count; - OFXMLAttribute **attrs_carray; - OFString *ret, *tmp; - - len = [name cStringLength] + 3; - str_c = [self allocMemoryWithSize: len]; - - /* Start of tag */ - *str_c = '<'; - memcpy(str_c + 1, [name cString], [name cStringLength]); - i = [name cStringLength] + 1; - - /* Attributes */ - attrs_carray = [attributes cArray]; - attrs_count = [attributes count]; - - for (j = 0; j < attrs_count; j++) { - /* FIXME: Add namespace support */ - OFString *attr_name = [attrs_carray[j] name]; - tmp = [[attrs_carray[j] stringValue] stringByXMLEscaping]; - - len += [attr_name cStringLength] + [tmp cStringLength] + 4; - @try { - str_c = [self resizeMemory: str_c - toSize: len]; - } @catch (OFException *e) { - [self freeMemory: str_c]; - @throw e; - } - - str_c[i++] = ' '; - memcpy(str_c + i, [attr_name cString], - [attr_name cStringLength]); - i += [attr_name cStringLength]; - str_c[i++] = '='; - str_c[i++] = '\''; - memcpy(str_c + i, [tmp cString], [tmp cStringLength]); - i += [tmp cStringLength]; - str_c[i++] = '\''; - - [pool releaseObjects]; - } - - /* Childen */ - if (stringValue != nil || children != nil) { - if (stringValue != nil) - tmp = [stringValue stringByXMLEscaping]; - else if (children != nil) { - OFXMLElement **children_carray = [children cArray]; - size_t children_count = [children count]; - IMP append; - - tmp = [OFMutableString string]; - append = [tmp methodForSelector: - @selector(appendCStringWithoutUTF8Checking:)]; - - for (j = 0; j < children_count; j++) - append(tmp, @selector( - appendCStringWithoutUTF8Checking:), - [[children_carray[j] string] cString]); - } - - len += [tmp cStringLength] + [name cStringLength] + 2; - @try { - str_c = [self resizeMemory: str_c - toSize: len]; - } @catch (OFException *e) { - [self freeMemory: str_c]; - @throw e; - } - - str_c[i++] = '>'; - memcpy(str_c + i, [tmp cString], [tmp cStringLength]); - i += [tmp cStringLength]; - str_c[i++] = '<'; - str_c[i++] = '/'; - memcpy(str_c + i, [name cString], [name cStringLength]); - i += [name cStringLength]; - } else - str_c[i++] = '/'; - - str_c[i++] = '>'; - assert(i == len); - - [pool release]; - - @try { - ret = [OFString stringWithCString: str_c - length: len]; - } @finally { - [self freeMemory: str_c]; - } - return ret; -} - -- (void)addAttribute: (OFXMLAttribute*)attr -{ - if (attributes == nil) - attributes = [[OFMutableArray alloc] init]; - - /* FIXME: Prevent having it twice! */ - - [attributes addObject: attr]; -} - -- (void)addAttributeWithName: (OFString*)name_ - stringValue: (OFString*)value -{ - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; - [self addAttribute: [OFXMLAttribute attributeWithName: name_ - prefix: nil - namespace: nil - stringValue: value]]; - [pool release]; -} - -/* TODO: Replace attribute */ -/* TODO: Remove attribute */ - -- (void)addChild: (OFXMLElement*)child -{ - if (stringValue != nil) - @throw [OFInvalidArgumentException newWithClass: isa - selector: _cmd]; - - if (children == nil) - children = [[OFMutableArray alloc] init]; - - [children addObject: child]; -} - -- (void)dealloc -{ - [name release]; - [attributes release]; - [stringValue release]; - [children release]; - - [super dealloc]; -} -@end - @implementation OFString (OFXMLEscaping) - (OFString*)stringByXMLEscaping { char *str_c, *append, *tmp; size_t len, append_len;