};
+int dom_document_get_formatting(zval *id TSRMLS_DC) {
+ zval *format, *member;
+ zend_object_handlers *std_hnd;
+ int retformat = 0;
+
+ MAKE_STD_ZVAL(member);
+ ZVAL_STRING(member, "formatOutput", 1);
+
+ std_hnd = zend_get_std_object_handlers();
+ format = std_hnd->read_property(id, member TSRMLS_CC);
+
+ if (format->type == IS_BOOL) {
+ retformat = Z_BVAL_P(format);
+ }
+
+ zval_dtor(member);
+ FREE_ZVAL(member);
+
+ return retformat;
+}
+
/* {{{ proto doctype documenttype
readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-B63ED1A31
{
zval *id;
xmlDoc *docp;
- int file_len, bytes;
+ int file_len, bytes, format;
dom_object *intern;
char *file;
RETURN_FALSE;
}
- bytes = xmlSaveFile(file, docp);
+ /* encoding handled by property on doc */
+ format = dom_document_get_formatting(id TSRMLS_CC);
+ bytes = xmlSaveFormatFileEnc(file, docp, NULL, format);
if (bytes == -1) {
RETURN_FALSE;
xmlBufferPtr buf;
xmlChar *mem;
dom_object *intern, *nodeobj;
- int size;
+ int size, format;
DOM_GET_THIS_OBJ(docp, id, xmlDocPtr, intern);
return;
}
+ format = dom_document_get_formatting(id TSRMLS_CC);
+
if (nodep != NULL) {
/* Dump contents of Node */
DOM_GET_OBJ(node, nodep, xmlNodePtr, nodeobj);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not fetch buffer");
RETURN_FALSE;
}
- xmlNodeDump(buf, docp, node, 0, 0);
+
+ xmlNodeDump(buf, docp, node, 0, format);
mem = (xmlChar*) xmlBufferContent(buf);
if (!mem) {
xmlBufferFree(buf);
RETVAL_STRING(mem, 1);
xmlBufferFree(buf);
} else {
- /* Dump Document Contents
- Encoding is handled from the encoding property set on the document */
- xmlDocDumpMemory(docp, &mem, &size);
+ /* Encoding is handled from the encoding property set on the document */
+ xmlDocDumpFormatMemory(docp, &mem, &size, format);
if (!size) {
RETURN_FALSE;
}
*/
PHP_FUNCTION(dom_domimplementation_has_feature)
{
- DOM_NOT_IMPLEMENTED();
+ int feature_len, version_len;
+ char *feature, *version;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &feature, &feature_len, &version, &version_len) == FAILURE) {
+ return;
+ }
+
+ if (dom_has_feature(feature, version)) {
+ RETURN_TRUE;
+ } else {
+ RETURN_FALSE;
+ }
}
/* }}} end dom_domimplementation_has_feature */
/* {{{ proto boolean dom_node_is_supported(string feature, string version);
-URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-Node-supports
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Level-2-Core-Node-supports
Since: DOM Level 2
*/
PHP_FUNCTION(dom_node_is_supported)
{
- DOM_NOT_IMPLEMENTED();
+ int feature_len, version_len;
+ char *feature, *version;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &feature, &feature_len, &version, &version_len) == FAILURE) {
+ return;
+ }
+
+ if (dom_has_feature(feature, version)) {
+ RETURN_TRUE;
+ } else {
+ RETURN_FALSE;
+ }
}
/* }}} end dom_node_is_supported */
object->document->refcount--;
ret_refcount = object->document->refcount;
if (ret_refcount == 0) {
- dom_clean_nodes(object TSRMLS_CC);
- node_free_resource(object->document->ptr TSRMLS_CC);
+ if (object->document->ptr != NULL) {
+ dom_clean_nodes(object TSRMLS_CC);
+ /* No references to Doc so can use xmlFreeDoc
+ node_free_resource(object->document->ptr TSRMLS_CC); */
+ xmlFreeDoc((xmlDoc *) object->document->ptr);
+ object->document->ptr = NULL;
+ }
efree(object->document);
object->document = NULL;
}
php_info_print_table_start();
php_info_print_table_row(2, "DOM/XML", "enabled");
php_info_print_table_row(2, "DOM/XML API Version", DOM_API_VERSION);
- php_info_print_table_row(2, "libxml Version", xmlParserVersion);
+ php_info_print_table_row(2, "libxml Version", LIBXML_DOTTED_VERSION);
#if defined(LIBXML_HTML_ENABLED)
php_info_print_table_row(2, "HTML Support", "enabled");
#endif
object_init_ex(wrapper, ce);
+ /* Add object properties not needing function calls */
+ if (obj->type == XML_DOCUMENT_NODE || obj->type == XML_HTML_DOCUMENT_NODE) {
+ add_property_bool(wrapper, "formatOutput", 0);
+ }
intern = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);
if (obj->doc != NULL) {
if (domobj != NULL) {
}
/* }}} end dom_hierarchy */
+/* {{{ dom_has_feature(char *feature, char *version) */
+int dom_has_feature(char *feature, char *version)
+{
+ int retval = 0;
+
+ if (!(strcmp (version, "1.0") && strcmp (version,"2.0") && strcmp(version, ""))) {
+ if ((!strcasecmp(feature, "Core") && strcmp (version, "1.0")) || !strcasecmp(feature, "XML"))
+ retval = 1;
+ }
+
+ return retval;
+}
+/* }}} end dom_has_feature */
+
/* {{{ void dom_element_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval TSRMLS_DC) */
void dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval, dom_object *intern TSRMLS_DC)
{
void dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval, dom_object *intern TSRMLS_DC);
void php_dom_create_implementation(zval **retval TSRMLS_DC);
int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child);
+int dom_has_feature(char *feature, char *version);
#define DOM_NO_ARGS() \
if (ZEND_NUM_ARGS() != 0) { \