00001
00012 #ifdef HAVE_CONFIG_H
00013
00014 #include "config.h"
00015 #endif
00016
00017
00018 #include <boost/python.hpp>
00019
00020 #include "ObserverWrap.h"
00021
00022 #include "pattern/Observable.h"
00023
00024 #include <iostream>
00025
00026 using std::string;
00027
00028 using namespace boost::python;
00029
00030
00031 namespace hippodraw {
00032 namespace Python {
00033 void
00034 export_Observer ()
00035 {
00036 class_ < ObserverWrap,
00037 std::auto_ptr<ObserverWrap>,
00038 boost::noncopyable >
00039 ( "Observer",
00040 "The base class for classes that can be targets of Observable\n"
00041 "update messages.",
00042 no_init )
00043 ;
00044
00045 class_ < Observable >
00046 ( "Observable",
00047 "The base class for classes that can be target of an Observer\n"
00048 "object.",
00049 init <> () )
00050 ;
00051 }
00052 }
00053 }
00054
00055 using namespace hippodraw;
00056
00059 ObserverWrap::
00060 ObserverWrap ( PyObject * self )
00061 : hippodraw::Observer (),
00062 m_self ( self )
00063 {
00064 }
00065
00066 ObserverWrap::
00067 ObserverWrap ( )
00068 : hippodraw::Observer (),
00069 m_self ( 0 )
00070 {
00071 }
00072 ObserverWrap::
00073 ObserverWrap ( const Observer & ow )
00074 : hippodraw::Observer ( ow ),
00075 m_self ( 0 )
00076 {
00077 }
00078
00079 template <class T>
00080 object
00081 ObserverWrap::
00082 get_owner(T* ) const
00083 {
00084
00085
00086
00087 return
00088 object ( handle<> ( borrowed ( detail::wrapper_base_::get_owner(*this))));
00089 }
00090
00093 void
00094 ObserverWrap::
00095 update ( const Observable * obs )
00096 {
00097 #ifndef HAVE_OLD_PYTHON
00098 PyGILState_STATE state = PyGILState_Ensure ();
00099
00100 try {
00101 object self = get_owner ( this );
00102 call_method < void, const Observable * > ( self.ptr(), "update", obs );
00103 } catch ( error_already_set & ) {
00104 std::cout << "ObserverWrap::update: caught error_already_set"
00105 << std::endl;
00106 PyErr_Print();
00107 handle_exception();
00108 }
00109
00110 PyGILState_Release ( state );
00111 #endif
00112 }