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/sparser/kvi_sparser.cpp

151 lines
4.9 KiB

//=============================================================================
//
// File : kvi_sparser.cpp
// Creation date : Sun Jun 30 2000 03:25:17 by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 1999-2000 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__
#define _KVI_SPARSER_CPP_
#include "kvi_sparser.h"
#include "kvi_window.h"
#include "kvi_out.h"
#include "kvi_locale.h"
#include "kvi_ircsocket.h"
#include "kvi_options.h"
#include "kvi_kvs_eventmanager.h"
#include "kvi_kvs_eventtriggers.h"
#include "kvi_ircconnectionstatedata.h"
KviServerParser * g_pServerParser = 0;
KviServerParser::KviServerParser()
: TQObject(0,"server_parser")
{
}
KviServerParser::~KviServerParser()
{
}
void KviServerParser::parseMessage(const char * message,KviIrcConnection * pConnection)
{
if(*message != 0 )
{
KviIrcMessage msg(message,pConnection);
if(msg.isNumeric())
{
if(KviKvsEventManager::instance()->hasRawHandlers(msg.numeric()))
{
KviKvsVariantList parms;
parms.append(pConnection->decodeText(msg.safePrefix()));
parms.append(pConnection->decodeText(msg.command()));
for(KviStr * str = msg.firstParam();str;str = msg.nextParam())
parms.append(pConnection->console()->decodeText(str->ptr()));
if(KviKvsEventManager::instance()->triggerRaw(msg.numeric(),pConnection->console(),&parms))
msg.setHaltOutput();
}
messageParseProc proc = m_numericParseProcTable[msg.numeric()];
if(proc)
{
(this->*proc)(&msg);
if(!msg.unrecognized())return; // parsed
} else {
// we don't have a proc for this
// special handling of unknown RPL_WHOIS* messages
// if
// - we're in the middle of a RPL_WHOIS* sequence (i.e. have received a RPL_WHOIS* message since less than 10 seconds)
// - we have not received RPL_ENDOFWHOIS yet (the time of the last RPL_WHOIS* is reset to zero when a RPL_ENDOFWHOIS is received)
// - this message is unrecognized and looks like a RPL_WHOIS*
// then pass it to the WhoisOther handler.
//
// Thnx Elephantman :)
if(msg.paramCount() >= 3) // might look like :prefix RPL_WHOIS* <target> <nick> [?] :<something>
{
kvi_time_t tNow = kvi_unixTime();
if((tNow - pConnection->stateData()->lastReceivedWhoisReply()) < 10)
{
// we're in the middle of a RPL_WHOIS* sequence and haven't
// received a RPL_ENDOFWHOIS yet.
parseNumericWhoisOther(&msg);
if(!msg.unrecognized())return;
}
}
}
} else {
for(int i=0;m_literalParseProcTable[i].msgName;i++)
{
if(kvi_strEqualCS(m_literalParseProcTable[i].msgName,msg.command()))
{
(this->*(m_literalParseProcTable[i].proc))(&msg);
if(!msg.unrecognized())return; // parsed
}
}
if(KviKvsEventManager::instance()->hasAppHandlers(KviEvent_OnUnhandledLiteral))
{
KviKvsVariantList parms;
parms.append(pConnection->decodeText(msg.safePrefix()));
parms.append(pConnection->decodeText(msg.command()));
for(KviStr * str = msg.firstParam();str;str = msg.nextParam())
parms.append(pConnection->console()->decodeText(str->ptr()));
if(KviKvsEventManager::instance()->trigger(KviEvent_OnUnhandledLiteral,pConnection->console(),&parms))
msg.setHaltOutput();
}
}
// unhandled || unrecognized
if(!msg.haltOutput() && !_OUTPUT_MUTE)
{
TQString szWText = pConnection->decodeText(msg.allParams());
if(msg.unrecognized())
{
pConnection->console()->output(KVI_OUT_UNRECOGNIZED,
__tr2qs("[Server parser]: Encountered problems while parsing the following message:"));
pConnection->console()->output(KVI_OUT_UNRECOGNIZED,
__tr2qs("[Server parser]: [%s][%s] %Q"),msg.prefix(),msg.command(),&szWText);
pConnection->console()->output(KVI_OUT_UNRECOGNIZED,
__tr2qs("[Server parser]: %s"),m_szLastParserError.ptr());
} else {
// ignore spurious CRLF pairs (some servers send them a lot) unless we want PARANOID output
if((!msg.isEmpty()) || _OUTPUT_PARANOIC)
pConnection->console()->output(KVI_OUT_UNHANDLED,
"[%s][%s] %Q",msg.prefix(),msg.command(),&szWText);
}
}
}
}
#include "kvi_sparser.moc"