/**

\defgroup dcc7 Połączenia bezpośrednie od wersji Gadu-Gadu 7.x
\ingroup dcc

\details

Przesyłanie plików zgodne z Gadu-Gadu 7.x jest znacznie prostsze niż
w wersji \ref dcc6 "6.x". Podobnie jak poprzednio, każde połączenie jest
opisane przez strukturę \c gg_dcc7. Nie ma konieczności otwierania gniazda
nasłuchującego, ponieważ jest tworzone dla każdego połączenia osobno.

Gdy chcemy wysłać plik, wywołujemy \c gg_dcc7_send_file() i obserwujemy
zdarzenia zarówno z \c gg_session, jak i \c gg_dcc7. Parametry funkcji
to struktura sesji, numer odbiorcy, nazwa pliku, nazwa pliku w kodowaniu
CP1250 (jeśli NULL to brana jest oryginalna nazwa) i skrót pliku
wyznaczony algorytmem SHA1 (jeśli NULL to biblioteka liczy, blokując
na ten czas działanie aplikacji). Wysyłanie jest praktycznie bezobsługowe,
wystarczy zareagować na zdarzenie \c GG_EVENT_DCC7_DONE i
\c GG_EVENT_DCC7_ERROR w gg_dcc7 oraz \c GG_EVENT_DCC7_REJECTED i
\c GG_EVENT_DCC7_ERROR w \c gg_session, żeby wiedzieć, kiedy zwolnić zasoby
funkcją \c gg_dcc7_free().

Jeśli ktoś do nas wysyła plik, otrzymamy zdarzenie \c GG_EVENT_DCC7_NEW
z sesji. Należy przygotować deskryptor otwarty do zapisu, wpisać jego
wartość do pola \c file_fd struktury \c gg_dcc7 i wywołać \c gg_dcc7_accept()
albo od razu wywołać \c gg_dcc7_reject(), jeśli nie chcemy połączenia. Tak samo
jak przy wysyłaniu, wystarczy obsłużyć \c GG_EVENT_DCC7_DONE w strukturze
\c gg_dcc7 i \c GG_EVENT_DCC7_ERROR w strukturach \c gg_session i \c gg_dcc7.

Deskryptor połączenia (pole \c fd struktury \c gg_dcc7) może zmienić się
po wywołaniu funkcji \c gg_dcc7_accept() lub otrzymaniu jednego ze zdarzeń:
\c GG_EVENT_DCC7_CONNECTED, \c GG_EVENT_DCC7_ACCEPT, \c GG_EVENT_DCC7_PENDING.

\section dcc7-settings Opcje połączeń

Ponieważ jedna ze stron odbiera połączenie bezpośrednie, konieczne jest
nasłuchiwanie na porcie TCP. Domyślne ustawienia pozwalają na poprawną
pracę jeśli co najmniej jedna ze stron połączenia ma bezpośredni dostęp
do sieci, bez translacji adresów i/lub portów. Pole
\ref gg_login_params::client_addr "\c client_addr"
struktury \c gg_login_params
mówi na jakim adresie należy nasłuchiwać. Domyślna wartość \c 0.0.0.0 powoduje
nasłuchiwanie na wszystkich dostępnych interfejsach komputera. Pole
\ref gg_login_params::client_port "\c client_port"
mówi na którym porcie
należy nasłuchiwać. Domyślna wartość \c 0 powoduje nasłuchiwanie na losowym
dostępnym porcie. Należy zwrócić uwagę, że jeśli jedno połączenie będzie
nasłuchiwać na danym porcie, inne już nie będzie w stanie, co spowoduje błąd.

Druga para ustawień dotyczy publicznego adresu i portu. Ta strona połączenia,
która nasłuchuje na porcie TCP wysyła do drugiej strony swój adres i numer
portu. Pole \ref gg_login_params::external_addr "\c external_addr"
mówi jaki adres zostanie wysłany. Domyślna wartość \c 0.0.0.0 powoduje
wysłanie adresu IP, z którego sesja łączy się z serwerem. Pole
\ref gg_login_params::external_port "\c external_port"
mówi jaki port zostanie wysłany. Domyślna wartość \c 0 powoduje wysłane portu,
na którym połączenie nasłuchuje.

\section dcc7-todo Do zrobienia

- Rozmowy głosowe.

- Nawiązywanie połączeń przez serwer.

*/
