FactoryClient.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. }
  11. FactoryClient::~FactoryClient()
  12. {
  13. if( client )
  14. disconnect();
  15. }
  16. bool FactoryClient::connect( Text ip, short port, int accountId, Text secret )
  17. {
  18. if( client )
  19. disconnect();
  20. client = new SSLKlient();
  21. if( !client->verbinde( port, ip ) )
  22. return false;
  23. if( !client->sende( "\1", 1 ) )
  24. return false;
  25. if( !client->sende( (char*)&accountId, 4 ) )
  26. return false;
  27. unsigned char len = (unsigned char)secret.getLength();
  28. if( !client->sende( (char*)&len, 1 ) )
  29. return false;
  30. if( !client->sende( secret, len ) )
  31. return false;
  32. char result = 0;
  33. if( !client->getNachricht( &result, 1 ) || result != 1 )
  34. return false;
  35. int keyLen;
  36. if( !client->getNachricht( (char*)&keyLen, 4 ) )
  37. return false;
  38. char* key = new char[ keyLen ];
  39. if( !client->getNachricht( key, keyLen ) )
  40. return false;
  41. int p;
  42. if( !client->getNachricht( (char*)&p, 4 ) )
  43. return false;
  44. foreground = new Klient();
  45. if( !foreground->verbinde( p, ip ) )
  46. return false;
  47. unsigned short l = (unsigned short)keyLen;
  48. if( !foreground->sende( (char*)&l, 2 ) )
  49. return false;
  50. if( !foreground->sende( key, keyLen ) )
  51. return false;
  52. bool bg = 0;
  53. if( !foreground->sende( (char*)&bg, 1 ) )
  54. return false;
  55. foregroundReader = new NetworkReader( foreground );
  56. background = new Klient();
  57. if( !background->verbinde( p, ip ) )
  58. return false;
  59. if( !background->sende( (char*)&l, 2 ) )
  60. return false;
  61. if( !background->sende( key, keyLen ) )
  62. return false;
  63. bg = 1;
  64. if( !background->sende( (char*)&bg, 1 ) )
  65. return false;
  66. backgroundReader = new NetworkReader( background );
  67. client->trenne();
  68. return true;
  69. }
  70. void FactoryClient::disconnect()
  71. {
  72. if( client )
  73. {
  74. delete foregroundReader;
  75. foregroundReader = 0;
  76. delete backgroundReader;
  77. backgroundReader = 0;
  78. client->release();
  79. client = 0;
  80. if( foreground )
  81. foreground->release();
  82. foreground = 0;
  83. if( background )
  84. background->release();
  85. background = 0;
  86. }
  87. }
  88. NetworkReader* FactoryClient::getNextForegroundMessage()
  89. {
  90. if( !foreground )
  91. return 0;
  92. if( !foreground->hatNachricht( 0 ) )
  93. return 0;
  94. return foregroundReader;
  95. }
  96. NetworkReader* FactoryClient::getNextBackgroundMessage()
  97. {
  98. if( !background )
  99. return 0;
  100. if( !background->hatNachricht( 0 ) )
  101. return 0;
  102. return backgroundReader;
  103. }
  104. void FactoryClient::sendPlayerAction( void* data, unsigned short length )
  105. {
  106. if( !foreground )
  107. return;
  108. cs.lock();
  109. length += 1;
  110. foreground->sende( (char*)&length, 2 );
  111. char msgId = 2;
  112. foreground->sende( &msgId, 1 );
  113. foreground->sende( (char*)data, length - 1 );
  114. cs.unlock();
  115. }