深入了解OpenOffice.org(二)[1] [3] 主页 作者:路广

  1. OpenOffice.org技术架构

上一篇简单介绍了OpenOffice.org的发展轨迹、许可证问题、应用范围等情况。实际上,OpenOffice.org之所以获得如此广泛的应用,是与它本身优秀的技术架构,开放、可扩展、标准化的XML文件格式规范,以及社区成员的广泛参与密不可分的。

本篇将主要介绍OpenOffice.org的技术体系结构,它的分层架构、UNO组件模型、基于IDLAPISDK,以及UNO与其它组件模型的互操作。

    1. 分层架构

OpenOffice.org所基于的技术架构能够提供在UNIX和类UNIX系统上丰富的办公软件功能,并且这种架构能够被移植到其他很多的平台上。这是因为整个架构就是在平台无关性的思路下实现的。

整个OpenOffice.org中实际上只有不到10%的代码是与平台相关的,这些代码为上层的组件模块提供一个系统抽象层。由于C++编译器存在于每一个主要平台上,所以OpenOffice.org采用了C++作为主要的编程语言(最底层的部分代码由于效率等原因是C语言编写的)。这种实现方式允许OpenOffice.org移植到非常广泛的不同的平台上,采用面向对象语言也使得OpenOffice.org具有面向对象的技术架构。

1OpenOffice.org的分层架构图,总体上分为四层,每层由若干不同的子层/库组成,在图中用小方框表示。每层和每个子层/库都完成不同的功能。需要注意的是每个子层/库很可能不是对应于具体的某个源代码模块,而是相关的若干个模块。因为OpenOffice.org的源码模块众多,刚发布的时候还不到100个代码模块,而最近发布的OpenOffice.org 1.1.2已经到了150左右。模块之间的相互依赖关系可能是很复杂的,而且随着版本发布的更新不断有变化。所以从总体上把握OpenOffice.org分层模型的功能结构和依赖关系对于掌握整个OpenOffice.org的技术架构是很有帮助,也是至关重要的。

框1

1OpenOffice.org 1.1.2源代码模块的功能描述表。在约150个模块当中,有将近30个模块是从其它开放源码社区获得的源代码。这些模块依照字母顺序排列,它们的功能描述尽管比较粗略,也会对理解整个OpenOffice.org的体系结构很有帮助。需要注意的是不同版本的OpenOffice.org包含的模块数目可能有不同,或有增删,而且有些模块也正在变更当中。

大致上讲,

2OpenOffice.org 1.1.2源代码模块依赖关系树状图。这张图所描述的是OpenOffice.org中各个模块的编译依赖关系,实际的模块编译顺序也是根据这个依赖关系产生的。从图中我们大致可以看出OpenOffice.org的分层结构。最底部比较密集的区域是系统抽象层,在此之上非常密集的区域内的模块组成基础设施层,上部比较稀疏的区域是构架层,最顶部的若干模块组成应用层。

下面逐层描述它们的功能。

      1. 系统抽象层

分层的系统架构是OpenOffice.org能够轻松移植到广泛而不同的系统平台上的重要因素之一。为此目的,OpenOffice.org架构中特别定义了一个称作“系统抽象层”的虚拟层。所有平台相关的实现都在这一层下发生,或者作为可选模块存在。所以理想状况下只要实现了系统抽象层提供的功能再把上面诸层所属的模块重新编译,OpenOffice.org就能够在新的平台上运行了。但如果想要实现所有功能,可选的平台相关模块也要进行移植。为了减少移植工作量,系统抽象层所提供的功能被缩减到每个平台上可用的最小集合。当然在某些平台上系统抽象层必须模拟某些不存在的功能,比如在没有本地多线程的环境下支持“用户境”线程。1

系统抽象层包括如下四个子层/库:

      1. 基础设施层

      1. 构架层

      1. 应用层

所有的应用:文字处理应用13、电子表格应用14、演示文稿应用、图表应用等等,都是在这一层实现的。而这些实现实际上都是共享库,在运行时由应用架构进行加载。架构提供了所有这些应用的环境以及它们交互的功能。

    1. UNO组件模型

