diff options
Diffstat (limited to 'src/modules/spaste/libkvispaste.cpp')
-rw-r--r-- | src/modules/spaste/libkvispaste.cpp | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/src/modules/spaste/libkvispaste.cpp b/src/modules/spaste/libkvispaste.cpp new file mode 100644 index 00000000..6b310324 --- /dev/null +++ b/src/modules/spaste/libkvispaste.cpp @@ -0,0 +1,346 @@ +// File : libkvispaste.cpp +// Creation date : Thu Dec 27 2002 17:13:12 GMT by Juanjo �varez +// +// This file is part of the KVirc irc client distribution +// Copyright (C) 2002 Juanjo �varez ([email protected]) +// Copyright (C) 2002 Szymon Stefanek ([email protected]) +// +// 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 "libkvispaste.h" +#include "controller.h" + +#include "kvi_module.h" + +#include "kvi_fileutils.h" +#include "kvi_app.h" +#include "kvi_locale.h" + +#include "kvi_console.h" +#include "kvi_options.h" +#include "kvi_out.h" + +#include <qfile.h> +#include <qclipboard.h> + +#ifndef COMPILE_ON_WINDOWS + #include <unistd.h> +#endif + +KviPointerList<SPasteController> * g_pControllerList = 0; +int ctrlId = 0; + +static SPasteController * spaste_find_controller(KviWindow * w) +{ + for(SPasteController * spc = g_pControllerList->first();spc;spc = g_pControllerList->next()) + { + if(spc->window() == w)return spc; + } + return 0; +} + +static KviWindow * spaste_kvs_find_window(QString &win, KviKvsModuleCommandCall * c) +{ + KviWindow * w; + if(!win.isEmpty())w = g_pApp->findWindow(win); + else w = c->window(); + if(!w) + { + c->warning(__tr("Window with ID '%Q' not found"),&win); + return 0; + } + if((w->type() == KVI_WINDOW_TYPE_CHANNEL) || (w->type() == KVI_WINDOW_TYPE_QUERY) || (w->type() == KVI_WINDOW_TYPE_DCCCHAT))return w; + c->warning(__tr2qs("The specified window (%Q) is not a channel/query/DCC chat"),&win); + return 0; +} +//------------------------------------------------- +/* + @doc: spaste.file + @type: + command + @title: + spaste.file + @short: + Sends the contents of a file to a window, with a delay between each line + @syntax: + spaste.file <filename:string> [window:string] + @description: + Sends the contents of a file to a conversation window doing a pause between each line. [br] + the optional window parameter must be a channel, query or DCC chat window, if [br] + no window is specified the text will be send to the current window. + @seealso: + [cmd]spaste.clipboard[/cmd], + [cmd]spaste.stop[/cmd], + [cmd]spaste.list[/cmd], + [cmd]spaste.setdelay[/cmd] +*/ +//------------------------------------------- +// spaste.file +//------------------------------------------- + +static bool spaste_kvs_cmd_file(KviKvsModuleCommandCall * c) +{ + QString szFile,szWindow; + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("file name",KVS_PT_STRING,0,szFile) + KVSM_PARAMETER("window",KVS_PT_STRING,KVS_PF_OPTIONAL,szWindow) + KVSM_PARAMETERS_END(c) + + KviWindow * window = spaste_kvs_find_window(szWindow,c); + if( (!window) || window->console()->isNotConnected())return false; + + if(szFile.isEmpty() || (!KviFileUtils::fileExists(szFile.ascii()))) + { + c->warning(__tr2qs("File not found or empty")); + return false; + } + + QFile tmp(szFile); + if(!tmp.open(IO_ReadOnly)) { + c->warning(__tr2qs("I can't open that file")); + return false; + } + tmp.close(); + + SPasteController * controller = spaste_find_controller(window); + if(!controller)controller = new SPasteController(window,++ctrlId); + if(!controller->pasteFileInit(szFile)) { + c->warning(__tr2qs("Could not paste file")); + return false; + } + return true; +} + + +/* + @doc: spaste.clipboard + @type: + command + @title: + spaste.clipboard + @short: + Sends the contents of the clipboard to a window, pausing between each line + @syntax: + spaste.clipboard [window:string] + @description: + Sends the contents of the clipboard to a conversation window, with a delay between each line. [br] + the optional window parameter must be a channel, query or DCC chat window. [br] + If no window is specified, the text will be sent to the current window. + @seealso: + [cmd]spaste.file[/cmd], + [cmd]spaste.stop[/cmd], + [cmd]spaste.list[/cmd], + [cmd]spaste.setdelay[/cmd] +*/ +//------------------------------------------------- +// spaste.clipboard +//------------------------------------------------- + +static bool spaste_kvs_cmd_clipboard(KviKvsModuleCommandCall * c) +{ + QString szWindow; + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("window",KVS_PT_STRING,KVS_PF_OPTIONAL,szWindow) + KVSM_PARAMETERS_END(c) + KviWindow * window = spaste_kvs_find_window(szWindow,c); + if( (!window) || window->console()->isNotConnected())return false; + + SPasteController * controller = spaste_find_controller(window); + if(!controller)controller = new SPasteController(window,++ctrlId); + controller->pasteClipboardInit(); + return true; +} + +/* + @doc: spaste.stop + @type: + command + @title: + spaste.stop + @short: + Stops one or more slow-paste process. + @syntax: + spaste.stop [-a] [id:integer] + @description: + This commands stop one or more slow-paste processes. It can operate in three ways. The first, [br] + without any parameter or switch, stops all slow-paste processes running in the same window [br] + as the command. The second, using the -a switch, stops all slow paste processes running [br] + on all windows. The third form, without the switch and specifying a numerical slow paste process ID [br] + (which you can obtain with the [cmd]spaste.list[/cmd] command), stops only that process ID. + @switches: + !sw: -a | --all + Stops all slow paste processes running + @seealso: + [cmd]spaste.clipboard[/cmd], + [cmd]spaste.file[/cmd], + [cmd]spaste.list[/cmd], + [cmd]spaste.setdelay[/cmd] + +*/ +//-------------------------------------------------- +// spaste.stop +//-------------------------------------------------- + +static bool spaste_kvs_cmd_stop(KviKvsModuleCommandCall * c) +{ + kvs_int_t iId=0; + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("delay",KVS_PT_UNSIGNEDINTEGER,KVS_PF_OPTIONAL,iId) + KVSM_PARAMETERS_END(c) + + if(c->hasSwitch('a',"all")) //Delete all spaste's + { + while(g_pControllerList->first()) delete g_pControllerList->first(); + return true; + } else { + KviPointerListIterator<SPasteController> it(*g_pControllerList); + SPasteController *item; + + if(!iId) //Delete all spaste's from the current window + { + if((c->window()->type() != KVI_WINDOW_TYPE_CHANNEL) && (c->window()->type() != KVI_WINDOW_TYPE_QUERY) && (c->window()->type() != KVI_WINDOW_TYPE_DCCCHAT)) + { + QString szWinId = c->window()->id(); + c->warning(__tr2qs("The specified window (%Q) is not a channel/query/dcc"),&szWinId); + return false; + } else { + while( (item = it.current()) != 0) + { + ++it; + if(kvi_strEqualCS(item->window()->id(),c->window()->id()))delete item; + } + } + } else //Delete the spaste with the given id + { + while( (item = it.current()) != 0) + { + ++it; + if(item->getId() == iId)delete item; + } + } + return true; + } +} + +/* + @doc: spaste.list + @type: + command + @title: + spaste.list + @short: + Lists all the running spaste processes. + @syntax: + spaste.list + @description: + This command will list in the window where it is executed all the current slow-paste [br] + processes, their identification numbers, and the windows where they are running. [br] + @seealso: + [cmd]spaste.clipboard[/cmd], + [cmd]spaste.file[/cmd], + [cmd]spaste.stop[/cmd], + [cmd]spaste.setdelay[/cmd] +*/ +//-------------------------------------------------- +// spaste.list +//-------------------------------------------------- + +static bool spaste_kvs_cmd_list(KviKvsModuleCommandCall * c) +{ + KviPointerListIterator<SPasteController> it(*g_pControllerList); + SPasteController *item; + + while( (item = it.current()) != 0) + { + ++it; + QString szWinId = item->window()->id(); + c->window()->output(KVI_OUT_NONE,__tr2qs("Slow-paste ID:%d Window:%Q"),item->getId(),&szWinId); + } + return true; +} + +/* + @doc: spaste.setdelay + @type: + command + @title: + spaste.setdelay + @short: + Sets the delay time in miliseconds for the spaste module command delay + @syntax: + spaste.setdelay <time_in_msecs:integer> + @description: + Sets the delay time in milliseconds for the spaste module command delay. + @seealso: + [cmd]spaste.clipboard[/cmd], + [cmd]spaste.file[/cmd], + [cmd]spaste.stop[/cmd], + [cmd]spaste.list[/cmd] +*/ +//------------------------------------------------- +// spaste.setdelay +//------------------------------------------------- + + +static bool spaste_kvs_cmd_setdelay(KviKvsModuleCommandCall * c) +{ + kvs_int_t delay; + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("delay",KVS_PT_INTEGER,0,delay) + KVSM_PARAMETERS_END(c) + KVI_OPTION_UINT(KviOption_uintPasteDelay) = delay; + return true; +} + +//------------------------------------------------- +static bool spaste_module_init(KviModule * m) +{ + g_pControllerList = new KviPointerList<SPasteController>; + g_pControllerList->setAutoDelete(false); + + KVSM_REGISTER_SIMPLE_COMMAND(m,"file",spaste_kvs_cmd_file); + KVSM_REGISTER_SIMPLE_COMMAND(m,"clipboard",spaste_kvs_cmd_clipboard); + KVSM_REGISTER_SIMPLE_COMMAND(m,"setdelay",spaste_kvs_cmd_setdelay); + KVSM_REGISTER_SIMPLE_COMMAND(m,"stop",spaste_kvs_cmd_stop); + KVSM_REGISTER_SIMPLE_COMMAND(m,"list",spaste_kvs_cmd_list); + return true; +} +//------------------------------------------------- +static bool spaste_module_cleanup(KviModule *m) +{ + while(g_pControllerList->first()) delete g_pControllerList->first(); + delete g_pControllerList; + g_pControllerList = 0; + + return true; +} +//------------------------------------------------- +static bool spaste_module_can_unload(KviModule *m) +{ + return (g_pControllerList->isEmpty()); +} +//------------------------------------------------- +KVIRC_MODULE( + "SPaste", // module name + "1.0.0", // module version + " (C) 2002 Juanjo Alvarez ([email protected])", // author & (C) + "Delayed paste commands", + spaste_module_init, + spaste_module_can_unload, + 0, + spaste_module_cleanup +) |