FactoryClient.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "FactoryClient.h"
  2. using namespace Network;
  3. FactoryClient::FactoryClient()
  4. {
  5. client = 0;
  6. background = 0;
  7. foreground = 0;
  8. backgroundReader = 0;
  9. foregroundReader = 0;
  10. bgReaderUsage = 0;
  11. fgReaderUsage = 0;
  12. }
  13. FactoryClient::~FactoryClient()
  14. {
  15. if (client)
  16. disconnect();
  17. }
  18. bool FactoryClient::connect(Text ip, short port, int accountId, Text secret)
  19. {
  20. if (client)
  21. disconnect();
  22. client = new SSLKlient();
  23. if (!client->verbinde(port, ip))
  24. return false;
  25. if (!client->sende("\1", 1))
  26. return false;
  27. if (!client->sende((char*)&accountId, 4))
  28. return false;
  29. unsigned char len = (unsigned char)secret.getLength();
  30. if (!client->sende((char*)&len, 1))
  31. return false;
  32. if (!client->sende(secret, len))
  33. return false;
  34. char result = 0;
  35. if (!client->getNachricht(&result, 1) || result != 1)
  36. return false;
  37. int keyLen;
  38. if (!client->getNachricht((char*)&keyLen, 4))
  39. return false;
  40. char* key = new char[keyLen];
  41. if (!client->getNachricht(key, keyLen))
  42. return false;
  43. int p;
  44. if (!client->getNachricht((char*)&p, 4))
  45. return false;
  46. foreground = new Klient();
  47. if (!foreground->verbinde(p, ip))
  48. return false;
  49. unsigned short l = (unsigned short)keyLen;
  50. if (!foreground->sende((char*)&l, 2))
  51. return false;
  52. if (!foreground->sende(key, keyLen))
  53. return false;
  54. bool bg = 0;
  55. if (!foreground->sende((char*)&bg, 1))
  56. return false;
  57. foregroundReader = new NetworkReader(foreground);
  58. background = new Klient();
  59. if (!background->verbinde(p, ip))
  60. return false;
  61. if (!background->sende((char*)&l, 2))
  62. return false;
  63. if (!background->sende(key, keyLen))
  64. return false;
  65. bg = 1;
  66. if (!background->sende((char*)&bg, 1))
  67. return false;
  68. backgroundReader = new NetworkReader(background);
  69. client->trenne();
  70. return true;
  71. }
  72. void FactoryClient::disconnect()
  73. {
  74. if (client)
  75. {
  76. NetworkReader* fgReader = foregroundReader;
  77. NetworkReader* bgReader = backgroundReader;
  78. backgroundReader = 0;
  79. foregroundReader = 0;
  80. if (foreground)
  81. foreground->trenne();
  82. if (background)
  83. background->trenne();
  84. while (fgReaderUsage > 0 || bgReaderUsage > 0)
  85. Sleep(100);
  86. delete fgReader;
  87. delete bgReader;
  88. client->release();
  89. client = 0;
  90. if (foreground)
  91. foreground->release();
  92. foreground = 0;
  93. if (background)
  94. background->release();
  95. background = 0;
  96. }
  97. }
  98. NetworkReader* FactoryClient::getNextForegroundMessage()
  99. {
  100. fgReaderUsage++;
  101. if (!foreground)
  102. return 0;
  103. if (!foreground->hatNachricht(0))
  104. return 0;
  105. return foregroundReader;
  106. }
  107. NetworkReader* FactoryClient::getNextBackgroundMessage()
  108. {
  109. bgReaderUsage++;
  110. if (!background)
  111. return 0;
  112. if (!background->hatNachricht(0))
  113. return 0;
  114. return backgroundReader;
  115. }
  116. void FactoryClient::endMessageReading(bool bg)
  117. {
  118. if (bg)
  119. bgReaderUsage--;
  120. else
  121. fgReaderUsage--;
  122. }
  123. void FactoryClient::sendPlayerAction(char* data, unsigned short length)
  124. {
  125. if (!foreground)
  126. return;
  127. cs.lock();
  128. length += 1;
  129. foreground->sende((char*)&length, 2);
  130. char msgId = 2;
  131. foreground->sende(&msgId, 1);
  132. foreground->sende((char*)data, length - 1);
  133. cs.unlock();
  134. }
  135. void FactoryClient::entityAPIRequest(int entityId, char* message, unsigned short length)
  136. {
  137. if (!foreground)
  138. return;
  139. cs.lock();
  140. length += 5;
  141. foreground->sende((char*)&length, 2);
  142. char msgId = 3;
  143. foreground->sende(&msgId, 1);
  144. foreground->sende((char*)&entityId, 4);
  145. foreground->sende(message, length - 5);
  146. cs.unlock();
  147. }