====================================
   01010110    01101111   01000011

{__         {__              {__   
 {__       {__            {__   {__
  {__     {__     {__    {__       
   {__   {__    {__  {__ {__       
    {__ {__    {__    {__{__       
     {____      {__  {__  {__   {__
      {__         {__       {____  
        

Voice Communication Protocol

autor: Magdalena Michalska, mm222110
====================================


0.Streszczenie
==============

Dokument opisuje protokol obslugi malej biurowej sieci telefonicznej.


1. Opis celow protokolu
=======================

Protokol ten sluzy do realizacji sterowania transmisja danych 
(docelowo glosu )w rozmowach glosowych realizowanych przez siec,
z rozproszonym sterowaniem.

2. Opis zalozen protokolu
=========================

Protokol dziala w warstwie transportowej. Transport dzwieku odbywa sie 
w oparciu o UDP, dane sterujace - TCP.
Wykorzystywany model komunikacji to P2P. 
Komputery komunikuja sie zgodnie z portami(logicznym - do przesylania dzwieku,
sterujacym - do komunikatow sterujacych) okreslonymi w plikach
konfiguracyjnych. 
Zaklada sie jednoznaczne, wspolne dla wszystkich abonentow z grupy,
cykliczne uporzadkowanie abonentow w obrebie grup,
potrzebne do cyklicznego przekazywania komunikatow.
Protokol nie narzuca sposobu uporzadkowania, wymaga jedynie by 
wszyscy czlonkowie grupy mieli ten sam poglad na to kto jest czyim
nastepnikiem.


3. Opis formatu komunikatow
===========================

Przyjmuje sieciowy porzadek oktetow w liczbach.
Format liczb zmiennoprzecinkowych: nie dotyczy - zakladam transport wylacznie
zmiennych calkowitoliczbowych.
Brak uzupelniania formatu.

3.1 Opis pol
============

Nie wszystkie pola musza byc wykorzystane w kazdym komunikacie.
Dokladniejszy opis w p.4.

3.1.1 Opis poszczegolnych pol
=============================



typ             uint32   identyfikuje rodzaj komunikatu

dlugosc         uint32   dlugosc pola "dane specyficzne" w bajtach

identyfikator
polaczenia      uint32   unikalna liczba identyfikujaca polaczenia
                         protokol nie wnika jak jest inicjowana.
                         inicjuje ja abonent wywolujacy polaczenie
                         i dalej polaczenie jest caly czas nia podpisywane
dane
specyficzne     octet   dane charakterystyczne dla poszczegolnych
                        komunikatow, pole zmiennej dlugosci,
                        zawiera n oktetow, w szczegolnosci moze go nie byc.



Pola typ, dlugosc, identyfikator polaczenia zawsze sa stalej wielkosci
4 bajtow. Pole indentyfikator moze nie byc wykorzystywane w niektorych
komunikatach. Moze byc wtedy wypelnione losowymi danymi.


3.1.2 Rysunek pogladowy
=======================


+-----+-----------+-----------------+-------------+
| typ | dlugosc   |  identyfikator  | dane        |
|     |           |  polaczenia     | specyficzne |
| 4B  | 4B        |  4B             |n octetow    |
+-----+-----------+-----------------+-------------+



4. Opis wymienianych komunikatow
================================

4.1 Komunikaty wewnetrzne w grupie
==================================

Te komunikaty sluza do rozwiazywania sporow dotyczacych wolnych linii
telefonicznych, ustalania ktory abonent z ktorej moze korzystac,
zapewnienia spojnosci wewnatrz grupy. Komunikaty ze slowek TOKEN w nazwie
dalej sa skrotowo nazywane "tokenami", "komunikatami z grupy tokenow".

LINIA_TOKEN_MSG
---------------
        Komunikat "token" z numerem linii. Jest przekazywany po kolei pomiedzy
        Abonentami. Kolejnosc jest ustalana na podstawie identyfikatorow -
        protokol nie wymusza sposobu, zaklada jedynie jakis spojny sposob
        cyklicznego uporzadkowania abonentow, jak juz zostalo powiedziane
        w zalozeniach. Tylko abonent ktory posiada aktualnie token 
        odpowiadajacy danej linii jest uprawniony do korzystania z niej. 
        Zajecie linii odbywa sie poprzez zaprzestanie przekazywania dalej 
        komunikatu, zwolnienie - poprzez wpuszczenie komunikatu spowrotem 
        do obiegu.


        +-----+-----------+-----------------+---------------------------+
        | typ | dlugosc   |  identyfikator  | dane   specyficzne:       |
        |     |           |  polaczenia     | ------------------        |
        |     |           |                 | nr_linii uint32  4B       |
        +-----+-----------+-----------------+---------------------------+


         Pole identyfikator polaczenia nie jest wykorzystywane.

ZWALNIAM_LINIE_MSG 
------------------
        Komunikat mowiacy, ze zostala zwolniona linia, rozsylany do wszystkich 
        komputerow z grupy po zwolnieniu linii. Nie jest istotne ktora linia
        zostala zwolniona. Komunikat sluzy jedynie do aktualizacji informacji
        o liczbie wolnych linii. Po jego otrzymaniu zwiekszana jest zmienna
        free_lines o 1 (kazdy abonent po otrzymaniu zwieksza u siebie free_lines
        o 1).


        +-----+-----------+-----------------+-------------+
        | typ | dlugosc   |  identyfikator  | dane        |
        |     |           |  polaczenia     | specyficzne:|
        | 4B  | 4B        |  4B             |   BRAK (0B) |
        +-----+-----------+-----------------+-------------+

        
         Pole identyfikator polaczenia nie jest wykorzystywane.

ZAJMUJE_LINIE_MSG
-----------------
        Komunikat analogiczny z powyzszym - informuje o zajeciu jakiejs linii.
        Po jego otrzymaniu zmniejszana jest zmienna free_lines o 1.     
        

        +-----+-----------+-----------------+-------------+
        | typ | dlugosc   |  identyfikator  | dane        |
        |     |           |  polaczenia     | specyficzne:|
        | 4B  | 4B        |                 | BRAK (0B)   |
        +-----+-----------+-----------------+-------------+

        Pole identyfikator polaczenia nie jest wykorzystywane.

POLACZENIE_TOKEN_MSG
--------------------
        Komuniakt "token" transportujacy informacje o polaczeniu ktore
        nadeszlo. Jest przekazywany cyklicznie wewnatrz grupy abonentow.
        Abonent ktory dostal ten komunikat nabywa prawa do odebrania/odrzucenia 
        polaczenia. Jesli jednak nie wykonuje zadnej z tych czynnosci - 
        przekazuje komunikat dalej, zmniejszajac mu ttl o 1.
        Jesli komunikat ma juz ttl = 0, abonent wysyla do wywolujacego
        pytanie NADAL_DZWONISZ_MSG - zeby zapobiec niepotrzebnemu krazeniu
        niewaznego juz polaczenia.
        Pole global_ttl ustawione na -1 oznacza ze token ma krazyc 
        dopoki nie zostanie jakas wlasciwa kacja podjeta - czyli w razie jakis
        nieprawidlowosci moze sie okazac ze w nieskonczonosc.
        Gdy golbal_ttl ma wartosc > 0, jest zmniejszane o 1.
        Jesli ma wartosc = 0 oznacza to ze tokena nalezy juz wyeliminowac
        czyli zostaje wyslany komunikat KILL_MSG do tworcy tokena
        (tutaj IP_O), oraz komunikat ODRZUCAM_MSG do IP_N - abonenta ktory
        probuje nawiazac polaczenie.
        Pole global_ttl jest ustanawiane wg widzimisie abonenta tworzacego
        token polaczenia. Protokol tego nie narzuca.


        dane specyficzne: 
                IP_N            uint32  IP abonenta ktory chce nawiazac
                                        polaczenie
                IP_O            uint32  IP abonenta wywolywanego

                port
                sterujacy       uint16  port na ktorym abonent nawizaujacy
                                        polaczenie oczekuje komunikatow
                                        sterujacych
                port
                logiczny        uint16  port na ktorym abonent nawiazujacy
                                        polaczenie oczekuje danych 
                                        dzwiekowych
                
                ttl             uint32  czas po jakim nalezy ponowic pytanie
                                         o chec nawiazania polaczenia

                global_ttl      uint32  czas po jakim nalezy usunac tego
                                        tokena z obiegu

                dlugosc laczna: 4 + 4 + 2 + 2 + 4 + 4 = 20 [B]


+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               | |ttl | global_ttl                            |
+-----+--------+---------------+----------------------------------------------+

        W ponizszych komunikatach jesli rysunek powyzszy pojawia sie bez opisu,
        interpretacja pol identyczna jak tutaj.
        (Wartosc typu jest wszedzie inna)

ZAWIESZONE_TOKEN_MSG
--------------------
        Komunikat "token" transportujacy informacje o zawieszonym polaczeniu.
        Komputer posiadajacy ten "token",  ma prawo do odwieszenia polaczenia,
        wpp przekazuje go dalej.
        Pole global_ttl ustawione na -1 oznacza ze token ma krazyc 
        dopoki nie zostanie jakas wlasciwa kacja podjeta - czyli w razie jakis
        nieprawidlowosci moze sie okazac ze w nieskonczonosc.
        Gdy golbal_ttl ma wartosc > 0, jest zmniejszane o 1.
        Jesli ma wartosc = 0 oznacza to ze tokena nalezy juz wyeliminowac
        czyli zostaje wyslany komunikat KILL_MSG do tworcy tokena
        (tutaj IP_O), oraz komunikat ODWIESZAM_MSG a nastepnie 
        ROZLACZAM_MSG do IP_N - abonenta ktory probuje nawiazac polaczenie.



+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               | |global_ttl                                  |
+-----+--------+---------------+----------------------------------------------+

KILL_MSG
--------------------
        Komunikat wysylany przez abonenta ktory przestaje przekazywac dalej
        token do abonenta ktory go utworzyl. Ma umozliwic tworcy tokena
        usuniecie polaczenia(zawieszonego/oczekujacego) z odpowiedniej
        listy, poniewaz polaczenia te przestaja byc aktualne.



                token_type      uint32  nr typu tokena ktory jest ubijany
                                        w celu zidentyfikowania z ktorej listy
                                        nalezy go wywalic

                token_id        uint32  identyfikator polaczenia ktore nalezy
                                        usunac z listy, zawarty w tokenie
                                        ktory jest usuwany z obiegu



+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | token_type | token_id                        |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+





4.2 Komunikaty do nawiazywania polaczen
=======================================

WYWOLUJE_MSG
------------
        Komunikat inicjujacy polaczenie przez wywolujacego. Reakcja wywolywanego
        moze byc wyslanie komunikatu ODBIERAM_MSG, ODRZUCAM_MSG, badz 
        utworzenie tokena POLACZENIE_TOKEN_MSG i puszczenie go w obieg.

        Identyfikator polaczenia jest tu ustalany przez wywolujacego.
        Pozniej cala rozmowa jest na jego podstawie identyfikowana
        (polaczenia na listach polaczen, komunikaty glosowe)


+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+


ODBIERAM_MSG
------------
        Komunikat wysylany przez wywolywanego, badz czlonka jego grupy, 
        do wywolujacego. Zastosowanie opisane w opisie stanow.


+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+




ODRZUCAM_MSG
------------
        Komunikat wysylany przez wywolywanego, badz czlonka jego grupy,
        do wywalujacego. Zastosowanie podane w opisie stanow.


+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+


        

ROZLACZAM_MSG
-------------
        Komunikat wysylany przez ktorakolwiek ze stron polaczenia,
        badz w przypadku zawieszonego polaczenia przez tego, kto nie 
        zawieszal.


+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+



PRZESTAJE_DZWONIC_MSG 
---------------------
        
        Komunikat wysylany przez wywolujacego w przypadku rezygnacji z
        wywolywania.



+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+




ZAWIESZAM_MSG
-------------
        Komunikat wysylany przez jednego rozmowce do drugiego, powoduje 
        przerwanie transmisji danych logicznych(glosowych).
        Po wyslaniu komunikatu abonent znajduje sie w stanie
        CHCE_ZAWIESIC_STATE. Oczekuje na komunikaty OK_MSG, badz
        ZAWIESZAM_MSG wyslane przez Abonenta z ktorym rozmowe chce zawiesic.
        Pole losowa_liczba sluzy do determinacji ktory rozmowca faktycznie
        zawiesil polaczenie w przypadku rownoczesnego zawieszania - zawiesil
        ten o wyzszej liczbie losowej. W przypadku rownych liczb 
        uznaje sie ze zawiesil ten o wyzszym IP(w leksykograficznym porzadku
        rosnacym).



+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               | losowa_liczba(uint32, rozmiar: 4B)           |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+



ODWIESZAM_MSG
-------------
        Kounikat moze byc wyslany przez dowolnego abonenta z grupy abonenta
        ktory zawiesil polaczenie o parametrach w komunikacie. Do wyslania
        tego komunikatu uprawnia token ZAWIESZONE_TOKEN_MSG



+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+



ZAJETE_MSG
----------

        Komunikat wysylany przez wywolywanego wywolujacemu. Informuje o
        braku wolnych linii. Dane specyficzne oraz identyfikator sa
        przepisywane z komunikatu wywolujacego polaczenie.

+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+




NADAL_DZWONISZ_MSG
------------------
        Komunikat w ktorym wywolywany upewnia sie do aktualnosci polaczenia.
        Na wypadek gdyby wywolujacy "sie popsul" na przyklad.
        Po timeoucie QUERY_TIMEOUT abonent uznaje ze rozmowa juz nie aktualna
        i podejmuje decyzje o nie transportowaniu dalej tokena z informacjami
        o polaczeniu.

+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+



NADAL_DZWONIE_MSG
-----------------

        

+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+




ODWIESZAM_GR_MSG
----------------

        Komunikat wysylany przez abonenta odwieszajacego polaczenie, do
        abonenta z tej samej grupy! ktory zawiesil to polaczeni - ma sluzyc
        informacji o tym ze tego zawieszonego polaczenia juz nie ma.
        Abonent ktory orginalnie je zwiesil usuwa je z listy
        polaczenia_zawieszone.

+-----+--------+---------------+----------------------------------------------+
| typ |dlugosc | identyfikator | dane   specyficzne                           |
|     |        | polaczenia    |--------------------------------------------- |
|     |        |               | IP_N | IP_O | port sterujacy | port logiczny |
|     |        |               |                                              |
+-----+--------+---------------+----------------------------------------------+





4.3 Komunikaty z wlasciwymi danymi - glosem
===========================================

VOICE_MSG
---------
        Komunikat transportujace dane glosowe. Protokol nie zajmuje sie formatem
        tych danych. 
        Komunikaty maja nadawane numery, by umozliwic pomijanie komunikatow
        ktore przyszly w niewlasciwej kolejnosci.
        Pola 
        

      
        nr              uint32          numer komunikatu(kolejnosc)     

        dane_glosowe    nieznany        wlasciwe dane
                                        dzwiekowe

+-----+-----------+-----------------+---------------------------------------+
| typ | dlugosc   |  identyfikator  | dane   specyficzne                    |
|     |           |  polaczenia     |---------------------------------------|
|     |           |                 | nr | dane_glosowe                     |
+-----+-----------+-----------------+---------------------------------------+




5. Opis stanow
==============

Kazdy abonent ma zmienna free_lines oznaczajaca liczbe wolnych linii w grupie,
ktora zwieksza o 1 przy otrzymaniu komunikatu ZWALNIAM_LINIE_MSG, zmniejsza
o 1 przy otrzymaniu komunikatu ZAJMUJE_LINIE_MSG.

Abonent utrzymuje listy:

        polaczenia_aktywne      - tylko zestawione polaczenia, 
                                ich identyfikatory

        polaczenia_zawieszone   - identyfikatory zawieszonych polaczen, 
                                i pole mowiace czy nalezy usunac token danego
                                polaczenia jesli nadejdzie
                                
        polaczenia_oczekujace   - polaczenia wywolane przez abonenta - ich
                                identyfikatory (* nie mylic z polaczeniami 
                                przychodzacymi od innego abonenta, one sa 
                                na liscie ktos_dzwoni *)

        chce_rozmawiac          - polaczenia ktore abonent planuje wykonac,
                                (aplikacja otrzymala od usera komunikat)

        ktos_dzwoni             - polaczenia wywolywane przez innego abonenta,
                                wraz z informacja czy przestal dzwonic i
                                nalezy usunac z obiegu tokena z tym
                                polaczeniem


Przejscia pomiedzy stanami i komunikaty ze szczegolna troska przedstawione
na diagramach. W koncu 1 obrazek = 1K slow!
Komunikaty ODWIESZAM_MSG/ODBIERAM_MSG odnoszace sie
do polaczenia ktorego abonent nie ma na listach odpowiednio 
polaczenia_zawieszone/polaczenia_oczekujace skutuja odeslaniem
komunikatow ROZLACZAM_MSG z paramtrami polaczenia zawartymi w otrzymanym
komunikacie.
Komunikat ROZLACZAM_MSG/ODWIESZAM_GR_MSG otrzymany w stanach w ktorych na
listach odpowiednio 
polaczenia_aktywne(lub polaczenia_zawiszone)/polaczenia_zawieszone
nie ma odpowiednich polaczen sa ignorowane.

5.1.1 Stany glowne
==================
Stany opisane sa w przeplocie ze ogolna charakterystyka dzialania.

W skrocie schemat rozmowy przebiega nastepujaco:

Abonent nie rozmawia. Abonent jest w stanie: 

BASIC_STATE
-----------

        Scenariusz podstawowy:

        Abonent zostaje wywolany. Znajduje sie w stanie:        

KTOS_DZWONI_STATE
-----------------
        Scenariusz podstawowy:

        -Jesli widzi w swojej lokalnej zmiennej ze nie ma wolnych linii
        (licznik free_lines == 0) zwraca informacje o zajetosci -
        komunikat ZAJETE_MSG, i pozostaje w stanie BASIC_STATE.
        
        Jesli sa wolne linie:

        -Jesli chce odebrac, czeka az dojdzie do niego komunikat token
        z jakas linia, ztrzymuje ten komunikat, i zestawia polaczenie
        na tej linii, tzn. wysyla komunikat ODBIERAM_MSG, oraz do 
        wszystkich pozostalych z grupy ZAJMUJE_LINIE_MSG. I od tej pory
        jest klasywfikowany jako stan ROZMAWIAM_STATE.
        Pozostale przychodzace polaczenia kolejkuje zliczajac jednoczesnie
        czy hipotetycznie starcza na nie linii. 
        Jesli otrzyma komunikaty o zajetosci kolejnych linii, i przestanie
        hipotetycznie wystarczyc linii do obsluzenia zakolejkowanych polaczen,
        zaczynajac od najpozniej przybylych, usuwa je, podejmujac akcje:

                - w przypadku gdy bylo to polaczenie przychodzace od innego 
                abonenta wysyla mu komunikat ZAJETE_MSG

                - gdy bylo to polaczenie zainicjowane przez uzytkownika 
                aplikacji, odsyla mu wiadomosc zwrotna o niemozliwosci 
                wykonania polaczenia.
                Protokol nie wglebia sie w interfejs uzytkownika. 


        -Jesli nie chce rozmawiac, tworzy komunikat POLACZENIE_TOKEN_MSG,
        i puszcza go w obieg.

        Sytuacje szczegolne:
        
        POLACZENIE_TOKEN_MSG zawiera pole ttl(time to live), zainicjowane
        iloscia komputerow w grupie. Kazdy abonent kolejny przekazujacy
        ten komunikat zmniejsza ttl o 1.

        -Jesli abonent pusci w obieg komunikat POLACZENIE_TOKEN_MSG,
        a nastepnie otrzyma PRZESTAJE_DZWONIC_MSG, zaznacza na liscie
        kto_dzwoni ze nalezy usunac ten token. Gdy otrzyma taki token,
        ktory ma ttl = 0, zgodnie z informacjami o polaczniu wysyla do
        wywolujacego pytanie czy aktualne NADAL_DZWONISZ_MSG. Jesli
        po czasie QUERY_TIMEOUT nie otrzyma odpowiedzi uznaje ze abonent
        juz nie dzwoni i nie przesyla dalej tokena.
        Jesli otrzymal otrzymal komunikat o ktorym przechowuje informacje 
        ze ma go dalej nie przekazywac, usuwa wogole informacje o tym
        polaczeniu z listy.
        

        -pozostale komuniakty z ktorymi moglby cos zrobic maja mniejszy
        priorytet - abonent przekazuje je dalej, dopoki nie zakonczy jakos
        scenariusza zwiazanego z tym stanem
                

ROZMAWIAM_STATE
---------------

        Czyli sa jakies zestawione rozmowy, ale nie ma zadnej nowej akcji 
        zainicjowanej - nie jest wywolywany, ani nie chce sam dzownic.

        -jakies inne komunikaty takie odnosnie nie tego polaczenia -
        traktuje tak samo jak BASIC_STATE.
        -jesli chce rozlaczyc - wysyla komunikat rozlaczam, nie czekajac 
        na potwierdzenie. 
        -chce zawiesic - zawiesza, towrzy token zawieszone polaczenie,
        ktory krazy po grupie i czeka az ktos go odwiesi
        -otrzymuje komunikat ZAWIESZAM_MSG - przerywa transmisje glosu,
        odsyla komunikat OK_MSG z danymi z komunikatu ZAWIESZAM_MSG,
        przechodzi do stanu KTOS_ZAWIESIL_STATE,     
        po jakims czasie rozlacza takie zawieszone polaczenie.
        -chce rozlaczyc - to rozlacza, usuwa informacje o tym polaczeniu
        ze swoich struktur.
        
Ogolnie gdy chce zadzownic, przechodzi w stan:

CHCE_ZADZWONIC_STATE
--------------------
        Czeka na tokena z linia, przychodzace rozmowy obsluguje/
        kolejkuje dopoki starcza WLT. Chec rozmowy i przychodzace
        polaczenia sa utrzymywane w kolejkach(listach). Gdy zmniejsza sie linia
        WLT,  odpowiednie komunikaty o zajetosci sa odsylane innym abonentom,
        badz uzytkownikowi aplikacji.(Jak opisane wyzej)
        Gdy dostaje tokena z linia, nie wypuszcza go, wywoluje abonenta, 
        i rozsyla komunikat ZAJMUJE_LINIE_MSG. Przechodzi w stan
        DZWONIE_STATE.
        Stany CHCE_ZADZWONIC_STATE, oraz KTOS_DZWONI_STATE moga wystepowac
        jednoczesnie. Ogolnie - stany tycza sie raczej pojedynczych linii, w sumie
        abonent jest w tylu stanach ile stanow wystepuje w sumie na liniach.

DZWONIE_STATE   
-------------
        
        Scenariusz podstawowy:

        -Otrzymuje komunikat ODBIERAM_MSG. Polaczenie zostaje zestawione.
        Przechodzi w stan ROZMAWIAM_STATE.
        
        -Otrzymuje komunikat ODRZUCAM_MSG. Wysyla do wszystkich komunikat
        ZWALNIAM_LINIE_MSG. Przechodzi do BASIC_STATE.

        -Uzytkownik postanawia zaniechac dzwonienia. Abonent wysyla do
        wywolywanego komunikat PRZESTAJE_DZWONIC_MSG. Do grupy wysyla
        ZWALNIAM_LINIE_MSG. Przechodzi do BASIC_STATE.

CHCE_ZAWIESIC_STATE
-------------------
        Abonent wyslal ZAWIESZAM_TOKEN_MSG. Teraz czeka albo na 
        potwierdzenie - OK_MSG, albo na komunikat ZAWIESZAM_TOKEN_MSG
        od rozmowcy ktorego on wlasnie probowal zawiesic.
        Jesli otrzyma OK_MSG, uznaje ze to on zawiesil polaczenie,
        tworzy ZAWIESZONE_TOKEN_MSG, i puszcza w obieg.
        Jesli otrzyma ZAWIESZAM_TOKEN_MSG to:
        jesli jego IP jest wieksze w rosnacym porzadku leksykograficznym
        niz IP rozmowcy z ktorym "walczy" o prawo do zawieszenia
        (rozmowcy ktory przyslal ZAWIESZAM_TOKEN_MSG)
        to uznaje ze on zawiesza i towrzy token polaczenia i puszcza go
        w obieg. Wpp uznaje ze to rozmowca zawiesil i przechodzi w stan
        KTOS_ZAWIESIL_STATE.
        
ZAWIESILEM_STATE
----------------
        Abonent zawiesil polaczenie. Puscil w obieg tokena z zawieszonym
        polaczeniem.

        Scenariusz podstawowy:

        - Abonent dostaje komuniakt ODWIESZAM_GR_MSG. Oznacza to ze ktos inny
        z grupy odwiesza to polaczenie. Abonent usuwa informacje o tym
        polaczeniu ze swoich zmiennych zawieszone_polaczenia. Przechodzi do
        stanu BASIC_STATE.

        - Abonent dostaje komunikat ROZLACZAM_MSG. Rozmowca rozlacza
        zawieszone polaczenie. Trzeba usunac krazacego tokena 
        z informacja o istniejacym zawieszonym polaczeniu, tzn spowodowac
        zaprzestanie przekazywania go dalej. Jesli zanim to sie stanie ktos
        sprobuje odwiesic polaczenie, rozmowca ktory je rozlaczyl odesle
        mu informacje ze rozlacza polaczenie. Abonent ktory otrzymal
        informacje o rozlaczeniu zawieszonego polaczenia zapisuje sobie
        ze ma je rozlaczyc. Za kazdym razem gdy przychodzi do niego jakis
        token z informacja o zawieszonym polaczeniu, sprawdza czy ma 
        go przekazywac dalej, czy nie. Po tym jak napotka na takiego ktorego
        ma nie przekazywac dalej, usuwa wogole informacje o tym polaczeniu.

        
        
KTOS_ZAWIESIL_STATE
-------------------
        Rozmowca zawiesil polaczenie.

        Scenariusz podstawowy:

        - Uzytkownik postanawia rozlaczyc polaczenie. Abonent wysyla 
        komunikat ROZLACZAM_MSG. Wraca do stanu BASIC_STATE. W stanie
        BASIC_STATE na wszystkie komunikaty dotyczace nieistniejacych 
        polaczen/odwieszen, odpowiada komunikatem ROZLACZAM_MSG.
        
        - Abonent otrzymuje komunikat ODWIESZAM_MSG. Zestawia polaczenie
        z wysylajacym komunikat. Usuwa polaczenie z listy polaczen 
        zawieszonych, dodaje do polaczen aktywnych.


5.1.2 Stany pomocnicze
======================

Ponizsze stany sluza do wyrazenia nastepujacego schematu dzialani:
abonent dostaje komunikat, nastepnie ma alternatywe:
robi jakas czynnosc na ktora ten komunikat mu nadaje uprawnienia,
badz przesyla komunikat dalej.


MAM_LINIA_TOKEN_STATE
---------------------

MAM_POLACZENIE_TOKEN
--------------------

MAM_ZAWIESZONE_TOKEN
-------------------



5.2 Diagram stanow
==================

Podpisy umiszczone sa po prawej badz na gorze wzgledem zaleznosci
(strzalek) do ktorych sie odnosza, chyba ze wyraznie zaznaczono
inaczej przy pomocy | laczacego napis z zaleznoscia(strzalka) ktorej
ma dotyczyc.
Napisy w znacznikach /napis/ sa pomocniczym komentarzem opisujacym
zaleznosci od akcji uzytkownika, znaki "?"/ "!" oznaczaja odpowiednio
odbior/wyslanie komunikatu. 
Tekst pisany mala litera - warunki dodatkowe dotyczace 
np. stanu zmiennych.
|| - alternatywa komunikatow/warunkow, brak symbolu - koniunkcja


5.2.1 Ogolny diagram stanow
===========================


                                LINIA_TOKEN_MSG?
                                free_lines > 0
                                ZAJMUJE_LINIE_MSG!
                                WYWOLUJE_MSG!
                +----------------------+          +---------------+
                | CHCE_ZADZWONIC_STATE | -------> | DZWONIE_STATE |
                +----------------------+          +---------------+     
                  ^                                     | |
                  |                                     | |
                  |      ODRZUCAM_MSG?                  | |
LINIA_TOKEN_MSG?  |   +---------------------------------+ | 
LINIA_TOKEN_MSG!  |   |                                   |
    ----          |   |                                   |ODBIERAM_MSG?
   |    |    +----+   |                                   |
   |    V    |        |                                   +-------------+
+-------------+       | POLACZENIE_TOKEN_MSG?|| +-----------------+     |
| BASIC_STATE |<------+ ZAWIESZONE_TOKEN_MSG?   | ROZMAWIAM_STATE |<----+
|             |-------------------------------->|                 |
|             |                                 |                 |     
|             |                                 |                 |
|             |(ROZLACZAM_MSG?||ROZLACZAM_MSG!) |                 |
|             |ZWALNIAM_LINIE_MSG!              |                 |
|             |LINIa_TOKEN_MSG!                 |                 |
|             |<--------------------------------|                 |
+-------------+<------------+                   +-----------------+
 ^    |                     |                     ^  |  | 
 |    |                     |                     |  |  |
 |    |WYWOLUJE_MSG?        |POLACZENIE_TOKEN_MSG!|  |  |
 |    |                     |   ||                |  |  |
 |    |                     |(free_lines == 0     |  |  |
 |    |                     |ZAJETE_MSG!)         |  |  |
 |    |                     |                     |  |  |
 |    |                     |                     |  |  |
 |    |                     |   free_lines > 0    |  |  | 
 |    |                     |   LINIA_TOKEN_MSG?  |  |  | 
 |    |  +-------------------+  ODBIERAM_MSG!     |  |  | 
 |    +->| KTOS_DZWONI_STATE |--------------------+  |  |       
 |       +-------------------+                       |  | 
 |                                                   |  | 
 |                                                   |  | 
 |ROZLACZAM_MSG!           +-------------------------+  | 
+---------------------+    |    +------------------+    |  
| KTOS_ZAWIESIL_STATE |<---+    | ZAWIESLIEM_STATE |<---+
+---------------------+  |      +------------------+   |
                 ZAWIESZAM_MSG?                   ZAWIESZAM_MSG!  
                

5.2.2 Uszczegolowiony diagram okolic BASIC_STATE
================================================


                        LINIA_TOKEN_MSG!
                  +------------------------ +-----------------------+
                  |     LINIA_TOKEN_MSG?    |                       |
                  |    +------------------> | MAM_LINIA_TOKEN_STATE |
                  |    |                    +-----------------------+
+-------------+<--+    | POLACZENIE_TOKEN_MSG?     +---------------------------+
|             |--------+-------------------------->|                           |
| BASIC_STATE |                              +-----|MAM_POLACZENIE_TOKEN_STATE |
|             |                              |     +---------------------------+
+-------------+                              |/chce sie polaczyc/
   ^    |                                    |ODBIERZ_MSG!
   |    |                                    |     +-----------------+
   |    |                                    +---->| ROZMAWIAM_STATE |
   |    |                                          +-----------------+
   |    | ZAWIESZONE_TOKEN_MSG?  +-------------------+
   |    +----------------------->| MAM_ZAWIESZONE_TOKEN|
   |/nie chce odwieszac/         |                     |        
   +-----------------------------|                     |---+
                                 +---------------------+   |/chce odwiesic/
                                                           |ODWIESZAM_MSG!
                                                           | 
                                 +---------------------+   |
                                 | ROZMAWIAM_STATE     |<--+
                                 +---------------------+


6. Podsumowanie uzywanych numerow
=================================

Numery typow odpowiednich komunikatow:


LINIA_TOKEN_MSG_TYP             101

ZWALNIAM_LINIE_MSG_TYP          102

ZAJMUJE_LINIE_MSG_TYP           103

POLACZENIE_TOKEN_MSG_TYP        104

ZAWIESZONE_TOKEN_MSG_TYP        105



WYWOLUJE_MSG_TYP                201

ODBIERAM_MSG_TYP                202
                
ODRZUCAM_MSG_TYP                203

ROZLACZAM_MSG_TYP               204
        
RZESTAJE_DZWONIC_MSG _TYP       205

ZAWIESZAM_MSG_TYP               206

ODWIESZAM_MSG_TYP               207

ZAJETE_MSG_TYP                  208

NADAL_DZWONISZ_MSG_TYP          209

NADAL_DZWONIE_MSG_TYP           210

ODWIESZAM_GR_MSG_TYP            211



VOICE_MSG_TYP                   301