diff options
-rw-r--r-- | Mac/Modules/cf/_CFmodule.c | 38 | ||||
-rw-r--r-- | Mac/Modules/cf/cfsupport.py | 33 | ||||
-rw-r--r-- | Mac/Modules/cf/pycfbridge.c | 66 |
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); |