]> granicus.if.org Git - python/commitdiff
More support for bridging between Python and CoreFoundation objects. Still untested.
authorJack Jansen <jack.jansen@cwi.nl>
Tue, 7 May 2002 23:00:03 +0000 (23:00 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Tue, 7 May 2002 23:00:03 +0000 (23:00 +0000)
Mac/Modules/cf/_CFmodule.c
Mac/Modules/cf/cfsupport.py
Mac/Modules/cf/pycfbridge.c

index 373976d110765544e64d04c89749aa885889d9bb..9dbe8256ebcfc797363895239349333516c04849 100644 (file)
@@ -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}
 };
 
index fb275c3ed066dc98b7a499aa1a4f84299707d41c..d6904412bb0fe6a53da0795126c8e322082725de 100644 (file)
@@ -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)
index 76c5ad4c4d08fd8f538a5a0782bc6b8832be1d9c..9afc96ccaadb7c075e34d1f7e2864dc8b451b960 100644 (file)
@@ -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);