ObserverWrap.cxx

Go to the documentation of this file.
00001 
00012 #ifdef HAVE_CONFIG_H
00013 // for old python
00014 #include "config.h"
00015 #endif
00016 
00017 // include first to avoid _POSIX_C_SOURCE warning.
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   } // namespace Python
00053 } // namespace hippodraw
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 // me
00083 {
00084       // Use secret interface to get the Python object
00085       // that owns *this.  I guess I will have to make that
00086       // interface public. -- Dave Abrahams
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 }

Generated for HippoDraw Class Library by doxygen