rrichards               Wed Feb 18 15:37:31 2004 EDT

  Modified files:              
    /php-src/ext/dom    node.c 
  Log:
  correct implementation of prefix write property
  
http://cvs.php.net/diff.php/php-src/ext/dom/node.c?r1=1.25&r2=1.26&ty=u
Index: php-src/ext/dom/node.c
diff -u php-src/ext/dom/node.c:1.25 php-src/ext/dom/node.c:1.26
--- php-src/ext/dom/node.c:1.25 Tue Feb 17 06:13:47 2004
+++ php-src/ext/dom/node.c      Wed Feb 18 15:37:30 2004
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: node.c,v 1.25 2004/02/17 11:13:47 rrichards Exp $ */
+/* $Id: node.c,v 1.26 2004/02/18 20:37:30 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -674,9 +674,8 @@
 int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC)
 {
        zval value_copy;
-       xmlNode *nodep;
-       xmlDocPtr doc;
-       xmlNsPtr ns, curns = NULL;
+       xmlNode *nodep, *nsnode = NULL;
+       xmlNsPtr ns = NULL, curns;
        char *strURI;
        char *prefix;
 
@@ -689,7 +688,14 @@
 
        switch (nodep->type) {
                case XML_ELEMENT_NODE:
+                       nsnode = nodep;
                case XML_ATTRIBUTE_NODE:
+                       if (nsnode == NULL) {
+                               nsnode = nodep->parent;
+                               if (nsnode == NULL) {
+                                       nsnode = xmlDocGetRootElement(nodep->doc);
+                               }
+                       }
                        if (newval->type != IS_STRING) {
                                if(newval->refcount > 1) {
                                        value_copy = *newval;
@@ -699,38 +705,37 @@
                                convert_to_string(newval);
                        }
                        prefix = Z_STRVAL_P(newval);
-                       if (nodep->ns != NULL && !xmlStrEqual(nodep->ns->prefix, 
(xmlChar *)prefix)) {
+                       if (nsnode && nodep->ns != NULL && 
!xmlStrEqual(nodep->ns->prefix, (xmlChar *)prefix)) {
                                strURI = (char *) nodep->ns->href;
                                if (strURI == NULL || 
                                        (!strcmp (prefix, "xml") && strcmp(strURI, 
XML_XML_NAMESPACE)) ||
                                        (nodep->type == XML_ATTRIBUTE_NODE && !strcmp 
(prefix, "xmlns") &&
                                         strcmp (strURI, DOM_XMLNS_NAMESPACE)) ||
                                        (nodep->type == XML_ATTRIBUTE_NODE && !strcmp 
(nodep->name, "xmlns"))) {
-                                       if (newval == &value_copy) {
-                                               zval_dtor(newval);
+                                       ns = NULL;
+                               } else {
+                                       curns = nsnode->nsDef;
+                                       while (curns != NULL) {
+                                               if (xmlStrEqual((xmlChar *)prefix, 
curns->prefix) && xmlStrEqual(nodep->ns->href, curns->href)) {
+                                                       ns = curns;
+                                                       break;
+                                               }
+                                               curns = curns->next;
                                        }
-                                       php_dom_throw_error(NAMESPACE_ERR, 
dom_get_strict_error(obj->document) TSRMLS_CC);
-                                       return FAILURE; 
-                               }
-                               ns = xmlNewNs(NULL, nodep->ns->href, (xmlChar 
*)prefix);
-                               if (nodep->doc != NULL) {
-                                       doc = nodep->doc;
-                                       if (doc->oldNs == NULL) {
-                                               doc->oldNs = (xmlNsPtr) 
xmlMalloc(sizeof(xmlNs));
-                                               memset(doc->oldNs, 0, sizeof(xmlNs));
-                                               doc->oldNs->type = XML_LOCAL_NAMESPACE;
-                                               doc->oldNs->href = 
xmlStrdup(XML_XML_NAMESPACE); 
-                                               doc->oldNs->prefix = xmlStrdup((const 
xmlChar *)"xml"); 
+                                       if (ns == NULL) {
+                                               ns = xmlNewNs(nsnode, nodep->ns->href, 
(xmlChar *)prefix);
                                        }
+                               }
 
-                                       curns = doc->oldNs;
-                                       while (curns->next != NULL) {
-                                               curns = curns->next;
+                               if (ns == NULL) {
+                                       if (newval == &value_copy) {
+                                               zval_dtor(newval);
                                        }
-                                       curns->next = ns;
+                                       php_dom_throw_error(NAMESPACE_ERR, 
dom_get_strict_error(obj->document) TSRMLS_CC);
+                                       return FAILURE;
                                }
 
-                               nodep->ns = curns;
+                               xmlSetNs(nodep, ns);
                        }
                        if (newval == &value_copy) {
                                zval_dtor(newval);

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to