]> git.sesse.net Git - xml-template/blobdiff - php5-swig/xml-template.swig
Do weird dances to get php5-swig garbage collection going. Something tells me this...
[xml-template] / php5-swig / xml-template.swig
index a2dd2d1926c6925149c9d41e05c327bab3a8684e..225f8bbd2e2d9a4c17df0d3937bef0721a15beff 100644 (file)
@@ -1,9 +1,21 @@
 %module XML_Template_SWIG
 
+struct XmlDocPtrWrapper {
+       ~XmlDocPtrWrapper();
+};
+
 %{
 
+#include <memory>
+
 #include "../c++11/xml-template.h"
-               
+
+struct XmlDocWrapper {
+       ~XmlDocWrapper() { xmlFreeDoc(ptr); }
+       xmlDocPtr ptr;
+};
+typedef std::shared_ptr<XmlDocWrapper> 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);