RetroShare/plugins/i2pmessenger_plugin/src/I2PSamMessageAnalyser.cpp

252 lines
7.9 KiB
C++
Raw Normal View History

/***************************************************************************
* Copyright (C) 2008 by normal *
* normal@Desktop2 *
* *
* 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 option) 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., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "I2PSamMessageAnalyser.h"
I2PSamMessageAnalyser::I2PSamMessageAnalyser()
{
//Constructor
}
const SAM_MESSAGE I2PSamMessageAnalyser::Analyse(QString Message)
{
using namespace SAM_Message_Types;
SAM_MESSAGE t;
QStringList list =Message.split(" ",QString::SkipEmptyParts);
if((list[0]=="STREAM") && (list[1]=="RECEIVED")){
t.type=STREAM_RECEIVED;
//get ID
QStringList temp=list[2].split("=");
QString sID=temp[1];
t.ID=QStringToQint32(sID);
//get Size
temp= list[3].split("=");
t.Size=temp[1].remove("\n");
}
else if((list[0].contains("STREAM")==true) && (list[1].contains("READY_TO_SEND")==true)){
t.type=STREAM_READY_TO_SEND;
//GET ID
QStringList temp=list[2].split("=");
QString sID=temp[1].remove("\n");
t.ID=QStringToQint32(sID);
}
else if((list[0]=="HELLO") && (list[1]=="REPLY")){
t.type=HELLO_REPLAY;
if(list[2].contains("RESULT=OK")==true) t.result=OK;
else if(list[2].contains("RESULT=NOVERSION")==true)t.result=NOVERSION;
}
else if((list[0].contains("SESSION")==true) && (list[1].contains("STATUS")==true)){
t.type=SESSION_STATUS;
//Get Result
if(list[2].contains("RESULT=OK",Qt::CaseInsensitive))t.result=OK;
else if(list[2].contains("RESULT=DUPLICATED_DEST",Qt::CaseInsensitive))t.result=DUPLICATED_DEST;
else if(list[2].contains("RESULT=I2P_ERROR",Qt::CaseInsensitive))t.result=I2P_ERROR;
else if(list[2].contains("RESULT=INVALID_KEY",Qt::CaseInsensitive))t.result=INVALID_KEY;
else
t.type=ERROR_IN_ANALYSE;
//----------------
//Get Destination
QStringList temp=list[3].split("=");
t.Destination=temp[1].remove("\n");
//----------------
//Get Message
if(Message.contains("MESSAGE=",Qt::CaseInsensitive)){
t.Message=Message.mid(Message.indexOf("MESSAGE=")+8);
t.Message.remove("\n");
}
//----------------
}
else if((list[0].contains("STREAM")==true) && (list[1].contains("STATUS")==true)){
t.type=STREAM_STATUS;
//Get Result
if(list[2].contains("RESULT=OK",Qt::CaseInsensitive))t.result=OK;
else if(list[2].contains("RESULT=CANT_REACH_PEER",Qt::CaseInsensitive))t.result=CANT_REACH_PEER;
else if(list[2].contains("RESULT=I2P_ERROR",Qt::CaseInsensitive))t.result=I2P_ERROR;
else if(list[2].contains("RESULT=INVALID_KEY",Qt::CaseInsensitive))t.result=INVALID_KEY;
else if(list[2].contains("RESULT=TIMEOUT",Qt::CaseInsensitive))t.result=TIMEOUT;
else
{
t.type=ERROR_IN_ANALYSE;
return t;
}
//----------------
//Get ID
QStringList temp=list[3].split("=");
QString sID=temp[1].remove("\n");
t.ID=QStringToQint32(sID);
//----------------
//Get Message
if(Message.contains("MESSAGE=",Qt::CaseInsensitive)){
t.Message=Message.mid(Message.indexOf("MESSAGE=")+8);
t.Message.remove("\n");
}
//----------------
}
else if((list[0].contains("STREAM")==true) && (list[1].contains("CONNECTED")==true)){
t.type=STREAM_CONNECTED;
QStringList temp=list[2].split("=");
QString sID;
t.Destination=temp[1];
temp=list[3].split("=");
sID=temp[1].remove("\n");
t.ID=QStringToQint32(sID);
}
else if((list[0].contains("STREAM")==true) && (list[1].contains("SEND")==true)){
t.type=STREAM_SEND;
//get ID
QStringList temp=list[2].split("=");
QString sID=temp[1];
t.ID=QStringToQint32(sID);
//Get Result
if(list[3].contains("RESULT=OK",Qt::CaseInsensitive))t.result=OK;
else if(list[2].contains("RESULT=FAILED",Qt::CaseInsensitive))t.result=FAILED;
//get STATE
if(list[4].contains("STATE=BUFFER_FULL",Qt::CaseInsensitive))t.state=BUFFER_FULL;
else if(list[4].contains("STATE=READY",Qt::CaseInsensitive))t.state=READY;
}
else if((list[0].contains("STREAM")==true) && (list[1].contains("CLOSED")==true)){
t.type=STREAM_CLOSED;
//Get RESULT
if(list[2].contains("RESULT",Qt::CaseInsensitive))
{
if(list[2].contains("RESULT=OK",Qt::CaseInsensitive))t.result=OK;
else if(list[2].contains("RESULT=CANT_REACH_PEER",Qt::CaseInsensitive))t.result=CANT_REACH_PEER;
else if(list[2].contains("RESULT=I2P_ERROR",Qt::CaseInsensitive))t.result=I2P_ERROR;
else if(list[2].contains("RESULT=PEER_NOT_FOUND",Qt::CaseInsensitive))t.result=PEER_NOT_FOUND;
else if(list[2].contains("RESULT=TIMEOUT",Qt::CaseInsensitive))t.result=TIMEOUT;
else{
t.type=ERROR_IN_ANALYSE;
return t;
}
//Get ID
QStringList temp=list[3].split("=");
QString sID=temp[1];
t.ID=QStringToQint32(sID);
}
else
{
if(list[3].contains("RESULT=OK",Qt::CaseInsensitive))t.result=OK;
else if(list[3].contains("RESULT=CANT_REACH_PEER",Qt::CaseInsensitive))t.result=CANT_REACH_PEER;
else if(list[3].contains("RESULT=I2P_ERROR",Qt::CaseInsensitive))t.result=I2P_ERROR;
else if(list[3].contains("RESULT=PEER_NOT_FOUND",Qt::CaseInsensitive))t.result=PEER_NOT_FOUND;
else if(list[3].contains("RESULT=TIMEOUT",Qt::CaseInsensitive))t.result=TIMEOUT;
else{
t.type=ERROR_IN_ANALYSE;
return t;
}
//Get ID
QStringList temp=list[2].split("=");
QString sID=temp[1];
t.ID=QStringToQint32(sID);
}
//----------------
//Get Message
if(Message.contains("MESSAGE=",Qt::CaseInsensitive)){
t.Message=Message.mid(Message.indexOf("MESSAGE=")+8);
t.Message.remove("\n");
}
//----------------
}
else if((list[0].contains("NAMING")==true) && (list[1].contains("REPLY")==true)){
t.type=NAMING_REPLY;
//get Result
if(list[2].contains("RESULT=OK",Qt::CaseInsensitive))t.result=OK;
else if(list[2].contains("RESULT=INVALID_KEY",Qt::CaseInsensitive))t.result=INVALID_KEY;
else if(list[2].contains("RESULT=KEY_NOT_FOUND",Qt::CaseInsensitive))t.result=KEY_NOT_FOUND;
else{
t.type=ERROR_IN_ANALYSE;
return t;
}
//get Name
QStringList temp=list[3].split("=");
t.Name=temp[1].remove("\n");
//get Value
if(list.count()-1>=4){
QStringList temp=list[4].split("=");
t.Value=temp[1].remove("\n");
}
//Get Message
if(Message.contains("MESSAGE=",Qt::CaseInsensitive)){
t.Message=Message.mid(Message.indexOf("MESSAGE=")+8);
t.Message.remove("\n");
}
}
else{
t.type=ERROR_IN_ANALYSE;
}
return t;
}
qint32 I2PSamMessageAnalyser::QStringToQint32(QString value)
{
bool OK=false;
qint32 iValue =value.toInt ( &OK,10 );
if(OK==false)
{
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Warning);
msgBox.setText("I2PSamMessageAnalyser");
msgBox.setInformativeText("cant parse value: "+value );
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.setDefaultButton(QMessageBox::Ok);
msgBox.exec();
}
return iValue;
}