rrichards               Sun Jul 27 13:57:06 2003 EDT

  Modified files:              
    /php-src/ext/dom    php_dom.h php_dom.c node.c element.c 
                        domimplementation.c document.c attr.c 
  Log:
  reworking xml namespace support
  add node lookupNamespaceURI and lookupPrefix
  add attr isId
  
Index: php-src/ext/dom/php_dom.h
diff -u php-src/ext/dom/php_dom.h:1.12 php-src/ext/dom/php_dom.h:1.13
--- php-src/ext/dom/php_dom.h:1.12      Thu Jul 24 09:18:40 2003
+++ php-src/ext/dom/php_dom.h   Sun Jul 27 13:57:05 2003
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_dom.h,v 1.12 2003/07/24 13:18:40 rrichards Exp $ */
+/* $Id: php_dom.h,v 1.13 2003/07/27 17:57:05 rrichards Exp $ */
 
 #ifndef PHP_DOM_H
 #define PHP_DOM_H
@@ -77,7 +77,8 @@
 int decrement_node_ptr(dom_object *object TSRMLS_DC);
 int increment_document_reference(dom_object *object, xmlDocPtr docp TSRMLS_DC);
 int decrement_document_reference(dom_object *object TSRMLS_DC);
-xmlNsPtr dom_get_ns(char *uri, char *qName, int uri_len, int qName_len, int 
*errorcode, char **localname);
+int dom_check_qname(char *qname, char **localname, char **prefix, int uri_len, int 
name_len);
+xmlNsPtr dom_get_ns(xmlNodePtr node, char *uri, int *errorcode, char *prefix);
 void dom_set_old_ns(xmlDoc *doc, xmlNs *ns);
 xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName);
 void dom_normalize (xmlNodePtr nodep TSRMLS_DC);
Index: php-src/ext/dom/php_dom.c
diff -u php-src/ext/dom/php_dom.c:1.21 php-src/ext/dom/php_dom.c:1.22
--- php-src/ext/dom/php_dom.c:1.21      Thu Jul 24 09:18:40 2003
+++ php-src/ext/dom/php_dom.c   Sun Jul 27 13:57:06 2003
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_dom.c,v 1.21 2003/07/24 13:18:40 rrichards Exp $ */
+/* $Id: php_dom.c,v 1.22 2003/07/27 17:57:06 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -680,7 +680,7 @@
        uncomment the following line, this will tell you the amount of not freed memory
        and the total used memory into apaches error_log  */
 /*  xmlMemoryDump();*/
-
+xmlMemoryDump();
        return SUCCESS;
 }
 
@@ -1190,51 +1190,36 @@
 }
 /* }}} end dom_set_old_ns */
 
