[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);