Kaydet (Commit) 5ad6f7a3 authored tarafından Jack Jansen's avatar Jack Jansen

More support for bridging between Python and CoreFoundation objects. Still untested.

üst cb376460
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
#include <CoreServices/CoreServices.h> #include <CoreServices/CoreServices.h>
#endif #endif
#include "pycfbridge.h"
#ifdef USE_TOOLBOX_OBJECT_GLUE #ifdef USE_TOOLBOX_OBJECT_GLUE
extern PyObject *_CFTypeRefObj_New(CFTypeRef); extern PyObject *_CFTypeRefObj_New(CFTypeRef);
extern int _CFTypeRefObj_Convert(PyObject *, CFTypeRef *); extern int _CFTypeRefObj_Convert(PyObject *, CFTypeRef *);
...@@ -287,6 +289,14 @@ static PyObject *CFTypeRefObj_CFShow(CFTypeRefObject *_self, PyObject *_args) ...@@ -287,6 +289,14 @@ static PyObject *CFTypeRefObj_CFShow(CFTypeRefObject *_self, PyObject *_args)
return _res; return _res;
} }
static PyObject *CFTypeRefObj_toPython(CFTypeRefObject *_self, PyObject *_args)
{
PyObject *_res = NULL;
return PyCF_CF2Python(_self->ob_itself);
}
static PyMethodDef CFTypeRefObj_methods[] = { static PyMethodDef CFTypeRefObj_methods[] = {
{"CFGetTypeID", (PyCFunction)CFTypeRefObj_CFGetTypeID, 1, {"CFGetTypeID", (PyCFunction)CFTypeRefObj_CFGetTypeID, 1,
"() -> (CFTypeID _rv)"}, "() -> (CFTypeID _rv)"},
...@@ -304,6 +314,8 @@ static PyMethodDef CFTypeRefObj_methods[] = { ...@@ -304,6 +314,8 @@ static PyMethodDef CFTypeRefObj_methods[] = {
"() -> (CFStringRef _rv)"}, "() -> (CFStringRef _rv)"},
{"CFShow", (PyCFunction)CFTypeRefObj_CFShow, 1, {"CFShow", (PyCFunction)CFTypeRefObj_CFShow, 1,
"() -> None"}, "() -> None"},
{"toPython", (PyCFunction)CFTypeRefObj_toPython, 1,
"() -> (python_object)"},
{NULL, NULL, 0} {NULL, NULL, 0}
}; };
...@@ -3695,6 +3707,30 @@ static PyObject *CF_CFURLCreateFromFSRef(PyObject *_self, PyObject *_args) ...@@ -3695,6 +3707,30 @@ static PyObject *CF_CFURLCreateFromFSRef(PyObject *_self, PyObject *_args)
return _res; 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[] = { static PyMethodDef CF_methods[] = {
{"__CFRangeMake", (PyCFunction)CF___CFRangeMake, 1, {"__CFRangeMake", (PyCFunction)CF___CFRangeMake, 1,
"(CFIndex loc, CFIndex len) -> (CFRange _rv)"}, "(CFIndex loc, CFIndex len) -> (CFRange _rv)"},
...@@ -3778,6 +3814,8 @@ static PyMethodDef CF_methods[] = { ...@@ -3778,6 +3814,8 @@ static PyMethodDef CF_methods[] = {
"(Buffer buffer, Boolean isDirectory, CFURLRef baseURL) -> (CFURLRef _rv)"}, "(Buffer buffer, Boolean isDirectory, CFURLRef baseURL) -> (CFURLRef _rv)"},
{"CFURLCreateFromFSRef", (PyCFunction)CF_CFURLCreateFromFSRef, 1, {"CFURLCreateFromFSRef", (PyCFunction)CF_CFURLCreateFromFSRef, 1,
"(FSRef fsRef) -> (CFURLRef _rv)"}, "(FSRef fsRef) -> (CFURLRef _rv)"},
{"toCF", (PyCFunction)CF_toCF, 1,
"(python_object) -> (CF_object)"},
{NULL, NULL, 0} {NULL, NULL, 0}
}; };
......
...@@ -53,6 +53,8 @@ includestuff = includestuff + """ ...@@ -53,6 +53,8 @@ includestuff = includestuff + """
#include <CoreServices/CoreServices.h> #include <CoreServices/CoreServices.h>
#endif #endif
#include "pycfbridge.h"
#ifdef USE_TOOLBOX_OBJECT_GLUE #ifdef USE_TOOLBOX_OBJECT_GLUE
extern PyObject *_CFTypeRefObj_New(CFTypeRef); extern PyObject *_CFTypeRefObj_New(CFTypeRef);
extern int _CFTypeRefObj_Convert(PyObject *, CFTypeRef *); extern int _CFTypeRefObj_Convert(PyObject *, CFTypeRef *);
...@@ -485,6 +487,37 @@ f = ManualGenerator("CFStringGetUnicode", getasunicode_body); ...@@ -485,6 +487,37 @@ f = ManualGenerator("CFStringGetUnicode", getasunicode_body);
f.docstring = lambda: "() -> (unicode _rv)" f.docstring = lambda: "() -> (unicode _rv)"
CFStringRef_object.add(f) 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 # ADD add forloop here
# generate output (open the output file as late as possible) # generate output (open the output file as late as possible)
......
...@@ -26,6 +26,10 @@ PyObject * ...@@ -26,6 +26,10 @@ PyObject *
PyCF_CF2Python(CFTypeRef src) { PyCF_CF2Python(CFTypeRef src) {
CFTypeID typeid; CFTypeID typeid;
if( src == NULL ) {
Py_INCREF(Py_None);
return Py_None;
}
typeid = CFGetTypeID(src); typeid = CFGetTypeID(src);
if (typeid == CFArrayGetTypeID()) if (typeid == CFArrayGetTypeID())
return PyCF_CF2Python_sequence((CFArrayRef)src); return PyCF_CF2Python_sequence((CFArrayRef)src);
...@@ -36,13 +40,63 @@ PyCF_CF2Python(CFTypeRef src) { ...@@ -36,13 +40,63 @@ PyCF_CF2Python(CFTypeRef src) {
PyObject * PyObject *
PyCF_CF2Python_sequence(CFArrayRef src) { 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; return NULL;
} }
PyObject * PyObject *
PyCF_CF2Python_mapping(CFTypeRef src) { 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; return NULL;
} }
...@@ -90,7 +144,7 @@ PyCF_Python2CF(PyObject *src, CFTypeRef *dst) { ...@@ -90,7 +144,7 @@ PyCF_Python2CF(PyObject *src, CFTypeRef *dst) {
int int
PyCF_Python2CF_sequence(PyObject *src, CFArrayRef *dst) { PyCF_Python2CF_sequence(PyObject *src, CFArrayRef *dst) {
CFArrayRef rv = NULL; CFMutableArrayRef rv = NULL;
CFTypeRef item_cf = NULL; CFTypeRef item_cf = NULL;
PyObject *item_py = NULL; PyObject *item_py = NULL;
int size, i; int size, i;
...@@ -122,7 +176,7 @@ err: ...@@ -122,7 +176,7 @@ err:
int int
PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) { PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) {
CFDictionaryRef rv = NULL; CFMutableDictionaryRef rv = NULL;
PyObject *aslist = NULL; PyObject *aslist = NULL;
CFTypeRef key_cf = NULL, value_cf = NULL; CFTypeRef key_cf = NULL, value_cf = NULL;
PyObject *item_py = NULL, *key_py = NULL, *value_py = NULL; PyObject *item_py = NULL, *key_py = NULL, *value_py = NULL;
...@@ -130,7 +184,7 @@ PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) { ...@@ -130,7 +184,7 @@ PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) {
size = PyMapping_Size(src); size = PyMapping_Size(src);
rv = CFDictionaryCreateMutable((CFAllocatorRef)NULL, size, rv = CFDictionaryCreateMutable((CFAllocatorRef)NULL, size,
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks); &kCFTypeDictionaryValueCallBacks);
if (rv == NULL) { if (rv == NULL) {
PyMac_Error(resNotFound); PyMac_Error(resNotFound);
...@@ -144,7 +198,7 @@ PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) { ...@@ -144,7 +198,7 @@ PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) {
if (!PyArg_ParseTuple(item_py, "OO", key_py, value_py)) goto err; if (!PyArg_ParseTuple(item_py, "OO", key_py, value_py)) goto err;
if ( !PyCF_Python2CF(key_py, &key_cf) ) goto err; if ( !PyCF_Python2CF(key_py, &key_cf) ) goto err;
Py_DECREF(key_py); 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); Py_DECREF(value_py);
CFDictionaryAddValue(rv, key_cf, value_cf); CFDictionaryAddValue(rv, key_cf, value_cf);
CFRelease(key_cf); CFRelease(key_cf);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment