X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=php5-swig%2Fxml-template.swig;h=225f8bbd2e2d9a4c17df0d3937bef0721a15beff;hb=ab29cf7e641eca15124acb550e4244edd6b0784a;hp=a2dd2d1926c6925149c9d41e05c327bab3a8684e;hpb=8ad17ad06612ee08a69572186858be074b0c5c99;p=xml-template diff --git a/php5-swig/xml-template.swig b/php5-swig/xml-template.swig index a2dd2d1..225f8bb 100644 --- a/php5-swig/xml-template.swig +++ b/php5-swig/xml-template.swig @@ -1,9 +1,21 @@ %module XML_Template_SWIG +struct XmlDocPtrWrapper { + ~XmlDocPtrWrapper(); +}; + %{ +#include + #include "../c++11/xml-template.h" - + +struct XmlDocWrapper { + ~XmlDocWrapper() { xmlFreeDoc(ptr); } + xmlDocPtr ptr; +}; +typedef std::shared_ptr XmlDocPtrWrapper; + bool is_associative_array(HashTable *ht) { if (ht->nNumOfElements == 0) { @@ -59,11 +71,11 @@ Directive* convert_php_objects_to_directive(zval *obj) return new Replace(str); } case IS_RESOURCE: { - xmlDocPtr *doc; - if (SWIG_ConvertPtr(obj, (void **)&doc, SWIGTYPE_p_xmlDocPtr, 0) < 0 || doc == NULL) { + XmlDocPtrWrapper *doc; + if (SWIG_ConvertPtr(obj, (void **)&doc, SWIGTYPE_p_XmlDocPtrWrapper, 0) < 0 || doc == NULL) { return NULL; } - return new ReplaceInclude(xmlCopyDoc(*doc, 1)); + return new ReplaceInclude(xmlCopyDoc(doc->get()->ptr, 1)); } case IS_NULL: return NULL; @@ -75,11 +87,17 @@ Directive* convert_php_objects_to_directive(zval *obj) return NULL; } -xmlDocPtr XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean) +XmlDocPtrWrapper XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean) { xmlDocPtr ret = process_file(input_filename, root_directive, clean); delete root_directive; - return ret; + return XmlDocPtrWrapper(new XmlDocWrapper { ret }); +} + +void output_to_fd(XmlDocPtrWrapper doc, int fd) +{ + xmlOutputBufferPtr buf = xmlOutputBufferCreateFd(fd, NULL); + xmlSaveFileTo(buf, doc->ptr, NULL); } %} @@ -88,6 +106,6 @@ xmlDocPtr XML_Template_process_file(const char *input_filename, Directive *root_ $1 = convert_php_objects_to_directive(*$input); } -xmlDocPtr XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean); -void output_to_fd_and_free(xmlDocPtr doc, int fd); +XmlDocPtrWrapper XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean); +void output_to_fd(XmlDocPtrWrapper doc, int fd);