diff --git a/Mac/Modules/cf/pycfbridge.c b/Mac/Modules/cf/pycfbridge.c new file mode 100644 index 00000000000..76c5ad4c4d0 --- /dev/null +++ b/Mac/Modules/cf/pycfbridge.c @@ -0,0 +1,206 @@ +/* +** Convert objects from Python to CoreFoundation and vice-versa. +*/ + +#ifdef WITHOUT_FRAMEWORKS +#include +#include +#include +#include +#include +#include +#else +#include +#endif + +#include "Python.h" +#include "macglue.h" +#include "pycfbridge.h" + + +/* ---------------------------------------- */ +/* CoreFoundation objects to Python objects */ +/* ---------------------------------------- */ + +PyObject * +PyCF_CF2Python(CFTypeRef src) { + CFTypeID typeid; + + typeid = CFGetTypeID(src); + if (typeid == CFArrayGetTypeID()) + return PyCF_CF2Python_sequence((CFArrayRef)src); + if (typeid == CFDictionaryGetTypeID()) + return PyCF_CF2Python_mapping((CFDictionaryRef)src); + return PyCF_CF2Python_simple(src); +} + +PyObject * +PyCF_CF2Python_sequence(CFArrayRef src) { + PyErr_SetString(PyExc_SystemError, "Not yet implemented"); + return NULL; +} + +PyObject * +PyCF_CF2Python_mapping(CFTypeRef src) { + PyErr_SetString(PyExc_SystemError, "Not yet implemented"); + return NULL; +} + +PyObject * +PyCF_CF2Python_simple(CFTypeRef src) { + CFTypeID typeid; + + typeid = CFGetTypeID(src); + if (typeid == CFStringGetTypeID()) + return PyCF_CF2Python_string((CFStringRef)src); + PyMac_Error(resNotFound); + return NULL; +} + +/* Unsure - Return unicode or 8 bit strings? */ +PyObject * +PyCF_CF2Python_string(CFStringRef src) { + int size = CFStringGetLength(src)+1; + Py_UNICODE *data = malloc(size*sizeof(Py_UNICODE)); + CFRange range; + PyObject *rv; + + range.location = 0; + range.length = size; + if( data == NULL ) return PyErr_NoMemory(); + CFStringGetCharacters(src, range, data); + rv = (PyObject *)PyUnicode_FromUnicode(data, size); + free(data); + return rv; +} + +/* ---------------------------------------- */ +/* Python objects to CoreFoundation objects */ +/* ---------------------------------------- */ + +int +PyCF_Python2CF(PyObject *src, CFTypeRef *dst) { + + if (PySequence_Check(src)) + return PyCF_Python2CF_sequence(src, (CFArrayRef *)dst); + if (PyMapping_Check(src)) + return PyCF_Python2CF_mapping(src, (CFDictionaryRef *)dst); + return PyCF_Python2CF_simple(src, dst); +} + +int +PyCF_Python2CF_sequence(PyObject *src, CFArrayRef *dst) { + CFArrayRef rv = NULL; + CFTypeRef item_cf = NULL; + PyObject *item_py = NULL; + int size, i; + + size = PySequence_Size(src); + rv = CFArrayCreateMutable((CFAllocatorRef)NULL, size, &kCFTypeArrayCallBacks); + if (rv == NULL) { + PyMac_Error(resNotFound); + goto err; + } + + for( i=0; iob_type->tp_name); + return 0; +} + +int +PyCF_Python2CF_string(PyObject *src, CFStringRef *dst) { + char *chars; + CFIndex size; + UniChar *unichars; + + if (PyString_Check(src)) { + if ((chars = PyString_AsString(src)) == NULL ) goto err; + *dst = CFStringCreateWithCString((CFAllocatorRef)NULL, chars, 0); + return 1; + } + if (PyUnicode_Check(src)) { + /* We use the CF types here, if Python was configured differently that will give an error */ + size = PyUnicode_GetSize(src); + if ((unichars = PyUnicode_AsUnicode(src)) == NULL ) goto err; + *dst = CFStringCreateWithCharacters((CFAllocatorRef)NULL, unichars, size); + return 1; + } +err: + PyErr_Format(PyExc_TypeError, + "Cannot convert %.500s objects to CF", + src->ob_type->tp_name); + return 0; +} diff --git a/Mac/Modules/cf/pycfbridge.h b/Mac/Modules/cf/pycfbridge.h new file mode 100644 index 00000000000..3377d5dcb1c --- /dev/null +++ b/Mac/Modules/cf/pycfbridge.h @@ -0,0 +1,11 @@ +extern PyObject *PyCF_CF2Python(CFTypeRef src); +extern PyObject *PyCF_CF2Python_sequence(CFArrayRef src); +extern PyObject *PyCF_CF2Python_mapping(CFTypeRef src); +extern PyObject *PyCF_CF2Python_simple(CFTypeRef src); +extern PyObject *PyCF_CF2Python_string(CFStringRef src); + +extern int PyCF_Python2CF(PyObject *src, CFTypeRef *dst); +extern int PyCF_Python2CF_sequence(PyObject *src, CFArrayRef *dst); +extern int PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst); +extern int PyCF_Python2CF_simple(PyObject *src, CFTypeRef *dst); +extern int PyCF_Python2CF_string(PyObject *src, CFStringRef *dst); \ No newline at end of file