<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>libgadu: Połączenie z serwerem</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="search/search.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="search/search.js"></script> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body onload='searchBox.OnSelectItem(0);'> <!-- Wygenerowano przez Doxygen 1.7.4 --> <script type="text/javascript"><!-- var searchBox = new SearchBox("searchBox", "search",false,'Szukaj'); --></script> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">libgadu <span id="projectnumber">1.11.0</span></div> </td> </tr> </tbody> </table> </div> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Strona główna</span></a></li> <li><a href="pages.html"><span>Dodatkowe strony</span></a></li> <li><a href="modules.html"><span>Moduły</span></a></li> <li><a href="annotated.html"><span>Struktury Danych</span></a></li> <li><a href="files.html"><span>Pliki</span></a></li> <li id="searchli"> <div id="MSearchBox" class="MSearchBoxInactive"> <span class="left"> <img id="MSearchSelect" src="search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/> <input type="text" id="MSearchField" value="Szukaj" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/> </span><span class="right"> <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> </span> </div> </li> </ul> </div> </div> <div class="header"> <div class="summary"> <a href="#nested-classes">Struktury danych</a> | <a href="#enum-members">Wyliczenia</a> | <a href="#func-members">Funkcje</a> </div> <div class="headertitle"> <div class="title">Połączenie z serwerem</div> </div> <div class="ingroups"><a class="el" href="group__session.html">Połączenie z serwerem</a></div></div> <div class="contents"> <table class="memberdecls"> <tr><td colspan="2"><h2><a name="nested-classes"></a> Struktury danych</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structgg__session.html">gg_session</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Sesja Gadu-Gadu. <a href="structgg__session.html#details">Więcej...</a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structgg__login__params.html">gg_login_params</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Parametry połączenia z serwerem Gadu-Gadu. <a href="structgg__login__params.html#details">Więcej...</a><br/></td></tr> <tr><td colspan="2"><h2><a name="enum-members"></a> Wyliczenia</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__login.html#gaf5331c4041f0322580d80922d59d0594">gg_ssl_t</a> { <br/>   <a class="el" href="group__login.html#ggaf5331c4041f0322580d80922d59d0594afa4abee9df67b022a6eb09797d860595">GG_SSL_DISABLED</a> = 0, <br/>   <a class="el" href="group__login.html#ggaf5331c4041f0322580d80922d59d0594ac7f46ae989ab5c62c2528247c333efd4">GG_SSL_ENABLED</a>, <br/>   <a class="el" href="group__login.html#ggaf5331c4041f0322580d80922d59d0594afd30c226066c2f6c92660fd732dace8f">GG_SSL_REQUIRED</a> <br/> }</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Flaga połączenia szyfrowanego. <a href="group__login.html#gaf5331c4041f0322580d80922d59d0594">Więcej...</a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom">{ <br/>   <a class="el" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea562af717e8290d76927494fe6ea130e5">GG_FEATURE_MSG77</a>, <br/>   <a class="el" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea489baa156dfb3daf5e1679f38bbc9536">GG_FEATURE_STATUS77</a>, <br/>   <a class="el" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea8a5e25964135b5008c4dcfca1bc42ebb">GG_FEATURE_DND_FFC</a>, <br/>   <a class="el" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea57f0b76ee9f9000fc492a4af132c7d27">GG_FEATURE_IMAGE_DESCR</a> <br/> }</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Flagi opcji protokołu. <a href="group__login.html#ga61dadd085c1777f559549e05962b2c9e">Więcej...</a><br/></td></tr> <tr><td colspan="2"><h2><a name="func-members"></a> Funkcje</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structgg__session.html">gg_session</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__login.html#gaf231ccc428422f1b9e14e7c6ed65d1c4">gg_login</a> (const struct <a class="el" href="structgg__login__params.html">gg_login_params</a> *p)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Łączy się z serwerem Gadu-Gadu. <a href="#gaf231ccc428422f1b9e14e7c6ed65d1c4"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__login.html#gacf05d07e2495672e0384317293c5a342">gg_ping</a> (struct <a class="el" href="structgg__session.html">gg_session</a> *sess)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Wysyła do serwera pakiet utrzymania połączenia. <a href="#gacf05d07e2495672e0384317293c5a342"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__login.html#ga415c0e5527711d9ddb2be6c7f5eff9fc">gg_logoff</a> (struct <a class="el" href="structgg__session.html">gg_session</a> *sess)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Kończy połączenie z serwerem. <a href="#ga415c0e5527711d9ddb2be6c7f5eff9fc"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__login.html#ga5984b117ce4d0897c8e1aee69f1b6763">gg_free_session</a> (struct <a class="el" href="structgg__session.html">gg_session</a> *sess)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Zwalnia zasoby używane przez połączenie z serwerem. <a href="#ga5984b117ce4d0897c8e1aee69f1b6763"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__login.html#ga48a54ca3fa4e3a46bc2f0e40950b6595">gg_multilogon_disconnect</a> (struct <a class="el" href="structgg__session.html">gg_session</a> *gs, <a class="el" href="structgg__multilogon__id__t.html">gg_multilogon_id_t</a> conn_id)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Rozłącza inną sesję multilogowania. <a href="#ga48a54ca3fa4e3a46bc2f0e40950b6595"></a><br/></td></tr> </table> <hr/><a name="details" id="details"></a><h2>Opis szczegółowy</h2> <p>Każde połączenie z serwerem jest rozpoczynane funkcją <code><a class="el" href="group__login.html#gaf231ccc428422f1b9e14e7c6ed65d1c4" title="Łączy się z serwerem Gadu-Gadu.">gg_login()</a></code> zwracającą strukturę <code><a class="el" href="structgg__session.html" title="Sesja Gadu-Gadu.">gg_session</a></code>, opisującą dane połączenie. Funkcja <code><a class="el" href="group__login.html#gaf231ccc428422f1b9e14e7c6ed65d1c4" title="Łączy się z serwerem Gadu-Gadu.">gg_login()</a></code> za parametr przyjmuje wskaźnik strukturę zawierającą listę parametrów połączenia. Przykładowy kod rozpoczynający łączenie wygląda następująco:</p> <div class="fragment"><pre class="fragment"><span class="keyword">struct </span><a class="code" href="structgg__session.html" title="Sesja Gadu-Gadu.">gg_session</a> *sesja; <span class="keyword">struct </span><a class="code" href="structgg__login__params.html" title="Parametry połączenia z serwerem Gadu-Gadu.">gg_login_params</a> parametry; <span class="keyword">struct </span><a class="code" href="structgg__event.html" title="Opis zdarzenia.">gg_event</a> *zdarzenie; memset(&parametry, 0, <span class="keyword">sizeof</span>(parametry)); parametry.uin = 12345; parametry.password = <span class="stringliteral">"hasło"</span>; parametry.async = 1; parametry.status = <a class="code" href="group__status.html#gga726ca809ffd3d67ab4b8476646f26635af2b588726951b1fd46caf5179f74c1a2" title="Niewidoczny (tylko własny status)">GG_STATUS_INVISIBLE</a>; sesja = <a class="code" href="group__login.html#gaf231ccc428422f1b9e14e7c6ed65d1c4" title="Łączy się z serwerem Gadu-Gadu.">gg_login</a>(&parametry); <span class="keywordflow">if</span> (!sesja) { błąd(<span class="stringliteral">"Nie można się połączyć"</span>); exit(1); } <span class="comment">// ...</span> </pre></div><p>Lista wszystkich parametrów połączenia znajduje się w opisie struktury <code><a class="el" href="structgg__login__params.html" title="Parametry połączenia z serwerem Gadu-Gadu.">gg_login_params</a></code>. W zależności od tego, czy łączymy się synchronicznie czy asynchronicznie (jak w przykładzie), funkcja <code><a class="el" href="group__login.html#gaf231ccc428422f1b9e14e7c6ed65d1c4" title="Łączy się z serwerem Gadu-Gadu.">gg_login()</a></code> zwróci wskaźnik dopiero po udanym połączeniu lub zaraz po rozpoczęciu procedury łączenia. Dokładny opis dalszej obsługi połączenia znajduje się w sekcji poświęconej <a class="el" href="group__events.html">obsłudze zdarzeń</a>.</p> <p>Nowe statusy (nie przeszkadzać, poGGadaj ze mną), opisy graficzne i wiadomości kodowane UTF-8 będą dostępne dopiero po ustawieniu odpowiednich parametrów połączenia. Jest to niezbędne, ponieważ starsze klienty mogłyby nie działać prawidłowo, gdyby przy domyślnych parametrach połączenia zmieniło się zachowanie biblioteki.</p> <div class="fragment"><pre class="fragment">parametry.encoding = <a class="code" href="libgadu_8h.html#adbaace4dc70e6607a9d6bd4c23cd2498add132d17c370e55d0f421b7867ce0d40" title="Kodowanie UTF-8.">GG_ENCODING_UTF8</a>; parametry.protocol_features = <a class="code" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea8a5e25964135b5008c4dcfca1bc42ebb" title="Klient obsługuje statusy "nie przeszkadzać" i "poGGadaj ze mną".">GG_FEATURE_DND_FFC</a> | <a class="code" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea57f0b76ee9f9000fc492a4af132c7d27" title="Klient obsługuje opisy graficzne oraz flagę GG_STATUS80_DESCR_MASK.">GG_FEATURE_IMAGE_DESCR</a>; </pre></div><p>Aby łączyć się z użyciem serwera pośredniczącego (ang. <em>proxy</em>), należy przed połączeniem ustawić zmienne globalne <a class="el" href="group__proxy.html"><code>gg_proxy_enabled</code> </a>, <a class="el" href="group__proxy.html"><code>gg_proxy_host</code> </a>, <a class="el" href="group__proxy.html"><code>gg_proxy_port</code> </a> i <a class="el" href="group__proxy.html">inne.</a></p> <p>Do korzystania z połączeń bezpośrednich wersji 6.x, konieczne jest przed połączeniem ustawienie zmiennych globalnych <a class="el" href="group__ip.html"><code>gg_dcc_ip</code> </a>i <a class="el" href="group__ip.html"><code>gg_dcc_port</code>.</a></p> <p>Począwszy od Gadu-Gadu 10 możliwe są połączenia szyfrowane. Aby je włączyć, należy ustawić pole <code>tls</code> struktury <code><a class="el" href="structgg__login__params.html" title="Parametry połączenia z serwerem Gadu-Gadu.">gg_login_params</a>:</code> </p> <div class="fragment"><pre class="fragment">parametry.tls = <a class="code" href="group__login.html#ggaf5331c4041f0322580d80922d59d0594ac7f46ae989ab5c62c2528247c333efd4" title="Połączenie SSL włączone gdy dostępne.">GG_SSL_ENABLED</a>; </pre></div><p>W przypadku braku wkompilowanej obsługi SSL parametr ten zostanie zignorowany. By upewnić się, że połączenie nigdy nie będzie przeprowadzone bez szyfrowania, należy przypisać wartość <code>GG_SSL_REQUIRED</code> (patrz <code>gg_ssl_t</code>).</p> <h2><a class="anchor" id="login-details"></a> Procedura łączenia z serwerem</h2> <p>Procedura łączenia się z serwerem składa się z kilku etapów:</p> <ol type="1"> <li>Rozwiązywanie nazwy serwera rozdzielającego (ang. <em>hub</em>), domyślnie <code>appmsg.gadu-gadu.pl</code> </li> <li>Nawiązanie połączenia z serwerem rozdzielającym na porcie 80.</li> <li>Wysłanie zapytania o adres właściwego serwera. Parametrami zapytania są m.in. numer konta i wersja klienta.</li> <li>Odebranie odpowiedzi zawierającej adres IP właściwego serwera, jego port i ewentualnie wiadomość systemową.</li> <li>Nawiązanie połączenia z właściwym serwerem.</li> <li>Odebranie pakietu z ziarnem hasła do przeprowadzenia autoryzacji typu <em>challenge-response</em>.</li> <li>Wysłanie pakietu z parametrami logowania (w tym skrótem hasła).</li> <li>Odebranie pakietu z informacją o pomyślnym lub nieudanym logowaniu.</li> </ol> <p>Wszystkimi etapami zajmuje się funkcja <code><a class="el" href="group__login.html#gaf231ccc428422f1b9e14e7c6ed65d1c4" title="Łączy się z serwerem Gadu-Gadu.">gg_login()</a></code> w przypadku połączenia synchronicznego lub <code><a class="el" href="group__login.html#gaf231ccc428422f1b9e14e7c6ed65d1c4" title="Łączy się z serwerem Gadu-Gadu.">gg_login()</a></code> i <code><a class="el" href="group__events.html#gae28360891a3b393d606fb455564e3b3a" title="Funkcja wywoływana po zaobserwowaniu zmian na deskryptorze sesji.">gg_watch_fd()</a></code> dla połączeń asynchronicznych. Możliwe jest pominięcie pierwszych czterech kroków, związanych z połączeniem z serwerem rozdzielającym, przez ręczne podanie adresu i portu właściwego serwera w polach <a class="el" href="structgg__login__params.html#a09702804f81d7ef01014e2db5ec11711"><code>server_addr</code> </a>i <a class="el" href="structgg__login__params.html#a6fb11f0475d51296a7e29f0ebb067080"><code>server_port</code> </a>struktury <code><a class="el" href="structgg__login__params.html" title="Parametry połączenia z serwerem Gadu-Gadu.">gg_login_params</a></code>. Jest to przydatne w sytuacjach, gdy serwer rozdzielający jest przeciążony lub niedostępny, albo gdy zwraca nieprawidłowy adres właściwego serwera.</p> <p>Rozwiązywanie nazwy w systemach zgodnych z normą POSIX jest operacją synchroniczną. Z tego powodu w trybie asynchronicznym konieczne jest utworzenie dodatkowego procesu lub wątku (w zależności od opcji kompilacji), który w tle dokona rozwiązania nazwy i zwróci wynik do procesu lub wątku nadrzędnego.</p> <dl class="note"><dt><b>Nota:</b></dt><dd>Jeśli biblioteka używa procesu do rozwiązywania nazw, w aplikacji należy użyć funkcji systemowej <code>wait()</code> lub podobnej do prawidłowego zakończenia życia procesu potomnego. W przeciwnym wypadku, w zależności od zachowania systemu operacyjnego, mogą powstawać procesy <em>zombie</em>.</dd></dl> <h2><a class="anchor" id="login-keepalive"></a> Utrzymanie połączenia</h2> <p>Serwer oczekuje regularnego wysyłania pakietów utrzymania połączenia. W tym celu należy co minutę wywoływać funkcję <code><a class="el" href="group__login.html#gacf05d07e2495672e0384317293c5a342" title="Wysyła do serwera pakiet utrzymania połączenia.">gg_ping()</a></code>.</p> <h2><a class="anchor" id="login-logoff"></a> Zakończenie połączenia</h2> <p>Aby się wylogować, należy użyć funkcji <code><a class="el" href="group__login.html#ga415c0e5527711d9ddb2be6c7f5eff9fc" title="Kończy połączenie z serwerem.">gg_logoff()</a></code>, a następnie zwolnić zasoby związane z sesją za pomocą funkcji <code><a class="el" href="group__login.html#ga5984b117ce4d0897c8e1aee69f1b6763" title="Zwalnia zasoby używane przez połączenie z serwerem.">gg_free_session()</a></code>. Aby ustawić status z opisem, należy wcześniej wywołać funkcję <code><a class="el" href="group__status.html#ga88e51a8ffa11ab83ce5be8ae6d244fa5" title="Zmienia status użytkownika na status opisowy.">gg_change_status_descr()</a></code>.</p> <h2><a class="anchor" id="login-multi"></a> Multilogowanie</h2> <p>Około wersji Gadu-Gadu 10 pojawiła się możliwość łączenia kilku sesji jednocześnie. Aby włączyć tę funkcję należy do <code><a class="el" href="structgg__login__params.html#acfd337486f19499ea8d1f20030600240" title="Opcje protokołu (flagi GG_FEATURE_*).">gg_login_params.protocol_features</a></code> dodać <code>GG_FEATURE_MULTILOGON</code>. Domyślnie ta opcja jest wyłączona, więc zwykle będzie to wyglądać następująco:</p> <div class="fragment"><pre class="fragment">parametry.protocol_features = GG_FEATURE_ALL | GG_FEATURE_MULTILOGON; </pre></div><p>Po połączeniu z włączoną możliwością multilogowania, inne sesje nie zostaną rozłączone. W momencie połączenia dodatkowej sesji, aplikacja otrzyma zdarzenie <a class="el" href="group__events.html#events-list"><code>GG_EVENT_MULTILOGON_INFO</code> . Wiadomości przychodzące są</a>przekazywane do wszystkich sesji, a wychodzące do rozmówców z jednej sesji do pozostałych za pomocą zdarzenia <a class="el" href="group__events.html#events-list"><code>GG_EVENT_MULTILOGON_MSG</code> . Aby zdalnie rozłączyć inną</a>sesję, należy użyć funkcji <code><a class="el" href="group__login.html#ga48a54ca3fa4e3a46bc2f0e40950b6595" title="Rozłącza inną sesję multilogowania.">gg_multilogon_disconnect()</a></code>. </p> <hr/><h2>Dokumentacja typów wyliczanych</h2> <a class="anchor" id="gaf5331c4041f0322580d80922d59d0594"></a><!-- doxytag: member="libgadu.h::gg_ssl_t" ref="gaf5331c4041f0322580d80922d59d0594" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">enum <a class="el" href="group__login.html#gaf5331c4041f0322580d80922d59d0594">gg_ssl_t</a></td> </tr> </table> </div> <div class="memdoc"> <p>Flaga połączenia szyfrowanego. </p> <dl><dt><b>Wartości wyliczeń: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"><em><a class="anchor" id="ggaf5331c4041f0322580d80922d59d0594afa4abee9df67b022a6eb09797d860595"></a><!-- doxytag: member="GG_SSL_DISABLED" ref="ggaf5331c4041f0322580d80922d59d0594afa4abee9df67b022a6eb09797d860595" args="" -->GG_SSL_DISABLED</em> </td><td> <p>Połączenie SSL wyłączone. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="ggaf5331c4041f0322580d80922d59d0594ac7f46ae989ab5c62c2528247c333efd4"></a><!-- doxytag: member="GG_SSL_ENABLED" ref="ggaf5331c4041f0322580d80922d59d0594ac7f46ae989ab5c62c2528247c333efd4" args="" -->GG_SSL_ENABLED</em> </td><td> <p>Połączenie SSL włączone gdy dostępne. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="ggaf5331c4041f0322580d80922d59d0594afd30c226066c2f6c92660fd732dace8f"></a><!-- doxytag: member="GG_SSL_REQUIRED" ref="ggaf5331c4041f0322580d80922d59d0594afd30c226066c2f6c92660fd732dace8f" args="" -->GG_SSL_REQUIRED</em> </td><td> <p>Połączenie SSL wymagane. </p> </td></tr> </table> </dd> </dl> </div> </div> <a class="anchor" id="ga61dadd085c1777f559549e05962b2c9e"></a><!-- doxytag: member="libgadu.h::@5" ref="ga61dadd085c1777f559549e05962b2c9e" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">anonymous enum</td> </tr> </table> </div> <div class="memdoc"> <p>Flagi opcji protokołu. </p> <dl><dt><b>Wartości wyliczeń: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"><em><a class="anchor" id="gga61dadd085c1777f559549e05962b2c9ea562af717e8290d76927494fe6ea130e5"></a><!-- doxytag: member="GG_FEATURE_MSG77" ref="gga61dadd085c1777f559549e05962b2c9ea562af717e8290d76927494fe6ea130e5" args="" -->GG_FEATURE_MSG77</em> </td><td> <p>Klient życzy sobie otrzymywać wiadomości zgodnie z protokołem 7.7. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga61dadd085c1777f559549e05962b2c9ea489baa156dfb3daf5e1679f38bbc9536"></a><!-- doxytag: member="GG_FEATURE_STATUS77" ref="gga61dadd085c1777f559549e05962b2c9ea489baa156dfb3daf5e1679f38bbc9536" args="" -->GG_FEATURE_STATUS77</em> </td><td> <p>Klient życzy sobie otrzymywać zmiany stanu zgodnie z protokołem 7.7. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga61dadd085c1777f559549e05962b2c9ea8a5e25964135b5008c4dcfca1bc42ebb"></a><!-- doxytag: member="GG_FEATURE_DND_FFC" ref="gga61dadd085c1777f559549e05962b2c9ea8a5e25964135b5008c4dcfca1bc42ebb" args="" -->GG_FEATURE_DND_FFC</em> </td><td> <p>Klient obsługuje statusy "nie przeszkadzać" i "poGGadaj ze mną". </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga61dadd085c1777f559549e05962b2c9ea57f0b76ee9f9000fc492a4af132c7d27"></a><!-- doxytag: member="GG_FEATURE_IMAGE_DESCR" ref="gga61dadd085c1777f559549e05962b2c9ea57f0b76ee9f9000fc492a4af132c7d27" args="" -->GG_FEATURE_IMAGE_DESCR</em> </td><td> <p>Klient obsługuje opisy graficzne oraz flagę <code>GG_STATUS80_DESCR_MASK</code>. </p> </td></tr> </table> </dd> </dl> </div> </div> <hr/><h2>Dokumentacja funkcji</h2> <a class="anchor" id="gaf231ccc428422f1b9e14e7c6ed65d1c4"></a><!-- doxytag: member="libgadu.c::gg_login" ref="gaf231ccc428422f1b9e14e7c6ed65d1c4" args="(const struct gg_login_params *p)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct <a class="el" href="structgg__session.html">gg_session</a>* <a class="el" href="structgg__login.html">gg_login</a> </td> <td>(</td> <td class="paramtype">const struct <a class="el" href="structgg__login__params.html">gg_login_params</a> * </td> <td class="paramname"><em>p</em></td><td>)</td> <td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <p>Łączy się z serwerem Gadu-Gadu. </p> <p>Przy połączeniu synchronicznym funkcja zakończy działanie po nawiązaniu połączenia lub gdy wystąpi błąd. Po udanym połączeniu należy wywoływać funkcję <code><a class="el" href="group__events.html#gae28360891a3b393d606fb455564e3b3a" title="Funkcja wywoływana po zaobserwowaniu zmian na deskryptorze sesji.">gg_watch_fd()</a></code>, która odbiera informacje od serwera i zwraca informacje o zdarzeniach.</p> <p>Przy połączeniu asynchronicznym funkcja rozpocznie procedurę połączenia i zwróci zaalokowaną strukturę. Pole <code>fd</code> struktury <code><a class="el" href="structgg__session.html" title="Sesja Gadu-Gadu.">gg_session</a></code> zawiera deskryptor, który należy obserwować funkcją <code>select</code>, <code>poll</code> lub za pomocą mechanizmów użytej pętli zdarzeń (Glib, Qt itp.). Pole <code>check</code> jest maską bitową mówiącą, czy biblioteka chce być informowana o możliwości odczytu danych (<code>GG_CHECK_READ</code>) czy zapisu danych (<code>GG_CHECK_WRITE</code>). Po zaobserwowaniu zmian na deskryptorze należy wywołać funkcję <code><a class="el" href="group__events.html#gae28360891a3b393d606fb455564e3b3a" title="Funkcja wywoływana po zaobserwowaniu zmian na deskryptorze sesji.">gg_watch_fd()</a></code>. Podczas korzystania z połączeń asynchronicznych, w trakcie połączenia może zostać stworzony dodatkowy proces rozwiązujący nazwę serwera -- z tego powodu program musi poprawnie obsłużyć sygnał SIGCHLD.</p> <dl class="note"><dt><b>Nota:</b></dt><dd>Po nawiązaniu połączenia z serwerem należy wysłać listę kontaktów za pomocą funkcji <code><a class="el" href="group__contacts.html#gac1b2b6ea2f7e69afaf3ebb7e8e1c96ac" title="Wysyła do serwera listę kontaktów.">gg_notify()</a></code> lub <code><a class="el" href="group__contacts.html#gae32ab8481e2198fca185d4179bdd8509" title="Wysyła do serwera listę kontaktów.">gg_notify_ex()</a></code>.</dd> <dd> Funkcja zwróci błąd ENOSYS jeśli połączenie SSL było wymagane, ale obsługa SSL nie jest wkompilowana.</dd></dl> <dl><dt><b>Parametry:</b></dt><dd> <table class="params"> <tr><td class="paramname">p</td><td>Struktura opisująca parametry połączenia. Wymagane pola: uin, password, async.</td></tr> </table> </dd> </dl> <dl class="return"><dt><b>Zwraca:</b></dt><dd>Wskaźnik do zaalokowanej struktury sesji <code><a class="el" href="structgg__session.html" title="Sesja Gadu-Gadu.">gg_session</a></code> lub NULL w przypadku błędu. </dd></dl> </div> </div> <a class="anchor" id="gacf05d07e2495672e0384317293c5a342"></a><!-- doxytag: member="libgadu.c::gg_ping" ref="gacf05d07e2495672e0384317293c5a342" args="(struct gg_session *sess)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int gg_ping </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structgg__session.html">gg_session</a> * </td> <td class="paramname"><em>sess</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Wysyła do serwera pakiet utrzymania połączenia. </p> <p>Klient powinien regularnie co minutę wysyłać pakiet utrzymania połączenia, inaczej serwer uzna, że klient stracił łączność z siecią i zerwie połączenie.</p> <dl><dt><b>Parametry:</b></dt><dd> <table class="params"> <tr><td class="paramname">sess</td><td>Struktura sesji</td></tr> </table> </dd> </dl> <dl class="return"><dt><b>Zwraca:</b></dt><dd>0 jeśli się powiodło, -1 w przypadku błędu </dd></dl> </div> </div> <a class="anchor" id="ga415c0e5527711d9ddb2be6c7f5eff9fc"></a><!-- doxytag: member="libgadu.c::gg_logoff" ref="ga415c0e5527711d9ddb2be6c7f5eff9fc" args="(struct gg_session *sess)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void gg_logoff </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structgg__session.html">gg_session</a> * </td> <td class="paramname"><em>sess</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Kończy połączenie z serwerem. </p> <p>Funkcja nie zwalnia zasobów, więc po jej wywołaniu należy użyć <code><a class="el" href="group__login.html#ga5984b117ce4d0897c8e1aee69f1b6763" title="Zwalnia zasoby używane przez połączenie z serwerem.">gg_free_session()</a></code>. Jeśli chce się ustawić opis niedostępności, należy wcześniej wywołać funkcję <code><a class="el" href="group__status.html#ga88e51a8ffa11ab83ce5be8ae6d244fa5" title="Zmienia status użytkownika na status opisowy.">gg_change_status_descr()</a></code> lub <code><a class="el" href="group__status.html#ga0487618b7521b1900bf4771971084bb0" title="Zmienia status użytkownika na status opisowy z podanym czasem powrotu.">gg_change_status_descr_time()</a></code>.</p> <dl class="note"><dt><b>Nota:</b></dt><dd>Jeśli w buforze nadawczym połączenia z serwerem znajdują się jeszcze dane (np. z powodu strat pakietów na łączu), prawdopodobnie zostaną one utracone przy zrywaniu połączenia. Aby mieć pewność, że opis statusu zostanie zachowany, należy ustawić stan <code>GG_STATUS_NOT_AVAIL_DESCR</code> za pomocą funkcji <code><a class="el" href="group__status.html#ga88e51a8ffa11ab83ce5be8ae6d244fa5" title="Zmienia status użytkownika na status opisowy.">gg_change_status_descr()</a></code> i poczekać na zdarzenie <code>GG_EVENT_DISCONNECT_ACK</code>.</dd></dl> <dl><dt><b>Parametry:</b></dt><dd> <table class="params"> <tr><td class="paramname">sess</td><td>Struktura sesji </td></tr> </table> </dd> </dl> </div> </div> <a class="anchor" id="ga5984b117ce4d0897c8e1aee69f1b6763"></a><!-- doxytag: member="libgadu.c::gg_free_session" ref="ga5984b117ce4d0897c8e1aee69f1b6763" args="(struct gg_session *sess)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void gg_free_session </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structgg__session.html">gg_session</a> * </td> <td class="paramname"><em>sess</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Zwalnia zasoby używane przez połączenie z serwerem. </p> <p>Funkcję należy wywołać po zamknięciu połączenia z serwerem, by nie doprowadzić do wycieku zasobów systemowych.</p> <dl><dt><b>Parametry:</b></dt><dd> <table class="params"> <tr><td class="paramname">sess</td><td>Struktura sesji </td></tr> </table> </dd> </dl> </div> </div> <a class="anchor" id="ga48a54ca3fa4e3a46bc2f0e40950b6595"></a><!-- doxytag: member="libgadu.c::gg_multilogon_disconnect" ref="ga48a54ca3fa4e3a46bc2f0e40950b6595" args="(struct gg_session *gs, gg_multilogon_id_t conn_id)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int <a class="el" href="structgg__multilogon__disconnect.html">gg_multilogon_disconnect</a> </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structgg__session.html">gg_session</a> * </td> <td class="paramname"><em>gs</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"><a class="el" href="structgg__multilogon__id__t.html">gg_multilogon_id_t</a> </td> <td class="paramname"><em>conn_id</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <p>Rozłącza inną sesję multilogowania. </p> <dl><dt><b>Parametry:</b></dt><dd> <table class="params"> <tr><td class="paramname">gs</td><td>Struktura sesji </td></tr> <tr><td class="paramname">conn_id</td><td>Sesja do rozłączenia</td></tr> </table> </dd> </dl> <dl class="return"><dt><b>Zwraca:</b></dt><dd>0 jeśli się powiodło, -1 w przypadku błędu </dd></dl> </div> </div> </div> <!-- window showing the filter options --> <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> <a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Struktury Danych</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Pliki</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Funkcje</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Zmienne</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Definicje typów</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Wyliczenia</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Wartości wyliczeń</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Definicje</a></div> <!-- iframe showing the search results (closed by default) --> <div id="MSearchResultsWindow"> <iframe src="javascript:void(0)" frameborder="0" name="MSearchResults" id="MSearchResults"> </iframe> </div> <hr class="footer"/><address class="footer"><small>Wygenerowano Wed Jul 13 2011 dla libgadu programem  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address> </body> </html>