自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

嵌入式瀏覽器Konqueror的技術(shù)分析

系統(tǒng) Linux
Konqueror 是 KDE 桌面系統(tǒng)的一部分,主要用于 Linux 和 BSD家族的操作系統(tǒng)。在微軟的 Windows 系統(tǒng)下,也有零星使用,當然功能相對有限。Konqueror主要用于文件管理、瀏覽,以及網(wǎng)頁瀏覽。Konqueror 按照 GPL 進行發(fā)布。本文將帶大家科學分析下Konqueror

Konqueror是一個嵌入式瀏覽器,主要運行在Linux 和 BSD家族的操作系統(tǒng)上,我曾用過一段時間,來隨我看看。

  1  Konqueror/embedded概述

  目前,嵌入式瀏覽器已經(jīng)逐漸成為高端手機和PDA的標準配置。已經(jīng)面市的大多數(shù)嵌入式瀏覽器是商業(yè)版本的,像opera和MS explorer等,而Konqueror/embedded是符合GNU條款的自由軟件。Konqueror/embedded是針對嵌入式Linux,由著名的桌面操作環(huán)境KDE下的瀏覽器Konqueror派生出來的。Konqueror/embedded將Konqueror中關(guān)于KHTML、SSL、Javascript等內(nèi)容繼承了下來,同時簡化了Konqueror中很多類的定義,剔除了依賴于KDElib部分,以適應(yīng)在不同的嵌入式平臺上移植和運行。兩者都是基于Qt的,因此Konqueror/embedded也可以運行在Qt/X11環(huán)境下。Konqueror/embedded完整地支持HTML4和css1(部分支持css2)、JavaScript (ECMAScript 262)、cookies、SSL、IPv6;支持和管理兼容XBEL的書簽,并且能夠很好地支持中文網(wǎng)頁瀏覽;可以將Konqueror/embedded作為一個flashplayer、pppdialer或文件管理器使用。2Konqueror/embedded的構(gòu)成

  圖1Konqueror/embedded層次結(jié)構(gòu)Konqueror/embedded是由底層網(wǎng)路連接、圖形化用戶界面和處理HTML繪制的引擎——KHTML構(gòu)成的。

  2  I/OSlaves

   I/OSlaves 實現(xiàn)流程底層的通信協(xié)議實現(xiàn)是基于KIO/Slave機制來實現(xiàn)的;GUI界面采用了Kparts組件技術(shù)和Qt中的基本構(gòu)件;而作為Konqueror/embedded的核心——KHTML,則運用了文檔對象模型(DOM)所提供的API接口,并在DOM樹上掛接javascript引擎、CSS解析器以及渲染引擎。

  3  Konqueror/embedded中的關(guān)鍵技術(shù)

  3.1底層通信協(xié)議的實現(xiàn)——I/OSlave機制

  在KDE中采用I/OSlaves系統(tǒng)來訪問各種數(shù)據(jù)。Konqueror/embedded沿用這種方式,通過I/OSlaves和進程間管道通信機制實現(xiàn)完整的瀏覽器功能。在基于Qt/X11的Konqueror中,同樣采用I/OSlaves機制。簡單說來,I/OSlaves就是那些從網(wǎng)絡(luò)上獲取文件或目錄的進程,它們依賴桌面通信協(xié)議DCOP(Desktop Communications Protocol)與其他進程進行通信;但是,DCOP的實現(xiàn)又依賴于X11 ICE(Inter Client Exchange)庫。在嵌入式平臺上移植體積龐大的X11 lib是不現(xiàn)實的。Konqueror/embedded采用了另外一種進程間的通信機制:通過管道(pipe)實現(xiàn)主進程和其他I/OSlaves子進程之間的通信。

  在KDE1.X之后,KDE的文件管理器和Konqueror等應(yīng)用程序具有網(wǎng)絡(luò)透明的特征,Konqueror/embedded也繼承了這個特性。Konqueror/embedded不管對本地文件還是遠程文件都采用URL(統(tǒng)一資源定位符)進行標識。網(wǎng)絡(luò)透明性允許應(yīng)用程序的用戶使用與處理本地文件相同的方法來處理遠程文件。在KDE的文件選擇器能夠通過諸如 FTP、SMB甚至 Webdav(在 KDE3中)等方式列出遠程目錄。網(wǎng)絡(luò)透明性和I/OSlaves機制是靠KIO類來實現(xiàn)的。KIO類提供了幾乎所有的文件管理功能。其中,KIO∷NetAccess提供文件下載、上傳以及臨時文件的創(chuàng)建或刪除等簡單的同步訪問功能。這是一種阻塞調(diào)用方式。如果用Konqueror/embedded下載網(wǎng)絡(luò)上的數(shù)據(jù),在數(shù)據(jù)沒有完全加載之前,當前進程將會被阻塞。數(shù)據(jù)流完全加載之后,網(wǎng)頁才可以再次渲染或刷新。KIO∷Job提供較為復雜的異步功能,包括打開、創(chuàng)建、復制、刪除以及重命名等與文件或目錄相關(guān)的操作。Konqueror/embedded正是依靠KIO∷Job來實現(xiàn)網(wǎng)頁訪問這樣的異步工作的。一旦某個job被啟動之后,它將運行在后臺,并且不會阻塞父進程。Konqueror/embedded中各種協(xié)議,如HTTP、FTP等是由一些獨立的進程來實現(xiàn)的。這些獨立的進程被稱為Slaves。Slave是KIO∷lavebase的子類,KIO∷Slavebase中定義了一些虛函數(shù),不同的Slave必須重載這些接口。Slave以函數(shù)庫的形式存在于系統(tǒng)中,提供給相應(yīng)的job調(diào)用。Slaveinterface運行在應(yīng)用端(job),Slavebase運行在Slave端。一般情況下,創(chuàng)建的job會處在隊列中,當事件循環(huán)處理到該job時,KIO為隊列中的job分配適當?shù)腟lave。Slave的管理和調(diào)度是由調(diào)度器scheduler來執(zhí)行的,scheduler將job隊列加入適當?shù)膮f(xié)議(Slave)中。當該job結(jié)束之后,Slave進程不會立即停止,會在空閑區(qū)域中等待一定的時間。這種機制的優(yōu)點在于,如果有幾個job訪問的是同一個主機,那么就不需要重新啟動新的進程,并且不需要再次進行協(xié)議握手。在同一時間,面向同一種網(wǎng)絡(luò)協(xié)議,系統(tǒng)中最多只能啟動3個Slave進程。如果引用該協(xié)議的job超過這個數(shù)目,那么多余的job將被添加到隊列中,直到又有空閑的Slave進程可用。圖2描述了Konqueror/embedded中關(guān)于底層協(xié)議(Slave)和任務(wù)(job)的實現(xiàn)過程。

  3.2GUI系統(tǒng)的實現(xiàn)——Kparts

  組件技術(shù)(1) Konqueror/embedded中的組件

  雖然,Konqueror/embedded的UI界面是直接繼承QMainWindow的,但是,UI界面的功能和布局是由組件來實現(xiàn)的,QMainWindow只是這些組件的宿主。在Konqueror/embedded啟動初始化過程中,首先加載一個特殊的組件——KHTMLPART。KHTMLPART負責其他組件(如Kflashpart、Kplaintextpart等)的加載和管理。采用Kparts組件編程技術(shù)能夠使得Konqueror/embedded的功能得到擴展,而不需要重新修改底層代碼,同時增強了Konqueror/embedded的可定制性。 Konqueror/embedded將Web 瀏覽器、flsahpalyer、文本編輯器和簡單音頻播放器都作為Kparts組件嵌入到主窗口中。Kparts組件編程技術(shù)能夠通過將圖形組件嵌入應(yīng)用程序的窗口使需要同一功能的應(yīng)用程序共享一個組件。Kparts組件分只讀組件和讀寫組件。只讀組件ReadOnlyPart 類為實現(xiàn)任何類型的查看器提供了一個公共框架。如果提供了一個文件的 URL,那么所有這些查看器都可以顯示該文件,并阻止對該文件的任何修改。在Konqueror/embedded中,像Web 瀏覽器、flashpalyer、簡單音頻播放器都屬于只讀組件。另外一種讀寫組件ReadWritePart 類是 ReadOnlyPart 的擴展,它添加了修改和保存文檔的可能性,像Konqueror/embedded中嵌入的文本編輯器,屬于讀寫組件。

  (2) Konqueror/embedded中組件實現(xiàn)技術(shù)

  以Konqueror/embedded中文本編輯器組件(Kplaintextpart)為例,組件必須要由三個元素組成,包括窗口構(gòu)件、組件功能和用戶界面。窗口構(gòu)件必須是 QWidget 的子代,Konqueror/embedded中的文本編輯器繼承于QmultiLineEdit類;除了窗口構(gòu)件外,還需要組件提供的功能,Konqueror/embedded的中文本編輯器提供前進、后退、剪切、復制和全選等附加功能;當然還要提供訪問那些功能的用戶界面(操作以及 XML文件)。Konqueror/embedded中的文本編輯器只提供了窗口構(gòu)件功能的菜單項。在XML格式文件Kplaintextpart.rc中定義其用戶界面的布局,它和應(yīng)用程序代碼是分開的。當該文本編輯器被嵌入到Konqueror/embedded時,采用稱為XMLGUI的技術(shù)將組件菜單和原來的用戶界面合并。

  Konqueror/embedded中的文本編輯器組件構(gòu)成如圖3所示。

  圖3文本編輯器組件結(jié)構(gòu)Kparts組件的最大特征在于它的可重用性。要做到這一點,就必須將組件編譯到共享庫中。希望動態(tài)地打開共享庫的應(yīng)用程序使用 KLibLoader 類。KLibLoader 處理庫的定位、打開以及調(diào)用初始化函數(shù)。初始化函數(shù)是庫的入口點。這個初始化函數(shù)創(chuàng)建一個工廠,由組件的工廠來創(chuàng)建組件。具體的實現(xiàn)方法如圖4所示。

  3.3KHTML繪制引擎的實現(xiàn)

  KHTML引擎作為 Konqueror/embedded的核心,包含了dom、xml、html、css、rendering、misc、ecma七個子目錄。這幾個子目錄的功能分別如圖5所示。

  從這個功能結(jié)構(gòu)圖可以看出,Konqueror/embedded的KHTML引擎是基于XML的DOM技術(shù)來構(gòu)建的,與現(xiàn)在的大部分瀏覽器的架構(gòu)是相似的。DOM是以層次結(jié)構(gòu)組織的節(jié)點或信息片斷的集合。在這種層次結(jié)構(gòu)中可以利用導航儀搜尋特定的信息。同時,DOM還提供了一套API,可以用JAVA,C++或C來實現(xiàn)這些API。

  現(xiàn)在最常用的解析XML文件的方法有四種:文檔對象模型(DOM,Document Object Model)、用于XML的簡單API(SAX,Simple API for XML)、JDOM和用于XML解析的Java API(JAXP,Java API for XML Parsing)。它們有各自的優(yōu)點和弱點,因而適用在不同的場合。Konqueror/embedded中采用的是DOM技術(shù)。它所提供的接口和方法可以對構(gòu)建的DOM樹的節(jié)點進行添加、刪除,甚至可以刪除樹的幾個部分,還可以重新排列樹和添加新的分支;但是,由于DOM構(gòu)建整個文檔駐留內(nèi)存的樹,如果文檔很大,就會要求有極大的內(nèi)存,這對于一般內(nèi)存不大的嵌入式設(shè)備是個挑戰(zhàn)。另外,DOM構(gòu)建整個文檔的每個節(jié)點和元素,如果用戶關(guān)心的只是其中的一部分,那么

  圖4組件創(chuàng)建步驟圖5Konqueror/embedded的構(gòu)成將會引起資源的浪費;同時,DOM是在用戶獲取控制權(quán)之前加載整個文檔的,如果文檔很大,將產(chǎn)生明顯的延遲。Konqueror/embedded中,采用DOM技術(shù)來解析HTML/XML的最大優(yōu)點在于,DOM會自動地保存已經(jīng)解析過的文檔,而不必要在用戶希望瀏覽歷史的時候再重新解析文檔。

  Konqueror/embedded中采用的是DOM2級規(guī)范,分為DOM2 Core和DOM2 HTML。相對于DOM Level1,DOM2增加了對XML文檔處理的一些接口和方法:

   視圖(view),提供視圖與文檔的聯(lián)系;

   樣式表(style sheet),提供訪問和修改樣式表的方法;

   層疊樣式表(CSS2),提供CSS2兼容的方法;

   事件(events),提供各種事件的接口;

   文檔遍歷(document traversal),提供遍歷文檔層次的接口;

   文檔范圍(document range),提供分割文檔范圍的接口。

