#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(); }