123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- #include "FactoryClient.h"
- using namespace Network;
- FactoryClient::FactoryClient()
- {
- client = 0;
- background = 0;
- foreground = 0;
- backgroundReader = 0;
- foregroundReader = 0;
- bgReaderUsage = 0;
- fgReaderUsage = 0;
- }
- FactoryClient::~FactoryClient()
- {
- if (client)
- disconnect();
- }
- bool FactoryClient::connect(Text ip, short port, int accountId, Text secret)
- {
- if (client)
- disconnect();
- client = new SSLKlient();
- if (!client->verbinde(port, ip))
- return false;
- if (!client->sende("\1", 1))
- return false;
- if (!client->sende((char*)&accountId, 4))
- return false;
- unsigned char len = (unsigned char)secret.getLength();
- if (!client->sende((char*)&len, 1))
- return false;
- if (!client->sende(secret, len))
- return false;
- char result = 0;
- if (!client->getNachricht(&result, 1) || result != 1)
- return false;
- int keyLen;
- if (!client->getNachricht((char*)&keyLen, 4))
- return false;
- char* key = new char[keyLen];
- if (!client->getNachricht(key, keyLen))
- return false;
- int p;
- if (!client->getNachricht((char*)&p, 4))
- return false;
- foreground = new Klient();
- if (!foreground->verbinde(p, ip))
- return false;
- unsigned short l = (unsigned short)keyLen;
- if (!foreground->sende((char*)&l, 2))
- return false;
- if (!foreground->sende(key, keyLen))
- return false;
- bool bg = 0;
- if (!foreground->sende((char*)&bg, 1))
- return false;
- foregroundReader = new NetworkReader(foreground);
- background = new Klient();
- if (!background->verbinde(p, ip))
- return false;
- if (!background->sende((char*)&l, 2))
- return false;
- if (!background->sende(key, keyLen))
- return false;
- bg = 1;
- if (!background->sende((char*)&bg, 1))
- return false;
- backgroundReader = new NetworkReader(background);
- client->trenne();
- return true;
- }
- void FactoryClient::disconnect()
- {
- if (client)
- {
- NetworkReader* fgReader = foregroundReader;
- NetworkReader* bgReader = backgroundReader;
- backgroundReader = 0;
- foregroundReader = 0;
- if (foreground)
- foreground->trenne();
- if (background)
- background->trenne();
- while (fgReaderUsage > 0 || bgReaderUsage > 0)
- Sleep(100);
- delete fgReader;
- delete bgReader;
- client->release();
- client = 0;
- if (foreground)
- foreground->release();
- foreground = 0;
- if (background)
- background->release();
- background = 0;
- }
- }
- NetworkReader* FactoryClient::getNextForegroundMessage()
- {
- fgReaderUsage++;
- if (!foreground)
- return 0;
- if (!foreground->hatNachricht(0))
- return 0;
- return foregroundReader;
- }
- NetworkReader* FactoryClient::getNextBackgroundMessage()
- {
- bgReaderUsage++;
- if (!background)
- return 0;
- if (!background->hatNachricht(0))
- return 0;
- return backgroundReader;
- }
- void FactoryClient::endMessageReading(bool bg)
- {
- if (bg)
- bgReaderUsage--;
- else
- fgReaderUsage--;
- }
- void FactoryClient::sendPlayerAction(char* data, unsigned short length)
- {
- if (!foreground)
- return;
- cs.lock();
- length += 1;
- foreground->sende((char*)&length, 2);
- char msgId = 2;
- foreground->sende(&msgId, 1);
- foreground->sende((char*)data, length - 1);
- cs.unlock();
- }
- void FactoryClient::entityAPIRequest(int entityId, char* message, unsigned short length)
- {
- if (!foreground)
- return;
- cs.lock();
- length += 5;
- foreground->sende((char*)&length, 2);
- char msgId = 3;
- foreground->sende(&msgId, 1);
- foreground->sende((char*)&entityId, 4);
- foreground->sende(message, length - 5);
- cs.unlock();
- }
|