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/kvirc/kernel/kvi_userinput.cpp

149 lines
4.5 KiB

//=============================================================================
//
// 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(TQString &szData,KviWindow * pWindow,const TQString &szContext,bool bUserFriendlyCommandline)
{
const TQChar * b = KviTQString::nullTerminatedArray(szData);
const TQChar * 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 TQString &szData,KviWindow * pWindow,const TQString &szContext,bool bUserFriendlyCommandline)
{
if(bUserFriendlyCommandline)
{
static TQString szUserFriendlyCommandlineContext(__tr2qs("commandline::userfriendly"));
TQString 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 TQString szCommandlineContext(__tr2qs("commandline::kvs"));
KviKvsScript kvs(szContext.isEmpty() ? szCommandlineContext : szContext,szData);
return (kvs.run(pWindow,0,0/*,KviKvsScript::AssumeLocals*/) != KviKvsScript::Error);
}
}
void parseNonCommand(TQString &szData,KviWindow * pWindow)
{
const TQChar * aux = KviTQString::nullTerminatedArray(szData);
const TQChar * beg = aux;
if(!beg)return; // empty
while(aux->unicode())
{
while(aux->unicode() && (aux->unicode() != '\n'))aux++;
TQString 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())
{
KviTQCString 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;
}
}
}
};