X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/db301e681f78550c6a852fc0ce00537c5f930fa2..f78e4942ec0f3f6abd2992502e2d6c5c2e8e55f6:/wxPython/src/helpers.cpp diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index aa4ebd2986..d3f1aebbb8 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -49,7 +49,7 @@ //---------------------------------------------------------------------- -#if PYTHON_API_VERSION <= 1007 && wxUSE_UNICODE +#if PYTHON_API_VERSION < 1009 && wxUSE_UNICODE #error Python must support Unicode to use wxWindows Unicode #endif @@ -78,6 +78,8 @@ wxPyThreadStateArray* wxPyTStates = NULL; wxMutex* wxPyTMutex = NULL; #endif +#define DEFAULTENCODING_SIZE 64 +static char wxPyDefaultEncoding[DEFAULTENCODING_SIZE] = "ascii"; static PyObject* wxPython_dict = NULL; static PyObject* wxPyAssertionError = NULL; @@ -421,10 +423,10 @@ void wxPyApp::_BootstrapApp() goto error; } - // On wxGTK the locale will be changed to match the system settings, but - // Python needs to have LC_NUMERIC set to "C" in order for the floating - // point conversions and such to work right. -#if defined(__WXGTK__) && PYTHON_API_VERSION <= 1012 + // On wxGTK the locale will be changed to match the system settings, + // but Python before 2.4 needs to have LC_NUMERIC set to "C" in order + // for the floating point conversions and such to work right. +#if defined(__WXGTK__) && PY_VERSION_HEX < 0x02040000 setlocale(LC_NUMERIC, "C"); #endif @@ -864,10 +866,8 @@ bool wxPyCheckForApp() { //--------------------------------------------------------------------------- - -void wxPyClientData_dtor(wxPyClientData* self) { - if (! wxPyDoingCleanup) { // Don't do it during cleanup as Python - // may have already garbage collected the object... +void wxPyUserData_dtor(wxPyUserData* self) { + if (! wxPyDoingCleanup) { bool blocked = wxPyBeginBlockThreads(); Py_DECREF(self->m_obj); self->m_obj = NULL; @@ -875,16 +875,21 @@ void wxPyClientData_dtor(wxPyClientData* self) { } } -void wxPyUserData_dtor(wxPyUserData* self) { - if (! wxPyDoingCleanup) { - bool blocked = wxPyBeginBlockThreads(); - Py_DECREF(self->m_obj); + +void wxPyClientData_dtor(wxPyClientData* self) { + if (! wxPyDoingCleanup) { // Don't do it during cleanup as Python + // may have already garbage collected the object... + if (self->m_incRef) { + bool blocked = wxPyBeginBlockThreads(); + Py_DECREF(self->m_obj); + wxPyEndBlockThreads(blocked); + } self->m_obj = NULL; - wxPyEndBlockThreads(blocked); } } + // This is called when an OOR controled object is being destroyed. Although // the C++ object is going away there is no way to force the Python object // (and all references to it) to die too. This causes problems (crashes) in @@ -907,8 +912,9 @@ void wxPyOORClientData_dtor(wxPyOORClientData* self) { } - // Only if there is more than one reference to the object - if ( !wxPyDoingCleanup && self->m_obj->ob_refcnt > 1 ) { + // Only if there is more than one reference to the object and we are + // holding the OOR reference: + if ( !wxPyDoingCleanup && self->m_obj->ob_refcnt > 1 && self->m_incRef) { // bool isInstance = wxPyInstance_Check(self->m_obj); // TODO same here //wxASSERT_MSG(isInstance, wxT("m_obj not an instance!?!?!")); @@ -1184,7 +1190,8 @@ bool wxPyInputStream::eof() { } wxPyInputStream::~wxPyInputStream() { - /* do nothing */ + if (m_wxis) + delete m_wxis; } @@ -1385,7 +1392,7 @@ PyObject* wxPyCBInputStream::getMethod(PyObject* py, char* name) { } -size_t wxPyCBInputStream::GetSize() const { +wxFileOffset wxPyCBInputStream::GetLength() const { wxPyCBInputStream* self = (wxPyCBInputStream*)this; // cast off const if (m_seek && m_tell) { wxFileOffset temp = self->OnSysTell(); @@ -1394,7 +1401,7 @@ size_t wxPyCBInputStream::GetSize() const { return ret; } else - return 0; + return wxInvalidOffset; } @@ -1429,14 +1436,20 @@ size_t wxPyCBInputStream::OnSysWrite(const void *buffer, size_t bufsize) { return 0; } + wxFileOffset wxPyCBInputStream::OnSysSeek(wxFileOffset off, wxSeekMode mode) { bool blocked = wxPyBeginBlockThreads(); -#if defined( __WINCE__) || defined(_LARGE_FILES) || wxHAS_HUGE_FILES - // wxFileOffset is a 64-bit value... - PyObject* arglist = Py_BuildValue("(Li)", off, mode); -#else - PyObject* arglist = Py_BuildValue("(ii)", off, mode); -#endif + PyObject* arglist = PyTuple_New(2); + + if (sizeof(wxFileOffset) > sizeof(long)) + // wxFileOffset is a 64-bit value... + PyTuple_SET_ITEM(arglist, 0, PyLong_FromLongLong(off)); + else + PyTuple_SET_ITEM(arglist, 0, PyInt_FromLong(off)); + + PyTuple_SET_ITEM(arglist, 1, PyInt_FromLong(mode)); + + PyObject* result = PyEval_CallObject(m_seek, arglist); Py_DECREF(arglist); Py_XDECREF(result); @@ -1452,11 +1465,9 @@ wxFileOffset wxPyCBInputStream::OnSysTell() const { Py_DECREF(arglist); wxFileOffset o = 0; if (result != NULL) { -#if defined( __WINCE__) || defined(_LARGE_FILES) || wxHAS_HUGE_FILES if (PyLong_Check(result)) o = PyLong_AsLongLong(result); else -#endif o = PyInt_AsLong(result); Py_DECREF(result); }; @@ -1898,7 +1909,7 @@ wxString* wxString_in_helper(PyObject* source) { #if wxUSE_UNICODE PyObject* uni = source; if (PyString_Check(source)) { - uni = PyUnicode_FromObject(source); + uni = PyUnicode_FromEncodedObject(source, wxPyDefaultEncoding, "strict"); if (PyErr_Occurred()) return NULL; } target = new wxString(); @@ -1913,7 +1924,11 @@ wxString* wxString_in_helper(PyObject* source) { #else // Convert to a string object if it isn't already, then to wxString PyObject* str = source; - if (!PyString_Check(source)) { + if (PyUnicode_Check(source)) { + str = PyUnicode_AsEncodedString(source, wxPyDefaultEncoding, "strict"); + if (PyErr_Occurred()) return NULL; + } + else if (!PyString_Check(source)) { str = PyObject_Str(source); if (PyErr_Occurred()) return NULL; } @@ -1938,7 +1953,7 @@ wxString Py2wxString(PyObject* source) // Convert to a unicode object, if not already, then to a wxString PyObject* uni = source; if (!PyUnicode_Check(source)) { - uni = PyUnicode_FromObject(source); + uni = PyUnicode_FromEncodedObject(source, wxPyDefaultEncoding, "strict"); if (PyErr_Occurred()) return wxEmptyString; // TODO: should we PyErr_Clear? } size_t len = PyUnicode_GET_SIZE(uni); @@ -1952,7 +1967,11 @@ wxString Py2wxString(PyObject* source) #else // Convert to a string object if it isn't already, then to wxString PyObject* str = source; - if (!PyString_Check(source)) { + if (PyUnicode_Check(source)) { + str = PyUnicode_AsEncodedString(source, wxPyDefaultEncoding, "strict"); + if (PyErr_Occurred()) return wxEmptyString; // TODO: should we PyErr_Clear? + } + else if (!PyString_Check(source)) { str = PyObject_Str(source); if (PyErr_Occurred()) return wxEmptyString; // TODO: should we PyErr_Clear? } @@ -1981,6 +2000,17 @@ PyObject* wx2PyString(const wxString& src) } + +void wxSetDefaultPyEncoding(const char* encoding) +{ + strncpy(wxPyDefaultEncoding, encoding, DEFAULTENCODING_SIZE); +} + +const char* wxGetDefaultPyEncoding() +{ + return wxPyDefaultEncoding; +} + //----------------------------------------------------------------------