+int dom_check_qname(char *qname, char **localname, char **prefix, int uri_len, int 
name_len) {
+       int errorcode = 0;
 
-/* {{{ xmlNsPtr dom_get_ns(char *uri, char *qName, int uri_len, int qName_len, int 
*errorcode, char *localname) */
-xmlNsPtr dom_get_ns(char *uri, char *qName, int uri_len, int qName_len, int 
*errorcode, char **localname) {
-       xmlNsPtr nsptr = NULL;
-       xmlURIPtr uristruct;
-       char *prefix = NULL;
+       if (uri_len > 0 && name_len > 0) {
+               *localname = xmlSplitQName2(qname, (xmlChar **) prefix);
+               if (*localname == NULL) {
+                       *localname = xmlStrdup(qname);
+               }
+               if (*localname == NULL || (xmlStrchr(*localname, (xmlChar) ':') != 
NULL)) {
+                       errorcode = NAMESPACE_ERR;
+               }
+       } else {
+               errorcode = NAMESPACE_ERR;
+       }
 
-       *localname = NULL;
-       *errorcode = 0;
+       return errorcode;
+}
 
-       if (uri_len > 0 || qName_len > 0) {
-               if (qName_len == 0 && uri_len > 0) {
-                       *errorcode = NAMESPACE_ERR;
-                       return nsptr;
-               }
-               if (qName_len > 0 && *errorcode == 0) {
-                       uristruct = xmlParseURI(qName);
-                       if (uristruct->opaque != NULL) {
-                               prefix = xmlStrdup(uristruct->scheme);
-                               *localname = xmlStrdup(uristruct->opaque);
-                               if (xmlStrchr(*localname, (xmlChar) ':') != NULL) {
-                                       *errorcode = NAMESPACE_ERR;
-                               } else if (!strcmp (prefix, "xml") && strcmp(uri, 
XML_XML_NAMESPACE)) {
-                                       *errorcode = NAMESPACE_ERR;
-                               }
-                       }
+/* {{{ xmlNsPtr dom_get_ns(xmlNodePtr nodep, char *uri, int *errorcode, char *prefix) 
*/
+xmlNsPtr dom_get_ns(xmlNodePtr nodep, char *uri, int *errorcode, char *prefix) {
+       xmlNsPtr nsptr = NULL;
 
-                       /* TODO: Test that localname has no invalid chars 
-                       php_dom_throw_error(INVALID_CHARACTER_ERR, TSRMLS_CC);
-                       */
+       *errorcode = 0;
 
-                       xmlFreeURI(uristruct);
-                       
-                       if (*errorcode == 0) {
-                               if (uri_len > 0 && prefix == NULL) {
-                                       *errorcode = NAMESPACE_ERR;
-                               } else if (*localname != NULL) {
-                                       nsptr = xmlNewNs(NULL, uri, prefix);
-                               }
-                       }
-               }
+       if (! (prefix && !strcmp (prefix, "xml") && strcmp(uri, XML_XML_NAMESPACE))) {
+               nsptr = xmlNewNs(nodep, uri, prefix);
        }
 
-       if (prefix != NULL) {
-               xmlFree(prefix);
+       if (nsptr == NULL) {
+               *errorcode = NAMESPACE_ERR;
        }
 
        return nsptr;
Index: php-src/ext/dom/node.c
diff -u php-src/ext/dom/node.c:1.8 php-src/ext/dom/node.c:1.9
--- php-src/ext/dom/node.c:1.8  Sat Jul 12 13:29:20 2003
+++ php-src/ext/dom/node.c      Sun Jul 27 13:57:06 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: node.c,v 1.8 2003/07/12 17:29:20 rrichards Exp $ */
+/* $Id: node.c,v 1.9 2003/07/27 17:57:06 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -543,10 +543,8 @@
                case XML_ELEMENT_NODE:
                case XML_ATTRIBUTE_NODE:
                        ns = nodep->ns;
-                       if (ns != NULL) {
-                               if (ns->prefix) {
-                                       str = (char *) ns->prefix;
-                               }
+                       if (ns != NULL && ns->prefix) {
+                               str = (char *) ns->prefix;
                        }
                        break;
                default:
@@ -578,42 +576,40 @@
        switch (nodep->type) {
                case XML_ELEMENT_NODE:
                case XML_ATTRIBUTE_NODE:
-                       ns = nodep->ns;
-                       strURI = NULL;
-                       if (nodep->ns != NULL) {
-                               strURI = (char *) nodep->ns->href;
-                       }
                        prefix = Z_STRVAL_P(newval);
-                       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"))) {
-
-                               /* TODO: throw error - find out how to without a 
return_value
-                               php_dom_throw_error(NAMESPACE_ERR, &return_value 
TSRMLS_CC); */
-                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid 
Namespace");
-                               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 (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"))) {
+
+                                       /* TODO: throw error - find out how to without 
a return_value
+                                       php_dom_throw_error(NAMESPACE_ERR, 
&return_value TSRMLS_CC); */
+                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid Namespace");
+                                       return FAILURE; 
                                }
-
-                               curns = doc->oldNs;
-                               while (curns->next != NULL) {
-                                       curns = curns->next;
+                               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"); 
+                                       }
+
+                                       curns = doc->oldNs;
+                                       while (curns->next != NULL) {
+                                               curns = curns->next;
+                                       }
+                                       curns->next = ns;
                                }
-                               curns->next = ns;
-                       }
 
-                       nodep->ns = curns;
+                               nodep->ns = curns;
+                       }
                        break;
                default:
                        break;
@@ -1002,6 +998,7 @@
        zval *id, *node, *rv = NULL;
        xmlNodePtr child, nodep, new_child = NULL;
        dom_object *intern, *childobj;
+       xmlNsPtr nsptr;
        int ret;
 
        DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
@@ -1089,6 +1086,15 @@
                RETURN_FALSE;
        }
 
