Return to domimplementation.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / dom |
1.1 ! misho 1: /* ! 2: +----------------------------------------------------------------------+ ! 3: | PHP Version 5 | ! 4: +----------------------------------------------------------------------+ ! 5: | Copyright (c) 1997-2012 The PHP Group | ! 6: +----------------------------------------------------------------------+ ! 7: | This source file is subject to version 3.01 of the PHP license, | ! 8: | that is bundled with this package in the file LICENSE, and is | ! 9: | available through the world-wide-web at the following url: | ! 10: | http://www.php.net/license/3_01.txt | ! 11: | If you did not receive a copy of the PHP license and are unable to | ! 12: | obtain it through the world-wide-web, please send a note to | ! 13: | license@php.net so we can mail you a copy immediately. | ! 14: +----------------------------------------------------------------------+ ! 15: | Authors: Christian Stocker <chregu@php.net> | ! 16: | Rob Richards <rrichards@php.net> | ! 17: +----------------------------------------------------------------------+ ! 18: */ ! 19: ! 20: /* $Id: domimplementation.c 321634 2012-01-01 13:15:04Z felipe $ */ ! 21: ! 22: #ifdef HAVE_CONFIG_H ! 23: #include "config.h" ! 24: #endif ! 25: ! 26: #include "php.h" ! 27: #if HAVE_LIBXML && HAVE_DOM ! 28: #include "php_dom.h" ! 29: ! 30: /* {{{ arginfo */ ! 31: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_implementation_get_feature, 0, 0, 2) ! 32: ZEND_ARG_INFO(0, feature) ! 33: ZEND_ARG_INFO(0, version) ! 34: ZEND_END_ARG_INFO(); ! 35: ! 36: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_implementation_has_feature, 0, 0, 0) ! 37: ZEND_END_ARG_INFO(); ! 38: ! 39: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_implementation_create_documenttype, 0, 0, 3) ! 40: ZEND_ARG_INFO(0, qualifiedName) ! 41: ZEND_ARG_INFO(0, publicId) ! 42: ZEND_ARG_INFO(0, systemId) ! 43: ZEND_END_ARG_INFO(); ! 44: ! 45: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_implementation_create_document, 0, 0, 3) ! 46: ZEND_ARG_INFO(0, namespaceURI) ! 47: ZEND_ARG_INFO(0, qualifiedName) ! 48: ZEND_ARG_OBJ_INFO(0, docType, DOMDocumentType, 0) ! 49: ZEND_END_ARG_INFO(); ! 50: /* }}} */ ! 51: ! 52: /* ! 53: * class DOMImplementation ! 54: * ! 55: * URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-102161490 ! 56: * Since: ! 57: */ ! 58: ! 59: const zend_function_entry php_dom_domimplementation_class_functions[] = { ! 60: PHP_ME(domimplementation, getFeature, arginfo_dom_implementation_get_feature, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC) ! 61: PHP_ME(domimplementation, hasFeature, arginfo_dom_implementation_has_feature, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC) ! 62: PHP_ME(domimplementation, createDocumentType, arginfo_dom_implementation_create_documenttype, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC) ! 63: PHP_ME(domimplementation, createDocument, arginfo_dom_implementation_create_document, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC) ! 64: PHP_FE_END ! 65: }; ! 66: ! 67: /* {{{ proto boolean dom_domimplementation_has_feature(string feature, string version); ! 68: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-5CED94D7 ! 69: Since: ! 70: */ ! 71: PHP_METHOD(domimplementation, hasFeature) ! 72: { ! 73: int feature_len, version_len; ! 74: char *feature, *version; ! 75: ! 76: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &feature, &feature_len, &version, &version_len) == FAILURE) { ! 77: return; ! 78: } ! 79: ! 80: if (dom_has_feature(feature, version)) { ! 81: RETURN_TRUE; ! 82: } else { ! 83: RETURN_FALSE; ! 84: } ! 85: } ! 86: /* }}} end dom_domimplementation_has_feature */ ! 87: ! 88: /* {{{ proto DOMDocumentType dom_domimplementation_create_document_type(string qualifiedName, string publicId, string systemId); ! 89: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocType ! 90: Since: DOM Level 2 ! 91: */ ! 92: PHP_METHOD(domimplementation, createDocumentType) ! 93: { ! 94: zval *rv = NULL; ! 95: xmlDtd *doctype; ! 96: int ret, name_len = 0, publicid_len = 0, systemid_len = 0; ! 97: char *name = NULL, *publicid = NULL, *systemid = NULL; ! 98: xmlChar *pch1 = NULL, *pch2 = NULL, *localname = NULL; ! 99: xmlURIPtr uri; ! 100: ! 101: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sss", &name, &name_len, &publicid, &publicid_len, &systemid, &systemid_len) == FAILURE) { ! 102: return; ! 103: } ! 104: ! 105: if (name_len == 0) { ! 106: php_error_docref(NULL TSRMLS_CC, E_WARNING, "qualifiedName is required"); ! 107: RETURN_FALSE; ! 108: } ! 109: ! 110: if (publicid_len > 0) ! 111: pch1 = publicid; ! 112: if (systemid_len > 0) ! 113: pch2 = systemid; ! 114: ! 115: uri = xmlParseURI(name); ! 116: if (uri != NULL && uri->opaque != NULL) { ! 117: localname = xmlStrdup(uri->opaque); ! 118: if (xmlStrchr(localname, (xmlChar) ':') != NULL) { ! 119: php_dom_throw_error(NAMESPACE_ERR, 1 TSRMLS_CC); ! 120: xmlFreeURI(uri); ! 121: xmlFree(localname); ! 122: RETURN_FALSE; ! 123: } ! 124: } else { ! 125: localname = xmlStrdup(name); ! 126: } ! 127: ! 128: /* TODO: Test that localname has no invalid chars ! 129: php_dom_throw_error(INVALID_CHARACTER_ERR, TSRMLS_CC); ! 130: */ ! 131: ! 132: if (uri) { ! 133: xmlFreeURI(uri); ! 134: } ! 135: ! 136: doctype = xmlCreateIntSubset(NULL, localname, pch1, pch2); ! 137: xmlFree(localname); ! 138: ! 139: if (doctype == NULL) { ! 140: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create DocumentType"); ! 141: RETURN_FALSE; ! 142: } ! 143: ! 144: DOM_RET_OBJ(rv, (xmlNodePtr) doctype, &ret, NULL); ! 145: } ! 146: /* }}} end dom_domimplementation_create_document_type */ ! 147: ! 148: /* {{{ proto DOMDocument dom_domimplementation_create_document(string namespaceURI, string qualifiedName, DOMDocumentType doctype); ! 149: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocument ! 150: Since: DOM Level 2 ! 151: */ ! 152: PHP_METHOD(domimplementation, createDocument) ! 153: { ! 154: zval *node = NULL, *rv = NULL; ! 155: xmlDoc *docp; ! 156: xmlNode *nodep; ! 157: xmlDtdPtr doctype = NULL; ! 158: xmlNsPtr nsptr = NULL; ! 159: int ret, uri_len = 0, name_len = 0, errorcode = 0; ! 160: char *uri = NULL, *name = NULL; ! 161: char *prefix = NULL, *localname = NULL; ! 162: dom_object *doctobj; ! 163: ! 164: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ssO", &uri, &uri_len, &name, &name_len, &node, dom_documenttype_class_entry) == FAILURE) { ! 165: return; ! 166: } ! 167: ! 168: if (node != NULL) { ! 169: DOM_GET_OBJ(doctype, node, xmlDtdPtr, doctobj); ! 170: if (doctype->type == XML_DOCUMENT_TYPE_NODE) { ! 171: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid DocumentType object"); ! 172: RETURN_FALSE; ! 173: } ! 174: if (doctype->doc != NULL) { ! 175: php_dom_throw_error(WRONG_DOCUMENT_ERR, 1 TSRMLS_CC); ! 176: RETURN_FALSE; ! 177: } ! 178: } else { ! 179: doctobj = NULL; ! 180: } ! 181: ! 182: if (name_len > 0) { ! 183: errorcode = dom_check_qname(name, &localname, &prefix, 1, name_len); ! 184: if (errorcode == 0 && uri_len > 0 && ((nsptr = xmlNewNs(NULL, uri, prefix)) == NULL)) { ! 185: errorcode = NAMESPACE_ERR; ! 186: } ! 187: } ! 188: ! 189: if (prefix != NULL) { ! 190: xmlFree(prefix); ! 191: } ! 192: ! 193: if (errorcode != 0) { ! 194: if (localname != NULL) { ! 195: xmlFree(localname); ! 196: } ! 197: php_dom_throw_error(errorcode, 1 TSRMLS_CC); ! 198: RETURN_FALSE; ! 199: } ! 200: ! 201: /* currently letting libxml2 set the version string */ ! 202: docp = xmlNewDoc(NULL); ! 203: if (!docp) { ! 204: if (localname != NULL) { ! 205: xmlFree(localname); ! 206: } ! 207: RETURN_FALSE; ! 208: } ! 209: ! 210: if (doctype != NULL) { ! 211: docp->intSubset = doctype; ! 212: doctype->parent = docp; ! 213: doctype->doc = docp; ! 214: docp->children = (xmlNodePtr) doctype; ! 215: docp->last = (xmlNodePtr) doctype; ! 216: } ! 217: ! 218: if (localname != NULL) { ! 219: nodep = xmlNewDocNode (docp, nsptr, localname, NULL); ! 220: if (!nodep) { ! 221: if (doctype != NULL) { ! 222: docp->intSubset = NULL; ! 223: doctype->parent = NULL; ! 224: doctype->doc = NULL; ! 225: docp->children = NULL; ! 226: docp->last = NULL; ! 227: } ! 228: xmlFreeDoc(docp); ! 229: xmlFree(localname); ! 230: /* Need some type of error here */ ! 231: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unexpected Error"); ! 232: RETURN_FALSE; ! 233: } ! 234: ! 235: nodep->nsDef = nsptr; ! 236: ! 237: xmlDocSetRootElement(docp, nodep); ! 238: xmlFree(localname); ! 239: } ! 240: ! 241: DOM_RET_OBJ(rv, (xmlNodePtr) docp, &ret, NULL); ! 242: ! 243: if (doctobj != NULL) { ! 244: doctobj->document = ((dom_object *)((php_libxml_node_ptr *)docp->_private)->_private)->document; ! 245: php_libxml_increment_doc_ref((php_libxml_node_object *)doctobj, docp TSRMLS_CC); ! 246: } ! 247: } ! 248: /* }}} end dom_domimplementation_create_document */ ! 249: ! 250: /* {{{ proto DOMNode dom_domimplementation_get_feature(string feature, string version); ! 251: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementation3-getFeature ! 252: Since: DOM Level 3 ! 253: */ ! 254: PHP_METHOD(domimplementation, getFeature) ! 255: { ! 256: DOM_NOT_IMPLEMENTED(); ! 257: } ! 258: /* }}} end dom_domimplementation_get_feature */ ! 259: ! 260: #endif ! 261: ! 262: /* ! 263: * Local variables: ! 264: * tab-width: 4 ! 265: * c-basic-offset: 4 ! 266: * End: ! 267: * vim600: noet sw=4 ts=4 fdm=marker ! 268: * vim<600: noet sw=4 ts=4 ! 269: */