Lotura-zuzendaria.

Aurkezpena

Lotura kudeatzailea talde-txat-funtzioen lehenengo pieza da. Klase honek lagunekin loturak kudeatzen ditu eta erabiltzaileari konektatu nahi dituzten gailuetara sokete multiplexatuak eskaintzen dizkio. Adibidez, Alice-k Bob-en gailu batekin konektatu nahi badu 2 fitxategi transferitzeko, ConnectionManager-ari Bob-i 2 kanala irekitzeko eskatuko dio. Honek emango dio:

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file1",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer first file
        }
    });

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file2",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer second file
        }
    });

Horren atzean, ConnectionManager-ek Bob-en gailuarekin konektatuko du DHT bidez (ICE bidez) eta TLS Socket bat ezarriko du. Ondoren, kanala eskatuko du, eta kanala prest dagoenean, Alice-ri abisatu deitzeko dei baten bidez. Bigarren fitxategiarentzat, lehen socket-a erabiliko du eta kanala berria zabalduko du (TLS pakete 2 bakarrik behar dira, beraz azkarra da)

DHT aldean

call, ikus Exchange ICE hautagaiak, ICE negoziazioa, Encrypt control soketa baina TCP bakarrik.

Alde batek ICEren eskaera berria jasotzen duenean, ordea, null onICERequest(onICERequestCallback&&& cb);-k ezarritako atzera-deialdia aktibatzen da.

Kanal berri bat negoziatzen

Kanala id (unique) eta uri (ez-unique) bidez definitzen da. Adibidez (1, ‹git://*›)

Prest dagoenean, ConnectionManagerrek 0 kanala existitzen dela uste du.

Erabilitako protokoloa nahiko sinplea da eta RTP protokoloa dirudi:

  1. Gorputzaren luzera gordetzeko 16 bit erabiltzen dira.

  2. 16 bits kanal id (destinazioa)

  3. gorputza

Pakete guztiek 32 biteko len-header bat dute.

Kanale berri bat eskatzeko, ConnectionManagerrek ChannelRequest objektu bat bidaliko du 0 kanalean (msgpack egitura sekuentziatzeko erabiltzen da) kanal berriaren id eta izena bidaltzeko ( isAnswer = false).

Kanal bat itxi

EOF bat igortzen da kanala baten barruan, edukia 0 bada.

Lotura egitura

Jabetza

  1. JamiAccount batek ConnectionManagerra du eta ChannelSocket objektuetara sarbidea du (shared_ptr MultiplexedSocket-ekin partekatzen da.

  2. ConnectionManagerrek MultiplexedSockets eta ICE objektuak ditu

  3. MultiplexedSocketsek TLS garraioaren eta ChannelSocket objektuen jabea da

  4. ChannelSocket-ek du datu-bufferra.

Rolrak

  1. ConnectionManager erabiltzen da lagunekin loturak kudeatzeko.

  2. MultiplexedSockets erabiltzen dira datuak bidaltzeko TLSSocket bidez, datozen paketeak irakurtzeko eta kanalak kudeatzeko.

  3. ChannelSockets bezeroak erabiltzen ditu beste lagun batekin interakzioan jartzeko.

Erabilera

Eszenarioak deskribatu dira unitate-proba dagokienetan (test/unitTest/connectionManager/connectionManager.cpp)