+    if (new_child->nsDef != NULL && new_child->type == XML_ELEMENT_NODE && 
new_child->nsDef->href != NULL) {
+               if((nsptr = xmlSearchNsByHref(nodep->doc, new_child->parent, 
new_child->nsDef->href)) && 
+                       (new_child->nsDef->prefix == NULL || 
xmlStrEqual(nsptr->prefix, new_child->nsDef->prefix))) {
+                       dom_set_old_ns(nodep->doc, new_child->ns);
+                       new_child->nsDef = NULL;
+                       new_child->ns = nsptr;
+               }
+    }
+
        DOM_RET_OBJ(rv, new_child, &ret, intern);
 }
 /* }}} end dom_node_append_child */
@@ -1263,7 +1269,47 @@
 */
 PHP_FUNCTION(dom_node_lookup_prefix)
 {
- DOM_NOT_IMPLEMENTED();
+       zval *id;
+       xmlNodePtr nodep, lookupp = NULL;
+       dom_object *intern;
+       xmlNsPtr nsptr;
+       int uri_len = 0;
+       char *uri;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &uri, &uri_len) == 
FAILURE) {
+               return;
+       }
+       
+       if (uri_len > 0) {
+               switch (nodep->type) { 
+                       case XML_ELEMENT_NODE:
+                               lookupp = nodep;
+                               break; 
+                       case XML_DOCUMENT_NODE:
+                       case XML_HTML_DOCUMENT_NODE:
+                               lookupp = xmlDocGetRootElement((xmlDocPtr) nodep);
+                               break;
+                       case XML_ENTITY_NODE : 
+                       case XML_NOTATION_NODE: 
+                       case XML_DOCUMENT_FRAG_NODE: 
+                       case XML_DOCUMENT_TYPE_NODE:
+                       case XML_DTD_NODE:
+                               RETURN_NULL();
+                               break;
+                       default:
+                               lookupp =  nodep->parent;
+               } 
+
+               if (lookupp != NULL && (nsptr = xmlSearchNsByHref(lookupp->doc, 
lookupp, uri))) {
+                       if (nsptr->prefix != NULL) {
+                               RETURN_STRING((char *) nsptr->prefix, 1);
+                       }
+               }
+       }
+               
+       RETURN_NULL();
 }
 /* }}} end dom_node_lookup_prefix */
 
@@ -1285,7 +1331,27 @@
 */
 PHP_FUNCTION(dom_node_lookup_namespace_uri)
 {
- DOM_NOT_IMPLEMENTED();
+       zval *id;
+       xmlNodePtr nodep;
+       dom_object *intern;
+       xmlNsPtr nsptr;
+       int prefix_len = 0;
+       char *prefix;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &prefix, 
&prefix_len) == FAILURE) {
+               return;
+       }
+       
+       if (prefix_len > 0) {
+               nsptr = xmlSearchNs(nodep->doc, nodep, prefix);
+               if (nsptr && nsptr->href != NULL) {
+                       RETURN_STRING((char *) nsptr->href, 1);
+               }
+       }
+               
+       RETURN_NULL();
 }
 /* }}} end dom_node_lookup_namespace_uri */
 
