ソースを参照

Add source from 2.3.9 snapshot to merge with 2.3.7 code for OpenPKG 1.2.

Michael Schloh von Bennewitz 23 年 前
コミット
985a019f87
1 ファイル変更214 行追加0 行削除
  1. 214 0
      mico/qtmico.cc

+ 214 - 0
mico/qtmico.cc

@@ -0,0 +1,214 @@
+/*
+ *  Qt support for MICO
+ *  Copyright (C) 1997 Lars Doelle
+ *
+ *  Rewritten by Karel Gardas, <kgardas@objectsecurity.com>
+ *  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 <CORBA-SMALL.h>
+#include <mico/template_impl.h>
+#include <mico/qtmico.h>
+#include <algorithm>
+
+//
+// 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<FileEvent*>::iterator i;
+    for (i = fevents_.begin(); i != fevents_.end(); ++i) {
+	(*i)->cb_->callback(this, Remove);
+	delete *i;
+    }
+
+    list<TimerEvent*>::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<TimerEvent*>::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<FileEvent*>::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<TimerEvent*>::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"
+