FactoryClient.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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( void* 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. }