+// included in every file over and over again...
+
+#if PYTHON_API_VERSION >= 1009
+ static char* wxStringErrorMsg = "String or Unicode type required";
+#else
+ static char* wxStringErrorMsg = "String type required";
+#endif
+
+
+wxString* wxString_in_helper(PyObject* source) {
+ wxString* target;
+#if PYTHON_API_VERSION >= 1009 // Have Python unicode API
+ if (!PyString_Check(source) && !PyUnicode_Check(source)) {
+ PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+ return NULL;
+ }
+#if wxUSE_UNICODE
+ if (PyUnicode_Check(source)) {
+ target = new wxString(PyUnicode_AS_UNICODE(source));
+ } else {
+ // It is a string, get pointers to it and transform to unicode
+ char* tmpPtr; int tmpSize;
+ PyString_AsStringAndSize(source, &tmpPtr, &tmpSize);
+ target = new wxString(tmpPtr, *wxConvCurrent, tmpSize);
+ }
+#else
+ char* tmpPtr; int tmpSize;
+ if (PyString_AsStringAndSize(source, &tmpPtr, &tmpSize) == -1) {
+ PyErr_SetString(PyExc_TypeError, "Unable to convert string");
+ return NULL;
+ }
+ target = new wxString(tmpPtr, tmpSize);
+#endif // wxUSE_UNICODE
+
+#else // No Python unicode API (1.5.2)
+ if (!PyString_Check(source)) {
+ PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+ return NULL;
+ }
+ target = new wxString(PyString_AS_STRING(source), PyString_GET_SIZE(source));
+#endif
+ return target;
+}
+
+
+// Similar to above except doesn't use "new" and doesn't set an exception
+wxString Py2wxString(PyObject* source)
+{
+ wxString target;
+ bool doDecRef = FALSE;
+
+#if PYTHON_API_VERSION >= 1009 // Have Python unicode API
+ if (!PyString_Check(source) && !PyUnicode_Check(source)) {
+ // Convert to String if not one already... (TODO: Unicode too?)
+ source = PyObject_Str(source);
+ doDecRef = TRUE;
+ }
+
+#if wxUSE_UNICODE
+ if (PyUnicode_Check(source)) {
+ target = PyUnicode_AS_UNICODE(source);
+ } else {
+ // It is a string, get pointers to it and transform to unicode
+ char* tmpPtr; int tmpSize;
+ PyString_AsStringAndSize(source, &tmpPtr, &tmpSize);
+ target = wxString(tmpPtr, *wxConvCurrent, tmpSize);
+ }
+#else
+ char* tmpPtr; int tmpSize;
+ PyString_AsStringAndSize(source, &tmpPtr, &tmpSize);
+ target = wxString(tmpPtr, tmpSize);
+#endif // wxUSE_UNICODE
+
+#else // No Python unicode API (1.5.2)
+ if (!PyString_Check(source)) {
+ // Convert to String if not one already...
+ source = PyObject_Str(source);
+ doDecRef = TRUE;
+ }
+ target = wxString(PyString_AS_STRING(source), PyString_GET_SIZE(source));
+#endif
+
+ if (doDecRef)
+ Py_DECREF(source);
+ return target;
+}
+
+
+// Make either a Python String or Unicode object, depending on build mode
+PyObject* wx2PyString(const wxString& src)
+{
+ PyObject* str;
+#if wxUSE_UNICODE
+ str = PyUnicode_FromUnicode(src.c_str(), src.Len());
+#else
+ str = PyString_FromStringAndSize(src.c_str(), src.Len());
+#endif
+ return str;
+}
+
+
+//----------------------------------------------------------------------