Index: php-src/ext/dom/element.c
diff -u php-src/ext/dom/element.c:1.9 php-src/ext/dom/element.c:1.10
--- php-src/ext/dom/element.c:1.9       Thu Jul 24 09:18:40 2003
+++ php-src/ext/dom/element.c   Sun Jul 27 13:57:06 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: element.c,v 1.9 2003/07/24 13:18:40 rrichards Exp $ */
+/* $Id: element.c,v 1.10 2003/07/27 17:57:06 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -497,7 +497,7 @@
        xmlNsPtr nsptr;
        int ret, uri_len = 0, name_len = 0;
        char *uri, *name;
-       xmlChar *localname = NULL;
+       char *localname = NULL, *prefix = NULL;
        dom_object *intern;
        int errorcode = 0;
 
@@ -512,22 +512,33 @@
                RETURN_FALSE;
        }
 
-       nsptr = xmlSearchNsByHref (elemp->doc, elemp, uri);
-       if (nsptr == NULL) {
-               nsptr = dom_get_ns(uri, name, uri_len, name_len, &errorcode, (char **) 
&localname);
-               if (nsptr != NULL) {
-                       dom_set_old_ns(elemp->doc, nsptr);
-               }
-       }
+       errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
+
        if (errorcode == 0) {
-               if (nsptr != NULL) {
+               nodep = (xmlNodePtr) xmlHasNsProp(elemp, localname, uri);
+               if (nodep != NULL) {
+                       node_list_unlink(nodep->children TSRMLS_CC);
+               }
+               nsptr = xmlSearchNsByHref(elemp->doc, elemp, uri);
+               while (nsptr && nsptr->prefix == NULL) {
+                       nsptr = nsptr->next;
+               }
+               if (nsptr == NULL) {
+                       if (prefix == NULL) {
+                               errorcode = NAMESPACE_ERR;
+                       } else {
+                               nsptr = dom_get_ns(elemp, uri, &errorcode, prefix);
+                       }
+               }
+
+               if (errorcode == 0) {
                        nodep = (xmlNodePtr) xmlSetNsProp(elemp, nsptr, localname, 
NULL);
-               } else {
-                       nodep = (xmlNodePtr) xmlSetProp(elemp, name, NULL);
                }
        }
-       if (localname != NULL) {
-               xmlFree(localname);
+
+       xmlFree(localname);
+       if (prefix != NULL) {
+               xmlFree(prefix);
        }
 
        if (errorcode != 0) {
@@ -687,9 +698,6 @@
        }
 
        xmlAddChild(nodep, (xmlNodePtr) attrp);
-       if (existattrp == NULL) {
-               xmlReconciliateNs(nodep->doc, nodep);
-       }
 
        /* Returns old property if removed otherwise NULL */
        if (existattrp != NULL) {
Index: php-src/ext/dom/domimplementation.c
diff -u php-src/ext/dom/domimplementation.c:1.5 php-src/ext/dom/domimplementation.c:1.6
--- php-src/ext/dom/domimplementation.c:1.5     Fri Jul 25 13:25:50 2003
+++ php-src/ext/dom/domimplementation.c Sun Jul 27 13:57:06 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: domimplementation.c,v 1.5 2003/07/25 17:25:50 rrichards Exp $ */
+/* $Id: domimplementation.c,v 1.6 2003/07/27 17:57:06 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -132,10 +132,9 @@
        xmlNode *nodep;
        xmlDtdPtr doctype = NULL;
        xmlNsPtr nsptr = NULL;
-       int ret, uri_len = 0, name_len = 0;
+       int ret, uri_len = 0, name_len = 0, errorcode = 0;
        char *uri, *name;
-       xmlChar *prefix = NULL, *localname = NULL;
-       xmlURIPtr uristruct;
+       char *prefix = NULL, *localname = NULL;
        dom_object *doctobj;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sso", &uri, &uri_len, 
&name, &name_len, &node) == FAILURE) {
@@ -155,58 +154,24 @@
                }
        }
 
-       if (uri_len > 0 || name_len > 0 || doctype != NULL) {
-               if (name_len == 0 && uri_len > 0) {
-                       php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC);
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid 
Namespace");
+       if (name_len > 0) {
+               errorcode = dom_check_qname(name, &localname, &prefix, 1, name_len);
+               if (errorcode == 0 && uri_len > 0 && ((nsptr = xmlNewNs(NULL, uri, 
prefix)) == NULL)) {
+                       errorcode = NAMESPACE_ERR;
                }
-               if (name_len > 0) {
-                       uristruct = xmlParseURI(name);
-                       if (uristruct->opaque != NULL) {
-                               prefix = xmlStrdup(uristruct->scheme);
-                               localname = xmlStrdup(uristruct->opaque);
-                               if (xmlStrchr(localname, (xmlChar) ':') != NULL) {
-                                       php_dom_throw_error(NAMESPACE_ERR, 
&return_value TSRMLS_CC);
-                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid Namespace");
-                                       xmlFreeURI(uristruct);
-                                       xmlFree(prefix);
-                                       xmlFree(localname);
-                                       RETURN_FALSE;
-                               }
-                               if (!strcmp (prefix, "xml") && strcmp(uri, 
XML_XML_NAMESPACE)) {
-                                       php_dom_throw_error(NAMESPACE_ERR, 
&return_value TSRMLS_CC);
-                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid Namespace");
-                                       xmlFreeURI(uristruct);
-                                       xmlFree(prefix);
-                                       xmlFree(localname);
-                                       RETURN_FALSE;
-                               }
-                       } else {
-                               localname = xmlStrdup(name);
-                       }
-
-                       /* TODO: Test that localname has no invalid chars 
-                       php_dom_throw_error(INVALID_CHARACTER_ERR, TSRMLS_CC);
-                       */
-
-                       xmlFreeURI(uristruct);
-
-                       if (uri_len > 0) {
-                               if ((nsptr = xmlNewNs(NULL, uri, prefix)) == NULL) {
-                                       php_dom_throw_error(NAMESPACE_ERR, 
&return_value TSRMLS_CC);
-                                       if (prefix != NULL) {
-                                               xmlFree(prefix);
-                                       }
-                                       xmlFree(localname);
-                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid Namespace");
-                                       RETURN_FALSE;   
-                               }
-
-                       }
-                       if (prefix != NULL) {
-                               xmlFree(prefix);
-                       }
+       }
+
+       if (prefix != NULL) {
+               xmlFree(prefix);
+       }
+
+       if (errorcode != 0) {
+               if (localname != NULL) {
+                       xmlFree(localname);
                }
+               php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+               RETURN_FALSE;
        }
 
        /* currently letting libxml2 set the version string */
