1/*
2   +----------------------------------------------------------------------+
3   | PHP Version 7                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 1997-2016 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$ */
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 */
31ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_get_named_item, 0, 0, 1)
32	ZEND_ARG_INFO(0, name)
33ZEND_END_ARG_INFO();
34
35ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_set_named_item, 0, 0, 1)
36	ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
37ZEND_END_ARG_INFO();
38
39ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_remove_named_item, 0, 0, 0)
40	ZEND_ARG_INFO(0, name)
41ZEND_END_ARG_INFO();
42
43ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_item, 0, 0, 0)
44	ZEND_ARG_INFO(0, index)
45ZEND_END_ARG_INFO();
46
47ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_get_named_item_ns, 0, 0, 0)
48	ZEND_ARG_INFO(0, namespaceURI)
49	ZEND_ARG_INFO(0, localName)
50ZEND_END_ARG_INFO();
51
52ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_set_named_item_ns, 0, 0, 0)
53	ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
54ZEND_END_ARG_INFO();
55
56ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_remove_named_item_ns, 0, 0, 0)
57	ZEND_ARG_INFO(0, namespaceURI)
58	ZEND_ARG_INFO(0, localName)
59ZEND_END_ARG_INFO();
60/* }}} */
61
62/*
63* class DOMNamedNodeMap
64*
65* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1780488922
66* Since:
67*/
68
69const zend_function_entry php_dom_namednodemap_class_functions[] = { /* {{{ */
70	PHP_FALIAS(getNamedItem, dom_namednodemap_get_named_item, arginfo_dom_namednodemap_get_named_item)
71	PHP_FALIAS(setNamedItem, dom_namednodemap_set_named_item, arginfo_dom_namednodemap_set_named_item)
72	PHP_FALIAS(removeNamedItem, dom_namednodemap_remove_named_item, arginfo_dom_namednodemap_remove_named_item)
73	PHP_FALIAS(item, dom_namednodemap_item, arginfo_dom_namednodemap_item)
74	PHP_FALIAS(getNamedItemNS, dom_namednodemap_get_named_item_ns, arginfo_dom_namednodemap_get_named_item_ns)
75	PHP_FALIAS(setNamedItemNS, dom_namednodemap_set_named_item_ns, arginfo_dom_namednodemap_set_named_item_ns)
76	PHP_FALIAS(removeNamedItemNS, dom_namednodemap_remove_named_item_ns, arginfo_dom_namednodemap_remove_named_item_ns)
77	PHP_FE_END
78};
79/* }}} */
80
81/* {{{ length	int
82readonly=yes
83URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D0FB19E
84Since:
85*/
86int dom_namednodemap_length_read(dom_object *obj, zval *retval)
87{
88	dom_nnodemap_object *objmap;
89	xmlAttrPtr curnode;
90	xmlNodePtr nodep;
91	int count = 0;
92
93	objmap = (dom_nnodemap_object *)obj->ptr;
94
95	if (objmap != NULL) {
96		if ((objmap->nodetype == XML_NOTATION_NODE) ||
97			objmap->nodetype == XML_ENTITY_NODE) {
98			if (objmap->ht) {
99				count = xmlHashSize(objmap->ht);
100			}
101		} else {
102			nodep = dom_object_get_node(objmap->baseobj);
103			if (nodep) {
104				curnode = nodep->properties;
105				if (curnode) {
106					count++;
107					while (curnode->next != NULL) {
108						count++;
109						curnode = curnode->next;
110					}
111				}
112			}
113		}
114	}
115
116	ZVAL_LONG(retval, count);
117	return SUCCESS;
118}
119
120/* }}} */
121
122/* {{{ proto DOMNode dom_namednodemap_get_named_item(string name);
123URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1074577549
124Since:
125*/
126PHP_FUNCTION(dom_namednodemap_get_named_item)
127{
128	zval *id;
129	int ret;
130	size_t namedlen=0;
131	dom_object *intern;
132	xmlNodePtr itemnode = NULL;
133	char *named;
134
135	dom_nnodemap_object *objmap;
136	xmlNodePtr nodep;
137	xmlNotation *notep = NULL;
138
139	if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &id, dom_namednodemap_class_entry, &named, &namedlen) == FAILURE) {
140		return;
141	}
142
143	intern = Z_DOMOBJ_P(id);
144
145	objmap = (dom_nnodemap_object *)intern->ptr;
146
147	if (objmap != NULL) {
148		if ((objmap->nodetype == XML_NOTATION_NODE) ||
149			objmap->nodetype == XML_ENTITY_NODE) {
150			if (objmap->ht) {
151				if (objmap->nodetype == XML_ENTITY_NODE) {
152					itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, (xmlChar *) named);
153				} else {
154					notep = (xmlNotation *)xmlHashLookup(objmap->ht, (xmlChar *) named);
155					if (notep) {
156						itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID);
157					}
158				}
159			}
160		} else {
161			nodep = dom_object_get_node(objmap->baseobj);
162			if (nodep) {
163				itemnode = (xmlNodePtr)xmlHasProp(nodep, (xmlChar *) named);
164			}
165		}
166	}
167
168	if (itemnode) {
169		DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
170		return;
171	} else {
172		RETVAL_NULL();
173	}
174}
175/* }}} end dom_namednodemap_get_named_item */
176
177/* {{{ proto DOMNode dom_namednodemap_set_named_item(DOMNode arg);
178URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1025163788
179Since:
180*/
181PHP_FUNCTION(dom_namednodemap_set_named_item)
182{
183 DOM_NOT_IMPLEMENTED();
184}
185/* }}} end dom_namednodemap_set_named_item */
186
187/* {{{ proto DOMNode dom_namednodemap_remove_named_item(string name);
188URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D58B193
189Since:
190*/
191PHP_FUNCTION(dom_namednodemap_remove_named_item)
192{
193 DOM_NOT_IMPLEMENTED();
194}
195/* }}} end dom_namednodemap_remove_named_item */
196
197/* {{{ proto DOMNode dom_namednodemap_item(int index);
198URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-349467F9
199Since:
200*/
201PHP_FUNCTION(dom_namednodemap_item)
202{
203	zval *id;
204	zend_long index;
205	int ret;
206	dom_object *intern;
207	xmlNodePtr itemnode = NULL;
208
209	dom_nnodemap_object *objmap;
210	xmlNodePtr nodep, curnode;
211	int count;
212
213	if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ol", &id, dom_namednodemap_class_entry, &index) == FAILURE) {
214		return;
215	}
216	if (index >= 0) {
217		if (ZEND_LONG_INT_OVFL(index)) {
218			php_error_docref(NULL, E_WARNING, "Invalid index");
219			RETURN_NULL();
220		}
221
222		intern = Z_DOMOBJ_P(id);
223
224		objmap = (dom_nnodemap_object *)intern->ptr;
225
226		if (objmap != NULL) {
227			if ((objmap->nodetype == XML_NOTATION_NODE) ||
228				objmap->nodetype == XML_ENTITY_NODE) {
229				if (objmap->ht) {
230					if (objmap->nodetype == XML_ENTITY_NODE) {
231						itemnode = php_dom_libxml_hash_iter(objmap->ht, index);
232					} else {
233						itemnode = php_dom_libxml_notation_iter(objmap->ht, index);
234					}
235				}
236			} else {
237				nodep = dom_object_get_node(objmap->baseobj);
238				if (nodep) {
239					curnode = (xmlNodePtr)nodep->properties;
240					count = 0;
241					while (count < index && curnode != NULL) {
242						count++;
243						curnode = (xmlNodePtr)curnode->next;
244					}
245					itemnode = curnode;
246				}
247			}
248		}
249
250		if (itemnode) {
251			DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
252			return;
253		}
254	}
255
256	RETVAL_NULL();
257}
258/* }}} end dom_namednodemap_item */
259
260/* {{{ proto DOMNode dom_namednodemap_get_named_item_ns(string namespaceURI, string localName);
261URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getNamedItemNS
262Since: DOM Level 2
263*/
264PHP_FUNCTION(dom_namednodemap_get_named_item_ns)
265{
266	zval *id;
267	int ret;
268	size_t namedlen=0, urilen=0;
269	dom_object *intern;
270	xmlNodePtr itemnode = NULL;
271	char *uri, *named;
272
273	dom_nnodemap_object *objmap;
274	xmlNodePtr nodep;
275	xmlNotation *notep = NULL;
276
277	if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os!s", &id, dom_namednodemap_class_entry, &uri, &urilen, &named, &namedlen) == FAILURE) {
278		return;
279	}
280
281	intern = Z_DOMOBJ_P(id);
282
283	objmap = (dom_nnodemap_object *)intern->ptr;
284
285	if (objmap != NULL) {
286		if ((objmap->nodetype == XML_NOTATION_NODE) ||
287			objmap->nodetype == XML_ENTITY_NODE) {
288			if (objmap->ht) {
289				if (objmap->nodetype == XML_ENTITY_NODE) {
290					itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, (xmlChar *) named);
291				} else {
292					notep = (xmlNotation *)xmlHashLookup(objmap->ht, (xmlChar *) named);
293					if (notep) {
294						itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID);
295					}
296				}
297			}
298		} else {
299			nodep = dom_object_get_node(objmap->baseobj);
300			if (nodep) {
301				itemnode = (xmlNodePtr)xmlHasNsProp(nodep, (xmlChar *) named, (xmlChar *) uri);
302			}
303		}
304	}
305
306	if (itemnode) {
307		DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
308		return;
309	} else {
310		RETVAL_NULL();
311	}
312}
313/* }}} end dom_namednodemap_get_named_item_ns */
314
315/* {{{ proto DOMNode dom_namednodemap_set_named_item_ns(DOMNode arg);
316URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-setNamedItemNS
317Since: DOM Level 2
318*/
319PHP_FUNCTION(dom_namednodemap_set_named_item_ns)
320{
321 DOM_NOT_IMPLEMENTED();
322}
323/* }}} end dom_namednodemap_set_named_item_ns */
324
325/* {{{ proto DOMNode dom_namednodemap_remove_named_item_ns(string namespaceURI, string localName);
326URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-removeNamedItemNS
327Since: DOM Level 2
328*/
329PHP_FUNCTION(dom_namednodemap_remove_named_item_ns)
330{
331 DOM_NOT_IMPLEMENTED();
332}
333/* }}} end dom_namednodemap_remove_named_item_ns */
334
335#endif
336
337/*
338 * Local variables:
339 * tab-width: 4
340 * c-basic-offset: 4
341 * End:
342 * vim600: noet sw=4 ts=4 fdm=marker
343 * vim<600: noet sw=4 ts=4
344 */
345