#ifndef _HAVE_OSCMETHOD_H
#define _HAVE_OSCMETHOD_H

#include <osc/OscPacketListener.h>

#include <QtCore/QMetaObject>
#include <QtCore/QByteArray>
#include <QtCore/QObject>
#include <QtNetwork/QHostAddress>
#include <osc/OscTypes.h>
#include <QStringList>


class OscMessage {

    public:
        OscMessage();
        OscMessage(const OscMessage&);
        ~OscMessage();

        void setMessage(const osc::ReceivedMessage* m) { _message = m; }
        void setSender(const QHostAddress* s, int p) {_sender = s; _port = p;}

        const osc::ReceivedMessage* message() const { return _message; }
        const QHostAddress* senderAddress() const { return _sender; }
        int senderPort() const { return _port; }

    private:
        const osc::ReceivedMessage* _message;
        const QHostAddress* _sender;
        int _port;
};


class AbstractOscMethod : public QObject {
    Q_OBJECT
    public:
    AbstractOscMethod(QObject* p=0) : QObject(0) {}
    ~AbstractOscMethod() {}
   
    public slots:
    virtual void handleMessage(const OscMessage*) = 0;
};


/**
 * Hooks the Osc routing into the signal/slot-mechanism of Qt.
 *
 *
 */
class OscMethod : public AbstractOscMethod {
    Q_OBJECT

    public:
        OscMethod(QObject* parent=0);
        ~OscMethod();

        void accept(const QString& typetags);

    public slots:
        virtual void handleMessage(const OscMessage*);

    signals:
        void messageReceived(const OscMessage*);        
       
    private:
        QStringList* types;

};

#endif //_HAVE_OSCMETHOD_H