#p#

  4  在MC9328MX1上的應(yīng)用

  4.1Konqueror/embedded的移植

  筆者在自行設(shè)計的基于Motorola Dragonball MC9328MX1芯片的開發(fā)板上成功移植了Konqueror/embedded。該開發(fā)板上運行嵌入式Linux,并以Qt/embedded2.3.7作為圖形引擎庫,上層運行Qtopia1.6。Konqueror/embedded是基于Qt的,并將依賴于Kde部分進行了簡化和包含,因此,移植Konqueror/embedded到該開發(fā)板是完全可能的。

  Konqueror/embedded提供了幾十種編譯選項,可以通過增減編譯選項來定制適合不同平臺,具有不同功能的Konqueror/embedded。

  Konqueror/embedded的非核心組件的實現(xiàn)是在addons目錄下,例如如果需要播放Flash支持,必須在編譯選項中加入--enable-add-ons=kflashpart。在該部件中,默認是將聲音關(guān)閉的,可以通過修改代碼將聲音開關(guān)打開。

  由于MC9328MX1芯片是基于ARM架構(gòu)的,所以移植的第一步是構(gòu)建合適的交叉編譯環(huán)境。筆者采用的是armlinuxg++編譯器。編譯過程與一般的Linux軟件編譯的過程相似;但是,將Konqueror/embedded編譯成功之后,單獨下載Konqueror/embedded的可執(zhí)行文件Konqueror到開發(fā)板上運行將會出現(xiàn)致命的錯誤。因為Konqueror/embedded的運行需要兩個主要文件——html4.css和charset,是分別關(guān)于樣式表解析和字體設(shè)置的。

  4.2Konqueror/embedded的漢化

  Konqueror/embedded的漢化可分為兩個部分:一個是Konqueror/embedded本身控制界面的漢化;另一個是Konqueror/embedded對中文網(wǎng)站的訪問支持。和其他基于Qt的應(yīng)用程序一樣,Konqueror/embedded中對所有用戶可見的文本使用;對所有文字形式的文本使用tr()。tr()將文本標識出來,這樣利用Qt提供的翻譯工具將很容易把這些文本轉(zhuǎn)化成所需要的語言;同時,Qt提供了兩個宏:QT_TR_NOOP()和QT_TRANSLATE_NOOP()。用它們標示出文本,以便于被lupdate工具提取。具體操作步驟如下:

   在需要翻譯源碼的XXX.pro中加入一項:TRANSLATIONS=XXX.ts 。

   運行l(wèi)update XXX.pro,生成XXX.ts文件。該工具識別出tr()結(jié)構(gòu)和上面描述的QT_*_NOOP宏,產(chǎn)生.ts文件(通常每種語言一個)。

   運行l(wèi)release XXX.pro將生成XXX.qm。這是一個沒有翻譯成其他語言的.qm文件(也可以用Qt Linguist生成),可以把它改名為 XXX_en.qm。

   啟動Qt Linguist將XXX.ts文件導入,將需要翻譯的內(nèi)容翻譯成中文。翻譯完成之后,點擊File→Release,將文件保存為XXX_zh.qm。

   翻譯文件保存之后,在程序源碼中需要構(gòu)建Qtranslator實例,利用Qtranslator將翻譯文件加載到圖形界面上。

  在Konqueror/embedded中可以通過修改main.c中的這段代碼來實現(xiàn)UI的漢化:

  QString qmFile= “XXX_zh.qm”

  QTranslator *translator=new QTranslator (&app);

  if (translator->load (qmFile))

  app.installTranslator (translator);

  else

  delete translator;

  為了讓Konqueror/embedded能夠瀏覽中文網(wǎng)頁,需要理解Qt對字符編碼的處理。在Qt中采用Unicode編碼的方式來存儲、描述和運用字符串。讓Konqueror/embedded支持中文頁面瀏覽實際上與讓Qt支持中文字體的概念是一樣的。Qt/embedded/Qtopia中能夠識別以下四種字體格式,并且必須是Unicode編碼的:

   TrueType(TTF)——Scalable

   PostScript Type1(PFA/PFB)——Scalable

   Bitmap Distribution Format fonts(BDF)—— nonScalable

   Qt prendered Font (QPF)——nonScalable

  其中,QPF格式是Qt為了減小字符集體積和減小內(nèi)存消耗而定義的一種字符存儲格式。在Qt/embedded/Qtopia中,采用這種格式的字符集。

  在Qt/embedded中,提供轉(zhuǎn)換QPF字體的工具——makeqpf。它是一個基于Qt/embedded的程序,編譯之后運行在QVFB中。我們采用的是Qt/embedded2.3.7版本的makeqpf,運行時需要先啟動QVFB,程序makeqpf會自動查找文件$QTDIR/lib/fonts/fontdir;所以,在此之前需要設(shè)置好QTDIR,告訴makeqpf所需要轉(zhuǎn)換的字符集的各種屬性。將MS Windows下的字符集simsun .ttc復制到$QTDIR/lib/fonts目錄下,改名為simsun .ttf,在文件fontdir中添加如下的一行:

  字符集轉(zhuǎn)換完成之后,Konqueror/embedded中用來管理屬性的preference類會在重啟之后自動搜索系統(tǒng)可用字符類型,新的字體名稱將會出現(xiàn)在選項欄中,以供選擇。

  5總結(jié)

  作為一款全功能的嵌入式瀏覽器,Konqueror/embedded運用了很多KDE程序設(shè)計的方法和思路。Kparts組件技術(shù)使得Konqueror/embedded具有良好的可擴展性,以適應(yīng)不同用戶或不同場合的應(yīng)用;I/OSlave機制讓Konqueror/embedded能夠通過各種網(wǎng)絡(luò)協(xié)議透明地訪問網(wǎng)絡(luò)文件;而作為KHTML引擎的核心——DOM,使得Konqueror/embedded能夠正確地解析和渲染HTML/XML文件,并在DOM結(jié)構(gòu)樹上綁定ECAMScript引擎和CSS解析器??梢娫诮Y(jié)構(gòu)上,Konqueror/embedded和其他現(xiàn)代瀏覽器具有相似之處。Konqueror/embedded是基于Qt工具套件的,因此,Konqueror/embedded只能運行在以Qt/embedded為基礎(chǔ)的嵌入式設(shè)備上或運行Qt/X11的PC機上,這在一定程度上限制了它的廣泛應(yīng)用。但是,由于它實現(xiàn)了完整的瀏覽器功能,并且是完全免費的,所以Konqueror/embedded仍然具有很強的吸引力,同時對于其他的嵌入式瀏覽器設(shè)計,它所包含的很多設(shè)計思想是值得研究和借鑒的。