现在开放系统世界里并没有每个人都接受的组件技术。桌面领域有KDEGNOME,他们都把CORBA作为底层通讯方式的基础,但是高层的组件模型彼此完全不同。所以现在不可能写出在两种桌面环境都可用的组件。而且现在的CORBA规范中并没有包括组合文档和其他桌面软件相关的功能。

另一个问题是现大多数CORBA的设计实现都是用来通过远程服务运行分布式网络应用的。所以在桌面组件模型中采用这样支持完全网络通讯负荷的CORBA实现在大多数情况下都是错误的选择。Mozilla开源项目开始的时候就根据需要建立了一个可以轻松移植到不同平台上的轻量级组件模型,这就是XPCOM

OpenOffice.org之所以采用自己的组件模型正是基于以上这些原因,以及为了提供一套与Microsoft Office相似的办公套件功能。OpenOffice.org套件提供的UNO组件技术满足了现代桌面应用对组件的所有需求。UNO也是在对象技术层面上形成的,该组件技术是OpenOffice.org API建立的基础。

UNO技术包含如下的特点:

    1. APISDK,与UDK

OpenOffice.org 应用程序接口(Application Programming InterfaceAPI)基于OpenOffice.orgUNO组件技术,由许多类CORBAIDL定义17的接口所组成。UNO组件技术决定组件和应用如何相互通讯、某种编程语言如何访问API,而API定义了独立于特定编程语言的访问OpenOffice.org功能的接口。这种接口结构对于决定开发中需要重新实现应用到何程度非常重要。

OpenOffice.org API定义的接口具有如下特征:

与其他办公套件的API不同,OpenOffice.org并不是已有实现的简单反映,它是从应用和组件开发者的角度来设计的,所以提供了几乎所有的OpenOffice.org组件程序接口,并且可以集成新的组件。

      1. 应用领域

OpenOffice.org API有很多应用领域。首先,为了自动运行某些任务可以编写典型的宏程序;其次,部分OpenOffice.org可以作为其他程序的组件运行,比如将OpenOffice.org当作JavaBeans组件来访问。另外,有一个非常有趣的应用是将OpenOffice.org的用户界面替换掉,并搭建一个完全不同的应用环境。

      1. 结构规范

OpenOffice.org API的结构规范采用的是“接口与支持类”方式,而不是“实现-继承”方式。

“接口与支持类”方式意味者对象只通过接口进行通讯,支持类被用来提供实现。这样的设计思路是因为组件是高度地环境、语言、和版本无关的。“实现-继承”方式意味着部分实现的基类,而子类从中衍生接口并继承下来。不选择这种规范的原因是在较大的系统中会导致膨胀的接口和深度继承层次。而且,主要通过基类依赖于环境的组件,也是编程语言相关和高度版本相关的。

      1. 对象模型

OpenOffice.org API是为UNO组件技术设计的,也是用它实现的。因此OpenOffice.org API是程序语言无关的,可以在C/C++Java和好几种脚本语言中使用。对于其它语言来讲,只需要一个语言绑定就能够提供对整个OpenOffice.org API的访问。该API是基于以下的原型构造的:

      1. 模块化分层

OpenOffice.org API是按照与JavaCORBA类似的层次模块概念来组织的,从上到下一共分为四层:

      1. SDKUDK

