|
@@ -0,0 +1,913 @@
|
|
|
+#include "ChatClient.h"
|
|
|
+#include "Keys.h"
|
|
|
+#include <Klient.h>
|
|
|
+#include <Globals.h>
|
|
|
+
|
|
|
+using namespace KSGClient;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ChatClient::ChatClient( int klientId, unsigned short port, char *ip, char *key, unsigned char keyLen )
|
|
|
+{
|
|
|
+ ref = 1;
|
|
|
+ this->ip = ip;
|
|
|
+ this->port = port;
|
|
|
+ cId = klientId;
|
|
|
+ senden = 0;
|
|
|
+ empfangen = 0;
|
|
|
+ this->key = new char[ keyLen ];
|
|
|
+ memcpy( this->key, key, keyLen );
|
|
|
+ this->keyLen = keyLen;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ChatClient::~ChatClient()
|
|
|
+{
|
|
|
+ trenne( 1 );
|
|
|
+ delete[] key;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::verbinde()
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( senden )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ senden = new Network::Klient();
|
|
|
+ int keyLen = 0;
|
|
|
+ char *key = 0;
|
|
|
+ Keys::getServerKey( &key, keyLen, Keys::CHAT, Keys::SENDEN );
|
|
|
+ senden->setSendeKey( key, keyLen );
|
|
|
+ delete[] key;
|
|
|
+ Keys::getServerKey( &key, keyLen, Keys::CHAT, Keys::EMPFANGEN );
|
|
|
+ senden->setEmpfangKey( key, keyLen );
|
|
|
+ delete[] key;
|
|
|
+ if( senden->verbinde( port, ip ) )
|
|
|
+ {
|
|
|
+ if( senden->sendeEncrypted( "\1", 1 ) )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&cId, 4 );
|
|
|
+ char ret = 0;
|
|
|
+ senden->getNachrichtEncrypted( &ret, 1 );
|
|
|
+ if( ret != 1 )
|
|
|
+ {
|
|
|
+ char byte = 0;
|
|
|
+ senden->getNachrichtEncrypted( &byte, 1 );
|
|
|
+ char *f = new char[ byte + 1 ];
|
|
|
+ f[ byte ] = 0;
|
|
|
+ senden->getNachrichtEncrypted( f, byte );
|
|
|
+ err = f;
|
|
|
+ delete[]f;
|
|
|
+ senden->sendeEncrypted( "\3", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ senden->trenne();
|
|
|
+ senden = senden->release();
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->setSendeKey( this->key, this->keyLen );
|
|
|
+ senden->setEmpfangKey( this->key, this->keyLen );
|
|
|
+ empfangen = new Network::Klient();
|
|
|
+ int keyLen = 0;
|
|
|
+ char *key = 0;
|
|
|
+ Keys::getServerKey( &key, keyLen, Keys::CHAT, Keys::SENDEN );
|
|
|
+ empfangen->setSendeKey( key, keyLen );
|
|
|
+ delete[] key;
|
|
|
+ Keys::getServerKey( &key, keyLen, Keys::CHAT, Keys::EMPFANGEN );
|
|
|
+ empfangen->setEmpfangKey( key, keyLen );
|
|
|
+ delete[] key;
|
|
|
+ if( empfangen->verbinde( senden->getServerPort(), senden->getServerIp() ) )
|
|
|
+ {
|
|
|
+ empfangen->sendeEncrypted( "\1", 1 );
|
|
|
+ empfangen->sendeEncrypted( (char*)&cId, 4 );
|
|
|
+ char res = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( &res, 1 );
|
|
|
+ if( res == 1 )
|
|
|
+ {
|
|
|
+ empfangen->setSendeKey( this->key, this->keyLen );
|
|
|
+ empfangen->setEmpfangKey( this->key, this->keyLen );
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if( res == 3 )
|
|
|
+ {
|
|
|
+ char län = 0;
|
|
|
+ senden->getNachrichtEncrypted( &län, 1 );
|
|
|
+ char *nachricht = new char[ län + 1 ];
|
|
|
+ nachricht[ län ] = 0;
|
|
|
+ senden->getNachrichtEncrypted( nachricht, län );
|
|
|
+ err = nachricht;
|
|
|
+ delete[]nachricht;
|
|
|
+ }
|
|
|
+ trenne( 0 );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ err = "Der dir zugewiesene Chat Server kann dir keine Nachrichten senden.";
|
|
|
+ empfangen = empfangen->release();
|
|
|
+ senden->sendeEncrypted( "\3", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ senden->trenne();
|
|
|
+ senden = senden->release();
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ err = "Der dir zugewiesene Chat Server hat die Verbindung abgebrochen. Bitte versuche es Später erneut.";
|
|
|
+ senden = senden->release();
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ err = "Der dir zugewiesene Chat Server antwortet nicht. Bitte versuche es Später erneut.";
|
|
|
+ senden = senden->release();
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ err = "Unbekannter Fehler";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::chatNachricht( int zuAccount, const char *nachricht )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ char län = textLength( nachricht );
|
|
|
+ if( !län )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\6", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&zuAccount, 4 );
|
|
|
+ senden->sendeEncrypted( &län, 1 );
|
|
|
+ senden->sendeEncrypted( nachricht, län );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ err = "Fehler beim senden der Nachricht.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::accountNameÄndern( const char *name )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ char län = textLength( name );
|
|
|
+ if( !län )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\x8", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( &län, 1 );
|
|
|
+ senden->sendeEncrypted( name, län );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim ändern des Namens.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::freundschaftBeenden( int accountId )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\x9", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&accountId, 4 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim beenden der Freundschaft.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::freundesAnfrage( int accountId )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\xA", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&accountId, 4 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim senden der Freundschaftsanfrage.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::freundesAnfrageBeantworten( int accountId, bool ja )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\xB", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&accountId, 4 );
|
|
|
+ char ok = (char)ja;
|
|
|
+ senden->sendeEncrypted( &ok, 1 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim beantworten der Freundschaftsanfrage.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+int ChatClient::chatroomErstellen( const char *name )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ char län = textLength( name );
|
|
|
+ if( !län )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\xC", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( &län, 1 );
|
|
|
+ senden->sendeEncrypted( name, län );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ int ret = 0;
|
|
|
+ senden->getNachrichtEncrypted( (char*)&ret, 4 );
|
|
|
+ cs.unlock();
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim erstellen des Chatrooms.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::chatroomEinladung( int accountId, int chatroomId )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\xD", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&accountId, 4 );
|
|
|
+ senden->sendeEncrypted( (char*)&chatroomId, 4 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim senden der Chatroomeinladung.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::chatroomEinladungAblehnen( int accountId, int chatroomId )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\xE", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&accountId, 4 );
|
|
|
+ senden->sendeEncrypted( (char*)&chatroomId, 4 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim beantworten der Chatroomeinladung.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::chatroomBetreten( int chatroomId )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\xF", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&chatroomId, 4 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim betreten des Chatrooms.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::chatroomNachricht( int chatroomId, const char *nachricht )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ char län = textLength( nachricht );
|
|
|
+ if( !län )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\x10", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&chatroomId, 4 );
|
|
|
+ senden->sendeEncrypted( &län, 1 );
|
|
|
+ senden->sendeEncrypted( nachricht, län );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim senden der Nachricht.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::chatroomVerlassen( int chatroomId )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\x11", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&chatroomId, 4 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim verlassen des Chatrooms.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::chatroomKick( int chatroomId, int accountId )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ senden->sendeEncrypted( "\x12", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn )
|
|
|
+ {
|
|
|
+ senden->sendeEncrypted( (char*)&chatroomId, 4 );
|
|
|
+ senden->sendeEncrypted( (char*)&accountId, 4 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = "Fehler beim kicken eines Spielers aus dem Chatroom.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::freundesListeAnfragen()
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->sendeEncrypted( "\x13", 1 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ err = "Fehler beim Anfragen der Freundesliste.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::chatNachrichtAnfrage()
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !senden )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->sendeEncrypted( "\x14", 1 );
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ if( serverReturn == 1 )
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ err = "Fehler beim Anfragen der Chatnachrichten.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::keepAlive()
|
|
|
+{
|
|
|
+ if( !senden )
|
|
|
+ return 0;
|
|
|
+ char res = 0;
|
|
|
+ if( !cs.tryLock() )
|
|
|
+ return 1;
|
|
|
+ Framework::logLine( ( char* )"Verbindungstest zum Chat Server..." );
|
|
|
+ bool ok = senden->sendeEncrypted( "\x15", 1 );
|
|
|
+ ok &= senden->getNachrichtEncrypted( &res, 1 );
|
|
|
+ cs.unlock();
|
|
|
+ if( res != 1 || !ok )
|
|
|
+ {
|
|
|
+ Framework::logLine( ( char* )"Verbindungsabbruch." );
|
|
|
+ trenne( 0 );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ Framework::logLine( ( char* )"Verbindung besteht." );
|
|
|
+ return res == 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::trenne( bool abmelden )
|
|
|
+{
|
|
|
+ if( !senden )
|
|
|
+ return 1;
|
|
|
+ cs.lock();
|
|
|
+ senden->sendeEncrypted( "\3", 1 );
|
|
|
+ char serverReturn = 0;
|
|
|
+ senden->getNachrichtEncrypted( &serverReturn, 1 );
|
|
|
+ senden->trenne();
|
|
|
+ senden = senden->release();
|
|
|
+ if( empfangen )
|
|
|
+ {
|
|
|
+ empfangen->trenne();
|
|
|
+ empfangen = empfangen->release();
|
|
|
+ }
|
|
|
+ cs.unlock();
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::getNextMessage( ChatServerNachricht &nachricht )
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ if( !empfangen )
|
|
|
+ {
|
|
|
+ err = "Der Client ist nicht verbunden.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ do
|
|
|
+ {
|
|
|
+ if( !empfangen->getNachrichtEncrypted( &nachricht.type, 1 ) )
|
|
|
+ {
|
|
|
+ err = "Fehler beim Empfangen der Nachricht.";
|
|
|
+ cs.unlock();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ switch( nachricht.type )
|
|
|
+ {
|
|
|
+ case 3:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ char länge = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( &länge, 1 );
|
|
|
+ char *txt = new char[ länge + 1 ];
|
|
|
+ txt[ länge ] = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( txt, länge );
|
|
|
+ nachricht.message = txt;
|
|
|
+ delete[] txt;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ char länge = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( &länge, 1 );
|
|
|
+ char *txt = new char[ länge + 1 ];
|
|
|
+ txt[ länge ] = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( txt, länge );
|
|
|
+ nachricht.message = txt;
|
|
|
+ delete[] txt;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ char län = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( &län, 1 );
|
|
|
+ char *status = new char[ län + 1 ];
|
|
|
+ status[ län ] = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( status, län );
|
|
|
+ nachricht.message = status;
|
|
|
+ delete[] status;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ char län = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( &län, 1 );
|
|
|
+ char *name = new char[ län + 1 ];
|
|
|
+ name[ län ] = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( name, län );
|
|
|
+ nachricht.message = name;
|
|
|
+ delete[] name;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 8:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 9:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0xA:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0xB:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0xC:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
|
|
|
+ break;
|
|
|
+ case 0xD:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
|
|
|
+ break;
|
|
|
+ case 0xE:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0xF:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ char län = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( &län, 1 );
|
|
|
+ char *txt = new char[ län + 1 ];
|
|
|
+ txt[ län ] = 0;
|
|
|
+ if( län )
|
|
|
+ {
|
|
|
+ empfangen->getNachrichtEncrypted( txt, län );
|
|
|
+ nachricht.message = txt;
|
|
|
+ }
|
|
|
+ delete[] txt;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 0x10:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0x11:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ char freundeAnzahl;
|
|
|
+ empfangen->getNachrichtEncrypted( &freundeAnzahl, 1 );
|
|
|
+ for( int i = 0; i < freundeAnzahl; i++ )
|
|
|
+ {
|
|
|
+ int accountId = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&accountId, 4 );
|
|
|
+ nachricht.ids.add( accountId );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 0x12:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
|
|
|
+ char anzahl = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( &anzahl, 1 );
|
|
|
+ for( char i = 0; i < anzahl; i++ )
|
|
|
+ {
|
|
|
+ int accountId = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&accountId, 4 );
|
|
|
+ nachricht.ids.add( accountId );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 0x13:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0x14:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0x15:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
|
|
|
+ break;
|
|
|
+ case 0x16:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.chatroom, 4 );
|
|
|
+ break;
|
|
|
+ case 0x17:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ break;
|
|
|
+ case 0x18:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ break;
|
|
|
+ case 0x19:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ char län = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( &län, 1 );
|
|
|
+ if( län )
|
|
|
+ {
|
|
|
+ char *txt = new char[ län + 1 ];
|
|
|
+ txt[ län ] = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( txt, län );
|
|
|
+ nachricht.message = txt;
|
|
|
+ delete[] txt;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 0x1A:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ break;
|
|
|
+ case 0x1B:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ break;
|
|
|
+ case 0x1C:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ char starten = 0;
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( &starten, 1 );
|
|
|
+ nachricht.account = starten;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 0x1D:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ break;
|
|
|
+ case 0x1E:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0x1F:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0x20:
|
|
|
+ if( 1 )
|
|
|
+ {
|
|
|
+ unsigned short port;
|
|
|
+ unsigned char *ip = new unsigned char[ 4 ];
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&port, 2 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)ip, 4 );
|
|
|
+ nachricht.account = port;
|
|
|
+ Text *ipT = new Text( "" );
|
|
|
+ ipT->append( (int)ip[ 0 ] );
|
|
|
+ ipT->append( "." );
|
|
|
+ ipT->append( (int)ip[ 1 ] );
|
|
|
+ ipT->append( "." );
|
|
|
+ ipT->append( (int)ip[ 2 ] );
|
|
|
+ ipT->append( "." );
|
|
|
+ ipT->append( (int)ip[ 3 ] );
|
|
|
+ nachricht.message = ipT->getText();
|
|
|
+ delete[] ip;
|
|
|
+ ipT->release();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 0x21:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0x22:
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.gruppe, 4 );
|
|
|
+ empfangen->getNachrichtEncrypted( (char*)&nachricht.account, 4 );
|
|
|
+ break;
|
|
|
+ case 0x23:
|
|
|
+ empfangen->sendeEncrypted( "\1", 1 );
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } while( nachricht.type == 0x23 );
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+bool ChatClient::istVerbunden() const
|
|
|
+{
|
|
|
+ return senden != 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+char *ChatClient::getLetzterFehler() const
|
|
|
+{
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ChatServerClient *ChatClient::getThis()
|
|
|
+{
|
|
|
+ ref++;
|
|
|
+ return this;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ChatServerClient *ChatClient::release()
|
|
|
+{
|
|
|
+ if( !--ref )
|
|
|
+ delete this;
|
|
|
+ return 0;
|
|
|
+}
|