summaryrefslogtreecommitdiffstats
path: root/src/kvirc/kernel/kvi_userinput.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kvirc/kernel/kvi_userinput.cpp')
-rw-r--r--src/kvirc/kernel/kvi_userinput.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/kvirc/kernel/kvi_userinput.cpp b/src/kvirc/kernel/kvi_userinput.cpp
new file mode 100644
index 00000000..134d4256
--- /dev/null
+++ b/src/kvirc/kernel/kvi_userinput.cpp
@@ -0,0 +1,148 @@
+//=============================================================================
+//
+// File : kvi_userinput.cpp
+// Created on Sun 25 Sep 2005 05:27:57 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.
+//
+//=============================================================================
+
+#define __KVIRC__
+
+#include "kvi_userinput.h"
+#include "kvi_kvs_variantlist.h"
+#include "kvi_console.h"
+#include "kvi_kvs_script.h"
+#include "kvi_locale.h"
+#include "kvi_ircconnection.h"
+#include "kvi_ircconnectionuserinfo.h"
+#include "kvi_out.h"
+#include "kvi_options.h"
+#include "kvi_kvs_eventtriggers.h"
+
+namespace KviUserInput
+{
+ bool parse(QString &szData,KviWindow * pWindow,const QString &szContext,bool bUserFriendlyCommandline)
+ {
+ const QChar * b = KviQString::nullTerminatedArray(szData);
+ const QChar * c = b;
+ if(!c)return true; // empty
+
+ while(c->isSpace())c++;
+ if(!c->unicode())return true; // empty
+
+ if(c->unicode() == '\\')
+ {
+ c++;
+ if(c->unicode() != '/')c--;
+ } else {
+ if(c->unicode() == '/')
+ {
+ c++;
+ if(c->unicode() != '/')
+ {
+ szData.remove(0,c-b);
+ return parseCommand(szData,pWindow,szContext,bUserFriendlyCommandline);
+ } else {
+ // C++ comment, probably
+ c--;
+ }
+ }
+ }
+
+ if(KVS_TRIGGER_EVENT_1_HALTED(KviEvent_OnTextInput,pWindow,szData))
+ return true; // halted
+
+ if(c != b)szData.remove(0,c-b);
+ parseNonCommand(szData,pWindow);
+ return true;
+ }
+
+ bool parseCommand(const QString &szData,KviWindow * pWindow,const QString &szContext,bool bUserFriendlyCommandline)
+ {
+ if(bUserFriendlyCommandline)
+ {
+ static QString szUserFriendlyCommandlineContext(__tr2qs("commandline::userfriendly"));
+ QString szCmd=szData;
+ // escape any -$;\%(
+ szCmd.replace("\\","\\\\");
+ szCmd.replace("\"","\\\"");
+ szCmd.replace("$","\\$");
+ szCmd.replace("%","\\%");
+ szCmd.replace("(","\\(");
+ szCmd.replace(";","\\;");
+ szCmd.replace("-","\\-");
+ szCmd.replace("+","\\+");
+ KviKvsScript kvs(szContext.isEmpty() ? szUserFriendlyCommandlineContext : szContext,szCmd);
+ return (kvs.run(pWindow,0,0) != KviKvsScript::Error);
+ } else {
+ static QString szCommandlineContext(__tr2qs("commandline::kvs"));
+ KviKvsScript kvs(szContext.isEmpty() ? szCommandlineContext : szContext,szData);
+ return (kvs.run(pWindow,0,0/*,KviKvsScript::AssumeLocals*/) != KviKvsScript::Error);
+ }
+ }
+
+ void parseNonCommand(QString &szData,KviWindow * pWindow)
+ {
+ const QChar * aux = KviQString::nullTerminatedArray(szData);
+ const QChar * beg = aux;
+ if(!beg)return; // empty
+
+ while(aux->unicode())
+ {
+ while(aux->unicode() && (aux->unicode() != '\n'))aux++;
+ QString buf(beg,aux-beg);
+ if(aux->unicode() == '\n')aux++;
+ beg = aux;
+
+ if(buf.isEmpty())buf = " "; // avoid "No text to send" (d3vah)
+
+ switch(pWindow->type())
+ {
+ case KVI_WINDOW_TYPE_CONSOLE:
+ if(pWindow->connection())
+ {
+ KviQCString data = pWindow->connection()->encodeText(buf);
+ if(((KviConsole *)pWindow)->connection()->sendData(data.data()))
+ {
+ pWindow->output(KVI_OUT_RAW,"[RAW]: %Q",&buf);
+ return;
+ }
+ }
+ pWindow->output(KVI_OUT_PARSERERROR,__tr2qs("You are not connected to a server"));
+ break;
+ case KVI_WINDOW_TYPE_CHANNEL:
+ case KVI_WINDOW_TYPE_QUERY:
+ if(pWindow->connection())
+ {
+ if(KVI_OPTION_BOOL(KviOption_boolExitAwayOnInput))
+ if(pWindow->connection()->userInfo()->isAway())
+ parseCommand("back",pWindow->console());
+ }
+ pWindow->ownMessage(buf);
+ break;
+ case KVI_WINDOW_TYPE_DCCCHAT:
+ pWindow->ownMessage(buf);
+ break;
+ default:
+ // FIXME: Should pass the message somewhere ?.. a KviWindow handler ?
+ break;
+ }
+ }
+ }
+};