OpenOffice.org软件开发工具包(Software Development KitSDK18OpenOffice.org的一个补充部件。它提供使用现有UNO组件与开发新组件编写应用所需要的工具、例程和文档。SDK的主要部分就是《OpenOffice.org开发者指南》19,这本超过1000页的内容全面的指南提供了OpenOffice.org API概念、UNO组件模型、和在不同应用上下文中如何使用API的详细介绍。这本《指南》对于利用SDK进行OpenOffice.org的二次开发具有非常重要的参考价值。利用OpenOffice.org APISDK提供的其他资源,开发者可以在不修改OpenOffice.org源代码的情况下使用自己熟悉的编程语言,基于UNO组件构建新的应用。

开发者在OpenOffice.org中有时也会看到UDKODK这样的名称,它们与SDK有联系也有区别。UDKUNOSDK的合称,而ODK实际上是指SDK中的一个模块,也用来指SDKOpenOffice.org架构和应用相关的高层部分。

    1. 融合与发展

      1. 组件桥接

现在桌面环境下所流行的组件技术有KDE/KParts20GNOME/Bonobo21CORBAMozilla/XPCOM22OLE/ActiveXOpenOffice.org/UNO等,各种组件技术之间的交互并不方便。为了在不同的环境中提供办公软件的功能,就有必要支持不同的组件技术。由于OpenOffice.org的组件技术能够使用桥接方式访问其他组件,有可能将办公组件集成进不同的环境中,比如GNOMEKDEMozilla。在组件基本概念非常相似的环境中实现桥接是相当容易的,而其他环境下想要隐藏所有的概念差异并提供桥接功能可能会非常困难。但是在很多情况下开发者和用户必须要处理不同的概念和哲学。而且如果桥接需要处理复杂的参数和调用转换,效率问题可能会凸现出来。

由于OpenOffice.org UNO支持对OLE的桥接,所以OpenOffice.org已经能够作为一个ActiveX控件在IE等支持ActiveX的程序内运行。可惜的是UNOGNOME/Bonobo桥接的项目开始后又中止了。而OpenOffice.orgMozilla提供的插件也已经开发完成,将会集成在2.0版本中。OpenOffice.orgKDE中的Konqueror 制作的插件23也已经实现了一些基本功能。

      1. 本地部件架构

VCL最初的设计中并不封装底层GUI系统的本地窗口部件或控件。平台相关部分实现了2-D图形“画布”以供VCL上层的平台无关部分使用,该“画布”将每个功能调用都重定向到了底层的GUI系统上。

后来为了使OpenOffice.org在各个平台上的观感更接近于本地系统,开始了一个称作本地部件架构(Native Widget FrameworkNWF24的项目。NWF的基本方法是使用本地桌面环境/窗口管理器提供的可视部件替换当前的基于窗口系统API实现的可视类库。现在把OpenOffice.org集成进KDE25的项目正在进行,其中就包括实现KDE本地部件架构26、和基于Qt实现VCL插件27的两个子项目。其他的针对GTK+Win32、和Apple Aqua 28NWF实现也在进行当中。



本篇主要介绍了OpenOffice.org的技术体系结构。在这一体系结构中有很多闪光之处,比如跨平台的分层结构、虚拟操作系统概念、UNO组件模型、基于IDLAPISDK等等,都对OpenOffice.org移植到众多平台上、并获得广泛的应用和赞誉贡献良多。实际上OpenOffice.org架构中还有一些优秀的特性,因为篇幅所限在这里没有详细介绍,比如基于UNO的数据库连接(SDBC)和通用内容代理/提供者(UCB/UCP)。这些技术架构的详细内容需要读者实际进行研究与开发才会有更深入的理解。

下一篇将会介绍OpenOffice.org的另一个优秀的技术特点:开放、可扩展和标准化的XML文件格式规范。



本文依据《创作共用约定》之“署名-禁止派生-非商业用途”方式发布,即你可以免费拷贝、分发、呈现和表演当前作品,但是必须基于以下条款:

对于任何二次使用或分发,你必须让其他人明确当前作品的授权条款。

在得到作者的明确允许下,这里的某些条款可以放弃。

此约定是法律文本(完整的协议)29的简单易读概要。

模块

功能描述

accessibility

提供对辅助功能的支持

apache_java

包括Apache提供的Java工具,XalanXML-APIS30

autodoc

UNO IDLC++源文件自动产生文档的工具

automation

自动测试架构

basctl

Basic集成开发环境

basic

Basic解释器和运行时库

berkeleydb

Sleepycat公司31提供的轻型数据库

bitstream_vera_fonts

Bitstream公司提供的用于拉丁语系文字的Bitstream Vera字体32

boost33

C++标准库协作的一套可移植的C++库,将会包含进C++标准库中

bridges

实现UNOC++MS Visual C++Sun Forte C++gcc等)和Java等不同语言的桥接

chaos

UCB之前使用,大部分已废弃,现在只实现邮件文档转移服务

codemaker

包含产生C++头文件、Java文件和IDL文件的程序,该程序是在unoidl编译器产生二进制格式注册表上工作的

comphelper

编写UNO组件所需的辅助类

configmgr

访问配置信息的注册表客户端UNO组件

config_office

配置编译环境

connectivity

数据库连接,包含了ODBCJDBCADOMySQLdBase等数据库驱动的实现

cosv

C++实现的工具库,包括对文件、字符串等的访问

cppu

除了Java之外所有的语言绑定所需的运行时库

cppuhelper

C++UNO辅助类的实现

cpputools

UNO工具和运行时程序的集合

crashrep

程序崩溃后的汇报工具

curl34

客户端的URL转换库

dbaccess

数据库访问层,包含从应用访问数据库相关的用户界面

desktop

产生office可执行代码,基于offmgr模块

dictionaries

拼写检查、同义词等功能所需的字典,现在只支持西方文字

dlcompat35

Mac OS X/Darwin系统中与动态加载库函数dlopen(3)兼容的库

dmake36

类似于GNU makeSun Forte dmakemake工具

dtrans

实现剪贴板管理器、MIME类型管理、拖放功能等辅助功能

embedserv

实现OLE2的接口

eventattacher

基于组件的事件处理

expat37

C语言实现的轻型XML解析器

extensions

为各种目的提供的独立UNO组件,例如OLEPGP、语音等

external

包含若干外部组件

extras

对程序正常运行至关重要的非代码性辅助文件

fileaccess

实现UCP的文件系统访问

filter

包含各种文件过滤器的实现

forms

实现窗体控件

fpicker

基于UNO实现了封装窗口系统文件对话框的文件拾取器

framework

集成不同环境(基于SFX和不基于SFX)中的应用组件

freetype38

平台无关的字体引擎,特别用于亚洲字体

goodies

辅助类(例如3-D基本功能和图形管理器)与外部图形文件过滤器

gtk

GNOME集成需要的模块

helpcontent

二进制格式的英文帮助内容,其他语言的帮助内容39需要单独下载

i18n

旧的国际化架构,只支持西方语言

i18npool

新的国际化架构,支持西方语言,东亚语言和复杂文字排版

i18n_simple

国际化的UNO实现框架

i18nutil

国际化所需的工具

icu40

IBM提供的Unicode国际化组件技术

idl

为所有基于SFX的组件由IDL生成所需的定义(头)文件

idlc

UNOIDL编译器

instsetoo

生成可执行的安装包,即将升级到instsetoo_native

io

包括基本的UNO输入/输出流的服务和进程间通讯

javaunohelper

JavaUNO辅助类的实现

jpeg

JPEG图像格式过滤器

jurt

JavaUNO运行时库,包含UNOJava绑定

jut

JavaUNO辅助工具的集合

jvmaccess

C++实现访问Java虚拟机

lingucomponent41

创建不同语言的字典、词典和其他相关工具

linguistic

UNO语言组件的封装和特定语言的实现

MathMLDTD

W3C制定的MathML DTD规范42,用于公式的文件格式

moz

编译地址簿连接驱动所需的Mozilla的头文件和库

msfontextract

libmspack43提供的解压CAB文件格式的工具,用以释放字体

nas

网络透明的C/S模式音频传输系统NAS44,用以提供对音频的支持

neon45

C接口的HTTPWebDAV的客户端库,提供对UCP的支持

netbeans_integration

SDK集成进NetBeans46 IDE的组件技术

np_sdk

Mozilla编写客户端插件需要的SDK

odk

为生成SDK进行第一步编译

offapi

包含特属于UNO组件的部分API,接口用IDL语言写成

officecfg

包含应用和组件的配置schema

offmgr

包含全局功能配置的资源和代码,基于sfx2,与svx模块紧密相关

offuh

生成UNOC++头文件,任何API模块中产生代码的文件若有变化则须更新

openssl47

支持SSL/TLS的开源工具包

package

实现打包压缩功能的UNO组件

padmin

打印机管理工具,用来在UNIX平台上配置打印机

psprint

产生PostScript代码,是当前UNIX平台上的打印方式,即将支持CUPS48

psprint_config

PostScript打印机的配置文件集合

python

Python49语言运行环境,用以支持UNO-Python桥接

pyuno

实现UNO-Python桥接

qadevOOo

自动化完成产品的测试

rdbmaker

由二进制格式注册表产生子集或进行反射

readlicense

自述文件和许可证文件

readlicense_oo

OpenOffice.org自述文件和许可证文件

regexp

GNU C50提供的正则表达式处理程序,用C++做了封装

registry

通用注册表的实现

remotebridges

包含进程间UNO桥接的UNO服务,例如IIOP桥接

res

包含位图、图标、光标文件这样的典型资源文件

ridljar

生成Java类文件,udkapi模块中任何产生代码的文件若有变化则须更新,该模块还包含一些Java实现的核心API,例如Any类型

rsc

资源编译器,从用户界面的文字描述生成二进制描述

rvpapi

Java实现远程通讯的接口

sablot

来自于Ginger联盟51C++实现的XSLT处理器

sal

系统抽象层,集成了所有支持平台的底层API,定义平台无关的C语言API

salhelper

系统抽象层的辅助类

sandbox

基于Java 的安全管理器

sane

支持SANE52接口扫描设备的文件

sax

XML SAX53解析和输出的UNO组件

sc

电子表格应用组件

scaddins

电子表格应用的附件

sch

图表应用组件

scp

安装脚本文件,即将升级到scp2

scptools

打包工具

sd

演示文稿应用组件和绘图应用组件,它们由相同的代码基产生

sdk_oo

SDK进行第二步编译,生成最终的完整工具包

setup2

安装程序的实现,即将升级到setup_native的本地安装方式

sfx2

SFX是应用架构的核心模块

shell

实现某些shell命令的工具,例如网络代理设置和命令行邮件

sj2

提供对嵌入式Applet程序的支持,也用Java实现了JavaScript引擎

smoketest

安装程序的粗略测试

so3

包含组合文档对象的基础实现部分,也实现了OLE桥接

solenv

编译环境(solar

soltools

solar编译环境所需的工具

sot

Microsoft Office兼容的存储实现方式

starmath

数学公式应用组件

stlport54

多平台的标准C++模板库的实现

stoc

基本UNO服务

store

可信赖、可恢复的存储所需的包含文件和数据流的文件访问,由registry使用

svtools

基于VCL的工具集

svx

2-D3-D绘图引擎,以及其他与应用架构无关的共享库

sw

文字处理应用组件

sysui

实现与桌面系统环境的集成

testshl

旧的测试脚本,已废弃

testshl2

新的测试脚本

testtools

测试工具

toolkit

UNO工具包和控件实现VCL

tools

包含字符串、时间、日期、流等基本类

transex3

本地化工具

twain

支持TWAIN55图像获取设备标准的文件

ucb

UCB核心的实现和相关辅助服务,也包括各种UCP

ucbhelper

使用UCB和实现UCP需要的C++辅助类

udkapi

包含属于UNO核心的部分API,接口用IDL语言写成

udm

C++工具类,实现对HTMLXML、和组合数据类型等的支持

unixODBC56

Windows平台上提供的支持ODBC的开源软件

UnoControls

包含非直接调用VCLUNO控件,这些控件使用抽象窗口工具包

unoil

生成Java类文件,offapi模块中任何产生代码的文件若有变化则须更新

unotools

提供基于UNOAPI的辅助类

unzip

自由的infozip57压缩库

uui

提供UCB图形用户界面的组件

vcl

可视类库,窗口管理与基本控件库,也包含用户界面的系统抽象层

virgule

实现获取击键事件、操纵键盘映射的功能

vos

虚拟操作系统层

wizards

应用中向导所需的基本宏和库

x11_extensions

X-Window扩展库中render相关的头文件

xml2cmp

实现UNO组件描述的处理器

xmlhelp

UCP方式实现的帮助

xmloff

XML的输入/输出过滤器

xmlscript

实现XML对脚本的支持

XmlSearch

Java实现的对XML的查询引擎

zlib58

一个没有法律风险的自由软件,实现数据压缩功能

1 OpenOffice.org 1.1.2源代码模块的功能描述表




2 OpenOffice.org 1.1.2源代码模块依赖关系树状图




1OpenOffice.org移植,http://porting.openoffice.org/

2STLporthttp://www.stlport.org/

3OpenOffice.org图形系统,http://www.gsl.openoffice.org/

4OpenOffice.org工具,http://util.openoffice.org/

5OpenOffice.org通用对象模型/组件模型,http://udk.openoffice.org/

6OpenOffice.org通用内容代理,http://ucb.openoffice.org/

7OpenOffice.org脚本架构,http://framework.openoffice.org/scripting/index.html

8BeanShellhttp://www.beanshell.org/

9OpenOffice.org架构,http://framework.openoffice.org/

10OpenOffice.org图形应用,http://graphics.openoffice.org/

11OpenOffice.org公共用户界面,http://ui.openoffice.org/

12OpenOffice.org数据库访问,http://dba.openoffice.org/

13OpenOffice.org文字处理,http://sw.openoffice.org/

14OpenOffice.org电子表格,http://sc.openoffice.org/

15OpenOffice.org Python-UNO桥,http://udk.openoffice.org/python/python-bridge.html

16OpenOffice.org Perl-UNO桥,http://perluno.sourceforge.net/

17OpenOffice.org IDL参考,http://api.openoffice.org/docs/common/ref/com/sun/star/module-ix.html

18OpenOffice.org软件开发工具包,http://api.openoffice.org/SDK/index.html

19OpenOffice.org开发者指南,http://api.openoffice.org/DevelopersGuide/DevelopersGuide.html

20KDE Kpartshttp://developer.kde.org/documentation/tutorials/kparts/

21GNOME Bonobohttp://www.gnome.org/gnome-office/bonobo.shtml

22Mozilla XPCOMhttp://www.mozilla.org/projects/xpcom/

23cuckOOo项目,http://kde.openoffice.org/cuckooo/index.html

24OpenOffice.org本地部件架构,http://people.redhat.com/dcbw/

25OpenOffice.org KDE集成项目,http://kde.openoffice.org/

26OpenOffice.org KDE本地部件架构,http://kde.openoffice.org/nwf/index.html

27OpenOffice.org QT VCL插件,http://kde.openoffice.org/ooo-qt/index.html

28NeoOffice.orghttp://www.neooffice.org/

29创作共用协议的完整法律文本,http://www.creativecommons.cn/licenses/by-nd-nc/1.0/legalcode

30Apache XML项目,http://xml.apache.org/

31Sleepycat公司,http://www.sleepycat.com/

32Bitstream Vera字体,http://www.gnome.org/fonts/

33C++ Boosthttp://www.boost.org/

34cURLhttp://curl.haxx.se/libcurl/

35dlcompathttp://www.opendarwin.org/projects/dlcompat/

36dmake项目,http://dmake.wticorp.com/

37Expathttp://expat.sourceforge.net/

38FreeType组织,http://www.freetype.org/

39OpenOffice.org非英语帮助内容,http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/helpcontent/

40Unicode国际化组件,http://oss.software.ibm.com/icu/

41语言组件,http://lingucomponent.openoffice.org/

42W3C MathML DTD规范,http://www.w3.org/TR/REC-MathML/

43libmspackhttp://www.kyz.uklinux.net/libmspack/

44NAShttp://nas.codebrilliance.com/

45neon库,http://www.webdav.org/neon/

46NetBeans组织,http://www.netbeans.org/

47OpenSSLhttp://www.openssl.org/

48公共UNIX打印系统,http://www.cups.org/

49Python程序语言,http://www.python.org/

50GNU C库,http://www.gnu.org/software/libc/

51Ginger联盟,http://www.gingerall.org

52SANEhttp://www.sane-project.org/

53SAXhttp://sax.sourceforge.net/

54STLport组织,http://www.stlport.org/

55TWAINhttp://www.twain.org/

56unixODBChttp://www.unixodbc.org/

57Info-ZIPhttp://www.info-zip.org/

58zlibhttp://www.zlib.org/