diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-24 02:13:59 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-24 02:13:59 +0000 |
commit | a6d58bb6052ac8cb01805a48c4ad2f129126116f (patch) | |
tree | dd867a099fcbb263a8009a9fb22695b87855dad6 /src/kvilib/ext/kvi_dcophelper.cpp | |
download | kvirc-a6d58bb6052ac8cb01805a48c4ad2f129126116f.tar.gz kvirc-a6d58bb6052ac8cb01805a48c4ad2f129126116f.zip |
Added KDE3 version of kvirc
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kvirc@1095341 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/kvilib/ext/kvi_dcophelper.cpp')
-rw-r--r-- | src/kvilib/ext/kvi_dcophelper.cpp | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/src/kvilib/ext/kvi_dcophelper.cpp b/src/kvilib/ext/kvi_dcophelper.cpp new file mode 100644 index 00000000..83f34f4e --- /dev/null +++ b/src/kvilib/ext/kvi_dcophelper.cpp @@ -0,0 +1,357 @@ +//============================================================================= +// +// File : kvi_dcophelper.cpp +// Created on Sat 20 Jan 2007 12:35:21 by Alexander Stillich +// +// This file is part of the KVIrc IRC client distribution +// Copyright (C) 2005 Szymon Stefanek <pragma at kvirc dot net> +// Copyright (C) 2007 Alexander Stillich <torque at pltn dot org> +// +// This program is FREE software. You can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your opinion) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, write to the Free Software Foundation, +// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//============================================================================= + +#define __KVILIB__ +#include "kvi_dcophelper.h" + +#ifdef COMPILE_KDE_SUPPORT + +#include "dcopclient.h" + +#include <qdatastream.h> +#include <qvaluelist.h> + +// must be included this way, since kvilib is built +// before kvirc and symlinks to headers aren't set yet +#include "../../kvirc/kernel/kvi_app.h" +#include "kvi_thread.h" + +KviDCOPHelper::KviDCOPHelper(bool bStartApp, const KviQCString &szAppId) +{ + m_szAppId = szAppId; +} + +KviDCOPHelper::~KviDCOPHelper() +{ +} + +bool KviDCOPHelper::ensureAppRunning(const QString &szApp) +{ + if (findRunningApp(m_szAppId)) + return true; + + if (m_bStartApp) + return startApp(m_szAppId,400); + + return false; +} + + +bool KviDCOPHelper::voidRetVoidDCOPCall(const KviQCString &szObj,const KviQCString &szFunc) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data; + return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); +} + +bool KviDCOPHelper::voidRetBoolDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,bool bVal) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data; + QDataStream arg(data, IO_WriteOnly); + arg << bVal; + return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); +} + +bool KviDCOPHelper::voidRetIntDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,int iVal) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data; + QDataStream arg(data, IO_WriteOnly); + arg << iVal; + return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); +} + +bool KviDCOPHelper::voidRetIntBoolDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,int iVal, bool bVal) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data; + QDataStream arg(data, IO_WriteOnly); + arg << iVal; + arg << bVal; + return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); +} + +bool KviDCOPHelper::voidRetIntIntIntDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,int iVal1, int iVal2, int iVal3) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data; + QDataStream arg(data, IO_WriteOnly); + arg << iVal1; + arg << iVal2; + arg << iVal3; + return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); +} + +bool KviDCOPHelper::voidRetFloatDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,float fVal) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data; + QDataStream arg(data, IO_WriteOnly); + arg << fVal; + return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); +} + +bool KviDCOPHelper::voidRetStringDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,const QString &szVal) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data; + QDataStream arg(data, IO_WriteOnly); + arg << szVal; + return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); +} + +bool KviDCOPHelper::stringRetVoidDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,QString &szRet) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data, replyData; + KviQCString replyType; + if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) + return false; + QDataStream reply( replyData, IO_ReadOnly ); + if(replyType == "QString") + { + reply >> szRet; + return true; + } + return false; +} + +bool KviDCOPHelper::stringRetIntDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,QString &szRet,int iVal) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data, replyData; + KviQCString replyType; + + QDataStream arg(data, IO_WriteOnly); + arg << iVal; + + if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) + return false; + + QDataStream reply( replyData, IO_ReadOnly ); + if(replyType == "QString") + { + reply >> szRet; + return true; + } + return false; +} + +bool KviDCOPHelper::intRetVoidDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,int &ret) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data, replyData; + KviQCString replyType; + if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) + return false; + QDataStream reply( replyData, IO_ReadOnly ); + if(replyType == "int") + { + reply >> ret; + return true; + } + return false; +} + +bool KviDCOPHelper::intRetIntDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,int &ret, int iVal) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data, replyData; + KviQCString replyType; + + QDataStream arg(data, IO_WriteOnly); + arg << iVal; + + if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) + return false; + + QDataStream reply( replyData, IO_ReadOnly ); + if(replyType == "int") + { + reply >> ret; + return true; + } + return false; +} + +bool KviDCOPHelper::boolRetVoidDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,bool &ret) +{ + if(!ensureAppRunning(m_szAppId))return false; + QByteArray data, replyData; + KviQCString replyType; + if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) + return false; + QDataStream reply( replyData, IO_ReadOnly ); + if(replyType == "bool") + { + reply >> ret; + return true; + } + return false; +} + +bool KviDCOPHelper::qvalueListIntRetIntDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,KviValueList<int> &ret, int iVal) +{ + if(!ensureAppRunning(m_szAppId)) + return false; + + QByteArray data, replyData; + KviQCString replyType; + QDataStream arg(data, IO_WriteOnly); + + arg << iVal; + + + if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) + return false; + + if(replyType != "QValueList<int>") + return false; + + QDataStream replyStream(replyData, IO_ReadOnly); + replyStream >> ret; + + return true; +} + +bool KviDCOPHelper::qcstringListRetVoidDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,KviQCStringList &ret) +{ + QByteArray data, replyData; + KviQCString replyType; + + if (!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) + return false; + + if (replyType != "KviQCStringList") + return false; + + QDataStream replyStream(replyData, IO_ReadOnly); + replyStream >> ret; + + return true; +} + +bool KviDCOPHelper::qcstringListRetIntDCOPCall(const KviQCString &szObj,const KviQCString &szFunc,KviQCStringList &ret, int iVal) +{ + QByteArray data, replyData; + KviQCString replyType; + + QDataStream arg(data, IO_WriteOnly); + arg << iVal; + + if (!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) + return false; + + if (replyType != "KviQCStringList") + return false; + + QDataStream replyStream(replyData, IO_ReadOnly); + replyStream >> ret; + + return true; +} + +bool KviDCOPHelper::findRunningApp(const QString &szApp) +{ + QValueList<KviQCString> allApps = g_pApp->dcopClient() ->registeredApplications(); + QValueList<KviQCString>::iterator iterator; + KviQCString sz = szApp.local8Bit(); + for (iterator = allApps.begin();iterator != allApps.end();iterator++) + { + if(*iterator == sz) + return true; + } + return false; +} + +int KviDCOPHelper::detectApp(const QString &szApp,bool bStart,int iScoreWhenFound,int iScoreWhenStarted) +{ + // dcop available + if(!g_pApp->dcopClient()) + return 0; + + if(findRunningApp(szApp)) + return 95; // found a running app, no need to run further + + // no app found running + if(bStart) + { + // try to start it + if(!startApp(szApp,5000)) + return 10; // very low possibility + return findRunningApp(szApp) ? 99 : 0; // try to find it again + } + + return 30; // it still might be installed on the system but we're just unable to start it... +} + + +bool KviDCOPHelper::startApp(const QString &szApp,int iWaitMSecs) +{ + // we could use KApplication::startServiceByDesktopName here + // but we want to be able to wait a defined amount of time + QStringList tmp; + QByteArray data, replyData; + KviQCString replyType; + QDataStream arg(data, IO_WriteOnly); + arg << szApp << tmp; + if(!g_pApp->dcopClient()->call( + "klauncher", + "klauncher", + "start_service_by_desktop_name(QString,QStringList)", + data, + replyType, + replyData)) + { + return false; + } else { + QDataStream reply(replyData, IO_ReadOnly); + if(replyType != "serviceResult")return false; + int result; + KviQCString dcopName; + QString error; + reply >> result >> dcopName >> error; + if(result != 0)return false; + } + // ok , we seem to have started it.. but it might take some seconds + // for the app to get registered + // we wait up to five seconds + if(iWaitMSecs > 0) + { + int i = 0; + while(i < iWaitMSecs) + { + if(findRunningApp(szApp))return true; + KviThread::msleep(100); + i += 100; + } + return findRunningApp(szApp); + } + return true; +} + + +#endif //COMPILE_KDE_SUPPORT |