Programa´torska´ dokumentace

Transkript

Programa´torska´ dokumentace
ANCA
(Amazing NetCall Application)
Programátorská
dokumentace
1 Podrobnějšı́ úvod do rodiny doporučenı́ H.323
Rodina doporučenı́, dotýkajı́cı́ch se (at’už přı́mo nebo nepřı́mo) H.323 telefonie, je rozsáhlá.
Jenom H.323 se odkazuje na 58 dalšı́ch dokumentů. Nás zajı́majı́ zejména tyto doporučenı́
(názvy uvádı́me v anglických originálech, abychom se vyhnuli krkolomným jazykovým
konstrukcı́m):
• H.323 – Packet-based multimedia communications systems
• H.225.0 – Call signalling protocols and media stream packetization for packet-based
multimedia communication systems
• H.245 – Control protocol for multimedia communication
• H.450.1 – Generic functional protocol for the support of supplementary services in H.323
• H.450.3 – Call diversion supplementary service for H.323
1.1 H.323
Kromě popisu základnı́ch vlastnostı́ H.323 systému a jeho komponent, které jsme přiblı́žili
na začátku přı́ručky administrátora, popisuje doporučenı́ také většinu komunikace – od
registrace v zóně až po ukončenı́ hovoru.
Začneme adresacı́ koncových zařı́zenı́. Každé koncové zařı́zenı́ musı́ mı́t alespoň jednu sı́t’ovou adresu, která ho jednoznačně identifikuje. V dalšı́m textu ji budeme označovat termı́nem
transportnı́ adresa. Dále může mı́t každé koncové zařı́zenı́ jeden nebo vı́ce aliasů. Alias může
být různého typu, napřı́klad alfanumerický řetězec, čı́slo linky a podobně. Množinou všech
aliasů nazýváme H.323 adresou terminálu.
1.1.1 Správa prostředků zóny
Koncová zařı́zenı́ informujı́ gatekeeper o změnách stavu (přihlášenı́ do zóny, změna aliasů
apod.), žádajı́ o přidělenı́ prostředků (přenosové kapacity) pomocı́ tzv. RAS správ (Registration, Admission and Status). RAS signalizace využı́vá v sı́tı́ch IP sı́tı́ch nespolehlivý UDP
protokolu, proto pro každý požadavek (Request) vyžaduje potvrzenı́ (Confirm), nebo
odmı́tnutı́ (Reject). Žádná odpověd’ se obvykle pokládá za zamı́tnutı́, nebo způsobı́ opakovánı́ požadavku. Základnı́ operace jsou přihlášenı́ do zóny (RegistrationRequest),
odhlášenı́ (DeregistrationRequest) a požadavek na přidělenı́ části přenosové kapacity
sı́tě pro (nový) hovor (AdmissionRequest).
1.1.2 Hovorová signalizace
H.323 doporučenı́ podporuje vı́ce variant signalizace v závislosti na tom, zda je jeden z terminálů (nebo oba) registrovaný v zóně a zda-li gatekeeper vyžaduje směrovánı́ hovorové
signalizace skrze něj. My však primárně podporujeme verzi, ve které je veškerá hovorová
signalizace směrována přes gatekeeper. V tomto přı́padě začı́ná hovor požadavkem na přidělenı́ přenosové kapacity, pokračuje odeslánı́m signálu Setup. Volané zařı́zenı́ přijme hovor
2
zaslánı́m signálu Connect. Tı́m je hovor navázaný a nastupuje rozdělenı́ Master-Slave úloh,
výměna informacı́ o schopnostech terminálu, otevřenı́ audio, video a/nebo datových kanálů.
Pro nás je důležitá procedura rychlého navázánı́ spojenı́, při které stačı́ dva signály (Setup
a Connect) k vytvořenı́ hovoru i otevřenı́ mediálnı́ch kanálů. Tato procedura komplikuje
odkloněnı́ hovorů, které se vykonává v prostoru mezi odeslánı́m Setup a Connect, protože
při rychlém navazovánı́ hovorů jsou multimediálnı́ kanály otevřeny již v této době.
Ukončenı́ hovoru je signalizováno pomocı́ ReleaseComplete a následnou žádosti gatekeeperu o uvolněnı́ přidělené přenosové kapacity.
1.2 Ostatnı́ doporučenı́
Doporučenı́ H.225 se zabývá, jakým způsobem jsou audio/video data a kontrolnı́ signály
spojeny, kódovány a rozděleny do paketů. Pro náš projekt je nejdůležitějšı́ definice struktur
použı́vaných v hovorové a RAS signalizaci.
Doporučenı́ H.245 popisuje postupy pro otevı́ránı́ a uzavı́ránı́ logických komunikačnı́ch
kanálů (napřı́klad kanál pro přenos videa, kanál pro přenos audia v kódovánı́ GSM-06.10)
a struktury použitých signálů.
Skupina doporučenı́ řady H.450 se zabývá doplňkovými službami. V H.450.1 jsou definovány základnı́ postupy použı́vané doplňkovými službami, struktura předávaných signálů
a jejich zapouzdřenı́ do H.225 signálů. Rovněž definuje chovánı́ terminálů a akce, které majı́
být vykonané jak na straně zdrojové tak i cı́lové entity (terminálu). Doporučenı́ H.450.3
pak podrobně rozebı́rá službu odkloněnı́ hovoru (nepodmı́něné odkloněnı́ všech hovorů,
odkloněnı́ hovoru v přı́padě, že účastnı́k neodpovı́dá apod.).
Dalšı́ doporučenı́ popisujı́ napřı́klad komprimaci audia (G.711, G.722, …), videa (H.263),
nebo některé specializované oblasti (přepojenı́ s ISDN sı́těmi, provoz v ATM sı́tı́ch a pod.).
3
2 OpenH323
OpenH323 je opensource implementace H.323 standardu, koordinována společnostı́ Quicknet Technologies Inc. Implementuje a podporuje většinu funkcı́ a procedur definovaných
v H.323. Rovněž podporuje některá rozšı́řenı́ a doplňkové služby z řady H.450.
Poznámka: Předpokládáme, že čtenář je již seznámen se základy H.323 telefonie z pohledu
vývojáře ().
2.1 Multiplatformnı́ knihovna PWLIB
Vývojáři systému OpenH323 chtěli dosáhnout vysoké přenositelnosti výsledného produktu
mezi různými platformami, zejména Windows a UNIX. Proto navrhli (a naprogramovali)
knihovnu PWLIB. Tato knihova se skládá z dvou částı́. Prvnı́ poskytuje většinu systémových
funkcı́ (např. práce se soubory a sockety, vlákna), ale také mnoho užitečných pomůcek:
objektové zapouzdřenı́ řetězců, základnı́ datové struktury (např. dynamické pole, slovnı́k
(hash tabulka)), vylepšená správa paměti apod. Druhou částı́ je implementace základnı́ch
datových typů z ASNa a jejı́ch kódovánı́ (H.225.0 použı́va variantu PERb . Součástı́ je parser,
který z ASN schématu vygeneruje zdrojové soubory třı́d, reprezentujı́cı́ objekty definované
v tomto schématu.
2.2 Základnı́ architektura
Hlavnı́m cı́lem knihovny OpenH323 je implementace H.323 částı́ koncového zařı́zenı́. Rozsah
vyžadovaných vlastnostı́ a schopnostı́ ilustruje nasledujı́cı́ schéma.
a
Abstract Syntax Notation – jazyk použı́vaný na popis datových struktur, v našem přı́padě
na popis struktury signálů
b
Packet Encoding Rules
4
EP-1: Schéma H.323 koncového zařı́zenı́
Většina aplikacı́ využı́vajı́cı́ch služeb OpenH323 vůbec nepřicházı́ do styku s vnitřnosti,
proto jsme ani my nestudovali podrobně všechny součásti. Popı́šeme hlavně rozhranı́ mezi
OpenH323 a aplikacı́, s několika odbočkami do vnitra knihovny. Důležitou okolnostı́, kterou
je třeba mı́t neustále na zřeteli, je použitı́ vláken v OpenH323. Zejména je nutné korektně
uzamykat přı́stup do kritických sekcı́.
2.2.1 H323EndPoint
Třı́da H323EndPoint poskytuje rozhranı́ k základnı́m funkcı́m koncového zařı́zenı́ v sı́ti
H.323: registrace do zóny, navázánı́ hovoru a dalšı́ hovorová signalizace (souvisejı́cı́ zejména
s doplňkovými službami typu podrženı́ hovoru, přesměrovánı́ hovoru apod.). Dále definuje callbacky – metody, které jsou volané při vzniku různých událostı́ (přı́chozı́ hovor,
otevřenı́/uzavřenı́ audio kanálu, …).
Typická aplikace vytvořı́ potomka třı́dy H323EndPoint, který změnı́ obsluhu některých
callbacků: upozorněnı́ na přı́chozı́ hovor a ukončenı́ hovoru, otevřenı́ a uzavřenı́ audio/video kanálu. Poslednı́ dva callbacky majı́ za úlohy připojit ke kodeku vstupnı́ nebo výstupnı́
kanál. V přı́padě audia stačı́ pomocı́ metod PWLIBu vytvořit komunikačnı́ kanál se zvukovou
kartou počı́tače, u videa je situace trošku komplikovanějšı́.
2.2.2 H323Connection
Každý hovor je reprezentovaný třı́dou H323Connection, která udržuje všechny informace o stavu spojenı́ mezi dvěma terminály. H323EndPoint si udržuje přehled o aktivnı́ch
5
spojenı́ch. Třı́da H323Connection kromě jiného implementuje část „H.225 řı́zenı́ “ z výše
uvedeného schématu. Směrem do sı́tě překládá požadavky od uživatele do H.225 signalizace pro H.225 vrstvu. V opačném směru obsluhuje přı́chozı́ signály a vyvolá požadované
akce nebo přı́slušný callback. Většina callbacků volá asociovaný callback v H323EndPoint,
proto obvykle nenı́ nutné upravovat chovánı́ H323Connection (nicméně tato možnost tu
je).
Hlavnı́m předmětem našeho zájmu je implementace doplňkových služeb H.450. Dle doporučenı́ jsou všechny data přenášená jako přı́loha standardnı́ch hovorových signálech. Tomu
odpovı́dá i řešenı́ v OpenH323: před odeslánı́m signálu se umožnı́ subsystému H.450 připojit potřebné data. Podobně se po přijatı́ signálu zpracujı́ H.450 přı́lohy a až pak následuje
obsluha H.225 signálu.
6
3 Klient pro Linux a embedded zařı́zenı́
Tento klient je v podstatě H.323 terminál ve smyslu definice 3.46 standardu ITU-T H.323, tj. je
to koncové zařı́zenı́ v sı́ti (endpoint), které umožňuje obousměrnou komunikaci s ostatnı́mi
koncovými zařı́zenı́mi v reálném čase. Vycházı́ ze třı́dy H323EndPoint, která je základem
všech endpointů využı́vajı́cı́ch knihovnu OpenH323. V dalšı́m textu jej budeme nazývat
termı́nem Anca, což je název aplikace.
3.1 Základnı́ architektura
Anca se koncepčně skládá z několika částı́, které nynı́ popı́šeme. Jsou to:
• knihovna Ancacore – tvořı́ jádro aplikace a mezivrstvu mezi hlavnı́ částı́ aplikace (H.323
část + GUI) a zásuvnými moduly (pluginy),
• H.323 část – zajišt’uje komunikaci s knihovnou OpenH323, implementuje H323EndPoint,
• GUI část – grafické uživatelské rozhranı́ využı́vajı́cı́ knihovnu Qt,
• zásuvné moduly (pluginy).
Architekturu Anca bychom tedy mohli znázornit takto:
Obrázek Anca-1: architektura aplikace Anca
Tato architektura byla zvolena proto, aby byla zajištěna co největšı́ modularita programu.
Modularita zpřehledňuje kód, je méně náchylná k chybám, a v přı́padě zásuvných modulů
umožňuje uživateli vybrat si jen to, co opravdu potřebuje. Hlavnı́ část aplikace implementuje
interakci s uživatelem (GUI část) a základnı́ komunikaci s OpenH323 knihovnou (H.323 část);
hlavnı́ funkčnost ale je přenesena do zásuvných modulů. Moduly tak zpřı́stupňujı́ audio a
video komunikaci, nabı́zı́ uživateli adresář kontaktů (např. přes adresářový server LDAP) a
jiné. Kromě modularity (kdy si uživatel může vybrat jen to, co potřebuje) nabı́zı́ toto řešenı́
7
snadnou aktualizaci a přidávánı́ dalšı́ch funkcı́. Pokud se na to podı́váme z jiného pohledu,
můžeme řı́ct, že části citlivé na postupný vývoj (audio a video zařı́zenı́) byly přesunuty do
modulů.
3.1.1 Knihovna Ancacore
Knihovna Ancacore obsahuje soubory v adresáři src/libcore. Zahrnuje správu pluginů (plugin.*, pluginfactory.*) a komunikaci v rámci aplikace (ancainfo.*, ancaconf.*). Pluginy detailně popisuje kapitola . Nynı́ se tedy zaměřı́me na komunikaci, kterou knihovna Ancacore
nabı́zı́.
AncaInfo (ancainfo.h)
AncaInfo je třı́da, která realizuje funkci nakladatele (publisher) v klasickém problému
publisher–subscriber. Všechny objekty třı́d, které jsou potomkem QObject (z knihovny Qt),
mohou být odběratelé (subscribers). Všechny objekty mohou vystavovat, ale i explicitně
čı́st. Srozumitelnou řečı́ to znamená, že pomocı́ objektu třı́dy AncaInfo, mohou objekty
ukládat některé informace (AncaInfo::set()), přičemž zaregistrované objekty budou tyto
informace automaticky dostávat, pokud se na ně zapı́šı́ (AncaInfo::connectNotify(),
a všichni si je mohou čı́st (AncaInfo::get()).
Nejdůležitějšı́ metody:
• install( const QString& key, const QString& initialValue )
vytvořı́ novou informačnı́ položku, jejı́ž klı́č je key
• set( const QString& key, const QString& value )
nastavı́ novou hodnotu položky s klı́čem key
• QString get( const QString& key )
vrátı́ hodnotu položky s klı́čem key
• connectNotify( const QString& key, const QObject *receiver,
const char *member )
objekt receiver se připojı́ k odebı́ránı́ hodnot položky s klı́čem key
Dalšı́ metody třı́dy AncaInfo a jejich popis najdete zde.
V souboru stdinfo.h najdeme základnı́ informačnı́ položky:
• LOGIN
Hlavnı́ uživatelův alias (pod kterým se např. autorizuje u gatekeepera).
• ADDRESS
Adresa uživatele (tj. jeho FQDN).
• TIME
Aktuálnı́ čas.
• DATE
Aktuálnı́ datum.
• MESSAGE
Zpráva, která informuje uživatele o některých událostech.
Stavové informace:
• VG_STATE, typ: VG_StateType
možné hodnoty:
8
VG_IDLE
VG_OPENING
VG_OPENED
VG_CLOSED
Stav video grabberu. VG_IDLE značı́, že grabber je v počátečnı́m nebo chybovém stavu.
• CALL_STATE, typ: CALL_StateType
možné hodnoty:
CALL_IDLE
CALL_STARTED
CALL_CLOSED
CALL_CALLING
CALL_HELD
Stav volánı́. Stav CALL_IDLE je počátečnı́ stav. Ve stavu CALL_CALLING aplikace navazuje hovor. CALL_HELD značı́, že hovor je podržen.
• GK_STATE, typ: GK_StateType
možné hodnoty:
GK_IDLE
GK_REGISTERING
GK_REGISTERED
GK_NOT_REGISTERED
Stav připojenı́ ke gatekeeperu. Stav GK_IDLE je počátečnı́ stav. V GK_REGISTERING se
aplikace pokoušı́ registrovat u gatekeeperu.
Statistické informace:
• JITTER_BUFFER_SIZE, typ: int
Velikost bufferu, který se použı́vá na vyrovnánı́ kolı́sánı́ toku multimediálnı́ch dat.
• JITTER_AVERAGE_TIME, typ: int
Průměrný interval kolı́sánı́ toku multimediálnı́ch dat.
• JITTER_MAXIMUM_TIME, typ: int
Maximálnı́ interval kolı́sánı́ toku multimediálnı́ch dat.
• TRANSMITTER_SESSION_INTERVAL, typ: int
Interval aktualizace statistik pro odesilatele.
• RECEIVER_SESSION_INTERVAL, typ: int
Interval aktualizace statistik pro přı́jemce.
• PACKETS_SENT, typ: int
Počet odeslaných paketů.
• PACKETS_RECEIVED, typ: int
Počet přijatých paketů.
• PACKETS_LOST, typ: int
Počet ztracených paketů.
• PACKETS_TOO_LATE, typ: int
Počet zahozených paketů.
Informace o probı́hajı́cı́m hovoru:
• PARTY_NAME
Jméno (alias) vzdáleného účastnı́ka hovoru.
• PARTY_HOST
Název počı́tače vzdáleného účastnı́ka hovoru.
• PARTY_PICTURE
Obrázek přidružený ke vzdálenému účastnı́kovi hovoru.
9
• CALL_DURATION
Délka probı́hajı́cı́ho hovoru.
• ADDRESS_TO_CALL
H.323 adresa, která by se měla použı́t pro nejbližšı́ volánı́.
• ADDRESS_TO_CALL_NOW
H.323 adresa, která by se měla použı́t pro volánı́ právě ted’.
• ADDRESS_CALLING
H.323 adresa, která se právě volá.
• CALLER_ADDRESS
H.323 adresa uživatele, který nám právě volá.
Ostatnı́:
• HTTP_PUSH
Byl poslán požadavek na zobrazenı́ HTML stránky se zadanou adresou.
• HTTP_CLOSE
Byl poslán požadavek na zavřenı́ stránky, která byla otevřena pomocı́ push.
AncaConf (ancaconf.h)
Třı́da AncaConf má na starosti správu konfigurace. Nabı́zı́ podobné řešenı́ jako registry ve
Windows, třı́da PConfig v knihovně PWLib a mnohá dalšı́. To, že Anca nepoužı́vá žádné již
existujı́cı́ řešenı́ má několik důvodů. Chtěli jsme, aby správa konfigurace využı́vala knihovnu
Qt. To nám jednoduše umožnilo přidat několik vlastnostı́, které by se jinak obtı́žně řešily.
Dále jsme nechtěli využı́vat řešenı́, která by vyžadovala začleněnı́ dalšı́ch knihoven do
aplikace (napřı́klad Qtopia, KDE). Poznamenejme ale, že AncaConf standardně použı́vá
pro ukládánı́ na disk třı́du PConfig z knihovny PWLib.
AncaConf nabı́zı́ kromě ukládánı́ a čtenı́ jednotlivých konfiguračnı́ch položek podporu
sekcı́. Každá položka se nacházı́ v nějaké sekci. Pokud sekce nenı́ specifikována, bere se v
úvahu sekce standartnı́ (default). Dále AncaConf umožňuje oznamovánı́ změn těm objektům (potomkům QObject), které se pro to přihlásı́.
Nejdůležitějšı́ metody:
• readEntry( const QString& key, const QString& defaultValue )
Přečte položku, jejı́ž klı́č je key.
• readEntry( const QString& section, const QString& key,
const QString& defaultValue )
Přečte položku, jejı́ž klı́č je key a je v sekci section.
• writeEntry( const QString& key, const QString& value )
Uložı́ hodnotu value do konfiguračnı́ položky, jejı́ž klı́č je key.
• writeEntry( const QString& section, const QString& key,
const QString& value )
Uložı́ hodnotu value do konfiguračnı́ položky, jejı́ž klı́č je key a je v sekci section.
• installNotify( const QString& key, const QObject *receiver,
const char *member, const QString& section )
Přihlásı́ objekt receiver, který má slot member, k oznamovánı́ o změnách konfiguračnı́
položky, jejı́ž klı́č je key a je v sekci section.
V souboru stdconf.h najdeme základnı́ konfiguračnı́ položky:
10
• ANCA_PICTURES_DIR
Určuje adresář (kromě standardnı́ch), který obsahuje obrázky aplikace Anca.
• LOAD_NEW_PLUGINS, typ: bool
Určuje, zda se budou při startu nahrávat nové (dřı́ve nepoužité) zásuvné pluginy.
• LIBRARY_PATHS, typ: QStringList
Určuje adresáře, které se budou procházet při hledánı́ zásuvných modulů.
3.1.2 H.323 část
Tuto část vymezujı́ v podstatě soubory anca.*, endpoint.* a slavethread.*. Hlavnı́ třı́da je
EndPoint (endpoint.h). Ta je přı́mým potomkem H323EndPoint, což je základ všech koncových zařı́zenı́ (endpoints) v H.323 sı́ti (samozřejmě v implementaci OpenH323). Jejı́m
zastřešenı́m je třı́da Anca (anca.h), která zpřı́stupňuje zbytku aplikace některé funkce, které
EndPoint implementuje. K tomu v některých přı́padech využı́vá SlaveThread (slavethread.h). Objekt této třı́dy volá přı́slušné metody objektu endPoint (instance EndPoint) v
druhém vlákně, aby se zabránilo „zamrznutı́ “ hlavnı́ho (GUI) vlákna při některých blokovacı́ch operacı́ch.
EndPoint (endpoint.h)
EndPoint reimplementuje některé metody H323EndPoint, aby vyhovovaly požadavkům
aplikace Anca. H323EndPoint definuje pouze základnı́ chovánı́ endpointu, které našim účelům nepostačuje. EndPoint využı́vá mechanismus zásuvných modulů, nastavuje endpoint
(knihovnu OpenH323) podle AncaConf, vystavuje některé informace pomocı́ AncaInfo.
Kromě reimplementace také definuje několik vlastnı́ch metod; některé z nich jsou popsány
nı́že. Poznamenejme ale, že EndPoint by nikde v aplikaci neměl být volán přı́mo. K tomu
jako prostřednı́k sloužı́ objekt anca (instance Anca).
Nejdůležitějšı́ metody:
• init()
Provede některé inicializačnı́ činnosti endpointu.
• registerGk()
Přihlásı́ se (resp. odhlásı́) ke gatekeeperu podle nastavenı́ v ancaConf (globálnı́ instance
AncaConf).
• makeCall( const PString& remoteParty ) Pokusı́ se navázat hovor s endpointem, jehož H.323 adresa je remoteParty.
• hangUpCurrent() Pokusı́ se ukončit právě probı́hajı́cı́ hovor.
Anca (anca.h)
Anca je potomkem třı́dy PProcess knihovny PWLib. Ta reprezentuje proces operačnı́ho
systému a je nutná pro správný běh samotné PWLib a nad nı́ stavı́cı́ OpenH323. V aplikaci
musı́ být právě jedna jejı́ instance. Je to tedy takový základ H.323 části. Samotná ale nemá
většı́ využitı́; zpřı́stupňuje některé systémové informace. Jak již bylo řečeno, Anca sloužı́ i
jako prostředı́k mezi EndPointem a zbytkem aplikace. Definuje proto několik metod, které
umožňujı́ základnı́ správu hovorů.
Nejdůležitějšı́ metody:
11
• init()
Provede několik prvotnı́ch nastavenı́ OpenH323 knihovny
• registerGk()
Přihlásı́ se (resp. odhlası́) ke gatekeeperu (volá EndPoint::registerGk() pomocı́
SlaveThread).
• setDiversion()
Nastavı́ server-side přesměrovánı́ hovorů podle nastavenı́ v ancaConf
(volá EndPoint::setDiversion() pomocı́ SlaveThread).
• call( const PString& remoteParty )
Pokusı́ se navázat hovor s endpointem, jehož adresa je remoteParty
(volá EndPoint::call()).
• handUp()
Pokusı́ se ukončit právě probı́hajı́cı́ hovor (volá EndPoint::hangUpCurrent()).
• holdRetrieveCall()
Podržı́ (resp. obnovı́) aktuálnı́ hovor (volá EndPoint::holdRetrieveCall()).
• transferCall( const PString& remoteParty )
Převede hovor na H.323 adresu remoteParty.
Několik poznámek k transferCall(). H.323 specifikuje dva druhy přesunutı́ volánı́ (call
transferring):
• klasické přesunutı́ – aktuálnı́ hovor je přesunut přı́mo na zadanou adresu
(volá se EndPoint::transferCall()),
• přesunutı́ s radou (consultation transfer) – aktuálnı́ hovor je podržen, zavolá se uživatel,
ke kterému se má hovor přesunout, a až pak se podržený hovor přesune.
Anca::transferCall() tedy testuje, zda existuje podržený hovor, a v tomto přı́padě
volá EndPoint::transferHeldCall().
Konfigurace H.323 části (confdefines.h)
V souboru confdefines.h najdeme klı́če některých základnı́ch konfiguračnı́ch položek pro
AncaConf. H.323 části se týkajı́:
• REGISTER_WITH_GK (typ: bool)
• GK_ADDR
• GK_ID (typ: int)
• GK_REGISTRATION_METHOD (typ: EndPoint::RegistrationMethod,
možné hodnoty: GkAuto, GkAddr, GkId, GkBoth)
• USER_ALIASES (typ: QStringList)
• PORT (typ: int)
• SEND_VIDEO (typ: bool)
• RECEIVE_VIDEO (typ: bool)
• SEND_AUDIO (typ: bool)
• RECEIVE_AUDIO (typ: bool)
• AUTO_ANSWER (typ: bool)
• FORBIDDEN_ALIASES (typ: QStringList)
• DO_NOT_DISTURB (typ: bool)
• ALWAYS_FORWARD (typ: bool)
• BUSY_FORWARD (typ: bool)
• NO_ANSWER_FORWARD (typ: bool)
• USE_GK_DIVERSION (typ: bool)
• ANSWER_TIMEOUT (typ: int)
• FORWARD_HOST
12
•
•
•
•
FAST_START (typ: bool)
H245_TUNNELING (typ: bool)
H245_IN_SETUP (typ: bool)
RING_FILE
3.1.3 Grafické uživatelské rozhranı́
Grafické uživatelské rozhranı́ se skládá z hlavnı́ho okna (AncaForm) a několika dialogů
(ConfigurationDialog, AnswerCallDlg, PersonalDialog a dalšı́). K této části aplikace můžeme přiřadit i několik pomocných třı́d, které samy přı́mo nic nezobrazujı́, ale
nepřı́mo ano – nějakým způsobem manipulujı́ s výše uvedenými třı́dami.
AncaForm (ancaform.h)
Hlavnı́ okno se sestává ze zásobnı́ku oken (widgets) (uprostřed), lišty tlačı́tek (dole) a vstupu
pro volanou adresu společně s volacı́m tlačı́tkem (nahoře). Zásobnı́k (QWidgetStack) obsahuje několik oken, přičemž zobrazuje pouze jedno z nich. Přepı́nánı́ mezi okny se pak děje
pomocı́ tlačı́tek v liště. Toto rozhranı́ umožňuje zásuvným modulům vkládat svá vlastnı́
okna bez toho, aby nějak porušily vzhled aplikace. Při návrhu navı́c byl brán ohled na to,
že Anca může být použı́vána i v embedded zařı́zenı́ch, které neoplývajı́ velkou zobrazovacı́
plochou jako monitory PC.
GUIManager (guimanager.h)
Hlavnı́ pomocnou třı́dou je GUIManager. Spravuje vzhled hlavnı́ho okna podle stavu volánı́
(povoluje a zakazuje tlačı́tka, měnı́ jejich vzhled), dále pak přidává/odebı́rá grafické rozhranı́
(krátce GUI) zásuvných modulů. GUI modulů ukládá do zásobnı́ku oken třı́dy AncaForm,
přı́slušná tlačı́tka pak do lišty AncaForm.
Nejdůležitějšı́ metody:
• callStarted() (slot)
Upravı́ grafické rozhranı́ pro hovor.
• callCleared() (slot)
Upravı́ grafické rozhranı́ pro nečinnost (žádný hovor).
• callingStarted() (slot)
Upravı́ grafické rozhranı́, když se navazuje spojenı́.
• callHeld() (slot)
Upravı́ grafické rozhranı́ pro podržený hovor.
• insertWidget( QWidget *widget, Plugin::Type type ) (slot)
Vložı́ GUI modulu, jehož typ je type.
GUIProxy (guiproxy.h)
GUIProxy je dalšı́ pomocnou třı́dou. Umožňuje vláknům, které nejsou hlavnı́ (hlavnı́ vlákno,
tj. GUI thread), zobrazovat grafická okna. To proto, že knihovna Qt grafické operace v jiných
vláknech neumožňuje. GUIProxy řešı́ tento problém pomocı́ mechanismu událostı́ knihovny
Qt. Událost je objekt, který popisuje, co se stalo. Může to být napřı́klad informace o tom, že
uživatel kliknul myšı́. Knihovna Qt obsahuje centrálnı́ frontu těchto událostı́ a hlavnı́ GUI
vlákno pak nemá nic jiného na starost, než vybı́rat události jednu po druhé a reagovat na ně.
GUIProxy tedy vložı́ do této fronty vlastnı́ událost (QApplication::postEvent(), Qt
si ji vyzvedne v hlavnı́m vlákně a posléze se obrátı́ na GUIProxy, aby s nı́ přı́slušně naložil
(GUIProxy::customEvent()).
13
Nejdůležitějšı́ metody:
• answerCall( const QString& caller )
Zobrazı́ dialog, který upozornı́ uživatele na přı́chozı́ hovor.
• messageCritical( const QString& caption,
const QString& message )
Zobrazı́ výstražný dialog se zprávou message.
InfoManager (infomanager.h)
Poslednı́ pomocnou GUI třı́dou je InfoManager. Vytvářı́ informačnı́ položky, které jsou
definovány v stdinfo.h, a na některé z nich (předevšı́m stavové) reaguje. Napřı́klad při
změně stavu volánı́ (klı́č CALL STATE) volá přı́slušné metody GUIManager.
Konfigurace GUI části (confdefines.h)
Klı́če konfiguračnı́ch položek, které se týkajı́ GUI části:
• MAX_DIRECTLY_VISIBLE_PLUGINS, typ: int
• USE_BUTTON_LABELS, typ: bool
• LABEL_POSITION_BELLOW_ICON, typ: bool
• CALL_OPTIONS_BUTTON, typ: Qt::ButtonState
možné hodnoty:
LeftButton
RightButton
MidButton
3.1.4 Zásuvné moduly
Zásuvný modul (plugin) je knihovna, jejı́ž kód se načı́tá do adresového prostoru aplicitně
explicitně na přánı́ uživatele. Zbytek aplikace na nı́ musı́ být zcela nezávislý, sestavovacı́
program (linker) ji tedy nenačte při startu automaticky. Obvykle přidává některé vlatnosti,
které nejsou vyžadovány funkčnı́m jádrem aplikace, můžeme řı́ct „přı́davky“.
Moduly Anca mohou být zcela obecné – hlavnı́ část aplikace o nich nevı́ nic podstatného,
umı́ s nimi pouze manipulovat, řı́dit jejich běh; nebo mohou mı́t některý speciálnı́ význam.
Takové moduly poskytujı́ vlastnosti, které jsou žádoucı́ zbytkem aplikace. Všechny moduly
mohou mı́t vlastnı́ konfiguračnı́ dialog. Mohou být uvolněny z paměti v kterýkoli čas.
Základem je soubor plugin.h knihovny Ancacore. Najdeme zde podrobný (a pravděpodobně
aktuálnı́) popis toho, jak moduly psát, ale také všechna rozhranı́ a struktury, které jsou pro
modul nutné. Připoměňme, že modul by měl načı́tat (include) pouze hlavičkové soubory z
knihovny Ancacore. Zbytek aplikace je pro něj nedosažitelný.
Plugin
Základem každého modulu je třı́da, která implementuje rozhranı́ Plugin (podle terminologie C++ bychom měli řı́kat virtuálnı́ třı́da). Metody, které musı́ být implementovány
jsou:
• init() a
• exit().
init() se volá při startu modulu, exit() těsně před smazánı́m modulu.
Dalšı́ (ne všechny) důležité metody, které mohou být implementovány jsou:
14
• QWidget *createGUI()
Vytvořı́ GUI modulu, které se vložı́ do hlavnı́ho okna aplikace. Volá se pouze v přı́padě,
že je nastaven přı́znak P_HAS_GUI (viz nı́že).
• QDialog *createConfig()
Vytvořı́ konfiguračnı́ dialog modulu. Volá se pouze v přı́padě, že je nastaven přı́znak
P_HAS_CONFIG (viz nı́že).
• PluginInfo *pluginInfo()
Vracı́ PluginInfo, viz nı́že.
Kromě obecného rozhranı́ Plugin jsou zde ještě některá dalšı́ rozhranı́, která majı́ již dřı́ve
zmiňovaný speciálnı́ význam pro zbytek aplikace. Jsou to:
• MediaPlugin
• AudioPlugin
• VideoInPlugin
• VideoOutPlugin
PluginInfo
PluginInfo je struktura, která modul popisuje. Musı́ být staticky obsažena v každém
modulu právě jednou. Ukazatel na ni je předáván v konstruktoru i třı́dě odvozené od
rozhranı́ Plugin.
Položky PluginInfo:
• Plugin::Type type (možné hodnoty: VideoOut, VideoIn, Audio, Other)
Typ modulu; určuje, od kterého rozhranı́ je základnı́ třı́da modulu odvozena
• int flags (bitová kombinace P_HAS_CONFIG, P_HAS_GUI, P_CAN_UNLOAD)
Přı́znaky určujı́cı́ chovánı́ k modulu
P_HAS_CONFIG – modul má konfiguračnı́ dialog, tudı́ž metoda
Plugin::createConfig() může být volána,
P_HAS_GUI – modul má grafické rozhranı́, bude voláno Plugin::createGUI(),
P_CAN_UNLOAD – modul může být uvolněn z paměti (musı́ umět vše, co vytvořil,
korektně zrušit)
• const char *name
Název modulu.
• const char *description
Popis modulu.
• const char *author
Autor modulu.
• createPlugin *create
Ukazatel na funkci, která vytvořı́ hlavnı́ třı́du modulu (potomka Plugin).
• getPlugin *get
Ukazatel na funkci, které vrátı́ třı́du vytvořenou pomocı́ create().
• int id
Jednoznačný identifikátor modulu; každý modul aplikace Anca jej musı́ mı́t jiný.
Přı́klad
Plugin *createMyPlugin();
Plugin *getMyPlugin();
static PluginInfo pluginInfo = {
Plugin::Audio,
15
P_CAN_UNLOAD | P_HAS_CONFIG,
”audio”,
”Manages audio”,
”author”,
createMyPlugin,
getMyPlugin,
12345
};
Plugin *createMyPlugin()
{
return new MyPlugin( &pluginInfo );
}
Plugin *getMyPlugin()
{
return plugin;
}
Funkce getPluginInfo
Struktura PluginInfo je přı́stupná pomocı́ funkce getPluginInfo(). Je to poslednı́
požadovaná část každého modulu.
Přı́klad
extern ”C” PluginInfo *getPluginInfo()
{
return & pluginInfo;
}
16
4 Použitá literatura, doporučenı́, knihovny a programy
• ITU-T Recommendation H.323 (2000), Packet-based multimedia communications systems.
• ITU-T Recommendation H.225.0 (2000), Call signalling protocols and media stream
packetization for packet-based multimedia communication systems.
• ITU-T Recommendation H.450.1 (1998), Generic functional protocol for the support of
supplementary services in H.323.
• ITU-T Recommendation H.450.3 (1998), Call diversion supplementary service for H.323.
• OpenH323, PWLIB, OpenAM, OpenMCU
http://www.openh323.org
• OpenH323 Gatekeeper – The GNU Gatekeeper
http://www.gnugk.org
• tdbrepl The Trivial Database Replication System
http://tdbrepl.inodes.org/
• Specifikace JTAPI a implementace všech rozhranı́
http://java.sun.com/jtapi
• Implementace standardu CORBA
http://www.mico.org (C++) a http://www.jacorb.org (JAVA)
17

Podobné dokumenty

Multiplatformní GUI toolkity

Multiplatformní GUI toolkity X server posílá události o aktivitì u¾ivatele (napø. stisk klávesy nebo pohyb my¹i), X serveru (napø. ¾ádost o pøekreslení okna) nebo WM (napø. zmìna velikosti okna), také ruèní vyvolání události a...

Více

Bakalářská práce

Bakalářská práce Dále je zde externí zvukový signál přijímaný prostřednictvím zvukové karty z mikrofonu nebo přímo ze zvukové aparatury daného představení. Ten nalezne uplatnění při tvorbě obrazu přímo v programu. ...

Více

Diplomová práce

Diplomová práce Umí jen zapsat a přečíst posloupnost znaků a nastavit parametry zařízení. V současné době jsou implementovány moduly pro sériový port, IrDA a Bluetooth, všechny jak pro Microsoft Windows, tak pro L...

Více

Bubble Trouble Programátorská Dokumentace

Bubble Trouble Programátorská Dokumentace zavedením těchto vektorů docházelo k tomu, že po kousnutí zombií zemřela ryba a než stihla zmizet z vektoru fishes, timer se s ní pokusil pohnout (ačkoliv už neexistovala). Při zabití bublinou tyto...

Více

openMagazin 2/2011

openMagazin 2/2011 Jestliže je váš textový soubor velmi rozsáhlý, jistě oceníte podporu záložek řádků. Textový soubor zmiňuji úmyslně, protože se záložky zobrazují jen v rámci jednoho souboru. KDevelop obsahuje přehl...

Více

Skip list – dokumentace

Skip list – dokumentace do hierarchie, na jejímž vrcholu je AbstractCard, rozšířená v podobě AbstractSideDeckCard a MainDeckCard. Od AbstractSideDeckCard jsou odvozené všechny speciální karty až na TieBreakerCard, který j...

Více