/* * Qt support for MICO * Copyright (C) 1997 Lars Doelle * * Rewritten by Karel Gardas, * Copyright (C) 2002 ObjectSecurity Ltd. * * This library 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 library 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 library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Send comments and/or bug reports to: * mico@informatik.uni-frankfurt.de */ #define MICO_CONF_IMR #include #include #include #include using namespace std; // // CApp // CApp::CApp(int argc, char *argv[]) : QApplication (argc,argv) { qtd_ = new QTDispatcher (this); connect(this, SIGNAL(aboutToQuit()), this, SLOT(shutdown())); connect(this, SIGNAL(lastWindowClosed()), this, SLOT(shutdown())); finished_ = FALSE; } // // FileEvent // FileEvent::~FileEvent() { delete xid_; } FileEvent::FileEvent() { } FileEvent::FileEvent (QTDispatcher* disp, CORBA::DispatcherCallback* cb, int fd, QSocketNotifier::Type evq, CORBA::Dispatcher::Event evc) : disp_(disp), xid_(new QSocketNotifier(fd, evq)), cb_(cb), ev_(evc) { QObject::connect(xid_, SIGNAL (activated(int)), this, SLOT (activated(int))); } void FileEvent::activated(int /*fd*/) { cb_->callback(disp_, ev_); } // // TimerEvent // TimerEvent::~TimerEvent() { delete xid_; } TimerEvent::TimerEvent() { } TimerEvent::TimerEvent (QTDispatcher* disp, CORBA::DispatcherCallback* cb, long tmout) : xid_(new QTimer()), cb_(cb), disp_(disp) { QObject::connect(xid_, SIGNAL (timeout()), this, SLOT (timeout())); xid_->start(tmout, TRUE); } void TimerEvent::timeout() { disp_->remove(this); cb_->callback(disp_, CORBA::Dispatcher::Timer); delete this; } // // create & destroy // QTDispatcher::QTDispatcher(CApp* ctx) : ctx_(ctx) { } QTDispatcher::~QTDispatcher() { list::iterator i; for (i = fevents_.begin(); i != fevents_.end(); ++i) { (*i)->cb_->callback(this, Remove); delete *i; } list::iterator j; for (j = tevents_.begin(); j != tevents_.end(); ++j) { (*j)->cb_->callback(this, Remove); delete *j; } } // // adding events // void QTDispatcher::rd_event(CORBA::DispatcherCallback* cb, CORBA::Long fd) { fevents_.push_back(new FileEvent(this, cb, fd, QSocketNotifier::Read, CORBA::Dispatcher::Read)); } void QTDispatcher::wr_event(CORBA::DispatcherCallback* cb, CORBA::Long fd) { fevents_.push_back(new FileEvent(this, cb, fd, QSocketNotifier::Write, CORBA::Dispatcher::Write)); } void QTDispatcher::ex_event(CORBA::DispatcherCallback* cb, CORBA::Long fd) { fevents_.push_back(new FileEvent(this, cb, fd, QSocketNotifier::Exception, CORBA::Dispatcher::Except)); } void QTDispatcher::tm_event(CORBA::DispatcherCallback* cb, CORBA::ULong tmout) { // both Qt and MICO timeouts are millisecs tevents_.push_back(new TimerEvent(this, cb, tmout)); } void QTDispatcher::remove(CORBA::DispatcherCallback* cb, CORBA::Dispatcher::Event e) { if (e == All || e == Timer) { list::iterator i, next; for (i = tevents_.begin(); i != tevents_.end(); i = next) { next = i; ++next; if ((*i)->cb_ == cb) { delete *i; tevents_.erase (i); } } } if (e == All || e == Read || e == Write || e == Except) { list::iterator i, next; for (i = fevents_.begin(); i != fevents_.end(); i = next) { next = i; ++next; if ((*i)->cb_ == cb && (e == All || e == (*i)->ev_)) { delete *i; fevents_.erase(i); } } } } void QTDispatcher::remove(TimerEvent *t) { list::iterator i = find(tevents_.begin(), tevents_.end(), t); assert(i != tevents_.end()); tevents_.erase(i); } // // misc // void QTDispatcher::run(CORBA::Boolean infinite) { do { ctx_->processOneEvent(); } while (infinite); } void QTDispatcher::move(CORBA::Dispatcher*) { assert (0); } CORBA::Boolean QTDispatcher::idle() const { return fevents_.size() + tevents_.size() == 0; } #include "qtmico.moc"