1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
/* ==================================================================== */
/* Support function for progress callbacks to python. */
/* ==================================================================== */
%{
typedef struct {
PyObject *psPyCallback;
PyObject *psPyCallbackData;
int nLastReported;
} PyProgressData;
/************************************************************************/
/* PyProgressProxy() */
/************************************************************************/
int CPL_STDCALL
PyProgressProxy( double dfComplete, const char *pszMessage, void *pData )
{
PyProgressData *psInfo = (PyProgressData *) pData;
PyObject *psArgs, *psResult;
int bContinue = TRUE;
if( psInfo->nLastReported == (int) (100.0 * dfComplete) )
return TRUE;
if( psInfo->psPyCallback == NULL || psInfo->psPyCallback == Py_None )
return TRUE;
psInfo->nLastReported = (int) (100.0 * dfComplete);
if( pszMessage == NULL )
pszMessage = "";
if( psInfo->psPyCallbackData == NULL )
psArgs = Py_BuildValue("(dsO)", dfComplete, pszMessage, Py_None );
else
psArgs = Py_BuildValue("(dsO)", dfComplete, pszMessage,
psInfo->psPyCallbackData );
psResult = PyEval_CallObject( psInfo->psPyCallback, psArgs);
Py_XDECREF(psArgs);
if( psResult == NULL )
{
return TRUE;
}
if( psResult == Py_None )
{
Py_XDECREF(Py_None);
return TRUE;
}
if( !PyArg_Parse( psResult, "i", &bContinue ) )
{
PyErr_SetString(PyExc_ValueError, "bad progress return value");
return FALSE;
}
Py_XDECREF(psResult);
return bContinue;
}
%}
|