Index: php-src/ext/dom/document.c
diff -u php-src/ext/dom/document.c:1.16 php-src/ext/dom/document.c:1.17
--- php-src/ext/dom/document.c:1.16     Tue Jul 22 09:50:00 2003
+++ php-src/ext/dom/document.c  Sun Jul 27 13:57:06 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: document.c,v 1.16 2003/07/22 13:50:00 zeev Exp $ */
+/* $Id: document.c,v 1.17 2003/07/27 17:57:06 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -793,7 +793,7 @@
        xmlNsPtr nsptr;
        int ret, uri_len = 0, name_len = 0;
        char *uri, *name;
-       xmlChar *localname = NULL;
+       char *localname = NULL, *prefix = NULL;
        int errorcode;
        dom_object *intern;
 
@@ -803,20 +803,28 @@
                return;
        }
 
-       nsptr = dom_get_ns(uri, name, uri_len, name_len, &errorcode, (char **) 
&localname);
+       errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
+
        if (errorcode == 0) {
-               if (nsptr != NULL) {
-                       dom_set_old_ns(docp, nsptr);
-                       nodep = xmlNewDocNode (docp, nsptr, localname, NULL);
-               } else {
-                       nodep = xmlNewDocNode (docp, NULL, name, NULL);
+               nodep = xmlNewDocNode (docp, NULL, localname, NULL);
+               if (nodep != NULL) {
+                       nsptr = xmlSearchNsByHref (nodep->doc, nodep, uri);
+                       if (nsptr == NULL) {
+                               nsptr = dom_get_ns(nodep, uri, &errorcode, prefix);
+                       }
+                       xmlSetNs(nodep, nsptr);
                }
        }
-       if (localname != NULL) {
-               xmlFree(localname);
+
+       xmlFree(localname);
+       if (prefix != NULL) {
+               xmlFree(prefix);
        }
 
        if (errorcode != 0) {
+               if (nodep != NULL) {
+                       xmlFreeNode(nodep);
+               }
                php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
                RETURN_FALSE;
@@ -826,6 +834,9 @@
                RETURN_FALSE;
        }
 
+       
+       nodep->ns = nsptr;
+
        DOM_RET_OBJ(rv, nodep, &ret, intern);
 }
 /* }}} end dom_document_create_element_ns */
