mirror of
https://github.com/2003scape/deep-c-rsc.git
synced 2024-03-22 05:49:51 -04:00
2618 lines
70 KiB
C
2618 lines
70 KiB
C
/* xmlj_dom.c -
|
|
Copyright (C) 2004 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Classpath.
|
|
|
|
GNU Classpath is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
GNU Classpath is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GNU Classpath; see the file COPYING. If not, write to the
|
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301 USA.
|
|
|
|
Linking this library statically or dynamically with other modules is
|
|
making a combined work based on this library. Thus, the terms and
|
|
conditions of the GNU General Public License cover the whole
|
|
combination.
|
|
|
|
As a special exception, the copyright holders of this library give you
|
|
permission to link this library with independent modules to produce an
|
|
executable, regardless of the license terms of these independent
|
|
modules, and to copy and distribute the resulting executable under
|
|
terms of your choice, provided that you also meet, for each linked
|
|
independent module, the terms and conditions of the license of that
|
|
module. An independent module is a module which is not derived from
|
|
or based on this library. If you modify this library, you may extend
|
|
this exception to your version of the library, but you are not
|
|
obligated to do so. If you do not wish to do so, delete this
|
|
exception statement from your version. */
|
|
|
|
#include "xmlj_dom.h"
|
|
#include "xmlj_error.h"
|
|
#include "xmlj_io.h"
|
|
#include "xmlj_node.h"
|
|
#include "xmlj_sax.h"
|
|
#include "xmlj_util.h"
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
|
|
JNIEnv *dom_cb_env;
|
|
jobject dom_cb_obj;
|
|
|
|
typedef struct
|
|
{
|
|
int index;
|
|
int count;
|
|
xmlNodePtr node;
|
|
}
|
|
xmljHashScanData;
|
|
|
|
/* Prototypes for local functions */
|
|
|
|
void
|
|
xmljAddAttribute (xmlNodePtr node, xmlAttrPtr attr);
|
|
|
|
void
|
|
xmljHashScanner (void *payload, void *vdata, xmlChar *name);
|
|
|
|
xmlChar *
|
|
xmljGetNodeValue (xmlNodePtr node);
|
|
|
|
/*
|
|
* Determines whether a child node is suitable for insertion in the list of
|
|
* children for a given parent node.
|
|
* Returns 0 on success, a DOMException code otherwise.
|
|
*/
|
|
void
|
|
xmljValidateChildNode (JNIEnv *env, xmlNodePtr parent, xmlNodePtr child)
|
|
{
|
|
xmlNodePtr cur;
|
|
|
|
if (child == NULL || parent == NULL)
|
|
{
|
|
xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
|
|
return;
|
|
}
|
|
if (child->doc != parent->doc)
|
|
{
|
|
xmljThrowDOMException (env, 4, NULL); /* WRONG_DOCUMENT_ERR */
|
|
return;
|
|
}
|
|
/* Check that new parent is of an allowed type */
|
|
switch (parent->type)
|
|
{
|
|
case XML_CDATA_SECTION_NODE:
|
|
case XML_COMMENT_NODE:
|
|
case XML_TEXT_NODE:
|
|
case XML_ENTITY_NODE:
|
|
case XML_ENTITY_REF_NODE:
|
|
case XML_NOTATION_NODE:
|
|
case XML_PI_NODE:
|
|
/* these can't have any children */
|
|
/* HIERARCHY_REQUEST_ERR */
|
|
xmljThrowDOMException (env, 3, "parent type does not allow children");
|
|
return;
|
|
case XML_ATTRIBUTE_NODE:
|
|
if (child->type != XML_TEXT_NODE &&
|
|
child->type != XML_ENTITY_REF_NODE)
|
|
{
|
|
/* HIERARCHY_REQUEST_ERR */
|
|
xmljThrowDOMException (env, 3, "attributes may only contain text or entity reference nodes");
|
|
return;
|
|
}
|
|
break;
|
|
case XML_DOCUMENT_FRAG_NODE:
|
|
case XML_ELEMENT_NODE:
|
|
if (child->type == XML_DTD_NODE ||
|
|
child->type == XML_DOCUMENT_TYPE_NODE ||
|
|
child->type == XML_ENTITY_NODE ||
|
|
child->type == XML_NOTATION_NODE ||
|
|
child->type == XML_PI_NODE)
|
|
{
|
|
/* HIERARCHY_REQUEST_ERR */
|
|
xmljThrowDOMException (env, 3, "parent type does not allow child of this type");
|
|
return;
|
|
}
|
|
/* fall through */
|
|
default:
|
|
if (child->type == XML_ATTRIBUTE_NODE ||
|
|
child->type == XML_DOCUMENT_NODE ||
|
|
child->type == XML_DOCUMENT_FRAG_NODE)
|
|
{
|
|
/* HIERARCHY_REQUEST_ERR */
|
|
xmljThrowDOMException (env, 3, "node type may not be a child");
|
|
return;
|
|
}
|
|
/* TODO others? */
|
|
}
|
|
/* Check that new parent is not self or an ancestor */
|
|
for (cur = parent; cur != NULL; cur = cur->parent)
|
|
{
|
|
if (cur == child)
|
|
{
|
|
/* HIERARCHY_REQUEST_ERR */
|
|
xmljThrowDOMException (env, 3, "child cannot be an ancestor of itself");
|
|
return;
|
|
}
|
|
}
|
|
/* Check that new parent does not add a second doctype or root element
|
|
* to a document parent */
|
|
if (parent->type == XML_DOCUMENT_NODE)
|
|
{
|
|
cur = parent->children;
|
|
while (cur != NULL)
|
|
{
|
|
if (cur->type == XML_DTD_NODE ||
|
|
cur->type == XML_DOCUMENT_TYPE_NODE ||
|
|
(cur->type == XML_ELEMENT_NODE &&
|
|
parent->type == XML_DOCUMENT_NODE))
|
|
{
|
|
if (child->type == cur->type && child != cur)
|
|
{
|
|
/* HIERARCHY_REQUEST_ERR */
|
|
xmljThrowDOMException (env, 3, "cannot add a second doctype or root element");
|
|
return;
|
|
}
|
|
}
|
|
cur = cur->next;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Adds the specified attribute node to the list of attributes for the given
|
|
* element.
|
|
*/
|
|
void
|
|
xmljAddAttribute (xmlNodePtr node, xmlAttrPtr attr)
|
|
{
|
|
xmlAttrPtr cur = node->properties;
|
|
|
|
if (cur == NULL)
|
|
{
|
|
node->properties = attr;
|
|
attr->prev = NULL;
|
|
attr->next = NULL;
|
|
attr->parent = node;
|
|
attr->doc = node->doc;
|
|
}
|
|
else
|
|
{
|
|
while (cur->next != NULL)
|
|
{
|
|
cur = cur->next;
|
|
}
|
|
cur->next = attr;
|
|
attr->prev = cur;
|
|
attr->next = NULL;
|
|
attr->parent = node;
|
|
attr->doc = node->doc;
|
|
}
|
|
}
|
|
|
|
/* -- GnomeAttr -- */
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeAttr_getSpecified (JNIEnv * env, jobject self)
|
|
{
|
|
xmlAttrPtr attr;
|
|
|
|
attr = (xmlAttrPtr) xmljGetNodeID (env, self);
|
|
return (attr->atype != 0);
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeAttr_getValue (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlChar *text;
|
|
jstring ret;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
text = xmlNodeGetContent (node);
|
|
ret = xmljNewString (env, (const xmlChar *) text);
|
|
if (text != NULL)
|
|
{
|
|
xmlFree (text);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeAttr_setValue (JNIEnv * env,
|
|
jobject self, jstring value)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_value;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_value = xmljGetStringChars (env, value);
|
|
xmlNodeSetContent (node, s_value);
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeAttr_xmljIsId (JNIEnv * env, jobject self)
|
|
{
|
|
xmlAttrPtr attr;
|
|
|
|
attr = (xmlAttrPtr) xmljGetNodeID (env, self);
|
|
return (attr->atype == XML_ATTRIBUTE_ID);
|
|
}
|
|
|
|
/* -- GnomeDocument -- */
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_free (JNIEnv * env,
|
|
jobject self
|
|
__attribute__ ((__unused__)),
|
|
jobject id)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljAsPointer (env, id);
|
|
xmljFreeDoc (env, doc);
|
|
xmlFree (doc);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_getDoctype (JNIEnv * env, jobject self)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlDtdPtr dtd;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
dtd = doc->extSubset;
|
|
if (dtd == NULL)
|
|
{
|
|
dtd = doc->intSubset;
|
|
}
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) dtd);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_getDocumentElement (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
return xmljGetNodeInstance (env, xmlDocGetRootElement (doc));
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_createDocumentType (JNIEnv * env,
|
|
jobject self,
|
|
jstring name,
|
|
jstring publicId,
|
|
jstring systemId)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlDtdPtr dtd;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
dtd = xmlNewDtd (doc,
|
|
xmljGetStringChars (env, name),
|
|
xmljGetStringChars (env, publicId),
|
|
xmljGetStringChars (env, systemId));
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) dtd);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_createDocumentFragment (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
return xmljGetNodeInstance (env, xmlNewDocFragment (doc));
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_createTextNode (JNIEnv * env,
|
|
jobject self,
|
|
jstring data)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr text;
|
|
const xmlChar *s_data;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
s_data = xmljGetStringChars (env, data);
|
|
text = xmlNewDocText (doc, s_data);
|
|
return xmljGetNodeInstance (env, text);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_createComment (JNIEnv * env,
|
|
jobject self,
|
|
jstring data)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr comment;
|
|
const xmlChar *s_data;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
s_data = xmljGetStringChars (env, data);
|
|
comment = xmlNewDocComment (doc, s_data);
|
|
return xmljGetNodeInstance (env, comment);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_createCDATASection (JNIEnv * env,
|
|
jobject self,
|
|
jstring data)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr cdata;
|
|
const xmlChar *s_data;
|
|
int len;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
s_data = xmljGetStringChars (env, data);
|
|
len = xmlStrlen (s_data);
|
|
cdata = xmlNewCDataBlock (doc, s_data, len);
|
|
return xmljGetNodeInstance (env, cdata);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_createProcessingInstruction (JNIEnv *
|
|
env,
|
|
jobject
|
|
self,
|
|
jstring
|
|
target,
|
|
jstring
|
|
data)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr pi;
|
|
const xmlChar *s_target;
|
|
const xmlChar *s_data;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
s_target = xmljGetStringChars (env, target);
|
|
s_data = xmljGetStringChars (env, data);
|
|
pi = xmlNewPI (s_target, s_data);
|
|
pi->doc = doc;
|
|
return xmljGetNodeInstance (env, pi);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_createEntityReference (JNIEnv * env,
|
|
jobject self,
|
|
jstring name)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr ref;
|
|
const xmlChar *s_name;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
s_name = xmljGetStringChars (env, name);
|
|
ref = xmlNewReference (doc, s_name);
|
|
return xmljGetNodeInstance (env, ref);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_xmljImportNode (JNIEnv * env,
|
|
jobject self,
|
|
jobject importedNode,
|
|
jboolean deep)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr node;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
node = xmljGetNodeID (env, importedNode);
|
|
if (node == NULL)
|
|
{
|
|
xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
|
|
return NULL;
|
|
}
|
|
if (node->type == XML_DOCUMENT_NODE ||
|
|
node->type == XML_DOCUMENT_TYPE_NODE)
|
|
{
|
|
xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
|
|
return NULL;
|
|
}
|
|
node = xmlDocCopyNode (node, doc, deep);
|
|
return xmljGetNodeInstance (env, node);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_createElementNS (JNIEnv * env,
|
|
jobject self,
|
|
jstring uri,
|
|
jstring qName)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr element;
|
|
xmlNsPtr ns = NULL;
|
|
const xmlChar *s_uri;
|
|
const xmlChar *s_qName;
|
|
const xmlChar *s_prefix;
|
|
const xmlChar *s_localName;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
s_qName = xmljGetStringChars (env, qName);
|
|
if (xmlValidateQName (s_qName, 0))
|
|
{
|
|
xmljThrowDOMException (env, 5, NULL); /* INVALID_CHARACTER_ERR */
|
|
return NULL;
|
|
}
|
|
if (uri != NULL)
|
|
{
|
|
s_uri = xmljGetStringChars (env, uri);
|
|
s_prefix = xmljGetPrefix (s_qName);
|
|
s_localName = xmljGetLocalName (s_qName);
|
|
ns = xmlNewNs ((xmlNodePtr) doc, s_uri, s_prefix);
|
|
}
|
|
element = xmlNewDocNode (doc, ns, s_qName, NULL);
|
|
return xmljGetNodeInstance (env, element);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_createAttributeNS (JNIEnv * env,
|
|
jobject self,
|
|
jstring uri,
|
|
jstring qName)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr attr;
|
|
xmlNsPtr ns = NULL;
|
|
const xmlChar *s_uri;
|
|
const xmlChar *s_qName;
|
|
const xmlChar *s_prefix;
|
|
const xmlChar *s_localName;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
s_qName = xmljGetStringChars (env, qName);
|
|
if (xmlValidateQName (s_qName, 0))
|
|
{
|
|
xmljThrowDOMException (env, 5, NULL); /* INVALID_CHARACTER_ERR */
|
|
return NULL;
|
|
}
|
|
if (uri != NULL)
|
|
{
|
|
s_uri = xmljGetStringChars (env, uri);
|
|
s_prefix = xmljGetPrefix (s_qName);
|
|
s_localName = xmljGetLocalName (s_qName);
|
|
ns = xmlNewNs ((xmlNodePtr) doc, s_uri, s_prefix);
|
|
}
|
|
attr = (xmlNodePtr) xmlNewNsProp ((xmlNodePtr) doc, ns, s_qName, NULL);
|
|
attr->parent = NULL;
|
|
return xmljGetNodeInstance (env, attr);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_xmljGetElementById (JNIEnv * env,
|
|
jobject self,
|
|
jstring elementId)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr ctx, tmp;
|
|
xmlAttrPtr attr;
|
|
const xmlChar *id;
|
|
const xmlChar *val;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
id = xmljGetStringChars (env, elementId);
|
|
|
|
ctx = xmlDocGetRootElement (doc);
|
|
while (ctx && ctx != (xmlNodePtr) doc)
|
|
{
|
|
if (ctx->type == XML_ELEMENT_NODE)
|
|
{
|
|
for (attr = ctx->properties; attr;
|
|
attr = (xmlAttrPtr) attr->next)
|
|
{
|
|
if (xmlIsID (doc, ctx, attr))
|
|
{
|
|
val = xmlGetProp (ctx, attr->name);
|
|
if (val && xmlStrEqual (id, val))
|
|
{
|
|
return xmljGetNodeInstance (env, ctx);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (ctx->children)
|
|
{
|
|
ctx = ctx->children;
|
|
}
|
|
else
|
|
{
|
|
tmp = ctx->next;
|
|
if (tmp)
|
|
{
|
|
ctx = tmp;
|
|
}
|
|
else
|
|
{
|
|
do
|
|
{
|
|
tmp = ctx->parent;
|
|
if (!tmp)
|
|
{
|
|
return NULL;
|
|
}
|
|
ctx = tmp;
|
|
tmp = ctx->next;
|
|
}
|
|
while (!tmp);
|
|
ctx = tmp;
|
|
}
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_getInputEncoding (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
if (doc->encoding)
|
|
{
|
|
return xmljNewString (env, doc->encoding);
|
|
}
|
|
switch (doc->charset)
|
|
{
|
|
case XML_CHAR_ENCODING_ASCII:
|
|
return xmljNewString (env, BAD_CAST "US-ASCII");
|
|
case XML_CHAR_ENCODING_UTF16LE:
|
|
return xmljNewString (env, BAD_CAST "UTF-16LE");
|
|
case XML_CHAR_ENCODING_UTF16BE:
|
|
return xmljNewString (env, BAD_CAST "UTF-16BE");
|
|
case XML_CHAR_ENCODING_8859_1:
|
|
return xmljNewString (env, BAD_CAST "ISO-8859-1");
|
|
/* TODO others */
|
|
default:
|
|
return xmljNewString (env, BAD_CAST "UTF-8");
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_getXmlEncoding (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
return (doc->encoding == NULL) ?
|
|
xmljNewString (env, BAD_CAST "UTF-8") :
|
|
xmljNewString (env, doc->encoding);
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_getXmlStandalone (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
return doc->standalone;
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_setXmlStandalone (JNIEnv * env,
|
|
jobject self,
|
|
jboolean xmlStandalone)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
doc->standalone = xmlStandalone;
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_getXmlVersion (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
return (doc->version == NULL) ?
|
|
xmljNewString (env, BAD_CAST "1.0") :
|
|
xmljNewString (env, doc->version);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_setXmlVersion (JNIEnv * env,
|
|
jobject self,
|
|
jstring xmlVersion)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
if (xmlVersion == NULL)
|
|
{
|
|
doc->version = NULL;
|
|
}
|
|
else
|
|
{
|
|
const xmlChar *version = xmljGetStringChars (env, xmlVersion);
|
|
if (!xmlStrEqual (version, BAD_CAST "1.0") &&
|
|
!xmlStrEqual (version, BAD_CAST "1.1"))
|
|
{
|
|
xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
|
|
return;
|
|
}
|
|
doc->version = version;
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_getDocumentURI (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
return (doc->name == NULL) ? NULL :
|
|
xmljNewString (env, (const xmlChar *) doc->URL);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_setDocumentURI (JNIEnv * env,
|
|
jobject self,
|
|
jstring documentURI)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
if (documentURI == NULL)
|
|
{
|
|
doc->URL = NULL;
|
|
}
|
|
else
|
|
{
|
|
doc->URL = xmljGetStringChars (env, documentURI);
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_xmljAdoptNode (JNIEnv *env,
|
|
jobject self,
|
|
jobject jnode)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr node;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, self);
|
|
node = xmljGetNodeID (env, jnode);
|
|
|
|
if (node == NULL)
|
|
{
|
|
xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
|
|
return NULL;
|
|
}
|
|
if (node->type == XML_DOCUMENT_NODE ||
|
|
node->type == XML_DOCUMENT_TYPE_NODE ||
|
|
node->type == XML_ENTITY_NODE ||
|
|
node->type == XML_NOTATION_NODE)
|
|
{
|
|
xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
|
|
return NULL;
|
|
}
|
|
xmlUnlinkNode (node);
|
|
node = xmlDocCopyNode (node, doc, 1);
|
|
return xmljGetNodeInstance (env, node);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocument_renameNode (JNIEnv * env,
|
|
jobject self
|
|
__attribute__ ((__unused__)),
|
|
jobject n
|
|
__attribute__ ((__unused__)),
|
|
jstring namespaceURI
|
|
__attribute__ ((__unused__)),
|
|
jstring qName
|
|
__attribute__ ((__unused__)))
|
|
{
|
|
xmlNodePtr node;
|
|
xmlNsPtr ns;
|
|
const xmlChar *s_qName;
|
|
const xmlChar *href;
|
|
const xmlChar *prefix;
|
|
int *len;
|
|
|
|
node = xmljGetNodeID (env, n);
|
|
if (node == NULL)
|
|
{
|
|
xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
|
|
return NULL;
|
|
}
|
|
s_qName = xmljGetStringChars (env, qName);
|
|
if (xmlValidateQName (s_qName, 0))
|
|
{
|
|
xmljThrowDOMException (env, 5, NULL); /* INVALID_CHARACTER_ERR */
|
|
return NULL;
|
|
}
|
|
xmlNodeSetName (node, s_qName);
|
|
|
|
href = xmljGetStringChars (env, namespaceURI);
|
|
len = (int *) malloc (sizeof (int));
|
|
prefix = xmlSplitQName3 (s_qName, len);
|
|
ns = node->ns;
|
|
if (ns == NULL)
|
|
{
|
|
if (href != NULL)
|
|
{
|
|
ns = xmlNewNs (node, href, prefix);
|
|
xmlSetNs (node, ns);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
node->ns = NULL;
|
|
/*xmlFreeNs (ns); FIXME this can segfault (?) */
|
|
if (href != NULL)
|
|
{
|
|
ns = xmlNewNs (node, href, prefix);
|
|
xmlSetNs (node, ns);
|
|
}
|
|
}
|
|
free (len);
|
|
return n;
|
|
}
|
|
|
|
/* -- GnomeDocumentBuilder -- */
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocumentBuilder_parseStream (JNIEnv * env,
|
|
jobject self,
|
|
jobject in,
|
|
jbyteArray
|
|
detectBuffer,
|
|
jstring publicId,
|
|
jstring systemId,
|
|
jstring base,
|
|
jboolean validate,
|
|
jboolean coalesce,
|
|
jboolean
|
|
expandEntities,
|
|
jboolean
|
|
entityResolver,
|
|
jboolean
|
|
errorHandler)
|
|
{
|
|
xmlDocPtr doc;
|
|
|
|
doc = xmljParseDocument(env,
|
|
self,
|
|
in,
|
|
detectBuffer,
|
|
publicId,
|
|
systemId,
|
|
base,
|
|
validate,
|
|
coalesce,
|
|
expandEntities,
|
|
0,
|
|
0,
|
|
entityResolver,
|
|
errorHandler,
|
|
0,
|
|
0,
|
|
1);
|
|
return xmljCreateDocument (env, self, doc);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocumentBuilder_createDocument
|
|
(JNIEnv * env,
|
|
jobject self,
|
|
jstring namespaceURI,
|
|
jstring qualifiedName,
|
|
jobject doctype)
|
|
{
|
|
xmlDocPtr doc;
|
|
xmlNodePtr root;
|
|
xmlNsPtr ns;
|
|
const xmlChar *href;
|
|
const xmlChar *prefix;
|
|
const xmlChar *qName;
|
|
|
|
qName = xmljGetStringChars (env, qualifiedName);
|
|
href = xmljGetStringChars (env, namespaceURI);
|
|
if (qName == NULL)
|
|
{
|
|
prefix = NULL;
|
|
}
|
|
else
|
|
{
|
|
int *len;
|
|
|
|
len = (int *) malloc (sizeof (int));
|
|
prefix = xmlSplitQName3 (qName, len);
|
|
free (len);
|
|
}
|
|
|
|
/* Create the document node */
|
|
doc = xmlNewDoc (BAD_CAST "1.0");
|
|
|
|
/* doctype */
|
|
if (doctype != NULL)
|
|
{
|
|
jclass cls;
|
|
jmethodID method;
|
|
jstring ret;
|
|
const xmlChar *name;
|
|
const xmlChar *publicId;
|
|
const xmlChar *systemId;
|
|
const xmlChar *internalSubset;
|
|
xmlDtdPtr dtd;
|
|
|
|
cls = (*env)->FindClass (env, "org/w3c/dom/DocumentType");
|
|
if (cls == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
/* name */
|
|
method = (*env)->GetMethodID (env, cls, "getName",
|
|
"()Ljava/lang/String;");
|
|
if (method == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
ret = (jstring) (*env)->CallObjectMethod (env, doctype, method);
|
|
name = xmljGetStringChars (env, ret);
|
|
|
|
/* publicId */
|
|
method = (*env)->GetMethodID (env, cls, "getPublicId",
|
|
"()Ljava/lang/String;");
|
|
if (method == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
ret = (jstring) (*env)->CallObjectMethod (env, doctype, method);
|
|
publicId = xmljGetStringChars (env, ret);
|
|
|
|
/* systemId */
|
|
method = (*env)->GetMethodID (env, cls, "getSystemId",
|
|
"()Ljava/lang/String;");
|
|
if (method == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
ret = (jstring) (*env)->CallObjectMethod (env, doctype, method);
|
|
systemId = xmljGetStringChars (env, ret);
|
|
|
|
/* internalSubset */
|
|
method = (*env)->GetMethodID (env, cls, "getInternalSubset",
|
|
"()Ljava/lang/String;");
|
|
if (method == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
ret = (jstring) (*env)->CallObjectMethod (env, doctype, method);
|
|
internalSubset = xmljGetStringChars (env, ret);
|
|
|
|
/* TODO notations */
|
|
/* TODO entities */
|
|
if (internalSubset == NULL)
|
|
{
|
|
dtd = xmlNewDtd (doc, name, publicId, systemId);
|
|
}
|
|
else
|
|
{
|
|
dtd = xmlCreateIntSubset (doc, name, publicId, systemId);
|
|
/* TODO parse internal subset? */
|
|
xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
/* Create the root element */
|
|
root = xmlNewNode (NULL, qName);
|
|
xmlDocSetRootElement (doc, root);
|
|
ns = xmlNewNs (root, href, prefix);
|
|
xmlSetNs (root, ns);
|
|
|
|
return xmljCreateDocument (env, self, doc);
|
|
}
|
|
|
|
/* -- GnomeDocumentType -- */
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocumentType_getPublicId (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlDtdPtr dtd;
|
|
|
|
dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
|
|
return xmljNewString (env, dtd->ExternalID);
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocumentType_getSystemId (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlDtdPtr dtd;
|
|
|
|
dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
|
|
return xmljNewString (env, dtd->SystemID);
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeDocumentType_getInternalSubset (JNIEnv * env,
|
|
jobject self
|
|
__attribute__ ((__unused__)))
|
|
{
|
|
/* TODO */
|
|
xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
|
|
return NULL;
|
|
}
|
|
|
|
/* -- GnomeElement -- */
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_getAttribute (JNIEnv * env,
|
|
jobject self,
|
|
jstring name)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_name;
|
|
const xmlChar *s_value;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_name = xmljGetStringChars (env, name);
|
|
s_value = xmlGetProp (node, s_name);
|
|
xmlFree ((xmlChar *) s_name);
|
|
return (s_value == NULL) ?
|
|
xmljNewString (env, BAD_CAST "") :
|
|
xmljNewString (env, s_value);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_setAttribute (JNIEnv * env,
|
|
jobject self,
|
|
jstring name,
|
|
jstring value)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_name;
|
|
const xmlChar *s_value;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_name = xmljGetStringChars (env, name);
|
|
if (xmlValidateName (s_name, 0))
|
|
{
|
|
xmljThrowDOMException (env, 5, NULL); /* INVALID_CHARACTER_ERR */
|
|
return;
|
|
}
|
|
s_value = xmljGetStringChars (env, value);
|
|
xmlSetProp (node, s_name, s_value);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_getAttributeNode (JNIEnv * env,
|
|
jobject self,
|
|
jstring name)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_name;
|
|
xmlAttrPtr attr;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_name = xmljGetStringChars (env, name);
|
|
attr = xmlHasProp (node, s_name);
|
|
if (attr == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
xmlFree ((xmlChar *) s_name);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) attr);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_setAttributeNode (JNIEnv * env,
|
|
jobject self,
|
|
jobject newAttr)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlAttrPtr new_attr;
|
|
xmlAttrPtr old_attr;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
new_attr = (xmlAttrPtr) xmljGetNodeID (env, newAttr);
|
|
if (new_attr->parent != NULL)
|
|
{
|
|
xmljThrowDOMException (env, 10, NULL); /* INUSE_ATTRIBUTE_ERR */
|
|
return NULL;
|
|
}
|
|
if (new_attr->doc != node->doc)
|
|
{
|
|
xmljThrowDOMException (env, 4, NULL); /* WRONG_DOCUMENT_ERR */
|
|
return NULL;
|
|
}
|
|
old_attr = xmlHasProp (node, new_attr->name);
|
|
if (old_attr)
|
|
{
|
|
xmlUnlinkNode ((xmlNodePtr) old_attr);
|
|
}
|
|
xmljAddAttribute (node, new_attr);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) old_attr);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_removeAttributeNode (JNIEnv * env,
|
|
jobject self
|
|
__attribute__ ((__unused__)),
|
|
jobject oldAttr)
|
|
{
|
|
xmlNodePtr attr;
|
|
|
|
attr = xmljGetNodeID (env, oldAttr);
|
|
xmlUnlinkNode (attr);
|
|
return oldAttr;
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_getAttributeNS (JNIEnv * env,
|
|
jobject self,
|
|
jstring uri,
|
|
jstring localName)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_uri;
|
|
const xmlChar *s_localName;
|
|
const xmlChar *s_value;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_localName = xmljGetStringChars (env, localName);
|
|
if (uri == NULL)
|
|
{
|
|
s_value = xmlGetNoNsProp (node, s_localName);
|
|
}
|
|
else
|
|
{
|
|
s_uri = xmljGetStringChars (env, uri);
|
|
s_value = xmlGetNsProp (node, s_localName, s_uri);
|
|
xmlFree ((xmlChar *) s_uri);
|
|
}
|
|
xmlFree ((xmlChar *) s_localName);
|
|
return (s_value == NULL) ?
|
|
xmljNewString (env, BAD_CAST "") :
|
|
xmljNewString (env, s_value);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_setAttributeNS (JNIEnv * env,
|
|
jobject self,
|
|
jstring uri,
|
|
jstring qName,
|
|
jstring value)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlNsPtr ns;
|
|
const xmlChar *s_uri;
|
|
const xmlChar *s_qName;
|
|
const xmlChar *s_prefix;
|
|
const xmlChar *s_localName;
|
|
const xmlChar *s_value;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_qName = xmljGetStringChars (env, qName);
|
|
if (xmlValidateQName (s_qName, 0))
|
|
{
|
|
xmljThrowDOMException (env, 5, NULL); /* INVALID_CHARACTER_ERR */
|
|
return;
|
|
}
|
|
s_value = xmljGetStringChars (env, value);
|
|
if (uri == NULL)
|
|
{
|
|
xmlSetProp (node, s_qName, s_value);
|
|
}
|
|
else
|
|
{
|
|
s_prefix = xmljGetPrefix (s_qName);
|
|
s_localName = xmljGetLocalName (s_qName);
|
|
s_uri = xmljGetStringChars (env, uri);
|
|
ns = xmlNewNs (node, s_uri, s_prefix);
|
|
xmlSetNsProp (node, ns, s_localName, s_value);
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_getAttributeNodeNS (JNIEnv * env,
|
|
jobject self,
|
|
jstring uri,
|
|
jstring localName)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlAttrPtr attr;
|
|
const xmlChar *s_uri;
|
|
const xmlChar *s_localName;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
attr = node->properties;
|
|
s_uri = xmljGetStringChars (env, uri);
|
|
s_localName = xmljGetStringChars (env, localName);
|
|
while (attr != NULL)
|
|
{
|
|
if (uri == NULL)
|
|
{
|
|
if (xmljMatch (s_localName, (xmlNodePtr) attr))
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if (xmljMatchNS (s_uri, s_localName, (xmlNodePtr) attr))
|
|
break;
|
|
}
|
|
attr = attr->next;
|
|
}
|
|
xmlFree ((xmlChar *) s_uri);
|
|
xmlFree ((xmlChar *) s_localName);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) attr);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_setAttributeNodeNS (JNIEnv * env,
|
|
jobject self,
|
|
jobject newAttr)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlAttrPtr new_attr;
|
|
xmlAttrPtr old_attr;
|
|
const xmlChar *uri;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
new_attr = (xmlAttrPtr) xmljGetNodeID (env, newAttr);
|
|
if (new_attr->parent != NULL)
|
|
{
|
|
xmljThrowDOMException (env, 10, NULL); /* INUSE_ATTRIBUTE_ERR */
|
|
return NULL;
|
|
}
|
|
if (new_attr->doc != node->doc)
|
|
{
|
|
xmljThrowDOMException (env, 4, NULL); /* WRONG_DOCUMENT_ERR */
|
|
return NULL;
|
|
}
|
|
uri = (new_attr->ns != NULL) ? new_attr->ns->href : NULL;
|
|
old_attr = xmlHasNsProp (node, new_attr->name, uri);
|
|
if (old_attr)
|
|
{
|
|
xmlUnlinkNode ((xmlNodePtr) old_attr);
|
|
}
|
|
xmljAddAttribute (node, new_attr);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) old_attr);
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_hasAttribute (JNIEnv * env,
|
|
jobject self,
|
|
jstring name)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_name;
|
|
const xmlChar *s_value;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_name = xmljGetStringChars (env, name);
|
|
s_value = xmlGetProp (node, s_name);
|
|
xmlFree ((xmlChar *) s_name);
|
|
return (s_value != NULL);
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeElement_hasAttributeNS (JNIEnv * env,
|
|
jobject self,
|
|
jstring uri,
|
|
jstring localName)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_uri;
|
|
const xmlChar *s_localName;
|
|
const xmlChar *s_value;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_localName = xmljGetStringChars (env, localName);
|
|
if (uri == NULL)
|
|
{
|
|
s_value = xmlGetNoNsProp (node, s_localName);
|
|
}
|
|
else
|
|
{
|
|
s_uri = xmljGetStringChars (env, uri);
|
|
s_value = xmlGetNsProp (node, s_localName, s_uri);
|
|
xmlFree ((xmlChar *) s_uri);
|
|
}
|
|
xmlFree ((xmlChar *) s_localName);
|
|
return (s_value != NULL);
|
|
}
|
|
|
|
/* -- GnomeEntity -- */
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeEntity_getPublicId (JNIEnv * env, jobject self)
|
|
{
|
|
xmlEntityPtr entity;
|
|
|
|
entity = (xmlEntityPtr) xmljGetNodeID (env, self);
|
|
return xmljNewString (env, entity->ExternalID);
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeEntity_getSystemId (JNIEnv * env, jobject self)
|
|
{
|
|
xmlEntityPtr entity;
|
|
|
|
entity = (xmlEntityPtr) xmljGetNodeID (env, self);
|
|
return xmljNewString (env, entity->SystemID);
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeEntity_getNotationName (JNIEnv * env,
|
|
jobject self
|
|
__attribute__ ((__unused__)))
|
|
{
|
|
/* TODO */
|
|
xmljThrowDOMException (env, 9, NULL); /* NOT_SUPPORTED_ERR */
|
|
return NULL;
|
|
}
|
|
|
|
/* -- GnomeNamedNodeMap -- */
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_getNamedItem (JNIEnv * env,
|
|
jobject self,
|
|
jstring name)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
jint type;
|
|
|
|
cls = (*env)->GetObjectClass (env, self);
|
|
field = (*env)->GetFieldID (env, cls, "type", "I");
|
|
type = (*env)->GetIntField (env, self, field);
|
|
|
|
if (type == 0)
|
|
{
|
|
xmlAttrPtr attr;
|
|
|
|
attr = xmljGetNamedItem (env, self, name);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) attr);
|
|
}
|
|
else
|
|
{
|
|
xmlDtdPtr dtd;
|
|
xmlHashTablePtr hash;
|
|
const xmlChar *s_name;
|
|
xmlNodePtr ret;
|
|
|
|
dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
|
|
hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
|
|
if (hash == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
s_name = xmljGetStringChars (env, name);
|
|
ret = (xmlNodePtr) xmlHashLookup (hash, s_name);
|
|
xmlFree ((xmlChar *) s_name);
|
|
return xmljGetNodeInstance (env, ret);
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_setNamedItem (JNIEnv * env,
|
|
jobject self,
|
|
jobject arg)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
jint type;
|
|
xmlNodePtr node;
|
|
xmlNodePtr argNode;
|
|
|
|
cls = (*env)->GetObjectClass (env, self);
|
|
field = (*env)->GetFieldID (env, cls, "type", "I");
|
|
type = (*env)->GetIntField (env, self, field);
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
argNode = xmljGetNodeID (env, arg);
|
|
|
|
if (argNode->doc != node->doc)
|
|
{
|
|
xmljThrowDOMException (env, 4, NULL); /* WRONG_DOCUMENT_ERR */
|
|
}
|
|
xmljValidateChildNode (env, node, argNode);
|
|
if ((*env)->ExceptionOccurred (env))
|
|
{
|
|
return NULL;
|
|
}
|
|
if (type == 0)
|
|
{
|
|
if (argNode->parent != NULL)
|
|
{
|
|
xmljThrowDOMException (env, 10, NULL); /* INUSE_ATTRIBUTE_ERR */
|
|
return NULL;
|
|
}
|
|
xmlAddChild (node, argNode);
|
|
}
|
|
else
|
|
{
|
|
xmlDtdPtr dtd;
|
|
xmlHashTablePtr hash;
|
|
|
|
dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
|
|
hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
|
|
if (hash == NULL)
|
|
{
|
|
hash = xmlHashCreate (10);
|
|
if (type == 1)
|
|
{
|
|
dtd->entities = hash;
|
|
}
|
|
else
|
|
{
|
|
dtd->notations = hash;
|
|
}
|
|
}
|
|
xmlHashAddEntry (hash, argNode->name, argNode);
|
|
}
|
|
return arg;
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_removeNamedItem (JNIEnv * env,
|
|
jobject self,
|
|
jstring name)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
jint type;
|
|
|
|
cls = (*env)->GetObjectClass (env, self);
|
|
field = (*env)->GetFieldID (env, cls, "type", "I");
|
|
type = (*env)->GetIntField (env, self, field);
|
|
|
|
if (type == 0)
|
|
{
|
|
xmlAttrPtr attr;
|
|
|
|
attr = xmljGetNamedItem (env, self, name);
|
|
if (attr == NULL)
|
|
{
|
|
xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
|
|
return NULL;
|
|
}
|
|
xmlUnlinkNode ((xmlNodePtr) attr);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) attr);
|
|
}
|
|
else
|
|
{
|
|
xmlDtdPtr dtd;
|
|
xmlHashTablePtr hash;
|
|
const xmlChar *s_name;
|
|
xmlNodePtr ret;
|
|
|
|
dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
|
|
hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
|
|
if (hash == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
s_name = xmljGetStringChars (env, name);
|
|
ret = (xmlNodePtr) xmlHashLookup (hash, s_name);
|
|
if (ret != NULL)
|
|
{
|
|
xmlHashRemoveEntry (hash, s_name, NULL);
|
|
}
|
|
xmlFree ((xmlChar *) s_name);
|
|
return xmljGetNodeInstance (env, ret);
|
|
}
|
|
}
|
|
|
|
void
|
|
xmljHashScanner (void *payload, void *vdata, xmlChar *name)
|
|
{
|
|
xmljHashScanData *data;
|
|
|
|
data = (xmljHashScanData *) vdata;
|
|
if (data->count <= data->index)
|
|
{
|
|
data->node = (xmlNodePtr) payload;
|
|
}
|
|
data->count++;
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_item (JNIEnv * env,
|
|
jobject self, jint index)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
jint type;
|
|
|
|
cls = (*env)->GetObjectClass (env, self);
|
|
field = (*env)->GetFieldID (env, cls, "type", "I");
|
|
type = (*env)->GetIntField (env, self, field);
|
|
|
|
if (type == 0)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlAttrPtr attr;
|
|
jint count;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
switch (node->type)
|
|
{
|
|
case XML_ELEMENT_NODE:
|
|
attr = node->properties;
|
|
for (count = 0; attr != NULL && count < index; count++)
|
|
{
|
|
attr = attr->next;
|
|
}
|
|
if (attr == NULL)
|
|
{
|
|
char msg[1024];
|
|
sprintf (msg, "No attribute at index %d\n", (int) index);
|
|
xmljThrowException (env, "java/lang/NullPointerException", msg);
|
|
return NULL;
|
|
}
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) attr);
|
|
default:
|
|
return NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
xmlDtdPtr dtd;
|
|
xmlHashTablePtr hash;
|
|
xmljHashScanData *data;
|
|
xmlNodePtr ret;
|
|
|
|
dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
|
|
hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
|
|
if (hash == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
data = (xmljHashScanData *) malloc (sizeof (xmljHashScanData));
|
|
if (data == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
data->index = index;
|
|
data->count = 0;
|
|
data->node = NULL;
|
|
xmlHashScan (hash, xmljHashScanner, data);
|
|
ret = data->node;
|
|
free (data);
|
|
return xmljGetNodeInstance (env, ret);
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_getLength (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
jint type;
|
|
|
|
cls = (*env)->GetObjectClass (env, self);
|
|
field = (*env)->GetFieldID (env, cls, "type", "I");
|
|
type = (*env)->GetIntField (env, self, field);
|
|
|
|
if (type == 0)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlAttrPtr attr;
|
|
jint count;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
switch (node->type)
|
|
{
|
|
case XML_ELEMENT_NODE:
|
|
count = 0;
|
|
attr = node->properties;
|
|
while (attr != NULL)
|
|
{
|
|
count++;
|
|
attr = attr->next;
|
|
}
|
|
return count;
|
|
default:
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
xmlDtdPtr dtd;
|
|
xmlHashTablePtr hash;
|
|
xmljHashScanData *data;
|
|
jint ret;
|
|
|
|
dtd = (xmlDtdPtr) xmljGetNodeID (env, self);
|
|
hash = (xmlHashTablePtr) ((type == 1) ? dtd->entities : dtd->notations);
|
|
if (hash == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
data = (xmljHashScanData *) malloc (sizeof (xmljHashScanData));
|
|
if (data == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
data->index = -1;
|
|
data->count = 0;
|
|
data->node = NULL;
|
|
xmlHashScan (hash, xmljHashScanner, data);
|
|
ret = data->count;
|
|
free (data);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_getNamedItemNS (JNIEnv * env,
|
|
jobject self,
|
|
jstring uri,
|
|
jstring localName)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
jint type;
|
|
|
|
cls = (*env)->GetObjectClass (env, self);
|
|
field = (*env)->GetFieldID (env, cls, "type", "I");
|
|
type = (*env)->GetIntField (env, self, field);
|
|
|
|
if (type == 0)
|
|
{
|
|
xmlAttrPtr attr;
|
|
|
|
attr = xmljGetNamedItemNS (env, self, uri, localName);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) attr);
|
|
}
|
|
else
|
|
{
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_setNamedItemNS (JNIEnv * env,
|
|
jobject self,
|
|
jobject arg)
|
|
{
|
|
return Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_setNamedItem (env, self,
|
|
arg);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNamedNodeMap_removeNamedItemNS (JNIEnv * env,
|
|
jobject self,
|
|
jstring uri,
|
|
jstring
|
|
localName)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
jint type;
|
|
|
|
cls = (*env)->GetObjectClass (env, self);
|
|
field = (*env)->GetFieldID (env, cls, "type", "I");
|
|
type = (*env)->GetIntField (env, self, field);
|
|
|
|
if (type == 0)
|
|
{
|
|
xmlAttrPtr attr;
|
|
|
|
attr = xmljGetNamedItemNS (env, self, uri, localName);
|
|
if (attr == NULL)
|
|
{
|
|
xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
|
|
return NULL;
|
|
}
|
|
else
|
|
{
|
|
xmlUnlinkNode ((xmlNodePtr) attr);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) attr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
/* -- GnomeNode -- */
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getNodeName (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
if (node == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
return xmljNewString (env, node->name);
|
|
}
|
|
|
|
xmlChar *
|
|
xmljGetNodeValue (xmlNodePtr node)
|
|
{
|
|
/* If not character data, return null */
|
|
switch (node->type)
|
|
{
|
|
case XML_TEXT_NODE:
|
|
case XML_CDATA_SECTION_NODE:
|
|
case XML_COMMENT_NODE:
|
|
case XML_ATTRIBUTE_NODE:
|
|
return xmlNodeGetContent (node);
|
|
default:
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getNodeValue (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlChar *text;
|
|
jstring ret;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
text = xmljGetNodeValue (node);
|
|
ret = xmljNewString (env, (const xmlChar *) text);
|
|
if (text != NULL)
|
|
{
|
|
xmlFree (text);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_setNodeValue (JNIEnv * env,
|
|
jobject self,
|
|
jstring nodeValue)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_nodeValue;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
|
|
/* If not character data, return */
|
|
if (node->type != XML_TEXT_NODE &&
|
|
node->type != XML_CDATA_SECTION_NODE && node->type != XML_COMMENT_NODE)
|
|
return;
|
|
|
|
s_nodeValue = xmljGetStringChars (env, nodeValue);
|
|
xmlNodeSetContent (node, s_nodeValue);
|
|
}
|
|
|
|
JNIEXPORT jshort JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getNodeType (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
switch (node->type)
|
|
{
|
|
case XML_DTD_NODE:
|
|
return XML_DOCUMENT_TYPE_NODE;
|
|
case XML_ATTRIBUTE_DECL:
|
|
return XML_ATTRIBUTE_NODE;
|
|
case XML_ENTITY_DECL:
|
|
return XML_ENTITY_NODE;
|
|
default:
|
|
return node->type;
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getParentNode (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
return xmljGetNodeInstance (env, node->parent);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getFirstChild (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
return xmljGetNodeInstance (env, node->children);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getLastChild (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
return xmljGetNodeInstance (env, node->last);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getPreviousSibling (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
return xmljGetNodeInstance (env, node->prev);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getNextSibling (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
return xmljGetNodeInstance (env, node->next);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getOwnerDocument (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) node->doc);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_xmljInsertBefore (JNIEnv * env,
|
|
jobject self,
|
|
jobject newChild,
|
|
jobject refChild)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlNodePtr newChildNode;
|
|
xmlNodePtr refChildNode;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
newChildNode = xmljGetNodeID (env, newChild);
|
|
refChildNode = xmljGetNodeID (env, refChild);
|
|
|
|
/* Is refChildNode a child of this node? */
|
|
if (refChildNode == NULL ||
|
|
refChildNode->parent == NULL ||
|
|
refChildNode->parent != node)
|
|
{
|
|
xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
|
|
return NULL;
|
|
}
|
|
/* Check new child */
|
|
xmljValidateChildNode (env, node, newChildNode);
|
|
if ((*env)->ExceptionOccurred (env))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
newChildNode = xmlAddPrevSibling (refChildNode, newChildNode);
|
|
return xmljGetNodeInstance (env, newChildNode);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_xmljReplaceChild (JNIEnv * env,
|
|
jobject self,
|
|
jobject newChild,
|
|
jobject oldChild)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlNodePtr newChildNode;
|
|
xmlNodePtr oldChildNode;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
newChildNode = xmljGetNodeID (env, newChild);
|
|
oldChildNode = xmljGetNodeID (env, oldChild);
|
|
|
|
/* Is oldChildNode a child of this node? */
|
|
if (oldChildNode == NULL ||
|
|
oldChildNode->parent == NULL ||
|
|
oldChildNode->parent != node)
|
|
{
|
|
xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
|
|
return NULL;
|
|
}
|
|
/* Check new child */
|
|
xmljValidateChildNode (env, node, newChildNode);
|
|
if ((*env)->ExceptionOccurred (env))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
newChildNode = xmlReplaceNode (oldChildNode, newChildNode);
|
|
return xmljGetNodeInstance (env, newChildNode);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_xmljRemoveChild (JNIEnv * env,
|
|
jobject self,
|
|
jobject oldChild)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlNodePtr oldChildNode;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
oldChildNode = xmljGetNodeID (env, oldChild);
|
|
|
|
if (oldChildNode == NULL ||
|
|
oldChildNode->parent == NULL ||
|
|
oldChildNode->parent != node)
|
|
{
|
|
xmljThrowDOMException (env, 8, NULL); /* NOT_FOUND_ERR */
|
|
return NULL;
|
|
}
|
|
xmlUnlinkNode (oldChildNode);
|
|
return oldChild;
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_xmljAppendChild (JNIEnv * env,
|
|
jobject self,
|
|
jobject newChild)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlNodePtr newChildNode;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
newChildNode = xmljGetNodeID (env, newChild);
|
|
|
|
/* Check new child */
|
|
xmljValidateChildNode (env, node, newChildNode);
|
|
if ((*env)->ExceptionOccurred (env))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
newChildNode = xmlAddChild (node, newChildNode);
|
|
return xmljGetNodeInstance (env, newChildNode);
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_hasChildNodes (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
return (node->children != NULL);
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_xmljCloneNode (JNIEnv * env,
|
|
jobject self, jboolean deep)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlNodePtr clone;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
clone = xmlCopyNode (node, deep);
|
|
clone->parent = NULL;
|
|
clone->doc = node->doc;
|
|
return xmljGetNodeInstance (env, clone);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_normalize (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
xmljNormalizeNode (node);
|
|
}
|
|
|
|
void
|
|
xmljNormalizeNode (xmlNodePtr node)
|
|
{
|
|
xmlNodePtr cur;
|
|
xmlNodePtr last = NULL;
|
|
|
|
cur = node->children;
|
|
while (cur != NULL)
|
|
{
|
|
switch (cur->type)
|
|
{
|
|
case XML_CDATA_SECTION_NODE:
|
|
case XML_TEXT_NODE:
|
|
if (xmlIsBlankNode (cur))
|
|
{
|
|
xmlNodePtr next = cur->next;
|
|
xmlUnlinkNode (cur);
|
|
xmlFreeNode (cur);
|
|
cur = next;
|
|
continue;
|
|
}
|
|
if (last != NULL)
|
|
{
|
|
last = xmlTextMerge (last, cur);
|
|
xmlUnlinkNode (cur);
|
|
xmlFreeNode (cur);
|
|
cur = last;
|
|
}
|
|
else
|
|
{
|
|
last = cur;
|
|
}
|
|
break;
|
|
default:
|
|
last = NULL;
|
|
xmljNormalizeNode (cur);
|
|
}
|
|
cur = cur->next;
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getNamespaceURI (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
if (node->type != XML_ELEMENT_NODE &&
|
|
node->type != XML_ATTRIBUTE_NODE)
|
|
{
|
|
return NULL;
|
|
}
|
|
if (node->ns == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
return xmljNewString (env, node->ns->href);
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getPrefix (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
if (node->type != XML_ELEMENT_NODE &&
|
|
node->type != XML_ATTRIBUTE_NODE)
|
|
{
|
|
return NULL;
|
|
}
|
|
if (node->ns == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
return xmljNewString (env, node->ns->prefix);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_setPrefix (JNIEnv * env,
|
|
jobject self, jstring prefix)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_prefix;
|
|
|
|
s_prefix = xmljGetStringChars (env, prefix);
|
|
if (xmlValidateName (s_prefix, 0))
|
|
{
|
|
xmljThrowDOMException (env, 5, NULL); /* INVALID_CHARACTER_ERR */
|
|
}
|
|
node = xmljGetNodeID (env, self);
|
|
if (node->type != XML_ELEMENT_NODE &&
|
|
node->type != XML_ATTRIBUTE_NODE)
|
|
{
|
|
xmljThrowDOMException (env, 3, NULL); /* HIERARCHY_REQUEST_ERR */
|
|
return;
|
|
}
|
|
if (node->ns == NULL)
|
|
{
|
|
xmljThrowDOMException (env, 14, NULL); /* NAMESPACE_ERR */
|
|
return;
|
|
}
|
|
node->ns->prefix = s_prefix;
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getLocalName (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
int *len;
|
|
jstring ret;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
if (node->name == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
len = (int *) malloc (sizeof (int));
|
|
if (xmlSplitQName3 (node->name, len) != NULL)
|
|
{
|
|
ret = xmljNewString (env, node->name + (*len));
|
|
}
|
|
else
|
|
{
|
|
ret = xmljNewString (env, node->name);
|
|
}
|
|
free (len);
|
|
return ret;
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_hasAttributes (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
return (node->properties != NULL);
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_getBaseURI (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlChar *baseURI;
|
|
jstring ret;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
baseURI = xmlNodeGetBase (node->doc, node);
|
|
ret = xmljNewString (env, (const xmlChar *) baseURI);
|
|
if (baseURI != NULL)
|
|
{
|
|
xmlFree (baseURI);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_lookupPrefix (JNIEnv * env, jobject self,
|
|
jstring namespaceURI)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlNsPtr ns;
|
|
xmlDocPtr doc;
|
|
const xmlChar *s_uri;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
doc = node->doc;
|
|
/* If this is a document node, search from the root element */
|
|
if (node->type == XML_DOCUMENT_NODE)
|
|
{
|
|
doc = (xmlDocPtr) node;
|
|
node = xmlDocGetRootElement (doc);
|
|
}
|
|
s_uri = xmljGetStringChars (env, namespaceURI);
|
|
ns = xmlSearchNsByHref (doc, node, s_uri);
|
|
xmlFree ((xmlChar *) s_uri);
|
|
if (ns == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
return xmljNewString (env, ns->prefix);
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_isDefaultNamespace (JNIEnv * env,
|
|
jobject self,
|
|
jstring namespaceURI)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlNsPtr ns;
|
|
const xmlChar *s_uri;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_uri = xmljGetStringChars (env, namespaceURI);
|
|
ns = xmlSearchNsByHref (node->doc, node, s_uri);
|
|
xmlFree ((xmlChar *) s_uri);
|
|
if (ns == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
return (ns->prefix == NULL || xmlStrlen (ns->prefix) == 0);
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_lookupNamespaceURI (JNIEnv * env,
|
|
jobject self,
|
|
jstring prefix)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlDocPtr doc;
|
|
xmlNsPtr ns;
|
|
const xmlChar *s_prefix;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
doc = node->doc;
|
|
/* If this is a document node, search from the root element */
|
|
if (node->type == XML_DOCUMENT_NODE)
|
|
{
|
|
doc = (xmlDocPtr) node;
|
|
node = xmlDocGetRootElement (doc);
|
|
}
|
|
s_prefix = xmljGetStringChars (env, prefix);
|
|
ns = xmlSearchNs (doc, node, s_prefix);
|
|
xmlFree ((xmlChar *) s_prefix);
|
|
if (ns == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
return xmljNewString (env, ns->href);
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_xmljCompareTo (JNIEnv * env,
|
|
jobject self,
|
|
jobject other)
|
|
{
|
|
xmlNodePtr n1, n2, x;
|
|
int d1, d2, delta, c;
|
|
|
|
n1 = xmljGetNodeID (env, self);
|
|
n2 = xmljGetNodeID (env, other);
|
|
if (n1->doc != n2->doc)
|
|
{
|
|
return 0;
|
|
}
|
|
if (n1->type == XML_ATTRIBUTE_NODE || n2->type == XML_ATTRIBUTE_NODE)
|
|
{
|
|
return 0;
|
|
}
|
|
d1 = 0;
|
|
for (x = n1->parent; x && x->type != XML_DOCUMENT_NODE; x = x->parent)
|
|
{
|
|
d1++;
|
|
}
|
|
d2 = 0;
|
|
for (x = n2->parent; x && x->type != XML_DOCUMENT_NODE; x = x->parent)
|
|
{
|
|
d2++;
|
|
}
|
|
delta = d1 - d2;
|
|
while (d1 > d2)
|
|
{
|
|
n1 = n1->parent;
|
|
d1--;
|
|
}
|
|
while (d2 > d1)
|
|
{
|
|
n2 = n2->parent;
|
|
d2--;
|
|
}
|
|
c = xmljCompare (n1, n2);
|
|
return (c != 0) ? c : delta;
|
|
}
|
|
|
|
/* Compare at same level */
|
|
int
|
|
xmljCompare (xmlNodePtr n1, xmlNodePtr n2)
|
|
{
|
|
int c, i1, i2;
|
|
|
|
if (n1->parent == NULL || n1->type == XML_DOCUMENT_NODE ||
|
|
n2->parent == NULL || n2->type == XML_DOCUMENT_NODE ||
|
|
n1 == n2)
|
|
{
|
|
return 0;
|
|
}
|
|
c = xmljCompare (n1->parent, n2->parent);
|
|
if (c != 0)
|
|
{
|
|
return c;
|
|
}
|
|
i1 = 0;
|
|
for (n1 = n1->prev; n1; n1 = n1->prev)
|
|
{
|
|
i1++;
|
|
}
|
|
i2 = 0;
|
|
for (n2 = n2->prev; n2; n2 = n2->prev)
|
|
{
|
|
i2++;
|
|
}
|
|
return i1 - i2;
|
|
}
|
|
|
|
int
|
|
xmljIsEqualNodeList (xmlNodePtr node1, xmlNodePtr node2)
|
|
{
|
|
while (node1 != NULL)
|
|
{
|
|
if (!xmljIsEqualNode (node1, node2))
|
|
{
|
|
return 0;
|
|
}
|
|
node1 = node1->next;
|
|
node2 = node2->next;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
xmljIsEqualNode (xmlNodePtr node1, xmlNodePtr node2)
|
|
{
|
|
const xmlChar *val1;
|
|
const xmlChar *val2;
|
|
|
|
if (node1 == node2)
|
|
{
|
|
return 1;
|
|
}
|
|
if (node1 == NULL || node2 == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
/* Check node type */
|
|
if (node1->type != node2->type)
|
|
{
|
|
return 0;
|
|
}
|
|
/* Check node name */
|
|
if (!xmlStrEqual (node1->name, node2->name))
|
|
{
|
|
return 0;
|
|
}
|
|
/* Check node namespace */
|
|
if (node1->type == XML_ELEMENT_NODE ||
|
|
node1->type == XML_ATTRIBUTE_NODE)
|
|
{
|
|
xmlNsPtr ns1, ns2;
|
|
|
|
ns1 = node1->ns;
|
|
if (ns1 != NULL)
|
|
{
|
|
ns2 = node2->ns;
|
|
if (ns2 == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
val1 = ns1->href;
|
|
val2 = ns2->href;
|
|
if (!xmlStrEqual (val1, val2))
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
/* Check node value */
|
|
val1 = xmljGetNodeValue (node1);
|
|
val2 = xmljGetNodeValue (node2);
|
|
if (!xmlStrEqual (val1, val2))
|
|
{
|
|
return 0;
|
|
}
|
|
/* Check attributes */
|
|
if (node1->type == XML_ELEMENT_NODE &&
|
|
!xmljIsEqualNodeList ((xmlNodePtr) node1->properties,
|
|
(xmlNodePtr) node2->properties))
|
|
{
|
|
return 0;
|
|
}
|
|
/* Check doctype */
|
|
if (node1->type == XML_DOCUMENT_NODE)
|
|
{
|
|
xmlDocPtr doc1 = (xmlDocPtr) node1;
|
|
xmlDocPtr doc2 = (xmlDocPtr) node2;
|
|
|
|
if (!xmljIsEqualNode ((xmlNodePtr) doc1->intSubset,
|
|
(xmlNodePtr) doc2->intSubset) ||
|
|
!xmljIsEqualNode ((xmlNodePtr) doc1->extSubset,
|
|
(xmlNodePtr) doc2->extSubset))
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
/* Check child nodes */
|
|
if (!xmljIsEqualNodeList (node1->children, node2->children))
|
|
{
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNode_isEqualNode (JNIEnv * env,
|
|
jobject self,
|
|
jobject arg)
|
|
{
|
|
xmlNodePtr node1;
|
|
xmlNodePtr node2;
|
|
|
|
node1 = xmljGetNodeID (env, self);
|
|
node2 = xmljGetNodeID (env, arg);
|
|
return xmljIsEqualNode (node1, node2);
|
|
}
|
|
|
|
/* -- GnomeNodeList -- */
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNodeList_item (JNIEnv * env,
|
|
jobject self, jint index)
|
|
{
|
|
xmlNodePtr node;
|
|
jint count;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
node = node->children;
|
|
count = 0;
|
|
for (count = 0; node != NULL && count < index; count++)
|
|
{
|
|
node = node->next;
|
|
}
|
|
return xmljGetNodeInstance (env, node);
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNodeList_getLength (JNIEnv * env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
jint count;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
count = 0;
|
|
node = node->children;
|
|
while (node != NULL)
|
|
{
|
|
count++;
|
|
node = node->next;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
/* -- GnomeNotation -- */
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNotation_getPublicId (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlNotationPtr notation;
|
|
|
|
notation = (xmlNotationPtr) xmljGetNodeID (env, self);
|
|
if (notation->PublicID == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
return xmljNewString (env, notation->PublicID);
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeNotation_getSystemId (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlNotationPtr notation;
|
|
|
|
notation = (xmlNotationPtr) xmljGetNodeID (env, self);
|
|
if (notation->SystemID == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
return xmljNewString (env, notation->SystemID);
|
|
}
|
|
|
|
/* -- GnomeProcessingInstruction -- */
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeProcessingInstruction_getData (JNIEnv * env,
|
|
jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlChar *text;
|
|
jstring ret;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
text = xmlNodeGetContent (node);
|
|
ret = xmljNewString (env, (const xmlChar *) text);
|
|
if (text != NULL)
|
|
{
|
|
xmlFree (text);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeProcessingInstruction_setData (JNIEnv * env,
|
|
jobject self,
|
|
jstring data)
|
|
{
|
|
xmlNodePtr node;
|
|
const xmlChar *s_data;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
s_data = xmljGetStringChars (env, data);
|
|
xmlNodeSetContent (node, s_data);
|
|
}
|
|
|
|
/* -- GnomeTypeInfo -- */
|
|
|
|
xmlDtdPtr xmljGetDtd (xmlDocPtr doc)
|
|
{
|
|
xmlNodePtr ctx;
|
|
|
|
for (ctx = doc->children; ctx; ctx = ctx->next)
|
|
{
|
|
if (ctx->type == XML_DOCUMENT_TYPE_NODE)
|
|
{
|
|
return (xmlDtdPtr) ctx;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeTypeInfo_getTypeName (JNIEnv *env, jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlDtdPtr dtd;
|
|
xmlAttributePtr attribute;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
dtd = xmljGetDtd (node->doc);
|
|
if (dtd)
|
|
{
|
|
switch (node->type)
|
|
{
|
|
case XML_ATTRIBUTE_NODE:
|
|
attribute = xmlGetDtdAttrDesc (dtd, node->parent->name, node->name);
|
|
if (attribute)
|
|
{
|
|
switch (attribute->type)
|
|
{
|
|
case XML_ATTRIBUTE_CDATA:
|
|
return xmljNewString (env, BAD_CAST "CDATA");
|
|
case XML_ATTRIBUTE_ID:
|
|
return xmljNewString (env, BAD_CAST "ID");
|
|
case XML_ATTRIBUTE_IDREF:
|
|
return xmljNewString (env, BAD_CAST "IDREF");
|
|
case XML_ATTRIBUTE_IDREFS:
|
|
return xmljNewString (env, BAD_CAST "IDREFS");
|
|
case XML_ATTRIBUTE_ENTITY:
|
|
return xmljNewString (env, BAD_CAST "ENTITY");
|
|
case XML_ATTRIBUTE_ENTITIES:
|
|
return xmljNewString (env, BAD_CAST "ENTITIES");
|
|
case XML_ATTRIBUTE_NMTOKEN:
|
|
return xmljNewString (env, BAD_CAST "NMTOKEN");
|
|
case XML_ATTRIBUTE_NMTOKENS:
|
|
return xmljNewString (env, BAD_CAST "NMTOKENS");
|
|
default:
|
|
return NULL;
|
|
}
|
|
}
|
|
return NULL;
|
|
default:
|
|
return NULL;
|
|
}
|
|
}
|
|
/* TODO when XML Schema support is available */
|
|
return NULL;
|
|
}
|
|
|
|
JNIEXPORT jstring JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeTypeInfo_getTypeNamespace (JNIEnv *env,
|
|
jobject self)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlDtdPtr dtd;
|
|
xmlAttributePtr attribute;
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
dtd = xmljGetDtd (node->doc);
|
|
if (dtd)
|
|
{
|
|
switch (node->type)
|
|
{
|
|
case XML_ATTRIBUTE_NODE:
|
|
attribute = xmlGetDtdAttrDesc (dtd, node->parent->name, node->name);
|
|
if (attribute)
|
|
{
|
|
return xmljNewString (env,
|
|
BAD_CAST "http://www.w3.org/TR/REC-xml");
|
|
}
|
|
return NULL;
|
|
default:
|
|
return NULL;
|
|
}
|
|
}
|
|
/* TODO when XML Schema support is available */
|
|
return NULL;
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_gnu_xml_libxmlj_dom_GnomeTypeInfo_isDerivedFrom (JNIEnv *env
|
|
__attribute__ ((__unused__)),
|
|
jobject self
|
|
__attribute__ ((__unused__)),
|
|
jstring typeNS
|
|
__attribute__ ((__unused__)),
|
|
jstring typeName
|
|
__attribute__ ((__unused__)),
|
|
jint method
|
|
__attribute__ ((__unused__)))
|
|
{
|
|
/* TODO when XML Schema support is available */
|
|
return 0;
|
|
}
|
|
|
|
/* -- Utility -- */
|
|
|
|
/*
|
|
* Create GnomeDocument object from the given xmlDocPtr
|
|
*/
|
|
jobject
|
|
xmljCreateDocument (JNIEnv * env, jobject self, xmlDocPtr doc)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
jobject ret;
|
|
|
|
if (!doc)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
/* Get document object */
|
|
ret = xmljGetNodeInstance (env, (xmlNodePtr) doc);
|
|
|
|
/* Set DOM implementation field */
|
|
cls = (*env)->FindClass (env, "gnu/xml/libxmlj/dom/GnomeDocument");
|
|
field = (*env)->GetFieldID (env, cls, "dom",
|
|
"Lorg/w3c/dom/DOMImplementation;");
|
|
(*env)->SetObjectField (env, ret, field, self);
|
|
return ret;
|
|
}
|
|
|
|
xmlAttrPtr
|
|
xmljGetNamedItem (JNIEnv * env, jobject self, jstring name)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlAttrPtr attr;
|
|
const xmlChar *s_name;
|
|
|
|
s_name = xmljGetStringChars (env, name);
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
attr = node->properties;
|
|
while (attr != NULL)
|
|
{
|
|
if (xmljMatch (s_name, (xmlNodePtr) attr))
|
|
break;
|
|
attr = attr->next;
|
|
}
|
|
xmlFree ((xmlChar *) s_name);
|
|
|
|
return attr;
|
|
}
|
|
|
|
xmlAttrPtr
|
|
xmljGetNamedItemNS (JNIEnv * env, jobject self, jstring uri, jstring localName)
|
|
{
|
|
xmlNodePtr node;
|
|
xmlAttrPtr attr;
|
|
const xmlChar *s_uri;
|
|
const xmlChar *s_localName;
|
|
|
|
s_uri = xmljGetStringChars (env, uri);
|
|
s_localName = xmljGetStringChars (env, localName);
|
|
|
|
node = xmljGetNodeID (env, self);
|
|
attr = node->properties;
|
|
while (attr != NULL)
|
|
{
|
|
if (xmljMatchNS (s_uri, s_localName, (xmlNodePtr) attr))
|
|
break;
|
|
attr = attr->next;
|
|
}
|
|
xmlFree ((xmlChar *) s_uri);
|
|
xmlFree ((xmlChar *) s_localName);
|
|
|
|
return attr;
|
|
}
|