GLIWICE 26-05-2012 Kontakt Dokumentacja z projektu PROGRAMOWANIA OBIEKTOWEGO
Wydział Elektryczny Informatyka semestr II, grupa I sekcja I Szczygieł Błażej Siudyka Aleksandra Pełka Agnieszka Lewandowski Marcin 2
Spis treści 1. Podręcznik użytkownika... 4 1.1.Wymagania sprzętowe... 4 1.2.Panel programu wraz z opisem funkcji... 4 2. Dokumentacja projektowa... 8 2.1.Główne założenia projektu... 8 2.2.Graficzne przedstawienie architektury programu... 9 2.3.Główne klasy programu (biblioteka LibKontakt)... 14 2.3.1.Buddy... 14 2.3.2.BuddyList... 15 2.3.3.ByteArray... 15 2.3.4.DataTime... 15 2.3.5.KontaktException... 16 2.3.6.LibKontakt... 16 2.3.7.Message... 17 2.3.8.Mutex... 18 2.3.9.MutexLocker... 19 2.3.10.Network... 19 2.3.11.NetworkPlugin... 21 2.3.12.TCPSocket... 21 2.3.13.Thread... 22 2.4.Klasy interfejsu pseudo - graficznego... 22 2.5.Pluginy... 28 2.5.1.GaduGadu... 28 2.6.Biblioteki... 29 3
1. Podręcznik użytkownika 1.1. Wymagania sprzętowe Procesor: 20 MHz Pamięć RAM: 2MB Miejsce na dysku: 1 MB System operacyjny: Windows/Linux/BSD Opcjonalnie: PC-Speaker /BSD 1.2. Panel programu wraz z opisem funkcji Uruchomienie komunikatora Kontakt odbywa się za pomocą wybrania pliku Kontakt-ncurses w systemie Linux, a Kontakt - pdcurses w Windows znajdującego się w głównym folderze programu. Po uruchomieniu, pojawia się okno powitalne, które informuje użytkownika o nazwie programu oraz dostępnych sieciach komunikatorów (tutaj GaduGadu). Tak wygląda program zaraz po uruchomieniu w terminalu Konsole. 4
Po wybraniu sieci ukazuje się okienko logowania gdzie, jako LOGIN podajemy numer kontaktowy komunikatora, a HASŁO jest kluczem do wybranego przez nas konta. W tym oknie możemy również wybrać jeden z podanych statusów. Numery wraz z loginami zapisanych kontaktów zostają pobrane z serwera wybranej sieci ukazuje się użytkownikowi właściwe okno komunikatora, gdzie za pomocą dostępnych opcji może przeprowadzić rozmowę z wybraną przez siebie osobą. Skróty klawiszowe odpowiadające za daną funkcję są wyszczególnione i opisane poniżej właściwego okna, co ułatwia korzystanie z komunikatora. Główne okno składa się z trzech mniejszych: Kontakty lista kontaktów pobranych z serwera; Status status wybranej osoby wraz z opisem, który udostępnia; Lista rozmów aktualnie otwarte okna rozmowy. Pewnym uprzyjemnieniem korzystania z komunikatora Kontakt jest informacja o pisanej wiadomości przez użytkownika w czasie rzeczywistym. Komunikator Kontakt udostępnia również funkcje, dzięki którym możemy modyfikować swoją listę kontaktów, dodając bądź usuwając wybrany numer. 5
Komunikator posiada możliwość wczytywania listy kontaktów z pliku oraz pobieranie jej z serwera oraz tzw. helpa, który informuje użytkownika o kilku dodatkowych, pomocnych funkcjach (np. zmiana koloru interfejsu, sygnał dźwiękowy wiadomości czy uppload listy). 6
Okno pomocy uruchamiamy dopisując przełącznik -help lub -h. Zrzut ekranu okna pomocy. Interfejs po wpisaniu komendy bw. 7
2. Dokumentacja projektowa 2.1. Główne założenia projektu Założeniem projektu było stworzenie prostego programu komputerowego, w pełni zorientowanego obiektowo, pozwalającego na przesyłanie natychmiastowych komunikatów pomiędzy dwoma lub więcej komputerami, poprzez sieć komputerową. Dzięki możliwości sprawdzenia aktualnego statusu o obecności użytkownika, komunikator jest znacznie sprawniejszy od poczty elektronicznej pozwala na rozmowę w czasie rzeczywistym. Dodatkowo, tworząc program, chcieliśmy by jego wymagania były znacznie niższe od wymagań ogólnodostępnych komunikatorów, co nie obciąża samego komputera i usprawnia prace komunikatora. Osiągnęliśmy to dzięki prostej szacie graficznej i zrezygnowaniu z wielu zbędnych funkcji, które nie znajdują się w podstawowych założeniach komunikatora internetowego. Ponadto stworzony przez nas program równie dobrze będzie się sprawował na platformie systemu Linux jak i Windows co znacznie zwiększa grono zainteresowanych użytkowaniem Kontaktu osób. 8
2.2. Graficzne przedstawienie architektury programu (UML) 9
10
11
12
13
2.3. Główne klasy programu (biblioteka LibKontakt) LibKontakt jest to główna biblioteka programu, zajmująca się ładowaniem pluginów sieci, obsługą wątków, protokołu TCP czy obsługą listy kontaktów. Biblioteka ta, dostarcza klasy abstrakcyjne na użytek pluginów sieci (np. Gadu-Gadu) co czyni ją dość ważną w projekcie. 2.3.1. Buddy Buddy.cpp korzysta z nagłówku Buddy.hpp, który reprezentuje klasę dla pojedynczego kontaktu. namespace Kontakt class Buddy friend class BuddyList; public: Buddy(const std::string &_name = std::string(), const std::string &addr = std::string(),bool blocked=false); bool isvalid() const; void clear(); int address_int() const; std::string address() const; std::string name() const; std::string description() const; std::string status() const; bool isblocking() const; bool isblocked() const; void setaddress ( const std::string &addr); void setname ( const std::string &_name); void setblocked ( const bool blocked); bool operator == (const Buddy &other) const; bool operator > (const Buddy &other) const; bool operator < (const Buddy &other) const; void operator = (const Buddy &other); operator std::string() const; private: std::string _name,addr,descr,_status; bool blocked, blocking; ; #endif 14
Klasa Buddy składa się z konstruktora przechowującego nazwę użytkownika, adres oraz sprawdza czy użytkownik nie jest zablokowany. W pliku Buddy.cpp znajdziemy metody odpowiedzialne kolejno za: wyświetlanie nazwy użytkownika, loginu bądź numeru kontaktowego, statusu czy opisu. Istnieją również metody sprawdzające czy dany rozmówca nie znajduje się na liście zablokowanych użytkowników oraz czy sami nie figurujemy na owej liście. 2.3.2. BuddyList Klasa Buddy list stanowi nic innego jak zbiór listy kontaktów przechowywany w pamięci (klasa abstrakcyjna). Klasa ta zawiera strukturę danych reprezentująca dwukierunkową listę ze swobodnym dostępem do wszystkich elementów przechowywanych w klasie Buddy, jest zabezpieczona przed możliwością użycia danych przez dwa wątki równocześnie (mutex). BuddyList wczytuje oraz zapisuje do pliku binarnego listę kontaktów. Zaprezentowana niżej metoda ilustruje mechanizm wyszukiwania kontaktu po nazwie. Buddy BuddyList::find(const std::string &name) const MutexLocker ml( mutex ); for( size_t u = 0; u < buddies.size(); ++u) if( buddies[ u ]-> name() == name) return *buddies[ u ]; return Buddy(); Prócz wyżej wymienionych funkcji, BuddyList zawiera również metody odpowiedzialne za dodanie, modyfikację oraz usunięcie kontaktu. 2.3.3. ByteArray Klasa tablicy bajtów zawierająca metody odpowiedzialne za rozszerzanie tablicy. Rozszerza możliwości kontenera std::vector< unsigned char >. 2.3.4. DataTime Klasa DataTime to nic innego jak klasa odpowiedzialna za sprawdzanie wyświetlanie czasu i daty prowadzonej rozmowy pomiędzy użytkownikami komunikatora Kontakt oraz wyświetlania jej w postaci łańcucha znaków. 15
Zaprezentowana poniżej metoda zwraca pełną datę a kolejna odpowiedzialna jest za wyświetlanie czasu. string DateTime::getDate() const char tmp[ 14 ]; snprintf( tmp, sizeof tmp, "%.2u.%.2u.%u", day(), month(), year()); return tmp; string DateTime::getTime() const char tmp[ 12 ]; snprintf( tmp, sizeof tmp,"%.2u:%.2u:%.2u", hour(), minute(), second()); return tmp; 2.3.5. KontaktException KontaktException jest to klasa wyjątków, błędów zgłaszanych w przypadku nieprawidłowej komendy bądź błędnie użytkowanego programu. class KontaktException : public std::exception public: KontaktException( const char *msg ) : msg( msg ) const char *what() const throw() return msg; private: const char *msg; ; 2.3.6. LibKontakt Klasa wyszukująca i ładująca pluginy sieci. 16
2.3.7. Message Klasą odpowiedzialną za odbieranie/wysyłanie wiadomości jest klasa Message: class Message public: Message(); Message( const std::string &txt, const std::string &addr, const DateTime &datew = DateTime(), const DateTime &dated = DateTime() ); Message( const std::string &txt, int addr, const DateTime &datew = DateTime(), const DateTime &dated = DateTime() ); virtual ~Message() void clear(); std::string text() const; std::string address() const; DateTime wyslano() const; DateTime dostarczono() const; virtual int send( const std::string &txt, const std::string &addr ); virtual Message get(); protected: std::string txt, addr; DateTime datew, dated; ; W jej skład wchodzi konstruktor, który ładuje łańcuchy znaków nazw adresata wiadomości, czasu, daty oraz treść samej wiadomości. Klasa zawiera również wirtualny destruktor oraz metody wirtualne do wysyłanie i odbierania wiadomości. int Message::send( const string &txt, const string &addr ) this->txt = txt; this->addr = addr; datew.setcurrent(); dated.clear(); return 0; Metoda odpowiedzialna za wysłanie wiadomości do serwera (wymaga implementacji w pluginie). Message Message::get() return Message(); 17
2.3.8. Mutex Prezentowana poniżej klasa chroni dane przed ich użyciem przez różne wątki równocześnie. class Mutex public: Mutex(); ~Mutex(); void lock(); void unlock(); private: void *m; ; Mutex.hpp Mutex::Mutex() #if defined _WIN32 defined _WIN64 m = new CRITICAL_SECTION; InitializeCriticalSection( ( CRITICAL_SECTION * )m ); #else m = new pthread_mutex_t; pthread_mutex_init( ( pthread_mutex_t * )m, NULL ); #endif Mutex::~Mutex() #if defined _WIN32 defined _WIN64 DeleteCriticalSection( ( CRITICAL_SECTION * )m ); delete ( CRITICAL_SECTION * )m; #else pthread_mutex_destroy( ( pthread_mutex_t * )m ); delete ( pthread_mutex_t * )m; #endif void Mutex::lock() #if defined _WIN32 defined _WIN64 EnterCriticalSection( ( CRITICAL_SECTION * )m ); #else pthread_mutex_lock( ( pthread_mutex_t * )m ); #endif void Mutex::unlock() #if defined _WIN32 defined _WIN64 LeaveCriticalSection( ( CRITICAL_SECTION * )m ); #else pthread_mutex_unlock( ( pthread_mutex_t * )m ); #endif Mutex.cpp 18
2.3.9. MutexLocker W klasie znajdziemy funkcję, która po stworzeniu obiektu wykonuje konstruktor, który blokuje informację podaną jako parametr. Po wykonaniu destruktora, mutex odblokowuje się. 2.3.10. Network Klasa Network stanowi nic innego jak interfejs sieci. NetworkPlugin, która posiada pełny dostęp do wszystkich pluginów oraz zawiera szereg metod odpowiedzialnych za wyświetlanie nazwy sieci z którą chcemy się połączyć (np. Gadu-Gadu), logowanie do serwera, sprawdzania i uaktualniania statusu, pobierania listy kontaktów czy zapisywania ustawień (opis, status, login, hasło) odpowiednio zaszyfrowanych za pomocą szyfru do pliku. Jest to jedna z ważniejszych klas na której bazują pozostałe. namespace Kontakt enum EVENT NO_EVENT, MY_STATUS, UPDATE_BUDDY_LIST, NEW_MESSAGE, MESSAGE_DELIVERED, TYPING ; class Network friend class NetworkPlugin; public: virtual std::string name() const = 0; virtual bool isconnected() const = 0; virtual void login( const std::string &login, const std::string &haslo ) = 0; virtual void logout() = 0; virtual void setcallback( void (*cb)( EVENT, Network & ) ) = 0; virtual void setdescription( const std::string &descr ) = 0; virtual std::string description() const = 0; virtual std::deque< std::string > statuslist() const = 0; virtual bool setstatus( const size_t status ) = 0; virtual bool setstatus( const std::string &status_name ) = 0; virtual size_t status() const = 0; virtual void updatestatus() = 0; virtual void downloadbuddylist() = 0; virtual Message &message() const = 0; virtual BuddyList &buddies() const = 0; virtual void typing( const bool on, const std::string &address = std::string() ) = 0; void savesettings( const std::string &login, const std::string &haslo ); void loadsettings( std::string &login, std::string &haslo ); 19
enum PARAMETERS ALL_PARAMETERS = 1, ONLY_USER_PARAMETERS ; std::deque< std::string > allparameters( PARAMETERS type = ALL_PARAMETERS ) const; std::string getparameter( const std::string & ) const; virtual bool modparameter( const std::string &key, const std::string &val ); protected: virtual ~Network() mutable std::map< std::string, std::string > parameters; ; Prezentowana poniżej funkcja której zadaniem jest pobranie łańcucha znaków i zapis go do pliku. static void zapisz_string(const string &str, FILE *f) uint16_t l = str.length(); fwrite( &l, 1, sizeofl, f); fwrite( str.c_str(), 1, l, f); Network.cpp Przedstawiona poniżej metoda ma za zadanie zapisu ciągów znaków odpowiedzialnych za nazwę komunikatora i sieci, loginu, hasła, opisu oraz statusu. void Network::saveSettings( const string &login, const string &haslo ) FILE *f = getfile( *this, "wb" ); if ( f ) zapisz_string( "KONTAKT", f ); zapisz_string( name(), f ); zapisz_string( XOR_reverse( login ), f ); zapisz_string( XOR_reverse( haslo ), f ); zapisz_string( XOR_reverse( description() ), f ); uint16_t l = status(); fwrite( &l, 1, sizeof l, f ); deque< string > params = allparameters( ONLY_USER_PARAMETERS ); for ( size_t s = 0 ; s < params.size() ; ++s ) zapisz_string( getparameter( params[ s ] ), f ); fclose( f ); Network.cpp 20
2.3.11. NetworkPlugin NetworkPlugin jest klasą przechowującą metody odpowiedzialne za załadowanie pluginów sieci (biblioteki.dll- Windows i.so Linux/BSD). 2.3.12. TCPSocket TCPSocket stanowi klasę odpowiedzialną za obsługę protokołu TCP/IP, najprościej mówiąc, zawdzięczamy tej klasie połączenie z serwerem i możliwość komunikowania się. Znajdziemy tutaj również zbiór funkcji odpowiedzialnych za wysyłanie danych do serwera. Przedstawiony poniżej fragment kodu najlepiej przedstawia główne zadanie klasy TCPSocket. Zaprezentowana metoda odpowiada za połączenie komunikatora z serwerem sieci a o realizacji owego połączenia, użytkownik zostaje informowany poprzez krótkie wyświetlane komunikaty (klasy wyjątków). void TCPSocket::connect( const std::string &address, uint16_t port ) if ( isconnected() ) throw KontaktException( "Jesteś już połączony" ); if ( ( sock = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP ) ) < 1 ) throw KontaktException( "Socket error" ); hostent *host; if (!( host = gethostbyname( address.c_str() ) ) ) disconect(); throw KontaktException( "Błąd połączenia i/lub DNS" ); sockaddr_in serv_addr; memset( &serv_addr, 0, sizeof( sockaddr_in ) ); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = *( uint32_t * )( *host->h_addr_list ); serv_addr.sin_port = htons( port ); if ( ::connect( sock, ( sockaddr * )&serv_addr, sizeof serv_addr ) < 0 ) disconect(); throw KontaktException( "Nie udało sie połączyć z serwerem" ); int flag = 1; setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,(const char*)&flag,sizeof flag ); if (!start() ) disconect(); throw KontaktException( "Nie udało sie uruchomić wątku" ); 21
2.3.13. Thread Klasa Thread jest to klasa wątku zaprzyjaźniona z funkcją thr_func() (funkcja wywoływana w wątku), która może odwoływać się do części private i protected tej klasy. Zawiera w sobie metody odpowiedzialne za wszelkie procesy wykonywane na wątkach. Zaprezentowana poniżej funkcja wywołuje bibliotekę pthread lub WinApi w wątku, która zaś wykonuje wirtualną metode run() w klasie podanej jako parametr _thr. void *thr_func( void *_thr ) Thread *thr = ( Thread * )_thr; thr->run(); thr->p->isrunning = false; return NULL; 22
2.4. Klasy interfejsu pseudo - graficznego Wszelkie klasy odpowiedzialne za wygląd, interfejs graficzny z których korzysta główna biblioteka programu LibKontakt - znajdują się w bibliotece Kontakt-curses. Znajdziemy tutaj klasy odpowiedzialne za powitalny ekran komunikatora Kontakt, ekran ustawiania statusu, okno rozmowy jak i wszelkie inne okienka oraz komunikaty wyświetlane w czasie użytkowania programu. Dla przykładu zaprezentujemy klasę EkranRozmowy, odpowiedzialną za wyświetlanie okna konwersacji. namespace Kontakt class Network; class EkranRozmowy : public Ekran public: EkranRozmowy( const std::string &me, const std::string &buddyaddress, const Network &net ); ~EkranRozmowy(); void refresh(); void border_refresh(); bool nieprzeczytane(); bool jakodostarczona( const int seq ); void pisanie( const bool start ); std::string getmsg( int &FunctionKey ); void addmsg( const std::string &msg, const DateTime &wyslano, const DateTime &dostarczono ); void addmsg( const std::string &msg, const int seq ); private: const Network &net; OknoWpisywania wpisywanie; OknoRozmowy rozmowa; bool nowa_wiad; ; #endif EkranRozmowy.hpp 23
namespace Kontakt using namespace std; EkranRozmowy::EkranRozmowy( const string &me, const string &buddyaddress, const Network &net ) : Ekran( ROZMOWA, buddyaddress ), net( net ), wpisywanie( me ), rozmowa( buddyaddress, net.buddies(), me ), nowa_wiad( false ) EkranRozmowy::~EkranRozmowy() if ( rozmowa.trescrozmowy.niepuste() ) FILE *f = getfile( net, "a", nazwa().c_str() ); if ( f ) rozmowa.trescrozmowy.zapisz( *f ); fclose( f ); void EkranRozmowy::refresh() if (!current ) return; nowa_wiad = false; const int height = 0.75*LINES; rozmowa.setgeometry( 0, 0, COLS, height ); wpisywanie.setgeometry( 0, height, COLS, LINES-height-1 ); void EkranRozmowy::border_refresh() rozmowa.refresh_border = wpisywanie.refresh_border = true; bool EkranRozmowy::nieprzeczytane() return nowa_wiad; bool EkranRozmowy::jakoDostarczona( const int seq ) return rozmowa.trescrozmowy.jakodostarczona( seq ); void EkranRozmowy::pisanie( const bool start ) rozmowa.czy_pisze = start; string EkranRozmowy::getMsg( int &FunctionKey ) string msg = wpisywanie.getmsg( FunctionKey ); switch ( FunctionKey ) case KEY_HOME: rozmowa.trescrozmowy.home(); break; case KEY_END: rozmowa.trescrozmowy.end(); 24
break; case KEY_UP: --rozmowa.trescrozmowy; break; case KEY_DOWN: ++rozmowa.trescrozmowy; break; return msg; void EkranRozmowy::addMsg( const string &msg, const DateTime &wyslano, const DateTime &dostarczono ) nowa_wiad = true; rozmowa.addmsg( msg, -1, wyslano, dostarczono ); void EkranRozmowy::addMsg( const string &msg, const int seq ) rozmowa.addmsg( msg, seq, DateTime::getCurrent() ); EkranRozmowy.cpp Klasa EkranRozmowy dziedziczy z klasy Ekran i składa się z konstruktora zawierającego łańcuch znaków wyświetlający nazwę (tutaj: Ja ), numer bądź login rozmówcy oraz referencję klasy Network, potrzebnej do pobrania listy kontaktów. Niżej znajdziemy destruktor oraz metody odpowiedzialne za sprawdzanie czy znajduje się jakaś nowa, nieprzeczytana wiadomość, czy widomość została dostarczona do serwera oraz czy rozmówca odpisuje w czasie rzeczywistym na dostarczoną wiadomość. Dość ciekawą klasą z wachlarza klas interfejsu graficznego, jest Okno. Składa się ona z konstruktora zawierającego nazwę danego okienka jak, np. Kontakty czy Lista rozmów, oraz metod odpowiedzialnych za geometrię oraz kolor okna jak i ustawianie kursora w odpowiednim miejscu czy czyszczenie ekranu. To dzięki niej program wygląda estetycznie i przyjaźnie dla użytkownika. Zawarte w niej instrukcje pozwalają również użytkownikowi na poruszanie się po komunikatorze za pomocą przycisków klawiatury. 25
void Okno::setGeometry( int x, int y, int w, int h ) if (!win ) if ( tytul.empty() ) win = newwin( h, w, y, x ); else if ( tytul == " " ) tytul = ""; border_win = newwin( h, w, y, x ); win = subwin( border_win, h-2, w-2, y+1, x+1 ); background( KOLOR_OKNA ); ::keypad( win, keypad ); else if ( border_win ) ++x; ++y; w -= 2; h -= 2; if ( getx()!= x gety()!= y width()!= w height()!= h ) if ( border_win ) wresize( border_win, h+2, w+2 ); mvwin( border_win, y-1, x-1 ); refresh_border = true; wresize( win, h, w ); mvwin( win, y, x ); geometry_changed = true; if ( refresh_border ) border_win_draw(); draw(); geometry_changed = false; Metoda SetGeometry() odpowiedzialna za ustawianie pozycji wyświetlanych okien oraz za tworzenie okna za pierwszym wywołaniem. Ostatnią z klas, którą chcielibyśmy zaprezentować jest klasa ScrollAreaRozmowa, która zapewnia wyświetlanie rozmowy z możliwością przewijania w oknie. Zawarte w niej metody dodatkowo odpowiedzialne są za sprawdzanie czy istnieje wiadomość do zapisania oraz czy dana wiadomość została dostarczona do odbiorcy. Ponadto program poprzez instrukcje zawarte w metodzie zapisz() pozwala na utworzenie swojego rodzaju archiwum rozmów, które zostaje zapisane do pliku tekstowego, co umożliwia sprawdzenie treści rozmowy sprzed kilku dni. 26
void ScrollAreaRozmowa::zapisz( FILE &f ) if ( ftell( &f ) ) fputc( '\n', &f ); fprintf( &f, "Poniższe wiadomości zapisano %s:\n", DateTime::getCurrent().toString( true ).c_str() ); for( deque<wiadomosc>::iterator it = buff.begin(); it!= buff.end(); ++it ) if ( it->seq <= 0 ) if ( it->seq == -1 ) fputs( okno.nick.c_str(), &f ); else fputs( okno.me.c_str(), &f ); fprintf( &f, " (%s): %s\n", it->date.c_str(), it->msg.c_str() ); Powyżej opisana metoda zapisu rozmowy do pliku. 27
2.5. Pluginy 2.5.1.GaduGadu Znajdziemy tutaj zbiór dodatkowych modułów, które pozwolą nam połączyć się z siecią Gadu-Gadu. Klasy składające się na GaduGadu.pro to: GGBuddyList dziedziczona po klasie BuddyList. Stanowi uzupełnienie klas czysto wirtualnych odpowiedzialnych za usuwanie oraz dodawanie z wysłaniem informacji do serwera GG. W GGBuddyList znajduje się również metoda bool modify( const int nr, const char *const descr, const int descr_len, const std::string&status, const bool blocking );, która odpowiada za modyfikację danych znajomego (w przypadku zmiany statusu czy opisu). GGMessage dziedziczona po klasie Message. Stanowi uzupełnienie funkcji wirtualnych odpowiedzialnych za wysyłanie oraz odbieranie wiadomości. GGNet dziedziczona po klasie Network. Zawiera w sobie całą obsługę protokołów GaduGadu oraz metody odpowiedzialne za połączenie z serwerem GaduGadu, logowanie do serwera, pobranie listy kontaktów oraz jej modyfikację. Znajdziemy tutaj też kontener odpowiedzialny za status kontaktu. GGStructures zawiera w sobie struktury narzucone przez operatora sieci GaduGadu, niezbędne do prawidłowego funkcjonowania Kontaktu. 28
2.6. Biblioteki Prócz standardowych dostępnych bibliotek, posłużyliśmy się dodatkowo: Biblioteki dla platformy systemowej Linux Ncurses biblioteka pozwalająca na tworzenie interfejsu w trybie tekstowym, będącym połączeniem CLI (Command Line Interface) i GUI (Graphical User Interface) pod platformą Linux. Pthreads (POSIX Threads) specyfikacja określająca implementację wielowątkowości, która obejmuje podstawowe mechanizmy zarządzania wątkami, obiektami synchronizującymi oraz definiuje jednolity interfejs programowania aplikacji dla języka C. Do podstawowych funkcji biblioteki należą: tworzenie wątków, synchroniczne kończenie wątków, lokalne dane wątku czy stos funkcji kończących, co znacznie ułatwia zarządzanie zasobami w języku C. Biblioteki dla platformy systemowej Windows Pdcurses - biblioteka pozwalająca na tworzenie interfejsu w trybie tekstowym będącym połączeniem CLI (Command Line Interface) a GUI (Graphical User Interface) pod platformą Windows. Win32threads odpowiednik Pthreads przystosowany do pracy na platformie Windows, odpowiadający za tworzenie i zarządzanie wątkami. Biblioteki wspólne dla platformy systemowej Linux i Windows Zlib biblioteka służąca do kompresji danych, wykorzystywana w projekcie tylko do dekompresacji listy kontaktów pobranej z serwera. Dirent biblioteka zawierająca funkcje ułatwiające wyświetlanie zawartości katalogów i plików. STL biblioteka zawierająca algorytmy, pojemniki, iteratory oraz inne konstrukcje w formie szablonów, gotowe do użycia w programach. Standard języka C++. Sockety 29