-rw-r--r-- | kaddressbook/kabcore.cpp | 33 | ||||
-rw-r--r-- | kaddressbook/kabcore.h | 3 | ||||
-rw-r--r-- | kaddressbook/mainembedded.cpp | 3 | ||||
-rw-r--r-- | libkdepim/externalapphandler.cpp | 282 | ||||
-rw-r--r-- | libkdepim/externalapphandler.h | 111 |
5 files changed, 427 insertions, 5 deletions
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp index 6807bed..e7c815e 100644 --- a/kaddressbook/kabcore.cpp +++ b/kaddressbook/kabcore.cpp @@ -66,8 +66,10 @@ #include <kapplication.h> #include "KDGanttMinimizeSplitter.h" #include "kaddressbookmain.h" #include "kactioncollection.h" +#include "addresseedialog.h" + #include <qapp.h> #include <qmenubar.h> //#include <qtoolbar.h> #include <qmessagebox.h> @@ -210,15 +212,20 @@ KABCore::KABCore( KXMLGUIClient *client, bool readWrite, QWidget *parent, const connect( mDetails, SIGNAL( sendEmail( const QString& ) ), SLOT( sendMail( const QString& ) ) ); + + connect( ExternalAppHandler::instance(), SIGNAL (requestForNameEmailUidList(const QString&, const QString&, const QString&)),this, SLOT(requestForNameEmailUidList(const QString&, const QString&, const QString&))); + + #ifndef KAB_EMBEDDED connect( mViewManager, SIGNAL( urlDropped( const KURL& ) ), mXXPortManager, SLOT( importVCard( const KURL& ) ) ); connect( mDetails, SIGNAL( browse( const QString& ) ), SLOT( browse( const QString& ) ) ); + mAddressBookService = new KAddressBookService( this ); #endif //KAB_EMBEDDED mEditorDialog = 0; @@ -1964,8 +1971,34 @@ void KABCore::configureResources() } #endif //KAB_EMBEDDED +/* this method will be called through the QCop interface from Ko/Pi to select addresses + * for the attendees list of an event. + */ +void KABCore::requestForNameEmailUidList(const QString& sourceChannel, const QString& uid, const QString& param1) +{ + //param1 is usually empty for this kind of request + + QStringList nameList; + QStringList emailList; + QStringList uidList; + + KABC::Addressee::List list = KABC::AddresseeDialog::getAddressees(this); + uint i=0; + for (i=0; i < list.count(); i++) + { + nameList.append(list[i].realName()); + emailList.append(list[i].preferredEmail()); + uidList.append(list[i].uid()); + } + + bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI(sourceChannel, uid, nameList, emailList, uidList); + +} + + + #ifndef KAB_EMBEDDED #include "kabcore.moc" #endif //KAB_EMBEDDED diff --git a/kaddressbook/kabcore.h b/kaddressbook/kabcore.h index d4d28f1..fe778af 100644 --- a/kaddressbook/kabcore.h +++ b/kaddressbook/kabcore.h @@ -327,8 +327,11 @@ class KABCore : public QWidget Registers a new GUI client, so plugins can register its actions. */ void addGUIClient( KXMLGUIClient *client ); + void requestForNameEmailUidList(const QString& sourceChannel, const QString& uid, const QString& param1); + + signals: void contactSelected( const QString &name ); void contactSelected( const QPixmap &pixmap ); public slots: diff --git a/kaddressbook/mainembedded.cpp b/kaddressbook/mainembedded.cpp index 7f368eb..850e5b2 100644 --- a/kaddressbook/mainembedded.cpp +++ b/kaddressbook/mainembedded.cpp @@ -12,8 +12,9 @@ #include <kglobal.h> #include <stdio.h> #include <qdir.h> #include "kaddressbookmain.h" +#include "externalapphandler.h" int main( int argc, char **argv ) { #ifndef DESKTOP_VERSION @@ -52,9 +53,9 @@ int main( int argc, char **argv ) #endif KStandardDirs::setAppDir( QDir::convertSeparators(locateLocal("data", "kaddressbook"))); KAddressBookMain m ; //US MainWindow m; -//US QObject::connect( &a, SIGNAL (appMessage ( const QCString &, const QByteArray & )),&m, SLOT(recieve( const QCString&, const QByteArray& ))); + QObject::connect(&a, SIGNAL (appMessage ( const QCString &, const QByteArray & )), ExternalAppHandler::instance(), SLOT (appMessage ( const QCString &, const QByteArray & ))); #ifndef DESKTOP_VERSION a.showMainWidget( &m ); #else diff --git a/libkdepim/externalapphandler.cpp b/libkdepim/externalapphandler.cpp index 35638b1..64caa7d 100644 --- a/libkdepim/externalapphandler.cpp +++ b/libkdepim/externalapphandler.cpp @@ -44,21 +44,257 @@ $Id$ #include "externalapphandler.h" #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; +} + +/********************************************************************************* + * + ********************************************************************************/ + 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&))); + + } ExternalAppHandler::~ExternalAppHandler() { @@ -390,9 +626,10 @@ bool ExternalAppHandler::mailToOneContact( const QString& adressline ) QString name = line.left(first); QString emailadress = line.mid(first+1, last-first-1); //Subject can not be handled right now. - mailToOneContact( name, emailadress ); + return mailToOneContact( name, emailadress ); + } /************************************************************************** @@ -678,4 +915,45 @@ 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 @@ -30,14 +30,90 @@ $Id$ #ifndef EXTERNALAPPHANDLER_H #define EXTERNALAPPHANDLER_H +#include <qobject.h> #include <qlist.h> +#include <qmap.h> 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 { public: @@ -59,10 +135,15 @@ class DefaultAppItem QString _parameters2; // a list of parameters in stringrepresentation. Delimiter is ; }; -class ExternalAppHandler +/********************************************************************************* + * + ********************************************************************************/ + +class ExternalAppHandler : public QObject { + Q_OBJECT public: virtual ~ExternalAppHandler(); static ExternalAppHandler *instance(); @@ -111,15 +192,38 @@ class ExternalAppHandler bool isFaxAppAvailable(); bool isPagerAppAvailable(); + //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 void loadConfig(); QList<DefaultAppItem> getAvailableDefaultItems(Types); 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: ExternalAppHandler(); QList<DefaultAppItem> mDefaultItems; @@ -129,8 +233,11 @@ class ExternalAppHandler Availability mFaxAppAvailable; Availability mSMSAppAvailable; 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); QString& translateMessage(QString& message, const QString& param1, const QString& param2) const; @@ -138,8 +245,8 @@ class ExternalAppHandler static ExternalAppHandler *sInstance; - }; + #endif |