@@ -839,11 +850,11 @@
 {
        zval *id, *rv = NULL;
        xmlDocPtr docp;
-       xmlNodePtr nodep = NULL;
+       xmlNodePtr nodep = NULL, root;
        xmlNsPtr nsptr;
        int ret, uri_len = 0, name_len = 0;
        char *uri, *name;
-       xmlChar *localname = NULL;
+       char *localname = NULL, *prefix = NULL;
        dom_object *intern;
        int errorcode;
 
@@ -853,23 +864,33 @@
                return;
        }
 
-       nsptr = dom_get_ns(uri, name, uri_len, name_len, &errorcode, (char **) 
&localname);
-       if (errorcode == 0) {
-               if (nsptr != NULL) {
+       root = xmlDocGetRootElement(docp);
+       if (root != NULL) {
+               errorcode = dom_check_qname(name, &localname, &prefix, uri_len, 
name_len);
+               if (errorcode == 0) {
                        nodep = (xmlNodePtr) xmlNewDocProp(docp, localname, NULL);
-                       dom_set_old_ns(docp, nsptr);
                        if (nodep != NULL) {
+                               nsptr = xmlSearchNsByHref (nodep->doc, root, uri);
+                               if (nsptr == NULL) {
+                                       nsptr = dom_get_ns(root, uri, &errorcode, 
prefix);
+                               }
                                xmlSetNs(nodep, nsptr);
                        }
-               } else {
-                       nodep = (xmlNodePtr) xmlNewDocProp(docp, name, NULL);
                }
+       } else {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Document Missing Root 
Element");
+               RETURN_FALSE;
        }
-       if (localname != NULL) {
-               xmlFree(localname);
+
+       xmlFree(localname);
+       if (prefix != NULL) {
+               xmlFree(prefix);
        }
 
        if (errorcode != 0) {
+               if (nodep != NULL) {
+                       xmlFreeProp((xmlAttrPtr) nodep);
+               }
                php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
                RETURN_FALSE;
Index: php-src/ext/dom/attr.c
diff -u php-src/ext/dom/attr.c:1.4 php-src/ext/dom/attr.c:1.5
--- php-src/ext/dom/attr.c:1.4  Mon Jul  7 15:37:32 2003
+++ php-src/ext/dom/attr.c      Sun Jul 27 13:57:06 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: attr.c,v 1.4 2003/07/07 19:37:32 rrichards Exp $ */
+/* $Id: attr.c,v 1.5 2003/07/27 17:57:06 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -210,13 +210,25 @@
 
 
 
-
 /* {{{ proto boolean dom_attr_is_id();
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Attr-isId
 Since: DOM Level 3
 */
 PHP_FUNCTION(dom_attr_is_id)
 {
- DOM_NOT_IMPLEMENTED();
+       zval *id;
+       dom_object *intern;
+       xmlAttrPtr attrp;
+       xmlNodePtr nodep;
+
+       DOM_GET_THIS_OBJ(attrp, id, xmlAttrPtr, intern);
+
+       nodep = attrp->parent;
+
+       if (xmlIsID(attrp->doc, nodep, attrp)) {
+               RETURN_TRUE;
+       } else {
+               RETURN_FALSE;
+       }
 }
 /* }}} end dom_attr_is_id */

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

Reply via email to