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

jackjansen@sourceforge.net jackjansen@sourceforge.net
Wed, 08 May 2002 15:13:53 -0700


Update of /cvsroot/python/python/dist/src/Mac/Modules/cf
In directory usw-pr-cvs1:/tmp/cvs-serv3863/Python/Mac/Modules/cf

Modified Files:
	pycfbridge.c 
Log Message:
Fixed string and dict conversion, and implemented booleans and numbers (int and float). I think we now have enough CFType support to start on plists and CFpreferences!

Transparent handling of unknown CFType objects still TBD.

Index: pycfbridge.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Mac/Modules/cf/pycfbridge.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** pycfbridge.c	8 May 2002 15:29:33 -0000	1.3
--- pycfbridge.c	8 May 2002 22:13:51 -0000	1.4
***************
*** 5,8 ****
--- 5,9 ----
  #ifdef WITHOUT_FRAMEWORKS
  #include <CFBase.h>
+ #include <CFNumber.h>
  #include <CFArray.h>
  #include <CFData.h>
***************
*** 67,72 ****
  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;
--- 68,73 ----
  PyCF_CF2Python_mapping(CFTypeRef src) {
  	int size = CFDictionaryGetCount(src);
! 	PyObject *rv = NULL;
! 	CFTypeRef *allkeys = NULL, *allvalues = NULL;
  	CFTypeRef key_cf, value_cf;
  	PyObject *key_py = NULL, *value_py = NULL;
***************
*** 74,82 ****
  	
  	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++) {
--- 75,88 ----
  	
  	allkeys = malloc(size*sizeof(CFTypeRef *));
! 	if (allkeys == NULL) {
! 		PyErr_NoMemory();
! 		goto err;
! 	}
  	allvalues = malloc(size*sizeof(CFTypeRef *));
! 	if (allvalues == NULL) {
! 		PyErr_NoMemory();
! 		goto err;
! 	}
! 	if ( (rv=PyDict_New()) == NULL ) goto err;
  	CFDictionaryGetKeysAndValues(src, allkeys, allvalues);
  	for(i=0; i<size; i++) {
***************
*** 85,89 ****
  		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) < 0) goto err;
--- 91,95 ----
  		key_py = PyCF_CF2Python(key_cf);
  		if (key_py == NULL ) goto err;
! 		value_py = PyCF_CF2Python(value_cf);
  		if (value_py == NULL ) goto err;
  		if (PyDict_SetItem(rv, key_py, value_py) < 0) goto err;
***************
*** 95,99 ****
  	Py_XDECREF(key_py);
  	Py_XDECREF(value_py);
! 	Py_DECREF(rv);
  	free(allkeys);
  	free(allvalues);
--- 101,105 ----
  	Py_XDECREF(key_py);
  	Py_XDECREF(value_py);
! 	Py_XDECREF(rv);
  	free(allkeys);
  	free(allvalues);
***************
*** 108,111 ****
--- 114,132 ----
  	if (typeid == CFStringGetTypeID())
  		return PyCF_CF2Python_string((CFStringRef)src);
+ 	if (typeid == CFBooleanGetTypeID())
+ 		return PyBool_FromLong((long)CFBooleanGetValue(src));
+ 	if (typeid == CFNumberGetTypeID()) {
+ 		if (CFNumberIsFloatType(src)) {
+ 			double d;
+ 			CFNumberGetValue(src, kCFNumberDoubleType, &d);
+ 			return PyFloat_FromDouble(d);
+ 		} else {
+ 			long l;
+ 			if (!CFNumberGetValue(src, kCFNumberLongType, &l))
+ 				/* XXXX Out of range! */;
+ 			return PyInt_FromLong(l);
+ 		}
+ 	}
+ 	/* XXXX Should return as CFTypeRef, really... */
  	PyMac_Error(resNotFound);
  	return NULL;
***************
*** 124,128 ****
  	if( data == NULL ) return PyErr_NoMemory();
  	CFStringGetCharacters(src, range, data);
! 	rv = (PyObject *)PyUnicode_FromUnicode(data, size);
  	free(data);
  	return rv;
--- 145,149 ----
  	if( data == NULL ) return PyErr_NoMemory();
  	CFStringGetCharacters(src, range, data);
! 	rv = (PyObject *)PyUnicode_FromUnicode(data, size-1);
  	free(data);
  	return rv;
***************
*** 198,206 ****
  		item_py = PySequence_GetItem(aslist, i);
  		if (item_py == NULL) goto err;
! 		if (!PyArg_ParseTuple(item_py, "OO", key_py, value_py)) goto err;
  		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);
  		CFRelease(key_cf);
--- 219,225 ----
  		item_py = PySequence_GetItem(aslist, i);
  		if (item_py == NULL) 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(value_py, &value_cf) ) goto err;
  		CFDictionaryAddValue(rv, key_cf, value_cf);
  		CFRelease(key_cf);
***************
*** 213,218 ****
  err:
  	Py_XDECREF(item_py);
- 	Py_XDECREF(key_py);
- 	Py_XDECREF(value_py);
  	Py_XDECREF(aslist);
  	if (rv) CFRelease(rv);
--- 232,235 ----
***************
*** 231,234 ****
--- 248,269 ----
  	if (PyString_Check(src) || PyUnicode_Check(src)) 
  		return PyCF_Python2CF_string(src, (CFStringRef *)dst);
+ 	if (PyBool_Check(src)) {
+ 		if (src == Py_True)
+ 			*dst = kCFBooleanTrue;
+ 		else
+ 			*dst = kCFBooleanFalse;
+ 		return 1;
+ 	}
+ 	if (PyInt_Check(src)) {
+ 		long v = PyInt_AsLong(src);
+ 		*dst = CFNumberCreate(NULL, kCFNumberLongType, &v);
+ 		return 1;
+ 	}
+ 	if (PyFloat_Check(src)) {
+ 		double d = PyFloat_AsDouble(src);
+ 		*dst = CFNumberCreate(NULL, kCFNumberDoubleType, &d);
+ 		return 1;
+ 	}
+ 			
  	PyErr_Format(PyExc_TypeError,
  		  "Cannot convert %.500s objects to CF",