Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Add OFXMLElementBuilder. |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
ad93296956f3abf549450316920b9a2c |
| User & Date: | js 2010-07-02 21:40:56.000 |
Context
|
2010-07-02
| ||
| 21:56 | Add -[writeToFile:] to OFString. check-in: aed0aea0b2 user: js tags: trunk | |
| 21:40 | Add OFXMLElementBuilder. check-in: ad93296956 user: js tags: trunk | |
| 21:05 | Rename +[xmlParser] to +[parser]. check-in: c1f392e534 user: js tags: trunk | |
Changes
Changes to src/Makefile.
| ︙ | ︙ | |||
32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
OFString+URLEncoding.m \
OFString+XMLEscaping.m \
OFString+XMLUnescaping.m \
OFTCPSocket.m \
${OFTHREAD_M} \
OFXMLAttribute.m \
OFXMLElement.m \
OFXMLParser.m \
unicode.m
INCLUDES := ${SRCS:.m=.h} \
ObjFW.h \
asprintf.h \
${ATOMIC_H} \
| > | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
OFString+URLEncoding.m \
OFString+XMLEscaping.m \
OFString+XMLUnescaping.m \
OFTCPSocket.m \
${OFTHREAD_M} \
OFXMLAttribute.m \
OFXMLElement.m \
OFXMLElementBuilder.m \
OFXMLParser.m \
unicode.m
INCLUDES := ${SRCS:.m=.h} \
ObjFW.h \
asprintf.h \
${ATOMIC_H} \
|
| ︙ | ︙ |
Added src/OFXMLElementBuilder.h.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
/*
* Copyright (c) 2008 - 2010
* Jonathan Schleifer <js@webkeks.org>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE included in
* the packaging of this file.
*/
#import "OFObject.h"
@class OFMutableArray;
@class OFXMLElement;
@class OFXMLElementBuilder;
/**
* \brief A protocol that needs to be implemented by delegates for
* OFXMLElementBuilder.
*/
@protocol OFXMLElementBuilderDelegate
/**
* This callback is called when the OFXMLElementBuilder built an element.
*
* If the OFXMLElementBuilder was used as a delegate for the OFXMLParser since
* parsing started, this will return the complete document as an OFXMLElement
* with all children.
*
* \param builder The builder which built an OFXMLElement
* \param elem The OFXMLElement the OFXMLElementBuilder built
*/
- (void)elementBuilder: (OFXMLElementBuilder*)builder
didBuildElement: (OFXMLElement*)elem;
@end
/**
* \brief A class implementing the OFXMLParserDelegate protocol that can build
* OFXMLElements from the document parsed by the OFXMLParser.
*
* It can also be used to build OFXMLElements from parts of the document by
* first parsing stuff using the OFXMLParser with another delegate and then
* setting the OFXMLElementBuilder as delegate for the parser.
*/
@interface OFXMLElementBuilder: OFObject
{
OFMutableArray *stack;
OFObject <OFXMLElementBuilderDelegate> *delegate;
}
#ifdef OF_HAVE_PROPERTIES
@property (retain) OFObject <OFXMLElementBuilderDelegate> *delegate;
#endif
/**
* \return A new, autoreleased OFXMLElementBuilder
*/
+ elementBuilder;
/**
* \return The delegate for the OFXMLElementBuilder
*/
- (OFObject <OFXMLElementBuilderDelegate>*)delegate;
/**
* Sets the delegate for the OFXMLElementBuilder.
*
* \param delegate The delegate for the OFXMLElementBuilder
*/
- (void)setDelegate: (OFObject <OFXMLElementBuilderDelegate>*)delegate;
@end
|
Added src/OFXMLElementBuilder.m.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
/*
* Copyright (c) 2008 - 2010
* Jonathan Schleifer <js@webkeks.org>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE included in
* the packaging of this file.
*/
#include "config.h"
#import "OFXMLElementBuilder.h"
#import "OFXMLElement.h"
#import "OFXMLParser.h"
#import "OFMutableArray.h"
#import "OFAutoreleasePool.h"
@implementation OFXMLElementBuilder
+ elementBuilder
{
return [[[self alloc] init] autorelease];
}
- init
{
self = [super init];
stack = [[OFMutableArray alloc] init];
return self;
}
- (void)dealloc
{
[stack release];
[delegate release];
[super dealloc];
}
- (OFObject <OFXMLElementBuilderDelegate>*)delegate
{
return [[delegate retain] autorelease];
}
- (void)setDelegate: (OFObject <OFXMLElementBuilderDelegate>*)delegate_
{
[delegate_ retain];
[delegate release];
delegate = delegate_;
}
- (void)parser: (OFXMLParser*)parser
didStartElement: (OFString*)name
withPrefix: (OFString*)prefix
namespace: (OFString*)ns
attributes: (OFArray*)attrs
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFXMLElement *elem;
OFXMLAttribute **attrs_c;
size_t i, attrs_cnt;
IMP add_attr;
elem = [OFXMLElement elementWithName: name
namespace: ns];
attrs_c = [attrs cArray];
attrs_cnt = [attrs count];
add_attr = [elem methodForSelector: @selector(addAttribute:)];
for (i = 0; i < attrs_cnt; i++) {
add_attr(elem, @selector(addAttribute:), attrs_c[i]);
if ([attrs_c[i] namespace] == nil &&
[[attrs_c[i] name] isEqual: @"xmlns"])
[elem setDefaultNamespace: [attrs_c[i] stringValue]];
else if ([[attrs_c[i] namespace]
isEqual: @"http://www.w3.org/2000/xmlns/"])
[elem setPrefix: [attrs_c[i] name]
forNamespace: [attrs_c[i] stringValue]];
}
[[stack lastObject] addChild: elem];
[stack addObject: elem];
[pool release];
}
- (void)parser: (OFXMLParser*)parser
didEndElement: (OFString*)name
withPrefix: (OFString*)prefix
namespace: (OFString*)ns
{
if ([stack count] == 1)
[delegate elementBuilder: self
didBuildElement: [stack firstObject]];
[stack removeNObjects: 1];
}
- (void)parser: (OFXMLParser*)parser
foundCharacters: (OFString*)str
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
[[stack lastObject]
addChild: [OFXMLElement elementWithCharacters: str]];
[pool release];
}
- (void)parser: (OFXMLParser*)parser
foundCDATA: (OFString*)cdata
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
[[stack lastObject] addChild: [OFXMLElement elementWithCDATA: cdata]];
[pool release];
}
- (void)parser: (OFXMLParser*)parser
foundComment: (OFString*)comment
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFXMLElement *last = [stack lastObject];
[last addChild: [OFXMLElement elementWithComment: comment]];
[pool release];
}
@end
|
Changes to tests/Makefile.
1 2 3 4 5 |
include ../extra.mk
SUBDIRS = ${TESTPLUGIN}
PROG_NOINST = tests${PROG_SUFFIX}
| | | | | | | | | | | | | | | | > | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
include ../extra.mk
SUBDIRS = ${TESTPLUGIN}
PROG_NOINST = tests${PROG_SUFFIX}
SRCS = OFArrayTests.m \
OFDataArrayTests.m \
OFDictionaryTests.m \
OFFileTests.m \
OFListTests.m \
OFMD5HashTests.m \
OFNumberTests.m \
OFObjectTests.m \
${OFPLUGINTESTS_M} \
OFSHA1HashTests.m \
OFStreamTests.m \
OFStringTests.m \
OFTCPSocketTests.m \
${OFTHREADTESTS_M} \
OFXMLElementTests.m \
OFXMLElementBuilderTests.m \
OFXMLParserTests.m \
${PROPERTIESTESTS_M} \
TestsAppDelegate.m
IPHONE_USER = mobile
IPHONE_TMP = /tmp/objfw-test
.PHONY: run run-tests run-on-iphone
run: all
|
| ︙ | ︙ |
Added tests/OFXMLElementBuilderTests.m.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/*
* Copyright (c) 2008 - 2010
* Jonathan Schleifer <js@webkeks.org>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE included in
* the packaging of this file.
*/
#include "config.h"
#include <string.h>
#include <assert.h>
#import "OFXMLElementBuilder.h"
#import "OFXMLParser.h"
#import "OFAutoreleasePool.h"
#import "TestsAppDelegate.h"
static OFString *module = @"OFXMLElementBuilder";
static OFXMLElement *elem = nil;
@implementation TestsAppDelegate (OFXMLElementBuilderTests)
- (void)elementBuilder: (OFXMLElementBuilder*)builder
didBuildElement: (OFXMLElement*)elem_
{
assert(elem == nil);
elem = [elem_ retain];
}
- (void)XMLElementBuilderTests
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFXMLParser *p = [OFXMLParser parser];
OFXMLElementBuilder *builder = [OFXMLElementBuilder elementBuilder];
const char *str = "<foo>bar<![CDATA[f<oo]]>baz<qux/>"
" <qux xmlns:qux='urn:qux'><qux:bar/><x qux:y='z'/></qux>"
"</foo>";
[p setDelegate: builder];
[builder setDelegate: self];
TEST(@"Building element from parsed XML",
R([p parseBuffer: str
withSize: strlen(str)]) &&
elem != nil && !strcmp([[elem string] cString], str))
[elem release];
[pool drain];
}
@end
|
Changes to tests/TestsAppDelegate.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/*
* Copyright (c) 2008 - 2010
* Jonathan Schleifer <js@webkeks.org>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE included in
* the packaging of this file.
*/
#import "OFApplication.h"
#define TEST(test, cond) \
{ \
[self outputTesting: test \
inModule: module]; \
\
if (cond) \
| > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/*
* Copyright (c) 2008 - 2010
* Jonathan Schleifer <js@webkeks.org>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE included in
* the packaging of this file.
*/
#import "OFApplication.h"
#import "OFXMLElementBuilder.h"
#define TEST(test, cond) \
{ \
[self outputTesting: test \
inModule: module]; \
\
if (cond) \
|
| ︙ | ︙ | |||
127 128 129 130 131 132 133 | - (void)threadTests; @end @interface TestsAppDelegate (OFXMLElementTests) - (void)XMLElementTests; @end | | > > > > | 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | - (void)threadTests; @end @interface TestsAppDelegate (OFXMLElementTests) - (void)XMLElementTests; @end @interface TestsAppDelegate (OFXMLElementBuilderTests) - (void)XMLElementBuilderTests; @end @interface TestsAppDelegate (OFXMLParserTests) <OFXMLElementBuilderDelegate> - (void)XMLParserTests; @end |
Changes to tests/TestsAppDelegate.m.
| ︙ | ︙ | |||
89 90 91 92 93 94 95 96 97 98 99 100 101 102 | [self streamTests]; [self TCPSocketTests]; #ifdef OF_THREADS [self threadTests]; #endif [self XMLElementTests]; [self XMLParserTests]; #ifdef OF_PLUGINS [self pluginTests]; #endif #ifdef OF_HAVE_PROPERTIES [self propertiesTests]; #endif | > | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | [self streamTests]; [self TCPSocketTests]; #ifdef OF_THREADS [self threadTests]; #endif [self XMLElementTests]; [self XMLParserTests]; [self XMLElementBuilderTests]; #ifdef OF_PLUGINS [self pluginTests]; #endif #ifdef OF_HAVE_PROPERTIES [self propertiesTests]; #endif |
| ︙ | ︙ |