Dead
[official-gcc.git] / gomp-20050608-branch / libjava / classpath / native / jni / xmlj / xmlj_dom.c
blobb9bd372b17b305b860a24c056827f43ddb8881b7
1 /* xmlj_dom.c -
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)
9 any later version.
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
19 02110-1301 USA.
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
24 combination.
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. */
38 #include "xmlj_dom.h"
39 #include "xmlj_error.h"
40 #include "xmlj_io.h"
41 #include "xmlj_node.h"
42 #include "xmlj_sax.h"
43 #include "xmlj_util.h"
45 #include <sys/types.h>
46 #include <sys/stat.h>
47 #include <fcntl.h>
48 #include <unistd.h>
50 JNIEnv *dom_cb_env;
51 jobject dom_cb_obj;
53 typedef struct
55 int index;
56 int count;
57 xmlNodePtr node;
59 xmljHashScanData;
61 /* Prototypes for local functions */
63 void
64 xmljAddAttribute (xmlNodePtr node, xmlAttrPtr attr);
66 void
67 xmljHashScanner (void *payload, void *vdata, xmlChar *name);
69 xmlChar *
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.
77 void
78 xmljValidateChildNode (JNIEnv *env, xmlNodePtr parent, xmlNodePtr child)
80 xmlNodePtr cur;
82 if (child == NULL || parent == NULL)
84 xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
85 return;
87 if (child->doc != parent->doc)
89 xmljThrowDOMException (env, 4, NULL); /* WRONG_DOCUMENT_ERR */
90 return;
92 /* Check that new parent is of an allowed type */
93 switch (parent->type)
95 case XML_CDATA_SECTION_NODE:
96 case XML_COMMENT_NODE:
97 case XML_TEXT_NODE:
98 case XML_ENTITY_NODE:
99 case XML_ENTITY_REF_NODE:
100 case XML_NOTATION_NODE:
101 case XML_PI_NODE:
102 /* these can't have any children */
103 /* HIERARCHY_REQUEST_ERR */
104 xmljThrowDOMException (env, 3, "parent type does not allow children");
105 return;
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");
112 return;
114 break;
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");
125 return;
127 /* fall through */
128 default:
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");
135 return;
137 /* TODO others? */
139 /* Check that new parent is not self or an ancestor */
140 for (cur = parent; cur != NULL; cur = cur->parent)
142 if (cur == child)
144 /* HIERARCHY_REQUEST_ERR */
145 xmljThrowDOMException (env, 3, "child cannot be an ancestor of itself");
146 return;
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;
154 while (cur != NULL)
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");
165 return;
168 cur = cur->next;
174 * Adds the specified attribute node to the list of attributes for the given
175 * element.
177 void
178 xmljAddAttribute (xmlNodePtr node, xmlAttrPtr attr)
180 xmlAttrPtr cur = node->properties;
182 if (cur == NULL)
184 node->properties = attr;
185 attr->prev = NULL;
186 attr->next = NULL;
187 attr->parent = node;
188 attr->doc = node->doc;
190 else
192 while (cur->next != NULL)
194 cur = cur->next;
196 cur->next = attr;
197 attr->prev = cur;
198 attr->next = NULL;
199 attr->parent = node;
200 attr->doc = node->doc;
204 /* -- GnomeAttr -- */
206 JNIEXPORT jboolean JNICALL
207 Java_gnu_xml_libxmlj_dom_GnomeAttr_getSpecified (JNIEnv * env, jobject self)
209 xmlAttrPtr attr;
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)
218 xmlNodePtr node;
219 xmlChar *text;
220 jstring ret;
222 node = xmljGetNodeID (env, self);
223 text = xmlNodeGetContent (node);
224 ret = xmljNewString (env, (const xmlChar *) text);
225 if (text != NULL)
227 xmlFree (text);
229 return ret;
232 JNIEXPORT void JNICALL
233 Java_gnu_xml_libxmlj_dom_GnomeAttr_setValue (JNIEnv * env,
234 jobject self, jstring value)
236 xmlNodePtr node;
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)
247 xmlAttrPtr attr;
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,
257 jobject self
258 __attribute__ ((__unused__)),
259 jobject id)
261 xmlDocPtr doc;
263 doc = (xmlDocPtr) xmljAsPointer (env, id);
264 xmljFreeDoc (env, doc);
265 xmlFree (doc);
268 JNIEXPORT jobject JNICALL
269 Java_gnu_xml_libxmlj_dom_GnomeDocument_getDoctype (JNIEnv * env, jobject self)
271 xmlDocPtr doc;
272 xmlDtdPtr dtd;
274 doc = (xmlDocPtr) xmljGetNodeID (env, self);
275 dtd = doc->extSubset;
276 if (dtd == NULL)
278 dtd = doc->intSubset;
280 return xmljGetNodeInstance (env, (xmlNodePtr) dtd);
283 JNIEXPORT jobject JNICALL
284 Java_gnu_xml_libxmlj_dom_GnomeDocument_getDocumentElement (JNIEnv * env,
285 jobject self)
287 xmlDocPtr doc;
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,
295 jobject self,
296 jstring name,
297 jstring publicId,
298 jstring systemId)
300 xmlDocPtr doc;
301 xmlDtdPtr dtd;
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,
313 jobject self)
315 xmlDocPtr doc;
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,
323 jobject self,
324 jstring data)
326 xmlDocPtr doc;
327 xmlNodePtr text;
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,
338 jobject self,
339 jstring data)
341 xmlDocPtr doc;
342 xmlNodePtr comment;
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,
353 jobject self,
354 jstring data)
356 xmlDocPtr doc;
357 xmlNodePtr cdata;
358 const xmlChar *s_data;
359 int len;
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 *
370 env,
371 jobject
372 self,
373 jstring
374 target,
375 jstring
376 data)
378 xmlDocPtr doc;
379 xmlNodePtr pi;
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);
387 pi->doc = doc;
388 return xmljGetNodeInstance (env, pi);
391 JNIEXPORT jobject JNICALL
392 Java_gnu_xml_libxmlj_dom_GnomeDocument_createEntityReference (JNIEnv * env,
393 jobject self,
394 jstring name)
396 xmlDocPtr doc;
397 xmlNodePtr ref;
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,
408 jobject self,
409 jobject importedNode,
410 jboolean deep)
412 xmlDocPtr doc;
413 xmlNodePtr node;
415 doc = (xmlDocPtr) xmljGetNodeID (env, self);
416 node = xmljGetNodeID (env, importedNode);
417 if (node == NULL)
419 xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
420 return NULL;
422 if (node->type == XML_DOCUMENT_NODE ||
423 node->type == XML_DOCUMENT_TYPE_NODE)
425 xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
426 return NULL;
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,
434 jobject self,
435 jstring uri,
436 jstring qName)
438 xmlDocPtr doc;
439 xmlNodePtr element;
440 xmlNsPtr ns = NULL;
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 */
451 return NULL;
453 if (uri != NULL)
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,
466 jobject self,
467 jstring uri,
468 jstring qName)
470 xmlDocPtr doc;
471 xmlNodePtr attr;
472 xmlNsPtr ns = NULL;
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 */
483 return NULL;
485 if (uri != NULL)
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);
493 attr->parent = NULL;
494 return xmljGetNodeInstance (env, attr);
497 JNIEXPORT jobject JNICALL
498 Java_gnu_xml_libxmlj_dom_GnomeDocument_xmljGetElementById (JNIEnv * env,
499 jobject self,
500 jstring elementId)
502 xmlDocPtr doc;
503 xmlNodePtr ctx, tmp;
504 xmlAttrPtr attr;
505 const xmlChar *id;
506 const xmlChar *val;
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);
529 if (ctx->children)
531 ctx = ctx->children;
533 else
535 tmp = ctx->next;
536 if (tmp)
538 ctx = tmp;
540 else
544 tmp = ctx->parent;
545 if (!tmp)
547 return NULL;
549 ctx = tmp;
550 tmp = ctx->next;
552 while (!tmp);
553 ctx = tmp;
557 return NULL;
560 JNIEXPORT jstring JNICALL
561 Java_gnu_xml_libxmlj_dom_GnomeDocument_getInputEncoding (JNIEnv * env,
562 jobject self)
564 xmlDocPtr doc;
566 doc = (xmlDocPtr) xmljGetNodeID (env, self);
567 if (doc->encoding)
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");
581 /* TODO others */
582 default:
583 return xmljNewString (env, BAD_CAST "UTF-8");
587 JNIEXPORT jstring JNICALL
588 Java_gnu_xml_libxmlj_dom_GnomeDocument_getXmlEncoding (JNIEnv * env,
589 jobject self)
591 xmlDocPtr doc;
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,
601 jobject self)
603 xmlDocPtr doc;
605 doc = (xmlDocPtr) xmljGetNodeID (env, self);
606 return doc->standalone;
609 JNIEXPORT void JNICALL
610 Java_gnu_xml_libxmlj_dom_GnomeDocument_setXmlStandalone (JNIEnv * env,
611 jobject self,
612 jboolean xmlStandalone)
614 xmlDocPtr doc;
616 doc = (xmlDocPtr) xmljGetNodeID (env, self);
617 doc->standalone = xmlStandalone;
620 JNIEXPORT jstring JNICALL
621 Java_gnu_xml_libxmlj_dom_GnomeDocument_getXmlVersion (JNIEnv * env,
622 jobject self)
624 xmlDocPtr doc;
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,
634 jobject self,
635 jstring xmlVersion)
637 xmlDocPtr doc;
639 doc = (xmlDocPtr) xmljGetNodeID (env, self);
640 if (xmlVersion == NULL)
642 doc->version = NULL;
644 else
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 */
651 return;
653 doc->version = version;
657 JNIEXPORT jstring JNICALL
658 Java_gnu_xml_libxmlj_dom_GnomeDocument_getDocumentURI (JNIEnv * env,
659 jobject self)
661 xmlDocPtr doc;
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,
670 jobject self,
671 jstring documentURI)
673 xmlDocPtr doc;
675 doc = (xmlDocPtr) xmljGetNodeID (env, self);
676 if (documentURI == NULL)
678 doc->URL = NULL;
680 else
682 doc->URL = xmljGetStringChars (env, documentURI);
686 JNIEXPORT jobject JNICALL
687 Java_gnu_xml_libxmlj_dom_GnomeDocument_xmljAdoptNode (JNIEnv *env,
688 jobject self,
689 jobject jnode)
691 xmlDocPtr doc;
692 xmlNodePtr node;
694 doc = (xmlDocPtr) xmljGetNodeID (env, self);
695 node = xmljGetNodeID (env, jnode);
697 if (node == NULL)
699 xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
700 return NULL;
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 */
708 return NULL;
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,
717 jobject self
718 __attribute__ ((__unused__)),
719 jobject n
720 __attribute__ ((__unused__)),
721 jstring namespaceURI
722 __attribute__ ((__unused__)),
723 jstring qName
724 __attribute__ ((__unused__)))
726 xmlNodePtr node;
727 xmlNsPtr ns;
728 const xmlChar *s_qName;
729 const xmlChar *href;
730 const xmlChar *prefix;
731 int *len;
733 node = xmljGetNodeID (env, n);
734 if (node == NULL)
736 xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
737 return NULL;
739 s_qName = xmljGetStringChars (env, qName);
740 if (xmlValidateQName (s_qName, 0))
742 xmljThrowDOMException (env, 5, NULL); /* INVALID_CHARACTER_ERR */
743 return NULL;
745 xmlNodeSetName (node, s_qName);
747 href = xmljGetStringChars (env, namespaceURI);
748 len = (int *) malloc (sizeof (int));
749 prefix = xmlSplitQName3 (s_qName, len);
750 ns = node->ns;
751 if (ns == NULL)
753 if (href != NULL)
755 ns = xmlNewNs (node, href, prefix);
756 xmlSetNs (node, ns);
759 else
761 node->ns = NULL;
762 /*xmlFreeNs (ns); FIXME this can segfault (?) */
763 if (href != NULL)
765 ns = xmlNewNs (node, href, prefix);
766 xmlSetNs (node, ns);
769 free (len);
770 return n;
773 /* -- GnomeDocumentBuilder -- */
775 JNIEXPORT jobject JNICALL
776 Java_gnu_xml_libxmlj_dom_GnomeDocumentBuilder_parseStream (JNIEnv * env,
777 jobject self,
778 jobject in,
779 jbyteArray
780 detectBuffer,
781 jstring publicId,
782 jstring systemId,
783 jstring base,
784 jboolean validate,
785 jboolean coalesce,
786 jboolean
787 expandEntities,
788 jboolean
789 entityResolver,
790 jboolean
791 errorHandler)
793 xmlDocPtr doc;
795 doc = xmljParseDocument(env,
796 self,
798 detectBuffer,
799 publicId,
800 systemId,
801 base,
802 validate,
803 coalesce,
804 expandEntities,
807 entityResolver,
808 errorHandler,
812 return xmljCreateDocument (env, self, doc);
815 JNIEXPORT jobject JNICALL
816 Java_gnu_xml_libxmlj_dom_GnomeDocumentBuilder_createDocument
817 (JNIEnv * env,
818 jobject self,
819 jstring namespaceURI,
820 jstring qualifiedName,
821 jobject doctype)
823 xmlDocPtr doc;
824 xmlNodePtr root;
825 xmlNsPtr ns;
826 const xmlChar *href;
827 const xmlChar *prefix;
828 const xmlChar *qName;
830 qName = xmljGetStringChars (env, qualifiedName);
831 href = xmljGetStringChars (env, namespaceURI);
832 if (qName == NULL)
834 prefix = NULL;
836 else
838 int *len;
840 len = (int *) malloc (sizeof (int));
841 prefix = xmlSplitQName3 (qName, len);
842 free (len);
845 /* Create the document node */
846 doc = xmlNewDoc (BAD_CAST "1.0");
848 /* doctype */
849 if (doctype != NULL)
851 jclass cls;
852 jmethodID method;
853 jstring ret;
854 const xmlChar *name;
855 const xmlChar *publicId;
856 const xmlChar *systemId;
857 const xmlChar *internalSubset;
858 xmlDtdPtr dtd;
860 cls = (*env)->FindClass (env, "org/w3c/dom/DocumentType");
861 if (cls == NULL)
863 return NULL;
865 /* name */
866 method = (*env)->GetMethodID (env, cls, "getName",
867 "()Ljava/lang/String;");
868 if (method == NULL)
870 return NULL;
872 ret = (jstring) (*env)->CallObjectMethod (env, doctype, method);
873 name = xmljGetStringChars (env, ret);
875 /* publicId */
876 method = (*env)->GetMethodID (env, cls, "getPublicId",
877 "()Ljava/lang/String;");
878 if (method == NULL)
880 return NULL;
882 ret = (jstring) (*env)->CallObjectMethod (env, doctype, method);
883 publicId = xmljGetStringChars (env, ret);
885 /* systemId */
886 method = (*env)->GetMethodID (env, cls, "getSystemId",
887 "()Ljava/lang/String;");
888 if (method == NULL)
890 return NULL;
892 ret = (jstring) (*env)->CallObjectMethod (env, doctype, method);
893 systemId = xmljGetStringChars (env, ret);
895 /* internalSubset */
896 method = (*env)->GetMethodID (env, cls, "getInternalSubset",
897 "()Ljava/lang/String;");
898 if (method == NULL)
900 return NULL;
902 ret = (jstring) (*env)->CallObjectMethod (env, doctype, method);
903 internalSubset = xmljGetStringChars (env, ret);
905 /* TODO notations */
906 /* TODO entities */
907 if (internalSubset == NULL)
909 dtd = xmlNewDtd (doc, name, publicId, systemId);
911 else
913 dtd = xmlCreateIntSubset (doc, name, publicId, systemId);
914 /* TODO parse internal subset? */
915 xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
916 return NULL;
920 /* Create the root element */
921 root = xmlNewNode (NULL, qName);
922 xmlDocSetRootElement (doc, root);
923 ns = xmlNewNs (root, href, prefix);
924 xmlSetNs (root, ns);
926 return xmljCreateDocument (env, self, doc);
929 /* -- GnomeDocumentType -- */
931 JNIEXPORT jstring JNICALL
932 Java_gnu_xml_libxmlj_dom_GnomeDocumentType_getPublicId (JNIEnv * env,
933 jobject self)
935 xmlDtdPtr dtd;
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,
943 jobject self)
945 xmlDtdPtr dtd;
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,
953 jobject self
954 __attribute__ ((__unused__)))
956 /* TODO */
957 xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
958 return NULL;
961 /* -- GnomeElement -- */
963 JNIEXPORT jstring JNICALL
964 Java_gnu_xml_libxmlj_dom_GnomeElement_getAttribute (JNIEnv * env,
965 jobject self,
966 jstring name)
968 xmlNodePtr node;
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,
983 jobject self,
984 jstring name,
985 jstring value)
987 xmlNodePtr node;
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 */
996 return;
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,
1004 jobject self,
1005 jstring name)
1007 xmlNodePtr node;
1008 const xmlChar *s_name;
1009 xmlAttrPtr attr;
1011 node = xmljGetNodeID (env, self);
1012 s_name = xmljGetStringChars (env, name);
1013 attr = xmlHasProp (node, s_name);
1014 if (attr == NULL)
1016 return NULL;
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,
1024 jobject self,
1025 jobject newAttr)
1027 xmlNodePtr node;
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 */
1036 return NULL;
1038 if (new_attr->doc != node->doc)
1040 xmljThrowDOMException (env, 4, NULL); /* WRONG_DOCUMENT_ERR */
1041 return NULL;
1043 old_attr = xmlHasProp (node, new_attr->name);
1044 if (old_attr)
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,
1054 jobject self
1055 __attribute__ ((__unused__)),
1056 jobject oldAttr)
1058 xmlNodePtr attr;
1060 attr = xmljGetNodeID (env, oldAttr);
1061 xmlUnlinkNode (attr);
1062 return oldAttr;
1065 JNIEXPORT jstring JNICALL
1066 Java_gnu_xml_libxmlj_dom_GnomeElement_getAttributeNS (JNIEnv * env,
1067 jobject self,
1068 jstring uri,
1069 jstring localName)
1071 xmlNodePtr node;
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);
1078 if (uri == NULL)
1080 s_value = xmlGetNoNsProp (node, s_localName);
1082 else
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,
1096 jobject self,
1097 jstring uri,
1098 jstring qName,
1099 jstring value)
1101 xmlNodePtr node;
1102 xmlNsPtr ns;
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 */
1114 return;
1116 s_value = xmljGetStringChars (env, value);
1117 if (uri == NULL)
1119 xmlSetProp (node, s_qName, s_value);
1121 else
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,
1133 jobject self,
1134 jstring uri,
1135 jstring localName)
1137 xmlNodePtr node;
1138 xmlAttrPtr attr;
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)
1148 if (uri == NULL)
1150 if (xmljMatch (s_localName, (xmlNodePtr) attr))
1151 break;
1153 else
1155 if (xmljMatchNS (s_uri, s_localName, (xmlNodePtr) attr))
1156 break;
1158 attr = attr->next;
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,
1167 jobject self,
1168 jobject newAttr)
1170 xmlNodePtr node;
1171 xmlAttrPtr new_attr;
1172 xmlAttrPtr old_attr;
1173 const xmlChar *uri;
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 */
1180 return NULL;
1182 if (new_attr->doc != node->doc)
1184 xmljThrowDOMException (env, 4, NULL); /* WRONG_DOCUMENT_ERR */
1185 return NULL;
1187 uri = (new_attr->ns != NULL) ? new_attr->ns->href : NULL;
1188 old_attr = xmlHasNsProp (node, new_attr->name, uri);
1189 if (old_attr)
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,
1199 jobject self,
1200 jstring name)
1202 xmlNodePtr node;
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,
1215 jobject self,
1216 jstring uri,
1217 jstring localName)
1219 xmlNodePtr node;
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);
1226 if (uri == NULL)
1228 s_value = xmlGetNoNsProp (node, s_localName);
1230 else
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,
1262 jobject self
1263 __attribute__ ((__unused__)))
1265 /* TODO */
1266 xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
1267 return NULL;
1270 /* -- GnomeNamedNodeMap -- */
1272 JNIEXPORT jobject JNICALL
1273 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_getNamedItem (JNIEnv * env,
1274 jobject self,
1275 jstring name)
1277 jclass cls;
1278 jfieldID field;
1279 jint type;
1281 cls = (*env)->GetObjectClass (env, self);
1282 field = (*env)->GetFieldID (env, cls, "type", "I");
1283 type = (*env)->GetIntField (env, self, field);
1285 if (type == 0)
1287 xmlAttrPtr attr;
1289 attr = xmljGetNamedItem (env, self, name);
1290 return xmljGetNodeInstance (env, (xmlNodePtr) attr);
1292 else
1294 xmlDtdPtr dtd;
1295 xmlHashTablePtr hash;
1296 const xmlChar *s_name;
1297 xmlNodePtr ret;
1299 dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
1300 hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
1301 if (hash == NULL)
1303 return NULL;
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,
1314 jobject self,
1315 jobject arg)
1317 jclass cls;
1318 jfieldID field;
1319 jint type;
1320 xmlNodePtr node;
1321 xmlNodePtr argNode;
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))
1337 return NULL;
1339 if (type == 0)
1341 if (argNode->parent != NULL)
1343 xmljThrowDOMException (env, 10, NULL); /* INUSE_ATTRIBUTE_ERR */
1344 return NULL;
1346 xmlAddChild (node, argNode);
1348 else
1350 xmlDtdPtr dtd;
1351 xmlHashTablePtr hash;
1353 dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
1354 hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
1355 if (hash == NULL)
1357 hash = xmlHashCreate (10);
1358 if (type == 1)
1360 dtd->entities = hash;
1362 else
1364 dtd->notations = hash;
1367 xmlHashAddEntry (hash, argNode->name, argNode);
1369 return arg;
1372 JNIEXPORT jobject JNICALL
1373 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_removeNamedItem (JNIEnv * env,
1374 jobject self,
1375 jstring name)
1377 jclass cls;
1378 jfieldID field;
1379 jint type;
1381 cls = (*env)->GetObjectClass (env, self);
1382 field = (*env)->GetFieldID (env, cls, "type", "I");
1383 type = (*env)->GetIntField (env, self, field);
1385 if (type == 0)
1387 xmlAttrPtr attr;
1389 attr = xmljGetNamedItem (env, self, name);
1390 if (attr == NULL)
1392 xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
1393 return NULL;
1395 xmlUnlinkNode ((xmlNodePtr) attr);
1396 return xmljGetNodeInstance (env, (xmlNodePtr) attr);
1398 else
1400 xmlDtdPtr dtd;
1401 xmlHashTablePtr hash;
1402 const xmlChar *s_name;
1403 xmlNodePtr ret;
1405 dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
1406 hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
1407 if (hash == NULL)
1409 return NULL;
1411 s_name = xmljGetStringChars (env, name);
1412 ret = (xmlNodePtr) xmlHashLookup (hash, s_name);
1413 if (ret != NULL)
1415 xmlHashRemoveEntry (hash, s_name, NULL);
1417 xmlFree ((xmlChar *) s_name);
1418 return xmljGetNodeInstance (env, ret);
1422 void
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;
1432 data->count++;
1435 JNIEXPORT jobject JNICALL
1436 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_item (JNIEnv * env,
1437 jobject self, jint index)
1439 jclass cls;
1440 jfieldID field;
1441 jint type;
1443 cls = (*env)->GetObjectClass (env, self);
1444 field = (*env)->GetFieldID (env, cls, "type", "I");
1445 type = (*env)->GetIntField (env, self, field);
1447 if (type == 0)
1449 xmlNodePtr node;
1450 xmlAttrPtr attr;
1451 jint count;
1453 node = xmljGetNodeID (env, self);
1454 switch (node->type)
1456 case XML_ELEMENT_NODE:
1457 attr = node->properties;
1458 for (count = 0; attr != NULL && count < index; count++)
1460 attr = attr->next;
1462 if (attr == NULL)
1464 char msg[1024];
1465 sprintf (msg, "No attribute at index %d\n", (int) index);
1466 xmljThrowException (env, "java/lang/NullPointerException", msg);
1467 return NULL;
1469 return xmljGetNodeInstance (env, (xmlNodePtr) attr);
1470 default:
1471 return NULL;
1474 else
1476 xmlDtdPtr dtd;
1477 xmlHashTablePtr hash;
1478 xmljHashScanData *data;
1479 xmlNodePtr ret;
1481 dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
1482 hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
1483 if (hash == NULL)
1485 return NULL;
1487 data = (xmljHashScanData *) malloc (sizeof (xmljHashScanData));
1488 if (data == NULL)
1490 return NULL;
1492 data->index = index;
1493 data->count = 0;
1494 data->node = NULL;
1495 xmlHashScan (hash, xmljHashScanner, data);
1496 ret = data->node;
1497 free (data);
1498 return xmljGetNodeInstance (env, ret);
1502 JNIEXPORT jint JNICALL
1503 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_getLength (JNIEnv * env,
1504 jobject self)
1506 jclass cls;
1507 jfieldID field;
1508 jint type;
1510 cls = (*env)->GetObjectClass (env, self);
1511 field = (*env)->GetFieldID (env, cls, "type", "I");
1512 type = (*env)->GetIntField (env, self, field);
1514 if (type == 0)
1516 xmlNodePtr node;
1517 xmlAttrPtr attr;
1518 jint count;
1520 node = xmljGetNodeID (env, self);
1521 switch (node->type)
1523 case XML_ELEMENT_NODE:
1524 count = 0;
1525 attr = node->properties;
1526 while (attr != NULL)
1528 count++;
1529 attr = attr->next;
1531 return count;
1532 default:
1533 return -1;
1536 else
1538 xmlDtdPtr dtd;
1539 xmlHashTablePtr hash;
1540 xmljHashScanData *data;
1541 jint ret;
1543 dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
1544 hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
1545 if (hash == NULL)
1547 return 0;
1549 data = (xmljHashScanData *) malloc (sizeof (xmljHashScanData));
1550 if (data == NULL)
1552 return 0;
1554 data->index = -1;
1555 data->count = 0;
1556 data->node = NULL;
1557 xmlHashScan (hash, xmljHashScanner, data);
1558 ret = data->count;
1559 free (data);
1560 return ret;
1564 JNIEXPORT jobject JNICALL
1565 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_getNamedItemNS (JNIEnv * env,
1566 jobject self,
1567 jstring uri,
1568 jstring localName)
1570 jclass cls;
1571 jfieldID field;
1572 jint type;
1574 cls = (*env)->GetObjectClass (env, self);
1575 field = (*env)->GetFieldID (env, cls, "type", "I");
1576 type = (*env)->GetIntField (env, self, field);
1578 if (type == 0)
1580 xmlAttrPtr attr;
1582 attr = xmljGetNamedItemNS (env, self, uri, localName);
1583 return xmljGetNodeInstance (env, (xmlNodePtr) attr);
1585 else
1587 return NULL;
1591 JNIEXPORT jobject JNICALL
1592 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_setNamedItemNS (JNIEnv * env,
1593 jobject self,
1594 jobject arg)
1596 return Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_setNamedItem (env, self,
1597 arg);
1600 JNIEXPORT jobject JNICALL
1601 Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_removeNamedItemNS (JNIEnv * env,
1602 jobject self,
1603 jstring uri,
1604 jstring
1605 localName)
1607 jclass cls;
1608 jfieldID field;
1609 jint type;
1611 cls = (*env)->GetObjectClass (env, self);
1612 field = (*env)->GetFieldID (env, cls, "type", "I");
1613 type = (*env)->GetIntField (env, self, field);
1615 if (type == 0)
1617 xmlAttrPtr attr;
1619 attr = xmljGetNamedItemNS (env, self, uri, localName);
1620 if (attr == NULL)
1622 xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
1623 return NULL;
1625 else
1627 xmlUnlinkNode ((xmlNodePtr) attr);
1628 return xmljGetNodeInstance (env, (xmlNodePtr) attr);
1631 else
1633 return NULL;
1637 /* -- GnomeNode -- */
1639 JNIEXPORT jstring JNICALL
1640 Java_gnu_xml_libxmlj_dom_GnomeNode_getNodeName (JNIEnv * env, jobject self)
1642 xmlNodePtr node;
1644 node = xmljGetNodeID (env, self);
1645 if (node == NULL)
1647 return NULL;
1649 return xmljNewString (env, node->name);
1652 xmlChar *
1653 xmljGetNodeValue (xmlNodePtr node)
1655 /* If not character data, return null */
1656 switch (node->type)
1658 case XML_TEXT_NODE:
1659 case XML_CDATA_SECTION_NODE:
1660 case XML_COMMENT_NODE:
1661 case XML_ATTRIBUTE_NODE:
1662 return xmlNodeGetContent (node);
1663 default:
1664 return NULL;
1668 JNIEXPORT jstring JNICALL
1669 Java_gnu_xml_libxmlj_dom_GnomeNode_getNodeValue (JNIEnv * env, jobject self)
1671 xmlNodePtr node;
1672 xmlChar *text;
1673 jstring ret;
1675 node = xmljGetNodeID (env, self);
1676 text = xmljGetNodeValue (node);
1677 ret = xmljNewString (env, (const xmlChar *) text);
1678 if (text != NULL)
1680 xmlFree (text);
1682 return ret;
1685 JNIEXPORT void JNICALL
1686 Java_gnu_xml_libxmlj_dom_GnomeNode_setNodeValue (JNIEnv * env,
1687 jobject self,
1688 jstring nodeValue)
1690 xmlNodePtr node;
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)
1698 return;
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)
1707 xmlNodePtr node;
1709 node = xmljGetNodeID (env, self);
1710 switch (node->type)
1712 case XML_DTD_NODE:
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;
1718 default:
1719 return node->type;
1723 JNIEXPORT jobject JNICALL
1724 Java_gnu_xml_libxmlj_dom_GnomeNode_getParentNode (JNIEnv * env, jobject self)
1726 xmlNodePtr node;
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)
1735 xmlNodePtr node;
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)
1744 xmlNodePtr node;
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,
1752 jobject self)
1754 xmlNodePtr node;
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)
1763 xmlNodePtr node;
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,
1771 jobject self)
1773 xmlNodePtr node;
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,
1781 jobject self,
1782 jobject newChild,
1783 jobject refChild)
1785 xmlNodePtr node;
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 */
1799 return NULL;
1801 /* Check new child */
1802 xmljValidateChildNode (env, node, newChildNode);
1803 if ((*env)->ExceptionOccurred (env))
1805 return NULL;
1808 newChildNode = xmlAddPrevSibling (refChildNode, newChildNode);
1809 return xmljGetNodeInstance (env, newChildNode);
1812 JNIEXPORT jobject JNICALL
1813 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljReplaceChild (JNIEnv * env,
1814 jobject self,
1815 jobject newChild,
1816 jobject oldChild)
1818 xmlNodePtr node;
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 */
1832 return NULL;
1834 /* Check new child */
1835 xmljValidateChildNode (env, node, newChildNode);
1836 if ((*env)->ExceptionOccurred (env))
1838 return NULL;
1841 newChildNode = xmlReplaceNode (oldChildNode, newChildNode);
1842 return xmljGetNodeInstance (env, newChildNode);
1845 JNIEXPORT jobject JNICALL
1846 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljRemoveChild (JNIEnv * env,
1847 jobject self,
1848 jobject oldChild)
1850 xmlNodePtr node;
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 */
1861 return NULL;
1863 xmlUnlinkNode (oldChildNode);
1864 return oldChild;
1867 JNIEXPORT jobject JNICALL
1868 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljAppendChild (JNIEnv * env,
1869 jobject self,
1870 jobject newChild)
1872 xmlNodePtr node;
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))
1882 return NULL;
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)
1892 xmlNodePtr node;
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)
1902 xmlNodePtr node;
1903 xmlNodePtr clone;
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)
1915 xmlNodePtr node;
1917 node = xmljGetNodeID (env, self);
1918 xmljNormalizeNode (node);
1921 void
1922 xmljNormalizeNode (xmlNodePtr node)
1924 xmlNodePtr cur;
1925 xmlNodePtr last = NULL;
1927 cur = node->children;
1928 while (cur != NULL)
1930 switch (cur->type)
1932 case XML_CDATA_SECTION_NODE:
1933 case XML_TEXT_NODE:
1934 if (xmlIsBlankNode (cur))
1936 xmlNodePtr next = cur->next;
1937 xmlUnlinkNode (cur);
1938 xmlFreeNode (cur);
1939 cur = next;
1940 continue;
1942 if (last != NULL)
1944 last = xmlTextMerge (last, cur);
1945 xmlUnlinkNode (cur);
1946 xmlFreeNode (cur);
1947 cur = last;
1949 else
1951 last = cur;
1953 break;
1954 default:
1955 last = NULL;
1956 xmljNormalizeNode (cur);
1958 cur = cur->next;
1962 JNIEXPORT jstring JNICALL
1963 Java_gnu_xml_libxmlj_dom_GnomeNode_getNamespaceURI (JNIEnv * env,
1964 jobject self)
1966 xmlNodePtr node;
1968 node = xmljGetNodeID (env, self);
1969 if (node->type != XML_ELEMENT_NODE &&
1970 node->type != XML_ATTRIBUTE_NODE)
1972 return NULL;
1974 if (node->ns == NULL)
1976 return NULL;
1978 return xmljNewString (env, node->ns->href);
1981 JNIEXPORT jstring JNICALL
1982 Java_gnu_xml_libxmlj_dom_GnomeNode_getPrefix (JNIEnv * env, jobject self)
1984 xmlNodePtr node;
1986 node = xmljGetNodeID (env, self);
1987 if (node->type != XML_ELEMENT_NODE &&
1988 node->type != XML_ATTRIBUTE_NODE)
1990 return NULL;
1992 if (node->ns == NULL)
1994 return 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)
2003 xmlNodePtr node;
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 */
2016 return;
2018 if (node->ns == NULL)
2020 xmljThrowDOMException (env, 14, NULL); /* NAMESPACE_ERR */
2021 return;
2023 node->ns->prefix = s_prefix;
2026 JNIEXPORT jstring JNICALL
2027 Java_gnu_xml_libxmlj_dom_GnomeNode_getLocalName (JNIEnv * env, jobject self)
2029 xmlNodePtr node;
2030 int *len;
2031 jstring ret;
2033 node = xmljGetNodeID (env, self);
2034 if (node->name == NULL)
2036 return NULL;
2038 len = (int *) malloc (sizeof (int));
2039 if (xmlSplitQName3 (node->name, len) != NULL)
2041 ret = xmljNewString (env, node->name + (*len));
2043 else
2045 ret = xmljNewString (env, node->name);
2047 free (len);
2048 return ret;
2051 JNIEXPORT jboolean JNICALL
2052 Java_gnu_xml_libxmlj_dom_GnomeNode_hasAttributes (JNIEnv * env, jobject self)
2054 xmlNodePtr node;
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)
2063 xmlNodePtr node;
2064 xmlChar *baseURI;
2065 jstring ret;
2067 node = xmljGetNodeID (env, self);
2068 baseURI = xmlNodeGetBase (node->doc, node);
2069 ret = xmljNewString (env, (const xmlChar *) baseURI);
2070 if (baseURI != NULL)
2072 xmlFree (baseURI);
2074 return ret;
2077 JNIEXPORT jstring JNICALL
2078 Java_gnu_xml_libxmlj_dom_GnomeNode_lookupPrefix (JNIEnv * env, jobject self,
2079 jstring namespaceURI)
2081 xmlNodePtr node;
2082 xmlNsPtr ns;
2083 xmlDocPtr doc;
2084 const xmlChar *s_uri;
2086 node = xmljGetNodeID (env, self);
2087 doc = node->doc;
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);
2097 if (ns == NULL)
2099 return NULL;
2101 return xmljNewString (env, ns->prefix);
2104 JNIEXPORT jboolean JNICALL
2105 Java_gnu_xml_libxmlj_dom_GnomeNode_isDefaultNamespace (JNIEnv * env,
2106 jobject self,
2107 jstring namespaceURI)
2109 xmlNodePtr node;
2110 xmlNsPtr ns;
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);
2117 if (ns == NULL)
2119 return 0;
2121 return (ns->prefix == NULL || xmlStrlen (ns->prefix) == 0);
2124 JNIEXPORT jstring JNICALL
2125 Java_gnu_xml_libxmlj_dom_GnomeNode_lookupNamespaceURI (JNIEnv * env,
2126 jobject self,
2127 jstring prefix)
2129 xmlNodePtr node;
2130 xmlDocPtr doc;
2131 xmlNsPtr ns;
2132 const xmlChar *s_prefix;
2134 node = xmljGetNodeID (env, self);
2135 doc = node->doc;
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);
2145 if (ns == NULL)
2147 return NULL;
2149 return xmljNewString (env, ns->href);
2152 JNIEXPORT jint JNICALL
2153 Java_gnu_xml_libxmlj_dom_GnomeNode_xmljCompareTo (JNIEnv * env,
2154 jobject self,
2155 jobject other)
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)
2164 return 0;
2166 if (n1->type == XML_ATTRIBUTE_NODE || n2->type == XML_ATTRIBUTE_NODE)
2168 return 0;
2170 d1 = 0;
2171 for (x = n1->parent; x && x->type != XML_DOCUMENT_NODE; x = x->parent)
2173 d1++;
2175 d2 = 0;
2176 for (x = n2->parent; x && x->type != XML_DOCUMENT_NODE; x = x->parent)
2178 d2++;
2180 delta = d1 - d2;
2181 while (d1 > d2)
2183 n1 = n1->parent;
2184 d1--;
2186 while (d2 > d1)
2188 n2 = n2->parent;
2189 d2--;
2191 c = xmljCompare (n1, n2);
2192 return (c != 0) ? c : delta;
2195 /* Compare at same level */
2197 xmljCompare (xmlNodePtr n1, xmlNodePtr n2)
2199 int c, i1, i2;
2201 if (n1->parent == NULL || n1->type == XML_DOCUMENT_NODE ||
2202 n2->parent == NULL || n2->type == XML_DOCUMENT_NODE ||
2203 n1 == n2)
2205 return 0;
2207 c = xmljCompare (n1->parent, n2->parent);
2208 if (c != 0)
2210 return c;
2212 i1 = 0;
2213 for (n1 = n1->prev; n1; n1 = n1->prev)
2215 i1++;
2217 i2 = 0;
2218 for (n2 = n2->prev; n2; n2 = n2->prev)
2220 i2++;
2222 return i1 - i2;
2226 xmljIsEqualNodeList (xmlNodePtr node1, xmlNodePtr node2)
2228 while (node1 != NULL)
2230 if (!xmljIsEqualNode (node1, node2))
2232 return 0;
2234 node1 = node1->next;
2235 node2 = node2->next;
2237 return 1;
2241 xmljIsEqualNode (xmlNodePtr node1, xmlNodePtr node2)
2243 const xmlChar *val1;
2244 const xmlChar *val2;
2246 if (node1 == node2)
2248 return 1;
2250 if (node1 == NULL || node2 == NULL)
2252 return 0;
2254 /* Check node type */
2255 if (node1->type != node2->type)
2257 return 0;
2259 /* Check node name */
2260 if (!xmlStrEqual (node1->name, node2->name))
2262 return 0;
2264 /* Check node namespace */
2265 if (node1->type == XML_ELEMENT_NODE ||
2266 node1->type == XML_ATTRIBUTE_NODE)
2268 xmlNsPtr ns1, ns2;
2270 ns1 = node1->ns;
2271 if (ns1 != NULL)
2273 ns2 = node2->ns;
2274 if (ns2 == NULL)
2276 return 0;
2278 val1 = ns1->href;
2279 val2 = ns2->href;
2280 if (!xmlStrEqual (val1, val2))
2282 return 0;
2286 /* Check node value */
2287 val1 = xmljGetNodeValue (node1);
2288 val2 = xmljGetNodeValue (node2);
2289 if (!xmlStrEqual (val1, val2))
2291 return 0;
2293 /* Check attributes */
2294 if (node1->type == XML_ELEMENT_NODE &&
2295 !xmljIsEqualNodeList ((xmlNodePtr) node1->properties,
2296 (xmlNodePtr) node2->properties))
2298 return 0;
2300 /* Check doctype */
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))
2311 return 0;
2314 /* Check child nodes */
2315 if (!xmljIsEqualNodeList (node1->children, node2->children))
2317 return 0;
2319 return 1;
2322 JNIEXPORT jboolean JNICALL
2323 Java_gnu_xml_libxmlj_dom_GnomeNode_isEqualNode (JNIEnv * env,
2324 jobject self,
2325 jobject arg)
2327 xmlNodePtr node1;
2328 xmlNodePtr node2;
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)
2341 xmlNodePtr node;
2342 jint count;
2344 node = xmljGetNodeID (env, self);
2345 node = node->children;
2346 count = 0;
2347 for (count = 0; node != NULL && count < index; count++)
2349 node = node->next;
2351 return xmljGetNodeInstance (env, node);
2354 JNIEXPORT jint JNICALL
2355 Java_gnu_xml_libxmlj_dom_GnomeNodeList_getLength (JNIEnv * env, jobject self)
2357 xmlNodePtr node;
2358 jint count;
2360 node = xmljGetNodeID (env, self);
2361 count = 0;
2362 node = node->children;
2363 while (node != NULL)
2365 count++;
2366 node = node->next;
2368 return count;
2371 /* -- GnomeNotation -- */
2373 JNIEXPORT jstring JNICALL
2374 Java_gnu_xml_libxmlj_dom_GnomeNotation_getPublicId (JNIEnv * env,
2375 jobject self)
2377 xmlNotationPtr notation;
2379 notation = (xmlNotationPtr) xmljGetNodeID (env, self);
2380 if (notation->PublicID == NULL)
2382 return NULL;
2384 return xmljNewString (env, notation->PublicID);
2387 JNIEXPORT jstring JNICALL
2388 Java_gnu_xml_libxmlj_dom_GnomeNotation_getSystemId (JNIEnv * env,
2389 jobject self)
2391 xmlNotationPtr notation;
2393 notation = (xmlNotationPtr) xmljGetNodeID (env, self);
2394 if (notation->SystemID == NULL)
2396 return NULL;
2398 return xmljNewString (env, notation->SystemID);
2401 /* -- GnomeProcessingInstruction -- */
2403 JNIEXPORT jstring JNICALL
2404 Java_gnu_xml_libxmlj_dom_GnomeProcessingInstruction_getData (JNIEnv * env,
2405 jobject self)
2407 xmlNodePtr node;
2408 xmlChar *text;
2409 jstring ret;
2411 node = xmljGetNodeID (env, self);
2412 text = xmlNodeGetContent (node);
2413 ret = xmljNewString (env, (const xmlChar *) text);
2414 if (text != NULL)
2416 xmlFree (text);
2418 return ret;
2421 JNIEXPORT void JNICALL
2422 Java_gnu_xml_libxmlj_dom_GnomeProcessingInstruction_setData (JNIEnv * env,
2423 jobject self,
2424 jstring data)
2426 xmlNodePtr node;
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)
2438 xmlNodePtr ctx;
2440 for (ctx = doc->children; ctx; ctx = ctx->next)
2442 if (ctx->type == XML_DOCUMENT_TYPE_NODE)
2444 return (xmlDtdPtr) ctx;
2447 return NULL;
2450 JNIEXPORT jstring JNICALL
2451 Java_gnu_xml_libxmlj_dom_GnomeTypeInfo_getTypeName (JNIEnv *env, jobject self)
2453 xmlNodePtr node;
2454 xmlDtdPtr dtd;
2455 xmlAttributePtr attribute;
2457 node = xmljGetNodeID (env, self);
2458 dtd = xmljGetDtd (node->doc);
2459 if (dtd)
2461 switch (node->type)
2463 case XML_ATTRIBUTE_NODE:
2464 attribute = xmlGetDtdAttrDesc (dtd, node->parent->name, node->name);
2465 if (attribute)
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");
2485 default:
2486 return NULL;
2489 return NULL;
2490 default:
2491 return NULL;
2494 /* TODO when XML Schema support is available */
2495 return NULL;
2498 JNIEXPORT jstring JNICALL
2499 Java_gnu_xml_libxmlj_dom_GnomeTypeInfo_getTypeNamespace (JNIEnv *env,
2500 jobject self)
2502 xmlNodePtr node;
2503 xmlDtdPtr dtd;
2504 xmlAttributePtr attribute;
2506 node = xmljGetNodeID (env, self);
2507 dtd = xmljGetDtd (node->doc);
2508 if (dtd)
2510 switch (node->type)
2512 case XML_ATTRIBUTE_NODE:
2513 attribute = xmlGetDtdAttrDesc (dtd, node->parent->name, node->name);
2514 if (attribute)
2516 return xmljNewString (env,
2517 BAD_CAST "http://www.w3.org/TR/REC-xml");
2519 return NULL;
2520 default:
2521 return NULL;
2524 /* TODO when XML Schema support is available */
2525 return NULL;
2528 JNIEXPORT jboolean JNICALL
2529 Java_gnu_xml_libxmlj_dom_GnomeTypeInfo_isDerivedFrom (JNIEnv *env
2530 __attribute__ ((__unused__)),
2531 jobject self
2532 __attribute__ ((__unused__)),
2533 jstring typeNS
2534 __attribute__ ((__unused__)),
2535 jstring typeName
2536 __attribute__ ((__unused__)),
2537 jint method
2538 __attribute__ ((__unused__)))
2540 /* TODO when XML Schema support is available */
2541 return 0;
2544 /* -- Utility -- */
2547 * Create GnomeDocument object from the given xmlDocPtr
2549 jobject
2550 xmljCreateDocument (JNIEnv * env, jobject self, xmlDocPtr doc)
2552 jclass cls;
2553 jfieldID field;
2554 jobject ret;
2556 if (!doc)
2558 return NULL;
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);
2569 return ret;
2572 xmlAttrPtr
2573 xmljGetNamedItem (JNIEnv * env, jobject self, jstring name)
2575 xmlNodePtr node;
2576 xmlAttrPtr attr;
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))
2586 break;
2587 attr = attr->next;
2589 xmlFree ((xmlChar *) s_name);
2591 return attr;
2594 xmlAttrPtr
2595 xmljGetNamedItemNS (JNIEnv * env, jobject self, jstring uri, jstring localName)
2597 xmlNodePtr node;
2598 xmlAttrPtr attr;
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))
2610 break;
2611 attr = attr->next;
2613 xmlFree ((xmlChar *) s_uri);
2614 xmlFree ((xmlChar *) s_localName);
2616 return attr;