//============================================================================= // // 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 // Copyright (C) 2007 Alexander Stillich // // 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_TDE_SUPPORT #include "dcopclient.h" #include #include // 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 KviTQCString &szAppId) { m_szAppId = szAppId; } KviDCOPHelper::~KviDCOPHelper() { } bool KviDCOPHelper::ensureAppRunning(const TQString &szApp) { if (findRunningApp(m_szAppId)) return true; if (m_bStartApp) return startApp(m_szAppId,400); return false; } bool KviDCOPHelper::voidRetVoidDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data; return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); } bool KviDCOPHelper::voidRetBoolDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,bool bVal) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data; TQDataStream arg(data, IO_WriteOnly); arg << bVal; return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); } bool KviDCOPHelper::voidRetIntDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,int iVal) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data; TQDataStream arg(data, IO_WriteOnly); arg << iVal; return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); } bool KviDCOPHelper::voidRetIntBoolDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,int iVal, bool bVal) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data; TQDataStream arg(data, IO_WriteOnly); arg << iVal; arg << bVal; return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); } bool KviDCOPHelper::voidRetIntIntIntDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,int iVal1, int iVal2, int iVal3) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data; TQDataStream arg(data, IO_WriteOnly); arg << iVal1; arg << iVal2; arg << iVal3; return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); } bool KviDCOPHelper::voidRetFloatDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,float fVal) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data; TQDataStream arg(data, IO_WriteOnly); arg << fVal; return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); } bool KviDCOPHelper::voidRetStringDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,const TQString &szVal) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data; TQDataStream arg(data, IO_WriteOnly); arg << szVal; return g_pApp->dcopClient()->send(m_szAppId,szObj,szFunc,data); } bool KviDCOPHelper::stringRetVoidDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,TQString &szRet) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data, replyData; KviTQCString replyType; if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) return false; TQDataStream reply( replyData, IO_ReadOnly ); if(replyType == TQSTRING_OBJECT_NAME_STRING) { reply >> szRet; return true; } return false; } bool KviDCOPHelper::stringRetIntDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,TQString &szRet,int iVal) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data, replyData; KviTQCString replyType; TQDataStream arg(data, IO_WriteOnly); arg << iVal; if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) return false; TQDataStream reply( replyData, IO_ReadOnly ); if(replyType == TQSTRING_OBJECT_NAME_STRING) { reply >> szRet; return true; } return false; } bool KviDCOPHelper::intRetVoidDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,int &ret) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data, replyData; KviTQCString replyType; if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) return false; TQDataStream reply( replyData, IO_ReadOnly ); if(replyType == "int") { reply >> ret; return true; } return false; } bool KviDCOPHelper::intRetIntDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,int &ret, int iVal) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data, replyData; KviTQCString replyType; TQDataStream arg(data, IO_WriteOnly); arg << iVal; if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) return false; TQDataStream reply( replyData, IO_ReadOnly ); if(replyType == "int") { reply >> ret; return true; } return false; } bool KviDCOPHelper::boolRetVoidDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,bool &ret) { if(!ensureAppRunning(m_szAppId))return false; TQByteArray data, replyData; KviTQCString replyType; if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) return false; TQDataStream reply( replyData, IO_ReadOnly ); if(replyType == "bool") { reply >> ret; return true; } return false; } bool KviDCOPHelper::qvalueListIntRetIntDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,KviValueList &ret, int iVal) { if(!ensureAppRunning(m_szAppId)) return false; TQByteArray data, replyData; KviTQCString replyType; TQDataStream arg(data, IO_WriteOnly); arg << iVal; if(!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) return false; if(replyType != "TQValueList") return false; TQDataStream replyStream(replyData, IO_ReadOnly); replyStream >> ret; return true; } bool KviDCOPHelper::qcstringListRetVoidDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,KviQCStringList &ret) { TQByteArray data, replyData; KviTQCString replyType; if (!g_pApp->dcopClient()->call(m_szAppId,szObj,szFunc,data,replyType,replyData)) return false; if (replyType != "KviQCStringList") return false; TQDataStream replyStream(replyData, IO_ReadOnly); replyStream >> ret; return true; } bool KviDCOPHelper::qcstringListRetIntDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,KviQCStringList &ret, int iVal) { TQByteArray data, replyData; KviTQCString replyType; TQDataStream 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; TQDataStream replyStream(replyData, IO_ReadOnly); replyStream >> ret; return true; } bool KviDCOPHelper::findRunningApp(const TQString &szApp) { TQValueList allApps = g_pApp->dcopClient() ->registeredApplications(); TQValueList::iterator iterator; KviTQCString sz = szApp.local8Bit(); for (iterator = allApps.begin();iterator != allApps.end();iterator++) { if(*iterator == sz) return true; } return false; } int KviDCOPHelper::detectApp(const TQString &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 TQString &szApp,int iWaitMSecs) { // we could use TDEApplication::startServiceByDesktopName here // but we want to be able to wait a defined amount of time TQStringList tmp; TQByteArray data, replyData; KviTQCString replyType; TQDataStream arg(data, IO_WriteOnly); arg << szApp << tmp; if(!g_pApp->dcopClient()->call( "klauncher", "klauncher", "start_service_by_desktop_name(TQString,TQStringList)", data, replyType, replyData)) { return false; } else { TQDataStream reply(replyData, IO_ReadOnly); if(replyType != "serviceResult")return false; int result; KviTQCString dcopName; TQString 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_TDE_SUPPORT