Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > d917bf7f3a714584099ab343fa68929c > files > 97

libgadu-doc-1.11.0-2.fc15.noarch.rpm

<!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&#160;<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&#160;główna</span></a></li>
      <li><a href="pages.html"><span>Dodatkowe&#160;strony</span></a></li>
      <li><a href="modules.html"><span>Moduły</span></a></li>
      <li><a href="annotated.html"><span>Struktury&#160;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> &#124;
<a href="#enum-members">Wyliczenia</a> &#124;
<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 &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structgg__session.html">gg_session</a></td></tr>
<tr><td class="mdescLeft">&#160;</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 &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structgg__login__params.html">gg_login_params</a></td></tr>
<tr><td class="mdescLeft">&#160;</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 &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__login.html#gaf5331c4041f0322580d80922d59d0594">gg_ssl_t</a> { <br/>
&#160;&#160;<a class="el" href="group__login.html#ggaf5331c4041f0322580d80922d59d0594afa4abee9df67b022a6eb09797d860595">GG_SSL_DISABLED</a> =  0, 
<br/>
&#160;&#160;<a class="el" href="group__login.html#ggaf5331c4041f0322580d80922d59d0594ac7f46ae989ab5c62c2528247c333efd4">GG_SSL_ENABLED</a>, 
<br/>
&#160;&#160;<a class="el" href="group__login.html#ggaf5331c4041f0322580d80922d59d0594afd30c226066c2f6c92660fd732dace8f">GG_SSL_REQUIRED</a>
<br/>
 }</td></tr>
<tr><td class="mdescLeft">&#160;</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 &#160;</td><td class="memItemRight" valign="bottom">{ <br/>
&#160;&#160;<a class="el" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea562af717e8290d76927494fe6ea130e5">GG_FEATURE_MSG77</a>, 
<br/>
&#160;&#160;<a class="el" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea489baa156dfb3daf5e1679f38bbc9536">GG_FEATURE_STATUS77</a>, 
<br/>
&#160;&#160;<a class="el" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea8a5e25964135b5008c4dcfca1bc42ebb">GG_FEATURE_DND_FFC</a>, 
<br/>
&#160;&#160;<a class="el" href="group__login.html#gga61dadd085c1777f559549e05962b2c9ea57f0b76ee9f9000fc492a4af132c7d27">GG_FEATURE_IMAGE_DESCR</a>
<br/>
 }</td></tr>
<tr><td class="mdescLeft">&#160;</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> *&#160;</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">&#160;</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&#160;</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">&#160;</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&#160;</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">&#160;</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&#160;</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">&#160;</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&#160;</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">&#160;</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(&amp;parametry, 0, <span class="keyword">sizeof</span>(parametry));
parametry.uin = 12345;
parametry.password = <span class="stringliteral">&quot;hasło&quot;</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>(&amp;parametry);

<span class="keywordflow">if</span> (!sesja) {
    błąd(<span class="stringliteral">&quot;Nie można się połączyć&quot;</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 &quot;nie przeszkadzać&quot; i &quot;poGGadaj ze mną&quot;.">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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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> *&#160;</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> *&#160;</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> *&#160;</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> *&#160;</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> *&#160;</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>&#160;</td>
          <td class="paramname"><em>conn_id</em>&#160;</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">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Struktury Danych</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Pliki</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Funkcje</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Zmienne</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Definicje typów</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Wyliczenia</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Wartości wyliczeń</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</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&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>