中文開發(fā)手冊_第1頁
中文開發(fā)手冊_第2頁
中文開發(fā)手冊_第3頁
中文開發(fā)手冊_第4頁
中文開發(fā)手冊_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Goodisgood,butbettercarriesit.

精益求精,善益求善。Goodisgood,butbettercarriesit.

精益求精,善益求善。中文開發(fā)手冊EyeOS2開發(fā)手冊EyeOS2開發(fā)手冊PAGEPAGE33EyeOS2開發(fā)手冊PAGEEyeOS2開發(fā)手冊翻譯:zenoleoQQ群:10899268翻譯得不好,大家見諒。發(fā)現(xiàn)錯(cuò)誤可以通過qq聯(lián)系我。目錄TOC\o"1-3"\h\u1.簡介 22.操作 33.開發(fā)環(huán)境 44.組件 55.目錄結(jié)構(gòu) 66.MMAP,Exec和extern 87.應(yīng)用程序的結(jié)構(gòu)和功能 98.創(chuàng)建第一個(gè)應(yīng)用程序 109.Qooxdoo 1310.應(yīng)用程序模塊(execmodules) 1311.用戶管理 1412.進(jìn)程管理 1413.文件系統(tǒng)接口 1514.安全管理 1615.Metadata[譯者:用數(shù)據(jù)庫存儲(chǔ)時(shí),這玩意的效率慘不忍睹] 1716.Office文檔轉(zhuǎn)換 1717.Dbus 1818.NetSync實(shí)時(shí)消息 1819.數(shù)據(jù)庫連接 1920.參考文檔和進(jìn)一步閱讀 210.許可證本文件的內(nèi)容正在出版的“創(chuàng)作共用許可證:-非商業(yè)性-署名-相同方式共享3.0聲明頁面您可以查看許可協(xié)議的條款摘要...[1]您可以在下面的地址...查看全文本許可證[2]您可以自由:要共享-復(fù)制,分發(fā)和傳輸工作?;旌?適應(yīng)的工作。在下列情況下:署名-您必須歸因于作者或授權(quán)人(但不以任何方式表明他們贊同你或你的工作使用)指定的方式工作。非商業(yè)-您可能無法使用本作品用于商業(yè)目的。相同方式共享-如果您改變,轉(zhuǎn)換,或建立這項(xiàng)工作時(shí),您可以分發(fā)的工作,只有在這個(gè)相同或類似的許可證。1.簡介本文件的目的是提供必要的在eyeOS環(huán)境下開發(fā)的知識(shí);,能夠構(gòu)建應(yīng)用程序,修改現(xiàn)有的應(yīng)用程序,開發(fā)一般的系統(tǒng)組件,并了解其架構(gòu)。本文檔的讀者是技術(shù)人員,例如,分析師和Web開發(fā)人員。JavaScript和PHP的知識(shí)是必需的,以及Web開發(fā)的整體理解。了解面向?qū)ο缶幊桃矊⑹怯袔椭摹?.1.什么是eyeOS?eyeOS是一個(gè)在線桌面,為用戶提供了類似桌面的界面,類似于計(jì)算機(jī)上的界面。eyeOS對于開發(fā)人員提供了一套工具,允許您開發(fā)在線桌面應(yīng)用程序,通過類似在本地桌面上的方式。在eyeOS的應(yīng)用程序的開發(fā)使用JavaScript的圖形庫,允許開發(fā)人員在更高層的概念工作,例如窗口,按鈕,列表等,而不是層或低級別的XHTML。eyeOS的目標(biāo)同時(shí)包括用戶和開發(fā)人員,應(yīng)用程序的工作方式類似于本地桌面應(yīng)用,隱藏在web環(huán)境中工作所產(chǎn)生的問題。eyeOS是為這些人:希望他們的用戶在一個(gè)可控制的方式通過Web界面訪問資源,訪問控制和用戶帳戶,有適應(yīng)環(huán)境的能力,以符合他們的公司或組織的形象,并創(chuàng)造所有新特性和功能,以滿足他們的需求。1.2.應(yīng)用系統(tǒng)由于能夠開發(fā)出具有絕對的確定性,另一個(gè)應(yīng)用程序不干擾你的應(yīng)用程序高度重視,我們已經(jīng)制定eyeOS是整個(gè)應(yīng)用系統(tǒng)的發(fā)展是盡可能簡單。在一定意義上eyeOS是像一個(gè)傳統(tǒng)的操作系統(tǒng),其中每個(gè)應(yīng)用程序單獨(dú)運(yùn)行它自己的進(jìn)程和其自身的進(jìn)程ID(PID),其中每個(gè)應(yīng)用程序可以有不同的執(zhí)行權(quán)限。因此,一個(gè)應(yīng)用程序在eyeOS是一個(gè)獨(dú)立的組件,您可以安裝或卸載,就像任何Windows或Linux應(yīng)用程序。您也可以定義安全規(guī)則的設(shè)置,以便只有一個(gè)用戶或用戶組可以看到,安裝和使用桌面上的應(yīng)用程序。后面我們將會(huì)看到,該系統(tǒng)提供一個(gè)API來管理應(yīng)用程序,用戶運(yùn)行的是,例如,關(guān)閉正在運(yùn)行的應(yīng)用程序,或運(yùn)行新的應(yīng)用。這是該系統(tǒng)能夠運(yùn)行,而不相互干擾,每個(gè)應(yīng)用程序和運(yùn)行相同的應(yīng)用程序的多個(gè)實(shí)例,通過這個(gè)API。eyeOS系統(tǒng)處理低級別的操作,例如,當(dāng)用戶關(guān)閉一個(gè)應(yīng)用程序的過程中被自動(dòng)刪除。開發(fā)商不擔(dān)心這些細(xì)節(jié),但如果需要的話,可以介入和整個(gè)系統(tǒng)的改變默認(rèn)的行為和行動(dòng)。2.操作從技術(shù)上講,eyeOS是用PHP和JavaScript開發(fā)Web應(yīng)用程序。PHP用來開發(fā)服務(wù)器端的架構(gòu),而JavaScript用于創(chuàng)建和管理桌面和應(yīng)用程序,顯示在Web瀏覽器客戶端。所有的eyeOS的應(yīng)用,如登錄,注冊,或計(jì)算器,是一個(gè)JavaScript和PHP腳本的集合。甚至桌面本身是一個(gè)eyeOS的應(yīng)用程序,可以修改。當(dāng)?shù)谝淮渭虞d系統(tǒng),用戶的Web瀏覽器下載所有必要的JavaScript庫,然后開始使用AJAX與服務(wù)器通信。這樣,在整個(gè)用戶會(huì)話中只有一個(gè)頁面加載,其余的操作都是通過AJAX請求。在第一次加載時(shí),eyeOS系統(tǒng)運(yùn)行所需要的JavaScript庫被下載。當(dāng)應(yīng)用程序第一次運(yùn)行,具體到每個(gè)應(yīng)用程序的JavaScript文件下載需求。下一次運(yùn)行應(yīng)用程序,系統(tǒng)將使用已經(jīng)在緩存中的JavaScript。當(dāng)用戶在eyeOS運(yùn)行一個(gè)應(yīng)用程序,一個(gè)可視化窗口通常會(huì)出現(xiàn),使用戶能與它進(jìn)行交互。窗口創(chuàng)建一個(gè)高層次的JavaScript庫Qooxdoo;這很像是GTK、Qt、JavaSwing,或類似的用戶界面開發(fā)工具包。當(dāng)用戶界面要求JavaScript在服務(wù)器上執(zhí)行一個(gè)操作,通信庫用于發(fā)送消息(這是低層次的AJAX請求)給應(yīng)用程序的創(chuàng)建者所定義的PHP函數(shù)。通過本文,eyeOS如何工作將逐漸變得更清晰,這將給你一個(gè)非常有用的系統(tǒng)的概述。應(yīng)用程序運(yùn)行在與其他應(yīng)用程序隔離的環(huán)境中。因?yàn)樗鼒?zhí)行的任何處理都必須通過操作系統(tǒng),所以系統(tǒng)可以保證安全性。在任何情況下,開發(fā)人員能夠從系統(tǒng)訪問資源或信息(指圖片、css等),而無需使用系統(tǒng)的API(因?yàn)闆]有人會(huì)檢查權(quán)限或操作安全)。2.1.系統(tǒng)結(jié)構(gòu)在eyeOS,組件和系統(tǒng)功能通過JavaScript和PHP劃分。有一些JavaScript端的功能,簡化應(yīng)用開發(fā),包括了必須使用的應(yīng)用程序的特定結(jié)構(gòu)。同樣,在PHP運(yùn)行的服務(wù)器端,也有庫和API。正如你可以看到,應(yīng)用程序分為兩部分的部分,在客戶端(瀏覽器)上運(yùn)行和在Web服務(wù)器上運(yùn)行的部分。客戶端上運(yùn)行的部分,通過JavaScript描繪用戶界面。當(dāng)你需要做一些操作,例如讀取數(shù)據(jù)庫,你可以通過API調(diào)用一個(gè)服務(wù)器端的PHP函數(shù)。2.2.數(shù)據(jù)庫和用戶的個(gè)人文件夾在eyeOS所有組件都是模塊化的,就是說eyeOS系統(tǒng)包含一系列的組件,如用戶管理。組件的內(nèi)部劃分成更小的元件,如公共用戶管理API,這個(gè)組件處理用戶的軟件,并管理用戶的數(shù)據(jù)。下一個(gè)元件,是負(fù)責(zé)響應(yīng)保存數(shù)據(jù)的請求,接收用戶的數(shù)據(jù),被稱為vider是組件的一小部分,其任務(wù)是保存eyeOS的數(shù)據(jù)。這種模塊化使我們在編寫整個(gè)系統(tǒng)時(shí)都無需擔(dān)心在后端的數(shù)據(jù)庫類型。如果我們要使用不同類型的數(shù)據(jù)庫,那么我們可以簡單地開發(fā)一個(gè)新的provider,而無需接觸組件或應(yīng)用程序的其余部分。正因?yàn)槿绱?,?dāng)有人問你eyeOS的用戶保存在哪里,實(shí)在是沒有明確的答案。事實(shí)上,一切都取決于所使用的provider。默認(rèn)是使用MySQL數(shù)據(jù)庫,但是我們可以很容易地開發(fā)Oracle或微軟SQLServer的provider,甚至非關(guān)系引擎的provider。eyeOS系統(tǒng)內(nèi)用戶的文件存儲(chǔ)在服務(wù)器的文件系統(tǒng)。稍后,我們將徹底分析eyeOS目錄結(jié)構(gòu);現(xiàn)在重要的是,要了解用戶的文件沒有存儲(chǔ)在數(shù)據(jù)庫中。3.開發(fā)環(huán)境由于eyeOS應(yīng)用在任何文本編輯器和Web瀏覽器的JavaScript和PHP,開發(fā)不夠,開始發(fā)展。然而,一個(gè)共同的文本編輯器沒有語法著色,縮進(jìn)或代碼完成功能。雖然它是可能的發(fā)展離不開這一切,它不會(huì)是理想的環(huán)境。由于eyeOS是一個(gè)Web應(yīng)用程序,它需要一個(gè)Web服務(wù)器,數(shù)據(jù)庫,和現(xiàn)代的Web瀏覽器運(yùn)行。一個(gè)典型的設(shè)置是為開發(fā)本地計(jì)算機(jī)上安裝Web服務(wù)器,使他們不需要上傳到外部服務(wù)器來測試。在商業(yè)環(huán)境,這是典型的開發(fā)團(tuán)隊(duì)內(nèi)部開發(fā)服務(wù)器上安裝有eyeOS,使發(fā)展可以以協(xié)作的方式進(jìn)行。eyeOS將被安裝在Web服務(wù)器,請閱讀eyeOS安裝手冊的要求和建議的軟件和如何安裝eyeOS。至于Web瀏覽器,F(xiàn)irefox是建議,因?yàn)樗敲赓M(fèi)的,跨平臺(tái),并支持?jǐn)U展或添加功能到瀏覽器的插件使用。它也有很大的尊重和對Web標(biāo)準(zhǔn)的快速運(yùn)行JavaScript。Firefox可以從:/firefox/要添加調(diào)試代碼,錯(cuò)誤報(bào)告,以及許多其他功能,真的是有用的Web開發(fā)Firefox的功能,你應(yīng)該安裝Firebug擴(kuò)展:/對于一個(gè)代碼編輯器中,有很多在互聯(lián)網(wǎng)上免費(fèi)提供節(jié)目。如Notepad++,NetBeans,jEdit的等,將是足夠的。4.組件前面已提到,有PHPAPI提供給應(yīng)用程序,事實(shí)上也有在PHP端的組件,這些是:目錄:4.1。內(nèi)核4.2。服務(wù)4.3。庫4.4??蚣?.5。引導(dǎo)程序4.1.內(nèi)核eyeOS內(nèi)核是管理的其他組件的組件。由于eyeOS是一個(gè)Web應(yīng)用程序,內(nèi)核并不像普通操作系統(tǒng)一樣,但內(nèi)核是核心組件,它管理其他組件的實(shí)例化,形成了eyeOS的引擎。對于開發(fā)者,內(nèi)核是一種不可見的組件;你不需要直接與它進(jìn)行交互,所以對它的研究將不會(huì)很有趣。4.2.服務(wù)服務(wù)是系統(tǒng)的組件,是eyeos運(yùn)行必須的組件,并且管理eyeos內(nèi)部的功能。例如,一個(gè)組件,它負(fù)責(zé)管理用戶,它是一個(gè)服務(wù)。一個(gè)組件,它負(fù)責(zé)壓縮zip文件,它不是一個(gè)服務(wù),因?yàn)樗皇莈yeOS必須的組件。大多數(shù)服務(wù)會(huì)在后面分別更深入地討論,例子包括進(jìn)程管理器或用戶管理,因?yàn)閮烧叨际莈yeOS必要的內(nèi)部組件。所有的服務(wù)都有一個(gè)公共API,供應(yīng)用程序訪問,使他們能與系統(tǒng)進(jìn)行交互,例如通過用戶服務(wù)的公共API創(chuàng)建一個(gè)新用戶。4.3.庫庫負(fù)責(zé)對eyeOS系統(tǒng)提供支持和保障。庫中的一個(gè)例子是為utf8的支持。因?yàn)镻HP目前不支持UTF8,在eyeOS有一個(gè)庫,添加這種支持。庫是使系統(tǒng)工作所必不可少的,但與服務(wù)有區(qū)別,區(qū)別在于他們沒有管理eyeOS中的任何東西,他們在一個(gè)較低的層次,提供支持和保障,確保運(yùn)行eyeOS時(shí),一切都在正確的環(huán)境中。4.4.框架框架是系統(tǒng)中的最高層的組件,也就是說,它們更接近應(yīng)用并進(jìn)一步遠(yuǎn)離低層次的細(xì)節(jié)??蚣苁遣槐匾慕M件,添加eyeOS功能,但沒有對eyeOS自身進(jìn)行更改。例如用戶管理不是一個(gè)框架,因?yàn)樗且粋€(gè)服務(wù)。例如,一個(gè)框架,負(fù)責(zé)轉(zhuǎn)換Office文檔成為應(yīng)用程序使用的其他文件格式,另一個(gè)例子是解壓Zip文件的框架。4.5.引導(dǎo)程序在所有操作發(fā)生之前,引導(dǎo)程序負(fù)責(zé)加載整個(gè)系統(tǒng)。當(dāng)用戶打開時(shí)按需加載應(yīng)用程序,每次請求,所有的庫、服務(wù)和框架都加載一次,這樣每次用戶運(yùn)行一個(gè)程序時(shí),所有組件都已經(jīng)被加載并且可用。配置文件eyeOS/system/conf/boot.xml中,包含加載項(xiàng)和加載順序的配置。語法是一系列的元素,像這樣......<element><type>library</type><name>exceptions</name><priority>20</[roority></element>在每個(gè)元素有子元素指定組件類型、名稱和加載優(yōu)先級。加載優(yōu)先級是什么決定了組件的加載順序。默認(rèn)情況下所有組件都具有優(yōu)先級為0,按字母順序加載。如果你想加載其他組件之前加載一個(gè)組件,只要設(shè)置其優(yōu)先級為更大的數(shù)(10,20,30等)。因此,可見,開發(fā)者有一系列的層,運(yùn)行在程序底部,并保護(hù)他們遠(yuǎn)離低層次的細(xì)節(jié),如PHP版本或安裝的模塊。然后應(yīng)用程序可以把精力集中在功能和業(yè)務(wù)邏輯上。

5.目錄結(jié)構(gòu)重要的一點(diǎn)是要知道系統(tǒng)的結(jié)構(gòu),因此,你才能找到配置文件和其他組件。如果你看一下組成eyeOS的文件,你會(huì)看到,在第一級目錄中,我們只有的index.php、settings.php和名為eyeOS的一個(gè)目錄。Settings.php是一個(gè)配置文件。在其中的定義,是可以改變eyeOS行為的常量。例如數(shù)據(jù)庫連接器的配置,以及許多其他的東西。在安裝說明書中包含此文件用到的指令。index.php文件與eyeOS系統(tǒng)的所有部分相關(guān)。每當(dāng)一個(gè)請求發(fā)送到eyeOS或者運(yùn)行一個(gè)應(yīng)用程序,或執(zhí)行任何操作,都要通過這個(gè)文件。eyeOS目錄,被稱為“eyeroot”或“root”,包含整個(gè)eyeOS,包括所有用戶的數(shù)據(jù)。在這個(gè)目錄里有一個(gè)名為htaccess的文件,其中有一條“拒絕所有”的規(guī)則,這是使其無法從瀏覽器訪問這個(gè)目錄。只有通過index.php文件可以訪問eyeOS目錄下的文件。在eyeOS目錄中有以下的目錄樹...apps/extern/extras/system/tests/users/workgroups/Apps/在Apps目錄里包含在eyeOS桌面上運(yùn)行的應(yīng)用程序或桌面本身。每個(gè)應(yīng)用程序都有自己單獨(dú)的目錄,例如計(jì)算器應(yīng)用程序在eyeos/apps/calculator目錄里。extern/因?yàn)橹挥衖ndex.php文件是可以從外部訪問,eyeOS必須有一些方法,使JavaScript文件,CSS,圖片等,可用于瀏覽器,以便瀏覽器可以加載它們。這是extern目錄存在的目的。需要通過瀏覽器訪問的所有資源必須放置在extern目錄,或其子文件夾內(nèi)。當(dāng)index.php文件收到這樣的請求“index.php?extern=some_image.jpg”,extern目錄下的some_image.jpg文件的內(nèi)容被返回給瀏覽器,以便它可以被加載。這將在以后更深入地討論。extras/在此目錄中,包括需要安裝或配置eyeOS的所有腳本和文件,但不是eyeOS運(yùn)行所需的文件。例如首次創(chuàng)建數(shù)據(jù)庫的SQL文件。之后,他們沒有在任何地方使用。system/system目錄包含所有的系統(tǒng)組件,這是前面討論過的。在system目錄中,有frameworks目錄,其中存放著框架,bootstrap目錄包含引導(dǎo)程序,conf目錄包含一般的系統(tǒng)配置,管理員可以修改,kernel目錄存放著庫和服務(wù)。tests/test目錄包含系統(tǒng)的單元測試,也許不受應(yīng)用程序開發(fā)人員所喜愛。users/在users目錄中為每個(gè)用戶建立了一個(gè)子目錄。這個(gè)子目錄包含用戶的文檔和設(shè)置文件。例如,JoeyBloggs用戶的目錄是eyeos/users/JoeyBloggs。workgroups/workgroups目錄包含用戶的工作組。如果用戶創(chuàng)建了一個(gè)名為“myGroup”的組,這個(gè)組的目錄為eyeos/workgroups/myGroup。6.MMAP,Exec和extern在開始開發(fā)應(yīng)用程序之前,有三個(gè)與eyeOS內(nèi)部運(yùn)行相關(guān)的概念必須了解,因此,他們有專有的一章來介紹。MMAP是一個(gè)服務(wù),extern是一個(gè)服務(wù),exec是一個(gè)JavaScript函數(shù)。6.1.MMAP正如我們在第5章中看到,所有對eyeOS的請求必須通過index.php文件傳遞。這意味著,index.php文件根據(jù)請求的類型執(zhí)行一個(gè)動(dòng)作。您可以發(fā)送GET或POST變量到index.php。MMAP是系統(tǒng)服務(wù),負(fù)責(zé)識(shí)別請求的類型、決定執(zhí)行組件或調(diào)用其他eyeOS服務(wù)。MMAP與一個(gè)插件系統(tǒng)協(xié)同工作,對每個(gè)MMAP可管理的請求類型,MMAP都有一個(gè)相應(yīng)的插件。當(dāng)一個(gè)請求發(fā)送到index.php,index.php文件調(diào)用MMAP,然后MMAP從所有插件中找出一個(gè)能夠處理該請求的插件。例如,有一個(gè)插件,如果請求沒有任何GET參數(shù),即用戶訪問沒有任何參數(shù)被傳遞到index.php,那么該插件顯示登錄窗口。還有另外一個(gè)插件,如果參數(shù)extern存在,那么它會(huì)讀取指定文件的內(nèi)容,并返回到瀏覽器。eyeOS里還有其他類型的請求,例如,當(dāng)你想運(yùn)行應(yīng)用程序,一個(gè)請求將發(fā)送到index.php,該請求傳遞要執(zhí)行的應(yīng)用程序的名稱,checknum(當(dāng)前運(yùn)行的進(jìn)程的IDPID),和任何其他參數(shù)。完整的URL將類似于下面這樣/index.php?getApplication=calculator&checknum=570515413&args=nullMMAP運(yùn)行應(yīng)用程序,并收集其他類型的消息,例如,當(dāng)一個(gè)應(yīng)用程序的JavaScript要與應(yīng)用程序的PHP通過AJAX溝通,以執(zhí)行動(dòng)作,如讀取數(shù)據(jù)庫(將有一個(gè)消息被MMAP收集到)。這些請求大多是不可見的,開發(fā)人員構(gòu)建應(yīng)用程序并不需要了解他們。然而,了解所有到index.php的請求,和MMAP決定對每個(gè)請求做什么(是有益的)。6.2.ExecExec是一個(gè)在JavaScript中通過eyeOS對象調(diào)用的函數(shù)。JavaScript中的eyeOS對象是應(yīng)用程序用來訪問基本系統(tǒng)功能的對象,例如運(yùn)行應(yīng)用程序。在JavaScript中,應(yīng)用程序可以在任何時(shí)候調(diào)用exec函數(shù),如下:eyeos.execute('myApplication',checknum,args);第一個(gè)參數(shù)是要執(zhí)行的應(yīng)用程序的名稱,第二個(gè)參數(shù)是當(dāng)前應(yīng)用程序進(jìn)程的標(biāo)識(shí)符,第三個(gè)參數(shù)是應(yīng)用程序執(zhí)行時(shí)必須得到的參數(shù)。請注意args可指定為NULL,或可以從函數(shù)調(diào)用中省略。請求到達(dá)index.php文件,并將它傳遞給mmap,然后找到可以管理應(yīng)用程序執(zhí)行的插件。運(yùn)行應(yīng)用程序的插件在用戶的進(jìn)程表中插入一個(gè)新的進(jìn)程,讀取應(yīng)用程序的JavaScript內(nèi)容,并返回到瀏覽器。然后運(yùn)行該應(yīng)用程序并在eyeOS桌面上顯示。應(yīng)用程序的結(jié)構(gòu)和功能到目前為止,我們已經(jīng)知道系統(tǒng)的工作原理和應(yīng)用程序分為兩個(gè)部分,一部分是JavaScript文件,創(chuàng)建了用戶界面,另一部分是PHP文件,包含任何所需的服務(wù)器端處理。如數(shù)據(jù)庫訪問。應(yīng)用程序存放在eyeOS/apps/目錄下。目錄應(yīng)該具有和應(yīng)用程序相同的名字,例如:notepad應(yīng)用程序應(yīng)放在eyeOS/apps/notepad目錄下。在這個(gè)目錄中至少有兩個(gè)文件,分別是notepad.js和notepad.php。就像你想的那樣,notepad.js文件里存放的JavaScript代碼用來創(chuàng)建用戶界面,notepad.php包含業(yè)務(wù)邏輯,PHP文件內(nèi)是可以被Javascript文件調(diào)用的函數(shù),這些函數(shù)通過eyeOS的API用AJAX調(diào)用。當(dāng)調(diào)用PHP函數(shù)時(shí)JavaScript有傳遞參數(shù)的能力,該功能由系統(tǒng)提供。如果PHP函數(shù)返回?cái)?shù)據(jù),數(shù)據(jù)會(huì)返回到發(fā)起請求的JavaScript中去。所有的這些都是通過callMessage功能函數(shù)實(shí)現(xiàn),是eyeOS對象的一部分。其語法為:eyeos.callMessage(checknum,'funtionname',args,function(e){alert(e);});其中第一個(gè)參數(shù)是當(dāng)前的應(yīng)用程序的checknum,函數(shù)的名稱是根據(jù)PHP文件中的函數(shù)所命名的,args是要發(fā)送到該函數(shù)的參數(shù),最后,我們定義了一個(gè)函數(shù),在調(diào)用結(jié)束時(shí)執(zhí)行-該函數(shù)稱為回調(diào)函數(shù)。在上述例子中的回調(diào)函數(shù)只是簡單地提示從PHP函數(shù)返回的值。組成應(yīng)用程序的JavaScript和PHP文件(在我們的案例中是notepad.php和notepad.js),必須有一個(gè)讓應(yīng)用程序工作的具體結(jié)構(gòu)。對于notepad.js所需的最低限度的代碼如下functionnotepad_application(checknum,pid,args){varapp=neweyeos.application.notepad(checknum,pid,args);app.drawGUI();}qx.Class.define('eyeos.application.notepad',{extend:eyeos.system.EyeApplication,construct:function(checknum,pid,args){arguments.callee.base.call(this,'notepad',checknum,pid);},members:{drawGUI:function(){//codetocreatetheGUIishere.}}};第一個(gè)代碼塊定義了一個(gè)名為notepad_application的函數(shù),這個(gè)函數(shù)是應(yīng)用程序的入口,在程序運(yùn)行時(shí)被調(diào)用。下面定義的那個(gè)類代表該應(yīng)用程序,他是eyeOS的一個(gè)應(yīng)用程序,它繼承自eyeos.system.EyeApplication。notepad_application函數(shù)定義和執(zhí)行了drawGUI方法。drawGUI用其中的代碼來創(chuàng)建應(yīng)用程序的圖形用戶界面(GUI)。PHP文件中最少的代碼是...<?phpAbstractclassNotepadApplicationextendsEyeosApplicationExecutable{}?>在這里,我們定義一個(gè)抽象類(它不能被實(shí)例化)稱為NotepadApplication,他繼承了EyeosApplicationExecutable。在execmodules一章,你會(huì)知道,應(yīng)用程序可以從這個(gè)類擴(kuò)展。如果您想添加一個(gè)函數(shù)到PHP文件中且JavaScript可以調(diào)用它,將關(guān)鍵字“public”和“static”放在函數(shù)名前面。該函數(shù)必須放置在類定義中,如下...<?phpabstractclassNotepadApplicationextendsEyeosApplicationExecutable{publicstaticfunctionmyFunction(){return"HelloWorld";}}?>現(xiàn)在“myfunction”是可以使用的函數(shù)名,可以在您的應(yīng)用程序的JavaScript端通過callMessage調(diào)用,如同前面看到的那樣。需要注意的是,在應(yīng)用程序目錄中沒有提及的info.xml文件,在原來的開發(fā)手冊中有說明。這是用來指定應(yīng)用程序的名稱,圖標(biāo),描述,作者,和其他應(yīng)用程序的元數(shù)據(jù)。8.創(chuàng)建第一個(gè)應(yīng)用程序?qū)嵺`可以解釋一切,我們將開發(fā)一個(gè)應(yīng)用程序,它從服務(wù)器顯示當(dāng)前的日期和時(shí)間,當(dāng)按下“Getservertime”按鈕時(shí)。1.在apps目錄下創(chuàng)建一個(gè)名為servertime的目錄。2.在servertime目錄下創(chuàng)建一個(gè)名為servertime.js的JavaScript文件3.在這個(gè)文件中放入下面的代碼...//Createmainfunction.functionservertime_application(checknum,pid,args){varapp=neweyeos.application.servertime(checknum,pid,args);app.drawGUI();}//Defineclassforthisapplication.qx.Class.define('eyeos.application.servertime',{extend:eyeos.system.EyeApplication,construct:function(checknum,pid,args){arguments.callee.base.call(this,'servertime',checknum,pid);},members:{drawGUI:function(){//Createthewindow.varmainWindow=neweyeos.ui.Window(this,tr("ServerTime"));//SetthelayoutmanagerthewindowistousetoVerticalBox.mainWindow.setLayout(newqx.ui.layout.VBox());//Createlabeltodisplaythetimeandaddittothemainwindow.vartimeLabel=newqx.ui.basic.Label("PressthebuttonbelowtoseetheServerTime.");mainWindow.add(timeLabel);//CreatebuttontocallthePHPfunctiontogetthetime.varaButton=newqx.ui.form.Button("GetServerTime");//Addlistenertodosomethingwhenthebuttonisclicked.aButton.addListener('click',function(){eyeos.callMessage(this.getChecknum(),'getTimeFromServer',null,function(theTime){timeLabel.setValue("Thetimeis:"+theTime);},this);},this);//Addthebuttontothemainwindow.mainWindow.add(aButton);//Setminwidthandheightofthewindowtostopitbeingtoosmall.mainWindow.setMinWidth(300);mainWindow.setMinHeight(150);mainWindow.setAllowMaximize(false);//Remembertoopenthewindow,otherwisenothingwillshowonthescreen.mainWindow.open();}}});4.創(chuàng)建一個(gè)名為servertime.php的文件5.在這個(gè)文件中放入下面的代碼......<?phpabstractclassServertimeApplicationextendsEyeosApplicationExecutable{publicstaticfunctiongetTimeFromServer(){returndate('Y-m-dh:i:s');}}?>在eyeOS桌面上運(yùn)行應(yīng)用程序,您需要沿著屏幕上方找到“Application”菜單/選項(xiàng)卡,然后選擇“添加應(yīng)用程序”,并點(diǎn)擊列表中servertime下面的綠色加號(+)按鈕。添加后你可以通過點(diǎn)擊它運(yùn)行該程序。所以,像前面的章節(jié)中說明的那樣,程序是由兩個(gè)文件組成,servertime.js和servertime.php。在JavaScript文件中的代碼用來創(chuàng)建用戶界面,并包含一個(gè)事件監(jiān)聽器在按鈕被點(diǎn)擊時(shí)做一些事情。PHP文件包含的代碼從服務(wù)器獲取日期和時(shí)間。在JavaScript文件中的事件監(jiān)聽器使用callMessage的API來調(diào)用PHP文件的getTimeFromServer函數(shù)并獲取返回值。這樣做使用AJAX,沒有頁面刷新。在JavaScript中使用qooxdoo(簡稱“QX”)的圖形庫。Qooxdoo允許你開發(fā)一個(gè)GUI,通過使用JavaScript,而不是XHTML和CSS。在qooxdoo里,您通過窗口工作,按鈕和其他元素被添加到窗口。9.Qooxdoo正如我們在前面的章節(jié)中看到的,qooxdoo是一個(gè)圖形庫,用來創(chuàng)建用戶界面,如同你使用QT,GTK,或Swing庫。Qooxdoo獨(dú)立于eyeOS,是一個(gè)自由軟件項(xiàng)目,它的網(wǎng)站是/eyeOS已經(jīng)包括Qooxdoo,因此開發(fā)人員不必下載或添加任何東西。eyeOS上的所有應(yīng)用程序都是用QX圖形庫開發(fā)的。閱讀教程或qooxdooAPI文檔是至關(guān)重要的,這使你能理解并使用QX庫進(jìn)行開發(fā)。Qooxdoo是完全面向?qū)ο?,并允許您定義類,做繼承,和做所有典型的面向?qū)ο蟮氖虑?。API和其他文件可以在這里找到/documentation9.1.eyeOS中使用的Qooxdoo類雖然eyeOS大多采用標(biāo)準(zhǔn)Qooxdoo類,例如用qx.ui.button畫一個(gè)按鈕,也有一些eyeOS擴(kuò)展qooxdoo類的特殊情況,創(chuàng)建我們自己的附加功能。例如eyeos.ui.Window類是qx.ui.Window的擴(kuò)展。問題是,作為一個(gè)應(yīng)用程序開發(fā)人員,你會(huì)使用MyWindow=newqx.ui.Window()獲取一個(gè)窗口,但需要插入某個(gè)地方,因?yàn)閝ooxdoo架構(gòu)中,所有要顯示的部件(widgets)必須插入上層部件中。但是,桌面上的窗口的上級是什么部件?事實(shí)上,這確實(shí)有點(diǎn)復(fù)雜。為了讓開發(fā)人員不必?fù)?dān)心這一點(diǎn),我們創(chuàng)建eyeos.ui.Window,實(shí)例化并調(diào)用Open方法時(shí),窗口會(huì)自動(dòng)插入到桌面上顯示,而開發(fā)人員無需知道誰是該窗口的上級部件。目前,開發(fā)者做正常的應(yīng)用程序時(shí),無需擔(dān)心比創(chuàng)建eyeos.ui.Window更多的情況,因?yàn)槭S嗟臄U(kuò)展類用于eyeOS內(nèi)部。

10.應(yīng)用程序模塊(execmodules)我們已經(jīng)看到了,您可以在PHP應(yīng)用程序中添加靜態(tài)公共方法,從JavaScript由callMessage調(diào)用。不過,所有的應(yīng)用都有很多方法,例如,PHP中應(yīng)該有一個(gè)“關(guān)閉”函數(shù)用來關(guān)閉應(yīng)用程序。當(dāng)你開發(fā)一個(gè)全新的應(yīng)用程序時(shí),每次都重新寫這個(gè)函數(shù)將是一件痛苦的事,這就是為什么應(yīng)用已經(jīng)有一些這樣的函數(shù)定義在PHP父類EyeosApplicationExecutable。這些函數(shù)都可以使用callMessage的JavaScript調(diào)用,就像由開發(fā)人員定義的任何其他函數(shù)。這意味著,應(yīng)用程序現(xiàn)在已經(jīng)有一些可以執(zhí)行的PHP函數(shù),雖然開發(fā)者沒有在PHP應(yīng)用程序中定義任何東西。在eyeOS的默認(rèn)函數(shù)位于eyeos/system/Frameworks/Applications/Executables/EyeosModuIes/例如,如果您打開eyeos/system/Frameworks/Applications/Executables/EyeosModules/ContactsExecModule.php,在里面你會(huì)發(fā)現(xiàn)一系列的功能,可在你的應(yīng)用程序中通過callMessage執(zhí)行。例如:publicstaticfunctiongetAllContacts($params)如果你想在你的程序中通過JavaScript運(yùn)行它,你需要寫如下代碼...eyeos.callMessage(checknum,'__Contacts_getAllContacts',params,function());callMessage只是像正常的,但通過PHP函數(shù)的名稱來運(yùn)行,因?yàn)樗贑ontactsExecModule里,你必須在函數(shù)名前的加入包的名稱。包的名稱必須有兩個(gè)下劃線在它的前面和一個(gè)在它的后面(即__Contacts_)。許多應(yīng)用程序使用這些功能,以避免重復(fù)完全相同的代碼。11.用戶管理用戶管理(UM)是一種服務(wù),允許eyeOS用戶服務(wù)與eyeOS應(yīng)用進(jìn)行交互。它的一些功能包括創(chuàng)建新用戶,列出所有用戶,刪除用戶等。像其他eyeOS服務(wù)一樣,所有調(diào)用都要檢查運(yùn)行操作的用戶的權(quán)限,例如,通過調(diào)用UM,一個(gè)非管理員用戶無法創(chuàng)建新用戶或刪除現(xiàn)有的用戶。在一個(gè)PHP的例子里,我們可以使用UM查看用戶是否存在...$exists=false;try{$MyUManager->getUserByName($username);$exists=true;}catch(EyeNoSuchUserException$e){}如果用戶不存在,那么當(dāng)你調(diào)用getUserByName函數(shù)時(shí)它會(huì)導(dǎo)致一個(gè)異常,這又導(dǎo)致$exist=true被跳過,最終將返回假。

我們也可能使用UM去獲取系統(tǒng)中的所有用戶的列表...$users=UMManager::getInstance()->getAllUsers();用戶被填充到$users數(shù)組,數(shù)組中的每個(gè)對象代表系統(tǒng)中的一個(gè)用戶,例如獲得的第一個(gè)用戶的用戶名,你可以這樣做$username=$users[0]->getName();12.進(jìn)程管理進(jìn)程管理是eyeOS的服務(wù),提供了一個(gè)API給應(yīng)用程序,使他們能夠運(yùn)行應(yīng)用程序,列出的進(jìn)程,關(guān)閉進(jìn)程等,用戶可以只列出了屬于他們的會(huì)話進(jìn)程,而不包括另一用戶的會(huì)話。進(jìn)程管理器有一個(gè)方法來獲取當(dāng)前進(jìn)程,使應(yīng)用程序可以調(diào)用自己的進(jìn)程,并操縱它,例如關(guān)閉當(dāng)前進(jìn)程。與每個(gè)進(jìn)程相關(guān)聯(lián)的用戶權(quán)限,使用戶對每個(gè)正在運(yùn)行的應(yīng)用程序可以有不同的權(quán)限,如同在傳統(tǒng)的操作系統(tǒng)上。如果應(yīng)用程序要得到當(dāng)前用戶是誰,它必須使用用戶管理器得到當(dāng)前進(jìn)程,然后從那里提取進(jìn)程的權(quán)限和用戶,例如...$currentUser=ProcManager::getInstance()->getCurrentProcess()->getLoginContext()->getEyeosUser();這樣,通過進(jìn)程管理器,開發(fā)者調(diào)用當(dāng)前進(jìn)程,然后獲取LoginContext,這是一個(gè)對象,含有與這一進(jìn)程相關(guān)聯(lián)的用戶權(quán)限。雖然它可能似乎有些牽強(qiáng),這種工作方式可以讓我們在高層操作,如同創(chuàng)建應(yīng)用程序始終運(yùn)行在超級用戶權(quán)限,或以最小的權(quán)限。通過進(jìn)程管理器,應(yīng)用程序可以獲得一個(gè)進(jìn)程列表,例如...$processes=ProcManager::getInstance()->getProcessesTable();你會(huì)得到一個(gè)屬于用戶的所有進(jìn)程的數(shù)組。該數(shù)組內(nèi)的每個(gè)對象包含正在運(yùn)行的進(jìn)程的信息,例如,你可以獲取第一個(gè)進(jìn)程的名字,通過下面代碼...$procName=$process[0]->getName();13.文件系統(tǒng)接口開發(fā)應(yīng)用程序時(shí),有不同的方式來訪問文件,通過本地的PHP函數(shù)。大多數(shù)開發(fā)者采用我們熟知PHP函數(shù),像fopen,readfile,file_get_contents.這些功能可能根據(jù)php代碼運(yùn)行的環(huán)境產(chǎn)生不同的結(jié)果。例如,在官方發(fā)布的PHP文檔中,有警告說,微軟的IIS返回一個(gè)"SSL:FatalProtocolError",并解釋說,開發(fā)者負(fù)責(zé)檢測并抑制此警告。直接操作文件的問題是,你必須要考慮到環(huán)境和操作系統(tǒng)。特別是,如何保證文件的權(quán)限等級是一個(gè)問題,如只允許有正確權(quán)限的eyeOS用戶訪問文件,并允許特定的有讀或?qū)憴?quán)限的用戶讀或?qū)懳募?。eyeOS開發(fā)環(huán)境提供了一個(gè)抽象層,稱為FSI(FileSystemInterface),負(fù)責(zé)替開發(fā)者照顧細(xì)節(jié)問題,包括妥善管理文件,以確保在文件系統(tǒng)上的所有操作都受到安全服務(wù)的監(jiān)督。另一個(gè)抽象層,稍后你會(huì)看到,它能夠管理文件的權(quán)限,并決定允許或拒絕特定的操作。FSI為開發(fā)者提供了一個(gè)API,使開發(fā)人員不必處理的安全性和一致性的問題。它也能夠與不同類型的文件協(xié)同工作,取決于您的URL模式(即ftp://或http://)。例如,一個(gè)路徑像home://~JoeyBloggs/Images/image.jpg將會(huì)被翻譯成/var/www/eyeOS/users/JoeyBloggs/files/Images.jpg。路徑"/var/www/eyeOS"是eyeOS安裝路徑,"JoeyBloggs"是eyeOS的用戶。通過這個(gè)系統(tǒng),F(xiàn)SI能夠讀寫:物理服務(wù)器硬盤上的文件,F(xiàn)TP服務(wù)器上的文件,在共享文件夾里的文件等,通過不同的協(xié)議還可以讀寫其他文件。FSI的一個(gè)主要函數(shù)是GetFile,該函數(shù)的參數(shù)是一條路徑,在URL模式轉(zhuǎn)換和權(quán)限檢查后,該函數(shù)返回一個(gè)EyeFile類型的對象。例如,如果您要訪問一個(gè)文件,其路徑是"home://~JoeyBloggs/Images/image.jpg",其語法是......$file=FSI::getFile("home://~JoeyBloggs/Images/image.jpg");API的責(zé)任是正確翻譯URL“home//”得到這個(gè)文件的實(shí)際路徑和驗(yàn)證權(quán)限,例如,當(dāng)前用戶不是這個(gè)文件的所有者,他有讀取權(quán)限嗎?如果該文件存在,并且權(quán)限允許,GetFile函數(shù)返回一個(gè)對象供開發(fā)者使用。例如,如果你想知道對象$file是否是一個(gè)目錄,語法$file->isDirectory();要?jiǎng)h除一個(gè)文件,你可以像下面那樣做...$file->delete(true);總之,F(xiàn)SI是最重要的eyeOS服務(wù)之一,開發(fā)者應(yīng)該總是通過這個(gè)API訪問文件,因?yàn)樵撓到y(tǒng)處理了所有細(xì)節(jié)。

14.安全管理eyeOS的所有組件對數(shù)據(jù)或系統(tǒng)信息實(shí)施操作,或訪問資源,都要對當(dāng)前進(jìn)程的用戶進(jìn)行權(quán)限檢查,在任何操作執(zhí)行之前。被檢查的權(quán)限依靠一套規(guī)則,ACL的風(fēng)格,這套規(guī)則決定了用戶是否可以執(zhí)行操作。eyeOS中負(fù)責(zé)進(jìn)行這些檢查的組件是安全管理器。從一個(gè)程序員的角度來看,安全管理器不是很有趣,但重要的是了解它,以便了解eyeOS拒絕某些操作的原因,或修改系統(tǒng)來做一些事(這通常是不允許的)。

安全管理的規(guī)則在XML格式的文件eyeOS/system/conf/services/security/SecurityManager.xml內(nèi)。這是一套策略并包括對應(yīng)的處理程序。策略是應(yīng)用到一個(gè)對象類型的規(guī)則,即一個(gè)類。正常情況下,開發(fā)人員使用類來訪問系統(tǒng)資源,安全管理器用于指定這些類的規(guī)則——例如,代表一個(gè)文件的對象,或者代表一個(gè)進(jìn)程的對象。了解策略的最佳方式是首先研究文件中出現(xiàn)的<policyobjectClass="EyeUserFile">本策略適用于當(dāng)有人試圖操縱一個(gè)類型為eyeUserFile的對象。這個(gè)對象被用于訪問屬于某個(gè)用戶的文件,通過FSI:GETFILE。重要的是要認(rèn)識(shí)到處理程序從上到下處理,從第一個(gè)開始一直執(zhí)行到最后一個(gè)。每個(gè)處理程序的“flag”參數(shù)指定是否繼續(xù)評估處理。第一個(gè)處理程序(用于在上面顯示的策略)是<handlerclass="SystemGroupSecurityHandler"flag="sufficient"><paramname="groups"value="admin"/></handler>此處理程序規(guī)定,如果在“admin”組的用戶(見處理程序內(nèi)的<PARAM>),那么這已經(jīng)是“Sufficient”,不需要任何其他檢查,用戶可以訪問該文件。這一策略的下一個(gè)處理程序是...<handlerclass="SystemGroupSecurityHandler"flag="requisite"><paramname="groups"value="vfs"/></handler>此處理程序檢查用戶是否屬于組“VFS”,“requisite”標(biāo)志表明,如果用戶屬于該組,則可以訪問,但安全管理器繼續(xù)評估其他處理。再就是......<handlerclass="ShareableObjectSecurityHandler"flag="Sufficient"/>ShareableObjectsSecurityHandler用"Sufficient"標(biāo)志,這意味著,如果該文件是一個(gè)共享文件,則授權(quán)訪問。最后...<handlerclass="EyeosFileSecurityHandler"flag="required"/>EyeosFileSecurityHandler是一個(gè)基本的檢查,如果該文件屬于某用戶,因此,他可以訪問它(用戶可以隨時(shí)訪問自己的文件)。通過指定"required"標(biāo)識(shí),如果符合這條規(guī)則,用戶將被允許訪問,但將繼續(xù)評估其他規(guī)則(雖然在這個(gè)策略里其實(shí)沒有更多的規(guī)則了)??傊?,對于這些處理器這些策略允許你訪問該文件:如果你是一個(gè)管理員,如果該文件是共享的,或者如果該文件是你的。如果該文件不是共享的,你不是管理員,文件也不是你的,那么你必須在組“VFS”中才能訪問,否則訪問被拒絕。從這個(gè)XML文件里面調(diào)用的處理程序在eyeOS/system/kernel/services/Securityimplementations/handlers/文件夾下定義。任何人都可以創(chuàng)建一個(gè)新的處理程序,并從SecurityManager.xml文件里調(diào)用它。

15.Metadata[譯者:用數(shù)據(jù)庫存儲(chǔ)時(shí),這玩意的效率慘不忍睹]有很多情況下,您可能需要與對象交換數(shù)據(jù),并在此之后檢索數(shù)據(jù)。例如,如果你有一個(gè)由FSI::GETFILE獲得的EyeUserFile對象,你想增加一個(gè)等級評定,然后當(dāng)您再次使用GETFILE時(shí),檢索這個(gè)等級評定。這種相關(guān)信息的類型,被稱為元數(shù)據(jù)。eyeOS提供了一個(gè)簡化的API,它允許你把key-value(鍵值對)與類的一個(gè)實(shí)例相關(guān)聯(lián),以便下一次你有這樣的實(shí)例,您可以檢索信息。這是用于內(nèi)部的用戶個(gè)人數(shù)據(jù),等等……與用戶相關(guān)聯(lián)的元數(shù)據(jù)是一個(gè)基本的例子......$user=UMManager::getInstance()->getUserById($userId);$userid是系統(tǒng)中的用戶的ID。這個(gè)ID通過UM可以獲得一個(gè)eyeUser類型的對象,這個(gè)對象代表該ID的用戶。現(xiàn)在你可以獲取與這用戶對象相關(guān)的元數(shù)據(jù)......$settings=MetaManager::getInstance()->retrieveMeta($user);$settings里面是一個(gè)metadataInformation類型的對象,這是一個(gè)有g(shù)et和set方法的對象。我們通過下面代碼得到一個(gè)元數(shù)據(jù)的具體條目......$firstName=$settings->get('eyeos.user.firstname');這得到了用戶的名字。16.Office文檔轉(zhuǎn)換文檔轉(zhuǎn)換API允許開發(fā)人員輕松地在不同格式之間轉(zhuǎn)換Office文檔。例如轉(zhuǎn)換ODS,XLS,ODT,DOC等,從一種格式到另一種格式或到XHTML。轉(zhuǎn)換器的主要用途之一是微軟Office文檔或OpenOffice格式文件轉(zhuǎn)換為XHTML,使他們可以在未安裝任何插件的瀏覽器中顯示。eyeOS安裝手冊中的步驟之一,是在服務(wù)器上安裝OpenOffice。文件轉(zhuǎn)換的API連接到OpenOffice,并使用OpenOffice轉(zhuǎn)換。

Office文檔轉(zhuǎn)換器只需要兩個(gè)參數(shù):要轉(zhuǎn)換的文件和轉(zhuǎn)換成什么文件。它返回一個(gè)到所需格式的臨時(shí)文件的路徑,這個(gè)臨時(shí)文件可以復(fù)制到另一個(gè)站點(diǎn)或簡單地顯示在屏幕上。其中一個(gè)例子...$myConverter=newConverter();$path=$myConverter->Convert($filePath,'HTML(StarWriter)');$filepath是一個(gè)DOC,ODT,xls或任何文件的路徑都不要緊;轉(zhuǎn)換器直接連接到OpenOffice進(jìn)行轉(zhuǎn)換。像其余的eyeOS組件,Office文檔轉(zhuǎn)換器,你正試圖轉(zhuǎn)換的文件將使用安全管理器檢查文件讀取權(quán)限。轉(zhuǎn)換所花費(fèi)的時(shí)間取決于服務(wù)器的處理速度和文件的大小。17.DbusDBUS是應(yīng)用程序在JavaScript端的一種技術(shù),它提供了一個(gè)所有的應(yīng)用程序公用的通信渠道,任何應(yīng)用程序可以發(fā)送消息或讀取消息。它的主要任務(wù)是負(fù)責(zé)JavaScript應(yīng)用之間的通信。例如,當(dāng)完成文件上傳時(shí)(上傳文件到某個(gè)目錄),發(fā)出該文件已經(jīng)被創(chuàng)建的dbus消息,這樣,如果有任何打開該目錄的文件管理器,能夠通知他們更新和顯示新的文件。該技術(shù)被用在eyeOS桌面上的很多東西里。該架構(gòu)基于事件,所以,如果你想發(fā)送新消息到dbus,只需發(fā)送就可以,如果你想接收dbus的事件,需要添加一個(gè)dbus的監(jiān)聽器和一個(gè)回調(diào)函數(shù)到(收到消息時(shí)執(zhí)行)您的應(yīng)用程序。為了防止消息重復(fù),所有在dbus上的消息都有一個(gè)“type”屬性,該屬性像標(biāo)簽一樣將消息分類。監(jiān)聽dbus的消息時(shí),請不要監(jiān)聽所有的消息,只是監(jiān)聽你需要的類型的消息(通過type屬性)下面是一個(gè)例子,文件上傳代碼使用其發(fā)送dbus消息varbus=eyeos.messageBus.getInstance();bus.send('upload','uploadFinished');首先獲取消息總線的一個(gè)實(shí)例,然后發(fā)送“upload”類型的消息uploadFinished。它只會(huì)觸發(fā)“upload”類型的監(jiān)聽器。該dbus信息可以被捕獲,像這樣bus.addListener("eyeos_upload_uploadFinished",function(){alert("newmessage");},this);18.NetSync實(shí)時(shí)消息由于eyeOS允許同一臺(tái)服務(wù)器上多個(gè)用戶同時(shí)使用,用戶可以發(fā)送邀請(其中包括許多其他的東西)給對方。eyeOS有一個(gè)機(jī)制,當(dāng)用戶執(zhí)行一個(gè)動(dòng)作,其他用戶可以收到實(shí)時(shí)的通知,而無需刷新頁面。HTTP協(xié)議是一種非持久連接,客戶端連接到服務(wù)器,發(fā)出請求,然后斷開。問題是如果用戶的請求影響到其他用戶,在被影響的用戶發(fā)出另一個(gè)請求到服務(wù)器之前,他將無法得到通知。有些網(wǎng)站已經(jīng)開發(fā)出一種機(jī)制,通過AJAX不斷請求,詢問服務(wù)器是否有通知。用這種方法(稱為http推送)的問題是,它會(huì)讓服務(wù)器收到很多無用的請求,消耗很多帶寬。eyeOS使用一個(gè)更為先進(jìn)的系統(tǒng),實(shí)現(xiàn)實(shí)時(shí)通知。首先,在服務(wù)器上安裝一個(gè)消息隊(duì)列,就是所謂的ActiveMQ。這是一個(gè)守護(hù)程序,可以發(fā)送消息到隊(duì)列中,并且讓任何訂閱此隊(duì)列的人收到消息。對于使用瀏覽器與此隊(duì)列服務(wù)進(jìn)行溝通,一種代理(Kaazing)用于將HTTP請求轉(zhuǎn)換為ActiveMQ可以理解的協(xié)議。為了避免不斷訪問服務(wù)器,ActiveMQ通過讓HTTP請求始終不結(jié)束來模擬持久鏈接,以上是我們?nèi)绾潍@取消息。eyeOS為開發(fā)人員提供一種簡化的機(jī)制來使用這種技術(shù),稱為NetSync,將消息發(fā)送給其他DBUS用戶,從而使其他正在運(yùn)行DBUS監(jiān)聽器的用戶實(shí)時(shí)接收到消息。我們已經(jīng)了解了DBUS的API,所以你只需要了解如何使用NetSync將消息發(fā)送到另一個(gè)用戶即可。varnetSync=Sync.NetSync.getInstance();varmessage=newSync.Message({type:'Playground'name:'test',data:{test1:'test',test2:'test2'},to:'eyeID_EyeosUser_root'});netSync.send(message);對于這個(gè)例子,我們首先獲得netSync對象的一個(gè)實(shí)例,然后創(chuàng)建一個(gè)通過NetSync發(fā)送的消息。消息對象包含以下信息:消息類型,消息名稱,消息數(shù)據(jù),和消息的目標(biāo)用戶。消息的目標(biāo)用戶使用的是用戶的ID,而不是用戶名。19.數(shù)據(jù)庫連接eyeOS默認(rèn)的數(shù)據(jù)庫引擎為MySQL,但使用一個(gè)抽象層,因此可使用任何標(biāo)準(zhǔn)的SQL數(shù)據(jù)庫,如果需要的話。如果一個(gè)應(yīng)用程序需要連接到數(shù)據(jù)庫,例如創(chuàng)建他們自己的表并存儲(chǔ)信息等,你有兩個(gè)途徑來實(shí)現(xiàn)...首先是通過普通連接操作數(shù)據(jù)庫,eyeOS提供了多種方法在任何時(shí)候獲取數(shù)據(jù)庫連接。第二種方法是使用GenericDAO,eyeOS的一個(gè)API,允許開發(fā)者像使用一個(gè)對象一樣使用表,而不用擔(dān)心編寫SQL。19.1.GenericDAOGenericDAO,是整個(gè)系統(tǒng)內(nèi)部使用的API。開發(fā)人員也可以使用在他們的應(yīng)用程序中。對于GenericDAO,使用“TransferObject”。一個(gè)TransferObject代表數(shù)據(jù)庫里的一個(gè)表。例如,假設(shè)在數(shù)據(jù)庫中有一個(gè)“users”表,里面有兩個(gè)字段,用戶名和密碼,這個(gè)表的TransferObject如下所示.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論