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

下載本文檔

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

文檔簡介

Goodisgood,butbettercarriesit.

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

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

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

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

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

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

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

15.Metadata[譯者:用數(shù)據(jù)庫存儲時,這玩意的效率慘不忍睹]有很多情況下,您可能需要與對象交換數(shù)據(jù),并在此之后檢索數(shù)據(jù)。例如,如果你有一個由FSI::GETFILE獲得的EyeUserFile對象,你想增加一個等級評定,然后當您再次使用GETFILE時,檢索這個等級評定。這種相關(guān)信息的類型,被稱為元數(shù)據(jù)。eyeOS提供了一個簡化的API,它允許你把key-value(鍵值對)與類的一個實例相關(guān)聯(lián),以便下一次你有這樣的實例,您可以檢索信息。這是用于內(nèi)部的用戶個人數(shù)據(jù),等等……與用戶相關(guān)聯(lián)的元數(shù)據(jù)是一個基本的例子......$user=UMManager::getInstance()->getUserById($userId);$userid是系統(tǒng)中的用戶的ID。這個ID通過UM可以獲得一個eyeUser類型的對象,這個對象代表該ID的用戶?,F(xiàn)在你可以獲取與這用戶對象相關(guān)的元數(shù)據(jù)......$settings=MetaManager::getInstance()->retrieveMeta($user);$settings里面是一個metadataInformation類型的對象,這是一個有g(shù)et和set方法的對象。我們通過下面代碼得到一個元數(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安裝手冊中的步驟之一,是在服務器上安裝OpenOffice。文件轉(zhuǎn)換的API連接到OpenOffice,并使用OpenOffice轉(zhuǎn)換。

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

溫馨提示

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

評論

0/150

提交評論