FBReader代码结构(1)--ui插件系统

本文介绍了FBReader的跨平台电子书阅读器特性,重点解析其UI插件系统,包括核心ZLibrary的组件和职责。通过示例代码展示了如何在不同平台上实现UI插件,如Linux和Windows下的Qt插件。FBReader利用libdl接口加载插件,并通过插件提供的initLibrary接口进行初始化。核心与UI组件的交互以及ZLApplication和ZLWindow的角色也在摘要中被提及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于 FBReader

    主页: http://www.fbreader.org/

     FBReader 是很优秀的跨平台电子书阅读器,它原为 Sharp Zaurus 而开发,后来可在 Nokia 770/N800、Motorola EZX系列、Maemo、Linux、Windows 、android等上面运行(iOS上也有移植,但是部分代码还没放出貌似)。FBReader 支持 fb2、HTML、CHM、plucker、Palmdoc、zTxt、TCR、RTF、OEB、OpenReader、Non-DRM’ed mobipocket、Plain text 等广泛的格式。

FBReader插件系统

    FBReader之所以能在各平台工作,是因为它为这些平台提供了各自的ui插件,比如linux桌面下可以用gtk或qt,embeded linux下用qt,mac下用cocoa等。 FBReader的核心是ZLibrary,ZLibrary又由core, text, ui三部分组成。core提供了一些和平台无关的接口,从基本的文件系统、xml、network到gui等。当然也有些平台相关的代码比如加载插件的方法等。ui则根据不同的平台实现了core中的一些接口,主要是gui部分。text没仔细看,应该是和文档处理相关的。FBReader的上层代码在fbreader/src,也没仔细看,应该就是具体功能的实现。

      笔者按照FBReader的结构写了一个demo,在这里与大家分享下,一起学习插件系统思想。附件中是源代码,因为demo提供了一个基于qt的gui插件,为了方便编译,采用qmake来编译。代码已经在linux和windows的mingw上测试通过。

    代码结构如下

     core --|--- application:  ZLApplication.{h,cpp}, ZLWindow.{h,cpp}

                |--- library:  ZLibrary.{h,cpp}, ZLibraryImplementation.{h,cpp}

                |--- posix :  libdl port for mingw

     ui  --- src ---qt --|-- application:  ZLWindow.{h,cpp}

                                 |-- library:  ZLQtLibraryImplementation.cpp

     app:  ZLTest.{h,cpp}, main.cpp

    其实作为demo代码还可以精简很多。这里是为了更接近FBReader的接口。


core::ZLibrary

    提供了三个静态成员函数,

	static bool init(int &argc, char **&argv);
	//static ZLPaintContext *createContext();
	static void run(ZLApplication *application);
	static void shutdown();

分别用来初始化(加载ui插件等),进入事件循环和结束程序的处理(这里shutdown没干实质性的东西)。在main函数里调用这些就能正常运行程序了。

init()里会查找程序目录下的plugins目录下的插件,也可以命令行指定。这里用了libdl的接口dlopen, dlsym, dlclose。插件里提供一个初始化接口initLibrary供这里调用,会生成一个core::ZLibraryImplemention实例(单例)

core::ZLIbraryImplemention.

    是个单例,抽象类。只提供接口init(argc, argv)和run(application),在插件中必须实现。比如qt的话在init里生成QApplication,在run里创建窗口并进入事件循环。

    ZLIbraryImplemention.h还提供了initLibrary接口作为插件的入口,供ZLibrary::init()调用,插件必须实现之。比如qt的话就new一个ui::ZLibraryQtImplemention。

core::ZLApplication:

    初始化窗口。

core::ZLWindow:

    窗口的接口。


ui::ZLQtWindow:

    继承core::ZLWindow和QWidget,真正的窗口

ui::ZLibraryQtImplemention:

    继承core::ZLIbraryImplemention, 功能在那里已描述。


app::ZLTest

    继承core::ZLApplication,这里不干什么事情


编译后会在bin目录下生成libZLCore.so(ZLCore.dll), ZLTest(.exe), plugins/libZLUi-Qt.so(ZLUi-Qt.dll)等,直接双击即可运行(其中ZLTest和ZLUi-Qt库依赖ZLCore库,linux下只要不移动这些库的位置就能直接运行)


Demo 下载: http://download.youkuaiyun.com/detail/ibingow/4505824

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值