/*************************************************************************** * pythonobject.cpp * This file is part of the KDE project * copyright (C)2004-2005 by Sebastian Sauer (mail@dipe.org) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. ***************************************************************************/ #include "pythonobject.h" #include "pythonextension.h" using namespace Kross::Python; PythonObject::PythonObject(const Py::Object& object) : Kross::Api::Object() , m_pyobject(object) { krossdebug( TQString("PythonObject::PythonObject() constructor") ); Py::List x( object.dir() ); for(Py::Sequence::iterator i= x.begin(); i != x.end(); ++i) { std::string s = (*i).str(); if(s == "__init__") continue; //if(! m_pyobject.hasAttr( (*i).str() )) continue; Py::Object o = m_pyobject.getAttr(s); TQString t; if(o.isCallable()) t += "isCallable "; if(o.isDict()) t += "isDict "; if(o.isList()) t += "isList "; if(o.isMapping()) t += "isMapping "; if(o.isNumeric()) t += "isNumeric "; if(o.isSequence()) t += "isSequence "; if(o.isTrue()) t += "isTrue "; if(o.isInstance()) t += "isInstance "; krossdebug( TQString("PythonObject::PythonObject() method '%1' (%2)").arg( (*i).str().as_string().c_str() ).arg(t) ); if(o.isCallable()) m_calls.append( (*i).str().as_string().c_str() ); } } PythonObject::~PythonObject() { } const TQString PythonObject::getClassName() const { return "Kross::Python::PythonObject"; } Kross::Api::Object::Ptr PythonObject::call(const TQString& name, Kross::Api::List::Ptr arguments) { krossdebug( TQString("PythonObject::call(%1)").arg(name) ); if(m_pyobject.isInstance()) { //if(! m_calls.contains(n)) throw ... PyObject* r = PyObject_CallMethod(m_pyobject.ptr(), (char*) name.latin1(), 0); if(! r) { //FIXME happens too if e.g. number of arguments doesn't match !!! Py::Object errobj = Py::value(Py::Exception()); // get last error throw Kross::Api::Exception::Ptr( new Kross::Api::Exception(TQString("Failed to call method '%1': %2").arg(name).arg(errobj.as_string().c_str())) ); } Py::Object result(r, true); //krossdebug( TQString("PythonObject::call(%1) call return value = '%2'").arg(name).arg(result.as_string().c_str()) ); return PythonExtension::toObject(result); } /*TODO??? ELSE create class instance for class-definitions??? Kross::Api::ClassBase* clazz = new Kross::Api::ClassBase("", this); return new PythonExtension(clazz); */ return Kross::Api::Object::call(name, arguments); } TQStringList PythonObject::getCalls() { return m_calls; }