/icn/server.cpp
C++ | 263 lines | 230 code | 31 blank | 2 comment | 83 complexity | 499f0257262ea4bf11ba585777c34578 MD5 | raw file
- #include <QtGui>
- #include <QXmlStreamReader>
- #include "idea.h"
- #include "server.h"
- #define ICNET_AUTH "auth"
- #define ICNET_TEXT "text"
- #define ICNET_INTERNET "internet"
- #define ICNET_BANNER "banner"
- #define ICNET_END_DATE "end"
- #define ICNET_TARIF "tarif"
- #define ICNET_ALERT "alert"
- #define ICNET_SPEED "speed"
- #define ICNET_USED "used"
- #define ICNET_REMAIN "remain"
- #define ICNET_REFRESH "refresh"
- #define ICNET_ERROR "error"
- #define ICNET_OK "ok"
- #define ICNET_FAILED "failed"
- #define ICNET_DOUBLE "one ip 2 login"
- #define ICNET_BADTIME "bad time"
- #define ICNET_LOSS "loss"
- #define ICNET_AVERAGE "average"
- #define ICNET_DIFFERENT_IP "2 login from different IP"
- #define ICNET_BADIP "bad ip for this login"
- bool icnClient::readXICN (QXmlStreamReader &xml)
- {
- QString value;
- QXmlStreamReader::TokenType type;
- bool ok = false;
-
- while ((type = xml.readNext()) != QXmlStreamReader::Invalid && type != QXmlStreamReader::EndDocument) {
- if (xml.isStartElement()) {
- if (xml.name() == ICNET_AUTH) {
- value = xml.readElementText();
- if (QString::compare(value, QString(ICNET_OK), Qt::CaseInsensitive) == 0) {
- setStatus (true);
- }
- else {
- setStatus (false);
- }
- }
- else if (xml.name() == ICNET_INTERNET) {
- value = xml.readElementText();
- if (QString::compare(value, QString(ICNET_OK), Qt::CaseInsensitive) == 0) {
- setInetStatus (true);
- }
- else {
- setInetStatus (false);
- }
- }
- else if (xml.name() == ICNET_END_DATE) {
- value = xml.readElementText();
- setEnd(value);
- }
- else if (xml.name() == ICNET_REFRESH) {
- value = xml.readElementText();
- setRefreshTime(value.toULong(&ok));
- if (!ok) {
- setRefreshTime(0);
- }
- }
- else if (xml.name() == ICNET_BANNER) {
- value = xml.readElementText();
- setBanner(value);
- }
- else if (xml.name() == ICNET_ALERT) {
- value = xml.readElementText();
- setAlert(value);
- }
- else if (xml.name() == ICNET_TARIF) {
- value = xml.readElementText();
- setTarif(value);
- }
- else if (xml.name() == ICNET_SPEED) {
- value = xml.readElementText();
- setSpeed(value.toULong(&ok));
- if (!ok) {
- setSpeed(0);
- }
- }
- else if (xml.name() == ICNET_USED) {
- value = xml.readElementText();
- setUsed(value.toULongLong(&ok));
- if (!ok) {
- setUsed(0);
- }
- }
- else if (xml.name() == ICNET_REMAIN) {
- value = xml.readElementText();
- setRemain(value.toLongLong(&ok));
- if (!ok) {
- setRemain(0);
- }
- }
- else if (xml.name() == ICNET_ERROR) {
- value = xml.readElementText();
- setError(value);
- }
- else if (xml.name() == ICNET_LOSS) {
- value = xml.readElementText();
- loss = value.toDouble(&ok);
- if (!ok) {
- loss = 0;
- }
- }
- else if (xml.name() == ICNET_AVERAGE) {
- value = xml.readElementText();
- latency = value.toDouble(&ok);
- if (!ok) {
- latency = 0;
- }
- }
- }
- }
-
- if (xml.error() != QXmlStreamReader::NoError && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) {
- this->error = xml.errorString();
- return false;
- }
- return true;
- }
- bool icnClient::parseReply (void)
- {
- char buf[1024];
- int r;
- const QChar *pass_data;
- QXmlStreamReader::TokenType type;
- if (!socket.waitForReadyRead(timeout)) {
- this->error = QString::fromUtf8("Невозможно подключиться к серверу: истекло время ожидания ответа");
- return false;
- }
- emit authenticated();
- r = socket.read (buf, sizeof (buf));
- if (r <= 0) {
- this->error = QString::fromUtf8("Невозможно подключиться к серверу: ошибка чтения ответа сервера");
- return false;
- }
- idea_ks key;
- idea_user_key us_key;
- memset (us_key, '0', sizeof (us_key));
- unsigned int len = password.length();
- if (len > sizeof (idea_user_key))
- len = sizeof (idea_user_key);
- /* Ugly conversion */
- pass_data = password.data();
- for (r = 0; r < len; r ++) {
- *(((char *)us_key) + r) = pass_data->toAscii();
- pass_data ++;
- }
- idea_expand_key (us_key, key);
- idea_cblock in;
- idea_cblock out;
- memcpy (in, buf, sizeof (in));
- idea_crypt (in, out, key);
- for (unsigned int i = 0; i < sizeof (out) / sizeof (out [0]); i++) {
- out [i] = out [i] >> 8 | out [i] << 8;
- char brr [10];
- sprintf (brr, "%04x", out [i]);
- if (socket.write (brr, strlen(brr)) < 0) {
- this->error = QString::fromUtf8("Невозможно подключиться к серверу: ошибка записи в сокет");
- return false;
- }
- }
- if (socket.write("\n\r", 2) < 0) {
- this->error = QString::fromUtf8("Невозможно подключиться к серверу: ошибка записи в сокет");
- return false;
- }
- /* Now read XML data */
- if (!socket.waitForReadyRead(timeout)) {
- this->error = QString::fromUtf8("Невозможно подключиться к серверу: истекло время ожидания ответа");
- return false;
- }
- QXmlStreamReader xml;
- xml.setDevice(&socket);
- if ((type = xml.readNext()) != QXmlStreamReader::Invalid) {
- if (xml.documentVersion() == "1.0") {
- return readXICN(xml);
- }
- else {
- xml.raiseError(QObject::tr("The file is not an XICN version 1.0 file."));
- this->error = QString::fromUtf8("Невозможно подключиться к серверу: ошибка чтения xml");
- }
- }
- else {
- xml.raiseError(QObject::tr("Not an XML file."));
- this->error = QString::fromUtf8("Невозможно подключиться к серверу: ответ сервера не является xml потоком");
- }
- if (xml.error() != QXmlStreamReader::NoError) {
- this->error = QString::fromUtf8("Ошибка xml преобразования: ") + xml.errorString ();
- return false;
- }
-
- return true;
- }
- bool icnClient::sendCommand (char *line, int len)
- {
- socket.write (line, len);
- return parseReply ();
- }
- bool icnClient::connect (void)
- {
- char buf[1024];
- int r;
- bool res = false;
- socket.connectToHost (hostName, port);
- if (socket.waitForConnected(timeout) && socket.state () == QAbstractSocket::ConnectedState) {
- emit connected();
- r = snprintf (buf, sizeof(buf), "on%s|xml%s\n\r", login.toAscii().constData(),
- is_mstu ? ",mstu" : "");
- res = sendCommand (buf, r);
- }
- else {
- this->error = QString::fromUtf8("Невозможно подключиться к серверу: истекло время ожидания ответа");
- }
- socket.disconnectFromHost();
- return res;
- }
- bool icnClient::disconnect (void)
- {
- char buf[1024];
- int r;
- bool res = false;
- socket.connectToHost (hostName, port);
- if (socket.waitForConnected(timeout) && socket.state () == QAbstractSocket::ConnectedState) {
- emit connected();
- r = snprintf (buf, sizeof(buf), "of%s|xml%s\n\r", login.toAscii().constData(),
- is_mstu ? ",mstu" : "");
- res = sendCommand (buf, r);
- }
- else {
- this->error = QString::fromUtf8("Невозможно подключиться к серверу: истекло время ожидания ответа");
- }
- socket.disconnectFromHost();
- return res;
- }