diff --git a/ChangeLog b/ChangeLog index 9d307bd3d..ce74f41c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +2009-02-09 Richard Frith-Macdonald + + * Source/NSArray.m: Implement new methods for inserting and replacing + objects at indexes in an NSIndexSet. + * Headers/Foundation/NSObject.h: Minor whitespace fix + * Source/NSNetServices.m: Mark unimplemented method. + * Headers/Foundation/NSXMLDocument.h: new class + * Headers/Foundation/NSXMLNode.h: new class + * Headers/Foundation/NSXMLNodeOptions.h: new class + * Headers/Foundation/NSXMLDTD.h: new class + * Headers/Foundation/NSXMLDTDNode.h: new class + * Headers/Foundation/NSXMLElement.h: new class + * Headers/Foundation/Foundation.h: Add new class headers + * Source/NSXMLDocument.m: skeleton of class + * Source/NSXMLDTD.m: skeleton of class + * Source/NSXMLNode.m: skeleton of class + * Source/NSXMLDTDNode.m: skeleton of class + * Source/NSXMLElement.m: skeleton of class + * Source/NSXMLPrivate.h: Private header for all NSXMLNode based stuff. + * Source/GNUmakefile: Add new NSXML classes + * Source/DocMakefile: ditto + Mostly, add the (unimplemented) XML classes introduced in the latest + version of MacOS-X. Currently the classes are unimplemented method + stubs, but the idea is to wrap libxml2 in a similar way to that in + which GSXML does it. + NB. The current ivar layout is reverse engineered from MacOS-X on the + assumption that we will try to be extremely compatible and use the + same (inferred) mechanism of having the libxml2 tree be the master + data and only using the objc ivars to cache information when we + retrieve it in the form of NSStrings etc. Maybe we will chose to + do something different later. + 2009-02-09 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: Correct error comparing method diff --git a/Headers/Foundation/Foundation.h b/Headers/Foundation/Foundation.h index e53aa3637..064f252a7 100644 --- a/Headers/Foundation/Foundation.h +++ b/Headers/Foundation/Foundation.h @@ -124,6 +124,12 @@ #import #import #import +#import +#import +#import +#import +#import +#import #import #import diff --git a/Headers/Foundation/NSObject.h b/Headers/Foundation/NSObject.h index 7633f60c8..6b884ff38 100644 --- a/Headers/Foundation/NSObject.h +++ b/Headers/Foundation/NSObject.h @@ -332,7 +332,7 @@ GS_EXPORT NSRecursiveLock *gnustep_global_lock; * (but cannot due to compiler constraint), and wants to make sure it is not * called by mistake. Default implementation raises an exception at runtime. */ -- notImplemented:(SEL)aSel; +- (id) notImplemented: (SEL)aSel; /** * Message sent when an implementation wants to explicitly require a subclass diff --git a/Headers/Foundation/NSXMLDTD.h b/Headers/Foundation/NSXMLDTD.h new file mode 100644 index 000000000..fb105d50b --- /dev/null +++ b/Headers/Foundation/NSXMLDTD.h @@ -0,0 +1,156 @@ +/* Interface for NSXMLDTD for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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. +*/ + +#ifndef __NSXMLDTD_h_GNUSTEP_BASE_INCLUDE +#define __NSXMLDTD_h_GNUSTEP_BASE_INCLUDE +#import + +#import + +#if defined(__cplusplus) +extern "C" { +#endif + + +@class NSData, NSMutableDictionary; +@class NSXMLDTDNode; + +/** + * Encapsulates document type definition data. + */ +@interface NSXMLDTD : NSXMLNode +{ +@private + NSString *_name; + NSString *_publicID; + NSString *_systemID; + NSArray *_children; + BOOL _childrenHaveMutated; + BOOL _modified; + uint8_t _unused[sizeof(void*)-2]; + NSMutableDictionary *_entities; + NSMutableDictionary *_elements; + NSMutableDictionary *_notations; + NSMutableDictionary *_attributes; + NSString *_original; +} + +/** + * Adds a child after the existing children. + */ +- (void) addChild: (NSXMLNode*)child; + +/** + * Returns the attribute declaration named. + */ +- (NSXMLDTDNode*) attributeDeclarationForName: (NSString*)name + elementName: (NSString*)elementName; + +/** + * Returns the element declaration named. + */ +- (NSXMLDTDNode*) elementDeclarationForName: (NSString*)name; + +/** + * Returns the entity declaration named. + */ +- (NSXMLDTDNode*) entityDeclarationForName: (NSString*)name; + +/** Load data from URL and initialise the receiver with the contents. + */ +- (id) initWithContentsOfURL: (NSURL*)url + options: (NSUInteger)mask + error: (NSError**)error; + +/** + */ +- (id) initWithData: (NSData*)data + options: (NSUInteger)mask + error: (NSError**)error; + +/** + * Inserts a child node at the specified index in the document. + */ +- (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index; + +/** + * Inserts a number of child nodes at the specified index. + */ +- (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index; + +/** + * Returns the notation declaration named. + */ +- (NSXMLDTDNode*) notationDeclarationForName: (NSString*)name; + +/** + * Returns the predefined entity declaration matching named. + */ ++ (NSXMLDTDNode*) predefinedEntityDeclarationForName: (NSString*)name; + +/** + * Returns the public ID set for the document. + */ +- (NSString*) publicID; + +/** + * Remove the indexed child node. + */ +- (void) removeChildAtIndex: (NSUInteger)index; + +/** + * Replaces the child at index with another child. + */ +- (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)node; + +/** + * Replaces all existing children with the child nodes in the array. + */ +- (void) setChildren: (NSArray*)children; + +/** + * Sets the public id of this document.
+ * This identifier should be in the default catalog or in a location + * given by the XML_CATALOG_FILES environment variable.
+ * You should also set the systemID when you set this. + */ +- (void) setPublicID: (NSString*)publicID; + +/** + * Sets the system ID ... a URL referring to the DTD document. + */ +- (void) setSystemID: (NSString*)systemID; + +/** + * Returns the system ID + */ +- (NSString*) systemID; + +@end + +#if defined(__cplusplus) +} +#endif + +#endif /*__NSXMLDTD_GNUSTEP_BASE_INCLUDE */ diff --git a/Headers/Foundation/NSXMLDTDNode.h b/Headers/Foundation/NSXMLDTDNode.h new file mode 100644 index 000000000..7590fb736 --- /dev/null +++ b/Headers/Foundation/NSXMLDTDNode.h @@ -0,0 +1,148 @@ +/* Interface for NSXMLDTDNode for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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. +*/ + +#ifndef __NSXMLDTDNode_h_GNUSTEP_BASE_INCLUDE +#define __NSXMLDTDNode_h_GNUSTEP_BASE_INCLUDE +#import + +#import + +#if defined(__cplusplus) +extern "C" { +#endif + +/** + * The kind of DTD node. + */ +enum { + NSXMLEntityGeneralKind = 1, + NSXMLEntityParsedKind, + NSXMLEntityUnparsedKind, + NSXMLEntityParameterKind, + NSXMLEntityPredefined, + NSXMLAttributeCDATAKind, + NSXMLAttributeIDKind, + NSXMLAttributeIDRefKind, + NSXMLAttributeIDRefsKind, + NSXMLAttributeEntityKind, + NSXMLAttributeEntitiesKind, + NSXMLAttributeNMTokenKind, + NSXMLAttributeNMTokensKind, + NSXMLAttributeEnumerationKind, + NSXMLAttributeNotationKind, + NSXMLElementDeclarationUndefinedKind, + NSXMLElementDeclarationEmptyKind, + NSXMLElementDeclarationAnyKind, + NSXMLElementDeclarationMixedKind, + NSXMLElementDeclarationElementKind +}; +typedef NSUInteger NSXMLDTDNodeKind; + +/** + * Represents the nodes whose types are present only in DTDs.
+ * Object values for the different nodes are: + * + * Entity declaration + * The string that that entity resolves to eg "<" + * Attribute declaration + * The default value, if any + * Element declaration + * The validation string + * Notation declaration + * nil + * + */ +@interface NSXMLDTDNode : NSXMLNode +{ +@protected + NSXMLDTDNodeKind _DTDKind; + NSString *_name; + NSString *_notationName; + NSString *_publicID; + NSString *_systemID; +} + +/** + * Returns what kind of DTD node this is. + */ +- (NSXMLDTDNodeKind) DTDKind; + +/** + * Initialises the receiver based on the contents of the supplied XML. + */ +- (id) initWithXMLString: (NSString*)string; + +/** + * Returns YES if the system id is set, NO otherwise.
+ * Is valid only for entities and notations. + */ +- (BOOL) isExternal; + +/** + * Returns the notation name. + */ +- (NSString*) notationName; + +/** + * Returns the public id. + */ +- (NSString*) publicID; + +/** + * Sets what kind of DTD node this is. + */ +- (void) setDTDKind: (NSXMLDTDNodeKind)kind; + +/** + * Sets the notation name if the receiver is an entity. + */ +- (void) setNotationName: (NSString*)notationName; + +/** + * Sets the public id of this node.
+ * This identifier should be in the default catalog or in a location + * given by the XML_CATALOG_FILES environment variable.
+ * When the public id is set the system id must also be set.
+ * This is valid only for entities and notations. + */ +- (void) setPublicID: (NSString*)publicID; + +/** + * Sets the system ID ... a URL referring to the DTD document. + */ +- (void) setSystemID: (NSString*)systemID; + +/** + * Returns the system ID. + */ +- (NSString*) systemID; + +@end + + +#if defined(__cplusplus) +} +#endif + +#endif /*__NSXMLDTDNode_h_GNUSTEP_BASE_INCLUDE */ diff --git a/Headers/Foundation/NSXMLDocument.h b/Headers/Foundation/NSXMLDocument.h new file mode 100644 index 000000000..474c250c4 --- /dev/null +++ b/Headers/Foundation/NSXMLDocument.h @@ -0,0 +1,273 @@ +/* Interface for NSXMLDocument for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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. +*/ + +#ifndef __NSXMLDocument_h_GNUSTEP_BASE_INCLUDE +#define __NSXMLDocument_h_GNUSTEP_BASE_INCLUDE +#import + +#import + +#if defined(__cplusplus) +extern "C" { +#endif + +@class NSData; +@class NSXMLDTD; + +/* + * Input options + * NSXMLNodeOptionsNone + * NSXMLNodePreserveAll + * NSXMLNodePreserveNamespaceOrder + * NSXMLNodePreserveAttributeOrder + * NSXMLNodePreserveEntities + * NSXMLNodePreservePrefixes + * NSXMLNodePreserveCDATA + * NSXMLNodePreserveEmptyElements + * NSXMLNodePreserveQuotes + * NSXMLNodePreserveWhitespace + * NSXMLDocumentTidyHTML + * NSXMLDocumentTidyXML + * NSXMLDocumentValidate + * + * Output options + * NSXMLNodePrettyPrint + * NSXMLDocumentIncludeContentTypeDeclaration + */ + +enum { + NSXMLDocumentXMLKind = 0, /** Default type */ + NSXMLDocumentXHTMLKind, /** HTML found */ + NSXMLDocumentHTMLKind, /** Output no close tag for empty elem*/ + NSXMLDocumentTextKind /** Output string value of doc */ +}; +/** + * Define what type of document this is. + */ +typedef NSUInteger NSXMLDocumentContentKind; + +/** + * An XMLDocument encapsulates an entire document. + * This must contain a single element node. + */ +@interface NSXMLDocument : NSXMLNode +{ +@protected + NSString *_encoding; + NSString *_version; + NSXMLDTD *_docType; + NSArray *_children; + BOOL _childrenHaveMutated; + BOOL _standalone; + uint8_t _unused[sizeof(void*)-2]; + NSXMLElement *_rootElement; + NSString *_URI; + NSString *_MIMEType; + NSUInteger _fidelityMask; + NSXMLDocumentContentKind _contentKind; +} + ++ (Class) replacementClassForClass: (Class)cls; + +/** + * Returns the IANA character encoding, or nil if none is set. + */ +- (NSString*) characterEncoding; + +/** + * Returns the kind of document. + */ +- (NSXMLDocumentContentKind) documentContentKind; + +/** + * Returns the DTD set for the receiver. + */ +- (NSXMLDTD*) DTD; + +/** + * Initialise using the data downloaded from the spplied url. + */ +- (id) initWithContentsOfURL: (NSURL*)url + options: (NSUInteger)mask + error: (NSError**)error; + +/** + * Returns a document created from data.
+ * Parse errors are returned in error. + */ +- (id) initWithData: (NSData*)data + options: (NSUInteger)mask + error: (NSError**)error; + +/** + * Returns a document with a single child, the root element. + */ +- (id) initWithRootElement: (NSXMLElement*)element; + +/** + * Initialises the receiver by creating a document from XML (or HTML + * if the HTMLTidy option is set). + * Parse errors are returned in the error argument. +*/ +- (id) initWithXMLString: (NSString*)string + options: (NSUInteger)mask + error: (NSError**)error; + +/** + * Returns NO if the receiver depends upon an external DTD, otherwise + * returns YES. + */ +- (BOOL) isStandalone; + +/** + * Returns the document MIME type.. + */ +- (NSString*) MIMEType; + +/** + * Returns the root object of the receiver. + */ +- (NSXMLElement*) rootElement; + +/** + * Sets the character encoding to an IANA characterset type. + */ +- (void) setCharacterEncoding: (NSString*)encoding; + +/** + * Sets the kind of document. + */ +- (void) setDocumentContentKind: (NSXMLDocumentContentKind)kind; + +/** + * Sets the DTD of the receiver. If this is set then the DTD will be + * output when the document is. + */ +- (void) setDTD: (NSXMLDTD*)documentTypeDeclaration; + +/** + * Sets the document MIME type (usually text/xml). + */ +- (void) setMIMEType: (NSString*)MIMEType; + +/** + * Sets the root object of the receiver, removing any children which + * were previously set. + */ +- (void) setRootElement: (NSXMLNode*)root; + +/** + * Sets whether the receiver is a document which requires an external DTD.
+ * If this is set then the standalone declaration will appear if the document is + * output. + */ +- (void) setStandalone: (BOOL)standalone; + +/** + * Sets the XML version
+ * Permitted values ar '1.0' or '1,1' + */ +- (void) setVersion: (NSString*)version; + +/** + * Returns the XML version or nil if none is set. + */ +- (NSString*) version; + + +/** + * Inserts child at index. + */ +- (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index; + +/** + * Inserts a number of children at the index. + */ +- (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index; + +/** + * Removes the child at the index. + */ +- (void) removeChildAtIndex: (NSUInteger)index; + +/** + * Replaces all existing child nodes with the ones in the array. + */ +- (void) setChildren: (NSArray*)children; + +/** + * Adds child after existing children. + */ +- (void) addChild: (NSXMLNode*)child; + +/** + * Replacs the child at the specified index. + */ +- (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)node; + +/** + * Outputs XML data using -XMLDataWithOptions: with NSXMLNodeOptionsNone. + */ +- (NSData*) XMLData; + +/** + * Outputs the reciever encoded using the specified options. + */ +- (NSData*) XMLDataWithOptions: (NSUInteger)options; + +/** + * Returns a new document created by applying xslt (with a set of + * key/value pairs) to the receiver. + */ +- (id) objectByApplyingXSLT: (NSData*)xslt + arguments: (NSDictionary*)arguments + error: (NSError**)error; + +/** + * Returns a new document created by applying xslt (with a set of + * key/value pairs) to the receiver. + */ +- (id) objectByApplyingXSLTString: (NSString*)xslt + arguments: (NSDictionary*)arguments + error: (NSError**)error; + +/** + * Downloads XSLT from xsltURL, and then returns a new document created + * by applying it (with a set of key/value pairs) to the receiver. + */ +- (id) objectByApplyingXSLTAtURL: (NSURL*)xsltURL + arguments: (NSDictionary*)argument + error: (NSError**)error; + +/* Validate the receiver according to its DTD. + */ +- (BOOL) validateAndReturnError: (NSError**)error; + +@end + +#if defined(__cplusplus) +} +#endif + +#endif /*__NSXMLDocument_h_GNUSTEP_BASE_INCLUDE */ diff --git a/Headers/Foundation/NSXMLElement.h b/Headers/Foundation/NSXMLElement.h new file mode 100644 index 000000000..f3a8549c7 --- /dev/null +++ b/Headers/Foundation/NSXMLElement.h @@ -0,0 +1,203 @@ +/* Interface for NSXMLElement for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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. +*/ + +#ifndef __NSXMLElement_h_GNUSTEP_BASE_INCLUDE +#define __NSXMLElement_h_GNUSTEP_BASE_INCLUDE +#import + +#import + +#if defined(__cplusplus) +extern "C" { +#endif + + +@class NSDictionary, NSEnumerator, NSMutableArray; + +/** + * Represents an XML element.
+ */ +@interface NSXMLElement : NSXMLNode +{ +@protected + NSString *_name; + NSMutableArray *_attributes; + NSMutableArray *_namespaces; + NSArray *_children; + BOOL _childrenHaveMutated; + uint8_t _unused[sizeof(void*)- 1]; + NSString *_URI; + NSInteger _prefixIndex; +} + +/** + * Initialises the receiver with the given name. + */ +- (id) initWithName: (NSString*)name; + +/** + * Initialises the receiver with the given name and namespace URI. + */ +- (id) initWithName: (NSString*)name URI: (NSString*)URI; + +/** + * Initialises the receiver as a text node with the given name and content. + */ +- (id) initWithName: (NSString*)name stringValue: (NSString*)string; + +/** + * Initialises the receiver by parsing the XML string supplied. + */ +- (id) initWithXMLString: (NSString*)string error: (NSError**)error; + +/** + * Searches for and returns all child elements which match name. + */ +- (NSArray*) elementsForName: (NSString*)name; + +/** + * Searches for and returns all child elements which match localName + * and the specified URI. + */ +- (NSArray*) elementsForLocalName: (NSString*)localName URI: (NSString*)URI; + +/** + * Adds the supplied attribute to the receiver (ignoring if it has a duplicate + * name). + */ +- (void) addAttribute: (NSXMLNode*)attribute; + +/** + * Removes the named attribute. + */ +- (void) removeAttributeForName: (NSString*)name; + +/** + * Sets the attributes of the receiver, ignoring all but the first of any + * duplicates. + */ +- (void) setAttributes: (NSArray*)attributes; + +/** + * Sets attributes from the supplkied dictionary. + */ +- (void) setAttributesAsDictionary: (NSDictionary*)attributes; + +/** + * Returns the receiver's attributes. + */ +- (NSArray*) attributes; + +/** + * Returns the named attribute. + */ +- (NSXMLNode*) attributeForName: (NSString*)name; + +/** + * Returns the attribute matching localName and URI. + */ +- (NSXMLNode*) attributeForLocalName: (NSString*)localName + URI: (NSString*)URI; + +/** + * Adds a namespace unless the name is a duplicate. + */ +- (void) addNamespace: (NSXMLNode*)aNamespace; + +/** + * Removes a named namespace. + */ +- (void) removeNamespaceForPrefix: (NSString*)name; + +/** + * Sets the namespaces for the receiver, ignoring all but the first + * of any duplicates. + */ +- (void) setNamespaces: (NSArray*)namespaces; + +/** + * Returns the namespaces of the receiver. + */ +- (NSArray*) namespaces; + +/** + * Returns the namespace for the specified prefix in the receiver. + */ +- (NSXMLNode*) namespaceForPrefix: (NSString*)name; + +/** + * Returns the namespace found by searching the chain of namespaces. + */ +- (NSXMLNode*) resolveNamespaceForName: (NSString*)name; + +/** + * Returns the URI by searching the chain of namespaces. + */ +- (NSString*) resolvePrefixForNamespaceURI: (NSString*)namespaceURI; + +/** + * Inerts a child node. + */ +- (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index; + +/** + * Inserts a number of children. + */ +- (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index; + +/** + * Removes a child node. + */ +- (void) removeChildAtIndex: (NSUInteger)index; + +/** + * Replaces all existing child nodes with those from the array. + */ +- (void) setChildren: (NSArray*)children; + +/** + * Adds a child after existing children. + */ +- (void) addChild: (NSXMLNode*)child; + +/** + * Replaces the child at the specified index. + */ +- (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)node; + +/** + * Merges adjacent text nodes. If a node's value is the empty string, + * and preserve is NO, it is removed.
+ * This should be called with a value of NO before using + * XQuery or XPath. + */ +- (void) normalizeAdjacentTextNodesPreservingCDATA: (BOOL)preserve; + +@end + +#if defined(__cplusplus) +} +#endif + +#endif /*__NSXMLElement_h_GNUSTEP_BASE_INCLUDE */ diff --git a/Headers/Foundation/NSXMLNode.h b/Headers/Foundation/NSXMLNode.h new file mode 100644 index 000000000..9d6232243 --- /dev/null +++ b/Headers/Foundation/NSXMLNode.h @@ -0,0 +1,370 @@ +/* Interface for NSXMLNode for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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. +*/ + +#ifndef __NSXMLNode_h_GNUSTEP_BASE_INCLUDE +#define __NSXMLNode_h_GNUSTEP_BASE_INCLUDE +#import + +#import +#import + +#if defined(__cplusplus) +extern "C" { +#endif + + +@class NSArray; +@class NSDictionary; +@class NSError; +@class NSString; +@class NSURL; +@class NSXMLDocument; +@class NSXMLElement; + +enum { + NSXMLInvalidKind = 0, + NSXMLDocumentKind, + NSXMLElementKind, + NSXMLAttributeKind, + NSXMLNamespaceKind, + NSXMLProcessingInstructionKind, + NSXMLCommentKind, + NSXMLTextKind, + NSXMLDTDKind, + NSXMLEntityDeclarationKind, + NSXMLAttributeDeclarationKind, + NSXMLElementDeclarationKind, + NSXMLNotationDeclarationKind +}; +typedef NSUInteger NSXMLNodeKind; + +// initWithKind options +// NSXMLNodeOptionsNone +// NSXMLNodePreserveAll +// NSXMLNodePreserveNamespaceOrder +// NSXMLNodePreserveAttributeOrder +// NSXMLNodePreserveEntities +// NSXMLNodePreservePrefixes +// NSXMLNodeIsCDATA +// NSXMLNodeExpandEmptyElement +// NSXMLNodeCompactEmptyElement +// NSXMLNodeUseSingleQuotes +// NSXMLNodeUseDoubleQuotes + +// Output options +// NSXMLNodePrettyPrint + +/** + * The most primitive unit in an XML document. + */ +@interface NSXMLNode : NSObject +{ +@protected + void *_handle; + NSXMLNodeKind _kind; + NSXMLNode *_parent; + NSUInteger _index; + id _objectValue; +} + +/** + * Creates and returns an attribute node with the specified name and value. + */ ++ (id) attributeWithName: (NSString*)name stringValue: (NSString*)stringValue; + +/** + * Creates and returns an attribute node with the specified + * (fully qualified) name, namespace URI, and value. + */ ++ (id) attributeWithName: (NSString*)name + URI: (NSString*)URI + stringValue: (NSString*)stringValue; + +/** + * Creates and returns a comment node with the supplied text. + */ ++ (id) commentWithStringValue: (NSString*)stringValue; + +/** Creates and returns an empty document ... convenience method. + */ ++ (id) document; + +/** + * Creates and returns a new document intialised with the supplied root + * node. + */ ++ (id) documentWithRootElement: (NSXMLElement*)element; + +/** + * Creates and returns a DTD node from the supplied string. + * The node might describe element, attribute, entity, or notation. + */ ++ (id) DTDNodeWithXMLString: (NSString*)string; + +/** + * Creates and returns a node node with the specified name. + */ ++ (id) elementWithName: (NSString*)name; + +/** + * Creates and returns a node containing the supplied child nodes and with + * the attribute nodes from the supplied array. + */ ++ (id) elementWithName: (NSString*)name + children: (NSArray*)children + attributes: (NSArray*)attributes; + +/** + * Creates and returns a node with the supplied (fully qualified name) + * an namespace URI. + */ ++ (id) elementWithName: (NSString*)name URI: (NSString*)URI; + +/** + * Creates and returns a node with the pecified name and with a single + * text node (containing string) as its content. + */ ++ (id) elementWithName: (NSString*)name stringValue: (NSString*)string; + +/** Strips any leading namespace prefix from name and returns the result. + */ ++ (NSString*) localNameForName: (NSString*)name; + +/** + * Creates and returns a node mapping the supplkied namespace name to + * the string value (URI). + */ ++ (id) namespaceWithName: (NSString*)name stringValue: (NSString*)stringValue; + +/** Returns the namespace node corresponding to a predefined namespace names + * (one of xml, xs, or xsi) + */ ++ (NSXMLNode*) predefinedNamespaceForPrefix: (NSString*)name; + +/** Returns the namespace prefix of name. + */ ++ (NSString*) prefixForName: (NSString*)name; + +/** + * Creates and return a processinc insruction node with th specified name + * and textual value. + */ ++ (id) processingInstructionWithName: (NSString*)name + stringValue: (NSString*)stringValue; + +/** + * Creates and returns a simple text node. + */ ++ (id) textWithStringValue: (NSString*)stringValue; + + +/** Returns the canonical form (see http://www.w3.org/TR/xml-c14n) of the + * receiveri as long as the NSXMLNodePreserveWhitespace has been set. + * If the option as not been set, return the same without white space + * preserved. + */ +- (NSString*) canonicalXMLStringPreservingComments: (BOOL)comments; + +/** Returns the child node if the receiver at the specified index. + */ +- (NSXMLNode*) childAtIndex: (NSUInteger)index; + +/** Returns the number of immediate child nodes of the receiver.
+ * This method is more efficient than getting the array of children + * and counting it. + */ +- (NSUInteger) childCount; + +/** Returns n array containing the immediate child nodes of the receiver. + */ +- (NSArray*) children; + +/** Detaches the receiver from its parent node. + */ +- (void) detach; + +/** Return the index of the receiver within its parent node. + */ +- (NSUInteger) index; + +/** Initialises the receiver as a specific kind of node.
+ * Calls -initWithKind:options: using NSXMLNodeOptionsNone and + * returns the result. + */ +- (id) initWithKind: (NSXMLNodeKind)kind; + +/** + * Initialises the receiver as the specified kind of node and with the + * specified options. + */ +- (id) initWithKind: (NSXMLNodeKind)kind options: (NSUInteger)options; + +/** Return the level of the receiver within the tree of nodes.
+ * A document or a node which is not inside another is at level 0. + */ +- (NSUInteger) level; + +/** Returns the name of the receiver without any namespace prefix. + */ +- (NSString*) localName; + +/** + * Returns the kind of node represented by the receiver. + */ +- (NSXMLNodeKind) kind; + +/** Returns the name of the receiver. + */ +- (NSString*) name; + +/** Returns the next node in the tree. + */ +- (NSXMLNode*) nextNode; + +/** Returns the next sibling of the receiver + */ +- (NSXMLNode*) nextSibling; + +/** Returns the nodes resulting from applying xpath to the receiver.
+ * Before using xpath on a tree, you must call the + * -normalizeAdjacentTextNodesPreservingCDATA: with NO as the argument, + * in order to avoid problems where the xpath syntax cannot cope with + * multiple text nodes. + */ +- (NSArray*) nodesForXPath: (NSString*)xpath error: (NSError**)error; + +/** Returns the data resulting from calling the query on the receiver.
+ * The same as objectsForXQuery:constants:error: without the constants. + */ +- (NSArray*) objectsForXQuery: (NSString*)xquery error: (NSError**)error; + +/** Returns the data resulting from calling the query on the receiver.
+ * Before using xpath on a tree, you must call the + * -normalizeAdjacentTextNodesPreservingCDATA: with NO as the argument, + * in order to avoid problems where the xpath syntax cannot cope with + * multiple text nodes.
+ * The value of constants is a dictionary of constants declared + * to be "external" in the query.
+ * The resulting array amy contain array, data, date, number, string, + * and URL objects as well as nodes. + */ +- (NSArray*) objectsForXQuery: (NSString*)xquery + constants: (NSDictionary*)constants + error: (NSError**)error; + +/** + * Returns the object value of the receiver (as set using -setObjectValue:) + * or nil if there is none. + */ +- (id) objectValue; + +/** + * Returns the parent node of the receiver or nil if the receiver is not + * within another node. + */ +- (NSXMLNode*) parent; + +/** Returns the namepsace prefix for the receiver or nil if there is no + * namespace prefix. + */ +- (NSString*) prefix; + +/** Returns the previous node in the tree ... stepping through the tree + * backwards. + */ +- (NSXMLNode*) previousNode; + +/* Returns the previous sibling of the receiver. + */ +- (NSXMLNode*) previousSibling; + +/** Returns the document containing the receiver, or nil if the receiver + * does not lie within a document. + */ +- (NSXMLDocument*) rootDocument; + +/** Sets the name of the receiver. + */ +- (void) setName: (NSString*)name; + +/** Sets the content of the receiver, removing any existing children + * (including comments and processing instructions).
+ * For an element node, this sets text contetn within the node. + */ +- (void) setObjectValue: (id)value; + +/** + * Sets the content of the receiver to be the supplied string value ... + * which involves removing existing content, comments, + * and processing instructions.
+ * If the receiver is an element node, this creates a text node containing + * the string value as the sole child of the receiver. + */ +- (void) setStringValue: (NSString*)string; + +/** + * Sets the string content of the receiver.
+ * if the resolve flag is YES then any entities which can be resolved are + * replaced by the resolved versions. + */ +- (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve; + +/** Sets the URI of the receiver. + */ +- (void) setURI: (NSString*)URI; + +/** Returns the string value of the receiver. For kinds of node which have + * direct string content, this simply returns that content. For elements + * this recursively traverses the children of the receiver appending the + * text of each child to a single string result. + */ +- (NSString*) stringValue; + +/** Returns the URI of the receiver. + */ +- (NSString*) URI; + +/** Returns the XPath string to access the receiver with the document. + */ +- (NSString*) XPath; + +/** + * Returns the text of the receiver as XML (ie in the form it would have + * in an XML document). + */ +- (NSString*) XMLString; + +/** + * Returns the text of the receiver as XML (ie in the form it would have + * in an XML document), with the specified options controlling it. + */ +- (NSString*) XMLStringWithOptions: (NSUInteger)options; + +@end + +#if defined(__cplusplus) +} +#endif + +#endif /*__NSXMLNode_h_GNUSTEP_BASE_INCLUDE */ diff --git a/Headers/Foundation/NSXMLNodeOptions.h b/Headers/Foundation/NSXMLNodeOptions.h new file mode 100644 index 000000000..7d338fb62 --- /dev/null +++ b/Headers/Foundation/NSXMLNodeOptions.h @@ -0,0 +1,134 @@ +/* Interface for NSXMLNodeOptions for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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. +*/ + +#ifndef __NSXMLNodeOptions_h_GNUSTEP_BASE_INCLUDE +#define __NSXMLNodeOptions_h_GNUSTEP_BASE_INCLUDE +#import + +#import + +#if defined(__cplusplus) +extern "C" { +#endif + +/** This enumeration is a bitmask specifying input and output options + * for nnode. + * + * NSXMLNodeIsCDATA + * Indicates that a text node is CDATA + * NSXMLNodeExpandEmptyElement + * The element should be expanded when empty, + * eg <elementname></elementname>. + * For some reason MacOS-X specifies this as the default setting. + * NSXMLNodeCompactEmptyElement + * This element should be compact when empty, + * eg <elementname/> + * NSXMLNodeUseSingleQuotes + * Use single quotes on this attribute or namespace + * NSXMLNodeUseDoubleQuotes + * Use double quotes on this attribute or namespace. + * MacOS-X specifies this as the default setting. + * NSXMLNodeOptionsNone + * Use the default options for this node + * NSXMLNodePreserveAll + * Turn all preservation options on + * NSXMLNodePreserveNamespaceOrder + * Preserve the order of namespaces + * NSXMLNodePreserveAttributeOrder + * Preserve the order of attributes + * NSXMLNodePreserveEntities + * Entities should not be resolved on output + * NSXMLNodePreservePrefixes + * Prefixes should not be chosen based on closest URI definition + * NSXMLNodePreserveCDATA + * CDATA should be preserved + * NSXMLNodePreserveEmptyElements + * Remember whether an empty element was expanded or compact + * NSXMLNodePreserveQuotes + * Remember whether an attribute used single or double quotes + * NSXMLNodePreserveWhitespace + * Preserve non-content whitespace + * NSXMLNodePreserveDTD + * Preserve the DTD until it is modified + * NSXMLDocumentTidyHTML + * Try to change HTML into valid XHTML + * NSXMLDocumentTidyXML + * Try to change malformed XML into valid XML + * NSXMLDocumentValidate + * Validate this document against its DTD + * NSXMLNodePrettyPrint + * Output this node in a readable format + * NSXMLDocumentIncludeContentTypeDeclaration + * Include a content type declaration for HTML or XHTML + */ + +enum { + NSXMLNodeOptionsNone = 0, + + NSXMLNodeIsCDATA = 1 << 0, + NSXMLNodeExpandEmptyElement = 1 << 1, + NSXMLNodeCompactEmptyElement = 1 << 2, + NSXMLNodeUseSingleQuotes = 1 << 3, + NSXMLNodeUseDoubleQuotes = 1 << 4, + + NSXMLDocumentTidyHTML = 1 << 9, + NSXMLDocumentTidyXML = 1 << 10, + + NSXMLDocumentValidate = 1 << 13, + + NSXMLDocumentXInclude = 1 << 16, + + NSXMLNodePrettyPrint = 1 << 17, + NSXMLDocumentIncludeContentTypeDeclaration = 1 << 18, + + NSXMLNodePreserveNamespaceOrder = 1 << 20, + NSXMLNodePreserveAttributeOrder = 1 << 21, + NSXMLNodePreserveEntities = 1 << 22, + NSXMLNodePreservePrefixes = 1 << 23, + NSXMLNodePreserveCDATA = 1 << 24, + NSXMLNodePreserveWhitespace = 1 << 25, + NSXMLNodePreserveDTD = 1 << 26, + NSXMLNodePreserveCharacterReferences = 1 << 27, + NSXMLNodePreserveEmptyElements = (NSXMLNodeCompactEmptyElement + | NSXMLNodeExpandEmptyElement), + NSXMLNodePreserveQuotes = (NSXMLNodeUseDoubleQuotes + | NSXMLNodeUseSingleQuotes), + NSXMLNodePreserveAll = ( NSXMLNodePreserveAttributeOrder + | NSXMLNodePreserveCDATA + | NSXMLNodePreserveCharacterReferences + | NSXMLNodePreserveDTD + | NSXMLNodePreserveEmptyElements + | NSXMLNodePreserveEntities + | NSXMLNodePreserveNamespaceOrder + | NSXMLNodePreservePrefixes + | NSXMLNodePreserveQuotes + | NSXMLNodePreserveWhitespace + | 0xFFF00000) // high 12 bits +}; + +#if defined(__cplusplus) +} +#endif + +#endif /*__NSXMLNodeOptions_h_GNUSTEP_BASE_INCLUDE */ diff --git a/Headers/Foundation/NSZone.h b/Headers/Foundation/NSZone.h index 6b9ac0e63..fa0e8d29b 100644 --- a/Headers/Foundation/NSZone.h +++ b/Headers/Foundation/NSZone.h @@ -237,7 +237,7 @@ GSAtomicMallocZone (void); * NB. making a pointer weak does not mean that it is automatically * zeroed when the object it points to is garbage collected. To get that * behavior you must asign values to the pointer using the - * GSAssignZeroingWeakPointer() function. + * GSAssignZeroingWeakPointer() function.
* This function has no effect if the system is * not built for garbage collection. */ diff --git a/Source/DocMakefile b/Source/DocMakefile index 1973f2c6d..c32f2639b 100644 --- a/Source/DocMakefile +++ b/Source/DocMakefile @@ -122,6 +122,12 @@ NSURLResponse.h \ NSUserDefaults.h \ NSValue.h \ NSValueTransformer.h \ +NSXMLDocument.h \ +NSXMLDTD.h \ +NSXMLDTDNode.h \ +NSXMLElement.h \ +NSXMLNode.h \ +NSXMLNodeOptions.h \ NSXMLParser.h \ NSZone.h diff --git a/Source/GNUmakefile b/Source/GNUmakefile index 243b75a9f..c0dda2f6c 100644 --- a/Source/GNUmakefile +++ b/Source/GNUmakefile @@ -265,6 +265,11 @@ NSURLHandle.m \ NSUserDefaults.m \ NSValue.m \ NSValueTransformer.m \ +NSXMLDocument.m \ +NSXMLDTD.m \ +NSXMLDTDNode.m \ +NSXMLElement.m \ +NSXMLNode.m \ NSXMLParser.m \ NSZone.m \ externs.m \ @@ -404,6 +409,12 @@ NSUserDefaults.h \ NSUtilities.h \ NSValue.h \ NSValueTransformer.h \ +NSXMLDocument.h \ +NSXMLDTD.h \ +NSXMLDTDNode.h \ +NSXMLElement.h \ +NSXMLNode.h \ +NSXMLNodeOptions.h \ NSXMLParser.h \ NSZone.h diff --git a/Source/NSArray.m b/Source/NSArray.m index b3390123e..3688506b6 100644 --- a/Source/NSArray.m +++ b/Source/NSArray.m @@ -1673,11 +1673,22 @@ compare(id elem1, id elem2, void* context) [self subclassResponsibility: _cmd]; } -/** Not implemented +/** Replaces the values in the receiver at the locations given by the + * indexes set with values from the objects array. */ - (void) replaceObjectsAtIndexes: (NSIndexSet *)indexes withObjects: (NSArray *)objects { + NSUInteger index = [indexes firstIndex]; + NSEnumerator *enumerator = [objects objectEnumerator]; + id object = [enumerator nextObject]; + + while (object != nil && index != NSNotFound) + { + [self replaceObjectAtIndex: index withObject: object]; + object = [enumerator nextObject]; + index = [indexes indexGreaterThanIndex: index]; + } } /** @@ -1721,10 +1732,23 @@ compare(id elem1, id elem2, void* context) [self subclassResponsibility: _cmd]; } -/** Not implemented +/** Inserts the values from the objects array into the receiver at the + * locations given by the indexes set.
+ * The values are inserted in the same order that they appear in the + * array. */ - (void) insertObjects: (NSArray *)objects atIndexes: (NSIndexSet *)indexes { + NSUInteger index = [indexes firstIndex]; + NSEnumerator *enumerator = [objects objectEnumerator]; + id object = [enumerator nextObject]; + + while (object != nil && index != NSNotFound) + { + [self insertObject: object atIndex: index]; + object = [enumerator nextObject]; + index = [indexes indexGreaterThanIndex: index]; + } } /** diff --git a/Source/NSNetServices.m b/Source/NSNetServices.m index 144cad953..c50a3d7af 100644 --- a/Source/NSNetServices.m +++ b/Source/NSNetServices.m @@ -2341,6 +2341,7 @@ static void DNSSD_API - (void) publishWithOptions: (NSNetServiceOptions)options { + [self notImplemented: _cmd]; } /** diff --git a/Source/NSURLCache.m b/Source/NSURLCache.m index c97056280..01cdc1071 100644 --- a/Source/NSURLCache.m +++ b/Source/NSURLCache.m @@ -159,11 +159,13 @@ static NSURLCache *shared = nil; - (void) setDiskCapacity: (unsigned)diskCapacity { + [self notImplemented: _cmd]; // FIXME } - (void) setMemoryCapacity: (unsigned)memoryCapacity { + [self notImplemented: _cmd]; // FIXME } diff --git a/Source/NSXMLDTD.m b/Source/NSXMLDTD.m new file mode 100644 index 000000000..3f2930f8a --- /dev/null +++ b/Source/NSXMLDTD.m @@ -0,0 +1,168 @@ +/* Inmplementation for NSXMLDTD for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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 "NSXMLPrivate.h" + +@implementation NSXMLDTD + ++ (NSXMLDTDNode*) predefinedEntityDeclarationForName: (NSString*)name +{ + [self notImplemented: _cmd]; + return nil; +} + +- (void) dealloc +{ + [_name release]; + [_publicID release]; + [_systemID release]; + [_children release]; + [_entities release]; + [_elements release]; + [_notations release]; + [_attributes release]; + [_original release]; + [super dealloc]; +} + +- (void) addChild: (NSXMLNode*)child +{ + [self notImplemented: _cmd]; +} + +- (NSXMLDTDNode*) attributeDeclarationForName: (NSString*)name + elementName: (NSString*)elementName +{ + [self notImplemented: _cmd]; + return nil; +} + +- (NSXMLDTDNode*) elementDeclarationForName: (NSString*)name +{ + [self notImplemented: _cmd]; + return nil; +} + +- (NSXMLDTDNode*) entityDeclarationForName: (NSString*)name +{ + [self notImplemented: _cmd]; + return nil; +} + +- (id) initWithContentsOfURL: (NSURL*)url + options: (NSUInteger)mask + error: (NSError**)error +{ + NSData *data; + NSXMLDTD *doc; + + data = [NSData dataWithContentsOfURL: url]; + doc = [self initWithData: data options: 0 error: 0]; + [doc setURI: [url absoluteString]]; + return doc; +} + +- (id) initWithData: (NSData*)data + options: (NSUInteger)mask + error: (NSError**)error +{ + [self notImplemented: _cmd]; + return nil; +} + +- (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index +{ + [self notImplemented: _cmd]; + _childrenHaveMutated = YES; +} + +- (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index +{ + NSEnumerator *enumerator = [children objectEnumerator]; + NSXMLNode *child; + + while ((child = [enumerator nextObject]) != nil) + { + [self insertChild: child atIndex: index++]; + } +} + +- (NSXMLDTDNode*) notationDeclarationForName: (NSString*)name +{ + NSXMLDTDNode *notation = [_notations objectForKey: name]; + + if (notation == nil) + { + [self notImplemented: _cmd]; + } + return notation; +} + +- (NSString*) publicID +{ + if (_publicID == nil) + { + [self notImplemented: _cmd]; + } + return _publicID; +} + +- (void) removeChildAtIndex: (NSUInteger)index +{ + [self notImplemented: _cmd]; +} + +- (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)node +{ + [self notImplemented: _cmd]; +} + +- (void) setChildren: (NSArray*)children +{ + [self notImplemented: _cmd]; +} + +- (void) setPublicID: (NSString*)publicID +{ + [self notImplemented: _cmd]; + _modified = YES; +} + +- (void) setSystemID: (NSString*)systemID +{ + [self notImplemented: _cmd]; + _modified = YES; +} + +- (NSString*) systemID +{ + if (_systemID == nil) + { + [self notImplemented: _cmd]; + } + return _systemID; +} + +@end + diff --git a/Source/NSXMLDTDNode.m b/Source/NSXMLDTDNode.m new file mode 100644 index 000000000..2817c7d09 --- /dev/null +++ b/Source/NSXMLDTDNode.m @@ -0,0 +1,111 @@ +/* Implementation for NSXMLDTDNode for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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. +*/ + +#import "NSXMLPrivate.h" + +@implementation NSXMLDTDNode + +- (void) dealloc +{ + [_name release]; + [_notationName release]; + [_publicID release]; + [_systemID release]; + [super dealloc]; +} + +- (NSXMLDTDNodeKind) DTDKind +{ + return _DTDKind; +} + +- (id) initWithXMLString: (NSString*)string +{ + [self notImplemented: _cmd]; + return nil; +} + +- (BOOL) isExternal +{ + if (_systemID != nil) + { +// FIXME ... libxml integration? + return YES; + } + return NO; +} + +- (NSString*) notationName +{ + if (_notationName == nil) + { + [self notImplemented: _cmd]; + } + return _notationName; +} + +- (NSString*) publicID +{ + if (_publicID == nil) + { + [self notImplemented: _cmd]; + } + return _publicID; +} + +- (void) setDTDKind: (NSXMLDTDNodeKind)kind +{ + _DTDKind = kind; + // FIXME ... libxml integration? +} + +- (void) setNotationName: (NSString*)notationName +{ + ASSIGNCOPY(_notationName, notationName); + // FIXME ... libxml integration? +} + +- (void) setPublicID: (NSString*)publicID +{ + ASSIGNCOPY(_publicID, publicID); + // FIXME ... libxml integration? +} + +- (void) setSystemID: (NSString*)systemID +{ + ASSIGNCOPY(_systemID, systemID); + // FIXME ... libxml integration? +} + +- (NSString*) systemID +{ + if (_systemID == nil) + { + [self notImplemented: _cmd]; + } + return _systemID; +} + +@end + diff --git a/Source/NSXMLDocument.m b/Source/NSXMLDocument.m new file mode 100644 index 000000000..b7cb3c267 --- /dev/null +++ b/Source/NSXMLDocument.m @@ -0,0 +1,248 @@ +/* Implementation for NSXMLDocument for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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 "NSXMLPrivate.h" + +@implementation NSXMLDocument + ++ (Class) replacementClassForClass: (Class)cls +{ + return Nil; +} + +- (void) dealloc +{ + [_encoding release]; + [_version release]; + [_docType release]; + [_children release]; + [_URI release]; + [_MIMEType release]; + [super dealloc]; +} + +- (NSString*) characterEncoding +{ + return _encoding; +} + +- (NSXMLDocumentContentKind) documentContentKind +{ + return _contentKind; +} + +- (NSXMLDTD*) DTD +{ + return _docType; +} + +- (id) initWithContentsOfURL: (NSURL*)url + options: (NSUInteger)mask + error: (NSError**)error +{ + NSData *data; + NSXMLDocument *doc; + + data = [NSData dataWithContentsOfURL: url]; + doc = [self initWithData: data options: 0 error: 0]; + [doc setURI: [url absoluteString]]; + return doc; +} + + +- (id) initWithData: (NSData*)data + options: (NSUInteger)mask + error: (NSError**)error +{ + [self notImplemented: _cmd]; + _children = [NSMutableArray new]; + return nil; +} + +- (id) initWithRootElement: (NSXMLElement*)element +{ + self = [self initWithData: nil options: 0 error: 0]; + [self setRootElement: (NSXMLNode*)element]; + return self; +} + +- (id) initWithXMLString: (NSString*)string + options: (NSUInteger)mask + error: (NSError**)error +{ + [self notImplemented: _cmd]; + return nil; +} + +- (BOOL) isStandalone +{ + return _standalone; +} + +- (NSString*) MIMEType +{ + return _MIMEType; +} + +- (NSXMLElement*) rootElement +{ + return _rootElement; +} + +- (void) setCharacterEncoding: (NSString*)encoding +{ + ASSIGNCOPY(_encoding, encoding); +} + +- (void) setDocumentContentKind: (NSXMLDocumentContentKind)kind +{ + _contentKind = kind; +} + +- (void) setDTD: (NSXMLDTD*)documentTypeDeclaration +{ + ASSIGNCOPY(_docType, documentTypeDeclaration); +} + +- (void) setMIMEType: (NSString*)MIMEType +{ + ASSIGNCOPY(_MIMEType, MIMEType); +} + +- (void) setRootElement: (NSXMLNode*)root +{ + NSAssert(_rootElement == nil, NSGenericException); + [self insertChild: root atIndex: [_children count]]; + _rootElement = (NSXMLElement*)root; +} + +- (void) setStandalone: (BOOL)standalone +{ + _standalone = standalone; +} + +- (void) setVersion: (NSString*)version +{ + if ([version isEqualToString: @"1.0"] || [version isEqualToString: @"1.1"]) + { + ASSIGNCOPY(_version, version); + } + else + { + [NSException raise: NSInvalidArgumentException + format: @"Bad XML version (%@)", version]; + } +} + +- (NSString*) version +{ + return _version; +} + +- (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index +{ + [self notImplemented: _cmd]; +} + +- (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index +{ + NSEnumerator *enumerator = [children objectEnumerator]; + NSXMLNode *node; + + while ((node = [enumerator nextObject]) != nil) + { + [self insertChild: node atIndex: index++]; + } +} + +- (void) removeChildAtIndex: (NSUInteger)index +{ + [self notImplemented: _cmd]; +} + +- (void) setChildren: (NSArray*)children +{ + unsigned count; + + while ((count = [_children count]) > 0) + { + [self removeChildAtIndex: count - 1]; + } + [self insertChildren: children atIndex: 0]; +} + +- (void) addChild: (NSXMLNode*)child +{ + [self insertChild: child atIndex: [_children count]]; +} + +- (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)node +{ + [self removeChildAtIndex: index]; + [self insertChild: node atIndex: index]; +} + +- (NSData*) XMLData +{ + return [self XMLDataWithOptions: NSXMLNodeOptionsNone]; +} + +- (NSData*) XMLDataWithOptions: (NSUInteger)options +{ + [self notImplemented: _cmd]; + return nil; +} + +- (id) objectByApplyingXSLT: (NSData*)xslt + arguments: (NSDictionary*)arguments + error: (NSError**)error +{ + [self notImplemented: _cmd]; + return nil; +} + +- (id) objectByApplyingXSLTString: (NSString*)xslt + arguments: (NSDictionary*)arguments + error: (NSError**)error +{ + [self notImplemented: _cmd]; + return nil; +} + +- (id) objectByApplyingXSLTAtURL: (NSURL*)xsltURL + arguments: (NSDictionary*)argument + error: (NSError**)error +{ + [self notImplemented: _cmd]; + return nil; +} + +- (BOOL) validateAndReturnError: (NSError**)error +{ + [self notImplemented: _cmd]; + return NO; +} + +@end + diff --git a/Source/NSXMLElement.m b/Source/NSXMLElement.m new file mode 100644 index 000000000..1578c8511 --- /dev/null +++ b/Source/NSXMLElement.m @@ -0,0 +1,215 @@ +/* Implementation for NSXMLElement for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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. +*/ + +#import "NSXMLPrivate.h" + +@implementation NSXMLElement + +- (void) dealloc +{ + [_name release]; + [_attributes release]; + [_namespaces release]; + [_children release]; + [_URI release]; + [super dealloc]; +} + +- (id) initWithName: (NSString*)name +{ + return [self initWithName: name URI: nil]; +} + +- (id) initWithName: (NSString*)name URI: (NSString*)URI +{ + [self notImplemented: _cmd]; + return nil; +} + +- (id) initWithName: (NSString*)name stringValue: (NSString*)string +{ + [self notImplemented: _cmd]; + return nil; +} + +- (id) initWithXMLString: (NSString*)string error: (NSError**)error +{ + [self notImplemented: _cmd]; + return nil; +} + +- (NSArray*) elementsForName: (NSString*)name +{ + [self notImplemented: _cmd]; + return nil; +} + +- (NSArray*) elementsForLocalName: (NSString*)localName URI: (NSString*)URI +{ + [self notImplemented: _cmd]; + return nil; +} + +- (void) addAttribute: (NSXMLNode*)attribute +{ + [self notImplemented: _cmd]; +} + +- (void) removeAttributeForName: (NSString*)name +{ + [self notImplemented: _cmd]; +} + +- (void) setAttributes: (NSArray*)attributes +{ + NSEnumerator *enumerator = [attributes objectEnumerator]; + NSXMLNode *attribute; + + while ((attribute = [enumerator nextObject]) != nil) + { + [self addAttribute: attribute]; + } +} + +- (void) setAttributesAsDictionary: (NSDictionary*)attributes +{ + [self notImplemented: _cmd]; +} + +- (NSArray*) attributes +{ + if (_attributes == nil) + { + [self notImplemented: _cmd]; + } + return _attributes; +} + +- (NSXMLNode*) attributeForName: (NSString*)name +{ + NSEnumerator *enumerator = [[self attributes] objectEnumerator]; + NSXMLNode *attribute; + + while ((attribute = [enumerator nextObject]) != nil) + { + if ([name isEqualToString: [attribute name]] == YES) + { + return attribute; + } + } + return nil; +} + +- (NSXMLNode*) attributeForLocalName: (NSString*)localName + URI: (NSString*)URI +{ + [self notImplemented: _cmd]; + return nil; +} + +- (void) addNamespace: (NSXMLNode*)aNamespace +{ + [self notImplemented: _cmd]; +} + +- (void) removeNamespaceForPrefix: (NSString*)name +{ + [self notImplemented: _cmd]; +} + +- (void) setNamespaces: (NSArray*)namespaces +{ + [self notImplemented: _cmd]; +} + +- (NSArray*) namespaces +{ + if (_namespaces == nil) + { + [self notImplemented: _cmd]; + } + return _namespaces; +} + +- (NSXMLNode*) namespaceForPrefix: (NSString*)name +{ + [self notImplemented: _cmd]; + return nil; +} + +- (NSXMLNode*) resolveNamespaceForName: (NSString*)name +{ + [self notImplemented: _cmd]; + return nil; +} + +- (NSString*) resolvePrefixForNamespaceURI: (NSString*)namespaceURI +{ + [self notImplemented: _cmd]; + return nil; +} + +- (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index +{ + [self notImplemented: _cmd]; +} + +- (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index +{ + NSEnumerator *enumerator = [children objectEnumerator]; + NSXMLNode *child; + + while ((child = [enumerator nextObject]) != nil) + { + [self insertChild: child atIndex: index++]; + } +} + +- (void) removeChildAtIndex: (NSUInteger)index +{ + [self notImplemented: _cmd]; +} + +- (void) setChildren: (NSArray*)children +{ + [self notImplemented: _cmd]; +} + +- (void) addChild: (NSXMLNode*)child +{ + [self notImplemented: _cmd]; +} + +- (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)node +{ + [self notImplemented: _cmd]; +} + +- (void) normalizeAdjacentTextNodesPreservingCDATA: (BOOL)preserve +{ + [self notImplemented: _cmd]; +} + +@end + diff --git a/Source/NSXMLNode.m b/Source/NSXMLNode.m new file mode 100644 index 000000000..714e67b0c --- /dev/null +++ b/Source/NSXMLNode.m @@ -0,0 +1,370 @@ +/* Implementation for NSXMLNode for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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 "NSXMLPrivate.h" + +@implementation NSXMLNode + ++ (id) attributeWithName: (NSString*)name + stringValue: (NSString*)stringValue +{ + NSXMLNode *n; + + n = [[[self alloc] initWithKind: NSXMLAttributeKind] autorelease]; + [n setStringValue: stringValue]; + return n; +} + ++ (id) attributeWithName: (NSString*)name + URI: (NSString*)URI + stringValue: (NSString*)stringValue +{ + NSXMLNode *n; + + n = [[[self alloc] initWithKind: NSXMLAttributeKind] autorelease]; + [n setURI: URI]; + [n setStringValue: stringValue]; + return n; +} + ++ (id) commentWithStringValue: (NSString*)stringValue +{ + NSXMLNode *n; + + n = [[[self alloc] initWithKind: NSXMLCommentKind] autorelease]; + [n setStringValue: stringValue]; + return n; +} + ++ (id) DTDNodeWithXMLString: (NSString*)string +{ + NSXMLNode *n; + + n = [[[self alloc] initWithKind: NSXMLDTDKind] autorelease]; + [n setStringValue: string]; + return n; +} + ++ (id) document +{ + NSXMLNode *n; + + n = [[[NSXMLDocument alloc] initWithKind:NSXMLDocumentKind] autorelease]; + return n; +} + ++ (id) documentWithRootElement: (NSXMLElement*)element +{ + NSXMLDocument *d; + + d = [NSXMLDocument alloc]; + d = [[d initWithRootElement: element] autorelease]; + return d; +} + ++ (id) elementWithName: (NSString*)name +{ + NSXMLNode *n; + + n = [[[NSXMLElement alloc] initWithName: name] autorelease]; + return n; +} + ++ (id) elementWithName: (NSString*)name + children: (NSArray*)children + attributes: (NSArray*)attributes +{ + NSXMLElement *e = [self elementWithName: name]; + + [e insertChildren: children atIndex: 0]; + [e setAttributes: attributes]; + return e; +} + ++ (id) elementWithName: (NSString*)name + URI: (NSString*)URI +{ + NSXMLNode *n; + + n = [[[NSXMLElement alloc] initWithName: name URI: URI] autorelease]; + return n; +} + ++ (id) elementWithName: (NSString*)name + stringValue: (NSString*)string +{ + NSXMLElement *e; + NSXMLNode *t; + + e = [self elementWithName: name]; + t = [[self alloc] initWithKind: NSXMLTextKind]; + [t setStringValue: string]; + [e addChild: t]; + [t release]; + return e; +} + ++ (NSString*) localNameForName: (NSString*)name +{ + return [self notImplemented: _cmd]; +} + ++ (id) namespaceWithName: (NSString*)name + stringValue: (NSString*)stringValue +{ + NSXMLNode *n; + + n = [[[self alloc] initWithKind: NSXMLNamespaceKind] autorelease]; + [n setStringValue: stringValue]; + return n; +} + ++ (NSXMLNode*) predefinedNamespaceForPrefix: (NSString*)name +{ + return [self notImplemented: _cmd]; +} + ++ (NSString*) prefixForName: (NSString*)name +{ + return [self notImplemented: _cmd]; +} + ++ (id) processingInstructionWithName: (NSString*)name + stringValue: (NSString*)stringValue +{ + NSXMLNode *n; + + n = [[[self alloc] initWithKind: NSXMLProcessingInstructionKind] autorelease]; + [n setStringValue: stringValue]; + return n; +} + ++ (id) textWithStringValue: (NSString*)stringValue +{ + NSXMLNode *n; + + n = [[[self alloc] initWithKind: NSXMLTextKind] autorelease]; + [n setStringValue: stringValue]; + return n; +} + +- (NSString*) canonicalXMLStringPreservingComments: (BOOL)comments +{ + return [self notImplemented: _cmd]; // FIXME ... generate from libxml +} + +- (NSXMLNode*) childAtIndex: (NSUInteger)index +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (NSUInteger) childCount +{ + [self notImplemented: _cmd]; // FIXME ... fetch from libxml + return 0; +} + +- (NSArray*)children +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (id) copyWithZone: (NSZone*)zone +{ + return [self notImplemented: _cmd]; +} + +- (void) dealloc +{ + [self detach]; + [_objectValue release]; + [super dealloc]; +} + +- (void) detach +{ + if (_parent != nil) + { + [self notImplemented: _cmd]; // FIXME ... remove from libxml + } +} + +- (NSUInteger) index +{ + return _index; +} + +- (id) initWithKind:(NSXMLNodeKind) kind +{ + self = [self initWithKind: kind options: 0]; + return self; +} + +- (id) initWithKind: (NSXMLNodeKind)kind options: (NSUInteger)options +{ + if ((self = [super init]) != nil) + { + [self notImplemented: _cmd]; // FIXME ... use libxml + } + return self; +} + +- (NSXMLNodeKind) kind +{ + return _kind; +} + +- (NSUInteger) level +{ + NSUInteger level = 0; + NSXMLNode *tmp = _parent; + + while (tmp != nil) + { + level++; + tmp = tmp->_parent; + } + return level; +} + +- (NSString*) localName +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (NSString*) name +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (NSXMLNode*) nextNode +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (NSXMLNode*) nextSibling +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (id) objectValue +{ + return _objectValue; +} + +- (NSXMLNode*) parent +{ + return _parent; +} + +- (NSString*) prefix +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (NSXMLNode*) previousNode +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (NSXMLNode*) previousSibling +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (NSXMLDocument*) rootDocument +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (NSString*) stringValue +{ + // FIXME + return _objectValue; +} + +- (NSString*) URI +{ + return [self notImplemented: _cmd]; // FIXME ... fetch from libxml +} + +- (NSString*) XMLString +{ + return [self XMLStringWithOptions: 0]; +} + +- (NSString*) XMLStringWithOptions: (NSUInteger)options +{ + return [self notImplemented: _cmd]; // FIXME ... generate from libxml +} + +- (void) setObjectValue: (id)value +{ + ASSIGN(_objectValue, value); +} + +- (void) setName: (NSString*)name +{ + [self notImplemented: _cmd]; // FIXME ... set in libxml +} + +- (void) setStringValue: (NSString*)string +{ + [self setStringValue: string resolvingEntities: NO]; +} + +- (void) setURI: (NSString*)URI +{ + [self notImplemented: _cmd]; // FIXME ... set in libxml +} + +- (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve +{ + [self notImplemented: _cmd]; // FIXME ... set in libxml +} + +- (NSString*) XPath +{ + return [self notImplemented: _cmd]; +} + + - (NSArray*) nodesForXPath: (NSString*)xpath error: (NSError**)error +{ + return [self notImplemented: _cmd]; +} + + - (NSArray*) objectsForXQuery: (NSString*)xquery + constants: (NSDictionary*)constants + error: (NSError**)error +{ + return [self notImplemented: _cmd]; +} + +- (NSArray*) objectsForXQuery: (NSString*)xquery error: (NSError**)error +{ + return [self notImplemented: _cmd]; +} + +@end + diff --git a/Source/NSXMLPrivate.h b/Source/NSXMLPrivate.h new file mode 100644 index 000000000..6cab6163e --- /dev/null +++ b/Source/NSXMLPrivate.h @@ -0,0 +1,71 @@ +/* Private header for libxml2 wrapping components + Copyright (C) 2009 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: Februrary 2009 + + 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 Lesser General Public + License as published by the Free Software Foundation; either + version 3 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 Lesser 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. +*/ + +#ifndef _INCLUDED_NSXMLPRIVATE_H +#define _INCLUDED_NSXMLPRIVATE_H + +#include "config.h" +#include "GNUstepBase/preface.h" +#import "Foundation/NSArray.h" +#import "Foundation/NSData.h" +#import "Foundation/NSDebug.h" +#import "Foundation/NSDictionary.h" +#import "Foundation/NSEnumerator.h" +#import "Foundation/NSException.h" +#import "Foundation/NSString.h" +#import "Foundation/NSURL.h" +#import "Foundation/NSXMLNode.h" +#import "Foundation/NSXMLDocument.h" +#import "Foundation/NSXMLDTDNode.h" +#import "Foundation/NSXMLDTD.h" +#import "Foundation/NSXMLElement.h" + +#ifdef HAVE_LIBXML + +/* Avoid problems on systems where the xml headers use 'id' + */ +#define id GSXMLID + +/* libxml headers */ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_LIBXSLT +#include +#include +#include +#include +#endif /* HAVE_LIBXSLT */ + +#undef id + +#endif /* HAVE_LIBXML */ + +#endif