From e2e2649fabec084eb93468ba8c21f0f6eb45ff17 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Tue, 13 Jun 2006 22:25:33 +0000 Subject: [PATCH] Correctly handle the release of ownership of the wx.FSFile returned from wx.FileSystemHandler.OpenFile. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39703 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/include/wx/wxPython/wxPython_int.h | 12 +++++++----- wxPython/src/_filesys.i | 18 ++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/wxPython/include/wx/wxPython/wxPython_int.h b/wxPython/include/wx/wxPython/wxPython_int.h index 26aa87d7f8..d458cd5077 100644 --- a/wxPython/include/wx/wxPython/wxPython_int.h +++ b/wxPython/include/wx/wxPython/wxPython_int.h @@ -1628,7 +1628,7 @@ extern wxPyApp *wxPythonApp; bool CLASS::CBNAME() const { \ bool rval=false; \ bool found; \ - wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); \ wxPyEndBlockThreads(blocked); \ @@ -1647,7 +1647,7 @@ extern wxPyApp *wxPythonApp; wxDragResult CLASS::CBNAME(wxCoord a, wxCoord b, wxDragResult c) { \ int rval=0; \ bool found; \ - wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iii)", a,b,c));\ wxPyEndBlockThreads(blocked); \ @@ -1663,7 +1663,7 @@ extern wxPyApp *wxPythonApp; #define IMP_PYCALLBACK_FSF_FSSTRING_pure(CLASS, PCLASS, CBNAME) \ wxFSFile* CLASS::CBNAME(wxFileSystem& a,const wxString& b) { \ - wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ wxFSFile* rval=0; \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ PyObject* ro; \ @@ -1673,6 +1673,8 @@ extern wxPyApp *wxPythonApp; obj, s)); \ if (ro) { \ wxPyConvertSwigPtr(ro, (void **)&rval, wxT("wxFSFile")); \ + /* release ownership of the C++ wx.FSFile object. */ \ + PyObject_SetAttrString(ro, "thisown", Py_False); \ Py_DECREF(ro); \ } \ Py_DECREF(obj); \ @@ -1692,7 +1694,7 @@ extern wxPyApp *wxPythonApp; bool CLASS::CBNAME(wxDragResult a) { \ bool rval=false; \ bool found; \ - wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(i)", a)); \ wxPyEndBlockThreads(blocked); \ @@ -1709,7 +1711,7 @@ extern wxPyApp *wxPythonApp; #define IMP_PYCALLBACK_DR_2WXCDR_pure(CLASS, PCLASS, CBNAME) \ wxDragResult CLASS::CBNAME(wxCoord a, wxCoord b, wxDragResult c) { \ - wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ int rval=0; \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iii)", a,b,c));\ diff --git a/wxPython/src/_filesys.i b/wxPython/src/_filesys.i index aaaea5c8be..a423b23fe5 100644 --- a/wxPython/src/_filesys.i +++ b/wxPython/src/_filesys.i @@ -26,14 +26,16 @@ class wxFSFile : public wxObject { public: - %pythonAppend wxFSFile - "self.thisown = 0 # It will normally be deleted by the user of the wx.FileSystem"; + %typemap(out) wxFSFile*; // turn off this typemap wxFSFile(wxInputStream *stream, const wxString& loc, const wxString& mimetype, const wxString& anchor, wxDateTime modif); - - ~wxFSFile(); + + // Turn it back on. + %typemap(out) wxFSFile* { $result = wxPyMake_wxObject($1, $owner); } + + ~wxFSFile(); wxInputStream *GetStream(); const wxString& GetMimeType(); @@ -103,7 +105,7 @@ class wxPyFileSystemHandler : public wxFileSystemHandler { public: %pythonAppend wxPyFileSystemHandler "self._setCallbackInfo(self, FileSystemHandler)"; - + wxPyFileSystemHandler(); void _setCallbackInfo(PyObject* self, PyObject* _class); @@ -142,7 +144,7 @@ public: %disownarg(wxFileSystemHandler *handler); static void AddHandler(wxFileSystemHandler *handler); %cleardisown(wxFileSystemHandler *handler); - + static void CleanUpHandlers(); // Returns the file URL for a native path @@ -155,7 +157,7 @@ public: wxFileName fname = wxFileSystem::URLToFileName(url); return fname.GetFullPath(); } - } + } }; @@ -250,7 +252,7 @@ public: // Add a file to the memory FS %pythoncode { AddFile = staticmethod(MemoryFSHandler_AddFile) } - + bool CanOpen(const wxString& location); %newobject OpenFile; wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); -- 2.47.2