mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 17:10:48 +00:00
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@21245 72102866-910b-0410-8b05-ffd578937521
558 lines
11 KiB
Objective-C
558 lines
11 KiB
Objective-C
/** Implementation for NSXMLParser for GNUStep
|
||
Copyright (C) 2004 Free Software Foundation, Inc.
|
||
|
||
Written by: Richard Frith-Macdonald <rfm@gnu.org>
|
||
Date: May 2004
|
||
|
||
This file is part of the GNUstep Base Library.
|
||
|
||
This library is free software; you can redistribute it and/or
|
||
modify it under the terms of the GNU Library General Public
|
||
License as published by the Free Software Foundation; either
|
||
version 2 of the License, or (at your option) any later version.
|
||
|
||
This library is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
Library General Public License for more details.
|
||
|
||
You should have received a copy of the GNU Library General Public
|
||
License along with this library; if not, write to the Free
|
||
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA.
|
||
|
||
*/
|
||
|
||
#include <Additions/GNUstepBase/GSXML.h>
|
||
#include <Foundation/NSError.h>
|
||
#include <Foundation/NSException.h>
|
||
#include <Foundation/NSXMLParser.h>
|
||
#include <Foundation/NSData.h>
|
||
#include <Foundation/NSObjCRuntime.h>
|
||
|
||
NSString* const NSXMLParserErrorDomain = @"NSXMLParserErrorDomain";
|
||
|
||
@interface NSXMLSAXHandler : GSSAXHandler
|
||
{
|
||
@public
|
||
id _delegate;
|
||
id _owner;
|
||
NSError *_lastError;
|
||
BOOL _shouldProcessNamespaces;
|
||
BOOL _shouldReportNamespacePrefixes;
|
||
BOOL _shouldResolveExternalEntities;
|
||
}
|
||
- (void) _setOwner: (id)owner;
|
||
@end
|
||
|
||
@implementation NSXMLSAXHandler
|
||
|
||
- (void) endDocument
|
||
{
|
||
[_delegate parserDidEndDocument: _owner];
|
||
}
|
||
- (void) startDocument
|
||
{
|
||
[_delegate parserDidStartDocument: _owner];
|
||
}
|
||
|
||
- (void) startElement: (NSString*)elementName
|
||
prefix: (NSString*)prefix
|
||
href: (NSString*)href
|
||
attributes: (NSMutableDictionary*)elementAttributes
|
||
{
|
||
if (_shouldProcessNamespaces)
|
||
{
|
||
[_delegate parser: _owner
|
||
didStartElement: elementName
|
||
namespaceURI: href
|
||
qualifiedName: prefix
|
||
attributes: elementAttributes];
|
||
}
|
||
else
|
||
{
|
||
[_delegate parser: _owner
|
||
didStartElement: elementName
|
||
namespaceURI: nil
|
||
qualifiedName: nil
|
||
attributes: elementAttributes];
|
||
}
|
||
}
|
||
|
||
- (void) endElement: (NSString*) elementName
|
||
prefix: (NSString*)prefix
|
||
href: (NSString*)href
|
||
{
|
||
if (_shouldProcessNamespaces)
|
||
{
|
||
[_delegate parser: _owner
|
||
didEndElement: elementName
|
||
namespaceURI: href
|
||
qualifiedName: prefix];
|
||
}
|
||
else
|
||
{
|
||
[_delegate parser: _owner
|
||
didEndElement: elementName
|
||
namespaceURI: nil
|
||
qualifiedName: nil];
|
||
}
|
||
}
|
||
- (void) attribute: (NSString*) name value: (NSString*)value
|
||
{
|
||
// FIXME
|
||
}
|
||
- (void) characters: (NSString*)string
|
||
{
|
||
[_delegate parser: _owner
|
||
foundCharacters: string];
|
||
}
|
||
- (void) ignoreWhitespace: (NSString*) ch
|
||
{
|
||
[_delegate parser: _owner
|
||
foundIgnorableWhitespace: ch];
|
||
}
|
||
- (void) processInstruction: (NSString*)targetName data: (NSString*)PIdata
|
||
{
|
||
[_delegate parser: _owner
|
||
foundProcessingInstructionWithTarget: targetName
|
||
data: PIdata];
|
||
}
|
||
- (void) comment: (NSString*) value
|
||
{
|
||
[_delegate parser: _owner
|
||
foundComment: value];
|
||
}
|
||
- (void) cdataBlock: (NSData*)value
|
||
{
|
||
[_delegate parser: _owner
|
||
foundCDATA: value];
|
||
}
|
||
|
||
/**
|
||
* Called to return the filename from which an entity should be loaded.
|
||
*/
|
||
- (NSString*) loadEntity: (NSString*)publicId
|
||
at: (NSString*)location
|
||
{
|
||
return nil;
|
||
}
|
||
|
||
/**
|
||
* An old global namespace has been parsed.
|
||
*/
|
||
- (void) namespaceDecl: (NSString*)name
|
||
href: (NSString*)href
|
||
prefix: (NSString*)prefix
|
||
{
|
||
}
|
||
|
||
- (void) notationDecl: (NSString*)name
|
||
public: (NSString*)publicId
|
||
system: (NSString*)systemId
|
||
{
|
||
[_delegate parser: _owner
|
||
foundNotationDeclarationWithName: name
|
||
publicID: publicId
|
||
systemID: systemId];
|
||
}
|
||
|
||
/**
|
||
* An entity definition has been parsed.
|
||
*/
|
||
- (void) entityDecl: (NSString*)name
|
||
type: (int)type
|
||
public: (NSString*)publicId
|
||
system: (NSString*)systemId
|
||
content: (NSString*)content
|
||
{
|
||
}
|
||
|
||
- (void) attributeDecl: (NSString*)nameElement
|
||
name: (NSString*)name
|
||
type: (int)type
|
||
typeDefValue: (int)defType
|
||
defaultValue: (NSString*)value
|
||
{
|
||
[_delegate parser: _owner
|
||
foundAttributeDeclarationWithName: name
|
||
forElement: nameElement
|
||
type: nil // FIXME
|
||
defaultValue: value];
|
||
}
|
||
|
||
- (void) elementDecl: (NSString*)name
|
||
type: (int)type
|
||
{
|
||
[_delegate parser: _owner
|
||
foundElementDeclarationWithName: name
|
||
model: nil]; // FIXME
|
||
}
|
||
|
||
/**
|
||
* What to do when an unparsed entity declaration is parsed.
|
||
*/
|
||
- (void) unparsedEntityDecl: (NSString*)name
|
||
public: (NSString*)publicId
|
||
system: (NSString*)systemId
|
||
notationName: (NSString*)notation
|
||
{
|
||
}
|
||
|
||
/**
|
||
* Called when an entity reference is detected.
|
||
*/
|
||
- (void) reference: (NSString*) name
|
||
{
|
||
}
|
||
|
||
/**
|
||
* An old global namespace has been parsed.
|
||
*/
|
||
- (void) globalNamespace: (NSString*)name
|
||
href: (NSString*)href
|
||
prefix: (NSString*)prefix
|
||
{
|
||
}
|
||
|
||
/**
|
||
* Called when a warning message needs to be output.
|
||
*/
|
||
- (void) warning: (NSString*)e
|
||
{
|
||
GSPrintf(stderr, @"%@", e);
|
||
}
|
||
|
||
- (void) error: (NSString*)e
|
||
{
|
||
NSError *error;
|
||
NSDictionary *d;
|
||
|
||
d = [NSDictionary dictionaryWithObjectsAndKeys:
|
||
e, NSLocalizedDescriptionKey,
|
||
nil];
|
||
error = [NSError errorWithDomain: NSXMLParserErrorDomain
|
||
code: 0
|
||
userInfo: d];
|
||
ASSIGN(_lastError, error);
|
||
[_delegate parser: _owner
|
||
parseErrorOccurred: error];
|
||
}
|
||
- (void) fatalError: (NSString*)e
|
||
{
|
||
[self error: e];
|
||
}
|
||
- (void) warning: (NSString*)e
|
||
colNumber: (int)colNumber
|
||
lineNumber: (int)lineNumber
|
||
{
|
||
e = [NSString stringWithFormat: @"at line: %d column: %d ... %@",
|
||
lineNumber, colNumber, e];
|
||
[self warning: e];
|
||
}
|
||
- (void) error: (NSString*)e
|
||
colNumber: (int)colNumber
|
||
lineNumber: (int)lineNumber
|
||
{
|
||
e = [NSString stringWithFormat: @"at line: %d column: %d ... %@",
|
||
lineNumber, colNumber, e];
|
||
[self error: e];
|
||
}
|
||
- (void) fatalError: (NSString*)e
|
||
colNumber: (int)colNumber
|
||
lineNumber: (int)lineNumber
|
||
{
|
||
e = [NSString stringWithFormat: @"at line: %d column: %d ... %@",
|
||
lineNumber, colNumber, e];
|
||
[self fatalError: e];
|
||
}
|
||
- (int) hasInternalSubset
|
||
{
|
||
return 0;
|
||
}
|
||
- (BOOL) internalSubset: (NSString*)name
|
||
externalID: (NSString*)externalID
|
||
systemID: (NSString*)systemID
|
||
{
|
||
return NO;
|
||
}
|
||
- (int) hasExternalSubset
|
||
{
|
||
return 0;
|
||
}
|
||
- (BOOL) externalSubset: (NSString*)name
|
||
externalID: (NSString*)externalID
|
||
systemID: (NSString*)systemID
|
||
{
|
||
return NO;
|
||
}
|
||
- (void*) getEntity: (NSString*)name
|
||
{
|
||
return 0;
|
||
}
|
||
- (void*) getParameterEntity: (NSString*)name
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
- (void) _setOwner: (id)owner
|
||
{
|
||
ASSIGN(_owner, owner);
|
||
}
|
||
|
||
@end
|
||
|
||
|
||
|
||
@implementation NSXMLParser
|
||
|
||
#define myParser ((GSXMLParser*)_parser)
|
||
#define myHandler ((NSXMLSAXHandler*)_handler)
|
||
|
||
- (void) abortParsing
|
||
{
|
||
NSDictionary *d;
|
||
NSString *e;
|
||
NSError *error;
|
||
|
||
e = @"Parsing aborted";
|
||
d = [NSDictionary dictionaryWithObjectsAndKeys:
|
||
e, NSLocalizedDescriptionKey,
|
||
nil];
|
||
error = [NSError errorWithDomain: NSXMLParserErrorDomain
|
||
code: 0
|
||
userInfo: d];
|
||
ASSIGN(myHandler->_lastError, error);
|
||
[myHandler->_delegate parser: myHandler->_owner parseErrorOccurred: error];
|
||
[myParser abortParsing];
|
||
}
|
||
|
||
- (void) dealloc
|
||
{
|
||
DESTROY(_parser);
|
||
DESTROY(_handler);
|
||
[super dealloc];
|
||
}
|
||
|
||
- (id) delegate
|
||
{
|
||
return myHandler->_delegate;
|
||
}
|
||
|
||
- (id) initWithContentsOfURL: (NSURL*)anURL
|
||
{
|
||
NSData *d = [NSData dataWithContentsOfURL: anURL];
|
||
|
||
if (d == nil)
|
||
{
|
||
DESTROY(self);
|
||
}
|
||
else
|
||
{
|
||
self = [self initWithData: d];
|
||
}
|
||
return self;
|
||
}
|
||
|
||
- (id) initWithData: (NSData*)data
|
||
{
|
||
_handler = [NSXMLSAXHandler new];
|
||
[myHandler _setOwner: self];
|
||
_parser = [[GSXMLParser alloc] initWithSAXHandler: myHandler withData: data];
|
||
return self;
|
||
}
|
||
|
||
- (BOOL) parse
|
||
{
|
||
BOOL result;
|
||
|
||
result = [[myHandler parser] parse];
|
||
return result;
|
||
}
|
||
|
||
- (NSError*) parserError
|
||
{
|
||
return nil; // FIXME
|
||
}
|
||
|
||
- (void) setDelegate: (id)delegate
|
||
{
|
||
myHandler->_delegate = delegate;
|
||
}
|
||
|
||
- (void) setShouldProcessNamespaces: (BOOL)aFlag
|
||
{
|
||
myHandler->_shouldProcessNamespaces = aFlag;
|
||
}
|
||
|
||
- (void) setShouldReportNamespacePrefixes: (BOOL)aFlag
|
||
{
|
||
myHandler->_shouldReportNamespacePrefixes = aFlag;
|
||
}
|
||
|
||
- (void) setShouldResolveExternalEntities: (BOOL)aFlag
|
||
{
|
||
myHandler->_shouldResolveExternalEntities = aFlag;
|
||
}
|
||
|
||
- (BOOL) shouldProcessNamespaces
|
||
{
|
||
return myHandler->_shouldProcessNamespaces;
|
||
}
|
||
|
||
- (BOOL) shouldReportNamespacePrefixes
|
||
{
|
||
return myHandler->_shouldReportNamespacePrefixes;
|
||
}
|
||
|
||
- (BOOL) shouldResolveExternalEntities
|
||
{
|
||
return myHandler->_shouldResolveExternalEntities;
|
||
}
|
||
|
||
@end
|
||
|
||
@implementation NSXMLParser (NSXMLParserLocatorAdditions)
|
||
- (int) columnNumber
|
||
{
|
||
return [myParser columnNumber];
|
||
}
|
||
|
||
- (int) lineNumber
|
||
{
|
||
return [myParser lineNumber];
|
||
}
|
||
|
||
- (NSString*) publicID
|
||
{
|
||
return [myParser publicID];
|
||
}
|
||
|
||
- (NSString*) systemID
|
||
{
|
||
return [myParser systemID];
|
||
}
|
||
|
||
@end
|
||
|
||
@implementation NSObject (NSXMLParserDelegateEventAdditions)
|
||
- (NSData*) parser: (NSXMLParser*)aParser
|
||
resolveExternalEntityName: (NSString*)aName
|
||
systemID: (NSString*)aSystemID
|
||
{
|
||
return nil;
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
didEndElement: (NSString*)anElementName
|
||
namespaceURI: (NSString*)aNamespaceURI
|
||
qualifiedName: (NSString*)aQualifierName
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
didEndMappingPrefix: (NSString*)aPrefix
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
didStartElement: (NSString*)anElementName
|
||
namespaceURI: (NSString*)aNamespaceURI
|
||
qualifiedName: (NSString*)aQualifierName
|
||
attributes: (NSDictionary*)anAttributeDict
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
didStartMappingPrefix: (NSString*)aPrefix
|
||
toURI: (NSString*)aNamespaceURI
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundAttributeDeclarationWithName: (NSString*)anAttributeName
|
||
forElement: (NSString*)anElementName
|
||
type: (NSString*)aType
|
||
defaultValue: (NSString*)aDefaultValue
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundCDATA: (NSData*)aBlock
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundCharacters: (NSString*)aString
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundComment: (NSString*)aComment
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundElementDeclarationWithName: (NSString*)anElementName
|
||
model: (NSString*)aModel
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundExternalEntityDeclarationWithName: (NSString*)aName
|
||
publicID: (NSString*)aPublicID
|
||
systemID: (NSString*)aSystemID
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundIgnorableWhitespace: (NSString*)aWhitespaceString
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundInternalEntityDeclarationWithName: (NSString*)aName
|
||
value: (NSString*)aValue
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundNotationDeclarationWithName: (NSString*)aName
|
||
publicID: (NSString*)aPublicID
|
||
systemID: (NSString*)aSystemID
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundProcessingInstructionWithTarget: (NSString*)aTarget
|
||
data: (NSString*)aData
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
foundUnparsedEntityDeclarationWithName: (NSString*)aName
|
||
publicID: (NSString*)aPublicID
|
||
systemID: (NSString*)aSystemID
|
||
notationName: (NSString*)aNotationName
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
parseErrorOccurred: (NSError*)anError
|
||
{
|
||
}
|
||
|
||
- (void) parser: (NSXMLParser*)aParser
|
||
validationErrorOccurred: (NSError*)anError
|
||
{
|
||
}
|
||
|
||
- (void) parserDidEndDocument: (NSXMLParser*)aParser
|
||
{
|
||
}
|
||
|
||
- (void) parserDidStartDocument: (NSXMLParser*)aParser
|
||
{
|
||
}
|
||
|
||
@end
|
||
|