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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
/******************************************************************************
* $Id: pymodule.i 6470 2007-08-06 03:25:14Z hobu $
*
* Project: MapServer
* Purpose: Python-specific enhancements to MapScript
* Author: Sean Gillies, sgillies@frii.com
*
******************************************************************************
*
* Python-specific mapscript code has been moved into this
* SWIG interface file to improve the readibility of the main
* interface file. The main mapscript.i file includes this
* file when SWIGPYTHON is defined (via 'swig -python ...').
*
*****************************************************************************/
/******************************************************************************
* Simple Typemaps
*****************************************************************************/
/* Translates Python None to C NULL for strings */
%typemap(in,parse="z") char * "";
/* Translate Python's built-in file object to FILE * */
%typemap(in) FILE * {
if (!PyFile_Check($input)) {
PyErr_SetString(PyExc_TypeError, "Input is not file");
return NULL;
}
$1 = PyFile_AsFile($input);
}
/* To support imageObj::getBytes */
%typemap(out) gdBuffer {
$result = PyString_FromStringAndSize((const char*)$1.data, $1.size);
if( $1.owns_data )
gdFree($1.data);
}
/**************************************************************************
* MapServer Errors and Python Exceptions
**************************************************************************
*
* Translation of errors reported via the ms_error structure into
* Python exceptions. Original code by Chris Chamberlin <cdc@aracnet.com>
* has been updated by Sean Gillies <sgillies@frii.com> to use
* PyErr_SetString, %exception and $action for SWIG 1.3, do the most
* obvious mapping of MapServer errors to Python exceptions and map all
* others to a new 'MapServerError' exception which can be caught like this:
*
* from mapscript import *
* empty_map = mapObj('')
* try:
* img = empty_map.draw()
* except MapServerError, msg:
* print "Caught MapServerError:", msg
*
*************************************************************************/
%{
PyObject *MSExc_MapServerError;
PyObject *MSExc_MapServerChildError;
%}
/* Module initialization: call msSetup() and register msCleanup() */
%init %{
/* See bug 1203 for discussion of race condition with GD font cache */
if (msSetup() != MS_SUCCESS)
{
msSetError(MS_MISCERR, "Failed to set up threads and font cache",
"msSetup()");
}
Py_AtExit(msCleanup);
/* Define Generic MapServer error */
MSExc_MapServerError=PyErr_NewException("_mapscript.MapServerError",NULL,NULL);
if (MSExc_MapServerError != NULL)
PyDict_SetItemString(d, "MapServerError", MSExc_MapServerError);
/* Define MapServer MS_CHILD error */
MSExc_MapServerChildError = PyErr_NewException("_mapscript.MapServerChildError", NULL, NULL);
if (MSExc_MapServerChildError != NULL)
PyDict_SetItemString(d, "MapServerChildError", MSExc_MapServerChildError);
%}
%{
static void _raise_ms_exception( void );
static void _raise_ms_exception() {
int errcode;
errorObj *ms_error;
char *errmsg;
ms_error = msGetErrorObj();
errcode = ms_error->code;
errmsg = msGetErrorString("\n");
switch (errcode) {
case MS_IOERR:
PyErr_SetString(PyExc_IOError, errmsg);
break;
case MS_MEMERR:
PyErr_SetString(PyExc_MemoryError, errmsg);
break;
case MS_TYPEERR:
PyErr_SetString(PyExc_TypeError, errmsg);
break;
case MS_EOFERR:
PyErr_SetString(PyExc_EOFError, errmsg);
break;
case MS_CHILDERR:
PyErr_SetString(MSExc_MapServerChildError, errmsg);
break;
default:
PyErr_SetString(MSExc_MapServerError, errmsg);
break;
}
free(errmsg);
}
%}
%exception {
$action {
errorObj *ms_error = msGetErrorObj();
switch(ms_error->code) {
case MS_NOERR:
break;
case MS_NOTFOUND:
msResetErrorList();
break;
case -1:
break;
case MS_IOERR:
if (strcmp(ms_error->routine, "msSearchDiskTree()") != 0) {
_raise_ms_exception();
msResetErrorList();
return NULL;
}
default:
_raise_ms_exception();
msResetErrorList();
return NULL;
}
}
}
%pythoncode %{
MapServerError = _mapscript.MapServerError
MapServerChildError = _mapscript.MapServerChildError
%}
|