通過文章的詳細描述,我們可以清楚以技術(shù)的眼光看待Konqueror,希望對你們有所幫助!

【編輯推薦】

責任編輯:趙鵬 來源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2011-06-29 18:17:20

Konqueror Embedded 瀏覽器

2011-02-23 10:57:27

Konqueror

2009-08-04 09:56:09

Netbeans 6.Netbeans

2023-04-27 07:06:18

2010-02-26 14:17:09

嵌入式

2023-05-04 00:27:40

2010-01-06 09:53:08

嵌入式

2010-03-26 11:23:59

無線嵌入式控制技術(shù)

2009-12-22 17:46:56

Fedora 9嵌入式

2015-10-16 09:54:52

IE7瀏覽器微軟

2017-11-27 15:40:28

Linux內(nèi)核崩潰錯誤跟蹤

2011-07-11 14:12:15

瀏覽器

2011-11-02 16:32:42

2009-05-14 09:28:16

嵌入式面試求職

2021-03-04 11:06:05

自助服務(wù)

2010-01-15 09:44:52

嵌入式存儲交換技術(shù)

2011-01-14 13:13:23

嵌入式Linux開發(fā)

2018-01-29 08:31:32

嵌入式內(nèi)存技術(shù)

2009-08-20 10:57:40

嵌入式開發(fā)微軟

2020-04-22 11:51:41

物聯(lián)網(wǎng)嵌入式編程IOT
點贊
收藏

51CTO技術(shù)棧公眾號