-rw-r--r-- | libkdepim/externalapphandler.cpp | 282 | ||||
-rw-r--r-- | libkdepim/externalapphandler.h | 111 |
2 files changed, 389 insertions, 4 deletions
diff --git a/libkdepim/externalapphandler.cpp b/libkdepim/externalapphandler.cpp index 35638b1..64caa7d 100644 --- a/libkdepim/externalapphandler.cpp +++ b/libkdepim/externalapphandler.cpp @@ -46,8 +46,235 @@ $Id$ #include "kpimglobalprefs.h" +/********************************************************************************* + * + ********************************************************************************/ + + +QCopTransferItem::QCopTransferItem(const QString& sourceMessage, const QString& targetChannel, const QString& targetMessage) + : _sourceMessage(sourceMessage), _targetChannel(targetChannel), _targetMessage(targetMessage) +{ + //sourceMessage passes later three parameters: sourceChannel, uid, param1 + _sourceMessageParameters = "(QString,QString,QString)"; +} + +/*********************************************************************************/ + +QCopTransferItem::QCopTransferItem() +{ +} + +/*********************************************************************************/ +bool QCopTransferItem::sendMessageToTarget(const QString& uid, const QString& param1) +{ + +#ifndef DESKTOP_VERSION + //sourceMessage passes two parameters: sourceChannel, uid + QString sourceMessage = _sourceMessage + _sourceMessageParameters; + + qDebug("Using QCopEnvelope e(\"%s\",\"%s\")", _targetChannel.latin1(), sourceMessage.latin1()); + qDebug("passing sourcechannel(%s), uid(%s), param1(%s) as parameter to QCopEnvelope", _sourceChannel.latin1(), uid.latin1(), param1.latin1()); + + QCopEnvelope e(_targetChannel.latin1(), sourceMessage.latin1()); + + e << _sourceChannel << uid << param1; + + return true; + +#else + KMessageBox::sorry( 0, i18n( "This version does not support QCop." ) ); + return false; +#endif + +} + + +/*********************************************************************************/ +void QCopTransferItem::setSourceChannel(const QString& sourceChannel) +{ + + if (_sourceChannel.isEmpty()) + _sourceChannel = sourceChannel; +} + + +/*********************************************************************************/ +bool QCopTransferItem::appMessage( const QCString& cmsg, const QByteArray& data ) +{ +/*US + // copied from old mail2 + static int ii = 0; + + // block second call + if ( ii < 2 ) { + ++ii; + if ( ii > 1 ) { + qDebug("qcop call blocked "); + return true; + } + } +*/ + qDebug("QCopTransferItem- QCOP message received: %s ", cmsg.data() ); + + //we are in the target and get a request from the source + if ( (_sourceMessage + _sourceMessageParameters) == cmsg.data()) + { + QDataStream stream( data, IO_ReadOnly ); + + + QString sourceChannel; + QString uid; + QString param1; + stream >> sourceChannel >> uid >> param1; + emit receivedMessageFromSource(sourceChannel, uid, param1); + return true; + } + + return false; +} + + +/********************************************************************************* + * + ********************************************************************************/ + + +QCopMapTransferItem::QCopMapTransferItem(const QString& sourceMessage, const QString& targetChannel, const QString& targetMessage) + : QCopTransferItem(sourceMessage, targetChannel,targetMessage) +{ + //targetMessage returns later two parameters: uid, and map<qstring,qstring> + _targetMessageParameters = "(QString,QMAP<QString,QString>)"; +} + +/*********************************************************************************/ +bool QCopMapTransferItem::sendMessageToSource(const QString& uid, const QMap<QString,QString>& nameEmailMap) +{ +#ifndef DESKTOP_VERSION + //targetMessage passes two parameters: uid, map + QString targetMessage = _targetMessage + _targetMessageParameters; + + qDebug("Using QCopEnvelope e(\"%s\",\"%s\")", _sourceChannel.latin1(), targetMessage.latin1()); + qDebug("passing uid(%s) and map as parameter to QCopEnvelope", uid.latin1()); + QCopEnvelope e(_sourceChannel.latin1(), targetMessage.latin1()); + //US we need no names in the To field. The emailadresses are enough + + e << uid << nameEmailMap; + + return true; + +#else + KMessageBox::sorry( 0, i18n( "This version does not support QCop." ) ); + return false; +#endif + +} + + +/*********************************************************************************/ +bool QCopMapTransferItem::appMessage( const QCString& cmsg, const QByteArray& data ) +{ + bool res = QCopTransferItem::appMessage( cmsg, data ); + + if (res == false) + { + QDataStream stream( data, IO_ReadOnly ); + + qDebug("QCopMapTransferItem- QCOP message received: %s ", cmsg.data() ); + + //we are in the source and get an answer from the target + if ((_targetMessage + _targetMessageParameters) == cmsg.data()) + { + QMap<QString,QString> adrMap; + QString uid; + + stream >> uid >> adrMap; + + emit receivedMessageFromTarget(uid, adrMap); + + + return true; + } + } + + return false; +} + + +/********************************************************************************* + * + ********************************************************************************/ + + +QCopListTransferItem::QCopListTransferItem(const QString& sourceMessage, const QString& targetChannel, const QString& targetMessage) + : QCopTransferItem(sourceMessage, targetChannel,targetMessage) +{ + //targetMessage returns later two parameters: uid, and map<qstring,qstring> + _targetMessageParameters = "(QString,QStringList,QStringList,QStringList)"; +} + +/*********************************************************************************/ +bool QCopListTransferItem::sendMessageToSource(const QString& uid, const QStringList& list1, const QStringList& list2, const QStringList& list3) +{ +#ifndef DESKTOP_VERSION + //targetMessage passes two parameters: uid, map + QString targetMessage = _targetMessage + _targetMessageParameters; + + qDebug("Using QCopEnvelope e(\"%s\",\"%s\")", _sourceChannel.latin1(), targetMessage.latin1()); + qDebug("passing uid(%s) and list1, list2, list3 as parameter to QCopEnvelope", uid.latin1()); + + QCopEnvelope e(_sourceChannel.latin1(), targetMessage.latin1()); + //US we need no names in the To field. The emailadresses are enough + + e << uid << list1 << list2 << list3; + + return true; + +#else + KMessageBox::sorry( 0, i18n( "This version does not support QCop." ) ); + return false; +#endif + +} + + +/*********************************************************************************/ +bool QCopListTransferItem::appMessage( const QCString& cmsg, const QByteArray& data ) +{ + bool res = QCopTransferItem::appMessage( cmsg, data ); + + if (res == false) + { + QDataStream stream( data, IO_ReadOnly ); + + qDebug("QCopListTransferItem- QCOP message received: %s ", cmsg.data() ); + + //we are in the source and get an answer from the target + if ((_targetMessage + _targetMessageParameters) == cmsg.data()) + { + QStringList list1; + QStringList list2; + QStringList list3; + QString uid; + + stream >> uid >> list1 >> list2 >> list3; + + emit receivedMessageFromTarget(uid, list1, list2, list3); + + + return true; + } + } + + return false; +} + + + +/********************************************************************************* + * + ********************************************************************************/ @@ -55,8 +282,17 @@ ExternalAppHandler *ExternalAppHandler::sInstance = 0; static KStaticDeleter<ExternalAppHandler> staticDeleter; - ExternalAppHandler::ExternalAppHandler() { mDefaultItems.setAutoDelete(true); + + mNameEmailUidListFromKAPITransfer = new QCopListTransferItem("requestNameEmailUIDListFromKAPI", "QPE/Application/kapi", "receiveNameEmailUIDList"); + connect(mNameEmailUidListFromKAPITransfer, SIGNAL (receivedMessageFromSource(const QString&, const QString&, const QString&)), this, SIGNAL (requestForNameEmailUidList(const QString&, const QString&, const QString&))); + connect(mNameEmailUidListFromKAPITransfer, SIGNAL (receivedMessageFromTarget(const QString&, const QStringList&, const QStringList&, const QStringList&)), this, SIGNAL (receivedNameEmailUidListEvent(const QString&, const QStringList&, const QStringList&, const QStringList&))); + +//US mFindByEmailFromKAPITransfer = new QCopListTransferItem("requestFindByEmailFromKAPI", "QPE/Application/kapi", "receiveFindByEmailNameEmailUIDList"); +//US connect(mFindByEmailFromKAPITransfer, SIGNAL (receivedMessageFromSource(const QString&, const QString&, const QString&)), this, SIGNAL (requestForFindByEmail(const QString&, const QString&, const QString&))); +//US connect(mFindByEmailFromKAPITransfer, SIGNAL (receivedMessageFromTarget(const QString&, const QStringList&, const QStringList&, const QStringList&)), this, SIGNAL (receivedFindByEmailEvent(const QString&, const QStringList&, const QStringList&, const QStringList&))); + + } @@ -392,5 +628,6 @@ bool ExternalAppHandler::mailToOneContact( const QString& adressline ) //Subject can not be handled right now. - mailToOneContact( name, emailadress ); + return mailToOneContact( name, emailadress ); + } @@ -680,2 +917,43 @@ void ExternalAppHandler::passParameters(QCopEnvelope* e, const QString& paramete +/************************************************************************** + * + **************************************************************************/ + +void ExternalAppHandler::appMessage( const QCString& cmsg, const QByteArray& data ) +{ + bool res = mNameEmailUidListFromKAPITransfer->appMessage( cmsg, data ); + +// if (!res) +// res = mNameEmailUidListFromKAPITransfer->appMessage( cmsg, data ); +} + + + +bool ExternalAppHandler::requestNameEmailUidListFromKAPI(const QString& sourceChannel, const QString& uid) +{ + mNameEmailUidListFromKAPITransfer->setSourceChannel(sourceChannel); + return mNameEmailUidListFromKAPITransfer->sendMessageToTarget(uid, QString::null); +} + +bool ExternalAppHandler::returnNameEmailUidListFromKAPI(const QString& sourceChannel, const QString& uid, const QStringList& list1, const QStringList& list2, const QStringList& list3) +{ + mNameEmailUidListFromKAPITransfer->setSourceChannel(sourceChannel); + return mNameEmailUidListFromKAPITransfer->sendMessageToSource(uid, list1, list2, list3); +} + +bool ExternalAppHandler::requestFindByEmailFromKAPI(const QString& sourceChannel, const QString& uid, const QString& email) +{ + mFindByEmailFromKAPITransfer->setSourceChannel(sourceChannel); + return mFindByEmailFromKAPITransfer->sendMessageToTarget(uid, email); +} + +bool ExternalAppHandler::returnFindByEmailFromKAPI(const QString& sourceChannel, const QString& uid, const QStringList& list1, const QStringList& list2, const QStringList& list3) +{ + mFindByEmailFromKAPITransfer->setSourceChannel(sourceChannel); + return mFindByEmailFromKAPITransfer->sendMessageToSource(uid, list1, list2, list3); +} + + + + diff --git a/libkdepim/externalapphandler.h b/libkdepim/externalapphandler.h index 3cf9e06..7c8de4e 100644 --- a/libkdepim/externalapphandler.h +++ b/libkdepim/externalapphandler.h @@ -32,5 +32,7 @@ $Id$ #define EXTERNALAPPHANDLER_H +#include <qobject.h> #include <qlist.h> +#include <qmap.h> class QCopEnvelope; @@ -38,4 +40,78 @@ class QCopEnvelope; class ExternalAppHandler; +class QCopTransferItem : public QObject +{ + Q_OBJECT + public: + QCopTransferItem(const QString& sourceMessage, const QString& targetChannel, const QString& targetMessage); + QCopTransferItem(); + + bool sendMessageToTarget(const QString& uid, const QString& param1); + + void setSourceChannel(const QString& sourceChannel); + + virtual bool appMessage( const QCString& msg, const QByteArray& data ); + + + signals: + void receivedMessageFromSource(const QString& sourceChannel, const QString& uid, const QString& param1); + + + public: + QString _sourceChannel; + QString _sourceMessage; + QString _sourceMessageParameters; + QString _targetChannel; + QString _targetMessage; + QString _targetMessageParameters; + +}; + +/********************************************************************************* + * + ********************************************************************************/ + +class QCopMapTransferItem : public QCopTransferItem +{ + Q_OBJECT + public: + QCopMapTransferItem(const QString& sourceMessage, const QString& targetChannel, const QString& targetMessage); + + bool sendMessageToSource(const QString& uid, const QMap<QString,QString>& nameEmailMap); + + + virtual bool appMessage( const QCString& msg, const QByteArray& data ); + + + signals: + void receivedMessageFromTarget(const QString& uid, const QMap<QString,QString>& nameEmailMap); + +}; + +/********************************************************************************* + * + ********************************************************************************/ + +class QCopListTransferItem : public QCopTransferItem +{ + Q_OBJECT + public: + QCopListTransferItem(const QString& sourceMessage, const QString& targetChannel, const QString& targetMessage); + + bool sendMessageToSource(const QString& uid, const QStringList& list1, const QStringList& list2, const QStringList& list3); + + + virtual bool appMessage( const QCString& msg, const QByteArray& data ); + + + signals: + void receivedMessageFromTarget(const QString& uid, const QStringList& list1, const QStringList& list2, const QStringList& list3); + +}; + +/********************************************************************************* + * + ********************************************************************************/ + class DefaultAppItem @@ -61,6 +137,11 @@ class DefaultAppItem }; -class ExternalAppHandler +/********************************************************************************* + * + ********************************************************************************/ + +class ExternalAppHandler : public QObject { + Q_OBJECT public: virtual ~ExternalAppHandler(); @@ -113,4 +194,12 @@ class ExternalAppHandler + //Call this method on the source when you want to select names from the addressbook by using QCop + bool requestNameEmailUidListFromKAPI(const QString& sourceChannel, const QString& uid); + //Call this method on the target when you want to return the name/email map to the source (client). + bool returnNameEmailUidListFromKAPI(const QString& sourceChannel, const QString& uid, const QStringList& name, const QStringList& email, const QStringList& uid); + + bool requestFindByEmailFromKAPI(const QString& sourceChannel, const QString& uid, const QString& email); + bool returnFindByEmailFromKAPI(const QString& sourceChannel, const QString& uid, const QStringList& name, const QStringList& email, const QStringList& uid); + //loadConfig clears the cache and checks again if the applications are available or not @@ -120,4 +209,19 @@ class ExternalAppHandler DefaultAppItem* getDefaultItem(Types, int); + public slots: + void appMessage( const QCString& msg, const QByteArray& data ); + + + signals: + // Emmitted when the target app receives a request from the source app + void requestForNameEmailUidList(const QString& sourceChannel, const QString& uid, const QString& param1); + + // Emitted when the source app recieves a list of name/email pairs (=addresses) from another target app. Usually Ka/Pi + // The first parameter is a uniqueid. It can be used to identify the event + void receivedNameEmailUidListEvent(const QString& uid, const QStringList& nameList, const QStringList& emailList, const QStringList& uidList); + + void requestFindByEmail(const QString& sourceChannel, const QString& uid, const QString& email); + void receivedFindBbyEmailEvent(const QString& uid, const QStringList& nameList, const QStringList& emailList, const QStringList& uidList); + private: @@ -131,4 +235,7 @@ class ExternalAppHandler Availability mPagerAppAvailable; + QCopListTransferItem* mNameEmailUidListFromKAPITransfer; + QCopListTransferItem* mFindByEmailFromKAPITransfer; + void addDefaultAppItem(Types type, int id, const QString& label, const QString& channel, const QString& message, const QString& parameters, const QString& message2, const QString& parameters2); @@ -140,6 +247,6 @@ class ExternalAppHandler static ExternalAppHandler *sInstance; - }; + #endif |