summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2002-05-07 23:00:03 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2002-05-07 23:00:03 (GMT)
commit5ad6f7a3a9190df03583ff9c0426a97e15a63ada (patch)
treefa1ec9e86aff16e6fd0be841a784f2af9e9934fe
parentcb376460b76b760f28761150413192402cda6f54 (diff)
downloadcpython-5ad6f7a3a9190df03583ff9c0426a97e15a63ada.zip
cpython-5ad6f7a3a9190df03583ff9c0426a97e15a63ada.tar.gz
cpython-5ad6f7a3a9190df03583ff9c0426a97e15a63ada.tar.bz2
More support for bridging between Python and CoreFoundation objects. Still untested.
-rw-r--r--Mac/Modules/cf/_CFmodule.c38
-rw-r--r--Mac/Modules/cf/cfsupport.py33
-rw-r--r--Mac/Modules/cf/pycfbridge.c66
3 files changed, 131 insertions, 6 deletions
diff --git a/Mac/Modules/cf/_CFmodule.c b/Mac/Modules/cf/_CFmodule.c
index 373976d..9dbe825 100644
--- a/Mac/Modules/cf/_CFmodule.c
+++ b/Mac/Modules/cf/_CFmodule.c
@@ -31,6 +31,8 @@
#include <CoreServices/CoreServices.h>
#endif
+#include "pycfbridge.h"
+
#ifdef USE_TOOLBOX_OBJECT_GLUE
extern PyObject *_CFTypeRefObj_New(CFTypeRef);
extern int _CFTypeRefObj_Convert(PyObject *, CFTypeRef *);
@@ -287,6 +289,14 @@ static PyObject *CFTypeRefObj_CFShow(CFTypeRefObject *_self, PyObject *_args)
return _res;
}
+static PyObject *CFTypeRefObj_toPython(CFTypeRefObject *_self, PyObject *_args)
+{
+ PyObject *_res = NULL;
+
+ return PyCF_CF2Python(_self->ob_itself);
+
+}
+
static PyMethodDef CFTypeRefObj_methods[] = {
{"CFGetTypeID", (PyCFunction)CFTypeRefObj_CFGetTypeID, 1,
"() -> (CFTypeID _rv)"},
@@ -304,6 +314,8 @@ static PyMethodDef CFTypeRefObj_methods[] = {
"() -> (CFStringRef _rv)"},
{"CFShow", (PyCFunction)CFTypeRefObj_CFShow, 1,
"() -> None"},
+ {"toPython", (PyCFunction)CFTypeRefObj_toPython, 1,
+ "() -> (python_object)"},
{NULL, NULL, 0}
};
@@ -3695,6 +3707,30 @@ static PyObject *CF_CFURLCreateFromFSRef(PyObject *_self, PyObject *_args)
return _res;
}
+static PyObject *CF_toCF(PyObject *_self, PyObject *_args)
+{
+ PyObject *_res = NULL;
+
+ CFTypeRef rv;
+ CFTypeID typeid;
+
+ if (!PyArg_ParseTuple(_args, "O&", PyCF_Python2CF, &rv))
+ return NULL;
+ typeid = CFGetTypeID(rv);
+
+ if (typeid == CFStringGetTypeID())
+ return Py_BuildValue("O&", CFStringRefObj_New, rv);
+ if (typeid == CFArrayGetTypeID())
+ return Py_BuildValue("O&", CFArrayRefObj_New, rv);
+ if (typeid == CFDictionaryGetTypeID())
+ return Py_BuildValue("O&", CFDictionaryRefObj_New, rv);
+ if (typeid == CFURLGetTypeID())
+ return Py_BuildValue("O&", CFURLRefObj_New, rv);
+
+ return Py_BuildValue("O&", CFTypeRefObj_New, rv);
+
+}
+
static PyMethodDef CF_methods[] = {
{"__CFRangeMake", (PyCFunction)CF___CFRangeMake, 1,
"(CFIndex loc, CFIndex len) -> (CFRange _rv)"},
@@ -3778,6 +3814,8 @@ static PyMethodDef CF_methods[] = {
"(Buffer buffer, Boolean isDirectory, CFURLRef baseURL) -> (CFURLRef _rv)"},
{"CFURLCreateFromFSRef", (PyCFunction)CF_CFURLCreateFromFSRef, 1,
"(FSRef fsRef) -> (CFURLRef _rv)"},
+ {"toCF", (PyCFunction)CF_toCF, 1,
+ "(python_object) -> (CF_object)"},
{NULL, NULL, 0}
};
diff --git a/Mac/Modules/cf/cfsupport.py b/Mac/Modules/cf/cfsupport.py
index fb275c3..d690441 100644
--- a/Mac/Modules/cf/cfsupport.py
+++ b/Mac/Modules/cf/cfsupport.py
@@ -53,6 +53,8 @@ includestuff = includestuff + """
#include <CoreServices/CoreServices.h>
#endif
+#include "pycfbridge.h"
+
#ifdef USE_TOOLBOX_OBJECT_GLUE
extern PyObject *_CFTypeRefObj_New(CFTypeRef);
extern int _CFTypeRefObj_Convert(PyObject *, CFTypeRef *);
@@ -485,6 +487,37 @@ f = ManualGenerator("CFStringGetUnicode", getasunicode_body);
f.docstring = lambda: "() -> (unicode _rv)"
CFStringRef_object.add(f)
+toPython_body = """
+return PyCF_CF2Python(_self->ob_itself);
+"""
+
+f = ManualGenerator("toPython", toPython_body);
+f.docstring = lambda: "() -> (python_object)"
+CFTypeRef_object.add(f)
+
+toCF_body = """
+CFTypeRef rv;
+CFTypeID typeid;
+
+if (!PyArg_ParseTuple(_args, "O&", PyCF_Python2CF, &rv))
+ return NULL;
+typeid = CFGetTypeID(rv);
+
+if (typeid == CFStringGetTypeID())
+ return Py_BuildValue("O&", CFStringRefObj_New, rv);
+if (typeid == CFArrayGetTypeID())
+ return Py_BuildValue("O&", CFArrayRefObj_New, rv);
+if (typeid == CFDictionaryGetTypeID())
+ return Py_BuildValue("O&", CFDictionaryRefObj_New, rv);
+if (typeid == CFURLGetTypeID())
+ return Py_BuildValue("O&", CFURLRefObj_New, rv);
+
+return Py_BuildValue("O&", CFTypeRefObj_New, rv);
+"""
+f = ManualGenerator("toCF", toCF_body);
+f.docstring = lambda: "(python_object) -> (CF_object)"
+module.add(f)
+
# ADD add forloop here
# generate output (open the output file as late as possible)
diff --git a/Mac/Modules/cf/pycfbridge.c b/Mac/Modules/cf/pycfbridge.c
index 76c5ad4..9afc96c 100644
--- a/Mac/Modules/cf/pycfbridge.c
+++ b/Mac/Modules/cf/pycfbridge.c
@@ -26,6 +26,10 @@ PyObject *
PyCF_CF2Python(CFTypeRef src) {
CFTypeID typeid;
+ if( src == NULL ) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
typeid = CFGetTypeID(src);
if (typeid == CFArrayGetTypeID())
return PyCF_CF2Python_sequence((CFArrayRef)src);
@@ -36,13 +40,63 @@ PyCF_CF2Python(CFTypeRef src) {
PyObject *
PyCF_CF2Python_sequence(CFArrayRef src) {
- PyErr_SetString(PyExc_SystemError, "Not yet implemented");
+ int size = CFArrayGetCount(src);
+ PyObject *rv;
+ CFTypeRef item_cf;
+ PyObject *item_py = NULL;
+ int i;
+
+ if ( (rv=PyList_New(size)) == NULL )
+ return NULL;
+ for(i=0; i<size; i++) {
+ item_cf = CFArrayGetValueAtIndex(src, i);
+ if (item_cf == NULL ) goto err;
+ item_py = PyCF_CF2Python(item_cf);
+ if (item_py == NULL ) goto err;
+ if (!PyList_SetItem(rv, i, item_py)) goto err;
+ item_py = NULL;
+ }
+ return rv;
+err:
+ Py_XDECREF(item_py);
+ Py_DECREF(rv);
return NULL;
}
PyObject *
PyCF_CF2Python_mapping(CFTypeRef src) {
- PyErr_SetString(PyExc_SystemError, "Not yet implemented");
+ int size = CFDictionaryGetCount(src);
+ PyObject *rv;
+ CFTypeRef *allkeys, *allvalues;
+ CFTypeRef key_cf, value_cf;
+ PyObject *key_py = NULL, *value_py = NULL;
+ int i;
+
+ allkeys = malloc(size*sizeof(CFTypeRef *));
+ if (allkeys == NULL) return PyErr_NoMemory();
+ allvalues = malloc(size*sizeof(CFTypeRef *));
+ if (allvalues == NULL) return PyErr_NoMemory();
+ if ( (rv=PyDict_New()) == NULL )
+ return NULL;
+ CFDictionaryGetKeysAndValues(src, allkeys, allvalues);
+ for(i=0; i<size; i++) {
+ key_cf = allkeys[i];
+ value_cf = allvalues[i];
+ key_py = PyCF_CF2Python(key_cf);
+ if (key_py == NULL ) goto err;
+ value_py = PyCF_CF2Python(value_py);
+ if (value_py == NULL ) goto err;
+ if (!PyDict_SetItem(rv, key_py, value_py)) goto err;
+ key_py = NULL;
+ value_py = NULL;
+ }
+ return rv;
+err:
+ Py_XDECREF(key_py);
+ Py_XDECREF(value_py);
+ Py_DECREF(rv);
+ free(allkeys);
+ free(allvalues);
return NULL;
}
@@ -90,7 +144,7 @@ PyCF_Python2CF(PyObject *src, CFTypeRef *dst) {
int
PyCF_Python2CF_sequence(PyObject *src, CFArrayRef *dst) {
- CFArrayRef rv = NULL;
+ CFMutableArrayRef rv = NULL;
CFTypeRef item_cf = NULL;
PyObject *item_py = NULL;
int size, i;
@@ -122,7 +176,7 @@ err:
int
PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) {
- CFDictionaryRef rv = NULL;
+ CFMutableDictionaryRef rv = NULL;
PyObject *aslist = NULL;
CFTypeRef key_cf = NULL, value_cf = NULL;
PyObject *item_py = NULL, *key_py = NULL, *value_py = NULL;
@@ -130,7 +184,7 @@ PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) {
size = PyMapping_Size(src);
rv = CFDictionaryCreateMutable((CFAllocatorRef)NULL, size,
- &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
if (rv == NULL) {
PyMac_Error(resNotFound);
@@ -144,7 +198,7 @@ PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) {
if (!PyArg_ParseTuple(item_py, "OO", key_py, value_py)) goto err;
if ( !PyCF_Python2CF(key_py, &key_cf) ) goto err;
Py_DECREF(key_py);
- if ( !PyCF_Python2CF(value_cf, &key_cf) ) goto err;
+ if ( !PyCF_Python2CF(value_py, &value_cf) ) goto err;
Py_DECREF(value_py);
CFDictionaryAddValue(rv, key_cf, value_cf);
CFRelease(key_cf);