lib
eventslot.cpp
00001 /*************************************************************************** 00002 * eventslot.cpp 00003 * This file is part of the KDE project 00004 * copyright (C)2004-2005 by Sebastian Sauer (mail@dipe.org) 00005 * 00006 * This program is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Library General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2 of the License, or (at your option) any later version. 00010 * This program is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Library General Public License for more details. 00014 * You should have received a copy of the GNU Library General Public License 00015 * along with this program; see the file COPYING. If not, write to 00016 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00017 * Boston, MA 02110-1301, USA. 00018 ***************************************************************************/ 00019 00020 #include "eventslot.h" 00021 00022 #include "variant.h" 00023 #include "qtobject.h" 00024 00025 #include <qmetaobject.h> 00026 #include <private/qucom_p.h> // for the Qt QUObject API. 00027 00028 using namespace Kross::Api; 00029 00030 EventSlot::EventSlot(const QString& name, QObject* receiver, QCString slot) 00031 : Event<EventSlot>(name) 00032 , m_receiver(receiver) 00033 , m_slot(slot) //QObject::normalizeSignalSlot(slot) 00034 { 00035 } 00036 00037 EventSlot::~EventSlot() 00038 { 00039 } 00040 00041 const QString EventSlot::getClassName() const 00042 { 00043 return "Kross::Api::EventSlot"; 00044 } 00045 00046 Object::Ptr EventSlot::call(const QString& /*name*/, List::Ptr arguments) 00047 { 00048 #ifdef KROSS_API_EVENTSLOT_CALL_DEBUG 00049 krossdebug( QString("EventSlot::call() m_slot=%1 arguments=%2").arg(m_slot).arg(arguments->toString()) ); 00050 #endif 00051 00052 QString n = m_slot; //TODO name; //Variant::toString(args->item(0)); 00053 00054 if(n.startsWith("1")) // Remove prefix of SLOT-macros 00055 n.remove(0,1); 00056 00057 int slotid = m_receiver->metaObject()->findSlot(n.latin1(), false); 00058 if(slotid < 0) 00059 throw Exception::Ptr( new Exception(QString("No such slot '%1'.").arg(n)) ); 00060 00061 QUObject* uo = QtObject::toQUObject(n, arguments); 00062 m_receiver->qt_invoke(slotid, uo); // invoke the slot 00063 delete [] uo; 00064 00065 return new Variant( QVariant(true,0) ); 00066 } 00067 00068 /* 00069 QCString EventSlot::getSlot(const QCString& signal) 00070 { 00071 QString signature = QString(signal).mid(1); 00072 int startpos = signature.find("("); 00073 int endpos = signature.findRev(")"); 00074 if(startpos < 0 || startpos > endpos) { 00075 krosswarning( QString("EventSlot::getSlot(%1) Invalid signal.").arg(signal) ); 00076 return QCString(); 00077 } 00078 QString signalname = signature.left(startpos); 00079 QString params = signature.mid(startpos + 1, endpos - startpos - 1); 00080 //QStringList paramlist = QStringList::split(",", params); 00081 QCString slot = QString("callback(" + params + ")").latin1(); //normalizeSignalSlot(); 00082 00083 QMetaObject* mo = metaObject(); 00084 int slotid = mo->findSlot(slot, false); 00085 if(slotid < 0) { 00086 krossdebug( QString("EventSlot::getSlot(%1) No such slot '%2' avaiable.").arg(signal).arg(slot) ); 00087 return QCString(); 00088 } 00089 00090 const QMetaData* md = mo->slot(slotid, false); 00091 if(md->access != QMetaData::Public) { 00092 krossdebug( QString("EventSlot::getSlot(%1) The slot '%2' is not public.").arg(signal).arg(slot) ); 00093 return QCString(); 00094 } 00095 00096 //QMember* member = md->member; 00097 //const QUMethod *method = md->method; 00098 00099 krossdebug( QString("signal=%1 slot=%2 slotid=%3 params=%4 mdname=%5") 00100 .arg(signal).arg(slot).arg(slotid).arg(params).arg(md->name) ); 00101 return QCString("1" + slot); // Emulate the SLOT(...) macro by adding as first char a "1". 00102 } 00103 00104 bool EventSlot::connect(EventManager* eventmanager, QObject* senderobj, const QCString& signal, QString function, const QCString& slot) 00105 { 00106 if(m_sender && ! disconnect()) 00107 return false; 00108 00109 const QCString& myslot = slot.isEmpty() ? getSlot(signal) : slot; 00110 if(! myslot) 00111 return false; 00112 00113 if(! m_eventmanager) { 00114 EventSlot* eventslot = create(eventmanager); 00115 eventslot->connect(eventmanager, senderobj, signal, function, slot); 00116 m_slots.append(eventslot); 00117 krossdebug( QString("EventSlot::connect(%1, %2, %3) added child EventSlot !!!").arg(senderobj->name()).arg(signal).arg(function) ); 00118 } 00119 else { 00120 m_sender = senderobj; 00121 m_signal = signal; 00122 m_function = function; 00123 m_slot = myslot; 00124 if(! QObject::connect((QObject*)senderobj, signal, this, myslot)) { 00125 krossdebug( QString("EventSlot::connect(%1, %2, %3) failed.").arg(senderobj->name()).arg(signal).arg(function) ); 00126 return false; 00127 } 00128 krossdebug( QString("EventSlot::connect(%1, %2, %3) successfully connected.").arg(senderobj->name()).arg(signal).arg(function) ); 00129 } 00130 return true; 00131 } 00132 00133 bool EventSlot::disconnect() 00134 { 00135 if(! m_sender) return false; 00136 QObject::disconnect((QObject*)m_sender, m_signal, this, m_slot); 00137 m_sender = 0; 00138 m_signal = 0; 00139 m_slot = 0; 00140 m_function = QString::null; 00141 return true; 00142 } 00143 00144 void EventSlot::call(const QVariant& variant) 00145 { 00146 krossdebug( QString("EventSlot::call() sender='%1' signal='%2' function='%3'") 00147 .arg(m_sender->name()).arg(m_signal).arg(m_function) ); 00148 00149 Kross::Api::List* arglist = 0; 00150 00151 QValueList<Kross::Api::Object*> args; 00152 if(variant.isValid()) { 00153 args.append(Kross::Api::Variant::create(variant)); 00154 arglist = Kross::Api::List::create(args); 00155 } 00156 00157 try { 00158 m_eventmanager->m_scriptcontainer->callFunction(m_function, arglist); 00159 } 00160 catch(Exception& e) { 00161 //TODO add hadError(), getError() and setError() 00162 krossdebug( QString("EXCEPTION in EventSlot::call('%1') type='%2' description='%3'").arg(variant.toString()).arg(e.type()).arg(e.description()) ); 00163 } 00164 } 00165 00166 void EventSlot::callback() { 00167 call(QVariant()); } 00168 void EventSlot::callback(short s) { 00169 call(QVariant(s)); } 00170 void EventSlot::callback(int i) { 00171 call(QVariant(i)); } 00172 void EventSlot::callback(int i1, int i2) { 00173 call(QVariant( QValueList<QVariant>() << i1 << i2 )); } 00174 void EventSlot::callback(int i1, int i2, int i3) { 00175 call(QVariant( QValueList<QVariant>() << i1 << i2 << i3 )); } 00176 void EventSlot::callback(int i1, int i2, int i3, int i4) { 00177 call(QVariant( QValueList<QVariant>() << i1 << i2 << i3 << i4 )); } 00178 void EventSlot::callback(int i1, int i2, int i3, int i4, int i5) { 00179 call(QVariant( QValueList<QVariant>() << i1 << i2 << i3 << i4 << i5 )); } 00180 void EventSlot::callback(int i1, int i2, int i3, int i4, bool b) { 00181 call(QVariant( QValueList<QVariant>() << i1 << i2 << i3 << i4 << b )); } 00182 void EventSlot::callback(int i1, bool b) { 00183 call(QVariant( QValueList<QVariant>() << i1 << b )); } 00184 void EventSlot::callback(int i1, int i2, bool b) { 00185 call(QVariant( QValueList<QVariant>() << i1 << i2 << b )); } 00186 void EventSlot::callback(int i1, int i2, const QString& s) { 00187 call(QVariant( QValueList<QVariant>() << i1 << i2 << s )); } 00188 void EventSlot::callback(uint i) { 00189 call(QVariant(i)); } 00190 void EventSlot::callback(long l) { 00191 call(QVariant((Q_LLONG)l)); } 00192 void EventSlot::callback(ulong l) { 00193 call(QVariant((Q_ULLONG)l)); } 00194 void EventSlot::callback(double d) { 00195 call(QVariant(d)); } 00196 void EventSlot::callback(const char* c) { 00197 call(QVariant(c)); } 00198 void EventSlot::callback(bool b) { 00199 call(QVariant(b)); } 00200 void EventSlot::callback(const QString& s) { 00201 call(QVariant(s)); } 00202 void EventSlot::callback(const QString& s, int i) { 00203 call(QVariant( QValueList<QVariant>() << s << i )); } 00204 void EventSlot::callback(const QString& s, int i1, int i2) { 00205 call(QVariant( QValueList<QVariant>() << s << i1 << i2 )); } 00206 void EventSlot::callback(const QString& s, uint i) { 00207 call(QVariant( QValueList<QVariant>() << s << i )); } 00208 void EventSlot::callback(const QString& s, bool b) { 00209 call(QVariant( QValueList<QVariant>() << s << b )); } 00210 void EventSlot::callback(const QString& s, bool b1, bool b2) { 00211 call(QVariant( QValueList<QVariant>() << s << b1 << b2 )); } 00212 void EventSlot::callback(const QString& s, bool b, int i) { 00213 call(QVariant( QValueList<QVariant>() << s << b << i )); } 00214 void EventSlot::callback(const QString& s1, const QString& s2) { 00215 call(QVariant( QValueList<QVariant>() << s1 << s2 )); } 00216 void EventSlot::callback(const QString& s1, const QString& s2, const QString& s3) { 00217 call(QVariant( QValueList<QVariant>() << s1 << s2 << s3 )); } 00218 void EventSlot::callback(const QStringList& sl) { 00219 call(QVariant(sl)); } 00220 void EventSlot::callback(const QVariant& variant) { 00221 call(variant); } 00222 */