Programa´torska´ dokumentace
Transkript
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
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...
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. ...
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...
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...
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...
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...