diff options
Diffstat (limited to 'src/modules/system/libkvisystem.cpp')
-rw-r--r-- | src/modules/system/libkvisystem.cpp | 749 |
1 files changed, 749 insertions, 0 deletions
diff --git a/src/modules/system/libkvisystem.cpp b/src/modules/system/libkvisystem.cpp new file mode 100644 index 00000000..54ada405 --- /dev/null +++ b/src/modules/system/libkvisystem.cpp @@ -0,0 +1,749 @@ +//============================================================================= +// +// File : libkvisystem.cpp +// Creation date : Fri Nov 16 03:50:12 2001 GMT by Szymon Stefanek +// +// This system is part of the KVirc irc client distribution +// Copyright (C) 2001-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 "kvi_settings.h" +#include "kvi_module.h" +#include "kvi_string.h" +#include "kvi_library.h" +#include "kvi_thread.h" + +#include "kvi_locale.h" +#include "kvi_qcstring.h" +#include "kvi_app.h" +#include "kvi_env.h" +#include "kvi_osinfo.h" +#include "kvi_qcstring.h" + +#include <qclipboard.h> + +#ifndef COMPILE_ON_WINDOWS + #include <sys/utsname.h> + #include <stdlib.h> + #include <unistd.h> +#endif + +#ifdef COMPILE_KDE_SUPPORT + #include <dcopclient.h> +#endif + +#include "kvi_modulemanager.h" + +#include "plugin.h" + +KviPluginManager * g_pPluginManager; + +/* + @doc: system.ostype + @type: + function + @title: + $system.ostype + @short: + Returns the type of the operating system + @syntax: + <string> $system.ostype() + @description: + Returns the current type of operating system: unix,macosx or windows.[br] +*/ + +static bool system_kvs_fnc_ostype(KviKvsModuleFunctionCall * c) +{ + c->returnValue()->setString(KviOsInfo::type()); + return true; +} +/* + @doc: system.osname + @type: + function + @title: + $system.osname + @short: + Returns the name of the operating system + @syntax: + <string> $system.osname() + @description: + Returns the name of the operating system. On UNIX like machines + this is the field sysname of the utsname structure returned by + the uname() syscall. +*/ + +static bool system_kvs_fnc_osname(KviKvsModuleFunctionCall *c) +{ + c->returnValue()->setString(KviOsInfo::name()); + return true; +} + + +/* + @doc: system.osversion + @type: + function + @title: + $system.osversion + @short: + Returns the version of the operating system + @syntax: + <string> $system.osversion() + @description: + Returns the version of the operating system.[br] +*/ + +static bool system_kvs_fnc_osversion(KviKvsModuleFunctionCall *c) +{ + // no params to process + c->returnValue()->setString(KviOsInfo::version()); + return true; +} + +/* + @doc: system.osrelease + @type: + function + @title: + $system.osrelease + @short: + Returns the release of the operating system + @syntax: + <string> $system.osrelease() + @description: + Returns the release of the operating system.[br] +*/ + +static bool system_kvs_fnc_osrelease(KviKvsModuleFunctionCall *c) +{ + // no params to process + c->returnValue()->setString(KviOsInfo::release()); + return true; +} + +/* + @doc: system.osmachine + @type: + function + @title: + $system.osmachine + @short: + Returns the machine of the operating system + @syntax: + <string> $system.osmachine() + @description: + Returns the machine of the operating system.[br] +*/ + +static bool system_kvs_fnc_osmachine(KviKvsModuleFunctionCall *c) +{ + // no params to process + c->returnValue()->setString(KviOsInfo::machine()); + return true; +} + +/* + @doc: system.osnodename + @type: + function + @title: + $system.osnodename + @short: + Returns the nodename of the operating system + @syntax: + <string> $system.osnodename() + @description: + Returns the nodename of the operating system.[br] +*/ + +static bool system_kvs_fnc_osnodename(KviKvsModuleFunctionCall *c) +{ + // no params to process + c->returnValue()->setString(KviOsInfo::nodename()); + return true; +} + +/* + @doc: system.getenv + @keyterms: + Enviroinement variables + @type: + function + @title: + $system.getenv + @short: + Returns the value of an enviroinement variable + @syntax: + <string> $system.getenv(<variable:string>) + @description: + Returns the value of the enviroinement <variable>.[br] +*/ + +static bool system_kvs_fnc_getenv(KviKvsModuleFunctionCall *c) +{ + QString szVariable; + + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("variable",KVS_PT_NONEMPTYSTRING,0,szVariable) + KVSM_PARAMETERS_END(c) + + KviQCString szVar = szVariable.local8Bit(); +#ifdef COMPILE_ON_WINDOWS + QString env = getenv(szVar.data()); + QString def = __tr2qs("No environment variable found, please don't use the %% in the request"); + c->returnValue()->setString(env.isEmpty() ? QString::fromLocal8Bit(env) : QString::fromLocal8Bit(def)); +#else + char * b = kvi_getenv(szVar.data()); + c->returnValue()->setString(b ? QString::fromLocal8Bit(b) : QString::null); +#endif + return true; +} + +/* + @doc: system.clipboard + @keyterms: + Clipboard management + @type: + function + @title: + $system.clipboard + @short: + Returns the value of the system clipboard + @syntax: + <string> $system.clipboard() + @description: + Returns the current value of the system clipboard. + Please note that there are systems that have the concept + of "selection" (most notably X11) which is NOT the same as the clipboard. + See [fnc]$system.selection[/fnc](). + @seealso: + [fnc]$system.selection[/fnc], + [cmd]system.setClipboard[/cmd], + [cmd]system.setSelection[/cmd] +*/ + +static bool system_kvs_fnc_clipboard(KviKvsModuleFunctionCall *c) +{ + c->returnValue()->setString(g_pApp->clipboard()->text(QClipboard::Clipboard)); + return true; +} + + +/* + @doc: system.setClipboard + @type: + command + @title: + system.setClipboard + @keyterms: + Clipboard management + @short: + Sets the current system clipboard contents + @syntax: + system.setClipboard <data:string> + @description: + Sets the system clipboard contents to the string <data>. + Please note that there are systems that have the concept + of "selection" (most notably X11) which is NOT the same as the clipboard. + See [fnc]$system.selection[/fnc](). + @seealso: + [fnc]$system.selection[/fnc], + [fnc]$system.clipboard[/fnc], + [cmd]system.setSelection[/cmd] +*/ + +static bool system_kvs_cmd_setClipboard(KviKvsModuleCommandCall * c) +{ + QString szValue; + + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("data",KVS_PT_STRING,KVS_PF_OPTIONAL,szValue) + KVSM_PARAMETERS_END(c) + g_pApp->clipboard()->setText(szValue,QClipboard::Clipboard); + return true; +} + +/* + @doc: system.setSelection + @type: + command + @title: + system.setSelection + @keyterms: + Clipboard management + @short: + Sets the current system selection contents + @syntax: + system.setSelection <data:string> + @description: + Sets the system selection contents to the string <data>. + Please note that this command will work only on systems that have the concept + of "selection" (most notably X11) which is NOT the same as the clipboard. + @seealso: + [fnc]$system.selection[/fnc], + [fnc]$system.clipboard[/fnc], + [cmd]system.setClipboard[/cmd] +*/ + +static bool system_kvs_cmd_setSelection(KviKvsModuleCommandCall * c) +{ + QString szValue; + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("data",KVS_PT_STRING,KVS_PF_OPTIONAL,szValue) + KVSM_PARAMETERS_END(c) + g_pApp->clipboard()->setText(szValue,QClipboard::Selection); + return true; +} + +/* + @doc: system.selection + @keyterms: + Clipboard management + @type: + function + @title: + $system.selection + @short: + Returns the value of the system selection + @syntax: + <string> $system.selection() + @description: + Returns the current value of the system selection. + This function will work only on systems that have the concept + of "selection" (most notably X11) which is NOT the same as clipboard. + On other systems this function will always return an empty string. + See [fnc]$system.clipboard[/fnc](). + @seealso: + [fnc]$system.clipboard[/fnc], + [cmd]system.setClipboard[/cmd], + [cmd]system.setSelection[/cmd] +*/ + +static bool system_kvs_fnc_selection(KviKvsModuleFunctionCall *c) +{ + c->returnValue()->setString(g_pApp->clipboard()->text(QClipboard::Selection)); + return true; +} + + +/* + @doc: system.checkModule + @keyterms: + Module checking + @type: + function + @title: + $system.checkModule + @short: + Checks if a KVIrc module is loadable + @syntax: + <boolean> $system.checkModule(<module_name:string>) + @description: + Attempts to load the specified module and returns + $true if succesfull and $false otherwise. This can + be effectively used to test if a KVIrc exension module + is present on the system and can be loaded by the + KVIrc engine. +*/ + +static bool system_kvs_fnc_checkModule(KviKvsModuleFunctionCall *c) +{ + QString szModuleName; + + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("module_name",KVS_PT_STRING,0,szModuleName) + KVSM_PARAMETERS_END(c) + + c->returnValue()->setBoolean(g_pModuleManager->loadModule(szModuleName.utf8().data())); + return true; +} + + +/* + @doc: system.hostname + @keyterms: + System information + @type: + function + @title: + $system.hostname + @short: + Returns the hostname of the machine that KVIrc is running on + @syntax: + <string> $system.hostname() + @description: + Returns the hostname of the machine that KVIrc is running on.[br] +*/ + +static bool system_kvs_fnc_hostname(KviKvsModuleFunctionCall *c) +{ + // no params to process + c->returnValue()->setString(KviOsInfo::hostname()); + return true; +} + + +/* + @doc: system.dcop + @keyterms: + System information + @type: + function + @title: + $system.dcop + @short: + Performs a DCOP call + @syntax: + <variant> $system.dcop(<application:string>,<objectid:string>,<function:string>[,<parameter1:string>[,<parameter2:string>[,...]]]) + @description: + This function allows performing simple DCOP calls without executing + an external process. This feature is available ONLY when KDE support + is compiled in the executable: this means that this function is absolutely + non portable (don't use it in scripts that you're going to distribute). + <application> is the name of the application being called, <objectid> is the + identifier of the object called, <function> is the function to be executed + on the remote object and <parameter1>,<parameter2>,... is the list of + parameters to be passed. The <function> name must contain the + trailing parenthesis and parameter specification (see examples). + The parameters MUST be in the form "type=value" + where "type" is the C++ type of the parameter and value + is the string rappresentation of the parameter data. Currently + KVIrc supports only QString,KviQCString,bool,int and uint data types.[br] + The returned value is the string rappresentation of the returned + data if the return type is known, otherwise it is the name of the data type returned. + [br] + If the application name is prefixed with "?" then the call is performed in "remote test" + mode: no "remote" errors are printed and the function returns 1 if the call executed + succesfully and 0 if the call failed. This can be used with the very first + call to programmaticaly test if the remote application is running. + @examples: + [example] + echo $system.dcop("kdesktop","KBackgroundIface","currentWallpaper(int)","int=0") + echo $system.dcop("kdesktop","KScreensaverIface","lock()") + # we can also ignore the return value in several ways + %dummy = $system.dcop("kicker","kicker","showKMenu()") + $system.dcop("kdesktop","KScreensaverIface","save()") + $system.dcop("kicker","Panel","addBrowserButton(QString)","QString=/") + # runtime test if a call would work (i.e. , kicker is running at all, parameters are right etc...) + if($system.dcop("?kicker","kicker","showKMenu()"))echo "Can't make dcop calls to kicker!" + [/example] +*/ + +static bool system_kvs_fnc_dcop(KviKvsModuleFunctionCall *c) +{ + bool bTestMode = false; + + KviQCString szApp,szObj,szFun; + QStringList parms; + + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("application",KVS_PT_NONEMPTYCSTRING,0,szApp) + KVSM_PARAMETER("objectid",KVS_PT_NONEMPTYCSTRING,0,szObj) + KVSM_PARAMETER("function",KVS_PT_NONEMPTYCSTRING,0,szFun) + KVSM_PARAMETER("parameter_list",KVS_PT_STRINGLIST,KVS_PF_OPTIONAL,parms) + KVSM_PARAMETERS_END(c) + + if((szApp.data()) && (szApp.length() > 1)) + { + if(*(szApp.data()) == '?') + { + bTestMode = true; + szApp.remove(0,1); + } + } + +#ifdef COMPILE_KDE_SUPPORT + + QByteArray ba; + QDataStream ds(ba, IO_WriteOnly); + + for ( QStringList::Iterator it = parms.begin(); it != parms.end(); ++it ) + { + KviStr tmp = *it; + + if(tmp.isEmpty()) + { + c->warning(__tr2qs("Invalid DCOP parameter syntax")); + return false; + } + + KviStr szType = tmp.leftToFirst('=',false); + tmp.cutToFirst('=',true); + if(szType.isEmpty())szType = "int"; + bool bOk; + if(kvi_strEqualCI("int",szType.ptr()) || kvi_strEqualCI("long",szType.ptr())) + { + int iii = tmp.toInt(&bOk); + if(!bOk) + { + c->warning(__tr2qs("The specified parameter is not an integer")); + return false; + } + ds << iii; + } else if(kvi_strEqualCI("QString",szType.ptr())) + { + QString ddd = tmp.ptr(); + ds << ddd; + } else if(kvi_strEqualCI("KviQCString",szType.ptr())) + { + KviQCString qcs = tmp.ptr(); + ds << qcs; + } else if(kvi_strEqualCI("bool",szType.ptr())) + { + bool bbb = kvi_strEqualCI(tmp.ptr(),"true"); + ds << bbb; + } else if(kvi_strEqualCI("unsigned int",szType.ptr()) || kvi_strEqualCI("uint",szType.ptr()) || kvi_strEqualCI("Q_UINT32",szType.ptr())) + { + unsigned int uii = tmp.toUInt(&bOk); + if(!bOk) + { + c->warning(__tr2qs("The specified parameter is not an integer")); + return false; + } + ds << uii; + } else { + c->warning(__tr2qs("Unsupported DCOP parameter type %s"),tmp.ptr()); + return false; + } + } + + QByteArray rba; + KviQCString szRetType; + + bool bRet = g_pApp->dcopClient()->call(szApp,szObj,szFun,ba,szRetType,rba); + + if(!bRet) + { + if(!bTestMode) + c->warning(__tr2qs("DCOP call failed")); + c->returnValue()->setInteger(0); + } else { + if(bTestMode) + c->returnValue()->setInteger(1); + else { + QDataStream ret(rba, IO_ReadOnly); + if(szRetType == "bool") + { + bool bqw; + ret >> bqw; + c->returnValue()->setInteger(bqw ? 1 : 0); + } else if(szRetType == "QString") + { + QString szz; + ret >> szz; + c->returnValue()->setString(szz); + } else if(szRetType == "QCString") + { + KviQCString sss; + ret >> sss; + c->returnValue()->setString(sss.data()); + } else if((szRetType == "uint") || (szRetType == "unsigned int") || (szRetType == "Q_UINT32")) + { + unsigned int ui3; + ret >> ui3; + c->returnValue()->setInteger(ui3); + } else if((szRetType == "int") || (szRetType == "long")) + { + int iii; + ret >> iii; + c->returnValue()->setInteger(iii); + } else if(szRetType == "QCStringList") + { +#ifndef COMPILE_USE_QT4 + QCStringList csl; + ret >> csl; + KviKvsArray * arry = new KviKvsArray(); + int idx = 0; + for(QCStringList::Iterator iter = csl.begin();iter != csl.end();++iter) + { + arry->set(idx,new KviKvsVariant(QString(*iter))); + idx++; + } + c->returnValue()->setArray(arry); +#endif + } else if(szRetType == "QStringList") + { + QStringList csl; + ret >> csl; + KviKvsArray * arry = new KviKvsArray(); + int idx = 0; + for(QStringList::Iterator iter = csl.begin();iter != csl.end();++iter) + { + arry->set(idx,new KviKvsVariant(*iter)); + idx++; + } + c->returnValue()->setArray(arry); + } else { + c->returnValue()->setString(szRetType.data()); + } + } + } +#else + if(!bTestMode) + c->warning(__tr2qs("DCOP calls are available only when KDE support is compiled in")); + c->returnValue()->setInteger(0); +#endif + + return true; +} + + +/* + @doc: system.setenv + @type: + command + @title: + system.setenv + @keyterms: + Enviroinement variables + @short: + Sets an enviroinement variable + @syntax: + system.setenv <variable:string> [<value:string>] + @description: + Sets the enviroinement <variable> to the <value> string.[br] + If <value> is not given , the <variable> is unset.[br] + @seealso: + [fnc]$system.getenv[/fnc] +*/ + + +static bool system_kvs_cmd_setenv(KviKvsModuleCommandCall * c) +{ + QString szVariable,szValue; + + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("variable",KVS_PT_NONEMPTYSTRING,0,szVariable) + KVSM_PARAMETER("value",KVS_PT_STRING,KVS_PF_OPTIONAL,szValue) + KVSM_PARAMETERS_END(c) + + KviQCString szVar = szVariable.local8Bit(); + KviQCString szVal = szValue.local8Bit(); + + if(szVal.isEmpty())kvi_unsetenv(szVar.data()); + else + { +/*#ifdef COMPILE_ON_WINDOWS + QString Var,Val,VarAndVal; + Val = szVar.data(); + Var = szVal.data(); + VarAndVal = Var+"="+Val; + putenv(VarAndVal); +#else*/ // <-- this stuff is implicit in kvi_setenv: that's why we have the kvi_ version. + kvi_setenv(szVar.data(),szVal.data()); +/*#endif*/ + } + return true; +} + +/* + @doc: system.call + @keyterms: + call plugin + @type: + function + @title: + $system.call + @short: + Allows to call functions of a plugin + @syntax: + <string> $system.call(<plugin:string>, <function:string>[,<parameters:string>,...]) + @description: + This function allows you to call simple functions of "easyplugins" (dll/so) and + get the result of this function. The easyplugins have to be coded in a special way. + If you want to write your own easyplugins, have a look on the easyplugins documentation. + [br] + [br] + The function needs a minimum of 2 parameters. The others are optional and not limited.[br] + The first one is the complete name like "example.dll" or "example.so" + If you have a relative path or only the filename KVIrc looks for the easyplugins in the following dirs:[br] + In a subdir called "easyplugins" in the local and global KVIrc directory. + If you give an absolute path KVIrc will load it directly. + [br] + [br] + You are free to add more parameters, they will be given to the easyplugin.[br] + The easyplugin decides how much parameters you need in addition to the first 2. + [br] + [br] + [b]Warning: Only use easyplugins of known and trustable sources![/b] + @examples: + [example] + echo $system.call("my.dll","myfunction") + echo $system.call("my.dll","myfunction","parameter1","parameter2") + echo $system.call("c:/my.dll","myfunction") + echo $system.call("my.so","myfunction","parameter1") + [/example] +*/ + + +static bool system_kvs_fnc_plugin_call(KviKvsModuleFunctionCall *c) +{ + return g_pPluginManager->pluginCall(c); +} + +static bool system_module_init(KviModule * m) +{ + KVSM_REGISTER_FUNCTION(m,"ostype",system_kvs_fnc_ostype); + KVSM_REGISTER_FUNCTION(m,"osname",system_kvs_fnc_osname); + KVSM_REGISTER_FUNCTION(m,"osversion",system_kvs_fnc_osversion); + KVSM_REGISTER_FUNCTION(m,"osrelease",system_kvs_fnc_osrelease); + KVSM_REGISTER_FUNCTION(m,"osmachine",system_kvs_fnc_osmachine); + KVSM_REGISTER_FUNCTION(m,"osnodename",system_kvs_fnc_osnodename); + KVSM_REGISTER_FUNCTION(m,"getenv",system_kvs_fnc_getenv); + KVSM_REGISTER_FUNCTION(m,"hostname",system_kvs_fnc_hostname); + KVSM_REGISTER_FUNCTION(m,"dcop",system_kvs_fnc_dcop); + KVSM_REGISTER_FUNCTION(m,"clipboard",system_kvs_fnc_clipboard); + KVSM_REGISTER_FUNCTION(m,"selection",system_kvs_fnc_selection); + KVSM_REGISTER_FUNCTION(m,"checkModule",system_kvs_fnc_checkModule); + KVSM_REGISTER_FUNCTION(m,"call",system_kvs_fnc_plugin_call); + + KVSM_REGISTER_SIMPLE_COMMAND(m,"setenv",system_kvs_cmd_setenv); + KVSM_REGISTER_SIMPLE_COMMAND(m,"setClipboard",system_kvs_cmd_setClipboard); + KVSM_REGISTER_SIMPLE_COMMAND(m,"setSelection",system_kvs_cmd_setSelection); + + g_pPluginManager = new(KviPluginManager); + + return true; +} + +static bool system_module_cleanup(KviModule *m) +{ + g_pPluginManager->unloadAll(); + delete g_pPluginManager; + return true; +} + +static bool system_module_can_unload(KviModule *m) +{ + if(!g_pPluginManager->checkUnload()) return false; + return true; +} + +KVIRC_MODULE( + "System", // module name + "1.0.0", // module version + "Copyright (C) 2001 Szymon Stefanek (pragma at kvirc dot net)" \ + " (C) 2005 Tonino Imbesi (grifisx at barmes dot org)"\ + " (C) 2005 Alessandro Carbone (noldor at barmes dot org)",// author & (C) + "System informations module", + system_module_init, + system_module_can_unload, + 0, + system_module_cleanup +) |