mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			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;
 | 
						|
}
 |