PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/icn/server.cpp

https://bitbucket.org/vstakhov/icnqt
C++ | 263 lines | 230 code | 31 blank | 2 comment | 83 complexity | 499f0257262ea4bf11ba585777c34578 MD5 | raw file
  1. #include <QtGui>
  2. #include <QXmlStreamReader>
  3. #include "idea.h"
  4. #include "server.h"
  5. #define ICNET_AUTH "auth"
  6. #define ICNET_TEXT "text"
  7. #define ICNET_INTERNET "internet"
  8. #define ICNET_BANNER "banner"
  9. #define ICNET_END_DATE "end"
  10. #define ICNET_TARIF "tarif"
  11. #define ICNET_ALERT "alert"
  12. #define ICNET_SPEED "speed"
  13. #define ICNET_USED "used"
  14. #define ICNET_REMAIN "remain"
  15. #define ICNET_REFRESH "refresh"
  16. #define ICNET_ERROR "error"
  17. #define ICNET_OK "ok"
  18. #define ICNET_FAILED "failed"
  19. #define ICNET_DOUBLE "one ip 2 login"
  20. #define ICNET_BADTIME "bad time"
  21. #define ICNET_LOSS "loss"
  22. #define ICNET_AVERAGE "average"
  23. #define ICNET_DIFFERENT_IP "2 login from different IP"
  24. #define ICNET_BADIP "bad ip for this login"
  25. bool icnClient::readXICN (QXmlStreamReader &xml)
  26. {
  27. QString value;
  28. QXmlStreamReader::TokenType type;
  29. bool ok = false;
  30. while ((type = xml.readNext()) != QXmlStreamReader::Invalid && type != QXmlStreamReader::EndDocument) {
  31. if (xml.isStartElement()) {
  32. if (xml.name() == ICNET_AUTH) {
  33. value = xml.readElementText();
  34. if (QString::compare(value, QString(ICNET_OK), Qt::CaseInsensitive) == 0) {
  35. setStatus (true);
  36. }
  37. else {
  38. setStatus (false);
  39. }
  40. }
  41. else if (xml.name() == ICNET_INTERNET) {
  42. value = xml.readElementText();
  43. if (QString::compare(value, QString(ICNET_OK), Qt::CaseInsensitive) == 0) {
  44. setInetStatus (true);
  45. }
  46. else {
  47. setInetStatus (false);
  48. }
  49. }
  50. else if (xml.name() == ICNET_END_DATE) {
  51. value = xml.readElementText();
  52. setEnd(value);
  53. }
  54. else if (xml.name() == ICNET_REFRESH) {
  55. value = xml.readElementText();
  56. setRefreshTime(value.toULong(&ok));
  57. if (!ok) {
  58. setRefreshTime(0);
  59. }
  60. }
  61. else if (xml.name() == ICNET_BANNER) {
  62. value = xml.readElementText();
  63. setBanner(value);
  64. }
  65. else if (xml.name() == ICNET_ALERT) {
  66. value = xml.readElementText();
  67. setAlert(value);
  68. }
  69. else if (xml.name() == ICNET_TARIF) {
  70. value = xml.readElementText();
  71. setTarif(value);
  72. }
  73. else if (xml.name() == ICNET_SPEED) {
  74. value = xml.readElementText();
  75. setSpeed(value.toULong(&ok));
  76. if (!ok) {
  77. setSpeed(0);
  78. }
  79. }
  80. else if (xml.name() == ICNET_USED) {
  81. value = xml.readElementText();
  82. setUsed(value.toULongLong(&ok));
  83. if (!ok) {
  84. setUsed(0);
  85. }
  86. }
  87. else if (xml.name() == ICNET_REMAIN) {
  88. value = xml.readElementText();
  89. setRemain(value.toLongLong(&ok));
  90. if (!ok) {
  91. setRemain(0);
  92. }
  93. }
  94. else if (xml.name() == ICNET_ERROR) {
  95. value = xml.readElementText();
  96. setError(value);
  97. }
  98. else if (xml.name() == ICNET_LOSS) {
  99. value = xml.readElementText();
  100. loss = value.toDouble(&ok);
  101. if (!ok) {
  102. loss = 0;
  103. }
  104. }
  105. else if (xml.name() == ICNET_AVERAGE) {
  106. value = xml.readElementText();
  107. latency = value.toDouble(&ok);
  108. if (!ok) {
  109. latency = 0;
  110. }
  111. }
  112. }
  113. }
  114. if (xml.error() != QXmlStreamReader::NoError && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) {
  115. this->error = xml.errorString();
  116. return false;
  117. }
  118. return true;
  119. }
  120. bool icnClient::parseReply (void)
  121. {
  122. char buf[1024];
  123. int r;
  124. const QChar *pass_data;
  125. QXmlStreamReader::TokenType type;
  126. if (!socket.waitForReadyRead(timeout)) {
  127. this->error = QString::fromUtf8("Невозможно подключиться к серверу: истекло время ожидания ответа");
  128. return false;
  129. }
  130. emit authenticated();
  131. r = socket.read (buf, sizeof (buf));
  132. if (r <= 0) {
  133. this->error = QString::fromUtf8("Невозможно подключиться к серверу: ошибка чтения ответа сервера");
  134. return false;
  135. }
  136. idea_ks key;
  137. idea_user_key us_key;
  138. memset (us_key, '0', sizeof (us_key));
  139. unsigned int len = password.length();
  140. if (len > sizeof (idea_user_key))
  141. len = sizeof (idea_user_key);
  142. /* Ugly conversion */
  143. pass_data = password.data();
  144. for (r = 0; r < len; r ++) {
  145. *(((char *)us_key) + r) = pass_data->toAscii();
  146. pass_data ++;
  147. }
  148. idea_expand_key (us_key, key);
  149. idea_cblock in;
  150. idea_cblock out;
  151. memcpy (in, buf, sizeof (in));
  152. idea_crypt (in, out, key);
  153. for (unsigned int i = 0; i < sizeof (out) / sizeof (out [0]); i++) {
  154. out [i] = out [i] >> 8 | out [i] << 8;
  155. char brr [10];
  156. sprintf (brr, "%04x", out [i]);
  157. if (socket.write (brr, strlen(brr)) < 0) {
  158. this->error = QString::fromUtf8("Невозможно подключиться к серверу: ошибка записи в сокет");
  159. return false;
  160. }
  161. }
  162. if (socket.write("\n\r", 2) < 0) {
  163. this->error = QString::fromUtf8("Невозможно подключиться к серверу: ошибка записи в сокет");
  164. return false;
  165. }
  166. /* Now read XML data */
  167. if (!socket.waitForReadyRead(timeout)) {
  168. this->error = QString::fromUtf8("Невозможно подключиться к серверу: истекло время ожидания ответа");
  169. return false;
  170. }
  171. QXmlStreamReader xml;
  172. xml.setDevice(&socket);
  173. if ((type = xml.readNext()) != QXmlStreamReader::Invalid) {
  174. if (xml.documentVersion() == "1.0") {
  175. return readXICN(xml);
  176. }
  177. else {
  178. xml.raiseError(QObject::tr("The file is not an XICN version 1.0 file."));
  179. this->error = QString::fromUtf8("Невозможно подключиться к серверу: ошибка чтения xml");
  180. }
  181. }
  182. else {
  183. xml.raiseError(QObject::tr("Not an XML file."));
  184. this->error = QString::fromUtf8("Невозможно подключиться к серверу: ответ сервера не является xml потоком");
  185. }
  186. if (xml.error() != QXmlStreamReader::NoError) {
  187. this->error = QString::fromUtf8("Ошибка xml преобразования: ") + xml.errorString ();
  188. return false;
  189. }
  190. return true;
  191. }
  192. bool icnClient::sendCommand (char *line, int len)
  193. {
  194. socket.write (line, len);
  195. return parseReply ();
  196. }
  197. bool icnClient::connect (void)
  198. {
  199. char buf[1024];
  200. int r;
  201. bool res = false;
  202. socket.connectToHost (hostName, port);
  203. if (socket.waitForConnected(timeout) && socket.state () == QAbstractSocket::ConnectedState) {
  204. emit connected();
  205. r = snprintf (buf, sizeof(buf), "on%s|xml%s\n\r", login.toAscii().constData(),
  206. is_mstu ? ",mstu" : "");
  207. res = sendCommand (buf, r);
  208. }
  209. else {
  210. this->error = QString::fromUtf8("Невозможно подключиться к серверу: истекло время ожидания ответа");
  211. }
  212. socket.disconnectFromHost();
  213. return res;
  214. }
  215. bool icnClient::disconnect (void)
  216. {
  217. char buf[1024];
  218. int r;
  219. bool res = false;
  220. socket.connectToHost (hostName, port);
  221. if (socket.waitForConnected(timeout) && socket.state () == QAbstractSocket::ConnectedState) {
  222. emit connected();
  223. r = snprintf (buf, sizeof(buf), "of%s|xml%s\n\r", login.toAscii().constData(),
  224. is_mstu ? ",mstu" : "");
  225. res = sendCommand (buf, r);
  226. }
  227. else {
  228. this->error = QString::fromUtf8("Невозможно подключиться к серверу: истекло время ожидания ответа");
  229. }
  230. socket.disconnectFromHost();
  231. return res;
  232. }