ˇ e vysok´e uˇcen´ı technick´e v Praze Cesk´ Fakulta elektrotechnick´a Katedra poˇc´ıtaˇc˚ u
Bakal´aˇrsk´a pr´ace
Rozˇ s´ıˇ ren´ı ExtBrain Communicatoru o dalˇ s´ı komunikaˇ cn´ı protokoly Yun Ruan
Vedouc´ı pr´ace: Ing. Tom´aˇs Novotn´ y
Studijn´ı program: Elektrotechnika a informatika, strukturovan´ y, Bakal´aˇrsk´ y Obor: V´ ypoˇcetn´ı technika 28. kvˇetna 2010
iv
v
Podˇ ekov´ an´ı Chtˇel bych t´ımto podˇekovat vedouc´ımu sv´e bakal´aˇrsk´e pr´ace Ing. Tom´aˇsi Novotn´emu za cenn´e pˇripom´ınky a rady pˇri vypracov´av´an´ı pr´ace, sv´e rodinˇe za podporu, Luboru Petrovi za pˇreklad a korekturu a samozˇrejmˇe tak´e Florian Qu`eze, hlavn´ımu v´ yvoj´aˇri Instantbirdu.
vi
vii
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem pr´ aci vypracoval samostatnˇe a pouˇzil jsem pouze podklady uveden´e v pˇriloˇzen´em seznamu. Nem´ am z´ avaˇzn´ y d˚ uvod proti uˇzit´ı tohoto ˇskoln´ıho d´ıla ve smyslu §60 Z´akona ˇc. 121/2000 Sb., o pr´ avu autorsk´em, o pr´ avech souvisej´ıc´ıch s pr´avem autorsk´ ym a o zmˇenˇe nˇekter´ ych z´akon˚ u (autorsk´ y z´ akon).
V Praze dne 28. 5. 2010
.............................................................
viii
Abstract The aim of this project is to bring protocol libpurple from Instantbird to mail client Mozilla Thunderbird 3 and demostrate the functionality that Instantbird offers.
Abstrakt C´ılem projektu je pˇren´est protokol libpurple od Instantbirdu do poˇstovn´ıho klienta Mozilla Thunderbird 3 a demonstrovat tak funkcionality, kter´e Instantbird nab´ız´ı.
ix
x
Obsah ´ 1 Uvod 1.1 Mozilla application framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Mozilla Thunderbird . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Instantbird . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 2 3 3
2 Specifikace c´ıle, pouˇ zit´ e n´ astroje 2.1 C´ıl projektu . . . . . . . . . . . . . . . . . . 2.1.1 Porovn´ an´ı existuj´ıc´ıch implementac´ı 2.2 Pouˇzit´e n´ astroje . . . . . . . . . . . . . . . 2.2.1 DOM Inspector . . . . . . . . . . . . 2.2.2 SQLite Manager . . . . . . . . . . . 2.2.3 Venkman . . . . . . . . . . . . . . . 2.2.4 XPCOM Viewer . . . . . . . . . . . 2.2.5 XUL explorer . . . . . . . . . . . . . 2.2.6 Extension Developer’s Extension . . 2.2.6.1 Javascript Shell . . . . . . 2.2.6.2 XUL editor . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
5 5 5 5 5 6 6 7 7 8 8 8
3 Skriptov´ an´ı v Mozille 3.1 Popis u ´rovn´ı skriptov´ an´ı v Mozille . . . . . . . . . . . . 3.1.1 Interface JS vrstva . . . . . . . . . . . . . . . . . 3.1.2 XPConnect . . . . . . . . . . . . . . . . . . . . . 3.1.3 XPCOM . . . . . . . . . . . . . . . . . . . . . . . 3.2 JavaScript a DOM . . . . . . . . . . . . . . . . . . . . . 3.2.1 Co je DOM? . . . . . . . . . . . . . . . . . . . . 3.2.2 DOM standardy . . . . . . . . . . . . . . . . . . 3.2.3 Metody DOM . . . . . . . . . . . . . . . . . . . . 3.2.3.1 V´ ystup na STDOUT pomoc´ı DUMP() 3.2.3.2 getElementById . . . . . . . . . . . . . 3.2.3.3 getAttribute . . . . . . . . . . . . . . . 3.2.3.4 setAttribute . . . . . . . . . . . . . . . 3.3 XPConnect a skriptovateln´e komponenty . . . . . . . . . 3.3.1 Co je to XPConnect? . . . . . . . . . . . . . . . 3.3.1.1 Vytvaˇren´ı XPCOM objekt˚ u ve skriptu . 3.3.1.2 Vyhled´av´an´ı komponenty a rozhran´ı . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
9 9 9 10 10 10 10 11 11 11 12 12 12 13 13 13 14
xi
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
xii
OBSAH
3.3.1.3
V´ ybˇer rozhran´ı z komponent . . . . . . . . . . . . . . . . . .
´ 4 Uvod do XPCOM ˇ sen´ı pomoc´ı XPCOM . . . . . . . 4.1 Reˇ 4.2 Komponenty XPCOM . . . . . . . . 4.3 Interface a IDL . . . . . . . . . . . . 4.3.1 Interface versus Komponenty 4.3.2 Root interface . . . . . . . . . 4.3.3 Kompil´ ator XPIDL . . . . . . 4.4 Typov´e knihovny . . . . . . . . . . . 4.4.1 Vytvaˇren´ı typov´e knihovny . 4.5 Identifik´ atory . . . . . . . . . . . . . 4.5.1 Identifik´ ator tˇr´ıd . . . . . . . 4.5.2 CID . . . . . . . . . . . . . . 4.5.3 Contract ID . . . . . . . . . . 4.5.4 Generov´ an´ı identifik´ ator˚ u . . 4.6 Typy . . . . . . . . . . . . . . . . . . 4.6.1 Typy metod 4.3 . . . . . . . . 4.6.2 Poˇc´ıt´ an´ı referenc´ı 4.4 . . . . . 4.6.3 Stavov´e k´ ody 4.5 . . . . . . . 4.6.4 Variabiln´ı mapov´ an´ı 4.6 . . . 4.6.5 Spoleˇcn´ a error k´ od˚ u 4.7 . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
15 17 18 18 18 19 20 20 20 21 21 21 21 22 22 22 22 22 23 23 23
5 Realizace 25 5.1 Celkov´ y pˇrehled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 5.2 V´ yvojov´e prostˇred´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 5.3 Probl´emy pˇri implementaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 6 Testov´ an´ı 29 6.1 Realn´e nasazen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 6.2 Srovn´ av´ an´ı s existuj´ıc´ımi ˇreˇsen´ımi . . . . . . . . . . . . . . . . . . . . . . . . 31 7 Z´ avˇ er 33 7.1 Zhodnocen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Literatura
35
A Instalaˇ cn´ı a uˇ zivatelsk´ a pˇ r´ıruˇ cka 37 A.1 Instalace Mozilla Thunderbird a Instantbird . . . . . . . . . . . . . . . . . . . 37 A.1.1 Postup instalace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 A.2 Instalace projektu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 B Obsah pˇ riloˇ zen´ eho CD
41
Seznam obr´ azk˚ u 1.1
XPFE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2.1 2.2 2.3 2.4 2.5 2.6 2.7
DOM inspector . SQLite manager Venkman . . . . XPCOM viewer . XUL explorer . . Javascript Shell . XUL editor . . .
. . . . . . .
6 6 7 7 8 8 8
3.1 3.2
´ Urovnˇ e skriptov´ an´ı v Mozille . . . . . . . . . . . . . . . . . . . . . . . . . . . XPConnect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10 14
4.1
ˇ ast Mozilla application framework[8] . . . . . . . . . . . . . . . . . . . . . . C´
17
6.1 6.2 6.3 6.4
Program po spouˇstˇen´ı . . . . . Pˇrihl´ aˇsov´ an´ı . . . . . . . . . . . Porovn´ an´ı po proveden´ı pˇr´ıkazu Chatov´ an´ı . . . . . . . . . . . .
29 30 30 31
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
xiii
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . .
xiv
´ U ˚ SEZNAM OBRAZK
Seznam tabulek 4.1 4.2 4.3 4.4 4.5 4.6 4.7
V´ yhody pouˇzit´ı komponent Interface nsISupports . . . . Typy metod . . . . . . . . . Poˇc´ıt´ an´ı referenc´ı . . . . . . Stavov´e k´ ody . . . . . . . . Variabiln´ı mapov´ an´ı . . . . Spoleˇcn´ a error k´ od˚ u . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
xv
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
18 19 23 23 23 24 24
xvi
SEZNAM TABULEK
Kapitola 1
´ Uvod V dneˇsn´ım dobˇe vˇetˇsina lid´ı vlastn´ı nˇekolik emailov´ ych u ´ˇct˚ u od r˚ uzn´ ych poskytovatel˚ u. Kv˚ uli tomu se mus´ı dennodennˇe v´ıcekr´at pˇrihlaˇsovat k serveru sv´eho poskytovatele a mus´ı pouˇz´ıvat webov´e emailov´e rozhran´ı. Pokud ˇcteme emaily jednou za ˇcas, jistˇe to nevad´ı, avˇsak pokud ˇcteme nˇekolik des´ıtek email˚ u dennˇe, brzy zjist´ıte, ˇze to nen´ı zrovna nejlepˇs´ı ˇreˇsen´ı. Proto jsou zde poˇstovn´ı tlust´ı klienti, kteˇr´ı n´am slouˇz´ı k pˇr´ıj´ım´an´ı a odes´ıl´an´ı elektronick´e poˇsty. Jeden z nich je Mozilla Thunderbird. Vˇetˇsina z n´ as tak´e vlastn´ı alespoˇ n jeden IM u ´ˇcet, pˇres kter´ y komunikujeme se sv´ ymi pˇr´ ateli, kteˇr´ı jsou pr´ avˇe pˇripojeni. Lze jim pos´ılat zpr´avy, pˇrepos´ılaj´ı soubory atd. Nicm´enˇe zat´ım ˇz´ adn´ y klient nenab´ız´ı sluˇzby jako je propojen´ı emailu a IM sluˇzeb. Pokud chceme komunikovat pomoc´ı IM sluˇzeb, mus´ıme si vˇetˇsinou nainstalovat speci´aln´ıho klienta. Nab´ız´ı se ot´ azka: Proˇc bychom nemohli slouˇcit sluˇzby jednotliv´ ych klient˚ u do do jednoho programu? Pˇrineslo by n´ am to komfort v tom, ˇze pˇri ˇcten´ı email˚ u bychom mohli b´ yt z´ aroveˇ n v kontaktu s pˇr´ ateli a nemus´ıme pˇrep´ınat mezi tˇemito programy.
1
´ KAPITOLA 1. UVOD
2
1.1
Mozilla application framework
Mozilla application framework[7] je multiplatformn´ı sada softwarov´ ych komponent pro v´ yvoj Mozilla aplikac´ı. P˚ uvodn´ı n´ azev XPFE(viz 1.1), zkratka pro Cross Platform Front End, t´eˇz zn´am´ y pod n´ azvem XPToolkit.
Obr´azek 1.1: XPFE Komponenty Mozilla application framework jsou: • Gecko - renderovac´ı j´ adro, navrˇzeno pro v´ ykon a pˇrenositelnost. • XML-based User-interface Language (XUL) - z´aklad uˇzivatelsk´eho rozhran´ı. Z´akladem je jazyk XML1 , pomoc´ı nˇehoˇz mapujeme r˚ uzn´e prvky uˇzivatelsk´eho rozhran´ı jako je widget, ovl´ adac´ı prvky, ˇsablony a dalˇs´ı. Syntaxe je velice podobn´a HTML2 . • Necko - poskytuje rozˇsiˇriteln´e, platformˇe nez´avisl´e API3 pro komunikaci na s´ıti. • eXtensible Binding Language (XBL) - dovoluje definovat vlastn´ı widget pro pouˇzit´ı v XUL. • Cross Platform Component Object Model (XPCOM) - multiplatformn´ı komponentov´ y model. Je podobn´ y Microsoft COM4 , podrobnˇe bude pops´an v n´asleduj´ıc´ıch kapitol´ ach. • XPConnect - spojuje JavaScript s XPCOM, umoˇzn ˇuje pouˇz´ıt XPCOM komponenty z javascriptov´eho k´ odu a interakci objekt˚ u zevnitˇr komponent XPCOM. • a dalˇs´ı ... Mozilla klade velk´ y d˚ uraz na multiplatformnost. V´ ysledkem je, ˇze funguje na skoro vˇsech operaˇcn´ıch syst´emech: Windows, Linux, MacOS, FreeBSD, a dalˇs´ı. Jej´ı hlavn´ı v´ yvojov´ y jazyk je C++ ale i tak je vˇetˇs´ı ˇc´ ast naps´ ana v JavaScriptu. 1
XML (Extensible Markup Language - obecn´ y znaˇckovac´ı jazyk, kter´ y byl vyvinut a standardizov´ an konsorciem W3C(World Wide Web Consortium). 2 HTML (HyperText Markup Language) - dalˇs´ı znaˇckovac´ı jazyk pouˇz´ıvan´ y pˇredevˇs´ım v internetov´ ych aplikac´ıch 3 API (Application Programming Interface) - rozhran´ı pro programov´ an´ı aplikac´ı. 4 COM (Component Object Model) - technologie programov´ ych komponent od firmy Microsoft.
1.2. MOZILLA THUNDERBIRD
1.2
3
Mozilla Thunderbird
Mozilla Thunderbird[12] je svobodn´ y, open source, multiplatformn´ı poˇstovn´ı klient, distribuovan´ y pod licenc´ı MPL/GPL/LGPL5 . P˚ uvodnˇe byl vyv´ıjen spoleˇcnost´ı Mozilla, nyn´ı jeho v´ yvoj pˇrevzala dceˇrin´ a spoleˇcnost Mozilla Messaging. Program je k dispozici hned v nˇekolika jazyc´ıch s jednoduch´ ym ovl´ad´an´ım i nastaven´ım. Nav´ıc m˚ uˇzeme doinstalovat r˚ uzn´e rozˇs´ıˇren´ı dle potˇreby, kter´e jsou dostupn´e na ofici´ aln´ıch str´ank´ ach[11]. Thunderbird nab´ız´ı tyto standardn´ı funkcionality: • Message management - spr´ava v´ıce e-mail, news feed atd. • Junk filtering - obsahuje bayesovsk´ y antispamov´ y filtr. • Extensions - umoˇzn ˇuje pˇrid´av´an´ı funkc´ı pomoc´ı instalace modul˚ u XPInstall. • Themes - podporuje skinovatelnost uˇzivatelsk´eho rozhran´ı. • Standards support - standardnˇe podporuje komunikaˇcn´ı protokoly POP6 a IMAP7
1.3
Instantbird
Instantbird[5] je IM8 klient vyuˇz´ıvaj´ıc´ı knihovnu libpurple9 , podporuj´ıc´ı velik´ y poˇcet komunikaˇcn´ıch protokol˚ u jako ICQ, AIM, Jabber a dalˇs´ı. Je to svobodn´ y a open source software a ˇs´ıˇren´ y pod licenc´ı MPL/GPL/LGPL jako Mozilla Thunderbird.
5
MPL (Mozilla Public License), GPL (GNU General Public License), LGPL (GNU Lesser General Public License) - jsou to licence pro svobodn´ y software. 6 POP (Post Office Protocol) - internetov´ y protokol, kter´ y se pouˇz´ıv´ a pro stahov´ an´ı emailov´ ych zpr´ av ze vzd´ alen´eho serveru na klienta. 7 IMAP (Internet Message Access Protocol) - internetov´ y protokol pro vzd´ alen´ y pˇr´ıstup k e-mailov´e schr´ ance. 8 IM (Instant messaging) - internetov´ a komunikace v re´ aln´em ˇcase. 9 libpurple - Knihovna, kter´ a je pouˇzivan´ a jako j´ adro IM program˚ u, napˇr. Pidgin, Adium, Instantbird.
4
´ KAPITOLA 1. UVOD
Kapitola 2
Specifikace c´ıle, pouˇ zit´ e n´ astroje 2.1
C´ıl projektu
C´ılem tohoto projektu je rozˇs´ıˇrit projekt ExtBrain communicator o dalˇs´ı komunikaˇcn´ı protokoly, kter´e podporuje knihovna libpurple. Nejzn´amˇejˇs´ı z nich jsou napˇr´ıklad: MSN, Jabber a ICQ. Bˇehem zkoum´ an´ı fungov´ an´ı intern´ıch modul˚ u Instantbirdu, jsem zjistil, ˇze pro m˚ uj projekt je v´ yhodn´e pouˇz´ıt framework xpcompurple. Ten v sobˇe zapouzdˇruje knihovnu libpurple pomoc´ı frameworku XPCOM. Xpcompurple vychaz´ı z Pidgin libpurple a je pˇripraven k pouˇzit´ı v Mozilla aplikac´ı.
2.1.1
Porovn´ an´ı existuj´ıc´ıch implementac´ı
Existuj´ıc´ı ˇreˇsen´ı jsem prozat´ım na str´ank´ach Thunderbird add-ons[11] nenaˇsel. Nem˚ uˇzu tedy porovnat moj´ı verzi aplikace s existuj´ıc´ımi ˇreˇsen´ımi.
2.2 2.2.1
Pouˇ zit´ e n´ astroje DOM Inspector
DOM inspector[1] je n´ astroj, kter´ y m˚ uˇze b´ yt pouˇzit ke kontrole a u ´pravˇe DOM1 v XUL nebo v jin´ ych webov´ ych dokumentech. V DOM inspektoru je moˇzn´e zobrazit stromovou strukturu jednotliv´ ych XML element˚ u. Oznaˇcen´ım konkr´etn´ıho uzlu m˚ uˇzeme zobrazit obsah dan´eho elementu. Zobrazen´ı element˚ u ve stromov´e struktuˇre je velice praktick´e pˇri ladˇen´ı sloˇzitˇejˇs´ıch str´anek, screenshot programu 2.1. 1
DOM (Document Object Model) - je objektovˇe orientovan´ a reprezentace XML nebo HTML dokumentu.
5
ˇ E ´ NASTROJE ´ KAPITOLA 2. SPECIFIKACE C´ILE, POUZIT
6
Obr´ azek 2.1: DOM inspector
2.2.2
SQLite Manager
SQLite Manager[10] je jednoduch´ y a uˇziteˇcn´ y n´astroj pro spr´avu SQLite2 datab´az´ı, umoˇzn ˇuj´ıc´ı proch´azen´ı a editaci datab´ az´ı, spouˇstˇen´ı SQL3 pˇr´ıkaz˚ u a intuitivn´ı zobrazov´an´ı datab´azov´ ych objekt˚ u ve stromov´e hierarchii, screenshot programu 2.2.
Obr´ azek 2.2: SQLite manager
2.2.3
Venkman
Venkman[13], zn´ am´ y t´eˇz jako JavaScriptov´ y debbuger pro Mozilla aplikace, je uˇziteˇcn´ y n´astroj, kter´ y umoˇzn ˇuje krokov´ an´ı, nastavov´an´ı watches a dalˇs´ı funkce nezbytn´e pro komfortn´ı ladˇen´ı vlastn´ıho k´ odu v JavaScriptu. Vekman je navrˇzen pro Thunderbird, Firefox a dalˇs´ı Mozilla aplikace, screenshot programu 2.3. 2
SQLite - relaˇcn´ı datab´ azov´ y syst´em obsaˇzen´ y v relativnˇe mal´e knihovnˇe napsan´e v C. SQL (Structured Query Language) - standardizovan´ y dotazovac´ı jazyk pouˇz´ıvan´ y pro pr´ aci s daty v relaˇcn´ıch datab´ az´ıch. 3
ˇ E ´ NASTROJE ´ 2.2. POUZIT
7
Obr´azek 2.3: Venkman
2.2.4
XPCOM Viewer
XPCOM viewer[17] je n´ astroj pro zkoum´an´ı XPCOM komponent. Nab´ız´ı snadn´e a rychl´e vyhled´ av´ an´ı XPCOM tˇr´ıd, rozhran´ı a aplikaˇcn´ıch log˚ u, kter´e jsou souˇc´ast´ı dan´e Mozilla aplikace. Dalˇs´ımi nab´ızen´ ymi funkcemi je napˇr. vyhled´avac´ı filtr, proch´azen´ı vytvoˇren´ ych objekt˚ u s moˇznost´ı zobrazen´ı jejich atribut˚ u, export zobrazen´ ych dat do HTML, XML nebo textu, screenshot programu 2.4.
Obr´azek 2.4: XPCOM viewer
2.2.5
XUL explorer
XUL explorer[19] poskytuje snadn´ y zp˚ usob, jak experimentovat s XUL. Je to jednoduch´ y editor, kter´ ym lze zobrazovat XUL jak inline tak v samostatn´em oknˇe. Pro zrychlen´ı pr´ ace v sobˇe obsahuje panel se seznamem Code snippets4 , kter´e mohou b´ yt rychle vloˇzeny do editoru. Program´ator tak nemus´ı ps´at velmi ˇcasto se opakuj´ıc´ı ˇc´asti k´ odu a pouh´ ym poklik´ an´ım vloˇz´ı do rozepsan´e ˇc´asti hotov´ y fragment XUL k´odu. XUL explorer v sobˇe obsahuje n´astroje jako XUL validator, DOM inspector, Error console, JavaScript debugger, kter´e jsou k dispozici pro ladˇen´ı chyb. Kromˇe toho tak´e nab´ız´ı pˇr´ıstup k XUL informac´ım na Mozilla Developer Center, screenshot programu 2.5. 4
Code snippets - mal´e fragmenty XUL nebo JavaScript
ˇ E ´ NASTROJE ´ KAPITOLA 2. SPECIFIKACE C´ILE, POUZIT
8
Obr´ azek 2.5: XUL explorer
2.2.6
Extension Developer’s Extension
Extension Developer’s Extension[2] je n´astroj, kter´ y usnadˇ nuje v´ yvoj´aˇri psan´ı rozˇs´ıˇren´ı pro Mozilla Firefox, Thunderbid atd. Nab´ız´ı mnoho funkc´ı, zde pop´ıˇsi jen ty, kter´e jsem pˇri v´ yvoji pouˇzil. 2.2.6.1
Javascript Shell
Javascript Shell 2.6 umoˇzn ˇuje spouˇstˇet JavaScript interaktivnˇe, experimentovat s XPCOM v shellu. M˚ uˇzeme spouˇstˇet JavaScript, jako by byl um´ıstˇen pˇr´ımo v dan´em dokumentu.
Obr´ azek 2.6: Javascript Shell
2.2.6.2
XUL editor
XUL editor n´ am opˇet umoˇzn ˇuje editovat XUL a zobrazovat v´ ysledn´ y vzhled dokumentu v re´aln´em ˇcase. XUL editor je zjednoduˇsen´a varianta XUL exploreru, nenab´ız´ı tedy takov´e mnoˇzstv´ı funkcionalit jako XUL explorer, screenshot programu 2.7.
Obr´ azek 2.7: XUL editor
Kapitola 3
Skriptov´ an´ı v Mozille Pokud programujeme aplikace zaloˇzen´e na Mozille je tˇreba se sezn´amit s XPFE[9]. Tento framework poskytuje ˇradu jiˇz implementovan´ ych funkcionalit jako napˇr´ıklad autentizaci, vol´an´ı XPCOM objekt˚ u, vol´ an´ı obsluhy ud´alost´ı, atd. Usnadˇ nuje tak program´atorovi integraci nov´ ych funkcionalit do Mozilly. Pro skriptov´ an´ı pod frameworkem XPFE je pouˇz´ıv´an JavaScript. M´a bohuˇzel n´alepku nesofistikovan´eho programovac´ıho jazyka, kter´ y je pˇredevˇs´ım urˇcen pro nasazen´ı na webov´ ych str´ank´ ach. Tento jazyk m´ a vˇsak mnohem ˇsirˇs´ı pouˇzit´ı. Disponuje mnoha vlastnostmi podobn´ ymi vyˇsˇs´ım programovac´ım jazyk˚ um jako je napˇr´ıklad: modularita, odchyt´av´an´ı v´ yjimek a ud´ alost´ı, podpora regul´ arn´ıch v´ yraz˚ u.
3.1
Popis u ´ rovn´ı skriptov´ an´ı v Mozille
´ Urovnˇ e skriptov´ an´ı v Mozille[9] m˚ uˇzeme rozdˇelit do tˇr´ı vrstev. Prvn´ı vrstva (Interface JS) se star´ a o manipulaci s objekty pomoc´ı DOM. Druh´a vrstva (XPConnect) obsluhuje vol´ an´ı sluˇzeb poskytovan´ ych XPCOMem a posledn´ı tˇret´ı vrstva (XPCOM) se star´a o vytv´ aˇren´ı XPCOM component. Hierarchii jednotliv´ ych vrstev popisuje obr´azek 4.1. Nyn´ı detailnˇe pop´ıˇseme jednotliv´e u ´rovnˇe skriptov´an´ı.
3.1.1
Interface JS vrstva
Nejvyˇsˇs´ı u ´rovn´ı skriptov´ an´ı je Interface JS. S jeho pomoc´ı m˚ uˇzeme rozˇsiˇrovat chov´an´ı jednotliv´ ych ˇc´ ast´ı aplikace, vytv´ aˇret nov´e widgety, kter´e m˚ uˇzeme navz´ajem propojovat do jednotn´eho celku. Referenci na atributy jednotliv´ ych komponent z´ısk´av´ame pomoc´ı vol´ an´ı metod zaloˇzen´ ych na DOM. Pokud napˇr´ıklad chceme pomoc´ı tlaˇc´ıtka editovat vlastnosti textboxu, pˇrid´ ame do obsluhy ud´alosti tlaˇc´ıtka vol´an´ı funkce getElementByID() a n´aslednˇe vybran´emu objektu mohu zmˇenit poˇzadovan´e vlastnosti.
9
´ ´I V MOZILLE KAPITOLA 3. SKRIPTOVAN
10
´ Obr´ azek 3.1: Urovnˇ e skriptov´an´ı v Mozille
3.1.2
XPConnect
XPConnect (kapitola 3.3) leˇz´ı v hierarchii na druh´e u ´rovni, spojuje uˇzivatelsk´e rozhran´ı s XPCOMem, to znamen´ a ˇze komponenty zabalen´e ve frameworku XPCOM jsou zpˇr´ıstupnˇeny pro programov´ an´ı v JavaScriptu. Pokud JavaScript zavol´ a nˇejakou metodu a n´aslednˇe dostane nˇejak´a data od komponenty niˇzˇs´ı vrstvy, vol´ an´ı a n´ asledn´e vr´ acen´ı v´ ysledku je vˇzdy prov´adˇeno pˇres tuto vrstvu.
3.1.3
XPCOM
Jak jiˇz bylo nˇekolikr´ at zm´ınˇeno, na tˇret´ı vrstvˇe v hierarchii leˇz´ı framework XPCOM. Jsou v nˇem zapouzdˇreny vˇsechny hlavn´ı tˇr´ıdy a funkce slouˇz´ıc´ı pro bezprobl´emov´ y chod vytv´aˇren´e aplikace. Jin´ ymi slovy m˚ uˇzeme ˇr´ıci, ˇze se jedn´a o j´adro Mozilla aplikac´ı. Podrobnˇe se budu XPCOMu vˇenovat v n´ asleduj´ıc´ıch kapitol´ach (kapitola 4).
3.2
JavaScript a DOM
Na aplikaˇcn´ı u ´rovni je mal´ y rozd´ıl mezi internetovou str´ankou a bˇeˇzn´ ym grafick´ ym uˇzivatelsk´ ym rozhran´ım. HTML DOM a XUL DOM jsou si velice podobn´e. V obou pˇr´ıpadech jsou zmˇeny stav˚ u a ud´alosti propagov´ any pˇres vol´ an´ı DOM[6].
3.2.1
Co je DOM?
DOM je API pouˇz´ıvan´e k pˇr´ıstupu k HTML a XML dokument˚ um. Pro v´ yvoj´aˇre internetov´ ych aplikac´ı nab´ız´ı dvˇe hlavn´ı funkcionality. Poskytuje strukturovanou reprezentaci
3.2. JAVASCRIPT A DOM
11
dan´eho dokumentu a definuje jak´ ym zp˚ usobem m˚ uˇze b´ yt k t´eto struktuˇre pˇristupov´ ano z JavaScriptu. Tyto funkcionality dovoluj´ı program´atorovi manipulovat s uˇzivatelsk´ ym rozhran´ım jako se stromem komponent. Dovoluje vytv´aˇren´ı nov´eho rozhran´ı ˇci z jiˇz hotov´eho rozhran´ı odeb´ırat nebo pˇrid´ avat dalˇs´ı elementy. DOM vˇsak nen´ı urˇcen jen pro pˇr´ıstup k HTML, XML nebo XUL dokument˚ um ale m˚ uˇzeme ho pouˇz´ıt i pro MathML1 , SVG2 nebo pro jin´e XML dokument˚ um podobn´e form´aty. Pokud JavaScriptem vytv´ aˇr´ıme nov´ y HTML element nebo mˇen´ıme atribut nˇejak´eho XUL objektu, m´ ame k tˇemto novˇe vytvoˇren´ ym prvk˚ um vˇzdy pˇr´ıstup pˇres objektov´ y model DOMu, kter´ y tyto struktury zapouzdˇruje.
3.2.2
DOM standardy
Dodrˇzov´ an´ı specifikace DOM je v Mozilla aplikac´ıch rozdˇel´av´ano do tˇr´ı u ´rovn´ı podle stupnˇe jej´ıho dodrˇzov´ an´ı. Kaˇzd´ a z u ´rovn´ı poskytuje vlastn´ı mnoˇzinu funkcionalit, nˇekter´e z nich vˇsak nejsou dosud Mozillou podporov´any.
3.2.3
Metody DOM
Metody v DOMu dovoluj´ı program´atorovi manipulovat s prvky, kter´e jsou obsaˇzeny v uˇzivatelsk´em rozhran´ı nebo ve webov´ ych str´ ank´ach. Umoˇzn ˇuj´ı nastaven´ı atribut˚ u, vytv´aˇren´ı prvk˚ u, skr´ yv´ an´ı prvk˚ u a dalˇs´ı. DOM zprostˇredkov´av´a veˇskerou interakci mezi skripty a rozhran´ım, napˇr. chceme-li zmˇenit obr´ azek, kdyˇz uˇzivatel stiskne tlaˇc´ıtko, DOM zaregistruje ud´alost, vyvolanou stisknut´ım tlaˇc´ıtka a nastav´ı poˇzadov´an´e atributy. Nyn´ı si uk´ aˇzeme nˇekter´e metody v DOMu. 3.2.3.1
V´ ystup na STDOUT pomoc´ı DUMP()
Metoda dump() se pouˇz´ıv´ a pro tisk dat na STDOUT3 . Tato metoda je pouˇz´ıv´ana hlavnˇe pˇri ladˇen´ı k´ odu. Uk´ azka pouˇ zit´ ı dump(): var assoc = { "val" : "New", "number" : 8 }; alert(dump(assoc));
V´ ystup: ’val’ => "New" ’number’ => "8"
1 MathML (Mathematical Markup Language) - matematick´ y znaˇckovac´ı jazyk, souˇca ´st´ı dokument˚ u konsorcia W3C (World Wide Web Consortium) jako podmnoˇzina jazyka XML pro z´ apis matematick´ ych a pˇr´ıbuzn´ ych vzorc˚ u. 2 SVG (Scalable Vector Graphics) - znaˇckovac´ı jazyk a form´ at souboru, kter´ y popisuje dvojrozmˇernou vektorovou grafiku pomoc´ı XML. 3 STDOUT (Standard output) - ˇcesky: Standardn´ı v´ ystup, je to virtu´ aln´ı zaˇr´ızen´ı, na kter´e program zapisuje v´ ystupn´ı data.
´ ´I V MOZILLE KAPITOLA 3. SKRIPTOVAN
12
3.2.3.2
getElementById
getElementById(aId) je snad nejˇcastˇeji pouˇz´ıvanou DOM metodu. Je to nejpohodlnˇejˇs´ı zp˚ usob, jak z´ıskat referenci na konkr´etn´ı prvek s pouˇzit´ım jeho ID jako parametr funkce, kde ID je jedineˇcn´ y identifik´ ator tohoto elementu. Uk´ azka pouˇ zit´ ı getElementById(aID):
var boxEl = document.getElementById(’my-id’); dump("boxEl="+boxEl+"\n"); V´ ystup: boxEl=[object XULElement] Hodnota, kterou getElementById vrac´ı, je reference na specifikovan´ y objekt typu XULElement. Jakmile je boxEl k dispozici, je moˇzn´e pomoc´ı jin´e DOM metody jako getAttribute a setAttribute zmˇenit pozici a dalˇs´ı vlastnosti. 3.2.3.3
getAttribute
Atributy jsou vlastnosti, definovan´e pˇr´ımo v elementech. XUL prvky maj´ı napˇr´ıklad atributy: disable, height, style, orient, label a dalˇs´ı.
ˇ ezce “my-id”, “hello 1” a “hello V´ yˇse uveden´ y k´ od ukazuje element s r˚ uzn´ ymi parametry. Retˇ 2” jsou hodnoty jednotliv´ ych atribut˚ u. Pokud objekt disponuje nˇejak´ ymi atributy, jejich hodnotu snadno z´ısk´ ame pomoc´ı metody getAttribute. Jej´ım vstupn´ım parametrem je n´azev hledan´eho atributu. N´ asleduj´ıc´ı pˇr´ıklad ukazuje jej´ı pouˇzit´ı.
<script> var boxEl = document.getElementById(’my-id’); var foo = boxEl.getAttribute(’foo’); dump(foo+’\n’); Metoda dump vyp´ıˇse ˇretˇezec “this is the foo attribute”, coˇz je hodnota uloˇzen´e ve foo. 3.2.3.4
setAttribute
Jako posledn´ı si uk´ aˇzeme metodu setAttribute. Je urˇcena ke zmˇenˇe hodnoty atribut˚ u. Jako napˇr. size, visibility, position, style atd., m´a dva parametry: n´azev atributu a jeho nov´a hodnota.
´ KOMPONENTY 3.3. XPCONNECT A SKRIPTOVATELNE
13
<script> boxEl=document.getElementById(’my-id’); boxEl.setAttribute(’foo’, ’this is the foo attribute changed’); var foo = boxEl.getAttribute(’foo’); dump(foo+’\n’); V´ yˇse uveden´ y skript zmˇen´ı hodnotu foo na “this is the foo attribute changed” a vyp´ıˇse pomoc´ı dump(). Metoda setAttribute lze pouˇz´ıt i k vytv´aˇren´ı nov´ ych atribut˚ u.
<script> boxEl=document.getElementById(’my-id’); boxEl.setAttribute(’bar’, ’this is the new attribute bar’); v´ ysledek:
3.3
XPConnect a skriptovateln´ e komponenty
XPConnect[18] propojuje JavaScript a uˇzivatelsk´e rozhran´ı s j´adrem aplikac´ı. Zde si uk´ aˇzeme, jak naj´ıt komponenty, kter´e jsou k dispozici program´atorovi pˇres XPConnect, vytv´ aˇren´ı JavaScriptov´ y objekt˚ u a jejich pouˇzit´ı v naˇsich aplikac´ıch.
3.3.1
Co je to XPConnect?
Zat´ım jsme si vystaˇcili se psan´ım skript˚ u vyuˇz´ıvaj´ıc´ı DOM pro manipulaci s prvky v uˇzivatelsk´em rozhran´ı. To je vˇsak jen zaˇc´ atek. Skriptov´an´ı v Mozille nab´ız´ı mnohem v´ıc. Pravdou je, ˇze funkcionality aplikace jsou pro vˇetˇsinu uˇzivatel˚ u d˚ uleˇzitˇejˇs´ı neˇz vzhled visu´aln´ıho rozhran´ı. Kv˚ uli tomu je tady XPConnect a XPCOM. Funkce jako je prohl´ıˇzen´ı internetov´ ych str´anek, ˇcten´ı email˚ u jsou sluˇzby implementovan´e na aplikaˇcn´ım vrstvˇe. Jsou tedy souˇc´ ast´ı niˇzˇs´ı u ´rovnˇe. Jsou obvykle naps´any v jazyce C++ a uspoˇr´ad´any do modul˚ u, zn´am´ ych jako XPCOM komponenty. Vztah komponent a sluˇzeb popisuje obr´azek 3.2. XPConnect propojuje JavaScript a XPCOM komponenty a pˇribaluje k nim objekty JavaScriptu. Pomoc´ı JavaScriptu a XPConnectu lze vytv´aˇret instance komponent a pouˇz´ıvat jejich metody a vlastnosti jako kdyˇz pracujeme s objektem z JavaScriptu. 3.3.1.1
Vytvaˇ ren´ı XPCOM objekt˚ u ve skriptu
N´asleduj´ıc´ı k´ od demonstruje tvorbu a pouˇzit´ı XPCOM komponent v JavaScriptu. Skript vytvoˇr´ı objekt filepicker a pouˇz´ıv´a ho k zobrazov´an´ı souboru v dialogu filepicker.
14
´ ´I V MOZILLE KAPITOLA 3. SKRIPTOVAN
Obr´ azek 3.2: XPConnect
Na prvn´ıch dvou ˇr´ adc´ıch je vidˇet jak se dialog fp filepicker vytv´aˇr´ı. Nejdˇr´ıve se vytvoˇr´ı instance nsIFilepicker a n´ aslednˇe se zavol´a metoda createInstance(), kde nsIFilepicker urˇcuje, kter´a komponenta se m´ a vytvoˇrit.
// chooseApp: Open file picker and prompt user for application. chooseApp: function( ) { var nsIFilePicker = Components.interfaces.nsIFilePicker; var fp = Components.classes["@mozilla.org/filepicker;1"]. createInstance( nsIFilePicker ); fp.init( this.mDialog, this.getString( "chooseAppFilePickerTitle" ), nsIFilePicker.modeOpen ); fp.appendFilters( nsIFilePicker.filterAll ); if ( fp.show( ) == nsIFilePicker.returnOK && fp.file ) { this.choseApp = true; this.chosenApp = fp.file; // Update dialog. this.updateApplicationName(this.chosenApp.unicodePath); }
3.3.1.2
Vyhled´ av´ an´ı komponenty a rozhran´ı
Hled´an´ı komponent a rozhran´ı, pochopen´ı jejich funkce je velice uˇziteˇcn´e pro ps´an´ı Mozilla aplikac´ı. Pro zjednoduˇsen´ı pr´ ace existuje webov´a str´anka Cross-References(http://mxr.mozilla.org/), slouˇz´ıc´ı k zobrazen´ı dokumentace a zdrojov´ ych k´odu Mozilly.
´ KOMPONENTY 3.3. XPCONNECT A SKRIPTOVATELNE
3.3.1.3
15
V´ ybˇ er rozhran´ı z komponent
Ve skriptech m˚ uˇzeme z´ısk´ avat objekty pomoc´ı speci´aln´ıho objektu classes a metody createInstance(). N´ aslednˇe m˚ uˇzeme pouˇz´ıvat metody, kter´e nab´ız´ı. var connection = Components.classes ["@mozilla.org/network/ldap-connection;1"]. createInstance(Components.interfaces.nsILDAPConnection); connection.init(queryURL.host, queryURL.port, null, generateGetTargetsBoundCallback( )); Nejdˇr´ıv si vezme komponentu, kter´a m´a CID4 ldap-connection;1 a rozhran´ı nsILDAPConnection. T´ım vytvoˇr´ıme nov´ y objekt a m˚ uˇzeme volat jeho metody.
4
CID (Contract ID) - jeden z XPCOM identifik´ ator˚ u, bude vysvˇetlen v n´ asleduj´ıc´ıch kapitol´ ach.
16
´ ´I V MOZILLE KAPITOLA 3. SKRIPTOVAN
Kapitola 4
´ Uvod do XPCOM XPCOM[15, 16] je zkratka pro Cross-platform component object model. Tento framework je podobn´ y technologii COM od spoleˇcnosti Microsoft. Podporuje mnoho jazyk˚ u, jako napˇr.: JavaScript, Python, Java. Rozhran´ı XPCOM jsou definov´ana v dialektu IDL1 naz´ yvan´e XPIDL2 . XPCOM poskytuje sadu z´akladn´ıch komponent a tˇr´ıd. Vˇetˇsina propracovanˇejˇs´ıch komponent v nˇem vˇsak nen´ı zahrnuta. Proto mus´ıme vyuˇz´ıt sluˇzeb nˇekter´ ych jin´ ych knihoven (napˇr. Gecko, Necko, jin´e aplikace, rozˇs´ıˇren´ı).
ˇ ast Mozilla application framework[8] Obr´ azek 4.1: C´
1 IDL (Interface definition language) - speci´ aln´ı jazyk pouˇz´ıvan´ y k popisov´ an´ı rozhran´ı softwarov´ ych komponent. 2 XPIDL (Cross Platform Interface Description Language) - speci´ aln´ı IDL pro XPCOM rozhran´ı.
17
´ KAPITOLA 4. UVOD DO XPCOM
18
4.1
ˇ sen´ı pomoc´ı XPCOM Reˇ
XPCOM je framework, kter´ y umoˇzn ˇuje v´ yvoj´aˇr˚ um rozdˇelit softwarov´e projekty na menˇs´ı modul´arn´ı kousky. Tyto kousky jsou zn´am´e jako komponenty, kter´e jsou pak smontovan´e dohromady za bˇehu programu. C´ılem XPCOM je, aby tyto komponenty mohli b´ yt vyv´ıjeny nez´avisl´e na sobˇe. XPCOM oddˇeluje implementaci komponent od rozhran´ı. Pomoc´ı XPCOM v´ yvoj´aˇri mohou vytv´aˇret komponenty, kter´e mohou b´ yt opakovanˇe pouˇzity v r˚ uzn´ ych aplikac´ıch nebo nahrazovat funkcionality existuj´ıc´ıch aplikac´ı. XPCOM nejen podporuje v´ yvoj softwaru, ale tak´e poskytuje ˇradu pokroˇcil´ ych funkc´ı, jako napˇr´ıklad: spravov´ an´ı pamˇeti, spr´ avu komponent, abstrakci soubor˚ u atd.
4.2
Komponenty XPCOM
Jak jiˇz bylo ˇreˇceno, XPCOM umoˇzn ˇuje v´ yvoj´aˇr˚ um rozdˇelit softwarov´e projekty na menˇs´ı kousky. Tyto kousky jsou obvykle mal´e, opˇetovnˇe pouˇziteln´e bin´arn´ı knihovny (DLL3 ve Windowsu, SO4 v Linuxu). Mohou obsahovat jednu ˇci v´ıce komponent. Kdyˇz je v knihovnˇe jedena nebo v´ıce souvisej´ıc´ıch komponent, st´av´a se z knihovny modul. Rozdˇelen´ı software do r˚ uzn´ ych komponent ulehˇcuje jeho v´ yvoj a u ´drˇzbu. V´ yhody rozdˇelov´ an´ı SW do komponent 4.1: Benefit Reuse Updates Performance Maintenance
Popis K´ od je znovupouˇziteln´ y v dalˇs´ıch aplikac´ıch. Aktualizace komponent bez nutnosti rekompilace cel´e aplikace Moduly, kter´e nejsou nezbytn´e, mohou b´ yt “lazy loaded5 ”, nebo nemus´ı b´ yt v˚ ubec naˇcteny, coˇz zvyˇsuje v´ ykon aplikace. Usnadˇ nuje hled´ an´ı a u ´drˇzbu ˇc´ast´ı aplikace. Tabulka 4.1: V´ yhody pouˇzit´ı komponent
4.3
Interface a IDL
Vˇsechna XPCOM rozhran´ı jsou definov´ana pomoc´ı IDL. K popisov´an´ı veˇrejn´ ych metod a vlastnost´ı komponent pomoc´ı IDL nen´ı definov´an konkretn´ı jazyk. Mozilla ve skuteˇcnosti pouˇz´ıv´a modifikovanou verze IDL, kter´ y se jmenuje XPIDL. 3
DLL (Dynamic-link library) - Programov´e moduly, kter´e mohou b´ yt sd´ıleny v´ıce programy, pouˇz´ıv´ ano v Microsoft Windows. 4 SO (Shared object) - Linuxov´ a varianta DLL. 5 Lazy loaded - je postup, kdy k´ od nebo modul nenahr´ av´ ame ihned, ale aˇz kdyˇz jsou potˇreba.
4.3. INTERFACE A IDL
19
Kl´ıˇcov´ ym rozd´ılem mezi COM programov´an´ım je, ˇze XPCOM oddˇeluje rozhran´ı a implementaci. Pokud je API oddˇeleno od implementaˇcn´ıho jazyka, m´a uˇzivatel API garanci toho, ˇze rozhran´ı bude nemˇenn´e. COM byl v podstatˇe vytvoˇren tak, aby udrˇzoval kompatibilitu na bin´arn´ı u ´rovni. IDL interface jsou zkompilovan´e do tzv. Type libraries (Typov´e knihovny).
4.3.1
Interface versus Komponenty
Vˇetˇsina XPCOM komponent implementuje alespoˇ n dvˇe rozhran´ı. Kaˇzd´a komponenta potˇrebuje funkce QueryInterface, AddRef a Release, aby se stala platn´ ym XPCOM objektem. Tyto metody jsou zdˇedˇen´e od z´ akladn´ıho rozhran´ı nsISupports 4.2. N´ azev
Typ
AddRef
NS IMETHOD (nsrefcnt) AddRef(void)
QueryInterface
Release
Popis
NS IMETHOD QueryInterface (REFNSIID aIID, void** aInstancePtr)
NS IMETHOD (nsrefcnt) Release(void) = 0;
Parametry/ N´ avratova hodnota Zvyˇsuje ˇc´ıtaˇc referenc´ı vrac´ı: rozhran´ı, pˇriˇrazen´a poˇcet instance nebude referenc´ı smaz´ana, dokud poˇcet referenc´ı nen´ı 0. Parametry: aIID[in], kter´ y je poˇzadovan´e interface IID. aInstancePtr [out], ukazatel na ukazatel rozhran´ı, Mechanismus pro kter´ y obdrˇz´ı zjiˇstˇen´ı rozhran´ı v´ ysledek. Vrac´ı: NS OK pokud je rozhran´ı podporov´an a NS NO INTERFACE kdyˇz nen´ı. NS ERROR INVALID POINTER - aInstancePtr je null. sniˇzuje ˇc´ıtaˇc referenc´ı, vrac´ı: pokud je roven 0, poˇcet tak smaˇze instance referenc´ı
Tabulka 4.2: Interface nsISupports
´ KAPITOLA 4. UVOD DO XPCOM
20
4.3.2
Root interface
QueryInterface, AddRef a Release jsou implementov´any ve vˇsech komponent´ach. Pokaˇzd´e definovat tyto tˇri metody nen´ı zrovna moc efektivn´ı. Proto jsou definov´any v nsISupports a ostatn´ı rozhran´ı od nˇeho dˇed´ı. XPIDL podporuje preprocesor jazyka C, pouˇz´ıv´a direktivu #include k vloˇzen´ı jin´eho IDL souboru, ne jako u Microsoft COM, kter´ y pouˇz´ıv´a import. U vˇsech IDL soubor˚ u je nutn´e v horn´ı ˇc´asti uv´est nsISupports: #include "nsISupports.idl" interface nsISimple : nsISupports { readonly attribute string value; };
4.3.3
Kompil´ ator XPIDL
IDL kompil´ator je n´ astroj, kter´ y vytvoˇr´ı bin´arn´ı distribuˇcn´ı soubor s n´azvem typov´e knihovny ze zdrojov´eho souboru. XPIDL kompil´ ator generuje informace o XPCOM rozhran´ı, hlaviˇcky XPCOM objekt˚ u a typov´e knihovny XPT, z nichˇz mohou objekty pˇristupovat pˇres XPConnect dynamicky. Je schopen vygenerovat i HTML soubor pro dokumentaci, testovac´ı Java class k´od a testovac´ı C++ k´ od. XPIDL kompil´ ator je um´ıstˇen na: mozilla/xpcom/typelib/xpidl/, lze st´ahnout pomoc´ı Mer5 curial nebo na str´ ankach Mozilla.org. Jeho pouˇzit´ı je velmi jednoduch´e. Pouˇzit´ı syntaxe a jin´e informace o kompil´atoru: $ ./xpidl --help Usage: xpidl [-m mode] [-w] [-v] [-I path] [-o basename] filename.idl -a emit annotations to typelib -w turn on warnings (recommended) -v verbose mode (NYI) -I add entry to start of include path for ‘‘#include "nsIThing.idl"’’ -o use basename (e.g. ‘‘/tmp/nsIThing’’) for output -m specify output mode: header Generate C++ header (.h) typelib Generate XPConnect typelib (.xpt) doc Generate HTML documentation (.html) java Generate Java interface (.java)
4.4
Typov´ e knihovny
Z´aklad komponentov´e architektury XPCOMu je, ˇze jsou soubory nez´avisl´e na jazyku a programov´ac´ım prostˇred´ı. Tyto soubory jsou zkompilov´any do .xpt pomoc´ı XPIDL kompil´atoru. 5
Mercurial - multiplatformn´ı, distribuovan´ y syst´em pro spr´ avu verz´ı.
´ 4.5. IDENTIFIKATORY
4.4.1
21
Vytvaˇ ren´ı typov´ e knihovny
K vytvoˇren´ı .xpt(typelib soubor) se pouˇz´ıv´a pˇr´ıznak flag -m typelib se zapnut´ ym warning (-W) a verbose (-v). Aby se soubor pˇreloˇzil korektnˇe, je nutn´e uv´est kde nsISupports leˇz´ı. # include path to nsISupports.idl $ $XPIDL_INC = /usr/src/mozilla/xpcom/base #compile nsISimple.idl $ xpidl -m typelib -w -v -I $XPIDL_INC \ > -o nsISimple nsISimple.idl
4.5
Identifik´ atory
XPCOM pouˇz´ıv´ a dva velmi d˚ uleˇzit´e identifik´atory pro rozezn´av´an´ı komponent a tˇr´ıd.
4.5.1
Identifik´ ator tˇ r´ıd
Tˇr´ıda nsIID je vlastnˇe typedef pro nsID tˇr´ıdu. nsIID poskytuje metody jako Equals pro porovn´ an´ı identifik´ ator˚ u v k´ od˚ u.
4.5.2
CID
CID je 128-bitov´e ˇc´ıslo, kter´e jednoznaˇcnˇe identifikuje tˇr´ıdu nebo komponentu stejn´ ym zp˚ usobem jako IID identifikuje rozhran´ı. CID pro nsISupports vypad´a takto: 00000000-0000-0000-c000-000000000046 Z´apis a d´elka CID m˚ uˇze b´ yt nepˇrehledn´a a neˇsikovn´a s ohledem na k´od, proto je velmi ˇcasto definov´ an n´ asledovnˇe: #define SAMPLE_CID \ { 0x777f7150, 0x4a2b, 0x4301, \ { 0xad, 0x10, 0x5e, 0xab, 0x25, 0xb3, 0x22, 0xaa}} Je tak´e moˇzn´e pouˇz´ıvat NS DEFINE CID. Jednoduch´e makro pro deklaraci konstant s hodnotou CID: static NS_DEFINE_CID(kWebShellCID, NS_WEB_SHELL_CID); CID je nˇekdy oznaˇcov´ an jako identifik´ator tˇr´ıdy. Pokud tˇr´ıda, na kter´e CID odkazuje, implementuje v´ıce neˇz jeden interface, tak CID garantuje, ˇze tˇr´ıda implementuje celou mnoˇzinu interfac˚ u, kdyˇz bude Published nebo Frozen.
´ KAPITOLA 4. UVOD DO XPCOM
22
4.5.3
Contract ID
Contract ID je ˇretˇezec pouˇz´ıvan´ y k pˇr´ıstupu ke komponent´am. Je ˇciteln´ y a snadno zapamatovateln´ y. CID nebo Contract ID m˚ uˇze b´ yt pouˇzito k z´ıskan´ı komponenty od Spr´avce komponent. Takhle napˇr´ıklad vypad´ a Contract ID pro LDAP operation component: "@mozilla.org/network/ldap-operation;1" Form´at Contract ID je: dom´ena komponent, modul, n´azev komponenty, ˇc´ıslo verze oddˇelen´e lom´ıtky. Stejnˇe jako CID, Contract ID odkazuje na implementaci neˇz na rozhran´ı, ne jako IID (interface ID). Ale Contract ID nen´ı omezen ˇz´adnou specifickou implementac´ı, jako CID, je tedy obecnˇejˇs´ı. Contract ID specifikuje pouze danou mnoˇzinu interfac˚ u, kterou chce implementovat a ˇc´ıslo jin´e CID mohou b´ yt doplnˇen´a. To je rozd´ıl mezi Contract ID a CID, umoˇzn ˇuje pˇrekryt´ı komponent.
4.5.4
Generov´ an´ı identifik´ ator˚ u
V Unixu/Linuxu, m˚ uˇzete pouˇz´ıt program uuidgen, spustiteln´ y z console, k vygenerov´an´ı UUID6 : $ uuidgen ce32e3ff-36f8-425f-94be-d85b26e634ee Pro Microsoft Windows existuje program guidgen.exe. M˚ uˇzeme tak´e pouˇz´ıt speci´aln´ıho robota na IRC7 v irc.mozilla.org pomoc´ı pˇr´ıkazu /msg mozbot uuid.
4.6
Typy
V XPCOMu existuje mnoho deklaraˇcn´ıch typ˚ u. Vˇetˇsina z tˇechto typ˚ u m´a jednoduch´e mapov´an´ı. Popiˇsme zde ty nejbˇeˇznˇejˇs´ıch.
4.6.1
Typy metod 4.3
Zajiˇst’uj´ı spr´ avnost konvence a n´ avratov´e typy.
4.6.2
Poˇ c´ıt´ an´ı referenc´ı 4.4
Tyto makra spr´ avuje poˇc´ıt´ an´ı referenc´ı. 6 UUID (Universally Unique Identifier) - obecnˇe unik´ atn´ı identifik´ ator, kter´ ym mohou b´ yt jednoznaˇcnˇe oznaˇcov´ any libovoln´e objekty. 7 IRC (Internet Relay Chat) - jedna z prvn´ıch moˇznost´ı komunikace v re´ aln´em ˇcase po internetu.
4.6. TYPY
23
NS IMETHOD NS IMETHODIMP NS IMETHODIMP (type) NS IMPORT NS EXPORT
Deklarace n´avratov´eho typy. Implementace n´avratov´eho typu. Speci´aln´ı pˇr´ıpad implementace n´avratov´eho typu. Metoda je vyˇreˇsena extern´ı knihovnou. Metoda je ˇreˇsena za pomoci extern´ı knihovny. Tabulka 4.3: Typy metod
NS ADDREF NS IF ADDREF NS RELEASE NS IF RELEASE
Vol´a AddRef na nsISupports objekt. Stejnˇe jako NS ADDREF s t´ım, ˇze zkontroluje null pˇred vol´an´ım AddRef. Speci´aln´ı pˇr´ıpad implementace n´avratov´eho typu. Metoda je vyˇreˇsena extern´ı knihovnou. Tabulka 4.4: Poˇc´ıt´an´ı referenc´ı
4.6.3
Stavov´ e k´ ody 4.5 NS FAILED NS SUCCEEDED
Vrac´ı true, kdyˇz byl stavov´ y k´od failure. Vrac´ı true, kdyˇz byl stavov´ y k´od success.
Tabulka 4.5: Stavov´e k´ody
4.6.4
Variabiln´ı mapov´ an´ı 4.6
4.6.5
Spoleˇ cn´ a error k´ od˚ u 4.7
´ KAPITOLA 4. UVOD DO XPCOM
24
nsrefcnt nsresult nsnull
V´ ychoz´ı typ pro referenˇcn´ı poˇcet, 32-bitov´ y integer. V´ ychoz´ı typ pro chyby, 32-bitov´ y integer. V´ ychoz´ı hodnota null. Tabulka 4.6: Variabiln´ı mapov´an´ı
NS ERROR NOT INITIALIZED NS ERROR ALREADY INITIALIZED NS ERROR NOT IMPLEMENTED NS ERROR NO INTERFACE NS ERROR NULL POINTER NS ERROR FAILURE NS ERROR UNEXPECTED NS ERROR OUT OF MEMORY NS ERROR FACTORY NOT REGISTERED
Instance nen´ı inicializov´ana. Instance je uˇz inicializov´ana. Metoda nen´ı implementov´ana. Rozhran´ı nen´ı podporov´ano. Platn´ y ukazatel je nsnull. Metoda selˇze, generick´a chyba. Neoˇcek´avan´a chyba. Chyba pˇri alokaci pamˇeti. Poˇzadov´an´a tˇr´ıda nen´ı zaregistrov´ana.
Tabulka 4.7: Spoleˇcn´a error k´od˚ u
Kapitola 5
Realizace V t´eto kapitole se budu vˇenovat popisu realizace projektu a probl´em˚ um pˇri jeho realizaci.
5.1
Celkov´ y pˇ rehled
Tento program by mˇel b´ yt multiplatformn´ı, to znamen´a, ˇze by mˇel fungovat pod operaˇcn´ımi syst´emy Microsoft Windows, Linux a Mac OS. Protoˇze vˇsak nevlastn´ım MacBook a nesehnal jsem ˇclovˇeka, kter´ y by byl ochoten mi s t´ım pomoci, byl program testov´an jen pod Microsoft Windows a Debian GNU/Linux. Grafick´e rozhran´ı je definov´ ano v souboru main.xul a funkce jsou v souboru main.js. O pˇrid´ av´ an´ı poloˇzky ”ICQ test” do popup menu se star´a soubor thunderbidOverlay.xul a v souboru overlay.js je zase funkce, kter´e zobraz´ı uˇzivatelsk´e rozhran´ı programu pomoc´ı window.open("chrome://icqtest/content/main.xul", "Blist","chrome,resizable=yes");.
5.2
V´ yvojov´ e prostˇ red´ı
Pˇri v´ yvoji aplikace jsem pouˇz´ıval textov´ y editor GEdit, kter´ y je souˇc´ast´ı Debian GNU/Linux, podporuje zv´ yrazˇ nov´ an´ı syntaxe, d´ale jsem pouˇz´ıval open-source n´astroj Netbeans IDE, kter´ y v sobˇe obsahuje n´ astroje, jako je Subversion, Git, Mercurial. Pomoc´ı tˇechto n´astroj˚ u m˚ uˇzeme z´ alohovat a obnovovat zdrojov´e soubory projektu.
5.3
Probl´ emy pˇ ri implementaci
Pr´ace navazuje na pˇredchoz´ı projekt ExtBrain communicator, kter´ y funguje pouze pro Jabber. Po dohodˇe s vedouc´ım pr´ ace mi bylo doporuˇceno pouˇz´ıt xpcompurple od Instantbirdu, kter´ y je uˇz pˇripraven k pouˇzit´ı v aplikaci Mozilla.
25
26
KAPITOLA 5. REALIZACE
Nejdˇr´ıve jsem zaˇcal s t´ım, ˇze jsem si st´ ahl zdrojov´e k´ody Instantbirdu[4] verze 0.1.3.1 z jeho internetov´ ych str´ anek. Ty jsem zkompiloval podle n´avodu na Instantbird wiki[3]. N´avod na kompilaci je pops´ an v pˇr´ıloze A. Protoˇze jsem nevˇedˇel, kter´e ze zkompilovan´ ych soubor˚ u budu potˇrebovat, konzultoval jsem to radˇeji na IRC kan´ alu, kde m´ a t´ ym v´ yvoj´aˇr˚ u m´ıstnost s n´azvem #instantbird. Bylo mi sdˇeleno, ˇze budu potˇrebovat libpurple.so, libpurplexpcom.so a vˇsechny soubory konˇc´ıc´ı na .xpt z adres´ aˇre obj-instantbird-dbg/purple/purplexpcom/public/ xpidlgen. Vytvoˇril jsem vlastn´ı projekt s n´ azvem “ICQ test” pomoc´ı Firefox/Thunderbird Extension Wizard1 [14]. Staˇc´ı jednoduˇse zadat n´ azev, ID, verzi projektu, nastavit moˇznosti, c´ılov´e aplikace a popˇr´ıpadˇe jednu ze tˇr´ı nab´ızen´ ych licenc´ı. Pot´e jsem zkop´ıroval knihovny a soubory (libpurple.so, libpurplexpcom.so a vˇsechny .xpt soubory) do sloˇzky “components”. Nainstaloval je do Mozilla Thunderbirdu 2. Pomoc´ı programu XPCOM viewer jsem chtˇel zjistit, zda jsou vˇsechny tˇr´ıdy a rozhran´ı naˇcteny. Ovˇsem nebylo tomu tak. V XPCOM vieweru bylo zobrazeno jen rozhran´ı purpleIAccount atd., tˇr´ıdy jako @instantbird.org/purple/core;1 nebyly nalezeny. N´aslednˇe jsem zkompiloval a vyzkouˇsel ostatn´ı verze, kter´e m´a Instantbird uloˇzeny v Merˇ adn´ curialu. Z´ a z nich neˇsla pouˇz´ıt. Vˇzdy to dopadlo tak, ˇze v XPCOM vieweru nebyly vidˇet tˇr´ıdy od Instantbirdu. Po dalˇs´ı diskuzi s v´ yvoj´ aˇri jsme dospˇeli k z´avˇeru, ˇze se jedn´a o chybu, konkr´etnˇe probl´em s nsSocketTransportService. Probl´em je v tom, ˇze spojen´ı pomoc´ı soket˚ u nen´ı v XPCOM moˇzn´e pouˇz´ıt, podrobnosti najdete na https://bugzilla.mozilla.org/show_bug.cgi? id=418535. Bylo mi ˇreˇceno, ˇze je tento probl´em opraven v xulrunner od verze 1.9b4, zat´ımco Mozilla Thunderbird 2 bˇeˇz´ı na 1.8.*. Z tohoto d˚ uvodu je mnou vyv´ıjen´ y modul pouˇziteln´ y aˇz pro Mozilla Thunderbird 3, kter´ y bˇeˇz´ı jiˇz na xulrunner 1.9.*. Probl´emem je to, ˇze projekt ExtBrain communicator jeˇstˇe nefunguje pod Thunderbirdem 3. Po konzultaci s vedouc´ım jsme se rozhodli, ˇze zprovozn´ım Instantbird na Mozille Thunderbidr 3 a pˇredvedu jeho funkcionality. St´ahl jsem si zdrojov´e k´ ody Comm-central z Mercurial, zkompiloval program a nainstaloval jsem bal´ıˇcek (n´ avod na jeho instalaci je pops´an v pˇr´ıloze A). Pot´e se v seznamu objevily XPCOM tˇr´ıdy, kter´e jsem potˇreboval. Kdyˇz byl tento probl´em vyˇreˇsen, zaˇcal zkouˇset z´akladn´ı pˇr´ıkazy, kter´e jsou pouˇz´ıv´any pro testov´an´ı. Napˇr.: pˇripojov´ an´ı k u ´ˇctu, vyps´an´ı protokol˚ u atd. var pcs = Components.classes["@instantbird.org/purple/core;1"] .getService(Ci.purpleICoreService); pcs.init(); var proto = pcs.getProtocolById(aProto); if (!proto) throw "Couldn’t get protocol " + aProto; var acc = pcs.createAccount(aName, proto); ... 1
Firefox/Thunderbird Extension Wizard - n´ astroj pro jednoduch´e a rychl´e vytv´ aˇren´ı .xpi bal´ıˇck˚ u.
´ ˇ IMPLEMENTACI 5.3. PROBLEMY PRI
27
Kdyˇz jsem postupnˇe napsal v´ yˇse uveden´ y k´od do JavaScript shellu, tak byl objekt pcs vytvoˇren bez probl´emu. Kdyˇz jsem vˇsak chtˇel pcs zinicializovat cel´ y Thunderbird zamrzl. Nic neˇslo udˇelat, jedinˇe ho vypnout pomoc´ı pˇr´ıkazu kill pˇres konzoli. Snaˇzil jsem se tedy dop´ atrat proˇc se tak dˇeje. Postupnˇe jsem proˇsel konfiguraˇcn´ı soubory, zdrojov´e k´ ody, ovˇeˇril jsem funkce init(). Ze zpr´avy v konzoli jsem zjistil, ˇze v adres´aˇri Thunderbirdu chyb´ı soubor libpurple.so, tak jsem pro jistotu do tohoto adres´aˇre nahr´al jak libpurple.so, tak i libpurplexpcom.so, ale probl´em se mi t´ım vyˇreˇsit nepodaˇrilo. Nechal jsem si ˇ sen´ı bylo pomˇernˇe jednoduch´e, staˇcilo si st´ahnout soubor a udˇelat patch2 , tedy poradit. Reˇ aby knihovny od Instantbirdu mohly fungovat pro xulrunner 1.9.1, jsou totiˇz zkompilovan´e pomoc´ı xulrunner 1.9.2 a je potˇreba udˇelat patch. Uk´azka k´ odu z patch souboru: diff --git a/instantbird/content/addbuddy.js b/instantbird/content/addbuddy.js --- a/instantbird/content/addbuddy.js +++ b/instantbird/content/addbuddy.js @@ -58,17 +58,17 @@ var addBuddy = { ... let tags = this.pcs.getTags(); + let tags = this.pcs.getTags({}); ... Po t´eto u ´pravˇe je inicializace hotov´a a Thunderbird nad´ale bˇeˇz´ı. Coˇz byla dobr´a zpr´ava do t´e doby, neˇz se objevil dalˇs´ı probl´em. Tentokr´at to byla ˇspatn´a inicializace. Snaˇzil jsem se naj´ıt ˇreˇsen´ı pomoc´ı programu strace3 ale ne´ uspˇeˇsnˇe. Na internetov´em f´oru jsem se dozvˇedˇel, ˇze m´am zkop´ırovat dva soubory all-instantbird.js a purple-prefs.js do sv´eho projektu a zakomentovat prvn´ı dva ˇr´ adky v souboru all-instantbird.js. Pˇri vytv´ aˇren´ı projektu jsem narazil na dalˇs´ı probl´em. Funkce getIter(), kter´a m´a vracet seznamy protokol˚ u, u ´ˇct˚ u atd., pˇri zavol´an´ı skonˇcila chybov´ ym hl´aˇsen´ım, ˇze chyb´ı ;(konec pˇr´ıkazu). Bylo to zp˚ usobeno t´ım, ˇze kl´ıˇcov´e slovo yield je novˇe pˇridan´e do JavaScriptu 1.7 a v dˇr´ıvˇejˇs´ıch verz´ıch nebylo. Aktualizoval jsem si tedy JavaScript na verzi 1.7. function getIter(aEnumerator) { while (aEnumerator.hasMoreElements()) yield aEnumerator.getNext(); } Pˇri programov´ an´ı jsem narazil jeˇstˇe na dalˇs´ı probl´em, kter´ y zp˚ usobil tento ˇr´adek Components.utils.import("resource://app/modules/imWindows.jsm"); 2
patch - n´ astroj, kter´ ym m˚ uˇze b´ yt soupis zmˇen aplikov´ an na star´e soubory tak, ˇze z´ısk´ ame nov´e. strace - je n´ astroj, kter´ y sleduje a zaznamen´ av´ a syst´emov´e vol´ an´ı. Je uˇziteˇcn´ y pro stopov´ an´ı a urˇcov´ an´ı pˇresn´e pˇr´ıˇciny syst´emov´ ych chyb, nebo podezˇrel´eho chov´ an´ı aplikac´ı. 3
28
KAPITOLA 5. REALIZACE
Neˇslo soubor imWindows.jsm naimportovat, je to zp˚ usobeno t´ım, ˇze alias app se odkazuje na soubory Firefoxu, neodkazuje se vˇsak tam, kde leˇz´ı rozˇs´ıˇren´ı. Je proto potˇreba nadefinovat vlastn´ı alias a uv´est to v souboru chrome.manifest. To m˚ uˇze vypadat napˇr´ıklad n´asledovnˇe: resource privatiser modules/ #definice vlastn´ ıho alias #ted’ se tam odkazujeme pomoc´ ı definovan´ eho alias Components.utils.import("resource://privatiser/imWindows.jsm"); Soubor imWindows.jsm nebyl nijak d˚ uleˇzit´ y, neovlivˇ nuje chod programu, ale chyba v consoli nevypad´ a dobˇre. Program byl nakonec dokonˇcen, ale pˇri jeho implementaci do nov´ ych verz´ı ExtBrain communicatoru je zapotˇreb´ı vylepˇsit napˇr´ıklad grafick´e uˇzivatelsk´e rozhran´ı, zp˚ usob zobrazen´ı atd.
Kapitola 6
Testov´ an´ı V t´eto kapitole se budu vˇenovat popisu testov´an´ı funkˇcnosti tohoto projektu.
6.1
Realn´ e nasazen´ı
Funkˇcnost tohoto programu jsem testoval na Debian GNU/Linuxu. V programu je moˇzn´e se pˇrih´ asit na nˇekolik u ´ˇct˚ u najednou. Vyzkouˇsel jsem pouze pr´aci s Jabber a ICQ, protoˇze m´am jen tyto dva u ´ˇcty. Pro spouˇstˇen´ı programu staˇc´ı prov´est n´asleduj´ıc´ı kroky: Tools → ICQ test. Pot´e se otevˇre nov´e okno s pˇrehledem aktu´ alnˇe pˇrihl´aˇsen´ ych u ´ˇct˚ u. Po pˇrihl´aˇsen´ı na jin´ yu ´ˇcet je zapotˇreb´ı tento seznam ruˇcnˇe aktualizovat kliknut´ım na combobox. Status lze zmˇenit kliknut´ım na tlaˇc´ıtko “S” a vybrat jednu ze tˇr´ı moˇznost´ı nebo napsat vlastn´ı zpr´avu.
Obr´azek 6.1: Program po spouˇstˇen´ı
29
´ ´I KAPITOLA 6. TESTOVAN
30
Pˇripojen´ı a odpojen´ı u ´ˇctu prob´ıh´ a bez probl´em˚ u. Je vˇsak nutn´e ˇc´ıslo u ´ˇctu a heslo zad´avat pˇri kaˇzd´em pˇripojen´ı. U protokol˚ u jako je Jabber, MSN atd., je potˇreba zadat i n´azev serveru. Po spuˇstˇen´ı se program automaticky pˇripoj´ı na server.
Obr´ azek 6.2: Pˇrihl´aˇsov´an´ı
Seznam pˇr´atel a skupiny je moˇzn´e zobrazit po kliknut´ı na tlaˇc´ıtko ”Output all buddies”. Pˇri dvojkliku na vybranou poloˇzku v seznamu se v textboxu “Buddy account” zobraz´ı alias nebo ICQ id dan´eho u ´ˇctu. Funkce pro vytv´ aˇren´ı a maz´ an´ı u ´ˇctu jsem vyzkouˇsel tak, ˇze jsem vytvoˇril nˇekolik u ´ˇct˚ u a postupnˇe jsem vˇsechny smazal, v´ ysledky jsem si ovˇeˇril pomoc´ı SQLite manager. //tento ˇ r´ adek vytvoˇ r´ ı ´ uˇ cet a uloˇ z´ ı do datab´ aze. var cre_acc = pcs.createAccount(username, userproto.value).password=userpass; //tento zase smaˇ ze ´ uˇ cet podle ID v datab´ azi. pcs.deleteAccount(account.id); V´ ysledek podle SQLite manager ukazuje obr´azek 6.3:
Obr´ azek 6.3: Porovn´an´ı po proveden´ı pˇr´ıkazu
Pro pˇrid´an´ı nov´eho kontaktu do seznamu je potˇreba nejdˇr´ıv vybrat jeden z aktu´alnˇe pˇrihl´aˇsen´ ych u ´ˇct˚ u, zadat jm´eno, email nebo ICQ id a vybrat si skupinu, pot´e potvrdit tlaˇc´ıtkem ”Create”. Pro vytv´aˇren´ı nov´e konverzace je potˇreba si nejdˇr´ıv vybrat z online seznamu jeden u ´ˇcet, pot´e ze seznamu pˇr´ atel c´ılov´ y u ´ˇcet. Dvojkliknut´ım na jm´eno c´ılov´eho u ´ˇctu se objev´ı v ”Buddy account”, n´aslednˇe po stisknut´ı tlaˇc´ıtka ”Start chat” m˚ uˇzete uˇz komunikovat. Tato funkcionalita vˇsak nen´ı zcela dokonˇcena. M˚ uˇzete komunikovat jenom s jedn´ım ˇclovˇekem a pokud
´ AN ´ ´I S EXISTUJ´IC´IMI RE ˇ SEN ˇ ´IMI 6.2. SROVNAV
31
Obr´azek 6.4: Chatov´an´ı
chcete mluvit s jin´ ym, mus´ıte nejdˇr´ıv zavˇr´ıt program a znovu ho spustit. Coˇz je to potˇreba vylepˇsit v dalˇs´ıch verz´ıch. Domn´ıv´ am se, ˇze toto dostateˇcnˇe demonstruje funkˇcnost xpcompurple pod Mozilla Thunderbird 3.
6.2
Srovn´ av´ an´ı s existuj´ıc´ımi ˇ reˇ sen´ımi
Protoˇze v Mozilla Thunderbirdu zat´ım neexistuje podobn´ y program, tak nen´ı moˇzn´e porovn´ an´ı.
32
´ ´I KAPITOLA 6. TESTOVAN
Kapitola 7
Z´ avˇ er 7.1
Zhodnocen´ı
D´ıky t´eto pr´ aci jsem se nauˇcil jak se programuj´ı rozˇs´ıˇren´ı do Mozilla aplikac´ı, jak funguje technologie XPCOM, XPConnect a XUL. Poznal jsem v´ yhody a nev´ yhody program˚ u tohoto typu. Mysl´ım si, ˇze se zkuˇsenostmi, kter´e jsem nabyl pˇri realizaci tohoto projektu, bych mohl pouˇz´ıt i jinde, nejen pˇri programov´an´ı aplikac´ı tohoto typu. Pˇri vypracov´an´ı tohoto projektu jsem tak´e narazil na mnoho probl´em˚ u, kter´e jsem ovˇsem vˇsechny zd´arnˇe vyˇreˇsil. Moˇznost´ı dalˇs´ıho pokraˇcov´ an´ı t´eto pr´ace je spousta, protoˇze xpcompurple nen´ı s´am o sobˇe dokonˇcen´ y. Tento projekt se st´ale vylepˇsuje a zdokonaluje. Hlavn´ım c´ılem je m´ıt hotov´ y projekt ExtBrain communicator, kter´ y bude fungovat pod Mozilla Thunderbirdem 3 a implementovat do nˇej xpcompurple. Pot´e se zamˇeˇrit na jin´e detaily, jako je grafick´e rozhran´ı atd. Z´avˇerem bych se chtˇel omluvit za mou ˇceˇstinu a gramatiku. Douf´am, ˇze jsem neudˇelal mnoho chyb.
33
34
´ ER ˇ KAPITOLA 7. ZAV
Literatura [1] DOM Inspector [online]. https://addons.mozilla.org/cs/thunderbird/addon/1806, stav ze 16. 4. 2010. [2] Extension Developer [online]. https://addons.mozilla.org/cs/thunderbird/addon/7434, stav ze 16. 4. 2010. [3] Instantbird kompilace [online]. https://wiki.instantbird.org/Instantbird:Compiling, stav ze 25. 5. 2010. [4] Instantbird download [online]. http://instantbird.com/download.html, stav ze 25. 5. 2010. [5] Instantbird [online]. http://instantbird.com/, stav ze 16. 4. 2010. [6] JavaScript and the DOM [online]. http://www.csie.ntu.edu.tw/~piaip/docs/CreateMozApp/ mozilla-chp-5-sect-2.html, stav ze 16. 5. 2010. [7] Mozilla application framework [online]. https://developer.mozilla.org/en/Mozilla_Application_Framework_in_ Detail, stav ze 16. 4. 2010. [8] Rapid Application Development with Mozilla [online]. http://mb.eschew.org/1, stav ze 16. 5. 2010. [9] Scripting Mozilla [online]. http://www.csie.ntu.edu.tw/~piaip/docs/CreateMozApp/mozilla-chp-5.html, stav ze 16. 5. 2010. [10] SQLite Manager [online]. https://addons.mozilla.org/cs/thunderbird/addon/5817, stav ze 16. 4. 2010. [11] Add-on pro Thunderbird [online]. https://addons.mozilla.org/en-US/thunderbird/, stav ze 16. 4. 2010. [12] Thunderbird [online]. http://www.mozillamessaging.com/thunderbird/, stav ze 16. 4. 2010.
35
36
LITERATURA
[13] Venkman [online]. https://addons.mozilla.org/cs/thunderbird/addon/216, stav ze 16. 4. 2010. [14] Firefox/Thunderbird Extension Wizard [online]. http://ted.mielczarek.org/code/mozilla/extensionwiz/, stav ze 25. 5. 2010. [15] XPCOM [online]. https://developer.mozilla.org/en/Creating_XPCOM_Components/An_Overview_ of_XPCOM, stav ze 16. 5. 2010. [16] XPCOM [online]. http://www.csie.ntu.edu.tw/~piaip/docs/CreateMozApp/mozilla-chp-8.html, stav ze 16. 5. 2010. [17] XPCOM Viewer [online]. https://addons.mozilla.org/cs/thunderbird/addon/7979, stav ze 16. 4. 2010. [18] XPConnect and Scriptable Components [online]. http://www.csie.ntu.edu.tw/~piaip/docs/CreateMozApp/ mozilla-chp-5-sect-4.html, stav ze 16. 5. 2010. [19] XUL Explorer [online]. https://developer.mozilla.org/en/XUL_Explorer, stav ze 16. 4. 2010.
Dodatek A
Instalaˇ cn´ı a uˇ zivatelsk´ a pˇ r´ıruˇ cka A.1
Instalace Mozilla Thunderbird a Instantbird
Mozilla Thunderbird je k dispozici na webov´ ych str´ankach Mozilla messaging (http://www. mozillamessaging.com/), aktu´aln´ı verze je: 3.0.4. Pokud chcete Mozilla Thunderbird zkompilovat na sv´em poˇc´ıtaˇci, m˚ uˇzete si zdrojov´e k´ ody st´ahnout pˇres CVS, Mercurial nebo FTP/HTTP. Postup je n´asleduj´ıc´ı (Detailn´ı postup je uveden na webu1 a je tak´e pops´an v A.1.1): Zaprv´e mus´ıte m´ıt nainstalovan´e poˇzadovan´e n´astroje bud’ pro Microsoft Windows2 nebo pro Linux3 , podle toho jak´ y operaˇcn´ı syst´em ’ pouˇz´ıv´ ate. Zadruh´e je potˇreba st´ahnout zdrojov´e k´ody bud z Mercurial nebo pˇres FTP/HTTP. Pot´e nakonfigurovat4 (napˇr. debug m´od) a nakonec to zkompilovat pomoc´ı pˇr´ıkazu make5 .
A.1.1
Postup instalace
V Linuxu je nutn´e nainstalovat nˇekter´e knihovny a n´astroje. Zde uvedu potˇrebn´e propriety pro Debian GNU/Linux: $ apt-get build-dep thunderbird $ apt-get install mercurial libasound2-dev libcurl4-openssl-dev libnotify-dev \ libxt-dev libiw-dev mesa-common-dev autoconf2.13 Pro Microsoft Windows je potˇreba st´ahnout: Microsoft Visual C++ Tools - obvykle je to Visual Studio, Microsoft Windows SDK(s)6 , MozillaBuild7 . Podle toho jakou verzi 1
Postup instalace je na https://developer.mozilla.org/en/Simple_Thunderbird_build Prerekvizity pro Microsoft Windows: https://developer.mozilla.org/En/Developer_Guide/Build_ Instructions/Windows_Prerequisites 3 Prerekvizity pro Linux: https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/ Linux_Prerequisites 4 Konfigurace: https://developer.mozilla.org/en/Configuring_Build_Options 5 Kompilace: https://developer.mozilla.org/en/Build_and_Install 6 Windows SDK je ke staˇzen´ı na https://developer.mozilla.org/En/Windows_SDK_versions 7 MozillaBuild je ke staˇzen´ı na http://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32/ MozillaBuildSetup-Latest.exe 2
37
38
ˇ ´I A UZIVATELSK ˇ ´ PR ˇ ´IRUCKA ˇ DODATEK A. INSTALACN A
Windows pouˇz´ıv´ ate. Jakmile m´ate tyto n´ astroje a knihovny nainstalovan´e, m˚ uˇzete st´ahnout zdrojov´e k´ody z Mercurialu. V Linuxu staˇc´ı pˇr´ıkaz: $ hg clone http://hg.mozilla.org/comm-central/ #pro Mozilla thunderbird $ hg clone http://hg.instantbird.org/instantbird/ #pro Instantbird Ve Windows je zapotˇreb´ı nejdˇr´ıve spustit d´avkov´ y soubor z MozillaBuild ve Windows commanderu podle toho, jakou verzi Visual studia m´ate nainstalovanou, a teprve potom zadat pˇr´ıkazy uveden´e v´ yˇse. C:/MozillaBuild/start-msvc9.bat # pro Visual studio 2008 Po staˇzen´ı k´ od˚ u je potˇreba otevˇr´ıt adres´aˇr, kde jsou k´ody uloˇzeny a prov´est aktualizace: $ cd comm-central $ python client.py checkout $ cd instantbird $ python client.py checkout pot´e vytvoˇrit soubor mozconfig pro Thunderbird i pro Instantbird, ve kter´em budou napˇr´ıklad tyto hodnoty: # Setup a basic mozconfig file #let’s build Thunderbird echo ’ac_add_options --enable-application=mail’ > mozconfig #in this directory echo ’mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir-tb-debug’ >> mozconfig #quickly echo ’mk_add_options MOZ_MAKE_FLAGS="-j4"’ >> mozconfig #debug mode echo ’ac_add_options --enable-debug’ >> mozconfig #no optimize echo ’ac_add_options --disable-optimize’ >> mozconfig Pro Instantbird je to podobn´e, ale m´ısto --enable-application=mail a MOZ OBJDIR= @TOPSRCDIR@/objdir-tb-debug bude --enable-application=instantbird a MOZ OBJDIR= @TOPSRCDIR@/objdir-instantbird-debug. To zm´amen´a, ˇze n´azev t´eto aplikace bude inyt aplikace stantbird, zat´ımco Thunderbird pouˇz´ıv´a mail. MOZ OBJDIR je m´ısto, kde m´a b´ nainstalov´ana. Samotn´a kompilace se na konec provede pomoc´ı pˇr´ıkazu #v adresaˇ r´ ı instantbird a comm-central $ make -f client.mk build
A.2. INSTALACE PROJEKTU
39
Program po kompilaci najdete v adres´aˇri MOZ OBJDIR/mozilla/dir/dist/bin/. Pro pozdˇejˇs´ı aktualizace k´ odu staˇc´ı prov´est: $ cd instantbird $ python client.py checkout $ make -f client.mk build $ cd comm-central $ python client.py checkout $ make -f client.mk build Pˇred kompilac´ı Instantbirdu je potˇreba nainstalovat z´aplatu. Je velice d˚ uleˇzit´a, protoˇze jinak zkompilovan´e knihovny pod Thunderbirdem 3 nebudou fungovat. Z´aplata s n´ azvem instantbird.patch je uloˇzena spolu se zdrojov´ ym k´odem v adres´aˇri instantbird. Z´aplatu nainstalujete n´ aslednˇe: $ cd instantbird $ patch -p1 instantbird.patch
A.2
Instalace projektu
Postup instalace programu je v podstatˇe stejn´ y jako instalace jin´eho rozˇs´ıˇren´ı aplikac´ı do Mozilla. V Thunderbirdu si vyberete menu Tools → Add–ons → Extensions → Install, pak si najdete soubor icqtest.xpi a kliknut´ım na tlaˇc´ıtko OK zapoˇcne instalace. Nakonec je nutn´e jeˇstˇe zkop´ırovat knihovnu libpurple.so (purple.dll pod Windows) do adres´aˇre Thunderbirdu. Po instalaci se objev´ı nov´ a poloˇzka pod menu Tools s n´azvem “ICQ test”, kliknut´ım na poloˇzku program spust´ıte.
40
ˇ ´I A UZIVATELSK ˇ ´ PR ˇ ´IRUCKA ˇ DODATEK A. INSTALACN A
Dodatek B
Obsah pˇ riloˇ zen´ eho CD • Mozilla Thunderbird zkompilovan´ y ze zdrojov´ ych k´od˚ u. Verze pro Microsoft Windows 7 a pro Debian GNU/linux 5.0 lenny. • Instantbird zkompilovan´ y ze zdrojov´ ych k´od˚ u. Verze pro Microsoft Windows 7 a pro Debian GNU/linux 5.0 lenny. • Profil Mozilla Thunderbird, kter´ y obsahuje veˇsker´e n´astroje a nastaven´ı. • Projekt ”ICQ test”. – Dokumentace – Zdrojov´e k´ ody – Navod - N´ avod ke spuˇstˇen´ı programu po instalaci. – build.sh - Bash soubor pro vytv´aˇren´ı .xpi bal´ıˇck˚ u, po spuˇstˇen´ı vytvoˇr´ı icqtest.xpi, kter´ y m˚ uˇzete nainstalovat do Mozilla Thunderbirdu, pˇredt´ım je jeˇstˇe potˇreba prov´est copy lib.sh. – config build.sh - Konfiguraˇcn´ı soubor, jsou zde potˇrebn´e odkazy pro build.sh. – soft install.sh - Pˇr´ıkazy pro staˇzen´ı Instantbird z reposit´aˇre a n´asledn´e instalace. – soft install1.sh - Pˇr´ıkazy pro staˇzen´ı Mozilla thunderbird 3 z reposit´aˇre a n´aslednou instalaci. – copy lib.sh - Zkop´ıruje knihovnu libpurple.so do Mozilla Thunderbirdu. – aktualizace.sh - provede aktualizaci a reinstalaci Instantbirdu nebo Mozilla Thunderbirdu.
41