From 2a73209f103f0e348416be95fa557426b921831e Mon Sep 17 00:00:00 2001 From: Jakub Stachowski Date: Mon, 29 Aug 2005 19:48:39 +0000 Subject: 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 --- avahi-qt/qt-watch.cpp | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++ avahi-qt/qt-watch.h | 40 +++++++++++ 2 files changed, 220 insertions(+) create mode 100644 avahi-qt/qt-watch.cpp create mode 100644 avahi-qt/qt-watch.h 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 +#ifdef QT4 +#include +#include +#include +#else +#include +#include +#include +#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 + +#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 -- cgit