Pārlūkot izejas kodu

Möglichkeit zu einer individuellen Nachricht an einen Editor Server hinzugefügt

Kolja Strohm 6 gadi atpakaļ
vecāks
revīzija
f48ebe13ce
3 mainītis faili ar 60 papildinājumiem un 1 dzēšanām
  1. 8 1
      Include/KSGNetwork.h
  2. 45 0
      KSGNetwork/EditorClient.cpp
  3. 7 0
      KSGNetwork/EditorClient.h

+ 8 - 1
Include/KSGNetwork.h

@@ -1282,10 +1282,17 @@ namespace KSGClient
         //  Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
         //  Sollte erst nach einem erfolgreichen Aufruf von verbinde aufgerufen werden
         virtual bool trenne( bool abmelden ) = 0;
+        // Beginnt eine individuelle Editor Nachricht
+        //  Gibt den Klient zurück, über den mit dem Server kommuniziert werden kann. Im Fehlerfall wird 0 zurückgegeben
+        virtual Network::Klient *beginEditorMessage() = 0;
+        // Beendet eine Editor Nachricht
+        //  sollte nur nach dem erfolgreichem Aufrufen von beginEditorMessage aufgerufen werden
+        //  Der Thread, der diese Methode aufgerufen hat, sollte nach dem Erfolgreichen Aufruf am Ende der Kommunikation mit dem Server endEditorMessage aufrufen
+        virtual void endEditorMessage() = 0;
         // Gibt 1 zurück, falls der Client verbunden ist, 0 sonst
         virtual bool istVerbunden() const = 0;
         // gibt den Letzten Fehlertext zuück
-        //  sollte erst aufgerufen werden, nachdem eine andere aufgerufene Methode fehlgeschlagen ist
+        //  sollte erst aufgerufen werden, nachdem eine andere aufgerufene Methode fehlgeschlagen ist (vom selben Thread)
         virtual char *getLetzterFehler() const = 0;
         // Erhöht den Reference Counter um 1 un gibt this zurück
         virtual EditorServerClient *getThis() = 0;

+ 45 - 0
KSGNetwork/EditorClient.cpp

@@ -3172,6 +3172,51 @@ bool EditorClient::trenne( bool abmelden )
     return 1;
 }
 
+// Beginnt eine individuelle Editor Nachricht
+//  Gibt den Klient zurück, über den mit dem Server kommuniziert werden kann. Im Fehlerfall wird 0 zurückgegeben
+//  Der Thread, der diese Methode aufgerufen hat, sollte nach dem Erfolgreichen Aufruf am Ende der Kommunikation mit dem Server endEditorMessage aufrufen
+Network::Klient *EditorClient::beginEditorMessage()
+{
+    cs.lock();
+    if( !k )
+    {
+        err = "Der Client ist nicht verbunden.";
+        cs.unlock();
+        return 0;
+    }
+    k->sendeEncrypted( "\7", 1 );
+    char ret = 0;
+    k->getNachrichtEncrypted( &ret, 1 );
+    if( ret == 1 )
+    {
+        k->sendeEncrypted( "\xF", 1 );
+        k->getNachrichtEncrypted( &ret, 1 );
+        if( ret == 1 )
+            return k;
+    }
+    if( ret == 3 )
+    {
+        k->getNachrichtEncrypted( &ret, 1 );
+        char *msg = new char[ ret + 1 ];
+        msg[ ret ] = 0;
+        if( ret )
+            k->getNachrichtEncrypted( msg, ret );
+        err = "error while beginning Editor Message Server returned: ";
+        err += msg;
+        delete[] msg;
+    }
+    err = "Unbekannter Fehler";
+    cs.unlock();
+    return 0;
+}
+
+// Beendet eine Editor Nachricht
+//  sollte nur nach dem erfolgreichem Aufrufen von beginEditorMessage aufgerufen werden (vom selben Thread)
+void EditorClient::endEditorMessage()
+{
+    cs.unlock();
+}
+
 // Gibt 1 zurück, falls der Client verbunden ist, 0 sonst
 bool EditorClient::istVerbunden() const
 {

+ 7 - 0
KSGNetwork/EditorClient.h

@@ -260,6 +260,13 @@ namespace KSGClient
         //  Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
         //  Sollte erst nach einem erfolgreichen Aufruf von verbinde aufgerufen werden
         bool trenne( bool abmelden ) override;
+        // Beginnt eine individuelle Editor Nachricht
+        //  Gibt den Klient zurück, über den mit dem Server kommuniziert werden kann. Im Fehlerfall wird 0 zurückgegeben
+        //  Der Thread, der diese Methode aufgerufen hat, sollte nach dem Erfolgreichen Aufruf am Ende der Kommunikation mit dem Server endEditorMessage aufrufen
+        Network::Klient *beginEditorMessage() override;
+        // Beendet eine Editor Nachricht
+        //  sollte nur nach dem erfolgreichem Aufrufen von beginEditorMessage aufgerufen werden (vom selben Thread)
+        void endEditorMessage() override;
         // Gibt 1 zurück, falls der Client verbunden ist, 0 sonst
         bool istVerbunden() const override;
         // gibt den Letzten Fehlertext zuück