|
|
|
//=============================================================================
|
|
|
|
//
|
|
|
|
// 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_TDE_SUPPORT
|
|
|
|
|
|
|
|
#include "dcopclient.h"
|
|
|
|
|
|
|
|
#include <tqdatastream.h>
|
|
|
|
#include <tqvaluelist.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 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<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;
|
|
|
|
|
|
|
|
if(replyType != "TQValueList<int>")
|
|
|
|
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<KviTQCString> allApps = g_pApp->dcopClient() ->registeredApplications();
|
|
|
|
TQValueList<KviTQCString>::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
|