summaryrefslogtreecommitdiffstats
path: root/src/kvirc/sparser/kvi_ircmessage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kvirc/sparser/kvi_ircmessage.cpp')
-rw-r--r--src/kvirc/sparser/kvi_ircmessage.cpp179
1 files changed, 179 insertions, 0 deletions
diff --git a/src/kvirc/sparser/kvi_ircmessage.cpp b/src/kvirc/sparser/kvi_ircmessage.cpp
new file mode 100644
index 00000000..512f03e5
--- /dev/null
+++ b/src/kvirc/sparser/kvi_ircmessage.cpp
@@ -0,0 +1,179 @@
+//=============================================================================
+//
+// File : kvi_ircmessage.cpp
+// Creation date : Fri Aug 2 23:08:57 2002 GMT by Szymon Stefanek
+//
+// This file is part of the KVirc irc client distribution
+// Copyright (C) 2002 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_ircmessage.h"
+#include "kvi_ircconnection.h"
+#include "kvi_console.h"
+
+KviIrcMessage::KviIrcMessage(const char * message,KviIrcConnection * pConnection)
+{
+ m_pConnection = pConnection;
+ m_pConsole = pConnection->console();
+ m_iFlags = 0;
+
+ const char * aux;
+ m_ptr = message;
+
+ m_pParams = new KviPointerList<KviStr>;
+ m_pParams->setAutoDelete(true);
+
+ //m_pcParams = new KviPointerList<QCString>;
+ //m_pcParams->setAutoDelete(true);
+
+ while(*m_ptr == ' ')++m_ptr;
+ const char * allParams = m_ptr; // just to be sure
+ if(*m_ptr)
+ {
+ if(*m_ptr == ':')
+ {
+ aux = ++m_ptr;
+ while(*m_ptr && (*m_ptr != ' '))++m_ptr;
+ m_szPrefix.extractFromString(aux,m_ptr);
+ while(*m_ptr == ' ')++m_ptr;
+ }
+ aux = m_ptr;
+ while(*m_ptr && (*m_ptr != ' '))++m_ptr;
+ m_szCommand.extractFromString(aux,m_ptr);
+ while(*m_ptr == ' ')++m_ptr;
+ allParams = m_ptr;
+ while(*m_ptr)
+ {
+ if(*m_ptr == ':')
+ {
+ ++m_ptr;
+ m_pParams->append(new KviStr(m_ptr));
+ //m_pcParams->append(new QCString(m_ptr));
+ break; // this was the last
+ } else {
+ aux = m_ptr;
+ while(*m_ptr && (*m_ptr != ' '))++m_ptr;
+ m_pParams->append(new KviStr(aux,m_ptr));
+ //m_pcParams->append(new QCString(KviStr(aux,m_ptr).ptr()));
+ while(*m_ptr == ' ')++m_ptr;
+ }
+ }
+ }
+ m_ptr = allParams;
+
+ m_iNumericCommand = (*m_szCommand.ptr() - '0') * 100;
+
+ if((m_szCommand.len() == 3) && (m_iNumericCommand <= 900) && (m_iNumericCommand >= 0))
+ {
+ aux = m_szCommand.ptr();
+ aux++;
+ if((*aux >= '0') && (*aux <= '9'))
+ {
+ m_iNumericCommand += (*aux - '0') * 10;
+ aux++;
+ if((*aux >= '0') && (*aux <= '9'))
+ {
+ m_iNumericCommand += (*aux - '0');
+ } else {
+ m_iNumericCommand = -1;
+ m_szCommand.toUpper();
+ }
+ } else {
+ m_iNumericCommand = -1;
+ m_szCommand.toUpper();
+ }
+ } else {
+ m_iNumericCommand = -1;
+ m_szCommand.toUpper();
+ }
+ //m_SafeTrailingString=QCString(m_pParams->last()->ptr());
+}
+
+KviIrcMessage::~KviIrcMessage()
+{
+ delete m_pParams;
+}
+
+void KviIrcMessage::decodeAndSplitMask(char * b,QString &szNick,QString &szUser,QString &szHost)
+{
+ static QString szWild("*");
+ char * p = b;
+
+ while(*p && *p != '!')p++;
+ if(*p)
+ {
+ if(p != b)
+ {
+ *p = 0;
+ szNick = m_pConnection->decodeText(b);
+ *p = '!';
+ } else {
+ szNick = szWild; // ???
+ }
+ } else {
+ if(p != b)szNick = m_pConnection->decodeText(b);
+ else szNick = szWild; // ???
+ szUser = szWild;
+ szHost = szWild;
+ return;
+ }
+ p++;
+ b = p;
+ while(*p && *p != '@')p++;
+ if(*p)
+ {
+ if(p != b)
+ {
+ *p = 0;
+ szUser = m_pConnection->decodeText(b);
+ *p = '@';
+ } else {
+ szUser = szWild; // ???
+ }
+ } else {
+ if(p != b)szUser = m_pConnection->decodeText(b);
+ else szUser = szWild; // ???
+ szHost = szWild;
+ return;
+ }
+ p++;
+ szHost = p; // hostnames are NOT encoded (at the moment...)
+
+}
+
+void KviIrcMessage::decodeAndSplitPrefix(QString &szNick,QString &szUser,QString &szHost)
+{
+ char * b;
+ if(m_szPrefix.hasData())b = m_szPrefix.ptr();
+ else {
+ m_szPrefix = connection()->currentServerName();
+ b = m_szPrefix.ptr();
+ }
+ decodeAndSplitMask(b,szNick,szUser,szHost);
+}
+
+
+const char * KviIrcMessage::safePrefix()
+{
+ if(m_szPrefix.hasData())return m_szPrefix.ptr();
+ m_szPrefix = connection()->currentServerName();
+ return m_szPrefix.ptr();
+}
+