[Python-checkins] python/dist/src/Mac/Modules/cf pycfbridge.c,1.1,1.2
jackjansen@sourceforge.net
jackjansen@sourceforge.net
Tue, 07 May 2002 16:00:05 -0700
Update of /cvsroot/python/python/dist/src/Mac/Modules/cf
In directory usw-pr-cvs1:/tmp/cvs-serv27668/Python/Mac/Modules/cf
Modified Files:
pycfbridge.c
Log Message:
More support for bridging between Python and CoreFoundation objects. Still untested.
Index: pycfbridge.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Mac/Modules/cf/pycfbridge.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** pycfbridge.c 5 May 2002 21:48:12 -0000 1.1
--- pycfbridge.c 7 May 2002 23:00:03 -0000 1.2
***************
*** 27,30 ****
--- 27,34 ----
CFTypeID typeid;
+ if( src == NULL ) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
typeid = CFGetTypeID(src);
if (typeid == CFArrayGetTypeID())
***************
*** 37,41 ****
PyObject *
PyCF_CF2Python_sequence(CFArrayRef src) {
! PyErr_SetString(PyExc_SystemError, "Not yet implemented");
return NULL;
}
--- 41,64 ----
PyObject *
PyCF_CF2Python_sequence(CFArrayRef src) {
! 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;
}
***************
*** 43,47 ****
PyObject *
PyCF_CF2Python_mapping(CFTypeRef src) {
! PyErr_SetString(PyExc_SystemError, "Not yet implemented");
return NULL;
}
--- 66,101 ----
PyObject *
PyCF_CF2Python_mapping(CFTypeRef src) {
! 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;
}
***************
*** 91,95 ****
int
PyCF_Python2CF_sequence(PyObject *src, CFArrayRef *dst) {
! CFArrayRef rv = NULL;
CFTypeRef item_cf = NULL;
PyObject *item_py = NULL;
--- 145,149 ----
int
PyCF_Python2CF_sequence(PyObject *src, CFArrayRef *dst) {
! CFMutableArrayRef rv = NULL;
CFTypeRef item_cf = NULL;
PyObject *item_py = NULL;
***************
*** 123,127 ****
int
PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) {
! CFDictionaryRef rv = NULL;
PyObject *aslist = NULL;
CFTypeRef key_cf = NULL, value_cf = NULL;
--- 177,181 ----
int
PyCF_Python2CF_mapping(PyObject *src, CFDictionaryRef *dst) {
! CFMutableDictionaryRef rv = NULL;
PyObject *aslist = NULL;
CFTypeRef key_cf = NULL, value_cf = NULL;
***************
*** 131,135 ****
size = PyMapping_Size(src);
rv = CFDictionaryCreateMutable((CFAllocatorRef)NULL, size,
! &kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
if (rv == NULL) {
--- 185,189 ----
size = PyMapping_Size(src);
rv = CFDictionaryCreateMutable((CFAllocatorRef)NULL, size,
! &kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
if (rv == NULL) {
***************
*** 145,149 ****
if ( !PyCF_Python2CF(key_py, &key_cf) ) goto err;
Py_DECREF(key_py);
! if ( !PyCF_Python2CF(value_cf, &key_cf) ) goto err;
Py_DECREF(value_py);
CFDictionaryAddValue(rv, key_cf, value_cf);
--- 199,203 ----
if ( !PyCF_Python2CF(key_py, &key_cf) ) goto err;
Py_DECREF(key_py);
! if ( !PyCF_Python2CF(value_py, &value_cf) ) goto err;
Py_DECREF(value_py);
CFDictionaryAddValue(rv, key_cf, value_cf);