view engine/swigwrappers/python/fife.i.templ @ 164:5b04a7d3ded6

typo fix some missing event (de)registrations ability to capture one event multiple times (instead of only having one slot, we have groups and each group has an own slot, the default group is "default" so we are backward compatible
author spq@33b003aa-7bff-0310-803a-e67f0ece8222
date Wed, 15 Oct 2008 14:57:04 +0000
parents 98541d3b9220
children 10a5f9e6c03f
line wrap: on
line source

%module(directors="1") fife
%include "std_string.i"
%include "std_vector.i"
%include "std_pair.i"
%include "std_list.i"
%include "std_map.i"
%include "std_set.i"
%include "typemaps.i"
%include "exception.i"

/**
 * Some materials to understand exception handling:
 *
 * Basics about python exceptions:
 * 	http://docs.python.org/tut/node10.html
 * Python exception handling in C APIs
 * 	http://docs.python.org/api/exceptions.html
 * 	http://docs.python.org/api/exceptionHandling.html
 * SWIG exception handling
 * 	http://www.swig.org/Doc1.3/Customization.html#exception 
 * 	http://www.swig.org/Doc1.3/SWIGPlus.html#SWIGPlus_exception_specifications
 * 	http://www.swig.org/Doc1.3/Python.html#Python_nn36
 */

%feature("autodoc", "1");  // 0 == no param types, 1 == show param types

namespace std {
	%template(StringVector) vector<std::string>;
	%template(UintVector) vector<unsigned int>;
	%template(IntVector) vector<int>;
	%template(FloatVector) vector<float>;
	%template(DoubleVector) vector<double>;
	%template(BoolVector) vector<bool>;

	%template(UintUintPair) pair<unsigned int, unsigned int>;
	%template(UintUintPairVector) vector<std::pair<unsigned int, unsigned int> >;
};

%{
#include "util/base/exception.h"
static void handleDirectorException() {
	PyObject* exception = NULL;
	PyObject* value = NULL;
	PyObject* traceback = NULL;
	PyErr_Fetch(&exception, &value, &traceback);
	PyErr_NormalizeException(&exception, &value, &traceback);
	if (exception) {
		PySys_SetObject("last_type", exception);
		PySys_SetObject("last_value", value);
		PySys_SetObject("last_traceback", traceback);	
		
		PyObject* d = PyModule_GetDict (PyImport_AddModule ("__main__"));
		PyDict_SetItemString(d, "exc_type", exception);
		PyDict_SetItemString(d, "exc_value", value);
		PyDict_SetItemString(d, "exc_traceback", traceback ? traceback : Py_None);
		
		char buf[1024];
		sprintf (buf, "\n\
import traceback\n\
s = \"\"\n\
for filename, line, function, text in traceback.extract_tb(exc_traceback):\n\
	s = s + ' File \"%%s\", line %%d, in %%s\\n    %%s' %% (filename, line, function, text)\n\
	if s[-1] != '\\n': s = s + '\\n'\n\
for l in traceback.format_exception_only(exc_type, exc_value):\n\
	s = s + ' ' + l\n\
	if s[-1] != '\\n': s = s + '\\n'\n\
print s\n\
");
		PyObject* e = PyRun_String(buf, Py_file_input, d, d);
		if (!e) {
			PyErr_Print();
		}
		Py_XDECREF(e);
		Py_XDECREF(d);
		Py_XDECREF(exception);
		Py_XDECREF(value);
		Py_XDECREF(traceback);
	}
}

#define _FIFE_EXC_HANDLER(_fife_exc_type, _converted_type) \
	catch (FIFE::_fife_exc_type& _e) { \
		PyErr_Clear(); \
		SWIG_exception(_converted_type, _e.getMessage().c_str()); \
	}

#define _FIFE_DIRECTOR_EXC_HANDLER() \
	catch (Swig::DirectorException &_e) { \
		PyErr_Clear(); \
		SWIG_exception(SWIG_RuntimeError, "Catched director exception"); \
	}
%}

%feature("director:except") {
	if ($$error != NULL) {
		handleDirectorException();
		throw Swig::DirectorMethodException();
	}
}

%exception {
	try {
		$$action
	}
	_FIFE_DIRECTOR_EXC_HANDLER()
	_FIFE_EXC_HANDLER(Exception, SWIG_RuntimeError)
}

$inclusions

%include engine/swigwrappers/python/extensions.i.templ