On 10/15/2013 09:10 PM, Even Rouault wrote:
Martin,

The closest equivalent in the GDAL/OGR code base I could think of is the
possibility of defining a custom error handler from the Python bindings.

For the Perl bindings I wrote a mechanism to call a Perl function via the GDALProgressFunc mechanism, which is used quite a lot - it was a bit like dark art, but seems to work. Is similar implemented for Python?

Ari


Basically you would need to have a C API to register a C callback,
"VFKLineCallbackRegister", and you would have a Python C module that would
define such a C callback "PyVFKCallbackWrapper" (or extend the existing GDAL
Python bindings), that would be a wrapper that would take a Python callable
object as argument and call it. And you would have a C function, exposed as
Python, "RegisterVFKCallback" that would pass PyVFKCallbackWrapper to
VFKLineCallbackRegister with the Python function as a userdata.

The relevant existing code is in :

* swig/include/port.i :

/* Equivalent of PyVFKCallbackWrapper */
%{
void CPL_STDCALL PyCPLErrorHandler(CPLErr eErrClass, int err_no, const char*
pszErrorMsg)
{
     void* user_data = CPLGetErrorHandlerUserData();
     PyObject *psArgs;

     psArgs = Py_BuildValue("(iis)", eErrClass, err_no, pszErrorMsg );
     PyEval_CallObject( (PyObject*)user_data, psArgs);
     Py_XDECREF(psArgs);
}
%}

/* Equivalent of RegisterVFKCallback */
%inline %{
   CPLErr PushErrorHandler( CPLErrorHandler pfnErrorHandler = NULL, void*
user_data = NULL )
   {
[...]
         CPLPushErrorHandlerEx(pfnErrorHandler, user_data);  /* equivalent of
VFKLineCallbackRegister */
     return CE_None;
   }
%}

* swig/include/python/typemaps_python.i :

%typemap(in) ( CPLErrorHandler pfnErrorHandler = NULL, void* user_data = NULL
)
{
     /* %typemap(in) (CPLErrorHandler pfnErrorHandler = NULL, void* user_data =
NULL) */
     [...]
      if (!PyCallable_Check($input))
     {
         PyErr_SetString( PyExc_RuntimeError,
                          "Object given is not a String or a Python function"
);
         SWIG_fail;
     }
     else
     {
         Py_INCREF($input);
         $1 = PyCPLErrorHandler;
         $2 = $input;
     }
}

Best regards,

Even

Hi all,

I wonder if there is a way how to implement mechanism for
user-specified events and handlers in GDAL/OGR.

I am implementing a Python script which checks VFK file using OGR
driver [1]. This script reads VFK data and stores them in SQLite
database which is created by the OGR driver.

Beside some geometry checks the script should do some extra
user-defined checks on the original VFK file. To avoid double reading
of the file (first by the script and then by the OGR driver) I would
like to use mechanism of events and handlers. In other words, event
for reading a new line from the VFK file [2] and the handler (callback
subroutine in Python script) which would do some extra checks on the
line [3].

Any idea how it should be correctly implemented in VFK driver and the
Python script? Thanks a lot for any hits in advance!

Martin

[1] http://gdal.org/ogr/drv_vfk.html
[2]
http://trac.osgeo.org/gdal/browser/trunk/gdal/ogr/ogrsf_frmts/vfk/vfkreade
r.cpp#L125 [3]
https://github.com/landam/ogr-vfk-testing/blob/master/read-vfk-test/read-v
fk.py#L52

_______________________________________________
gdal-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to