You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/modules/mediaplayer/mp_dcopinterface.cpp

225 lines
6.4 KiB

//=============================================================================
//
// File : mp_dcopinterface.cpp
// Created on Sun 27 Mar 2005 16:56:21 by Szymon Stefanek
//
// This file is part of the KVIrc IRC client distribution
// Copyright (C) 2005 Szymon Stefanek <pragma at kvirc dot net>
//
// 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.
//
//=============================================================================
#include "mp_dcopinterface.h"
#ifdef COMPILE_TDE_SUPPORT
#include "dcopclient.h"
#include <tqdatastream.h>
#include <tqvaluelist.h>
#include "kvi_app.h"
#include "kvi_thread.h"
KviMediaPlayerDCOPInterface::KviMediaPlayerDCOPInterface(const KviTQCString &szAppId)
: KviMediaPlayerInterface()
{
m_szAppId = szAppId;
}
KviMediaPlayerDCOPInterface::~KviMediaPlayerDCOPInterface()
{
}
bool KviMediaPlayerDCOPInterface::ensureAppRunning(const TQString &szApp)
{
if(findRunningApp(m_szAppId))return true;
return startApp(m_szAppId,400);
}
bool KviMediaPlayerDCOPInterface::simpleDCOPCall(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 KviMediaPlayerDCOPInterface::boolDCOPCall(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 KviMediaPlayerDCOPInterface::intDCOPCall(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 KviMediaPlayerDCOPInterface::floatDCOPCall(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 KviMediaPlayerDCOPInterface::stringDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,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 KviMediaPlayerDCOPInterface::stringRetDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,TQString &ret)
{
if(!ensureAppRunning(m_szAppId))return false;
TQString title;
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 >> ret;
return true;
}
return false;
}
bool KviMediaPlayerDCOPInterface::intRetDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,int &ret)
{
if(!ensureAppRunning(m_szAppId))return false;
TQString title;
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 KviMediaPlayerDCOPInterface::boolRetDCOPCall(const KviTQCString &szObj,const KviTQCString &szFunc,bool &ret)
{
if(!ensureAppRunning(m_szAppId))return false;
TQString title;
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 KviMediaPlayerDCOPInterface::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 KviMediaPlayerDCOPInterface::detectApp(const TQString &szApp,bool bStart,int iScoreWhenFound,int iScoreWhenStarted)
{
// lookup the amarok interface
if(!g_pApp->dcopClient())return 0;
if(findRunningApp(szApp))return 95; // found a running amarok, no need to run further
// no amarok app found
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 KviMediaPlayerDCOPInterface::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