上一篇簡單介紹了OpenOffice.org的發(fā)展軌跡、許可證問題、應(yīng)用范圍等情況。實際上,OpenOffice.org之所以獲得如此廣泛的應(yīng)用,是與它本身優(yōu)秀的技術(shù)架構(gòu),開放、可擴(kuò)展、標(biāo)準(zhǔn)化的XML文件格式規(guī)范,以及社區(qū)成員的廣泛參與密不可分的。
本篇將主要介紹OpenOffice.org的技術(shù)體系結(jié)構(gòu),它的分層架構(gòu)、UNO組件模型、基于IDL的API和SDK,以及UNO與其它組件模型的互操作。
分層架構(gòu)
OpenOffice.org所基于的技術(shù)架構(gòu)能夠提供在UNIX和類UNIX系統(tǒng)上豐富的辦公軟件功能,并且這種架構(gòu)能夠被移植到其他很多的平臺上。這是因為整個架構(gòu)就是在平臺無關(guān)性的思路下實現(xiàn)的。
整個OpenOffice.org中實際上只有不到10%的代碼是與平臺相關(guān)的,這些代碼為上層的組件模塊提供一個系統(tǒng)抽象層。由于C++編譯器存在于每一個主要平臺上,所以O(shè)penOffice.org采用了C++作為主要的編程語言(最底層的部分代碼由于效率等原因是C語言編寫的)。這種實現(xiàn)方式允許OpenOffice.org移植到非常廣泛的不同的平臺上,采用面向?qū)ο笳Z言也使得OpenOffice.org具有面向?qū)ο蟮募夹g(shù)架構(gòu)。
圖1是OpenOffice.org的分層架構(gòu)圖,總體上分為四層,每層由若干不同的子層/庫組成,在圖中用小方框表示。每層和每個子層/庫都完成不同的功能。需要注意的是每個子層/庫很可能不是對應(yīng)于具體的某個源代碼模塊,而是相關(guān)的若干個模塊。因為OpenOffice.org的源碼模塊眾多,剛發(fā)布的時候還不到100個代碼模塊,而最近發(fā)布的OpenOffice.org 1.1.2已經(jīng)到了150左右。模塊之間的相互依賴關(guān)系可能是很復(fù)雜的,而且隨著版本發(fā)布的更新不斷有變化。所以從總體上把握OpenOffice.org分層模型的功能結(jié)構(gòu)和依賴關(guān)系對于掌握整個OpenOffice.org的技術(shù)架構(gòu)是很有幫助,也是至關(guān)重要的。
表1是OpenOffice.org 1.1.2源代碼模塊的功能描述表。在約150個模塊當(dāng)中,有將近30個模塊是從其它開放源碼社區(qū)獲得的源代碼。這些模塊依照字母順序排列,它們的功能描述盡管比較粗略,也會對理解整個OpenOffice.org的體系結(jié)構(gòu)很有幫助。需要注意的是不同版本的OpenOffice.org包含的模塊數(shù)目可能有不同,或有增刪,而且有些模塊也正在變更當(dāng)中。
大致上講,
系統(tǒng)抽象層(System Abstraction Layer)封裝了所有系統(tǒng)相關(guān)的API并提供了共同的面向?qū)ο蟮腁PI以平臺無關(guān)的方式訪問系統(tǒng)資源;
基礎(chǔ)設(shè)施層(Infrastructure Layer)構(gòu)建應(yīng)用程序同平臺無關(guān)的環(huán)境,為了向上提供組件和服務(wù),這一層完整地包含了面向?qū)ο笃脚_所需面向?qū)ο驛PI的很多方面,包括組件模型、腳本解釋、復(fù)合對象等等;
構(gòu)架層(Framework Layer)為在不同應(yīng)用間能夠?qū)崿F(xiàn)復(fù)用,提供每個應(yīng)用和所有共享功能(例如公共對話框、文件訪問或者配置管理等)所需的架構(gòu)和環(huán)境;
應(yīng)用層(Application Layer)提供所有的OpenOffice.org應(yīng)用,這些應(yīng)用的交互方式是基于若干底層的。
圖2是OpenOffice.org 1.1.2源代碼模塊依賴關(guān)系樹狀圖。這張圖所描述的是OpenOffice.org中各個模塊的編譯依賴關(guān)系,實際的模塊編譯順序也是根據(jù)這個依賴關(guān)系產(chǎn)生的。從圖中我們大致可以看出OpenOffice.org的分層結(jié)構(gòu)。最底部比較密集的區(qū)域是系統(tǒng)抽象層,在此之上非常密集的區(qū)域內(nèi)的模塊組成基礎(chǔ)設(shè)施層,上部比較稀疏的區(qū)域是構(gòu)架層,最頂部的若干模塊組成應(yīng)用層。
下面逐層描述它們的功能。
系統(tǒng)抽象層
分層的系統(tǒng)架構(gòu)是OpenOffice.org能夠輕松移植到廣泛而不同的系統(tǒng)平臺上的重要因素之一。為此目的,OpenOffice.org架構(gòu)中特別定義了一個稱作“系統(tǒng)抽象層”的虛擬層。所有平臺相關(guān)的實現(xiàn)都在這一層下發(fā)生,或者作為可選模塊存在。所以理想狀況下只要實現(xiàn)了系統(tǒng)抽象層提供的功能再把上面諸層所屬的模塊重新編譯,OpenOffice.org就能夠在新的平臺上運(yùn)行了。但如果想要實現(xiàn)所有功能,可選的平臺相關(guān)模塊也要進(jìn)行移植。為了減少移植工作量,系統(tǒng)抽象層所提供的功能被縮減到每個平臺上可用的最小集合。當(dāng)然在某些平臺上系統(tǒng)抽象層必須模擬某些不存在的功能,比如在沒有本地多線程的環(huán)境下支持“用戶境”線程。1
系統(tǒng)抽象層包括如下四個子層/庫:
操作系統(tǒng)層(Operating System Layer,OSL)封裝了用來訪問和使用系統(tǒng)資源(例如文件、內(nèi)存、套接字、管道等)的操作系統(tǒng)功能。OSL是具有面向?qū)ο驛PI的很薄的一層,和上層不同的是這里的面向?qū)ο驛PI是C語言實現(xiàn)的API。C語言API的優(yōu)勢在于允許將該層用不同的實現(xiàn)語言移植到不同的平臺上去,比如對于嵌入式系統(tǒng)或者互聯(lián)網(wǎng)應(yīng)用設(shè)備來說,匯編語言就可以用來實現(xiàn)這一層。
運(yùn)行時庫(Runtime Library,RTL)提供所有的準(zhǔn)平臺無關(guān)的功能。這里提供字符串類的實現(xiàn),也能夠把字符串轉(zhuǎn)換到不同的字符集,內(nèi)存管理的功能也是在這里實現(xiàn)的。
標(biāo)準(zhǔn)模板庫(Standard Template Library,STL)2在這里作為泛型容器類來使用。STL提供了列表、隊列、棧、映射等模板/類的實現(xiàn)。
可視類庫(Visual Class Library,VCL)3是OpenOffice.org的核心庫之一。VCL的實現(xiàn)分為兩個部分,一部分封裝了對不同的底層GUI系統(tǒng)的所有訪問方式,另一部分是完全平臺無關(guān)的,包括面向?qū)ο蟮?-D圖形API和OpenOffice.org使用的整個窗口部件集。這種縱向劃分的方法保證了所有的窗口部件具有獨(dú)立于不同平臺上所用GUI系統(tǒng)的相同的行為方式,并且在所有平臺上的外觀感受和功能都是相同的。對打印功能的訪問、剪貼板和拖放功能都是在VCL內(nèi)實現(xiàn)的。
基礎(chǔ)設(shè)施層
虛擬操作系統(tǒng)層(Virtual Operating System Layer,VOS)為了更方便地使用文件、線程、套接字等系統(tǒng)資源,把操作系統(tǒng)層(OSL)的所有功能封裝成了C++類。這些C++類提供了一個以面向?qū)ο蠓绞皆L問所有系統(tǒng)資源的便捷途徑。
工具庫(Tools Libraries)4由提供輔助功能的很多小庫組成,包括處理日期時間相關(guān)數(shù)據(jù)的公共實現(xiàn),也包括結(jié)構(gòu)化存儲方式的實現(xiàn),另外還包括通用注冊表、類型安全管理、以及持久屬性數(shù)據(jù)的實現(xiàn)。
通用網(wǎng)絡(luò)對象(Universal Network Objects,UNO)5是OpenOffice.org所使用的組件技術(shù)。這種組件技術(shù)不依賴于任何圖形子系統(tǒng),而是很大程度上基于多線程和網(wǎng)絡(luò)通訊的環(huán)境所提供的功能。
UNO中的IDL編譯器能夠根據(jù)特定的接口定義產(chǎn)生二進(jìn)制表示形式和相關(guān)的C頭文件或者Java文件。這個二進(jìn)制表示形式是平臺和語言無關(guān)的,并在運(yùn)行時編組遠(yuǎn)程函數(shù)調(diào)用的參數(shù)、或者為特定語言訪問接口所提供的實現(xiàn)產(chǎn)生即時代碼。這種技術(shù)的優(yōu)點(diǎn)是減少了同時為不同語言綁定所產(chǎn)生的代碼量,缺點(diǎn)是不僅對每種語言綁定所產(chǎn)生的代碼都需要特定的后端支持,而且對每種編譯器都需要一個運(yùn)行時的橋接模塊。
很多UNO的部件都是作為UNO組件實現(xiàn)的,這有助于創(chuàng)建非常靈活的系統(tǒng)以及運(yùn)行時的系統(tǒng)擴(kuò)展。以提供新的橋接/通訊協(xié)議為例,UNO提供了本地和在網(wǎng)絡(luò)上的訪問組件的透明方式,其中在網(wǎng)絡(luò)上的通訊是通過IIOP實現(xiàn)的。如果組件是做為共享庫實現(xiàn)的,那么該組件就可以被UNO加載入程序的進(jìn)程內(nèi)存中。從而對組件的每一個訪問都好像是函數(shù)調(diào)用一樣,不需要任何遠(yuǎn)程函數(shù)調(diào)用所需的參數(shù)編組。
通用內(nèi)容代理(Universal Content Broker。UCB)6允許所有的高層代碼透明地訪問不同類型的結(jié)構(gòu)內(nèi)容。UCB由一個核心和若干通用內(nèi)容提供者(Universal Content Provider,UCP)組成,后者用來集成不同的訪問協(xié)議?,F(xiàn)有OpenOfficr.org UCP實現(xiàn)了對HTTP、FTP、WebDAV和本地文件系統(tǒng)上內(nèi)容的訪問。
復(fù)合對象(Compound Objects)提供了復(fù)合文檔(比如電子表格被鑲嵌進(jìn)文字處理文件中)的功能?,F(xiàn)在的OpenOffice.org支持復(fù)合文檔和鑲嵌多媒體播放器這樣的可視控件,并且這個實現(xiàn)是平臺無關(guān)的。復(fù)合文檔的所有內(nèi)容都以同OLE結(jié)構(gòu)存儲格式兼容的方式保存,這樣以來,只要支持OpenOffice.org的平臺就可以訪問OLE復(fù)合文檔。復(fù)合對象在Windows平臺上的實現(xiàn)可以和OLE服務(wù)交互,所以可以和所有支持OLE的應(yīng)用程序更緊密地結(jié)合。
腳本與Basic庫(Scripting and Basic Libraries)7提供一個解釋器,用以解釋源代碼并產(chǎn)生元指令。這些指令可以通過附帶的元指令處理器直接執(zhí)行,或者在模塊/庫里持久保存已備后用。UNO實現(xiàn)的所有上層應(yīng)用組件所提供的功能都可以通過組件的腳本接口訪問到,這就保證了采用OpenOffice.org UNO技術(shù)的新組件不需很大的成本就可以被完全腳本化。腳本接口也實現(xiàn)為組件,這就允許其他腳本語言輕松地集成進(jìn)來。在OpenOffice.org 2.0中會集成BeanShell8(一種輕量級的Java解釋器)和JavaScript。實際上隨OpenOffice.org所附帶的Basic是一個Basic方言。
構(gòu)架層
應(yīng)用架構(gòu)庫(Application Framework Library,SFX)9為所有的應(yīng)用提供環(huán)境,每個應(yīng)用所共享的而沒有被其他層提供的功能都在這里實現(xiàn)。就程序結(jié)構(gòu)來講,每個應(yīng)用都要實現(xiàn)一個殼(shell)和若干視圖(view),SFX提供了所有的基礎(chǔ)功能,所以應(yīng)用只需補(bǔ)充特有的功能即可。
這個架構(gòu)庫對于內(nèi)容檢測和集成來說也是結(jié)構(gòu)合理的,模板管理和配置管理就在這里提供。SFX也和復(fù)合文檔的一些方面相關(guān),比如菜單和工具條的合并和設(shè)置。對所有應(yīng)用的定制化功能也是由SFX提供的。
共享功能庫(SVX Library)10為所有應(yīng)用提供架構(gòu)無關(guān)的共享功能。SVX的一部分實現(xiàn)了一個被若干應(yīng)用用來做圖形編輯和輸出的完整的面向?qū)ο蟆爱嫴肌保@個“畫布”還包含一個完整的3-D 引擎。另一部分實現(xiàn)了字體選擇、顏色選擇等公共對話框11,而數(shù)據(jù)庫連接12也是完全在這里實現(xiàn)的。
應(yīng)用層
所有的應(yīng)用:文字處理應(yīng)用13、電子表格應(yīng)用14、演示文稿應(yīng)用、圖表應(yīng)用等等,都是在這一層實現(xiàn)的。而這些實現(xiàn)實際上都是共享庫,在運(yùn)行時由應(yīng)用架構(gòu)進(jìn)行加載。架構(gòu)提供了所有這些應(yīng)用的環(huán)境以及它們交互的功能。
UNO組件模型
現(xiàn)在開放系統(tǒng)世界里并沒有每個人都接受的組件技術(shù)。桌面領(lǐng)域有KDE和GNOME,他們都把CORBA作為底層通訊方式的基礎(chǔ),但是高層的組件模型彼此完全不同。所以現(xiàn)在不可能寫出在兩種桌面環(huán)境都可用的組件。而且現(xiàn)在的CORBA規(guī)范中并沒有包括組合文檔和其他桌面軟件相關(guān)的功能。
另一個問題是現(xiàn)大多數(shù)CORBA的設(shè)計實現(xiàn)都是用來通過遠(yuǎn)程服務(wù)運(yùn)行分布式網(wǎng)絡(luò)應(yīng)用的。所以在桌面組件模型中采用這樣支持完全網(wǎng)絡(luò)通訊負(fù)荷的CORBA實現(xiàn)在大多數(shù)情況下都是錯誤的選擇。Mozilla開源項目開始的時候就根據(jù)需要建立了一個可以輕松移植到不同平臺上的輕量級組件模型,這就是XPCOM。
OpenOffice.org之所以采用自己的組件模型正是基于以上這些原因,以及為了提供一套與Microsoft Office相似的辦公套件功能。OpenOffice.org套件提供的UNO組件技術(shù)滿足了現(xiàn)代桌面應(yīng)用對組件的所有需求。UNO也是在對象技術(shù)層面上形成的,該組件技術(shù)是OpenOffice.org API建立的基礎(chǔ)。
UNO技術(shù)包含如下的特點(diǎn):
開放:UNO支持所有流行的組件標(biāo)準(zhǔn)通訊協(xié)議,例如CORBA、JavaBeans、OLE(Windows Scripting Host、Visual Basic、Delphi等)、JavaScript、Python15、Perl16等腳本語言,以及C++和C語言的本地集成。其中C、C++、Java和Python都已經(jīng)實現(xiàn)了完整的UNO綁定,而OpenOffice.org Basic、OLE和共同語言架構(gòu)(Common Language Infrastructure,CLI)現(xiàn)在只支持訪問UNO組件,還不能用來創(chuàng)建新的組件。
面向?qū)ο螅篣NO是面向?qū)ο蟮?,支持聚集、集成、異常處理和多態(tài)這樣的概念。
基于接口:UNO的功能被集成進(jìn)接口里,具有相似功能區(qū)域的組件對同樣的接口有訪問權(quán)限,開發(fā)者將具有組件世界的真實感覺。
平臺無關(guān):UNO特意被設(shè)計成平臺無關(guān)的,有OpenOffice.org的平臺就有UNO。
支持異常:UNO提供對異常機(jī)制的支持,這意味著它可以被映射成嵌入的開發(fā)系統(tǒng)的出錯處理機(jī)制,比如C++異常和Java異常。
開發(fā)系統(tǒng)無關(guān):UNO可以用現(xiàn)在所有的流行開發(fā)環(huán)境和編程語言實現(xiàn),包括C++、C、Visual Basic、Windows Scripting Host和所有支持COM的系統(tǒng)、CORBA、JavaBeans組件、以及OLE。
支持網(wǎng)絡(luò):基于UNO技術(shù)的組件可以在網(wǎng)絡(luò)上通訊,也可以在遠(yuǎn)程服務(wù)器上實現(xiàn)功能,比如在互聯(lián)網(wǎng)設(shè)備上提供完整的文字處理功能。
API,SDK,與UDK
OpenOffice.org 應(yīng)用程序接口(Application Programming Interface,API)基于OpenOffice.org的UNO組件技術(shù),由許多類CORBA的IDL定義17的接口所組成。UNO組件技術(shù)決定組件和應(yīng)用如何相互通訊、某種編程語言如何訪問API,而API定義了獨(dú)立于特定編程語言的訪問OpenOffice.org功能的接口。這種接口結(jié)構(gòu)對于決定開發(fā)中需要重新實現(xiàn)應(yīng)用到何程度非常重要。
OpenOffice.org API定義的接口具有如下特征:
完全是定義好的組件與環(huán)境的接口,可以輕松地組合起來滿足特定對象的需求。
版本無關(guān)性,通用功能和特定版本所需要的功能被區(qū)分開來;
可擴(kuò)展性,開發(fā)者可以從接口的一個最小集合開始逐步地增加應(yīng)用的特性;
可重用性,總是盡可能地采用通用的接口定義。
與其他辦公套件的API不同,OpenOffice.org并不是已有實現(xiàn)的簡單反映,它是從應(yīng)用和組件開發(fā)者的角度來設(shè)計的,所以提供了幾乎所有的OpenOffice.org組件程序接口,并且可以集成新的組件。
應(yīng)用領(lǐng)域
OpenOffice.org API有很多應(yīng)用領(lǐng)域。首先,為了自動運(yùn)行某些任務(wù)可以編寫典型的宏程序;其次,部分OpenOffice.org可以作為其他程序的組件運(yùn)行,比如將OpenOffice.org當(dāng)作JavaBeans組件來訪問。另外,有一個非常有趣的應(yīng)用是將OpenOffice.org的用戶界面替換掉,并搭建一個完全不同的應(yīng)用環(huán)境。
結(jié)構(gòu)規(guī)范
OpenOffice.org API的結(jié)構(gòu)規(guī)范采用的是“接口與支持類”方式,而不是“實現(xiàn)-繼承”方式。
“接口與支持類”方式意味者對象只通過接口進(jìn)行通訊,支持類被用來提供實現(xiàn)。這樣的設(shè)計思路是因為組件是高度地環(huán)境、語言、和版本無關(guān)的?!皩崿F(xiàn)-繼承”方式意味著部分實現(xiàn)的基類,而子類從中衍生接口并繼承下來。不選擇這種規(guī)范的原因是在較大的系統(tǒng)中會導(dǎo)致膨脹的接口和深度繼承層次。而且,主要通過基類依賴于環(huán)境的組件,也是編程語言相關(guān)和高度版本相關(guān)的。
對象模型
OpenOffice.org API是為UNO組件技術(shù)設(shè)計的,也是用它實現(xiàn)的。因此OpenOffice.org API是程序語言無關(guān)的,可以在C/C++、Java和好幾種腳本語言中使用。對于其它語言來講,只需要一個語言綁定就能夠提供對整個OpenOffice.org API的訪問。該API是基于以下的原型構(gòu)造的:
實現(xiàn)類:類其實不是在OpenOffice.org API中實現(xiàn)的,在這里提及只是為了更好的理解。實現(xiàn)類實際上是使用真實的程序語言來實現(xiàn)服務(wù)。一般來講,使用服務(wù)的開發(fā)者不需要處理API層次上的實現(xiàn)。而對象不是為應(yīng)用而是為實現(xiàn)類翻譯成實際語言概念,這點(diǎn)類似于Java現(xiàn)實類的實現(xiàn)。
服務(wù):對象規(guī)范稱為服務(wù)。你可以把服務(wù)想象為對支持服務(wù)的實現(xiàn)類和使用組件所提供服務(wù)的應(yīng)用都有利的“合同”。服務(wù)通常描述實現(xiàn)的的接口和一套參數(shù)。雖然服務(wù)通常不翻譯成實際語言概念,你也可以把它看作類似于Java的抽象類。
接口:API層次上某一方面的規(guī)范稱之為接口。接口可被看作是“合同”內(nèi)通過合法驗證的文字模塊,接口可以組合成整個“合同”。OpenOffice.org API中的接口非常類似于Java中的接口。
結(jié)構(gòu):普通的數(shù)據(jù)塊可以被定義為結(jié)構(gòu),因此結(jié)構(gòu)是不含方法的。結(jié)構(gòu)的優(yōu)勢在于它們可以傳送到不同的進(jìn)程甚至不同的機(jī)器,這會大大提高了進(jìn)程間通訊和遠(yuǎn)程調(diào)用的效率。使用Java實現(xiàn)時,結(jié)構(gòu)可以表示為只有數(shù)據(jù)成員和get/set方法的類。
異常:異常是方法調(diào)用的非常規(guī)結(jié)果。正如在Java中一樣,異常被用來處理出錯。
常量/常量組/枚舉:常量被分成兩類,可以分組和賦值為數(shù)值和字符串值的常量,和包含數(shù)值固定集的枚舉。在Java實現(xiàn)中,這兩者都表示為具有常量數(shù)據(jù)成員的類。
模塊化分層
OpenOffice.org API是按照與Java及CORBA類似的層次模塊概念來組織的,從上到下一共分為四層:
辦公軟件接口,比如對文字處理、電子表格、繪圖和演示文稿的接口;
集成架構(gòu)接口,使得能夠集成進(jìn)OpenOffice.org新的組件,比如配置管理和通用內(nèi)容代理;
應(yīng)用域無關(guān)接口,這類非常重要的接口包括屬性訪問、集合、流操作、附加腳本引擎和其他很多接口;
組件系統(tǒng)接口,這部分基礎(chǔ)接口包括必要的處理對象模型的接口,比如生命期控制、查詢、建立橋接、和實例化遠(yuǎn)程對象等接口。
SDK和UDK
OpenOffice.org軟件開發(fā)工具包(Software Development Kit,SDK)18是OpenOffice.org的一個補(bǔ)充部件。它提供使用現(xiàn)有UNO組件與開發(fā)新組件編寫應(yīng)用所需要的工具、例程和文檔。SDK的主要部分就是《OpenOffice.org開發(fā)者指南》19,這本超過1000頁的內(nèi)容全面的指南提供了OpenOffice.org API概念、UNO組件模型、和在不同應(yīng)用上下文中如何使用API的詳細(xì)介紹。這本《指南》對于利用SDK進(jìn)行OpenOffice.org的二次開發(fā)具有非常重要的參考價值。利用OpenOffice.org API和SDK提供的其他資源,開發(fā)者可以在不修改OpenOffice.org源代碼的情況下使用自己熟悉的編程語言,基于UNO組件構(gòu)建新的應(yīng)用。
開發(fā)者在OpenOffice.org中有時也會看到UDK和ODK這樣的名稱,它們與SDK有聯(lián)系也有區(qū)別。UDK是UNO和SDK的合稱,而ODK實際上是指SDK中的一個模塊,也用來指SDK中OpenOffice.org架構(gòu)和應(yīng)用相關(guān)的高層部分。
融合與發(fā)展
組件橋接
現(xiàn)在桌面環(huán)境下所流行的組件技術(shù)有KDE/KParts20、GNOME/Bonobo21、CORBA、Mozilla/XPCOM22、OLE/ActiveX和OpenOffice.org/UNO等,各種組件技術(shù)之間的交互并不方便。為了在不同的環(huán)境中提供辦公軟件的功能,就有必要支持不同的組件技術(shù)。由于OpenOffice.org的組件技術(shù)能夠使用橋接方式訪問其他組件,有可能將辦公組件集成進(jìn)不同的環(huán)境中,比如GNOME、KDE和Mozilla。在組件基本概念非常相似的環(huán)境中實現(xiàn)橋接是相當(dāng)容易的,而其他環(huán)境下想要隱藏所有的概念差異并提供橋接功能可能會非常困難。但是在很多情況下開發(fā)者和用戶必須要處理不同的概念和哲學(xué)。而且如果橋接需要處理復(fù)雜的參數(shù)和調(diào)用轉(zhuǎn)換,效率問題可能會凸現(xiàn)出來。
由于OpenOffice.org UNO支持對OLE的橋接,所以O(shè)penOffice.org已經(jīng)能夠作為一個ActiveX控件在IE等支持ActiveX的程序內(nèi)運(yùn)行??上У氖荱NO同GNOME/Bonobo橋接的項目開始后又中止了。而OpenOffice.org為Mozilla提供的插件也已經(jīng)開發(fā)完成,將會集成在2.0版本中。OpenOffice.org為KDE中的Konqueror 制作的插件23也已經(jīng)實現(xiàn)了一些基本功能。
本地部件架構(gòu)
在VCL最初的設(shè)計中并不封裝底層GUI系統(tǒng)的本地窗口部件或控件。平臺相關(guān)部分實現(xiàn)了2-D圖形“畫布”以供VCL上層的平臺無關(guān)部分使用,該“畫布”將每個功能調(diào)用都重定向到了底層的GUI系統(tǒng)上。
后來為了使OpenOffice.org在各個平臺上的觀感更接近于本地系統(tǒng),開始了一個稱作本地部件架構(gòu)(Native Widget Framework,NWF)24的項目。NWF的基本方法是使用本地桌面環(huán)境/窗口管理器提供的可視部件替換當(dāng)前的基于窗口系統(tǒng)API實現(xiàn)的可視類庫?,F(xiàn)在把OpenOffice.org集成進(jìn)KDE25的項目正在進(jìn)行,其中就包括實現(xiàn)KDE本地部件架構(gòu)26、和基于Qt實現(xiàn)VCL插件27的兩個子項目。其他的針對GTK+、Win32、和Apple Aqua 28的NWF實現(xiàn)也在進(jìn)行當(dāng)中。
本篇主要介紹了OpenOffice.org的技術(shù)體系結(jié)構(gòu)。在這一體系結(jié)構(gòu)中有很多閃光之處,比如跨平臺的分層結(jié)構(gòu)、虛擬操作系統(tǒng)概念、UNO組件模型、基于IDL的API和SDK等等,都對OpenOffice.org移植到眾多平臺上、并獲得廣泛的應(yīng)用和贊譽(yù)貢獻(xiàn)良多。實際上OpenOffice.org架構(gòu)中還有一些優(yōu)秀的特性,因為篇幅所限在這里沒有詳細(xì)介紹,比如基于UNO的數(shù)據(jù)庫連接(SDBC)和通用內(nèi)容代理/提供者(UCB/UCP)。這些技術(shù)架構(gòu)的詳細(xì)內(nèi)容需要讀者實際進(jìn)行研究與開發(fā)才會有更深入的理解。
模塊
功能描述
accessibility
提供對輔助功能的支持
apache_java
包括Apache提供的Java工具,Xalan和XML-APIS
30autodoc
從UNO IDL和C++源文件自動產(chǎn)生文檔的工具
automation
自動測試架構(gòu)
basctl
Basic集成開發(fā)環(huán)境
basic
Basic解釋器和運(yùn)行時庫
berkeleydb
Sleepycat公司
31提供的輕型數(shù)據(jù)庫
bitstream_vera_fonts
Bitstream公司提供的用于拉丁語系文字的Bitstream Vera字體
32boost
33與C++標(biāo)準(zhǔn)庫協(xié)作的一套可移植的C++庫,將會包含進(jìn)C++標(biāo)準(zhǔn)庫中
bridges
實現(xiàn)UNO向C++(MS Visual C++、Sun Forte C++、gcc等)和Java等不同語言的橋接
chaos
在UCB之前使用,大部分已廢棄,現(xiàn)在只實現(xiàn)郵件文檔轉(zhuǎn)移服務(wù)
codemaker
包含產(chǎn)生C++頭文件、Java文件和IDL文件的程序,該程序是在unoidl編譯器產(chǎn)生二進(jìn)制格式注冊表上工作的
comphelper
編寫UNO組件所需的輔助類
configmgr
訪問配置信息的注冊表客戶端UNO組件
config_office
配置編譯環(huán)境
connectivity
數(shù)據(jù)庫連接,包含了ODBC、JDBC、ADO、MySQL、dBase等數(shù)據(jù)庫驅(qū)動的實現(xiàn)
cosv
用C++實現(xiàn)的工具庫,包括對文件、字符串等的訪問
cppu
除了Java之外所有的語言綁定所需的運(yùn)行時庫
cppuhelper
C++的UNO輔助類的實現(xiàn)
cpputools
UNO工具和運(yùn)行時程序的集合
crashrep
程序崩潰后的匯報工具
curl
34客戶端的URL轉(zhuǎn)換庫
dbaccess
數(shù)據(jù)庫訪問層,包含從應(yīng)用訪問數(shù)據(jù)庫相關(guān)的用戶界面
desktop
產(chǎn)生office可執(zhí)行代碼,基于offmgr模塊
dictionaries
拼寫檢查、同義詞等功能所需的字典,現(xiàn)在只支持西方文字
dlcompat
35Mac OS X/Darwin系統(tǒng)中與動態(tài)加載庫函數(shù)dlopen(3)兼容的庫
dmake
36類似于GNU make和Sun Forte dmake的make工具
dtrans
實現(xiàn)剪貼板管理器、MIME類型管理、拖放功能等輔助功能
embedserv
實現(xiàn)OLE2的接口
eventattacher
基于組件的事件處理
expat
37用C語言實現(xiàn)的輕型XML解析器
extensions
為各種目的提供的獨(dú)立UNO組件,例如OLE、PGP、語音等
external
包含若干外部組件
extras
對程序正常運(yùn)行至關(guān)重要的非代碼性輔助文件
fileaccess
實現(xiàn)UCP的文件系統(tǒng)訪問
filter
包含各種文件過濾器的實現(xiàn)
forms
實現(xiàn)窗體控件
fpicker
基于UNO實現(xiàn)了封裝窗口系統(tǒng)文件對話框的文件拾取器
framework
集成不同環(huán)境(基于SFX和不基于SFX)中的應(yīng)用組件
freetype
38平臺無關(guān)的字體引擎,特別用于亞洲字體
goodies
輔助類(例如3-D基本功能和圖形管理器)與外部圖形文件過濾器
gtk
與GNOME集成需要的模塊
helpcontent
二進(jìn)制格式的英文幫助內(nèi)容,其他語言的幫助內(nèi)容
39需要單獨(dú)下載
i18n
舊的國際化架構(gòu),只支持西方語言
i18npool
新的國際化架構(gòu),支持西方語言,東亞語言和復(fù)雜文字排版
i18n_simple
國際化的UNO實現(xiàn)框架
i18nutil
國際化所需的工具
icu
40IBM提供的Unicode國際化組件技術(shù)
idl
為所有基于SFX的組件由IDL生成所需的定義(頭)文件
idlc
UNO的IDL編譯器
instsetoo
生成可執(zhí)行的安裝包,即將升級到instsetoo_native
io
包括基本的UNO輸入/輸出流的服務(wù)和進(jìn)程間通訊
javaunohelper
Java的UNO輔助類的實現(xiàn)
jpeg
JPEG圖像格式過濾器
jurt
Java的UNO運(yùn)行時庫,包含UNO的Java綁定
jut
Java的UNO輔助工具的集合
jvmaccess
C++實現(xiàn)訪問Java虛擬機(jī)
lingucomponent
41創(chuàng)建不同語言的字典、詞典和其他相關(guān)工具
linguistic
UNO語言組件的封裝和特定語言的實現(xiàn)
MathMLDTD
W3C制定的MathML DTD規(guī)范
42,用于公式的文件格式
moz
編譯地址簿連接驅(qū)動所需的Mozilla的頭文件和庫
msfontextract
libmspack
43提供的解壓CAB文件格式的工具,用以釋放字體
nas
網(wǎng)絡(luò)透明的C/S模式音頻傳輸系統(tǒng)NAS
44,用以提供對音頻的支持
neon
45C接口的HTTP和WebDAV的客戶端庫,提供對UCP的支持
netbeans_integration
將SDK集成進(jìn)NetBeans
46 IDE的組件技術(shù)
np_sdk
為Mozilla編寫客戶端插件需要的SDK
odk
為生成SDK進(jìn)行第一步編譯
offapi
包含特屬于UNO組件的部分API,接口用IDL語言寫成
officecfg
包含應(yīng)用和組件的配置schema
offmgr
包含全局功能配置的資源和代碼,基于sfx2,與svx模塊緊密相關(guān)
offuh
生成UNO的C++頭文件,任何API模塊中產(chǎn)生代碼的文件若有變化則須更新
openssl
47支持SSL/TLS的開源工具包
package
實現(xiàn)打包壓縮功能的UNO組件
padmin
打印機(jī)管理工具,用來在UNIX平臺上配置打印機(jī)
psprint
產(chǎn)生PostScript代碼,是當(dāng)前UNIX平臺上的打印方式,即將支持CUPS
48psprint_config
PostScript打印機(jī)的配置文件集合
python
Python
49語言運(yùn)行環(huán)境,用以支持UNO-Python橋接
pyuno
實現(xiàn)UNO-Python橋接
qadevOOo
自動化完成產(chǎn)品的測試
rdbmaker
由二進(jìn)制格式注冊表產(chǎn)生子集或進(jìn)行反射
readlicense
自述文件和許可證文件
readlicense_oo
OpenOffice.org自述文件和許可證文件
regexp
GNU C庫
50提供的正則表達(dá)式處理程序,用C++做了封裝
registry
通用注冊表的實現(xiàn)
remotebridges
包含進(jìn)程間UNO橋接的UNO服務(wù),例如IIOP橋接
res
包含位圖、圖標(biāo)、光標(biāo)文件這樣的典型資源文件
ridljar
生成Java類文件,udkapi模塊中任何產(chǎn)生代碼的文件若有變化則須更新,該模塊還包含一些Java實現(xiàn)的核心API,例如Any類型
rsc
資源編譯器,從用戶界面的文字描述生成二進(jìn)制描述
rvpapi
用Java實現(xiàn)遠(yuǎn)程通訊的接口
sablot
來自于Ginger聯(lián)盟
51的C++實現(xiàn)的XSLT處理器
sal
系統(tǒng)抽象層,集成了所有支持平臺的底層API,定義平臺無關(guān)的C語言API
salhelper
系統(tǒng)抽象層的輔助類
sandbox
基于Java 的安全管理器
sane
支持SANE
52接口掃描設(shè)備的文件
sax
XML SAX
53解析和輸出的UNO組件
sc
電子表格應(yīng)用組件
scaddins
電子表格應(yīng)用的附件
sch
圖表應(yīng)用組件
scp
安裝腳本文件,即將升級到scp2
scptools
打包工具
sd
演示文稿應(yīng)用組件和繪圖應(yīng)用組件,它們由相同的代碼基產(chǎn)生
sdk_oo
為SDK進(jìn)行第二步編譯,生成最終的完整工具包
setup2
安裝程序的實現(xiàn),即將升級到setup_native的本地安裝方式
sfx2
SFX是應(yīng)用架構(gòu)的核心模塊
shell
實現(xiàn)某些shell命令的工具,例如網(wǎng)絡(luò)代理設(shè)置和命令行郵件
sj2
提供對嵌入式Applet程序的支持,也用Java實現(xiàn)了JavaScript引擎
smoketest
安裝程序的粗略測試
so3
包含組合文檔對象的基礎(chǔ)實現(xiàn)部分,也實現(xiàn)了OLE橋接
solenv
編譯環(huán)境(solar)
soltools
solar編譯環(huán)境所需的工具
sot
與Microsoft Office兼容的存儲實現(xiàn)方式
starmath
數(shù)學(xué)公式應(yīng)用組件
stlport
54多平臺的標(biāo)準(zhǔn)C++模板庫的實現(xiàn)
stoc
基本UNO服務(wù)
store
可信賴、可恢復(fù)的存儲所需的包含文件和數(shù)據(jù)流的文件訪問,由registry使用
svtools
基于VCL的工具集
svx
2-D與3-D繪圖引擎,以及其他與應(yīng)用架構(gòu)無關(guān)的共享庫
sw
文字處理應(yīng)用組件
sysui
實現(xiàn)與桌面系統(tǒng)環(huán)境的集成
testshl
舊的測試腳本,已廢棄
testshl2
新的測試腳本
testtools
測試工具
toolkit
用UNO工具包和控件實現(xiàn)VCL
tools
包含字符串、時間、日期、流等基本類
transex3
本地化工具
twain
支持TWAIN
55圖像獲取設(shè)備標(biāo)準(zhǔn)的文件
ucb
UCB核心的實現(xiàn)和相關(guān)輔助服務(wù),也包括各種UCP
ucbhelper
使用UCB和實現(xiàn)UCP需要的C++輔助類
udkapi
包含屬于UNO核心的部分API,接口用IDL語言寫成
udm
C++工具類,實現(xiàn)對HTML、XML、和組合數(shù)據(jù)類型等的支持
unixODBC
56非Windows平臺上提供的支持ODBC的開源軟件
UnoControls
包含非直接調(diào)用VCL的UNO控件,這些控件使用抽象窗口工具包
unoil
生成Java類文件,offapi模塊中任何產(chǎn)生代碼的文件若有變化則須更新
unotools
提供基于UNO的API的輔助類
unzip
自由的infozip
57壓縮庫
uui
提供UCB圖形用戶界面的組件
vcl
可視類庫,窗口管理與基本控件庫,也包含用戶界面的系統(tǒng)抽象層
virgule
實現(xiàn)獲取擊鍵事件、操縱鍵盤映射的功能
vos
虛擬操作系統(tǒng)層
wizards
應(yīng)用中向?qū)璧幕竞旰蛶?div style="height:15px;">
OpenOffice.org IDL參考,http://api.openoffice.org/docs/common/ref/com/sun/star/module-ix.html
OpenOffice.org開發(fā)者指南,http://api.openoffice.org/DevelopersGuide/DevelopersGuide.html