Author: Walerian Sokoowski (C) Copyright 2002
You a free to change it in every way you want.

----- (0) disclaimer ------------------------------
Opisuj tu protok przesyania plikw w midzy klientami G*du-G*du.
Informacj czerpaem ze rde gglib w ktrej z wersji
oraz z dowiadcze przeprowadzanych wasnorcznie. W tym celu nic nie 
desasemblowaem i nie reingenerowaem.

----- 1) zamiast wstpu ------------------------------------------------------
Protok jest pewn implementacj czci powszechnie znanego DCC 
opisanego w ktrym z RFC. 

Obowizuj naturalne dla GG ustalenia, a wic sizeof(int) = 4 oraz transmisja
jest intel endian. 

----- 2) nawizanie poczenia ------------------------------------------------
Klient czc si z serwerem GG wysya swj adres IP i port, na ktrym
nasuchuje (patrz opis gg_login). Gdy ktry z kontaktw staje si 
dostpny (wanie si poczylimy lub on wanie zmieni stan) 
otrzymujemu powiadomienie o tym w paczce typu GG_NOTIFY_REPLY, 
ktra zawiera jego adresek IP i port, na ktrym on nasuchuje (patrz
opis gg_notify_reply). Tak wic w najprostszej sytuacji, gdy nie dziel
nas adne firewalle strona wysyajca ma adres odbiorcy.
 
Jeli odbiorca znajduje si za firewallem, a nadawca nie, to nadawca
moe poprosi odbiorc o nawizanie poczenia wysyajc do niego
komunikat typu 0x0010 (GG_CLASS_CTCP) o zawartoci 0x02. W taki sposb
na czas nawizania poczenia nadawca i odbiorca zamieniaj si rolami.
I do koca punktu bd ich nazywa wg. penionych rl.

A wic nadawca nawizuje poczenie TCP z adresem odbiorcy i wysya
swj UIN i UIN odbiorcy:

	struct {
		int uin1; /* mj numerek  */
		int uin2; /* jego numerek */
	};

Odbiorca potwierdzajc nawizanie poczenia z klientem GG wysya 4 bajty:
 
	struct {
		char [] "UDAG";
	};

Jeli nadawca ma wysya plik, to wysya 0x0002:
 
	#define GG_DCC_CATCH_FILE 0x0002

Jeli to odbiorca ma wysya, to nadawca wysya 0x0003:
	
	#define GG_DCC_WANT_FILE 0x0003

Po tym wszystkim uwaa si poczenie za nawizane.

----- 3) transmisja pliku: strona nadawcy -------------------------------------
Nadawca wysya  po kolei:

	#define GG_DCC_HAVE_FILE     0x0001
	#define GG_DCC_HAVE_FILEINFO 0x0003
	int dunno1; /* 0 */
	int dunno2; /* 0 */
	file_info_struct finfo;

Podejrzewam, e dunno2:dunno1 jest pozycj w pliku, od ktrej nadawca 
chce wysya plik, ale nie udao mi si zasymulowa sytuacji, w ktrej 
byyby uywane.

	struct file_info_struct {
        	int mode;                  /* dwFileAttributes */
        	int ctime[2];              /* ftCreationTime */
        	int atime[2];              /* ftLastAccessTime */
        	int mtime[2];              /* ftLastWriteTime */
		int size_hdw;              /* grne 4 bajty dugoci pliku */
		int size_ldw;              /* dolne 4 bajty dugoci pliku */
		int reserved1;             /* 0 */
		int reserved2;             /* 0 */
		char file_name[276];       /* tablica zaczynajca si od nazwy 
					      pliku, wypeniona zerami */
	};

Dalej nadawca czeka na akceptacj odbiorcy, czyli nastpujc strukturk:
	
	struct {
		int type;      /* 0x0006 GG_DCC_GIMME_FILE */
		int start;     /* od ktrej pozycji zacz przesyanie */
		int dunno;     /* 0 */
	};

Teraz moemy zacz przesyanie pliku. Plik przesyamy w paczkach dugoci 
ustalonej przez nadawc. Przed kad paczk z danymi nadawca wysya nagwek
paczki:
	struct {
		int type;       /* 0x0003 GG_DCC_FILEHEADER, jeli paczka nie 
				   jest ostatnia. 0x0002 GG_DCC_LAST_FILEHEADER
				   wpp. */
		int chunk_size; /* rozmiar paczki */
		int dunno;      /* 0 */
	};

Po wysaniu ostatniej paczki zamykamy poczenie. Plik zosta przesany.

----- 4) transmisja pliku: strona odbiorcy ------------------------------------
Zachowanie odbiorcy jest symetryczne:
1. odbiera kolejno 
	GG_DCC_HAVE_FILE
	GG_DCC_HAVE_FILEINFO
	int dunno1;
	int dunno2;
	file_info_struct finfo;

2. jeli uytkownik zgodzi si odebra plik, to wysyamy struktr jakiej
odbiorca si spodziewa.

3. otrzymujemy nagwek paczki i paczk z danymi zadeklarowanej dugoci
4. jeli nagwek by typu GG_DCC_LAST_FILEHEADER to otrzymalimy cao, 
wic zamykamy poczenie. Jeli nie, to wracamy do kroku 3.

$Id: dcc-protocol.txt,v 1.1.1.1 2002/07/09 22:22:02 chilek Exp $
