[PyKDE] sip and const void * typedefs.
    Jon 
    jon at totient.co.uk
       
    Sun Mar 12 00:55:20 GMT 2006
    
    
  
Hi
I've been using sip (successfully) with library which defines things like
typedef const void * InstanceHandle;
typedef const void * SessionHandle;
and then has functions like
	InstanceHandle getInstance(bool);
	SessionHandle createSession(InstanceHandle,int,int);
I constructed a sip file with those definitions but found that the
The problem I found was that the generated code would not compile with an 
error
	error: invalid conversion from 'const void*' to 'void*'
and this is because of the sipConvertFromVoidPtr in the generated code:-
static PyObject *func_getInstance(PyObject *,PyObject *sipArgs)
{
        int sipArgsParsed = 0;
        {
                bool a0 = 0;
                if (sipParseArgs(&sipArgsParsed,sipArgs,"|b",&a0))
                {
                        const void *sipRes;
                        sipRes = getInstance(a0);
                        return sipConvertFromVoidPtr(sipRes);
                }
        }
        /* Raise an exception if the arguments couldn't be parsed. */
        sipNoFunction(sipArgsParsed,sipNm_TestMod_getInstance);
        return NULL;
}
I fixed this problem by defining MappedTypes based on the examples in the doc 
for the InstanceHandle etc and removing the typedef const void * 
InstanceHandle in the sip file;
%MappedType InstanceHandle
{
%TypeHeaderCode
#include <someApi.h>
%End
%ConvertToTypeCode
	// from python
if (sipIsErr == NULL)
        return PyInt_Check(sipPy);
  
if (sipPy == Py_None)
{
        *sipCppPtr = 0;
	return 0;
}
InstanceHandle * handle = new InstanceHandle;
PyErr_Clear();
*handle = (InstanceHandle)PyInt_AsLong(sipPy);
if (PyErr_Occurred() != NULL){
	delete handle;
	*sipIsErr =1;
	return 0;
}
*sipCppPtr = handle;
return 1;
%End	
%ConvertFromTypeCode
if (!sipCpp)
	return NULL;
PyErr_Clear();
PyObject* l = PyInt_FromLong((long)*sipCpp);
if (PyErr_Occurred() != NULL){
	Py_DECREF(l);
	return 0;
}
return l;
%End
};
This is with sip 4.2.1 (4.2.1-297) as packaged by Mandriva
My main question is, is there an easier way to do this?
Had the library I am wrapping used instead unsigned int for the these Handle 
typedefs, then as far I as can tell I would not have had to do anything other 
than
typedef unsigned int InstanceHandle;
typedef unsigned int SessionHandle;
InstanceHandle getInstance(bool);
SessionHandle createSession(InstanceHandle,int,int);
and the generated code would work and no MappedType is needed.
Obviously if I could change the library API I would, but it's not mine........
I actually have most of the API working but thought I'd check on this minor 
niggle.
Thanks
Jon
    
    
More information about the PyQt
mailing list