Annotation of embedaddon/php/ext/dom/domimplementation.c, revision 1.1.1.4
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.4 ! misho 5: | Copyright (c) 1997-2014 The PHP Group |
1.1 misho 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:
1.1.1.2 misho 20: /* $Id$ */
1.1 misho 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: xmlDtd *doctype;
95: int ret, name_len = 0, publicid_len = 0, systemid_len = 0;
96: char *name = NULL, *publicid = NULL, *systemid = NULL;
97: xmlChar *pch1 = NULL, *pch2 = NULL, *localname = NULL;
98: xmlURIPtr uri;
99:
100: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sss", &name, &name_len, &publicid, &publicid_len, &systemid, &systemid_len) == FAILURE) {
101: return;
102: }
103:
104: if (name_len == 0) {
105: php_error_docref(NULL TSRMLS_CC, E_WARNING, "qualifiedName is required");
106: RETURN_FALSE;
107: }
108:
109: if (publicid_len > 0)
110: pch1 = publicid;
111: if (systemid_len > 0)
112: pch2 = systemid;
113:
114: uri = xmlParseURI(name);
115: if (uri != NULL && uri->opaque != NULL) {
116: localname = xmlStrdup(uri->opaque);
117: if (xmlStrchr(localname, (xmlChar) ':') != NULL) {
118: php_dom_throw_error(NAMESPACE_ERR, 1 TSRMLS_CC);
119: xmlFreeURI(uri);
120: xmlFree(localname);
121: RETURN_FALSE;
122: }
123: } else {
124: localname = xmlStrdup(name);
125: }
126:
127: /* TODO: Test that localname has no invalid chars
128: php_dom_throw_error(INVALID_CHARACTER_ERR, TSRMLS_CC);
129: */
130:
131: if (uri) {
132: xmlFreeURI(uri);
133: }
134:
135: doctype = xmlCreateIntSubset(NULL, localname, pch1, pch2);
136: xmlFree(localname);
137:
138: if (doctype == NULL) {
139: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create DocumentType");
140: RETURN_FALSE;
141: }
142:
1.1.1.2 misho 143: DOM_RET_OBJ((xmlNodePtr) doctype, &ret, NULL);
1.1 misho 144: }
145: /* }}} end dom_domimplementation_create_document_type */
146:
147: /* {{{ proto DOMDocument dom_domimplementation_create_document(string namespaceURI, string qualifiedName, DOMDocumentType doctype);
148: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocument
149: Since: DOM Level 2
150: */
151: PHP_METHOD(domimplementation, createDocument)
152: {
1.1.1.2 misho 153: zval *node = NULL;
1.1 misho 154: xmlDoc *docp;
155: xmlNode *nodep;
156: xmlDtdPtr doctype = NULL;
157: xmlNsPtr nsptr = NULL;
158: int ret, uri_len = 0, name_len = 0, errorcode = 0;
159: char *uri = NULL, *name = NULL;
160: char *prefix = NULL, *localname = NULL;
161: dom_object *doctobj;
162:
163: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ssO", &uri, &uri_len, &name, &name_len, &node, dom_documenttype_class_entry) == FAILURE) {
164: return;
165: }
166:
167: if (node != NULL) {
168: DOM_GET_OBJ(doctype, node, xmlDtdPtr, doctobj);
169: if (doctype->type == XML_DOCUMENT_TYPE_NODE) {
170: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid DocumentType object");
171: RETURN_FALSE;
172: }
173: if (doctype->doc != NULL) {
174: php_dom_throw_error(WRONG_DOCUMENT_ERR, 1 TSRMLS_CC);
175: RETURN_FALSE;
176: }
177: } else {
178: doctobj = NULL;
179: }
180:
181: if (name_len > 0) {
182: errorcode = dom_check_qname(name, &localname, &prefix, 1, name_len);
183: if (errorcode == 0 && uri_len > 0 && ((nsptr = xmlNewNs(NULL, uri, prefix)) == NULL)) {
184: errorcode = NAMESPACE_ERR;
185: }
186: }
187:
188: if (prefix != NULL) {
189: xmlFree(prefix);
190: }
191:
192: if (errorcode != 0) {
193: if (localname != NULL) {
194: xmlFree(localname);
195: }
196: php_dom_throw_error(errorcode, 1 TSRMLS_CC);
197: RETURN_FALSE;
198: }
199:
200: /* currently letting libxml2 set the version string */
201: docp = xmlNewDoc(NULL);
202: if (!docp) {
203: if (localname != NULL) {
204: xmlFree(localname);
205: }
206: RETURN_FALSE;
207: }
208:
209: if (doctype != NULL) {
210: docp->intSubset = doctype;
211: doctype->parent = docp;
212: doctype->doc = docp;
213: docp->children = (xmlNodePtr) doctype;
214: docp->last = (xmlNodePtr) doctype;
215: }
216:
217: if (localname != NULL) {
218: nodep = xmlNewDocNode (docp, nsptr, localname, NULL);
219: if (!nodep) {
220: if (doctype != NULL) {
221: docp->intSubset = NULL;
222: doctype->parent = NULL;
223: doctype->doc = NULL;
224: docp->children = NULL;
225: docp->last = NULL;
226: }
227: xmlFreeDoc(docp);
228: xmlFree(localname);
229: /* Need some type of error here */
230: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unexpected Error");
231: RETURN_FALSE;
232: }
233:
234: nodep->nsDef = nsptr;
235:
236: xmlDocSetRootElement(docp, nodep);
237: xmlFree(localname);
238: }
239:
1.1.1.2 misho 240: DOM_RET_OBJ((xmlNodePtr) docp, &ret, NULL);
1.1 misho 241:
242: if (doctobj != NULL) {
243: doctobj->document = ((dom_object *)((php_libxml_node_ptr *)docp->_private)->_private)->document;
244: php_libxml_increment_doc_ref((php_libxml_node_object *)doctobj, docp TSRMLS_CC);
245: }
246: }
247: /* }}} end dom_domimplementation_create_document */
248:
249: /* {{{ proto DOMNode dom_domimplementation_get_feature(string feature, string version);
250: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementation3-getFeature
251: Since: DOM Level 3
252: */
253: PHP_METHOD(domimplementation, getFeature)
254: {
255: DOM_NOT_IMPLEMENTED();
256: }
257: /* }}} end dom_domimplementation_get_feature */
258:
259: #endif
260:
261: /*
262: * Local variables:
263: * tab-width: 4
264: * c-basic-offset: 4
265: * End:
266: * vim600: noet sw=4 ts=4 fdm=marker
267: * vim<600: noet sw=4 ts=4
268: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>