Aplikacja ma strukturę warstwową. Warstwy, które wyróżniliśmy w trakcie projektu to:
Warstwa zarządzania projektem
W tej warstwie zaimplementowano globalne operacje na projekcie: zapis projektu do pliku, wczytanie projektu z pliku, tryby pracy nad projektem. Zdefiniowane jest tutaj także główne okno projektu wraz z przyciskami, menu, paskiem stanu, obszarem roboczym oraz panelem właściwości. Trzymane są tutaj również listy obiektów logicznych. Wszystkie operacje wykonywane na obiektach logicznych i graficznych wykonywane są w sposób pośredni, tzn. zaznaczenie obiektu w obszarze roboczym i wywołanie jakiegoś polecenia powoduje sprawdzenie wszystkich obiektów i ustalenie tego, którego położenie pokrywa się ze współrzędnymi zaznaczenia. Następnie wywoływana jest odpowiednia metoda obsługująca daną operację, zadeklarowana we wspólnej dla wszystkich nadklasie (L_Element -- dla elementów logicznych, G_Element -- dla elementów graficznych). Poprzez mechanizm dziedziczenia, w zależności od typu obiektu, realizowana jest właściwa obsługa polecenia.
Na przykład przy zapisie lub odczycie z pliku na rzecz każdego z elementów wywołuje się odpowiednią metodę zapisującą lub odczytującą wartości jego atrybutów z pliku.
Warstwa graficzna projektu sieci
Ta warstwa zawiera implementację elementów graficznych wchodzących w skład projektu topologii sieciowej. Każdy z obiektów posiada nadpisane podstawowe metody zdefiniowane we wspólnej nadklasie G_Element. Są to na przykład metody sprawdzające czy dane współrzędne znajdują się wewnątrz obiektu, metoda odrysowująca obiekt, metody przemieszczające obiekt itp. Podstawowe klasy graficzne zorganizowane są w następującą hierarchię:
Warstwa fizyczno-logiczna
Zaimplementowane tutaj obiekty składają się z jednej strony na logiczną strukturę projektu (tzn. komputery i rutery podłączone za pomocą interfejsów do kabli), z drugiej strony zaimplementowana jest na nich także warstwa fizyczna sieci -- znajdują się tutaj metody odpowiedzialne za komunikację sieciową na najniższym poziomie. Na podstawie zbudowanej topologii sieci wiadomo jakie elementy logiczne muszą się ze sobą komunikować przy transmisji danych w sieci.
Struktura klas zdefiniowana na tym poziomie to:
Warstwy protokołów
W tych warstwach zdefiniowano klasy implementujące poszczególne protokoły oraz klasy definiujące struktury pakietów obsługiwanych przez te protokoły. Protokoły są osadzone na maszynach (komputerach i ruterach). Kolejne protokoły coraz wyższych rzędów tworzą kolejne warstwy. Budowa taka daje możliwość łatwej rozbudowy programu poprzez dodawanie kolejnych protokołów wykorzystujących jako podstawę działania protokoły już zaimplementowane.
W obecnej chwili zaimplementowane są następujące protokoły:
Warstwa aplikacji
W tej warstwie są zdefiniowane aplikacje działające na maszynach, wykorzystujące któryś z dostępnych protokołów jako podstawę do komunikacji. Dodatkowo dla każdej aplikacji zdefiniowany jest interfejs użytkownika, pozwalający na zadanie parametrów startowych dla aplikacji. Stałym parametrem startowym aplikacji jest opóźnienie jej startu względem czasu zero. Zaimplementowane aplikacje to:
Warstwa zarządzania symulacją
W warstwie tej zaimplementowano mechanizmy służące do przeprowadzenia symulacji. Symulacja w aplikacji PROTONET sterowana jest centralnie -- głównym obiektem nadzorującym symulację jest obiekt klasy Scheduler. Zajmuje się on rozdziałem sterowania pomiędzy inne obiekty. Obiekty innych klas zgłaszają zapotrzebowanie na sterowanie poprzez metody udostępnione przez klasę Scheduler:
Aby dowolny obiekt mógł bezpośrednio otrzymać sterowanie, musi dziedziczyć po klasie ScheduledObj. W klasie tej zdefiniowano trzy wirtualne metody, które klasa dziedzicząca musi redefiniować:
Warstwa prezentacji wyników symulacji
System PROTONET umożliwia śledzenie zdarzeń zachodzących w systemie w czasie symulacji. Prezentacja zdarzeń odbywa się w okienkach otwieranych na życzenie użytkownika. Okienko takie wyświetla informacje o zdarzeniach, pakietach, głównych procesach decyzyjnych zachodzących w jednym z elementów architektury sieciowej (możliwe jest podsłuchiwanie zdarzeń w komputerze, ruterze, kablu i dowolnym interfejsie -- w tym także lokalnym). Dodatkowo istnieje możliwość otwarcia okienka podglądu dla zdarzeń zachodzących w procesie zarządzającym przydziałem czasu. Informacje można filtrować ze względu na warstwę, w której zachodzą zdarzenia (warstwa fizyczna oraz poszczególne protokoły), a także ze względu na treść (może to być zawartość pakietów i/lub komunikaty o zdarzeniach i decyzjach podejmowanych przez oprogramowanie).
Poszczególne elementy systemu generują sygnały z komunikatami obudowanymi znacznikami języka QML, komunikaty te są przechwytywane i filtrowane (mechanizmem sygnałów i slotów) przez okienka podglądu zdarzeń. QML jest językiem znacznikowym zgodnym ze specyfikacją XML obsługiwanym przez klasy dostarczone wraz z biblioteką Qt. Język ten umożliwia kolorowanie, wybór krojów czcionki, stylów wyliczania itp. w stosunku do prezentowanego tekstu.
Rysunki , i
obrazują budowę główych elementów aplikacji na tle jej struktury warstwowej.