---
 docs/protocol.html |  110 +++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 79 insertions(+), 31 deletions(-)

diff --git a/docs/protocol.html b/docs/protocol.html
index dc9982b..1141ffa 100644
--- a/docs/protocol.html
+++ b/docs/protocol.html
@@ -1496,10 +1496,13 @@ użyć pakietu:
 </p>
 
 <div class="c">
-<pre>#define GG_USERLIST_REQUEST80 0x002f
+<pre>#define GG_USERLIST100_REQUEST 0x0040
        
-struct gg_userlist_request {
+struct gg_userlist100_request {
        char type;              <i>/* rodzaj zapytania */</i>
+       int version;            <i>/* numer ostatniej znanej wersji listy 
kontaktów bądź 0 */</i>
+       char format_type;       <i>/* rodzaj formatu listy kontaktów */</i>
+       char unknown1;          <i>/* zawsze 0x01 */</i>
        char request[];         <i>/* treść (nie musi wystąpić) */</i>
 };</pre>
 </div>
@@ -1509,25 +1512,34 @@ Pole <tt>type</tt> oznacza rodzaj zapytania:
 </p>
 
 <div class="c">
-<pre>#define GG_USERLIST_PUT 0x00            <i>/* początek eksportu listy 
*/</i>
-#define GG_USERLIST_PUT_MORE 0x01       <i>/* dalsza część eksportu listy 
*/</i>
-#define GG_USERLIST_GET 0x02            <i>/* import listy */</i></pre>
+<pre>#define GG_USERLIST100_PUT 0x00           <i>/* eksport listy */</i>
+#define GG_USERLIST100_GET 0x02                <i>/* import listy */</i></pre>
 </div>
 
 <p>
-W przypadku eksportu listy kontaktów, pole <tt>request</tt> zawiera dokument
-XML opisany na stronie
-<a 
href="http://dev.gadu-gadu.pl/api/pages/formaty_plikow.html";>http://dev.gadu-gadu.pl/api/pages/formaty_plikow.html</a>
 skompresowany algorytmem 
-<a href="http://pl.wikipedia.org/wiki/Deflate";>Deflate</a>. Wolnodostępna
-implementacja algorytmu, używana również przez oryginalnego klienta, znajduje
-się w biblotece <a href="http://www.zlib.net/";>zlib</a>. 
+Pole <tt>format_type</tt> oznacza typ formatu listy kontaktów:
+</p>
+
+<div class="c">
+<pre>#define GG_USERLIST100_FORMAT_TYPE_NONE 0x00        <i>/* brak treści 
listy kontaktów */</i>
+#define GG_USERLIST100_FORMAT_TYPE_GG70 0x01        <i>/* format listy 
kontaktów zgodny z Gadu-Gadu 7.0 */</i>
+#define GG_USERLIST100_FORMAT_TYPE_GG100 0x02       <i>/* format listy 
kontaktów zgodny z Gadu-Gadu 10.0 */</i>
+</div>
+
+<p>
+Typ <tt>GG_USERLIST100_FORMAT_TYPE_NONE</tt> ma sens wyłącznie w przypadku
+importu listy kontaktów. Po jego użyciu serwer wysyła odpowiedź zawierającą
+numer wersji listy kontaktów, ale bez samej listy kontaktów. Oryginalny klient
+jednak w ogóle nie wykorzystuje tego sposobu.
 </p>
 
 <p>
-Podczas przesyłania lista kontaktów jest dzielona na pakiety po 2048 bajtów.
-Pierwszy jest wysyłany pakietem typu <tt>GG_USERLIST_PUT</tt>, żeby uaktualnić
-plik na serwerze, pozostałe typu <tt>GG_USERLIST_PUT_MORE</tt>, żeby dopisać
-do pliku.
+W przypadku eksportu listy kontaktów, pole <tt>request</tt>, o ile 
zdefiniowano typ jako <tt>GG_USERLIST100_FORMAT_TYPE_GG100</tt>, zawiera 
dokument
+XML opisany na stronie
+<a 
href="http://dev.gadu-gadu.pl/api/pages/formaty_plikow.html";>http://dev.gadu-gadu.pl/api/pages/formaty_plikow.html</a>.
 Zawartość tego pola musi być skompresowana algorytmem 
+<a href="http://pl.wikipedia.org/wiki/Deflate";>Deflate</a>. Wolnodostępna
+implementacja algorytmu, używana również przez oryginalnego klienta, znajduje
+się w biblotece <a href="http://www.zlib.net/";>zlib</a>. Oryginalny klient 
używa najwyższego stopnia kompresji.
 </p>
 
 <p>
@@ -1535,10 +1547,13 @@ Na zapytania dotyczące listy kontaktów serwer odpowiada 
pakietem:
 </p>
 
 <div class="c">
-<pre>#define GG_USERLIST_REPLY80 0x0030
+<pre>#define GG_USERLIST100_REPLY 0x0041
        
-struct gg_userlist_reply {
-       char type;              <i>/* rodzaj zapytania */</i>
+struct gg_userlist100_reply {
+       char type;              <i>/* rodzaj odpowiedzi */</i>
+       int version;            <i>/* numer wersji listy kontaktów aktualnie 
przechowywanej przez serwer */</i>
+       char format_type;       <i>/* rodzaj przesyłanego typu formatu listy 
kontaktów */</i>
+       char unknown1;          <i>/* zawsze 0x01 */</i>
        char reply[];           <i>/* treść (nie musi wystąpić) */</i>
 };</pre>
 </div>
@@ -1548,20 +1563,21 @@ Pole <tt>type</tt> oznacza rodzaj odpowiedzi:
 </p>
 
 <div class="c">
-<pre>#define GG_USERLIST_PUT_REPLY 0x00         <i>/* początek eksportu listy 
*/</i>
-#define GG_USERLIST_PUT_MORE_REPLY 0x02    <i>/* kontynuacja */</i>
-#define GG_USERLIST_GET_MORE_REPLY 0x04    <i>/* początek importu listy */</i>
-#define GG_USERLIST_GET_REPLY 0x06         <i>/* ostatnia część importu 
*/</i></pre>
+<pre>#define GG_USERLIST100_REPLY_LIST 0x00       <i>/* w odpowiedzi znajduje 
się aktualna lista kontaktów na serwerze */</i>
+#define GG_USERLIST100_REPLY_ACK 0x10        <i>/* potwierdzenie odebrania 
nowej wersji listy kontaktów */</i>
+#define GG_USERLIST100_REPLY_REJECT 0x12     <i>/* odmowa przyjęcia nowej 
wersji listy kontaktów z powodu
+                                                niezgodności numeru wersji 
listy kontaktów */</i></pre>
 </div>
 
 <p>
-W przypadku importu w polu <tt>request</tt> znajdzie się lista kontaktów
-w takiej samej postaci, w jakiej ją umieszczono. Serwer nie ingeruje w jej
-treść. Podobnie jak przy wysyłaniu, przychodzi podzielona na mniejsze pakiety.
-Pobieranie krótkiej listy kontaktów zwykle powoduje wysłanie pojedynczego
-pakietu <tt>GG_USERLIST_GET_REPLY</tt>, a gdy lista jest długa, serwer może
-przysłać dowolną ilość pakietów <tt>GG_USERLIST_GET_MORE_REPLY</tt> przed
-pakietem <tt>GG_USERLIST_GET_REPLY</tt>.
+W przypadku importu w polu <tt>request</tt> niekoniecznie musi znajdować się
+lista kontaktów w takiej samej postaci, w jakiej ją umieszczono. Serwer stara 
się
+utrzymywać obie wersje listy kontaktów (tzn. 
<tt>GG_USERLIST100_FORMAT_TYPE_GG70</tt>
+oraz <tt>GG_USERLIST100_FORMAT_TYPE_GG100</tt>) w zgodności, dlatego po 
wysłaniu
+jednej z nich serwer automatycznie modyfikuje drugą. W przypadku wysłania listy
+kontaktów w formacie niezgodnym z zadeklarowanym w polu <tt>format_type</tt>,
+serwer usunie istniejącą listę kontaktów, ale nie zachowa przesyłanej i 
zostanie
+na nim pusta lista.
 </p>
 
 <p>
@@ -1573,6 +1589,37 @@ listę kontaktów czego wynikiem jest pole 
<tt>request</tt> o zawartości:
 <pre>78 da 53 00 00 00 21 00 21</pre>
 </div>
 
+<p>
+W celu sprawnej synchronizacji listy kontaktów między różnymi instalacjami 
klienta sieci,
+serwer wersjonuje listę kontaktów i pozwala ją nadpisać tylko w przypadku, gdy 
zadeklarujemy
+znajomość jej ostatniej wersji. Serwer w pakiecie 
<tt>GG_USERLIST100_REPLY</tt> w polu
+<tt>version</tt> zawsze przesyła numer ostatniej znanej mu wersji listy 
kontaktów, przy czym
+w przypadku <tt>GG_USERLIST100_REPLY_ACK</tt> jest to nowo zaakceptowana przed 
chwilą wysłana
+wersja. Wysyłając listę kontaktów, należy w polu <tt>version</tt> umieścić 
numer ostatniej
+znanej wersji listy kontaktów. Zostanie ona zaakceptowana tylko jeśli jest to 
również ostatnia
+znana serwerowi wersja. W przypadku importu listy przesyłany numer wersji nie 
ma znaczenia,
+a oryginalny klient wysyła tu 0.
+</p>
+
+<p>
+W czasie istnienia sesji po każdej zmianie listy kontaktów na serwerze, 
również jeśli została
+ona dokonana w obrębie innej sesji mulilogowania, serwer wysyła informacje o 
nowej wersji za
+pomocą pakietu:
+</p>
+
+<div class="c">
+<pre>#define GG_USERLIST100_VERSION 0x005c
+       
+struct gg_userlist100_version {
+       int version;            <i>/* numer wersji listy kontaktów */</i>
+};</pre>
+</div>
+
+<p>
+Należy zwrócić uwagę na fakt, że pakiet z informacją o nowej wersji listy 
kontaktów może przyjść
+przed pakietem <tt>GG_USERLIST100_REPLY</tt> z informacją o akceptacji listy 
kontaktów.
+</p>
+
 <hr />
 
 <a name="ch1.16"></a>
@@ -1612,7 +1659,7 @@ Pakiety wysyłane:
 <tr 
class="tabf2"><td><tt>0x002f</tt></td><td><tt>GG_USERLIST_REQUEST80</tt></td><td>Zapytanie
 listy kontaktów na serwerze przed Gadu-Gadu 10</td></tr>
 <tr 
class="tabf"><td><tt>0x0031</tt></td><td><tt>GG_LOGIN80</tt></td><td>Logowanie</td></tr>
 <tr 
class="tabf"><td><tt>0x0038</tt></td><td><tt>GG_NEW_STATUS80</tt></td><td>Zmiana
 stanu</td></tr>
-<tr 
class="tabf"><td><tt>0x0040</tt></td><td><tt>GG_USERLIST_REQUEST100</tt></td><td>Zapytanie
 listy kontaktów na serwerze</td></tr>
+<tr 
class="tabf"><td><tt>0x0040</tt></td><td><tt>GG_USERLIST100_REQUEST</tt></td><td>Zapytanie
 listy kontaktów na serwerze</td></tr>
 <tr 
class="tabf"><td><tt>0x0046</tt></td><td><tt>GG_RECV_MSG_ACK</tt></td><td>Potwierdzenie
 odebrania wiadomości przez klienta</td></tr>
 <tr 
class="tabf"><td><tt>0x0059</tt></td><td><tt>GG_TYPING_NOTIFY</tt></td><td>Powiadomienie
 o pisaniu</td></tr>
 <tr 
class="tabf"><td><tt>0x0062</tt></td><td><tt>GG_OWN_DISCONNECT</tt></td><td>Rozłączenie
 zdalnego klienta</td></tr>
@@ -1658,11 +1705,12 @@ Pakiety odbierane:
 <tr 
class="tabf"><td><tt>0x0035</tt></td><td><tt>GG_LOGIN_OK80</tt></td><td>Logowanie
 powiodło się</td></tr>
 <tr 
class="tabf"><td><tt>0x0036</tt></td><td><tt>GG_STATUS80</tt></td><td>Zmiana 
stanu</td></tr>
 <tr 
class="tabf"><td><tt>0x0037</tt></td><td><tt>GG_NOTIFY_REPLY80</tt></td><td>Stan
 listy kontaktów</td></tr>
-<tr 
class="tabf"><td><tt>0x0041</tt></td><td><tt>GG_USERLIST_REPLY100</tt></td><td>Odpowiedź
 listy kontaktów na serwerze</td></tr>
+<tr 
class="tabf"><td><tt>0x0041</tt></td><td><tt>GG_USERLIST100_REPLY</tt></td><td>Odpowiedź
 listy kontaktów na serwerze</td></tr>
 <tr 
class="tabf"><td><tt>0x0044</tt></td><td><tt>GG_USER_DATA</tt></td><td>Dodatkowe
 informacje o liście kontaktów</td></tr>
 <tr 
class="tabf"><td><tt>0x0059</tt></td><td><tt>GG_TYPING_NOTIFY</tt></td><td>Powiadomienie
 o pisaniu</td></tr>
 <tr 
class="tabf"><td><tt>0x005A</tt></td><td><tt>GG_OWN_MESSAGE</tt></td><td>Własne 
wiadomości z innych klientów</td></tr>
 <tr 
class="tabf"><td><tt>0x005B</tt></td><td><tt>GG_OWN_RESOURCE_INFO</tt></td><td>Informacje
 o innych połączeniach na naszym numerze</td></tr>
+<tr 
class="tabf"><td><tt>0x005C</tt></td><td><tt>GG_USERLIST100_VERSION</tt></td><td>Informacje
 o nowej wersji listy kontaktów</td></tr>
 </table>
 
 <hr />
-- 
1.7.5.rc1

_______________________________________________
libgadu-devel mailing list
libgadu-devel@lists.ziew.org
http://lists.ziew.org/mailman/listinfo/libgadu-devel

Reply via email to