diff options
| author | Jakub Stachowski <qbast@go2.pl> | 2005-08-29 19:48:39 +0000 | 
|---|---|---|
| committer | Jakub Stachowski <qbast@go2.pl> | 2005-08-29 19:48:39 +0000 | 
| commit | 2a73209f103f0e348416be95fa557426b921831e (patch) | |
| tree | 8701653c9159dc455cfc5c44c2e20e81fa2268d7 | |
| parent | 8ae3b21733c5fc8ae74a413cb7707eff66120c4f (diff) | |
Source of Qt mainloop adapter. Build system stuff will follow
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@493 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
| -rw-r--r-- | avahi-qt/qt-watch.cpp | 180 | ||||
| -rw-r--r-- | avahi-qt/qt-watch.h | 40 | 
2 files changed, 220 insertions, 0 deletions
| diff --git a/avahi-qt/qt-watch.cpp b/avahi-qt/qt-watch.cpp new file mode 100644 index 0000000..fe8f2c3 --- /dev/null +++ b/avahi-qt/qt-watch.cpp @@ -0,0 +1,180 @@ +/*** +  This file is part of avahi. +  +  avahi is free software; you can redistribute it and/or modify it +  under the terms of the GNU Lesser General Public License as +  published by the Free Software Foundation; either version 2.1 of the +  License, or (at your option) any later version. +  +  avahi 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 Lesser General +  Public License for more details. +  +  You should have received a copy of the GNU Lesser General Public +  License along with avahi; if not, write to the Free Software +  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +  USA. +***/ + +#include <sys/time.h> +#ifdef QT4 +#include <Qt/qsocketnotifier.h> +#include <Qt/qobject.h> +#include <Qt/qtimer.h> +#else +#include <qsocketnotifier.h> +#include <qobject.h> +#include <qtimer.h> +#endif +#include "qt-watch.h" + +class AvahiWatch : public QObject  +{ +    Q_OBJECT +public: +    AvahiWatch(int fd, AvahiWatchEvent event, AvahiWatchCallback callback, void* userdata); +    ~AvahiWatch() {} +    AvahiWatchEvent getEvents() const { return m_lastEvent; } +    void setWatchedEvents(AvahiWatchEvent event); + +private slots: +    void gotIn(); +    void gotOut(); + +private: +    QSocketNotifier* m_in; +    QSocketNotifier* m_out; +    //FIXME: ERR and HUP? +    AvahiWatchCallback m_callback; +    AvahiWatchEvent m_lastEvent; +    int m_fd; +    void* m_userdata; +}; + +class AvahiTimeout : public QObject  +{ +    Q_OBJECT +     +public: +    AvahiTimeout(const struct timeval* tv, AvahiTimeoutCallback callback, void* userdata); +    ~AvahiTimeout() {} +    void update(const struct timeval* tv); +     +private slots: +    void timeout(); +     +private: +    QTimer m_timer; +    AvahiTimeoutCallback m_callback; +    void* m_userdata; +}; + + + +AvahiWatch::AvahiWatch(int fd, AvahiWatchEvent event, AvahiWatchCallback callback, void* userdata) :  +    m_in(0), m_out(0),  m_callback(callback), m_fd(fd), m_userdata(userdata) +{ +    setWatchedEvents(event); +} + +void AvahiWatch::gotIn() +{ +    m_lastEvent = AVAHI_WATCH_IN; +    m_callback(this,m_fd,m_lastEvent,m_userdata); +} + +void AvahiWatch::gotOut() +{ +    m_lastEvent = AVAHI_WATCH_IN; +    m_callback(this,m_fd,m_lastEvent,m_userdata); +} + +void AvahiWatch::setWatchedEvents(AvahiWatchEvent event)  +{ +    if (!(event & AVAHI_WATCH_IN)) { delete m_in; m_in=0; } +    if (!(event & AVAHI_WATCH_OUT)) { delete m_out; m_out=0; } +    if (event & AVAHI_WATCH_IN) {  +	m_in = new QSocketNotifier(m_fd,QSocketNotifier::Read, this); +	connect(m_in,SIGNAL(activated(int)),SLOT(gotIn())); +    } +    if (event & AVAHI_WATCH_OUT) {  +	m_out = new QSocketNotifier(m_fd,QSocketNotifier::Write, this); +	connect(m_out,SIGNAL(activated(int)),SLOT(gotOut())); +    } +}     + +AvahiTimeout::AvahiTimeout(const struct timeval* tv, AvahiTimeoutCallback callback, void *userdata) :  +    m_callback(callback), m_userdata(userdata) +{ +    connect(&m_timer, SIGNAL(timeout()), this, SLOT(timeout())); +    update(tv); +} + +void AvahiTimeout::update(const struct timeval *tv) +{ +    m_timer.stop(); +    if (tv) { +        struct timeval now; +        gettimeofday(&now, 0); +        m_timer.start((tv->tv_sec-now.tv_sec)*1000+(tv->tv_usec-now.tv_usec)/1000); +    } +} + +void AvahiTimeout::timeout() +{ +    m_callback(this,m_userdata); +} + +static AvahiWatch* q_watch_new(const AvahiPoll *api, int fd, AvahiWatchEvent event, AvahiWatchCallback callback,  +    void *userdata)  +{ +    return new AvahiWatch(fd, event, callback, userdata); +} + +static void q_watch_update(AvahiWatch *w, AvahiWatchEvent events)  +{ +    w->setWatchedEvents(events); +} + +static AvahiWatchEvent q_watch_get_events(AvahiWatch *w)  +{ +    return w->getEvents(); +} +     +static void q_watch_free(AvahiWatch *w)  +{ +    delete w; +} +     +static AvahiTimeout* q_timeout_new(const AvahiPoll *api, const struct timeval *tv, AvahiTimeoutCallback callback,  +    void *userdata)  +{ +    return new AvahiTimeout(tv, callback, userdata); +} + +static void q_timeout_update(AvahiTimeout *t, const struct timeval *tv)  +{ +    t->update(tv); +} + +static void q_timeout_free(AvahiTimeout *t)  +{ +    delete t; +} + + +void create_qt_poll(AvahiPoll *api)  +{ +    api->userdata=0; +    api->watch_new = q_watch_new; +    api->watch_free = q_watch_free; +    api->watch_update = q_watch_update; +    api->watch_get_events = q_watch_get_events; +     +    api->timeout_new = q_timeout_new; +    api->timeout_free = q_timeout_free; +    api->timeout_update = q_timeout_update; +} + +#include "qt-watch.moc" diff --git a/avahi-qt/qt-watch.h b/avahi-qt/qt-watch.h new file mode 100644 index 0000000..b49b45d --- /dev/null +++ b/avahi-qt/qt-watch.h @@ -0,0 +1,40 @@ +#ifndef QAVAHI_H +#define QAVAHI_H + +/*** +  This file is part of avahi. +  +  avahi is free software; you can redistribute it and/or modify it +  under the terms of the GNU Lesser General Public License as +  published by the Free Software Foundation; either version 2.1 of the +  License, or (at your option) any later version. +  +  avahi 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 Lesser General +  Public License for more details. +  +  You should have received a copy of the GNU Lesser General Public +  License along with avahi; if not, write to the Free Software +  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +  USA. +***/ + +#include <avahi-common/watch.h> + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +AVAHI_C_DECL_BEGIN +#endif + +/** +Setup abstract poll structure for integration with Qt main loop  */ + +void create_qt_poll(AvahiPoll* poll); + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +AVAHI_C_DECL_END +#endif + + + +#endif | 
