You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
5.6 KiB
203 lines
5.6 KiB
/***************************************************************************
|
|
* Copyright (C) 2003 by Julian Rockey (linux@jrockey.com) *
|
|
* Original code by Torben Weis *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
***************************************************************************/
|
|
|
|
#ifndef __pcop_h__
|
|
#define __pcop_h__
|
|
|
|
#include <Python.h>
|
|
|
|
#include <tqcstring.h>
|
|
#include <tqlist.h>
|
|
#include <tqasciidict.h>
|
|
|
|
#include <dcopclient.h>
|
|
#include <dcopobject.h>
|
|
|
|
class TQDataStream;
|
|
|
|
namespace PythonDCOP {
|
|
class Client;
|
|
class PCOPMethod;
|
|
class ImportedModules;
|
|
|
|
// Python interface
|
|
PyObject *dcop_call( PyObject* self, PyObject* args );
|
|
PyObject *application_list( PyObject *self, PyObject *args );
|
|
PyObject *object_list(PyObject *self, PyObject *args );
|
|
PyObject *method_list(PyObject *self, PyObject *args );
|
|
PyObject *register_as( PyObject *self, PyObject *args);
|
|
PyObject *create_dcop_object( PyObject *self, PyObject *args);
|
|
PyObject *set_method_list( PyObject *self, PyObject *args);
|
|
PyObject *connect_DCOP_Signal( PyObject *self, PyObject *args);
|
|
PyObject *disconnect_DCOP_Signal( PyObject *self, PyObject *args);
|
|
|
|
|
|
// helpers...
|
|
void delete_dcop_object(void *vp);
|
|
PyObject *make_py_list(const QCStringList &qt_list);
|
|
|
|
/**
|
|
* Used by the Python interface to talk to DCOP
|
|
*/
|
|
class Client {
|
|
public:
|
|
Client();
|
|
~Client();
|
|
void processEvents();
|
|
DCOPClient *dcop();
|
|
// ImportedModules *module() const { return m_module; }
|
|
static Client *instance();
|
|
protected:
|
|
DCOPClient *m_dcop;
|
|
// ImportedModules *m_module;
|
|
static Client *s_instance;
|
|
TQApplication *m_qapp;
|
|
};
|
|
|
|
/**
|
|
* Class representing a DCOPObject.
|
|
* This class represents a DCOP object in a "server" capacity.
|
|
*/
|
|
class PCOPObject : public DCOPObject
|
|
{
|
|
public:
|
|
/**
|
|
* Construct from a pointer to the Python object holding this CObject.
|
|
*/
|
|
PCOPObject(PyObject *py_obj);
|
|
|
|
/**
|
|
* Construct from a pointer to the Python object holding this CObject and
|
|
* a DCOP object ID.
|
|
*/
|
|
PCOPObject(PyObject *py_obj, const char *objid);
|
|
|
|
virtual ~PCOPObject();
|
|
|
|
/**
|
|
* Process method fun, whose arguments are marshalled in data.
|
|
* Set replyType to be the reply type and marshall the reply data into replyData.
|
|
*/
|
|
virtual bool process(const TQCString &fun, const TQByteArray &data, TQCString& replyType, TQByteArray &replyData);
|
|
|
|
/**
|
|
* Return list of supported functions (methods).
|
|
*/
|
|
virtual QCStringList functions();
|
|
|
|
/**
|
|
* Set the list of methods that this object handles.
|
|
* The key of the QT dictionary is the method signature; the data in
|
|
* the dictionary is a pointer to the python method to which it corresponds.
|
|
*/
|
|
virtual bool setMethodList(TQAsciiDict<PyObject> meth_list);
|
|
|
|
/**
|
|
* Returns the current list of methods, as set by setMethodList.
|
|
*/
|
|
virtual PyObject *methodList();
|
|
|
|
/**
|
|
* Matches an 'incoming' method signature (fun) and returns a PCOPMethod pointer,
|
|
* or NULL if none match.
|
|
*/
|
|
PCOPMethod *matchMethod(const TQCString &fun);
|
|
|
|
private:
|
|
virtual bool py_process(const TQCString &fun, const TQByteArray &data, TQCString& replyType, TQByteArray &replyData);
|
|
|
|
/**
|
|
* The Python object holding this CObject.
|
|
*/
|
|
PyObject *m_py_obj;
|
|
|
|
/**
|
|
* The list of methods this object supports.
|
|
*/
|
|
TQAsciiDict<PCOPMethod> m_methods;
|
|
|
|
};
|
|
|
|
/**
|
|
* Class representing a data type, with methods for DCOP marshalling and unmarshalling.
|
|
*/
|
|
class PCOPType
|
|
{
|
|
public:
|
|
PCOPType( const TQCString& dcop_representation);
|
|
~PCOPType();
|
|
|
|
TQCString signature() const;
|
|
|
|
PyObject* demarshal( TQDataStream& str ) const;
|
|
bool marshal( PyObject* obj, TQDataStream& str ) const;
|
|
|
|
// checks if the given PyObject can be marshalled as this PCOPType
|
|
bool isMarshallable( PyObject *obj ) const;
|
|
|
|
const TQCString &type() const { return m_type; }
|
|
const PCOPType *leftType() const { return m_leftType; }
|
|
const PCOPType *rightType() const { return m_rightType; }
|
|
|
|
// TODO: make these private
|
|
TQCString m_type;
|
|
PCOPType* m_leftType;
|
|
PCOPType* m_rightType;
|
|
|
|
};
|
|
|
|
/**
|
|
* Class representing a DCOP method
|
|
*/
|
|
class PCOPMethod
|
|
{
|
|
public:
|
|
PCOPMethod( const TQCString& dcop_signature );
|
|
~PCOPMethod();
|
|
|
|
int paramCount() const;
|
|
// TQCString signature() const;
|
|
// TQCString name() const;
|
|
PCOPType* param( int );
|
|
const PCOPType* param( int ) const;
|
|
|
|
bool setPythonMethod(PyObject *py_method);
|
|
PyObject *pythonMethod() const { return m_py_method; }
|
|
const TQCString &signature() const { return m_signature; }
|
|
const TQCString &name() const { return m_name; }
|
|
const PCOPType *type() const { return m_type; }
|
|
|
|
TQCString m_signature;
|
|
TQCString m_name;
|
|
PCOPType* m_type;
|
|
TQList<PCOPType> m_params;
|
|
private:
|
|
PyObject *m_py_method;
|
|
};
|
|
|
|
/**
|
|
* Class representing a DCOP class.
|
|
*/
|
|
class PCOPClass
|
|
{
|
|
public:
|
|
PCOPClass( const QCStringList& dcop_style_methods);
|
|
~PCOPClass();
|
|
|
|
const PCOPMethod* method( const TQCString &name, PyObject *argTuple = 0 );
|
|
|
|
QCStringList m_ifaces;
|
|
TQAsciiDict<PCOPMethod> m_methods;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|