12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618 |
- /* 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;
- }
|