2 Copyright (C) 2004 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 #include "xmlj_error.h"
41 #include "xmlj_node.h"
43 #include "xmlj_util.h"
45 #include <sys/types.h>
61 /* Prototypes for local functions */
64 xmljAddAttribute (xmlNodePtr node
, xmlAttrPtr attr
);
67 xmljHashScanner (void *payload
, void *vdata
, xmlChar
*name
);
70 xmljGetNodeValue (xmlNodePtr node
);
73 * Determines whether a child node is suitable for insertion in the list of
74 * children for a given parent node.
75 * Returns 0 on success, a DOMException code otherwise.
78 xmljValidateChildNode (JNIEnv
*env
, xmlNodePtr parent
, xmlNodePtr child
)
82 if (child
== NULL
|| parent
== NULL
)
84 xmljThrowDOMException (env
, 8, NULL
); /* NOT_FOUND_ERR */
87 if (child
->doc
!= parent
->doc
)
89 xmljThrowDOMException (env
, 4, NULL
); /* WRONG_DOCUMENT_ERR */
92 /* Check that new parent is of an allowed type */
95 case XML_CDATA_SECTION_NODE
:
96 case XML_COMMENT_NODE
:
99 case XML_ENTITY_REF_NODE
:
100 case XML_NOTATION_NODE
:
102 /* these can't have any children */
103 /* HIERARCHY_REQUEST_ERR */
104 xmljThrowDOMException (env
, 3, "parent type does not allow children");
106 case XML_ATTRIBUTE_NODE
:
107 if (child
->type
!= XML_TEXT_NODE
&&
108 child
->type
!= XML_ENTITY_REF_NODE
)
110 /* HIERARCHY_REQUEST_ERR */
111 xmljThrowDOMException (env
, 3, "attributes may only contain text or entity reference nodes");
115 case XML_DOCUMENT_FRAG_NODE
:
116 case XML_ELEMENT_NODE
:
117 if (child
->type
== XML_DTD_NODE
||
118 child
->type
== XML_DOCUMENT_TYPE_NODE
||
119 child
->type
== XML_ENTITY_NODE
||
120 child
->type
== XML_NOTATION_NODE
||
121 child
->type
== XML_PI_NODE
)
123 /* HIERARCHY_REQUEST_ERR */
124 xmljThrowDOMException (env
, 3, "parent type does not allow child of this type");
129 if (child
->type
== XML_ATTRIBUTE_NODE
||
130 child
->type
== XML_DOCUMENT_NODE
||
131 child
->type
== XML_DOCUMENT_FRAG_NODE
)
133 /* HIERARCHY_REQUEST_ERR */
134 xmljThrowDOMException (env
, 3, "node type may not be a child");
139 /* Check that new parent is not self or an ancestor */
140 for (cur
= parent
; cur
!= NULL
; cur
= cur
->parent
)
144 /* HIERARCHY_REQUEST_ERR */
145 xmljThrowDOMException (env
, 3, "child cannot be an ancestor of itself");
149 /* Check that new parent does not add a second doctype or root element
150 * to a document parent */
151 if (parent
->type
== XML_DOCUMENT_NODE
)
153 cur
= parent
->children
;
156 if (cur
->type
== XML_DTD_NODE
||
157 cur
->type
== XML_DOCUMENT_TYPE_NODE
||
158 (cur
->type
== XML_ELEMENT_NODE
&&
159 parent
->type
== XML_DOCUMENT_NODE
))
161 if (child
->type
== cur
->type
&& child
!= cur
)
163 /* HIERARCHY_REQUEST_ERR */
164 xmljThrowDOMException (env
, 3, "cannot add a second doctype or root element");
174 * Adds the specified attribute node to the list of attributes for the given
178 xmljAddAttribute (xmlNodePtr node
, xmlAttrPtr attr
)
180 xmlAttrPtr cur
= node
->properties
;
184 node
->properties
= attr
;
188 attr
->doc
= node
->doc
;
192 while (cur
->next
!= NULL
)
200 attr
->doc
= node
->doc
;
204 /* -- GnomeAttr -- */
206 JNIEXPORT jboolean JNICALL
207 Java_gnu_xml_libxmlj_dom_GnomeAttr_getSpecified (JNIEnv
* env
, jobject self
)
211 attr
= (xmlAttrPtr
) xmljGetNodeID (env
, self
);
212 return (attr
->atype
!= 0);
215 JNIEXPORT jstring JNICALL
216 Java_gnu_xml_libxmlj_dom_GnomeAttr_getValue (JNIEnv
* env
, jobject self
)
222 node
= xmljGetNodeID (env
, self
);
223 text
= xmlNodeGetContent (node
);
224 ret
= xmljNewString (env
, (const xmlChar
*) text
);
232 JNIEXPORT
void JNICALL
233 Java_gnu_xml_libxmlj_dom_GnomeAttr_setValue (JNIEnv
* env
,
234 jobject self
, jstring value
)
237 const xmlChar
*s_value
;
239 node
= xmljGetNodeID (env
, self
);
240 s_value
= xmljGetStringChars (env
, value
);
241 xmlNodeSetContent (node
, s_value
);
244 JNIEXPORT jboolean JNICALL
245 Java_gnu_xml_libxmlj_dom_GnomeAttr_xmljIsId (JNIEnv
* env
, jobject self
)
249 attr
= (xmlAttrPtr
) xmljGetNodeID (env
, self
);
250 return (attr
->atype
== XML_ATTRIBUTE_ID
);
253 /* -- GnomeDocument -- */
255 JNIEXPORT
void JNICALL
256 Java_gnu_xml_libxmlj_dom_GnomeDocument_free (JNIEnv
* env
,
258 __attribute__ ((__unused__
)),
263 doc
= (xmlDocPtr
) xmljAsPointer (env
, id
);
264 xmljFreeDoc (env
, doc
);
268 JNIEXPORT jobject JNICALL
269 Java_gnu_xml_libxmlj_dom_GnomeDocument_getDoctype (JNIEnv
* env
, jobject self
)
274 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
275 dtd
= doc
->extSubset
;
278 dtd
= doc
->intSubset
;
280 return xmljGetNodeInstance (env
, (xmlNodePtr
) dtd
);
283 JNIEXPORT jobject JNICALL
284 Java_gnu_xml_libxmlj_dom_GnomeDocument_getDocumentElement (JNIEnv
* env
,
289 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
290 return xmljGetNodeInstance (env
, xmlDocGetRootElement (doc
));
293 JNIEXPORT jobject JNICALL
294 Java_gnu_xml_libxmlj_dom_GnomeDocument_createDocumentType (JNIEnv
* env
,
303 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
304 dtd
= xmlNewDtd (doc
,
305 xmljGetStringChars (env
, name
),
306 xmljGetStringChars (env
, publicId
),
307 xmljGetStringChars (env
, systemId
));
308 return xmljGetNodeInstance (env
, (xmlNodePtr
) dtd
);
311 JNIEXPORT jobject JNICALL
312 Java_gnu_xml_libxmlj_dom_GnomeDocument_createDocumentFragment (JNIEnv
* env
,
317 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
318 return xmljGetNodeInstance (env
, xmlNewDocFragment (doc
));
321 JNIEXPORT jobject JNICALL
322 Java_gnu_xml_libxmlj_dom_GnomeDocument_createTextNode (JNIEnv
* env
,
328 const xmlChar
*s_data
;
330 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
331 s_data
= xmljGetStringChars (env
, data
);
332 text
= xmlNewDocText (doc
, s_data
);
333 return xmljGetNodeInstance (env
, text
);
336 JNIEXPORT jobject JNICALL
337 Java_gnu_xml_libxmlj_dom_GnomeDocument_createComment (JNIEnv
* env
,
343 const xmlChar
*s_data
;
345 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
346 s_data
= xmljGetStringChars (env
, data
);
347 comment
= xmlNewDocComment (doc
, s_data
);
348 return xmljGetNodeInstance (env
, comment
);
351 JNIEXPORT jobject JNICALL
352 Java_gnu_xml_libxmlj_dom_GnomeDocument_createCDATASection (JNIEnv
* env
,
358 const xmlChar
*s_data
;
361 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
362 s_data
= xmljGetStringChars (env
, data
);
363 len
= xmlStrlen (s_data
);
364 cdata
= xmlNewCDataBlock (doc
, s_data
, len
);
365 return xmljGetNodeInstance (env
, cdata
);
368 JNIEXPORT jobject JNICALL
369 Java_gnu_xml_libxmlj_dom_GnomeDocument_createProcessingInstruction (JNIEnv
*
380 const xmlChar
*s_target
;
381 const xmlChar
*s_data
;
383 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
384 s_target
= xmljGetStringChars (env
, target
);
385 s_data
= xmljGetStringChars (env
, data
);
386 pi
= xmlNewPI (s_target
, s_data
);
388 return xmljGetNodeInstance (env
, pi
);
391 JNIEXPORT jobject JNICALL
392 Java_gnu_xml_libxmlj_dom_GnomeDocument_createEntityReference (JNIEnv
* env
,
398 const xmlChar
*s_name
;
400 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
401 s_name
= xmljGetStringChars (env
, name
);
402 ref
= xmlNewReference (doc
, s_name
);
403 return xmljGetNodeInstance (env
, ref
);
406 JNIEXPORT jobject JNICALL
407 Java_gnu_xml_libxmlj_dom_GnomeDocument_xmljImportNode (JNIEnv
* env
,
409 jobject importedNode
,
415 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
416 node
= xmljGetNodeID (env
, importedNode
);
419 xmljThrowDOMException (env
, 8, NULL
); /* NOT_FOUND_ERR */
422 if (node
->type
== XML_DOCUMENT_NODE
||
423 node
->type
== XML_DOCUMENT_TYPE_NODE
)
425 xmljThrowDOMException (env
, 9, NULL
); /* NOT_SUPPORTED_ERR */
428 node
= xmlDocCopyNode (node
, doc
, deep
);
429 return xmljGetNodeInstance (env
, node
);
432 JNIEXPORT jobject JNICALL
433 Java_gnu_xml_libxmlj_dom_GnomeDocument_createElementNS (JNIEnv
* env
,
441 const xmlChar
*s_uri
;
442 const xmlChar
*s_qName
;
443 const xmlChar
*s_prefix
;
444 const xmlChar
*s_localName
;
446 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
447 s_qName
= xmljGetStringChars (env
, qName
);
448 if (xmlValidateQName (s_qName
, 0))
450 xmljThrowDOMException (env
, 5, NULL
); /* INVALID_CHARACTER_ERR */
455 s_uri
= xmljGetStringChars (env
, uri
);
456 s_prefix
= xmljGetPrefix (s_qName
);
457 s_localName
= xmljGetLocalName (s_qName
);
458 ns
= xmlNewNs ((xmlNodePtr
) doc
, s_uri
, s_prefix
);
460 element
= xmlNewDocNode (doc
, ns
, s_qName
, NULL
);
461 return xmljGetNodeInstance (env
, element
);
464 JNIEXPORT jobject JNICALL
465 Java_gnu_xml_libxmlj_dom_GnomeDocument_createAttributeNS (JNIEnv
* env
,
473 const xmlChar
*s_uri
;
474 const xmlChar
*s_qName
;
475 const xmlChar
*s_prefix
;
476 const xmlChar
*s_localName
;
478 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
479 s_qName
= xmljGetStringChars (env
, qName
);
480 if (xmlValidateQName (s_qName
, 0))
482 xmljThrowDOMException (env
, 5, NULL
); /* INVALID_CHARACTER_ERR */
487 s_uri
= xmljGetStringChars (env
, uri
);
488 s_prefix
= xmljGetPrefix (s_qName
);
489 s_localName
= xmljGetLocalName (s_qName
);
490 ns
= xmlNewNs ((xmlNodePtr
) doc
, s_uri
, s_prefix
);
492 attr
= (xmlNodePtr
) xmlNewNsProp ((xmlNodePtr
) doc
, ns
, s_qName
, NULL
);
494 return xmljGetNodeInstance (env
, attr
);
497 JNIEXPORT jobject JNICALL
498 Java_gnu_xml_libxmlj_dom_GnomeDocument_xmljGetElementById (JNIEnv
* env
,
508 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
509 id
= xmljGetStringChars (env
, elementId
);
511 ctx
= xmlDocGetRootElement (doc
);
512 while (ctx
&& ctx
!= (xmlNodePtr
) doc
)
514 if (ctx
->type
== XML_ELEMENT_NODE
)
516 for (attr
= ctx
->properties
; attr
;
517 attr
= (xmlAttrPtr
) attr
->next
)
519 if (xmlIsID (doc
, ctx
, attr
))
521 val
= xmlGetProp (ctx
, attr
->name
);
522 if (val
&& xmlStrEqual (id
, val
))
524 return xmljGetNodeInstance (env
, ctx
);
560 JNIEXPORT jstring JNICALL
561 Java_gnu_xml_libxmlj_dom_GnomeDocument_getInputEncoding (JNIEnv
* env
,
566 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
569 return xmljNewString (env
, doc
->encoding
);
571 switch (doc
->charset
)
573 case XML_CHAR_ENCODING_ASCII
:
574 return xmljNewString (env
, BAD_CAST
"US-ASCII");
575 case XML_CHAR_ENCODING_UTF16LE
:
576 return xmljNewString (env
, BAD_CAST
"UTF-16LE");
577 case XML_CHAR_ENCODING_UTF16BE
:
578 return xmljNewString (env
, BAD_CAST
"UTF-16BE");
579 case XML_CHAR_ENCODING_8859_1
:
580 return xmljNewString (env
, BAD_CAST
"ISO-8859-1");
583 return xmljNewString (env
, BAD_CAST
"UTF-8");
587 JNIEXPORT jstring JNICALL
588 Java_gnu_xml_libxmlj_dom_GnomeDocument_getXmlEncoding (JNIEnv
* env
,
593 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
594 return (doc
->encoding
== NULL
) ?
595 xmljNewString (env
, BAD_CAST
"UTF-8") :
596 xmljNewString (env
, doc
->encoding
);
599 JNIEXPORT jboolean JNICALL
600 Java_gnu_xml_libxmlj_dom_GnomeDocument_getXmlStandalone (JNIEnv
* env
,
605 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
606 return doc
->standalone
;
609 JNIEXPORT
void JNICALL
610 Java_gnu_xml_libxmlj_dom_GnomeDocument_setXmlStandalone (JNIEnv
* env
,
612 jboolean xmlStandalone
)
616 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
617 doc
->standalone
= xmlStandalone
;
620 JNIEXPORT jstring JNICALL
621 Java_gnu_xml_libxmlj_dom_GnomeDocument_getXmlVersion (JNIEnv
* env
,
626 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
627 return (doc
->version
== NULL
) ?
628 xmljNewString (env
, BAD_CAST
"1.0") :
629 xmljNewString (env
, doc
->version
);
632 JNIEXPORT
void JNICALL
633 Java_gnu_xml_libxmlj_dom_GnomeDocument_setXmlVersion (JNIEnv
* env
,
639 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
640 if (xmlVersion
== NULL
)
646 const xmlChar
*version
= xmljGetStringChars (env
, xmlVersion
);
647 if (!xmlStrEqual (version
, BAD_CAST
"1.0") &&
648 !xmlStrEqual (version
, BAD_CAST
"1.1"))
650 xmljThrowDOMException (env
, 9, NULL
); /* NOT_SUPPORTED_ERR */
653 doc
->version
= version
;
657 JNIEXPORT jstring JNICALL
658 Java_gnu_xml_libxmlj_dom_GnomeDocument_getDocumentURI (JNIEnv
* env
,
663 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
664 return (doc
->name
== NULL
) ? NULL
:
665 xmljNewString (env
, (const xmlChar
*) doc
->URL
);
668 JNIEXPORT
void JNICALL
669 Java_gnu_xml_libxmlj_dom_GnomeDocument_setDocumentURI (JNIEnv
* env
,
675 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
676 if (documentURI
== NULL
)
682 doc
->URL
= xmljGetStringChars (env
, documentURI
);
686 JNIEXPORT jobject JNICALL
687 Java_gnu_xml_libxmlj_dom_GnomeDocument_xmljAdoptNode (JNIEnv
*env
,
694 doc
= (xmlDocPtr
) xmljGetNodeID (env
, self
);
695 node
= xmljGetNodeID (env
, jnode
);
699 xmljThrowDOMException (env
, 8, NULL
); /* NOT_FOUND_ERR */
702 if (node
->type
== XML_DOCUMENT_NODE
||
703 node
->type
== XML_DOCUMENT_TYPE_NODE
||
704 node
->type
== XML_ENTITY_NODE
||
705 node
->type
== XML_NOTATION_NODE
)
707 xmljThrowDOMException (env
, 9, NULL
); /* NOT_SUPPORTED_ERR */
710 xmlUnlinkNode (node
);
711 node
= xmlDocCopyNode (node
, doc
, 1);
712 return xmljGetNodeInstance (env
, node
);
715 JNIEXPORT jobject JNICALL
716 Java_gnu_xml_libxmlj_dom_GnomeDocument_renameNode (JNIEnv
* env
,
718 __attribute__ ((__unused__
)),
720 __attribute__ ((__unused__
)),
722 __attribute__ ((__unused__
)),
724 __attribute__ ((__unused__
)))
728 const xmlChar
*s_qName
;
730 const xmlChar
*prefix
;
733 node
= xmljGetNodeID (env
, n
);
736 xmljThrowDOMException (env
, 8, NULL
); /* NOT_FOUND_ERR */
739 s_qName
= xmljGetStringChars (env
, qName
);
740 if (xmlValidateQName (s_qName
, 0))
742 xmljThrowDOMException (env
, 5, NULL
); /* INVALID_CHARACTER_ERR */
745 xmlNodeSetName (node
, s_qName
);
747 href
= xmljGetStringChars (env
, namespaceURI
);
748 len
= (int *) malloc (sizeof (int));
749 prefix
= xmlSplitQName3 (s_qName
, len
);
755 ns
= xmlNewNs (node
, href
, prefix
);
762 /*xmlFreeNs (ns); FIXME this can segfault (?) */
765 ns
= xmlNewNs (node
, href
, prefix
);
773 /* -- GnomeDocumentBuilder -- */
775 JNIEXPORT jobject JNICALL
776 Java_gnu_xml_libxmlj_dom_GnomeDocumentBuilder_parseStream (JNIEnv
* env
,
795 doc
= xmljParseDocument(env
,
812 return xmljCreateDocument (env
, self
, doc
);
815 JNIEXPORT jobject JNICALL
816 Java_gnu_xml_libxmlj_dom_GnomeDocumentBuilder_createDocument
819 jstring namespaceURI
,
820 jstring qualifiedName
,
827 const xmlChar
*prefix
;
828 const xmlChar
*qName
;
830 qName
= xmljGetStringChars (env
, qualifiedName
);
831 href
= xmljGetStringChars (env
, namespaceURI
);
840 len
= (int *) malloc (sizeof (int));
841 prefix
= xmlSplitQName3 (qName
, len
);
845 /* Create the document node */
846 doc
= xmlNewDoc (BAD_CAST
"1.0");
855 const xmlChar
*publicId
;
856 const xmlChar
*systemId
;
857 const xmlChar
*internalSubset
;
860 cls
= (*env
)->FindClass (env
, "org/w3c/dom/DocumentType");
866 method
= (*env
)->GetMethodID (env
, cls
, "getName",
867 "()Ljava/lang/String;");
872 ret
= (jstring
) (*env
)->CallObjectMethod (env
, doctype
, method
);
873 name
= xmljGetStringChars (env
, ret
);
876 method
= (*env
)->GetMethodID (env
, cls
, "getPublicId",
877 "()Ljava/lang/String;");
882 ret
= (jstring
) (*env
)->CallObjectMethod (env
, doctype
, method
);
883 publicId
= xmljGetStringChars (env
, ret
);
886 method
= (*env
)->GetMethodID (env
, cls
, "getSystemId",
887 "()Ljava/lang/String;");
892 ret
= (jstring
) (*env
)->CallObjectMethod (env
, doctype
, method
);
893 systemId
= xmljGetStringChars (env
, ret
);
896 method
= (*env
)->GetMethodID (env
, cls
, "getInternalSubset",
897 "()Ljava/lang/String;");
902 ret
= (jstring
) (*env
)->CallObjectMethod (env
, doctype
, method
);
903 internalSubset
= xmljGetStringChars (env
, ret
);
907 if (internalSubset
== NULL
)
909 dtd
= xmlNewDtd (doc
, name
, publicId
, systemId
);
913 dtd
= xmlCreateIntSubset (doc
, name
, publicId
, systemId
);
914 /* TODO parse internal subset? */
915 xmljThrowDOMException (env
, 9, NULL
); /* NOT_SUPPORTED_ERR */
920 /* Create the root element */
921 root
= xmlNewNode (NULL
, qName
);
922 xmlDocSetRootElement (doc
, root
);
923 ns
= xmlNewNs (root
, href
, prefix
);
926 return xmljCreateDocument (env
, self
, doc
);
929 /* -- GnomeDocumentType -- */
931 JNIEXPORT jstring JNICALL
932 Java_gnu_xml_libxmlj_dom_GnomeDocumentType_getPublicId (JNIEnv
* env
,
937 dtd
= (xmlDtdPtr
) xmljGetNodeID (env
, self
);
938 return xmljNewString (env
, dtd
->ExternalID
);
941 JNIEXPORT jstring JNICALL
942 Java_gnu_xml_libxmlj_dom_GnomeDocumentType_getSystemId (JNIEnv
* env
,
947 dtd
= (xmlDtdPtr
) xmljGetNodeID (env
, self
);
948 return xmljNewString (env
, dtd
->SystemID
);
951 JNIEXPORT jstring JNICALL
952 Java_gnu_xml_libxmlj_dom_GnomeDocumentType_getInternalSubset (JNIEnv
* env
,
954 __attribute__ ((__unused__
)))
957 xmljThrowDOMException (env
, 9, NULL
); /* NOT_SUPPORTED_ERR */
961 /* -- GnomeElement -- */
963 JNIEXPORT jstring JNICALL
964 Java_gnu_xml_libxmlj_dom_GnomeElement_getAttribute (JNIEnv
* env
,
969 const xmlChar
*s_name
;
970 const xmlChar
*s_value
;
972 node
= xmljGetNodeID (env
, self
);
973 s_name
= xmljGetStringChars (env
, name
);
974 s_value
= xmlGetProp (node
, s_name
);
975 xmlFree ((xmlChar
*) s_name
);
976 return (s_value
== NULL
) ?
977 xmljNewString (env
, BAD_CAST
"") :
978 xmljNewString (env
, s_value
);
981 JNIEXPORT
void JNICALL
982 Java_gnu_xml_libxmlj_dom_GnomeElement_setAttribute (JNIEnv
* env
,
988 const xmlChar
*s_name
;
989 const xmlChar
*s_value
;
991 node
= xmljGetNodeID (env
, self
);
992 s_name
= xmljGetStringChars (env
, name
);
993 if (xmlValidateName (s_name
, 0))
995 xmljThrowDOMException (env
, 5, NULL
); /* INVALID_CHARACTER_ERR */
998 s_value
= xmljGetStringChars (env
, value
);
999 xmlSetProp (node
, s_name
, s_value
);
1002 JNIEXPORT jobject JNICALL
1003 Java_gnu_xml_libxmlj_dom_GnomeElement_getAttributeNode (JNIEnv
* env
,
1008 const xmlChar
*s_name
;
1011 node
= xmljGetNodeID (env
, self
);
1012 s_name
= xmljGetStringChars (env
, name
);
1013 attr
= xmlHasProp (node
, s_name
);
1018 xmlFree ((xmlChar
*) s_name
);
1019 return xmljGetNodeInstance (env
, (xmlNodePtr
) attr
);
1022 JNIEXPORT jobject JNICALL
1023 Java_gnu_xml_libxmlj_dom_GnomeElement_setAttributeNode (JNIEnv
* env
,
1028 xmlAttrPtr new_attr
;
1029 xmlAttrPtr old_attr
;
1031 node
= xmljGetNodeID (env
, self
);
1032 new_attr
= (xmlAttrPtr
) xmljGetNodeID (env
, newAttr
);
1033 if (new_attr
->parent
!= NULL
)
1035 xmljThrowDOMException (env
, 10, NULL
); /* INUSE_ATTRIBUTE_ERR */
1038 if (new_attr
->doc
!= node
->doc
)
1040 xmljThrowDOMException (env
, 4, NULL
); /* WRONG_DOCUMENT_ERR */
1043 old_attr
= xmlHasProp (node
, new_attr
->name
);
1046 xmlUnlinkNode ((xmlNodePtr
) old_attr
);
1048 xmljAddAttribute (node
, new_attr
);
1049 return xmljGetNodeInstance (env
, (xmlNodePtr
) old_attr
);
1052 JNIEXPORT jobject JNICALL
1053 Java_gnu_xml_libxmlj_dom_GnomeElement_removeAttributeNode (JNIEnv
* env
,
1055 __attribute__ ((__unused__
)),
1060 attr
= xmljGetNodeID (env
, oldAttr
);
1061 xmlUnlinkNode (attr
);
1065 JNIEXPORT jstring JNICALL
1066 Java_gnu_xml_libxmlj_dom_GnomeElement_getAttributeNS (JNIEnv
* env
,
1072 const xmlChar
*s_uri
;
1073 const xmlChar
*s_localName
;
1074 const xmlChar
*s_value
;
1076 node
= xmljGetNodeID (env
, self
);
1077 s_localName
= xmljGetStringChars (env
, localName
);
1080 s_value
= xmlGetNoNsProp (node
, s_localName
);
1084 s_uri
= xmljGetStringChars (env
, uri
);
1085 s_value
= xmlGetNsProp (node
, s_localName
, s_uri
);
1086 xmlFree ((xmlChar
*) s_uri
);
1088 xmlFree ((xmlChar
*) s_localName
);
1089 return (s_value
== NULL
) ?
1090 xmljNewString (env
, BAD_CAST
"") :
1091 xmljNewString (env
, s_value
);
1094 JNIEXPORT
void JNICALL
1095 Java_gnu_xml_libxmlj_dom_GnomeElement_setAttributeNS (JNIEnv
* env
,
1103 const xmlChar
*s_uri
;
1104 const xmlChar
*s_qName
;
1105 const xmlChar
*s_prefix
;
1106 const xmlChar
*s_localName
;
1107 const xmlChar
*s_value
;
1109 node
= xmljGetNodeID (env
, self
);
1110 s_qName
= xmljGetStringChars (env
, qName
);
1111 if (xmlValidateQName (s_qName
, 0))
1113 xmljThrowDOMException (env
, 5, NULL
); /* INVALID_CHARACTER_ERR */
1116 s_value
= xmljGetStringChars (env
, value
);
1119 xmlSetProp (node
, s_qName
, s_value
);
1123 s_prefix
= xmljGetPrefix (s_qName
);
1124 s_localName
= xmljGetLocalName (s_qName
);
1125 s_uri
= xmljGetStringChars (env
, uri
);
1126 ns
= xmlNewNs (node
, s_uri
, s_prefix
);
1127 xmlSetNsProp (node
, ns
, s_localName
, s_value
);
1131 JNIEXPORT jobject JNICALL
1132 Java_gnu_xml_libxmlj_dom_GnomeElement_getAttributeNodeNS (JNIEnv
* env
,
1139 const xmlChar
*s_uri
;
1140 const xmlChar
*s_localName
;
1142 node
= xmljGetNodeID (env
, self
);
1143 attr
= node
->properties
;
1144 s_uri
= xmljGetStringChars (env
, uri
);
1145 s_localName
= xmljGetStringChars (env
, localName
);
1146 while (attr
!= NULL
)
1150 if (xmljMatch (s_localName
, (xmlNodePtr
) attr
))
1155 if (xmljMatchNS (s_uri
, s_localName
, (xmlNodePtr
) attr
))
1160 xmlFree ((xmlChar
*) s_uri
);
1161 xmlFree ((xmlChar
*) s_localName
);
1162 return xmljGetNodeInstance (env
, (xmlNodePtr
) attr
);
1165 JNIEXPORT jobject JNICALL
1166 Java_gnu_xml_libxmlj_dom_GnomeElement_setAttributeNodeNS (JNIEnv
* env
,
1171 xmlAttrPtr new_attr
;
1172 xmlAttrPtr old_attr
;
1175 node
= xmljGetNodeID (env
, self
);
1176 new_attr
= (xmlAttrPtr
) xmljGetNodeID (env
, newAttr
);
1177 if (new_attr
->parent
!= NULL
)
1179 xmljThrowDOMException (env
, 10, NULL
); /* INUSE_ATTRIBUTE_ERR */
1182 if (new_attr
->doc
!= node
->doc
)
1184 xmljThrowDOMException (env
, 4, NULL
); /* WRONG_DOCUMENT_ERR */
1187 uri
= (new_attr
->ns
!= NULL
) ? new_attr
->ns
->href
: NULL
;
1188 old_attr
= xmlHasNsProp (node
, new_attr
->name
, uri
);
1191 xmlUnlinkNode ((xmlNodePtr
) old_attr
);
1193 xmljAddAttribute (node
, new_attr
);
1194 return xmljGetNodeInstance (env
, (xmlNodePtr
) old_attr
);
1197 JNIEXPORT jboolean JNICALL
1198 Java_gnu_xml_libxmlj_dom_GnomeElement_hasAttribute (JNIEnv
* env
,
1203 const xmlChar
*s_name
;
1204 const xmlChar
*s_value
;
1206 node
= xmljGetNodeID (env
, self
);
1207 s_name
= xmljGetStringChars (env
, name
);
1208 s_value
= xmlGetProp (node
, s_name
);
1209 xmlFree ((xmlChar
*) s_name
);
1210 return (s_value
!= NULL
);
1213 JNIEXPORT jboolean JNICALL
1214 Java_gnu_xml_libxmlj_dom_GnomeElement_hasAttributeNS (JNIEnv
* env
,
1220 const xmlChar
*s_uri
;
1221 const xmlChar
*s_localName
;
1222 const xmlChar
*s_value
;
1224 node
= xmljGetNodeID (env
, self
);
1225 s_localName
= xmljGetStringChars (env
, localName
);
1228 s_value
= xmlGetNoNsProp (node
, s_localName
);
1232 s_uri
= xmljGetStringChars (env
, uri
);
1233 s_value
= xmlGetNsProp (node
, s_localName
, s_uri
);
1234 xmlFree ((xmlChar
*) s_uri
);
1236 xmlFree ((xmlChar
*) s_localName
);
1237 return (s_value
!= NULL
);
1240 /* -- GnomeEntity -- */
1242 JNIEXPORT jstring JNICALL
1243 Java_gnu_xml_libxmlj_dom_GnomeEntity_getPublicId (JNIEnv
* env
, jobject self
)
1245 xmlEntityPtr entity
;
1247 entity
= (xmlEntityPtr
) xmljGetNodeID (env
, self
);
1248 return xmljNewString (env
, entity
->ExternalID
);
1251 JNIEXPORT jstring JNICALL
1252 Java_gnu_xml_libxmlj_dom_GnomeEntity_getSystemId (JNIEnv
* env
, jobject self
)
1254 xmlEntityPtr entity
;
1256 entity
= (xmlEntityPtr
) xmljGetNodeID (env
, self
);
1257 return xmljNewString (env
, entity
->SystemID
);
1260 JNIEXPORT jstring JNICALL
1261 Java_gnu_xml_libxmlj_dom_GnomeEntity_getNotationName (JNIEnv
* env
,
1263 __attribute__ ((__unused__
)))
1266 xmljThrowDOMException (env
, 9, NULL
); /* NOT_SUPPORTED_ERR */
1270 /* -- GnomeNamedNodeMap -- */
1272 JNIEXPORT jobject JNICALL
1273 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_getNamedItem (JNIEnv
* env
,
1281 cls
= (*env
)->GetObjectClass (env
, self
);
1282 field
= (*env
)->GetFieldID (env
, cls
, "type", "I");
1283 type
= (*env
)->GetIntField (env
, self
, field
);
1289 attr
= xmljGetNamedItem (env
, self
, name
);
1290 return xmljGetNodeInstance (env
, (xmlNodePtr
) attr
);
1295 xmlHashTablePtr hash
;
1296 const xmlChar
*s_name
;
1299 dtd
= (xmlDtdPtr
) xmljGetNodeID (env
, self
);
1300 hash
= (xmlHashTablePtr
) ((type
== 1) ? dtd
->entities
: dtd
->notations
);
1305 s_name
= xmljGetStringChars (env
, name
);
1306 ret
= (xmlNodePtr
) xmlHashLookup (hash
, s_name
);
1307 xmlFree ((xmlChar
*) s_name
);
1308 return xmljGetNodeInstance (env
, ret
);
1312 JNIEXPORT jobject JNICALL
1313 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_setNamedItem (JNIEnv
* env
,
1323 cls
= (*env
)->GetObjectClass (env
, self
);
1324 field
= (*env
)->GetFieldID (env
, cls
, "type", "I");
1325 type
= (*env
)->GetIntField (env
, self
, field
);
1327 node
= xmljGetNodeID (env
, self
);
1328 argNode
= xmljGetNodeID (env
, arg
);
1330 if (argNode
->doc
!= node
->doc
)
1332 xmljThrowDOMException (env
, 4, NULL
); /* WRONG_DOCUMENT_ERR */
1334 xmljValidateChildNode (env
, node
, argNode
);
1335 if ((*env
)->ExceptionOccurred (env
))
1341 if (argNode
->parent
!= NULL
)
1343 xmljThrowDOMException (env
, 10, NULL
); /* INUSE_ATTRIBUTE_ERR */
1346 xmlAddChild (node
, argNode
);
1351 xmlHashTablePtr hash
;
1353 dtd
= (xmlDtdPtr
) xmljGetNodeID (env
, self
);
1354 hash
= (xmlHashTablePtr
) ((type
== 1) ? dtd
->entities
: dtd
->notations
);
1357 hash
= xmlHashCreate (10);
1360 dtd
->entities
= hash
;
1364 dtd
->notations
= hash
;
1367 xmlHashAddEntry (hash
, argNode
->name
, argNode
);
1372 JNIEXPORT jobject JNICALL
1373 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_removeNamedItem (JNIEnv
* env
,
1381 cls
= (*env
)->GetObjectClass (env
, self
);
1382 field
= (*env
)->GetFieldID (env
, cls
, "type", "I");
1383 type
= (*env
)->GetIntField (env
, self
, field
);
1389 attr
= xmljGetNamedItem (env
, self
, name
);
1392 xmljThrowDOMException (env
, 8, NULL
); /* NOT_FOUND_ERR */
1395 xmlUnlinkNode ((xmlNodePtr
) attr
);
1396 return xmljGetNodeInstance (env
, (xmlNodePtr
) attr
);
1401 xmlHashTablePtr hash
;
1402 const xmlChar
*s_name
;
1405 dtd
= (xmlDtdPtr
) xmljGetNodeID (env
, self
);
1406 hash
= (xmlHashTablePtr
) ((type
== 1) ? dtd
->entities
: dtd
->notations
);
1411 s_name
= xmljGetStringChars (env
, name
);
1412 ret
= (xmlNodePtr
) xmlHashLookup (hash
, s_name
);
1415 xmlHashRemoveEntry (hash
, s_name
, NULL
);
1417 xmlFree ((xmlChar
*) s_name
);
1418 return xmljGetNodeInstance (env
, ret
);
1423 xmljHashScanner (void *payload
, void *vdata
, xmlChar
*name
)
1425 xmljHashScanData
*data
;
1427 data
= (xmljHashScanData
*) vdata
;
1428 if (data
->count
<= data
->index
)
1430 data
->node
= (xmlNodePtr
) payload
;
1435 JNIEXPORT jobject JNICALL
1436 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_item (JNIEnv
* env
,
1437 jobject self
, jint index
)
1443 cls
= (*env
)->GetObjectClass (env
, self
);
1444 field
= (*env
)->GetFieldID (env
, cls
, "type", "I");
1445 type
= (*env
)->GetIntField (env
, self
, field
);
1453 node
= xmljGetNodeID (env
, self
);
1456 case XML_ELEMENT_NODE
:
1457 attr
= node
->properties
;
1458 for (count
= 0; attr
!= NULL
&& count
< index
; count
++)
1465 sprintf (msg
, "No attribute at index %d\n", (int) index
);
1466 xmljThrowException (env
, "java/lang/NullPointerException", msg
);
1469 return xmljGetNodeInstance (env
, (xmlNodePtr
) attr
);
1477 xmlHashTablePtr hash
;
1478 xmljHashScanData
*data
;
1481 dtd
= (xmlDtdPtr
) xmljGetNodeID (env
, self
);
1482 hash
= (xmlHashTablePtr
) ((type
== 1) ? dtd
->entities
: dtd
->notations
);
1487 data
= (xmljHashScanData
*) malloc (sizeof (xmljHashScanData
));
1492 data
->index
= index
;
1495 xmlHashScan (hash
, xmljHashScanner
, data
);
1498 return xmljGetNodeInstance (env
, ret
);
1502 JNIEXPORT jint JNICALL
1503 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_getLength (JNIEnv
* env
,
1510 cls
= (*env
)->GetObjectClass (env
, self
);
1511 field
= (*env
)->GetFieldID (env
, cls
, "type", "I");
1512 type
= (*env
)->GetIntField (env
, self
, field
);
1520 node
= xmljGetNodeID (env
, self
);
1523 case XML_ELEMENT_NODE
:
1525 attr
= node
->properties
;
1526 while (attr
!= NULL
)
1539 xmlHashTablePtr hash
;
1540 xmljHashScanData
*data
;
1543 dtd
= (xmlDtdPtr
) xmljGetNodeID (env
, self
);
1544 hash
= (xmlHashTablePtr
) ((type
== 1) ? dtd
->entities
: dtd
->notations
);
1549 data
= (xmljHashScanData
*) malloc (sizeof (xmljHashScanData
));
1557 xmlHashScan (hash
, xmljHashScanner
, data
);
1564 JNIEXPORT jobject JNICALL
1565 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_getNamedItemNS (JNIEnv
* env
,
1574 cls
= (*env
)->GetObjectClass (env
, self
);
1575 field
= (*env
)->GetFieldID (env
, cls
, "type", "I");
1576 type
= (*env
)->GetIntField (env
, self
, field
);
1582 attr
= xmljGetNamedItemNS (env
, self
, uri
, localName
);
1583 return xmljGetNodeInstance (env
, (xmlNodePtr
) attr
);
1591 JNIEXPORT jobject JNICALL
1592 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_setNamedItemNS (JNIEnv
* env
,
1596 return Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_setNamedItem (env
, self
,
1600 JNIEXPORT jobject JNICALL
1601 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_removeNamedItemNS (JNIEnv
* env
,
1611 cls
= (*env
)->GetObjectClass (env
, self
);
1612 field
= (*env
)->GetFieldID (env
, cls
, "type", "I");
1613 type
= (*env
)->GetIntField (env
, self
, field
);
1619 attr
= xmljGetNamedItemNS (env
, self
, uri
, localName
);
1622 xmljThrowDOMException (env
, 8, NULL
); /* NOT_FOUND_ERR */
1627 xmlUnlinkNode ((xmlNodePtr
) attr
);
1628 return xmljGetNodeInstance (env
, (xmlNodePtr
) attr
);
1637 /* -- GnomeNode -- */
1639 JNIEXPORT jstring JNICALL
1640 Java_gnu_xml_libxmlj_dom_GnomeNode_getNodeName (JNIEnv
* env
, jobject self
)
1644 node
= xmljGetNodeID (env
, self
);
1649 return xmljNewString (env
, node
->name
);
1653 xmljGetNodeValue (xmlNodePtr node
)
1655 /* If not character data, return null */
1659 case XML_CDATA_SECTION_NODE
:
1660 case XML_COMMENT_NODE
:
1661 case XML_ATTRIBUTE_NODE
:
1662 return xmlNodeGetContent (node
);
1668 JNIEXPORT jstring JNICALL
1669 Java_gnu_xml_libxmlj_dom_GnomeNode_getNodeValue (JNIEnv
* env
, jobject self
)
1675 node
= xmljGetNodeID (env
, self
);
1676 text
= xmljGetNodeValue (node
);
1677 ret
= xmljNewString (env
, (const xmlChar
*) text
);
1685 JNIEXPORT
void JNICALL
1686 Java_gnu_xml_libxmlj_dom_GnomeNode_setNodeValue (JNIEnv
* env
,
1691 const xmlChar
*s_nodeValue
;
1693 node
= xmljGetNodeID (env
, self
);
1695 /* If not character data, return */
1696 if (node
->type
!= XML_TEXT_NODE
&&
1697 node
->type
!= XML_CDATA_SECTION_NODE
&& node
->type
!= XML_COMMENT_NODE
)
1700 s_nodeValue
= xmljGetStringChars (env
, nodeValue
);
1701 xmlNodeSetContent (node
, s_nodeValue
);
1704 JNIEXPORT jshort JNICALL
1705 Java_gnu_xml_libxmlj_dom_GnomeNode_getNodeType (JNIEnv
* env
, jobject self
)
1709 node
= xmljGetNodeID (env
, self
);
1713 return XML_DOCUMENT_TYPE_NODE
;
1714 case XML_ATTRIBUTE_DECL
:
1715 return XML_ATTRIBUTE_NODE
;
1716 case XML_ENTITY_DECL
:
1717 return XML_ENTITY_NODE
;
1723 JNIEXPORT jobject JNICALL
1724 Java_gnu_xml_libxmlj_dom_GnomeNode_getParentNode (JNIEnv
* env
, jobject self
)
1728 node
= xmljGetNodeID (env
, self
);
1729 return xmljGetNodeInstance (env
, node
->parent
);
1732 JNIEXPORT jobject JNICALL
1733 Java_gnu_xml_libxmlj_dom_GnomeNode_getFirstChild (JNIEnv
* env
, jobject self
)
1737 node
= xmljGetNodeID (env
, self
);
1738 return xmljGetNodeInstance (env
, node
->children
);
1741 JNIEXPORT jobject JNICALL
1742 Java_gnu_xml_libxmlj_dom_GnomeNode_getLastChild (JNIEnv
* env
, jobject self
)
1746 node
= xmljGetNodeID (env
, self
);
1747 return xmljGetNodeInstance (env
, node
->last
);
1750 JNIEXPORT jobject JNICALL
1751 Java_gnu_xml_libxmlj_dom_GnomeNode_getPreviousSibling (JNIEnv
* env
,
1756 node
= xmljGetNodeID (env
, self
);
1757 return xmljGetNodeInstance (env
, node
->prev
);
1760 JNIEXPORT jobject JNICALL
1761 Java_gnu_xml_libxmlj_dom_GnomeNode_getNextSibling (JNIEnv
* env
, jobject self
)
1765 node
= xmljGetNodeID (env
, self
);
1766 return xmljGetNodeInstance (env
, node
->next
);
1769 JNIEXPORT jobject JNICALL
1770 Java_gnu_xml_libxmlj_dom_GnomeNode_getOwnerDocument (JNIEnv
* env
,
1775 node
= xmljGetNodeID (env
, self
);
1776 return xmljGetNodeInstance (env
, (xmlNodePtr
) node
->doc
);
1779 JNIEXPORT jobject JNICALL
1780 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljInsertBefore (JNIEnv
* env
,
1786 xmlNodePtr newChildNode
;
1787 xmlNodePtr refChildNode
;
1789 node
= xmljGetNodeID (env
, self
);
1790 newChildNode
= xmljGetNodeID (env
, newChild
);
1791 refChildNode
= xmljGetNodeID (env
, refChild
);
1793 /* Is refChildNode a child of this node? */
1794 if (refChildNode
== NULL
||
1795 refChildNode
->parent
== NULL
||
1796 refChildNode
->parent
!= node
)
1798 xmljThrowDOMException (env
, 8, NULL
); /* NOT_FOUND_ERR */
1801 /* Check new child */
1802 xmljValidateChildNode (env
, node
, newChildNode
);
1803 if ((*env
)->ExceptionOccurred (env
))
1808 newChildNode
= xmlAddPrevSibling (refChildNode
, newChildNode
);
1809 return xmljGetNodeInstance (env
, newChildNode
);
1812 JNIEXPORT jobject JNICALL
1813 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljReplaceChild (JNIEnv
* env
,
1819 xmlNodePtr newChildNode
;
1820 xmlNodePtr oldChildNode
;
1822 node
= xmljGetNodeID (env
, self
);
1823 newChildNode
= xmljGetNodeID (env
, newChild
);
1824 oldChildNode
= xmljGetNodeID (env
, oldChild
);
1826 /* Is oldChildNode a child of this node? */
1827 if (oldChildNode
== NULL
||
1828 oldChildNode
->parent
== NULL
||
1829 oldChildNode
->parent
!= node
)
1831 xmljThrowDOMException (env
, 8, NULL
); /* NOT_FOUND_ERR */
1834 /* Check new child */
1835 xmljValidateChildNode (env
, node
, newChildNode
);
1836 if ((*env
)->ExceptionOccurred (env
))
1841 newChildNode
= xmlReplaceNode (oldChildNode
, newChildNode
);
1842 return xmljGetNodeInstance (env
, newChildNode
);
1845 JNIEXPORT jobject JNICALL
1846 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljRemoveChild (JNIEnv
* env
,
1851 xmlNodePtr oldChildNode
;
1853 node
= xmljGetNodeID (env
, self
);
1854 oldChildNode
= xmljGetNodeID (env
, oldChild
);
1856 if (oldChildNode
== NULL
||
1857 oldChildNode
->parent
== NULL
||
1858 oldChildNode
->parent
!= node
)
1860 xmljThrowDOMException (env
, 8, NULL
); /* NOT_FOUND_ERR */
1863 xmlUnlinkNode (oldChildNode
);
1867 JNIEXPORT jobject JNICALL
1868 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljAppendChild (JNIEnv
* env
,
1873 xmlNodePtr newChildNode
;
1875 node
= xmljGetNodeID (env
, self
);
1876 newChildNode
= xmljGetNodeID (env
, newChild
);
1878 /* Check new child */
1879 xmljValidateChildNode (env
, node
, newChildNode
);
1880 if ((*env
)->ExceptionOccurred (env
))
1885 newChildNode
= xmlAddChild (node
, newChildNode
);
1886 return xmljGetNodeInstance (env
, newChildNode
);
1889 JNIEXPORT jboolean JNICALL
1890 Java_gnu_xml_libxmlj_dom_GnomeNode_hasChildNodes (JNIEnv
* env
, jobject self
)
1894 node
= xmljGetNodeID (env
, self
);
1895 return (node
->children
!= NULL
);
1898 JNIEXPORT jobject JNICALL
1899 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljCloneNode (JNIEnv
* env
,
1900 jobject self
, jboolean deep
)
1905 node
= xmljGetNodeID (env
, self
);
1906 clone
= xmlCopyNode (node
, deep
);
1907 clone
->parent
= NULL
;
1908 clone
->doc
= node
->doc
;
1909 return xmljGetNodeInstance (env
, clone
);
1912 JNIEXPORT
void JNICALL
1913 Java_gnu_xml_libxmlj_dom_GnomeNode_normalize (JNIEnv
* env
, jobject self
)
1917 node
= xmljGetNodeID (env
, self
);
1918 xmljNormalizeNode (node
);
1922 xmljNormalizeNode (xmlNodePtr node
)
1925 xmlNodePtr last
= NULL
;
1927 cur
= node
->children
;
1932 case XML_CDATA_SECTION_NODE
:
1934 if (xmlIsBlankNode (cur
))
1936 xmlNodePtr next
= cur
->next
;
1937 xmlUnlinkNode (cur
);
1944 last
= xmlTextMerge (last
, cur
);
1945 xmlUnlinkNode (cur
);
1956 xmljNormalizeNode (cur
);
1962 JNIEXPORT jstring JNICALL
1963 Java_gnu_xml_libxmlj_dom_GnomeNode_getNamespaceURI (JNIEnv
* env
,
1968 node
= xmljGetNodeID (env
, self
);
1969 if (node
->type
!= XML_ELEMENT_NODE
&&
1970 node
->type
!= XML_ATTRIBUTE_NODE
)
1974 if (node
->ns
== NULL
)
1978 return xmljNewString (env
, node
->ns
->href
);
1981 JNIEXPORT jstring JNICALL
1982 Java_gnu_xml_libxmlj_dom_GnomeNode_getPrefix (JNIEnv
* env
, jobject self
)
1986 node
= xmljGetNodeID (env
, self
);
1987 if (node
->type
!= XML_ELEMENT_NODE
&&
1988 node
->type
!= XML_ATTRIBUTE_NODE
)
1992 if (node
->ns
== NULL
)
1996 return xmljNewString (env
, node
->ns
->prefix
);
1999 JNIEXPORT
void JNICALL
2000 Java_gnu_xml_libxmlj_dom_GnomeNode_setPrefix (JNIEnv
* env
,
2001 jobject self
, jstring prefix
)
2004 const xmlChar
*s_prefix
;
2006 s_prefix
= xmljGetStringChars (env
, prefix
);
2007 if (xmlValidateName (s_prefix
, 0))
2009 xmljThrowDOMException (env
, 5, NULL
); /* INVALID_CHARACTER_ERR */
2011 node
= xmljGetNodeID (env
, self
);
2012 if (node
->type
!= XML_ELEMENT_NODE
&&
2013 node
->type
!= XML_ATTRIBUTE_NODE
)
2015 xmljThrowDOMException (env
, 3, NULL
); /* HIERARCHY_REQUEST_ERR */
2018 if (node
->ns
== NULL
)
2020 xmljThrowDOMException (env
, 14, NULL
); /* NAMESPACE_ERR */
2023 node
->ns
->prefix
= s_prefix
;
2026 JNIEXPORT jstring JNICALL
2027 Java_gnu_xml_libxmlj_dom_GnomeNode_getLocalName (JNIEnv
* env
, jobject self
)
2033 node
= xmljGetNodeID (env
, self
);
2034 if (node
->name
== NULL
)
2038 len
= (int *) malloc (sizeof (int));
2039 if (xmlSplitQName3 (node
->name
, len
) != NULL
)
2041 ret
= xmljNewString (env
, node
->name
+ (*len
));
2045 ret
= xmljNewString (env
, node
->name
);
2051 JNIEXPORT jboolean JNICALL
2052 Java_gnu_xml_libxmlj_dom_GnomeNode_hasAttributes (JNIEnv
* env
, jobject self
)
2056 node
= xmljGetNodeID (env
, self
);
2057 return (node
->properties
!= NULL
);
2060 JNIEXPORT jstring JNICALL
2061 Java_gnu_xml_libxmlj_dom_GnomeNode_getBaseURI (JNIEnv
* env
, jobject self
)
2067 node
= xmljGetNodeID (env
, self
);
2068 baseURI
= xmlNodeGetBase (node
->doc
, node
);
2069 ret
= xmljNewString (env
, (const xmlChar
*) baseURI
);
2070 if (baseURI
!= NULL
)
2077 JNIEXPORT jstring JNICALL
2078 Java_gnu_xml_libxmlj_dom_GnomeNode_lookupPrefix (JNIEnv
* env
, jobject self
,
2079 jstring namespaceURI
)
2084 const xmlChar
*s_uri
;
2086 node
= xmljGetNodeID (env
, self
);
2088 /* If this is a document node, search from the root element */
2089 if (node
->type
== XML_DOCUMENT_NODE
)
2091 doc
= (xmlDocPtr
) node
;
2092 node
= xmlDocGetRootElement (doc
);
2094 s_uri
= xmljGetStringChars (env
, namespaceURI
);
2095 ns
= xmlSearchNsByHref (doc
, node
, s_uri
);
2096 xmlFree ((xmlChar
*) s_uri
);
2101 return xmljNewString (env
, ns
->prefix
);
2104 JNIEXPORT jboolean JNICALL
2105 Java_gnu_xml_libxmlj_dom_GnomeNode_isDefaultNamespace (JNIEnv
* env
,
2107 jstring namespaceURI
)
2111 const xmlChar
*s_uri
;
2113 node
= xmljGetNodeID (env
, self
);
2114 s_uri
= xmljGetStringChars (env
, namespaceURI
);
2115 ns
= xmlSearchNsByHref (node
->doc
, node
, s_uri
);
2116 xmlFree ((xmlChar
*) s_uri
);
2121 return (ns
->prefix
== NULL
|| xmlStrlen (ns
->prefix
) == 0);
2124 JNIEXPORT jstring JNICALL
2125 Java_gnu_xml_libxmlj_dom_GnomeNode_lookupNamespaceURI (JNIEnv
* env
,
2132 const xmlChar
*s_prefix
;
2134 node
= xmljGetNodeID (env
, self
);
2136 /* If this is a document node, search from the root element */
2137 if (node
->type
== XML_DOCUMENT_NODE
)
2139 doc
= (xmlDocPtr
) node
;
2140 node
= xmlDocGetRootElement (doc
);
2142 s_prefix
= xmljGetStringChars (env
, prefix
);
2143 ns
= xmlSearchNs (doc
, node
, s_prefix
);
2144 xmlFree ((xmlChar
*) s_prefix
);
2149 return xmljNewString (env
, ns
->href
);
2152 JNIEXPORT jint JNICALL
2153 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljCompareTo (JNIEnv
* env
,
2157 xmlNodePtr n1
, n2
, x
;
2158 int d1
, d2
, delta
, c
;
2160 n1
= xmljGetNodeID (env
, self
);
2161 n2
= xmljGetNodeID (env
, other
);
2162 if (n1
->doc
!= n2
->doc
)
2166 if (n1
->type
== XML_ATTRIBUTE_NODE
|| n2
->type
== XML_ATTRIBUTE_NODE
)
2171 for (x
= n1
->parent
; x
&& x
->type
!= XML_DOCUMENT_NODE
; x
= x
->parent
)
2176 for (x
= n2
->parent
; x
&& x
->type
!= XML_DOCUMENT_NODE
; x
= x
->parent
)
2191 c
= xmljCompare (n1
, n2
);
2192 return (c
!= 0) ? c
: delta
;
2195 /* Compare at same level */
2197 xmljCompare (xmlNodePtr n1
, xmlNodePtr n2
)
2201 if (n1
->parent
== NULL
|| n1
->type
== XML_DOCUMENT_NODE
||
2202 n2
->parent
== NULL
|| n2
->type
== XML_DOCUMENT_NODE
||
2207 c
= xmljCompare (n1
->parent
, n2
->parent
);
2213 for (n1
= n1
->prev
; n1
; n1
= n1
->prev
)
2218 for (n2
= n2
->prev
; n2
; n2
= n2
->prev
)
2226 xmljIsEqualNodeList (xmlNodePtr node1
, xmlNodePtr node2
)
2228 while (node1
!= NULL
)
2230 if (!xmljIsEqualNode (node1
, node2
))
2234 node1
= node1
->next
;
2235 node2
= node2
->next
;
2241 xmljIsEqualNode (xmlNodePtr node1
, xmlNodePtr node2
)
2243 const xmlChar
*val1
;
2244 const xmlChar
*val2
;
2250 if (node1
== NULL
|| node2
== NULL
)
2254 /* Check node type */
2255 if (node1
->type
!= node2
->type
)
2259 /* Check node name */
2260 if (!xmlStrEqual (node1
->name
, node2
->name
))
2264 /* Check node namespace */
2265 if (node1
->type
== XML_ELEMENT_NODE
||
2266 node1
->type
== XML_ATTRIBUTE_NODE
)
2280 if (!xmlStrEqual (val1
, val2
))
2286 /* Check node value */
2287 val1
= xmljGetNodeValue (node1
);
2288 val2
= xmljGetNodeValue (node2
);
2289 if (!xmlStrEqual (val1
, val2
))
2293 /* Check attributes */
2294 if (node1
->type
== XML_ELEMENT_NODE
&&
2295 !xmljIsEqualNodeList ((xmlNodePtr
) node1
->properties
,
2296 (xmlNodePtr
) node2
->properties
))
2301 if (node1
->type
== XML_DOCUMENT_NODE
)
2303 xmlDocPtr doc1
= (xmlDocPtr
) node1
;
2304 xmlDocPtr doc2
= (xmlDocPtr
) node2
;
2306 if (!xmljIsEqualNode ((xmlNodePtr
) doc1
->intSubset
,
2307 (xmlNodePtr
) doc2
->intSubset
) ||
2308 !xmljIsEqualNode ((xmlNodePtr
) doc1
->extSubset
,
2309 (xmlNodePtr
) doc2
->extSubset
))
2314 /* Check child nodes */
2315 if (!xmljIsEqualNodeList (node1
->children
, node2
->children
))
2322 JNIEXPORT jboolean JNICALL
2323 Java_gnu_xml_libxmlj_dom_GnomeNode_isEqualNode (JNIEnv
* env
,
2330 node1
= xmljGetNodeID (env
, self
);
2331 node2
= xmljGetNodeID (env
, arg
);
2332 return xmljIsEqualNode (node1
, node2
);
2335 /* -- GnomeNodeList -- */
2337 JNIEXPORT jobject JNICALL
2338 Java_gnu_xml_libxmlj_dom_GnomeNodeList_item (JNIEnv
* env
,
2339 jobject self
, jint index
)
2344 node
= xmljGetNodeID (env
, self
);
2345 node
= node
->children
;
2347 for (count
= 0; node
!= NULL
&& count
< index
; count
++)
2351 return xmljGetNodeInstance (env
, node
);
2354 JNIEXPORT jint JNICALL
2355 Java_gnu_xml_libxmlj_dom_GnomeNodeList_getLength (JNIEnv
* env
, jobject self
)
2360 node
= xmljGetNodeID (env
, self
);
2362 node
= node
->children
;
2363 while (node
!= NULL
)
2371 /* -- GnomeNotation -- */
2373 JNIEXPORT jstring JNICALL
2374 Java_gnu_xml_libxmlj_dom_GnomeNotation_getPublicId (JNIEnv
* env
,
2377 xmlNotationPtr notation
;
2379 notation
= (xmlNotationPtr
) xmljGetNodeID (env
, self
);
2380 if (notation
->PublicID
== NULL
)
2384 return xmljNewString (env
, notation
->PublicID
);
2387 JNIEXPORT jstring JNICALL
2388 Java_gnu_xml_libxmlj_dom_GnomeNotation_getSystemId (JNIEnv
* env
,
2391 xmlNotationPtr notation
;
2393 notation
= (xmlNotationPtr
) xmljGetNodeID (env
, self
);
2394 if (notation
->SystemID
== NULL
)
2398 return xmljNewString (env
, notation
->SystemID
);
2401 /* -- GnomeProcessingInstruction -- */
2403 JNIEXPORT jstring JNICALL
2404 Java_gnu_xml_libxmlj_dom_GnomeProcessingInstruction_getData (JNIEnv
* env
,
2411 node
= xmljGetNodeID (env
, self
);
2412 text
= xmlNodeGetContent (node
);
2413 ret
= xmljNewString (env
, (const xmlChar
*) text
);
2421 JNIEXPORT
void JNICALL
2422 Java_gnu_xml_libxmlj_dom_GnomeProcessingInstruction_setData (JNIEnv
* env
,
2427 const xmlChar
*s_data
;
2429 node
= xmljGetNodeID (env
, self
);
2430 s_data
= xmljGetStringChars (env
, data
);
2431 xmlNodeSetContent (node
, s_data
);
2434 /* -- GnomeTypeInfo -- */
2436 xmlDtdPtr
xmljGetDtd (xmlDocPtr doc
)
2440 for (ctx
= doc
->children
; ctx
; ctx
= ctx
->next
)
2442 if (ctx
->type
== XML_DOCUMENT_TYPE_NODE
)
2444 return (xmlDtdPtr
) ctx
;
2450 JNIEXPORT jstring JNICALL
2451 Java_gnu_xml_libxmlj_dom_GnomeTypeInfo_getTypeName (JNIEnv
*env
, jobject self
)
2455 xmlAttributePtr attribute
;
2457 node
= xmljGetNodeID (env
, self
);
2458 dtd
= xmljGetDtd (node
->doc
);
2463 case XML_ATTRIBUTE_NODE
:
2464 attribute
= xmlGetDtdAttrDesc (dtd
, node
->parent
->name
, node
->name
);
2467 switch (attribute
->type
)
2469 case XML_ATTRIBUTE_CDATA
:
2470 return xmljNewString (env
, BAD_CAST
"CDATA");
2471 case XML_ATTRIBUTE_ID
:
2472 return xmljNewString (env
, BAD_CAST
"ID");
2473 case XML_ATTRIBUTE_IDREF
:
2474 return xmljNewString (env
, BAD_CAST
"IDREF");
2475 case XML_ATTRIBUTE_IDREFS
:
2476 return xmljNewString (env
, BAD_CAST
"IDREFS");
2477 case XML_ATTRIBUTE_ENTITY
:
2478 return xmljNewString (env
, BAD_CAST
"ENTITY");
2479 case XML_ATTRIBUTE_ENTITIES
:
2480 return xmljNewString (env
, BAD_CAST
"ENTITIES");
2481 case XML_ATTRIBUTE_NMTOKEN
:
2482 return xmljNewString (env
, BAD_CAST
"NMTOKEN");
2483 case XML_ATTRIBUTE_NMTOKENS
:
2484 return xmljNewString (env
, BAD_CAST
"NMTOKENS");
2494 /* TODO when XML Schema support is available */
2498 JNIEXPORT jstring JNICALL
2499 Java_gnu_xml_libxmlj_dom_GnomeTypeInfo_getTypeNamespace (JNIEnv
*env
,
2504 xmlAttributePtr attribute
;
2506 node
= xmljGetNodeID (env
, self
);
2507 dtd
= xmljGetDtd (node
->doc
);
2512 case XML_ATTRIBUTE_NODE
:
2513 attribute
= xmlGetDtdAttrDesc (dtd
, node
->parent
->name
, node
->name
);
2516 return xmljNewString (env
,
2517 BAD_CAST
"http://www.w3.org/TR/REC-xml");
2524 /* TODO when XML Schema support is available */
2528 JNIEXPORT jboolean JNICALL
2529 Java_gnu_xml_libxmlj_dom_GnomeTypeInfo_isDerivedFrom (JNIEnv
*env
2530 __attribute__ ((__unused__
)),
2532 __attribute__ ((__unused__
)),
2534 __attribute__ ((__unused__
)),
2536 __attribute__ ((__unused__
)),
2538 __attribute__ ((__unused__
)))
2540 /* TODO when XML Schema support is available */
2547 * Create GnomeDocument object from the given xmlDocPtr
2550 xmljCreateDocument (JNIEnv
* env
, jobject self
, xmlDocPtr doc
)
2561 /* Get document object */
2562 ret
= xmljGetNodeInstance (env
, (xmlNodePtr
) doc
);
2564 /* Set DOM implementation field */
2565 cls
= (*env
)->FindClass (env
, "gnu/xml/libxmlj/dom/GnomeDocument");
2566 field
= (*env
)->GetFieldID (env
, cls
, "dom",
2567 "Lorg/w3c/dom/DOMImplementation;");
2568 (*env
)->SetObjectField (env
, ret
, field
, self
);
2573 xmljGetNamedItem (JNIEnv
* env
, jobject self
, jstring name
)
2577 const xmlChar
*s_name
;
2579 s_name
= xmljGetStringChars (env
, name
);
2581 node
= xmljGetNodeID (env
, self
);
2582 attr
= node
->properties
;
2583 while (attr
!= NULL
)
2585 if (xmljMatch (s_name
, (xmlNodePtr
) attr
))
2589 xmlFree ((xmlChar
*) s_name
);
2595 xmljGetNamedItemNS (JNIEnv
* env
, jobject self
, jstring uri
, jstring localName
)
2599 const xmlChar
*s_uri
;
2600 const xmlChar
*s_localName
;
2602 s_uri
= xmljGetStringChars (env
, uri
);
2603 s_localName
= xmljGetStringChars (env
, localName
);
2605 node
= xmljGetNodeID (env
, self
);
2606 attr
= node
->properties
;
2607 while (attr
!= NULL
)
2609 if (xmljMatchNS (s_uri
, s_localName
, (xmlNodePtr
) attr
))
2613 xmlFree ((xmlChar
*) s_uri
);
2614 xmlFree ((xmlChar
*) s_localName
);