[Python-checkins] python/dist/src/Mac/Modules/cf pycfbridge.c,1.1,1.2

jackjansen@sourceforge.net jackjansen@sourceforge.net
2002年5月07日 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);

AltStyle によって変換されたページ (->オリジナル) /