Annotation of embedaddon/php/ext/dom/domimplementation.c, revision 1.1.1.1
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: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>