autor: Jakub Madej

Projekt nr 11: Środowisko do kooperatywnej edycji tekstów.


  1. Działanie programu.
    Środowisko składa się z programów klienta oraz serwera. Serwer uruchamia się podając mu jako parametry: Klienta uruchamia się podając jako parametry: Po uruchomieniu klient jest w stanie wyboru nowego fragmentu do edycji. W górnym oknie znajduje się podgląd tekstu jaki aktualnie znajduje się na serwerze. Na czerwono zaznaczone są fragmenty, które zostały wybrane przez jakichś użytkowników do edycji. Na niebiesko zostanie zaznaczony fragment, który wybierzemy do edycji my sami. Wyboru fragmentu dokonuje się w dolnym oknie poprzez zaznaczenie fragmentu a następnie wybranie z menu "edycja" opcji "akceptuj". Żądanie zostanie przesłane na serwer i zaakceptowane lub nie, o czym powiadomi odpowieni komunikat na belce statusowej na samym dole okna głównego. Serwer odmówi akceptacji w przypadku gdy inny użytkownik wybrał już do edycji fragment, który częsciowo pokrywa się z fragmentem zgłaszanym.
    Po pomyślnym zaakceptowaniu w dolnym oknie pojawi się wybrany fragemnt i wtedy można przystąpić do jego edycji. Dostępne są standardowe skróty klawiaturowe, czyli ctrl-x, ctrl-c oraz ctrl-v jak również ctrl-z. Po zakończeniu edycji można przesłać fragment na serwer wybierając z menu "edycja" opcję "wyślij". W celu przerwania edycji i wyboru innego fragmentu należy wybrać "nowa edycja".

  2. Budowa i zasada działania serwera.
    Program serwera jest napisany w C. Zasadniczo składa się on z nieskończonej pętli, w której za pośrednictwem funkcji select dokonywane jest śledzenie deskryptorów gniazd i odpowiednie reagowanie na różne rodzaje komunikatów, które są przez nie przesyłane. Każdemu klientowi odpowiada w programie struktóra, w której zapisany jest dekryptor gniazda związany z danym klientem, informacja, czy klient wybrał już fragment do edycji i o ile ten warunek jest spełniony - początek i koniec fragmentu przypisany danemu klientowi.

  3. Budowa i zasada działania klienta.
    Program klienta napisany jest w C++ i składa sie z trzech klas, oraz funkcji main, której rola ogranicza się do stworzenia obiektów odpowiednich klas. Klasa Watek jest to klasa która obsługuje połączenie z serwerem - odbiera pakiety przychodzące z serwera oraz wysyła pakiety. Najważniejszą częścią klasy jest konstruktor, w którym podjęta zostaje próba nawiązania połączenia, oraz metoda run, która jest nieskończoną pętlą odbierającą dane przychodzące z serwera. Metoda ta zostaje uruchomiona przez konstruktor w nowym wątku. Jest to niezbędne, aby niezależnie użytkownik mógł prowadzić interakcję z programem.
    W przypadku odebrania nowej wiadomości z serwera zostaje podjęta odpowiednia akcja. Zawsze wiąże się to z przesłaniem odpowieniego komunikatu do klasy GUI. Aby umożliwić poprawne działanie programu na serwerach X'ów nie mających wsparcia dla wielowątkowości (obsługujących swój protokół w sposób wyłącznie synchroniczny) konieczne jest wykonywanie metod klas qt tylko z jednego wątku. W tym celu utworzony wątek wysyła sygnał do wątku głównego i ten podejmuje odpowiednią akcję.
    Klasa GUI jest klasą reprezentującą graficzny interfejs użytkownika zbudowany z wykorzystaniem komponentów biblioteki qt w wersji 2.
    Klasa MojEdytor jest specjalizacją edytora dostępnego w qt. Jest ona stworzona jedynie w celu możliwości skorzystania z jednej metody, która jest zadeklarowana jako protected.

  4. Postać pakietów wysyłanych przez serwer.
    Każdy pakiet wysyłany przez serwer lub klienta składa się z czterobajtowego nagłówka oznaczającego typ pakietu oraz opcjonalnej części właściwej. Kolejność bajtów we wszystkich przesyłanych liczbach odpowiada Little Endian. Typy pakietów są następujące (zgdnie z deklaracjami w serwer.c):
  5. Pakiety wysyłane przez klienta.