專利名稱:面向?qū)ο蟮碾娫捪到y(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及電話系統(tǒng),尤其涉及用于將應(yīng)用部件與電話部件接口的系統(tǒng)。
版權(quán)通告本專利申請(qǐng)的某些部分受到版權(quán)保護(hù)。當(dāng)出現(xiàn)在專利與商標(biāo)局專利文件或記錄中時(shí),版權(quán)所有人不反對(duì)任何人對(duì)專利文檔或?qū)@_(kāi)的傳真復(fù)制,除此以外,保留所有一切版權(quán)。
與本發(fā)明相關(guān)的背景技術(shù)當(dāng)前的電話系統(tǒng)是相當(dāng)原始的,相對(duì)早期電話的基本原理而言其變化甚少。早期的系統(tǒng)通常用交換臺(tái)話務(wù)員來(lái)連通呼叫方與被呼叫方。然而,借助于計(jì)算機(jī)技術(shù),只在特殊情況下才需要話務(wù)員提供幫助。
其它技術(shù)進(jìn)步已將電話系統(tǒng)變成了信息傳遞網(wǎng)絡(luò)或數(shù)據(jù)高速公路。傳真便是利用電話系統(tǒng)作為信息傳遞網(wǎng)絡(luò)的許多實(shí)例之一??峙码娫捪到y(tǒng)的最頻繁的使用來(lái)自呼叫方與被呼叫方之間的簡(jiǎn)單語(yǔ)音電話通話。然而這種交互通話只利用了電話系統(tǒng)優(yōu)越功能性的很少一部分。
再者,典型的用戶只擁有為只進(jìn)行實(shí)時(shí)語(yǔ)音傳輸而設(shè)計(jì)的最基本的設(shè)備。然而除了語(yǔ)音以外,電話系統(tǒng)也能傳送其它信息,并且還能提供可以更充分地利用電話系統(tǒng)的可用帶寬與網(wǎng)絡(luò)能力的各種各樣的信息傳遞。
典型的PBX(專用小交換機(jī))便是其功能超過(guò)可利用的發(fā)送手段的技術(shù)的典型實(shí)例。普通用戶只利用了大多數(shù)現(xiàn)代電話系統(tǒng)的全部功能的一小部分。標(biāo)準(zhǔn)的電話手機(jī)是人機(jī)接口的瓶頸。充其量它是以按鈕行為特征的,由于在位置與功能之間沒(méi)有約定的映射,這些按鈕行必須加以標(biāo)記。不幸的是,這些標(biāo)記對(duì)于為了完成給定的操作必須按壓這些按鈕的序列并未給出線索,多功能按鈕(轉(zhuǎn)接/三路會(huì)談)的存在更增加了情況的迷惑性。
雖然電話公司已利用計(jì)算機(jī)技術(shù)來(lái)得益與增進(jìn)電話系統(tǒng)的潛力,單個(gè)用戶尚不能利用其潛力到相同的程度。單個(gè)用戶對(duì)電話系統(tǒng)的潛力的最直接的利用便是遠(yuǎn)程訪問(wèn)與使用電話應(yīng)答機(jī)。
實(shí)際上電話只是一個(gè)原始的終端。與另一終端的連接是通過(guò)拿起接收機(jī)來(lái)發(fā)信號(hào)通知希望網(wǎng)絡(luò)服務(wù)并然后輸入一序列標(biāo)識(shí)終端連接的號(hào)碼而建立的。通過(guò)掛機(jī)來(lái)結(jié)束連接。在建立簡(jiǎn)單連接中這些操作提供方便,但電話系統(tǒng)的其它方面要求用戶留意各種細(xì)節(jié)。
例如,電話號(hào)碼通常是憑人腦記憶或保存在手寫(xiě)記事本中的,這一記事本必須永遠(yuǎn)隨身攜帶。還經(jīng)常使用地址本、索引卡片以及印在便宜的紙上并裝訂成笨重本子的大量表格中,但存儲(chǔ)還只是問(wèn)題的一部分而已。在能使用它們之前,必須從記錄中訪問(wèn)檢索號(hào)碼,查找卡片文件或目錄。并且由于號(hào)碼隨時(shí)間改變,必須周期性地更新。將號(hào)碼電子地存儲(chǔ)在個(gè)人或聯(lián)機(jī)數(shù)據(jù)庫(kù)中能在一定程度上減輕檢索與維護(hù)問(wèn)題,但在定位了號(hào)碼之后仍需要人工將其傳遞給電話機(jī)。
在比建立簡(jiǎn)單的一對(duì)一連接更復(fù)雜的操作的情況中,電話機(jī)也提供不理想的用戶接口。例如在多方交談的情況中,普通用戶需要檢驗(yàn)參考手冊(cè)來(lái)確定使用哪些鍵的序列用“*7”還是“*8”?一種替代方案是提供一種裝有一行或兩個(gè)附加按鈕的特殊電話機(jī),即計(jì)算機(jī)鍵盤(pán)上的功能鍵的電話等價(jià)物,但電話按鈕上的標(biāo)簽通常稍長(zhǎng)“TRNSF”用于通話轉(zhuǎn)接而不是“F6”。
因此,存在著挖掘當(dāng)前的電話系統(tǒng)的潛力的要求,尤其是系統(tǒng)的信息傳輸與網(wǎng)絡(luò)功能。
本發(fā)明的目的因此,本發(fā)明的一個(gè)目的是提供對(duì)電話部件的訪問(wèn)進(jìn)行的改進(jìn)。
本發(fā)明的另一目的是將計(jì)算機(jī)技術(shù)應(yīng)用在電話系統(tǒng)上。
本發(fā)明的又另一目的是提供電話系統(tǒng)部件與應(yīng)用部件之間的一種接口。
本發(fā)明的又一目的是使電話世界與通用聲音世界之間的邊界平滑無(wú)隙。本發(fā)明的技術(shù)方案上述目的是通過(guò)提供與各種電話系統(tǒng)部件靈活接口的部件而實(shí)現(xiàn)的。這些接口部件通常并不取代電話系統(tǒng)部件,而是提供與特定電話系統(tǒng)部件的透明的接口方法。將接口部件設(shè)計(jì)成與電話系統(tǒng)的特定部件接口,而與電話系統(tǒng)的電話系統(tǒng)部件是硬件部件或者只是協(xié)議無(wú)關(guān)。例如,一種接口部件可能提供接收一次通話,并通知一次通話正在等待的一個(gè)應(yīng)用部件的簡(jiǎn)單接口。
根據(jù)本發(fā)明的電話裝置包括一個(gè)處理器;連接在該處理器上并受其控制的一個(gè)存儲(chǔ)器;位于該存儲(chǔ)器中并控制該處理器的操作的一個(gè)面向?qū)ο蟮牟僮飨到y(tǒng);連接在該面向?qū)ο蟮牟僮飨到y(tǒng)控制下的處理器上的一個(gè)顯示器;連接在該處理器上的一個(gè)電話部件;存儲(chǔ)在該存儲(chǔ)器中并顯示在該顯示器上并用于表示在該面向?qū)ο蟮牟僮飨到y(tǒng)的控制下的電話部件的一個(gè)電話對(duì)象;以及用于由面向?qū)ο蟮牟僮飨到y(tǒng)利用該電話對(duì)象控制該電話部件的裝置。
一種根據(jù)本發(fā)明用于在一個(gè)計(jì)算機(jī)系統(tǒng)上啟動(dòng)電話部件的方法,該計(jì)算機(jī)系統(tǒng)包括一個(gè)處理器,該處理器具有與之連接的一個(gè)存儲(chǔ)器,一個(gè)顯示器,以及一個(gè)電話部件,該方法包括用位于該存儲(chǔ)器中的一個(gè)面向?qū)ο蟮牟僮飨到y(tǒng)控制該處理器的操作;建立一個(gè)電話對(duì)象,該電話對(duì)象存儲(chǔ)在該存儲(chǔ)器中并顯示在該顯示器上,并用于代表在該面向?qū)ο蟮牟僮飨到y(tǒng)的控制下的電話部件;以及由該面向?qū)ο蟮牟僮飨到y(tǒng)利用該電話對(duì)象控制該電話部件。本發(fā)明的有益效果接口部件提供一種靈活與方便的方法,其中,開(kāi)發(fā)涉及電話的應(yīng)用程序員能利用電話系統(tǒng)特征而無(wú)須考慮如何對(duì)一種特定的電話系統(tǒng)訪問(wèn)該特征的細(xì)節(jié)。接口部件對(duì)于電話設(shè)備的硬件設(shè)計(jì)人員也是有用的?;谟?jì)算機(jī)的電話具有消除電話機(jī)的限制的潛力,同時(shí)提供基于電話的通信與在桌面計(jì)算機(jī)上運(yùn)行的應(yīng)用程序的緊密合作。系統(tǒng)基礎(chǔ)的主要部分要求能夠?qū)崿F(xiàn)遠(yuǎn)程和實(shí)時(shí)協(xié)作。
本發(fā)明允許應(yīng)用使用目標(biāo)機(jī)上可以利用的任何內(nèi)部電話硬件并提供經(jīng)由調(diào)制解調(diào)器或其它外部硬件設(shè)備的通用撥號(hào)功能。
在一個(gè)最佳實(shí)施例中,一個(gè)面向?qū)ο蟮牟僮飨到y(tǒng)是基于計(jì)算機(jī)的電話應(yīng)用的主要部件。
從下面用附圖考察的詳細(xì)描述中,本發(fā)明的其它目的與優(yōu)點(diǎn)將是顯而易見(jiàn)的。
附圖的簡(jiǎn)要說(shuō)明
圖1示出根據(jù)一個(gè)最佳實(shí)施例的代表性系統(tǒng);圖2示出根據(jù)一個(gè)最佳實(shí)施例的手機(jī)與墻壁插座的典型連接;圖3示出根據(jù)一個(gè)最佳實(shí)施例的連接在多條線路與多個(gè)插座上的手機(jī);圖4示出根據(jù)一個(gè)最佳實(shí)施例的利用調(diào)制解調(diào)器的基于計(jì)算機(jī)的電話系統(tǒng);圖5示出根據(jù)一個(gè)最佳實(shí)施例的在手機(jī)與插座之間插入一臺(tái)計(jì)算機(jī)的基于計(jì)算機(jī)的電話系統(tǒng);圖6示出根據(jù)一個(gè)最佳實(shí)施例的硬件;圖7示出根據(jù)一個(gè)最佳實(shí)施例的一個(gè)TTelephoneLineHandle對(duì)象的示例;圖8示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneLineHandle的功能特征;圖9示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneCallHandle(電話通話管理)的示例;圖10示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneCallHandle的功能特征;圖11示出根據(jù)一個(gè)最佳實(shí)施例建立一種關(guān)心事物(interest)的應(yīng)用;圖12示出根據(jù)一個(gè)最佳實(shí)施例的發(fā)送信息的電話系統(tǒng);圖13示出根據(jù)一個(gè)最佳實(shí)施例的聲音文件的播放;圖14示出根據(jù)一個(gè)最佳實(shí)施例的與TTelephoneLineHandle(電話線路管理)交互作用來(lái)執(zhí)行各種電話業(yè)務(wù)的應(yīng)用;圖15示出根據(jù)一個(gè)最佳實(shí)施例的配置數(shù)據(jù);
圖16示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneLineHandle的功能;圖17示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneLineFeatureControl(電話線路特征控制)的功能;圖18示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneHandsetHandle(電話手機(jī)管理)的功能;圖19示出根據(jù)一個(gè)最佳實(shí)施例的TInterest(關(guān)心事物)子類;圖20示出根據(jù)一個(gè)最佳實(shí)施例的TNotification(通知)子類;圖21示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneLine(電話線路)的功能特征;圖22示出根據(jù)一個(gè)最佳實(shí)施例的電話設(shè)備的設(shè)計(jì)人員的開(kāi)發(fā)周期;圖23示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneLine的功能特征;圖24示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneLineHandset(電話線路手機(jī))的功能特征;圖25示出根據(jù)一個(gè)最佳實(shí)施例的TTelephoneLineFeature的功能特征。
本發(fā)明的最佳實(shí)施例這里公開(kāi)了本發(fā)明的詳細(xì)實(shí)施例,但應(yīng)理解,所公開(kāi)的實(shí)施例只是本發(fā)明的示范,它們可以以各種形式實(shí)現(xiàn)。因此這里公開(kāi)的細(xì)節(jié)不應(yīng)理解為一種限制,而只是作為權(quán)利要求書(shū)的基礎(chǔ),及作為向熟悉本技術(shù)的人員教導(dǎo)如何作出與/或使用本發(fā)明的基礎(chǔ)。
這里所使用的“電話系統(tǒng)”包括電話通信的所有方面。
電話標(biāo)準(zhǔn)網(wǎng)絡(luò)歷史上,已在逐個(gè)國(guó)家的基礎(chǔ)上制訂了網(wǎng)絡(luò)標(biāo)準(zhǔn)。在許多情況下,它們是有相當(dāng)大的變化的,從而導(dǎo)致局域化的惡夢(mèng),尤其在歐洲。由于諸如ISDN(綜合業(yè)務(wù)數(shù)字網(wǎng)絡(luò))等數(shù)字標(biāo)準(zhǔn)的出現(xiàn)以及1992年歐洲共同體的成立,這一情況在不久的將來(lái)有望改善。在美國(guó),快速地走向ISDN的動(dòng)力不夠大,應(yīng)此,在未來(lái)一段時(shí)間內(nèi),很可能模擬網(wǎng)絡(luò)和數(shù)字網(wǎng)絡(luò)互相競(jìng)爭(zhēng)。
在模擬領(lǐng)域內(nèi),電話功能的計(jì)算機(jī)控制通常是經(jīng)由調(diào)制解調(diào)器完成的。(注意調(diào)制解調(diào)器不一定是一種外部硬件。RISC(精簡(jiǎn)指令集計(jì)算機(jī))及基于芯片的數(shù)字信號(hào)處理技術(shù)使得全功能內(nèi)部軟件調(diào)制解調(diào)器的實(shí)現(xiàn)成為可能。)一種計(jì)算機(jī)到調(diào)制解調(diào)器通信的廣為流傳的事實(shí)上的標(biāo)準(zhǔn)為原先由Hayes公司定義的所謂“AT”命令集。
在數(shù)字領(lǐng)域內(nèi),已由CCITT(國(guó)際電報(bào)與電話咨詢委員會(huì))的一個(gè)多國(guó)工作組開(kāi)發(fā)出ISDN標(biāo)準(zhǔn)。在CCITT建議Q.931中定義了建立與拆除連接的ISDN網(wǎng)絡(luò)層協(xié)議。(ISDN還包括物理與數(shù)據(jù)鏈路層以及高層管理實(shí)體的規(guī)程)。開(kāi)關(guān)在電話網(wǎng)絡(luò)與電話手機(jī)之間存在著某種類型的一個(gè)開(kāi)關(guān),它將一個(gè)特定的分機(jī)連接在網(wǎng)絡(luò)上。在商用市場(chǎng)上,這一開(kāi)關(guān)很可能是一臺(tái)PBX(用戶交換機(jī))。除提供通過(guò)網(wǎng)絡(luò)的簡(jiǎn)單連接之外,開(kāi)關(guān)通常提供各式各樣的所謂補(bǔ)充服務(wù),諸如暫時(shí)中斷并占線等候,轉(zhuǎn)接,與多方交談。使用這些服務(wù)的協(xié)議不但變化多端,而且在歷史上已為各開(kāi)關(guān)制造商所專有。雖然Q.931中的ISDN網(wǎng)絡(luò)層規(guī)程并不建議補(bǔ)充特征,但在特征選擇及用于實(shí)現(xiàn)一種給定的特征的報(bào)文的實(shí)際序列中仍留有相當(dāng)大的活動(dòng)余地。音頻數(shù)據(jù)格式取決于網(wǎng)絡(luò)的類型及計(jì)算機(jī)與電話網(wǎng)絡(luò)之間的接口,有可能從電話線上錄出音頻數(shù)據(jù)以供計(jì)算機(jī)存儲(chǔ)與播放。在模擬數(shù)據(jù)的情況中,必須設(shè)置一條模/數(shù)轉(zhuǎn)換服務(wù)的通路,然后用對(duì)一個(gè)給定的設(shè)計(jì)中心有效的任何內(nèi)部標(biāo)準(zhǔn)表示該數(shù)據(jù)。在數(shù)字?jǐn)?shù)據(jù)的情況中,出現(xiàn)了外部標(biāo)準(zhǔn)問(wèn)題。CCITT已經(jīng)定義了與每秒64,000位傳輸率的ISDNB信道兼容的若干數(shù)據(jù)格式標(biāo)準(zhǔn)。存在著利用全部可用帶寬的未壓縮語(yǔ)音信號(hào)的兩種標(biāo)準(zhǔn)。它們都基于對(duì)數(shù)壓擴(kuò)的PCM(脈沖碼調(diào)制)。在第一種情況中,它是北美的主要格式,對(duì)數(shù)壓擴(kuò)是由μ律函數(shù)提供的,而第二種格式主要為歐洲采用,所使用的是A律函數(shù)。每一格式假定8KHZ的取樣率并為每一取樣分配8位,從而提供3.5KHZ的有效信號(hào)帶寬。
一方面CCITT采用了若干種音頻壓縮標(biāo)準(zhǔn),而另一方面數(shù)字蜂窩工業(yè)則采用若干標(biāo)準(zhǔn)。面向?qū)ο蟮木幊淘谝粋€(gè)最佳實(shí)施例中,本發(fā)明是用面向?qū)ο蟮木幊碳夹g(shù)在C++編程語(yǔ)言中實(shí)現(xiàn)的。正如熟悉本技術(shù)的人員所理解的,面向?qū)ο蟮木幊?OOP)的對(duì)象為包括數(shù)據(jù)結(jié)構(gòu)及在這些數(shù)據(jù)上運(yùn)算的軟件實(shí)體。同時(shí),這些元素使對(duì)象能根據(jù)由其數(shù)據(jù)元素所特征化及由其數(shù)據(jù)操作函數(shù)所表示的狀態(tài)來(lái)塑造任何現(xiàn)實(shí)世界的實(shí)體。以這一方式,對(duì)象能夠塑造象人與計(jì)算機(jī)等具體事物的模型,也能塑造象數(shù)或幾何概念等抽樣概念的模型。對(duì)象技術(shù)的好處來(lái)自三種基本原理封裝,多形性,及繼承性。
對(duì)象隱蔽或封裝它們的數(shù)據(jù)的內(nèi)部結(jié)構(gòu)以及其功能據(jù)其用于工作的算法。不暴露這些實(shí)現(xiàn)的細(xì)節(jié),對(duì)象提供簡(jiǎn)潔地表示它們的抽象的接口而無(wú)額外的信息。多形又將封裝向前推進(jìn)了一步。這一觀念是多種狀態(tài),一個(gè)接口。一個(gè)軟件部件能請(qǐng)求另一部件而不必確切知道該部件是什么。接收請(qǐng)求的部件中斷它并根據(jù)其變量與數(shù)據(jù)計(jì)算出如何執(zhí)行該請(qǐng)求。第三種原理為繼承,它容許開(kāi)發(fā)人員重復(fù)使用先前存在的設(shè)計(jì)與代碼。這一能力使開(kāi)發(fā)人員能夠避免從草案開(kāi)始建立軟件。而通過(guò)繼承,開(kāi)發(fā)人員導(dǎo)出繼承行為的子類,然后開(kāi)發(fā)人員將其定制以符合他們的特殊要求。
先有技術(shù)方法為在過(guò)程環(huán)境中分層對(duì)象與類庫(kù)。上市的許多應(yīng)用框架(framework)采取這一設(shè)計(jì)方法。在這一設(shè)計(jì)中,在一個(gè)整體操作系統(tǒng)的上面有一個(gè)或多個(gè)對(duì)象層。雖然這種方法在對(duì)象層中利用了全部封裝,多形性,和繼承性原理并且是對(duì)過(guò)程編程技術(shù)的實(shí)質(zhì)改進(jìn),但這一方法存在相當(dāng)限制。這些困難起源于這一事實(shí),即開(kāi)發(fā)人員容易重新使用他們自己的對(duì)象,但難于使用來(lái)自其它系統(tǒng)的對(duì)象,而開(kāi)發(fā)人員仍需要用過(guò)程操作系統(tǒng)(OS)調(diào)用來(lái)進(jìn)入較低的非對(duì)象層。
面向?qū)ο蟮木幊痰牧硪环矫鏋閷?duì)應(yīng)用開(kāi)發(fā)的一種框架方法。最合理的框架定義之一來(lái)自Illinois大學(xué)的Ralph E.Johnson及Purdue的Vincent F.Russo。在1991年的論文,“重復(fù)使用面向?qū)ο蟮脑O(shè)計(jì)”,Illinois大學(xué)技術(shù)報(bào)告UTUCDCS91-1696中,他們提出下述定義“一個(gè)抽象類是合作完成一組任務(wù)的組對(duì)象的設(shè)計(jì)。從而,一個(gè)框架是合作執(zhí)行定義的計(jì)算任務(wù)組的一組對(duì)象類。”從編程觀點(diǎn)上,框架主要是提供預(yù)制的工作應(yīng)用的結(jié)構(gòu)的互相聯(lián)系的對(duì)象類的群。例如,用戶接口框架可能提供繪圖窗口,卷動(dòng)條,菜單等的支持與“系統(tǒng)預(yù)置”特性。由于框架是基于對(duì)象技術(shù)的,這一表現(xiàn)能被繼承與替換,以便開(kāi)發(fā)人員能擴(kuò)展該框架并在特定的專門(mén)技術(shù)領(lǐng)域內(nèi)建立定制的解決方法。由于程序員無(wú)須改變?cè)瓉?lái)的代碼,而只是擴(kuò)展軟件,所以這與傳統(tǒng)的編程相比較是一個(gè)主要的優(yōu)點(diǎn)。此外,開(kāi)發(fā)人員并不盲目地通過(guò)代碼層工作,因?yàn)榭蚣芴峁w系結(jié)構(gòu)指導(dǎo)與模型塑造,而同時(shí)又允許它們自由地提供對(duì)問(wèn)題域獨(dú)有的特定作用。
從商業(yè)觀點(diǎn)上看,可將框架看成是封裝或體現(xiàn)一個(gè)特定的知識(shí)領(lǐng)域內(nèi)的專門(mén)知識(shí)的一種方法。合作開(kāi)發(fā)組織,獨(dú)立軟件經(jīng)銷商(ISV),及系統(tǒng)綜合人員已在諸如制造,會(huì)計(jì),或貨幣交易等特定領(lǐng)域中得到專門(mén)知識(shí),如上述實(shí)例中。這種專門(mén)知識(shí)是用它們的代碼體現(xiàn)的??蚣芡ㄟ^(guò)在組織的代碼中體現(xiàn)它而使組織能捕捉與包裝該專門(mén)知識(shí)的共同特征。首先,這允許開(kāi)發(fā)人員建立或擴(kuò)展利用該專門(mén)知識(shí)的應(yīng)用,從而問(wèn)題一旦得到解決,便能經(jīng)常性地執(zhí)行與使用這些商業(yè)規(guī)則與設(shè)計(jì)。同時(shí),框架及框架背后所體現(xiàn)的專門(mén)知識(shí)對(duì)于已在諸如制造,會(huì)計(jì),生物技術(shù)等垂直市場(chǎng)中的專門(mén)知識(shí)的組織具有一種戰(zhàn)略性資產(chǎn)的意義,并且提供了一種包裝,轉(zhuǎn)賣,及開(kāi)發(fā)它們的專門(mén)知識(shí)的分配機(jī)制并促進(jìn)技術(shù)的提高與普及。
歷史上,框架是最近才作為個(gè)人計(jì)算平臺(tái)上的主流概念出現(xiàn)的。這一出現(xiàn)已受到諸如C++等面向?qū)ο蟮恼Z(yǔ)言的可利用性的協(xié)助。傳統(tǒng)上,C++絕大部分出現(xiàn)在UNIX系統(tǒng)及研究工作者的工作站上,而不是在商業(yè)安裝的個(gè)人計(jì)算機(jī)上。這便是諸如C++和諸如Smalltalk等其它面向?qū)ο蟮恼Z(yǔ)言使得一些大學(xué)及科研項(xiàng)目產(chǎn)生今天的商業(yè)框架及類庫(kù)的前身。其中的一些實(shí)例為來(lái)自Stanford大學(xué)的InterViews,來(lái)自Carnegie-Mellon大學(xué)的Andrew工具箱及Zurich大學(xué)的ET++框架。
取決于所關(guān)心的是系統(tǒng)的哪一級(jí)及試圖解決的是哪一類問(wèn)題而存在許多種框架??蚣茴愋偷姆秶鷱膮f(xié)助開(kāi)發(fā)用戶接口的應(yīng)用框架到提供諸如通信,印刷,文件系統(tǒng)支持,圖形等基本系統(tǒng)軟件服務(wù)的低級(jí)框架。應(yīng)用框架的商業(yè)實(shí)例可包括MacApp(蘋(píng)果),Bedrock(Symantec),OWL(Borland),NeXTStep App Kit(NeXT)及Smalltalk-80MVC(ParcPlace)幾種。
對(duì)于習(xí)慣于其它種類的系統(tǒng)的開(kāi)發(fā)人員而言,用框架編程需要一種新的思維方式。事實(shí)上,它完全不像傳統(tǒng)意義上的“編程”。在諸如DOS或UNIX等老式操作系統(tǒng)中,開(kāi)發(fā)人員本人的程序提供所有的結(jié)構(gòu)。操作系統(tǒng)通過(guò)系統(tǒng)調(diào)用提供服務(wù),開(kāi)發(fā)人員的程序在它需要服務(wù)時(shí)作出調(diào)用而在提供完服務(wù)時(shí)返回控制。程序結(jié)構(gòu)基于體現(xiàn)在開(kāi)發(fā)人員編寫(xiě)的代碼中的控制流程。
在使用框架時(shí),這是顛倒的。開(kāi)發(fā)人員不再負(fù)責(zé)控制流程。開(kāi)發(fā)人員必須摒棄用執(zhí)行流程表示的理解編程任務(wù)的趨勢(shì)。而代之以思維必須以對(duì)象的任務(wù)來(lái)表示,它必須依靠框架來(lái)確定何時(shí)應(yīng)執(zhí)行這些任務(wù)。開(kāi)發(fā)人員編寫(xiě)的例程是由不是開(kāi)發(fā)人員編寫(xiě)的并且開(kāi)發(fā)人員從未見(jiàn)過(guò)的代碼激活的。對(duì)于只習(xí)慣于過(guò)程型編程的開(kāi)發(fā)人員,控制流程中的這一轉(zhuǎn)變可能成為明顯的心理障礙。然而,一旦理解了這一點(diǎn),框架編程比其它種類的編程需要的工作量少得多。
本發(fā)明最好在諸如IBM_PS/2_,或Apple_Macintosh_計(jì)算機(jī)等個(gè)人計(jì)算機(jī)上常駐的操作系統(tǒng)的環(huán)境中實(shí)現(xiàn)。
圖1中描繪了代表性的硬件環(huán)境,它例示了根據(jù)本發(fā)明的具有一個(gè)諸如傳統(tǒng)的微處理器的中央處理單元100及若干經(jīng)由一條系統(tǒng)總線132連至其它單元的一臺(tái)計(jì)算機(jī)的典型硬件配置。圖1中所示的計(jì)算機(jī)包括一個(gè)只讀存儲(chǔ)器(ROM)104,一個(gè)隨機(jī)存取存儲(chǔ)器(RAM)106,一個(gè)用于將諸如軟盤(pán)單元108及用110表示的其它I/O外圍設(shè)備連接在系統(tǒng)總線132上的I/O適配器112,一個(gè)用于將鍵盤(pán)130,鼠標(biāo)器126,揚(yáng)聲器122,麥克風(fēng)124,和/或諸如觸屏設(shè)備(未示出)等其它用戶接口設(shè)備連接在總線上的用戶接口適配器128,以及一個(gè)用于將工作站連接在用114表示的一個(gè)數(shù)據(jù)處理網(wǎng)絡(luò)上的通信適配器116。一個(gè)顯示器適配器120將總線連接在顯示設(shè)備118上。工作站上常駐有諸如Apple_系統(tǒng)/7_操作系統(tǒng)之類的操作系統(tǒng)。
基于計(jì)算機(jī)的電話應(yīng)用取決于它們的基本要求,基于計(jì)算機(jī)的電話的面向語(yǔ)音的應(yīng)用分成三類1)依靠電話特征的軟件控制而無(wú)捕捉或使用語(yǔ)音信號(hào)的設(shè)備的應(yīng)用2)需要錄制與播放語(yǔ)音數(shù)據(jù)的應(yīng)用;以及3)同時(shí)承擔(dān)語(yǔ)音與非語(yǔ)音數(shù)據(jù)傳輸?shù)膽?yīng)用。
近年來(lái),已設(shè)計(jì)出各種各樣的設(shè)備來(lái)使電話更有用。其中許多涉及計(jì)算機(jī)控制的電話。虛擬電話機(jī)這類應(yīng)用直接訪問(wèn)高級(jí)電話系統(tǒng)的版本,這種高級(jí)電話系統(tǒng)如此復(fù)雜,以致只有不到10%的用戶可以利用它的全部潛能。這些系統(tǒng)的基本問(wèn)題是必須處理普通電話手機(jī)是具有非常低的接口帶寬的設(shè)備這一事實(shí)。加在電話系統(tǒng)上的每一種新的特征導(dǎo)致手機(jī)上的一個(gè)新的按鈕(或者,在MS-DOS的陰影下,要記住另一個(gè)特殊的號(hào)碼序列“*3”對(duì)轉(zhuǎn)接,“*5”對(duì)轉(zhuǎn)交)。
來(lái)自桌面上的這些功能的軟件控制結(jié)合設(shè)計(jì)完善的圖形用戶接口將幫助終端用戶繞過(guò)他們的本地PBX的神秘特性而使他們開(kāi)始從自AlexanderGraham Bell的日子以來(lái)電話設(shè)備制造商設(shè)法達(dá)到的技術(shù)進(jìn)步中得益。這一概念的一個(gè)很好的實(shí)例便是北方電訊的Meridian TeleCenter,它運(yùn)行在當(dāng)前的Macintosh_上,但當(dāng)然只與北方電訊自己的PBX一起工作。電話銷售在其最簡(jiǎn)單的形式中,計(jì)算機(jī)控制的電話銷售工具只允許從一個(gè)電話號(hào)碼的數(shù)據(jù)庫(kù)中自動(dòng)撥號(hào)。較完善的改型可在多條線路上撥號(hào)并檢測(cè)何時(shí)有人在連接的另一端上應(yīng)答,或者在屏幕上提供各被撥號(hào)方的詳細(xì)客戶信息。
語(yǔ)音I/O桌面應(yīng)答機(jī)這里的概念是為了將其提高到己能從文字郵件系統(tǒng)所期望的功能水平而將語(yǔ)音郵件放置在桌面計(jì)算機(jī)。今天的典型語(yǔ)音郵件系統(tǒng)是與其它形式的電子通信平行并完全隔離的集中服務(wù)。
即使它們是能夠得到的,諸如成組尋址與聯(lián)機(jī)目錄等特征也很難通過(guò)標(biāo)準(zhǔn)按鈕電話機(jī)使用,并且即使它們包含重復(fù)的信息也必須與電子郵件數(shù)據(jù)庫(kù)分開(kāi)建立與維護(hù)。呼叫進(jìn)來(lái)檢驗(yàn)自己的語(yǔ)音信箱只是通過(guò)辦公室與家里的信息流中又一種不必要的彎路。本年代的語(yǔ)音郵件系統(tǒng)與七十年代的集中計(jì)算機(jī)系統(tǒng)相類似。
把語(yǔ)音通訊聯(lián)系與桌面計(jì)算機(jī)結(jié)合將極大地改進(jìn)當(dāng)前剛成為廣泛可利用的現(xiàn)有電話服務(wù)。例如,接受方檢驗(yàn)進(jìn)入的呼叫方的電話號(hào)碼的能力(所謂呼叫方識(shí)別)將允許用戶在其他事件中確定針對(duì)個(gè)人的問(wèn)候詞。例如,如果我正在等待來(lái)自我的兄弟John的一個(gè)重要電話并且我知道他呼叫我時(shí)我可能不在,我便能錄制一則報(bào)文,當(dāng)我的計(jì)算機(jī)應(yīng)答來(lái)自列在我的電子地址本中的他的電話號(hào)碼之一的任何呼叫時(shí)而予播放。
在一個(gè)通話的接收端上連有一臺(tái)計(jì)算機(jī)可以在一旦錄制了報(bào)文時(shí)提高處理報(bào)文的潛力。如果僅有的終端只是一臺(tái)按鈕手機(jī),則顯然毫無(wú)可能對(duì)任何音步頻數(shù)據(jù)進(jìn)行編輯。在語(yǔ)音數(shù)據(jù)傳輸中增加了數(shù)字格式的使用(如ISDN),不在音頻信號(hào)流過(guò)時(shí)設(shè)置捕捉它的設(shè)備便是極大的浪費(fèi)。遠(yuǎn)程訪問(wèn)為了從家里訪問(wèn)辦公室的計(jì)算機(jī)系統(tǒng),所需要的只是一條電話線,一臺(tái)調(diào)制解調(diào)器,及另一臺(tái)計(jì)算機(jī)。如果你到了機(jī)場(chǎng)但是你想起忘記帶了你要訪問(wèn)的客戶的地址,你將怎么辦?如果你到達(dá)了目的地發(fā)現(xiàn)航空公司丟失了你的調(diào)制解調(diào)器連同你其它的行李時(shí),你將怎么辦?如果你買不起第二臺(tái)計(jì)算機(jī),你將怎么辦?這時(shí)你需要能夠從一臺(tái)標(biāo)準(zhǔn)電話機(jī)撥通你的辦公室系統(tǒng)并通過(guò)要求計(jì)算機(jī)以讀給你聽(tīng)的方式而訪問(wèn)存儲(chǔ)在你的硬盤(pán)上的信息。你還需要在你的辦公室機(jī)器上有文本到語(yǔ)音的合成軟件以及用DTMF(雙音調(diào)多頻率)鍵或語(yǔ)音命令(即自動(dòng)語(yǔ)言識(shí)別)來(lái)控制桌面極算機(jī)的方法。交互式語(yǔ)音應(yīng)答這一術(shù)語(yǔ)復(fù)蓋允許遠(yuǎn)程呼叫者聽(tīng)取從事先錄制的報(bào)文的集合中選擇的報(bào)文的大范圍應(yīng)用。這些應(yīng)用可以是單純專用于信息發(fā)布(諸如IRS的Teletax服務(wù)),或者它們可綜合信息交互作用業(yè)務(wù)處理(諸如,郵購(gòu)目錄的定購(gòu)單輸入服務(wù),或者允許存款人檢查帳戶余額,資金轉(zhuǎn)帳,以及進(jìn)行借款支付的電話銀行服務(wù))。
傳統(tǒng)上,即使將一個(gè)直觀的信息發(fā)布系統(tǒng)組合在一起也需要程序員及系統(tǒng)綜合人員的專業(yè)化隊(duì)伍。至少一個(gè)提供這種服務(wù)的第三方已在Macintosh_上開(kāi)發(fā)了一種面向圖形的工具用于生成一組控制文件,然后將其上裝到一個(gè)獨(dú)立的語(yǔ)音應(yīng)答系統(tǒng)。語(yǔ)音布告板服務(wù)這是熟悉的電子BBS的一種語(yǔ)音中介版本。它實(shí)際上是語(yǔ)音郵件與交互式語(yǔ)音應(yīng)答的混合物。呼叫者瀏覽其它呼叫者留下的各種語(yǔ)音報(bào)文,隨后錄制他們自己的應(yīng)答報(bào)文。
同時(shí)的語(yǔ)音與數(shù)據(jù)合作電話服務(wù)在合作中扮演的角色當(dāng)然取決于我們所討論的合作類型。平淡無(wú)奇的語(yǔ)音郵件可包含在順序的異步合作中(諸如書(shū)評(píng)人接收文件的拷貝,私下閱讀該拷貝,并用語(yǔ)音報(bào)文應(yīng)答)。同時(shí)的異步合作包含對(duì)文件的作者發(fā)出一次呼叫(從附在文件上的“名片”對(duì)象上自動(dòng)抽取電話號(hào)碼),從而當(dāng)作者正在顯示該文件的一個(gè)獨(dú)立拷貝時(shí)書(shū)評(píng)作者能發(fā)布個(gè)人評(píng)論。第三種合作是同時(shí)的實(shí)時(shí)合作方式CHER,其中,一份文件同時(shí)由作者與書(shū)評(píng)者更新。在最后一種合作中,組員之間交互作用的增進(jìn)程度無(wú)疑是與他們之間物理上互相靠近程度成反比變化的。這便是電話在地理上分散的工作組之間的遠(yuǎn)程合作中起作用的情況?;靖拍钍窃谝粭l數(shù)據(jù)連接線上傳輸與接收文件更新的同時(shí),保持標(biāo)準(zhǔn)的語(yǔ)音聯(lián)系。這種交互作用可在兩條標(biāo)準(zhǔn)電話線上或一條單一的ISDN連接線上進(jìn)行。廉價(jià)可視電話同時(shí)的語(yǔ)音與數(shù)據(jù)傳輸?shù)牧硪环N有趣的應(yīng)用涉及采用一臺(tái)廉價(jià)的攝象機(jī)連同一個(gè)視頻數(shù)字化器卡將一條標(biāo)準(zhǔn)的ISDN連接線變換成低收入人員的可視電話。換言之,通過(guò)把顯示通話人的面部和/或抓攝到的舉到攝象機(jī)前面的物體的視頻幀進(jìn)行周期性的雙向傳輸,可以增強(qiáng)語(yǔ)音連接。即使幀速率極低時(shí),最后的結(jié)果也是相當(dāng)有趣的。
本發(fā)明是設(shè)計(jì)成使應(yīng)用編寫(xiě)人員有能力在全部三個(gè)領(lǐng)域內(nèi)創(chuàng)建新的里程碑。
電話對(duì)象本發(fā)明設(shè)計(jì)用于實(shí)現(xiàn)基于計(jì)算機(jī)的電話應(yīng)用的開(kāi)發(fā),并允許電話設(shè)計(jì)人員利用這些新開(kāi)發(fā)的應(yīng)用。通過(guò)拿起受話器來(lái)發(fā)信號(hào)通知要求網(wǎng)絡(luò)服務(wù),電話本質(zhì)上是用于建立對(duì)另一終端的聯(lián)系的一個(gè)原始終端。然后輸入標(biāo)識(shí)你要連接的終端的一序列號(hào)碼。通過(guò)掛機(jī)來(lái)切斷連接。本發(fā)明通過(guò)提供一個(gè)面向語(yǔ)音的電話功能的高級(jí)接口來(lái)支持基于計(jì)算機(jī)的電話。這些功能包含通常的電話配置中的性能的“最小公分母”。本發(fā)明旨在將應(yīng)用級(jí)代碼與通過(guò)它們對(duì)這些功能進(jìn)行訪問(wèn)的設(shè)備之間的差別分隔開(kāi)。同時(shí),本發(fā)明提供一個(gè)靈活的框架,能容易地將它擴(kuò)展成包含新的特征或提供電話機(jī),本地硬件與軟件平臺(tái),網(wǎng)絡(luò)類型,以及開(kāi)關(guān)信令協(xié)議的各種組合的特征。
當(dāng)提供了這樣一種靈活的接口框架時(shí),許多應(yīng)用程序編寫(xiě)人員將利用這一接口的可用性來(lái)開(kāi)發(fā)軟件。依次,電話系統(tǒng)設(shè)計(jì)人員要求利用新的應(yīng)用部件,因此也需要接口部件進(jìn)行工作。因此,討論兩種對(duì)象是有用的一方面是應(yīng)用編寫(xiě)人員的對(duì)象,另一方面是對(duì)基本接口的擴(kuò)展的開(kāi)發(fā)人員的對(duì)象。通常,應(yīng)用開(kāi)發(fā)人員感興趣的對(duì)象也是電話系統(tǒng)開(kāi)發(fā)人員所感興趣的。各種類型將在下面討論。但是應(yīng)記住下面的標(biāo)題僅用于討論的目的,無(wú)論如何不應(yīng)認(rèn)為是限制性的。I.應(yīng)用開(kāi)發(fā)人員的對(duì)象電話系統(tǒng)由許多對(duì)接口有用的部件構(gòu)成。通常存在著兩類這些部件。第一類包含用于實(shí)現(xiàn)電話系統(tǒng)的物理設(shè)備,而第二類則包含由電話系統(tǒng)處理的業(yè)務(wù)。下面將討論各類的對(duì)象,并將提供概述接口部件的可能類型的實(shí)例。
A.硬件類型部件的對(duì)象從應(yīng)用編程人員的觀點(diǎn),本發(fā)明方便了基于計(jì)算機(jī)的電話應(yīng)用的簡(jiǎn)單與直觀的用戶接口的實(shí)現(xiàn)。對(duì)象的硬件獨(dú)立性允許一個(gè)應(yīng)用程序運(yùn)行,而與連接在計(jì)算機(jī)上的電話系統(tǒng)或當(dāng)前最終用戶所能利用的電話特征無(wú)關(guān)。標(biāo)準(zhǔn)協(xié)議使應(yīng)用一開(kāi)始就能判定它所知道的有關(guān)特征中哪些是有效的而哪些是無(wú)效的。
圖2示出最終用戶最熟悉的現(xiàn)實(shí)世界電話對(duì)象插入一個(gè)墻上插座204以連接在一條電話線202上的單線電話手機(jī)200。事實(shí)上,在墻上插座背后有并未由普通用戶所意識(shí)到的線路,光纖,開(kāi)關(guān),和總局等的龐大“網(wǎng)絡(luò)景色(netscape)”。重要的是現(xiàn)在可通過(guò)一個(gè)特定的手機(jī)訪問(wèn)一條特定的線路202。然而手機(jī)與線路之間的對(duì)應(yīng)并不一定是一對(duì)一的。
單一的電話線路可分成若干分機(jī),各帶有其本身的手機(jī)(未示出)或者如圖3所示,一個(gè)單一的手機(jī)300可提供對(duì)若干條線路302的順序訪問(wèn),各條線路連接在獨(dú)立的插座304上。前一情況是典型的住宅裝機(jī)。反之,多線路手機(jī)可由小型商家或?yàn)槿齻€(gè)總裁工作的行政助理所用。通常,用戶通過(guò)按下手機(jī)300上某處的一個(gè)帶標(biāo)記的按鈕而選擇一條線路。
圖2與圖3沒(méi)有標(biāo)識(shí)為先有技術(shù),因?yàn)槭謾C(jī)200可以實(shí)現(xiàn)成包含本發(fā)明的特征。
圖4表示實(shí)現(xiàn)根據(jù)本發(fā)明的基于計(jì)算機(jī)的電話的一種可能的系統(tǒng)。在基于計(jì)算機(jī)的電話所需的實(shí)際電話設(shè)備配置中,電話線404不連接在手機(jī)400上,而是通過(guò)諸如調(diào)制解調(diào)器408等外部設(shè)備的媒介而連接到計(jì)算機(jī)412上。線路410將計(jì)算機(jī)412連接在調(diào)制解調(diào)器408上,而線路404則將調(diào)制解調(diào)器408連接在插座406上。甚至對(duì)許多應(yīng)用并無(wú)必要的手機(jī)400也連接在外部設(shè)備408或電話接口上,并且通常能獨(dú)立于計(jì)算機(jī)412啟動(dòng)或終止連接。計(jì)算機(jī)能夠或不能控制和/或查詢手機(jī)均可。
計(jì)算機(jī)412可與圖1中所示的相同,包括一臺(tái)個(gè)人計(jì)算機(jī)或甚至一臺(tái)工作站。計(jì)算機(jī)412可包括一個(gè)鍵盤(pán)414,一個(gè)顯示器416,以及一個(gè)軟盤(pán)驅(qū)動(dòng)器418。
圖5展示圖4中的系統(tǒng)的一種變型,示出具有用于經(jīng)由線路502與504將手機(jī)500連接在插座506上的電話接口的計(jì)算機(jī)508。計(jì)算機(jī)508和圖4中所示的一樣,包括鍵盤(pán)512,顯示器512,及軟盤(pán)驅(qū)動(dòng)器514。計(jì)算機(jī)508能夠響應(yīng)手機(jī)500及經(jīng)由線路502從電話線進(jìn)來(lái)的信號(hào)兩者。計(jì)算機(jī)508也能不加修改地在手機(jī)500與插座506之間傳遞信號(hào)。
以上的討論概述了可用來(lái)實(shí)現(xiàn)本發(fā)明的某些特定硬件。然而應(yīng)記住,這些硬件只是示例性的,而本發(fā)明能在連接到電話網(wǎng)絡(luò)上的各式各樣的系統(tǒng)與設(shè)備上實(shí)現(xiàn)。圖6展示了實(shí)施本發(fā)明的至少某些原理的一種設(shè)備。設(shè)備600利用對(duì)象與經(jīng)由線路602與其連接的電話系統(tǒng)604的各種部件接口。設(shè)備600可以或不可以連接在一個(gè)或多個(gè)設(shè)備606上。
還應(yīng)指出,設(shè)備600可很好地連接在插座以外的系統(tǒng)中的點(diǎn)上。即,面向?qū)ο蟮脑O(shè)備可從網(wǎng)絡(luò)中接出而與電話系統(tǒng)的部件接口。
在其上實(shí)現(xiàn)本發(fā)明的系統(tǒng)應(yīng)能執(zhí)行多重任務(wù)或多重處理。這可提供應(yīng)用和通過(guò)對(duì)象的系統(tǒng)資源的利用的最佳性能。
體系結(jié)構(gòu)概況在連接到電話系統(tǒng)上的設(shè)備上運(yùn)行的應(yīng)用利用專門(mén)設(shè)計(jì)的接口部件與電話系統(tǒng)的部件進(jìn)行交互。應(yīng)指出,術(shù)語(yǔ)“應(yīng)用運(yùn)行”意味著不僅包含在計(jì)算機(jī)上運(yùn)行的軟件程序,并且還包含可執(zhí)行特定應(yīng)用的硬件。這些接口部件使得在各種電話系統(tǒng)部件之間互相傳遞信息所用的方法標(biāo)準(zhǔn)化。在一個(gè)最佳實(shí)施例中,接口部件是用對(duì)象有利地實(shí)現(xiàn)的。電話線路管理圖7為始于步驟700的展示多個(gè)TTelephoneLineHandle的例子的流程圖。如步驟702與704所示,只要電話線路事先未曾為數(shù)據(jù)通信保留,本發(fā)明便將其看成為可在面向語(yǔ)音的應(yīng)用之間共享的系統(tǒng)資源。這些應(yīng)用實(shí)際上通過(guò)代理類TTelephoneLineHandle訪問(wèn)電話服務(wù)(步驟706)。例如為了允許用戶在前臺(tái)發(fā)出重復(fù)的自動(dòng)撥號(hào)應(yīng)用事例的同時(shí)而在后臺(tái)保持應(yīng)答機(jī)應(yīng)用的操作,可將多個(gè)TTelephoneLineHandle例示在同一條線路上并且跨越組的邊界分布(步驟706與708)。當(dāng)不再需要TTelephoneLineHandle時(shí),示例過(guò)程便在步驟710處結(jié)束,但每當(dāng)需要TTelephoneLineHandle事例時(shí)便可重復(fù)。
圖8示出了TTelephoneLineHandle所執(zhí)行的功能的操作特征的可能流程。除了允許修改(步驟802與804)與查詢(步驟806與808)電話線的狀態(tài)之外,TTelephoneLineHandle提供建立表示線路的音頻輸入或輸出能力(如果有的話)的TMicrophone(麥克風(fēng))(步驟810與812)或TSpeaker(揚(yáng)聲器)(步驟814與816)對(duì)象的部件功能。TTelephoneLineHandle的功能流程由步驟800與818描述。
注意從語(yǔ)音應(yīng)用的觀點(diǎn),“實(shí)際”電話線是通過(guò)圖4中所示的物理調(diào)制解調(diào)器設(shè)備還是通過(guò)圖4中所示的某種內(nèi)部接口連接在計(jì)算機(jī)上是無(wú)關(guān)緊要的。在任何一種配置中,所有應(yīng)用所“見(jiàn)到”的只是一個(gè)TTelephoneLineHandle。電話手機(jī)管理TTelephoneHandsetHandle表示與電話線路對(duì)立的物理電話設(shè)備。標(biāo)準(zhǔn)的TTelephoneHandsetHandle類具有用于報(bào)告其掛鉤開(kāi)關(guān)狀態(tài)及用于建立表示手機(jī)的音頻輸入或輸出能力(如果有的話)的標(biāo)準(zhǔn)TMicrophone或TSpeaker對(duì)象的部件功能。如果存在這種能力,手機(jī)通常在兩種模式中工作,一種模式將音頻直接引導(dǎo)到并來(lái)自物理電話線,它完全繞過(guò)計(jì)算機(jī);而在第二種模式中,則將音頻引導(dǎo)到并來(lái)自計(jì)算機(jī),從而將物理線路留在回路之外。然而,在手機(jī)能用作一個(gè)本地?fù)P聲器或麥克風(fēng)之前,必須明確地將其從物理線路上“斷開(kāi)”。注意TTelephoneHandsetHandle所建立的揚(yáng)聲器和麥克風(fēng)完全與TTelephoneLineHandle所建立的無(wú)關(guān)。播放音頻數(shù)據(jù)到手機(jī)揚(yáng)聲器導(dǎo)致手機(jī)發(fā)出聲音。播放數(shù)據(jù)到線路揚(yáng)聲器導(dǎo)致在電話網(wǎng)絡(luò)上發(fā)送聲音。
子類中可包括帶有按鈕的物理手機(jī),顯示器,或帶在相關(guān)增益控制的外部揚(yáng)聲器與麥克風(fēng)。當(dāng)然有一個(gè)“較低”的公分母一臺(tái)不能監(jiān)視其開(kāi)關(guān)狀態(tài)的電話設(shè)備。在這一情況中,TTelephoneHandsetHandle對(duì)象不會(huì)被過(guò)度使用。即使開(kāi)關(guān)狀態(tài)可用,TTelephoneHandsetHandle的標(biāo)準(zhǔn)版本對(duì)于典型的基于計(jì)算機(jī)的電話應(yīng)用也完全是供選用的。
B.電話服務(wù)對(duì)象除了與電話網(wǎng)絡(luò)的使用相關(guān)聯(lián)的硬件類型實(shí)體之外(上面描述的),還有比較無(wú)形的對(duì)象。例如,連接本身,或者如最終用戶所想象的,電話通話可認(rèn)為是無(wú)形的。一次通話具有與電話線路無(wú)關(guān)的存在和狀態(tài)。為了進(jìn)行通話,用戶必須首先“找到”一條電話線。(“什么地方我能找到一臺(tái)電話?我要打一個(gè)電話?!?為了接受一次通話,用戶需要知道是從哪一條線路上進(jìn)入的。(“史密司先生,線路1上有你一個(gè)電話。”)一條線路是摘機(jī)或掛機(jī)的,而一次通話在其生命周期中要經(jīng)過(guò)各種狀態(tài)。在許多情況中,當(dāng)用戶為了打出第二個(gè)電話而仍然保持當(dāng)前通話不掛機(jī)時(shí),要求一條單一的線路能支持多個(gè)同時(shí)通話。替換之,用戶可在一個(gè)已存在的連接加入一個(gè)通話而形成三方的電話會(huì)談。
在現(xiàn)實(shí)世界中,有關(guān)一次通話的進(jìn)行的信息是通過(guò)音頻信道反饋給用戶的一種連續(xù)的聲調(diào)表示能撥號(hào),一種斷續(xù)的聲調(diào)表示目的地線路忙音,“振鈴”聲調(diào)表示目的地電話正在振鈴等。在基于計(jì)算機(jī)的電話接口中可以得到這些相同的信號(hào),以及以數(shù)字字母狀態(tài)說(shuō)明形式的關(guān)于通話狀態(tài)的更有辨別力的細(xì)節(jié)。電話通話如圖9中所示,在步驟900與910之間,應(yīng)用通過(guò)請(qǐng)求(步驟902·)TTelephoneLineHandle的一個(gè)實(shí)例來(lái)建立一個(gè)TTelephoneCallHandle(步驟904)而啟動(dòng)與結(jié)束電話連接。
圖10示出TTelephoneCallHandle的功能流程。如步驟1000與1010之間所示,TTelephoneCallHandle提供確定連接的狀態(tài)的訪問(wèn)方法(步驟1002與1004)以及返回遠(yuǎn)程端點(diǎn)的電話號(hào)碼的方法(步驟1006與1008)。電話特征控制由于TTelephoneLineHandle只允許放置,答復(fù),及掛斷通話,已提供了一族的類來(lái)方便對(duì)更普遍的補(bǔ)充語(yǔ)音特征的訪問(wèn)。除了建立通話,線路管理能在遇到可利用高級(jí)特征的電話機(jī)時(shí)建立單個(gè)特征的控制對(duì)象。這些特征的實(shí)例中可包含下述特征集暫時(shí)中斷并占線等候,轉(zhuǎn)接,多方交談,放棄,及轉(zhuǎn)交。注意特征的可利用性不僅取決于電話硬件平臺(tái)潛在能夠提供的特征,還取決于用戶實(shí)際訂購(gòu)的特征。電話通知圖11示出應(yīng)用1100如何建立接收某些關(guān)于電話系統(tǒng)的通知的流程圖。想要接收任何下面討論的通知的客戶1100必須用標(biāo)準(zhǔn)通知框架登記對(duì)它們關(guān)心。必須通過(guò)調(diào)用TTelephoneLineHandle與TTelephoneHandsetHandle 1102所提供的“建立關(guān)心事物”部件功能之一束建立用于電話通知的TInterest 1104。
圖12示出電話設(shè)備1200通過(guò)能用于管理電話服務(wù)的對(duì)象發(fā)送出信息。利用TNotification的三個(gè)面向電話的子類從下層的電話硬件向外傳播關(guān)于線路狀態(tài),通話,以及特征的信息。TTelephoneStatusNotification在1202處傳送TInterest的三個(gè)電話專用子類之一的實(shí)例TTelephoneInterest,TTelephoneCallInterest,或TTelephoneFeatureInterest。狀態(tài)更新本身由TToken常數(shù)表示。TTelephoneRingNotification在1204處播送關(guān)于進(jìn)入呼叫的信息。TTelephoneDigitsNotification在1206處允許客戶接收遠(yuǎn)程端點(diǎn)生成的DTMF數(shù)字。電話號(hào)碼TPhoneNumber,TPhoneEndpoint,以及其它的類可用于表示電話號(hào)碼。音頻對(duì)象由TTelephoneLineHandle與TTelephonehandset返回的TSpeaker與TMicrophone對(duì)象為揚(yáng)聲器與麥克風(fēng)類的子類。一個(gè)警告數(shù)字電話的數(shù)據(jù)格式標(biāo)準(zhǔn)可以因地區(qū)不同而改變。例如,從一條ISDN線路進(jìn)入的語(yǔ)音數(shù)據(jù)可以是對(duì)數(shù)壓擴(kuò)的而不是線性的。并且該語(yǔ)音數(shù)據(jù)在8KHz上而不是在22KHz上數(shù)字化。為了指引這種潛在的不兼容性,本發(fā)明設(shè)想了格式轉(zhuǎn)換類。例如,格式轉(zhuǎn)換類可包括T8KMuLawTo22KConverter,T8KALawTo22KConverter,T22KTo8KMuLawConverter,以及T22KTo8KALawConverter。
圖13提供了用格式轉(zhuǎn)換對(duì)象的實(shí)例播放一個(gè)聲音文件的例子。例如,為了播放原先直接從一條北美ISDN線路錄制的一個(gè)聲音文件,可將文件1300的輸出端口連接在T8KMuLawTo22KConverter 1302的一個(gè)實(shí)例的輸入端口上。然后將該轉(zhuǎn)換器的輸出端口連接到TSpeaker 1304的一個(gè)實(shí)例的輸入端口,并調(diào)用文件的播放成員功能。音頻端口利用類型協(xié)商來(lái)選擇一種公共數(shù)據(jù)格式。
類與成員功能細(xì)節(jié)本節(jié)詳細(xì)描述以上所述的本發(fā)明的類與成員功能。
如圖14所示,為了利用可以得到的電話資源,在1400處,一個(gè)應(yīng)用例示一個(gè)TTelephoneLineHandle,如上所述。然后可以通過(guò)調(diào)用由1402表示的線路的CreateAndPlaceCall方法或由1404表示的CreateAndAnswerCall方法而建立一個(gè)電話連接,兩者都返回一個(gè)調(diào)用管理。
為了得到正在進(jìn)行的連接的控制,可利用由1406表示的線路的CreateCallList方法。由這三種方法中任何一種啟動(dòng)的連接是通過(guò)調(diào)用通話管理上的由1408表示的HandUp而終止的。TTelephoneLineConfigurationData(電話線路配置數(shù)據(jù))本類表示一條特定電話線的配置。如圖15所示,TTelephoneLineConfigurationData 1500標(biāo)識(shí)與該線路的本地端點(diǎn)(1502)相關(guān)聯(lián)的號(hào)碼簿號(hào)碼并通過(guò)類型協(xié)商指定當(dāng)前在線路(1504)上可得到哪些電話特征。
<pre listing-type="program-listing"><![CDATA[class TTelephoneLineConfigurationDatapublic MCollectible, public MTypeNegotiator//公用構(gòu)造程序 //用電話號(hào)碼集合及特征序列類型,只用電話號(hào)碼或用單個(gè)電話號(hào)碼初始化 TTelephoneLineConfigurationData(const TCollection&localEndpoint, const TSequence&featureTypes); TTelephoneLineConfigurationData(const TCollection&localEndpoint); TTelephoneLineConfigurationData(const TPhoneNumber&); //拷貝構(gòu)造程序 TTelephoneLineConfigurationData(const TTelephoneLineConfigurationData&); //只用于流送與分配的系統(tǒng)預(yù)置構(gòu)造程序 TTelephoneLineConfigurationData();//解除程序 virtual~TTelephoneLineConfigurationData();//賦值運(yùn)算符 TTelephoneLineConfigurationData&operator=(constTTelephoneLineConfigurationData&);//訪問(wèn)功能//返回與線路關(guān)聯(lián)的端點(diǎn)(一個(gè)或多個(gè)電話號(hào)碼)void GetLocalEndpoint(TPhoneEndpoint&)const;//MTypeNegotiator替換 //返回有效的特征類型表 virtual void CreatePreferredTypeList(TSequence&)const; //確認(rèn)由這一配置表示的線路存在一個(gè)特定的特征類型 virtual TTypeDescription*ChooesPreferredType(const TSequence&)const;//MCollectible替換MCollectibleDeclarationsMacro(TTelephoneLineConfigurationData); virtual long Hash()const; virtual BooleanIsEqual(const MCollectible*)const; virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;TTelephoneLineHandle]]></pre>前面已針對(duì)圖7與圖8討論過(guò)TTelephoneLineHandle。圖16示出與作為一條電話線的標(biāo)準(zhǔn)代理者的TTelephoneLineHandle相關(guān)聯(lián)的功能。它允許通過(guò)一個(gè)電話線配置數(shù)據(jù)對(duì)象選擇一條特定的線路(1600)并提供用于啟動(dòng)電話通話連接的成員功能(1602),從而判定線路的掛鉤狀態(tài)(1604),通過(guò)類型協(xié)商匹配電話特征類型(1606),以及為線路建立音頻對(duì)象(1608)。它還生成供通知框架采用的用于登記與該線路相關(guān)聯(lián)的受關(guān)注的電話事件的TInterest子類(1610)。TTelephoneLineHandle是多線索安全的,但并未設(shè)計(jì)成供跨越組邊界的共享。
<pre listing-type="program-listing"><![CDATA[//公用構(gòu)造程序 //用配置數(shù)據(jù)初始化 TTelephoneLineHandle(const TTelephoneLineConfigurationData&); //拷貝構(gòu)造程序 TTelephoneLineHandle(const TTelephoneLineHandle&); //只用于流送及分配的系統(tǒng)預(yù)置建造器 TTelephoneLineHandle();//公用解除程序 virtual~TTelephoneLineHandle();//賦值運(yùn)算符 virtual TTelephoneLineHandle&operator=(const TTelephoneLineHandle&);//應(yīng)用接口 //返回這一線路表示的端點(diǎn) virtualvoid GetLocalEndpoint(TCollection&)const; //檢驗(yàn)掛鉤狀態(tài) virtualBoolean IsOnHook()const; //建立一次通話,撥指定的號(hào)碼并返回通話 virtual TTelephoneCallHandle*CreateAndPlaceCall(const TPhoneNumber&); //建立一次通話,應(yīng)答進(jìn)入的通話并返回通話 virtual TTelephoneCallHandle*CreateAndAnswerCall(); //返回對(duì)應(yīng)于所請(qǐng)求的類型的特征控制對(duì)象 virtual TTelephoneLineFeatureControl*CreateFeatureControl(const TTypeDescription&featureType); //返回電話線上當(dāng)前正在進(jìn)行的所有連接的TTelephoneCallHandle對(duì)象表 virtual void CreateCall List(TCollection&) //送出原始DTMF數(shù)字 virtual void SendDigits(const TPhoneCharacters&);//音頻I/O //建立適當(dāng)類型的揚(yáng)聲器與麥克風(fēng)對(duì)象 virtual TSpeaker*CreateSpeaker(); virtual TMicrophone*CreateMicrophone();//通知框架支持 //返回這一線路所關(guān)心的掛鉤狀態(tài) virtual TInterest*CreateHookInterest()const; //返回這一線路所關(guān)心的振鈴?fù)ㄖ獀irtual TInterest*CreateRingInterest()const; //返回指定的通知管理所關(guān)心的一個(gè)通話通知 virtual TInterest*CreateCallInterest(constTTelephoneCallHandle&)const; //返回指定的特征控制所關(guān)心的一個(gè)特征通知 virtual TInterest*CreateFeatureInterest(constTTelephoneLineFeatureControl&)const;低級(jí)控制功能將線路摘機(jī) virtual void TakeOffHook();\ //將線路掛機(jī) virtual void PutOnHook();//撥全部指定的電話號(hào)碼 virtual void DialNumber(const TPhoneNumber&); //送出原始DTMF數(shù)字 virtual void SendDigits(const TPhoneCharacters&);//MTypeNegotiator替換 //協(xié)商用于特征類型控制的可利用性 virtual void CreatePreferredTypeList(TSequence&)const; virtual TTypeDescription*ChoosePreferredType(constTSequence&)const;//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneLineHandle); virtual long Hash()const; virtual BooleanIsEqual(const MCollectible*)const; virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;TTelephoneCallHandle]]></pre>這是電話連接的輕加權(quán)代理者。它允許客戶確定參加連接的遠(yuǎn)程號(hào)碼及通話的當(dāng)前狀態(tài)。前面已經(jīng)相對(duì)于圖9與圖10討論過(guò)TTelephoneCallHandle。TTelephoneCallHandle是多線索安全的,但并未設(shè)計(jì)成跨越組邊界共享的。
<pre listing-type="program-listing"><![CDATA[class TTelephoneCallHandlepublic MCollectible//注本類必須通過(guò)線路或線路管理建立//解除程序 virtual~TTelephoneCallHandle();//客戶接口 //抽取用于連接的遠(yuǎn)程電話號(hào)碼 void GetRemoteNumber(TPhoneNumber&theNum)const; //返回當(dāng)前通話狀態(tài) virtual TToken GetStatus()const; //掛斷通話 virtual void HangUp();//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneCallHandle); virtual long Hash()const; virtual Boolean IsEqual(const MCollectible*)const;//注客戶不得分配或流送本類TTelephoneLineFeatureControl]]></pre>圖17示出了在1700處響應(yīng)一個(gè)客戶而用TTelephoneLineHandle在1700建立TTelephoneLineFeatureControl。TTelephoneLineHandle可以或不能支持超出執(zhí)行和斷開(kāi)電話連接的能力的任意組特征。例如,線路管理可能能夠在新的通話到來(lái)時(shí)采用占線等候的方式暫時(shí)中斷當(dāng)時(shí)的通話,轉(zhuǎn)送一次通話,進(jìn)行多方交談,或?qū)⒃械耐ㄔ挀Q到另一條線路??蛻敉ㄟ^(guò)要求線路管理建立TTelephoneLineFeatureControl的一個(gè)子類而使用諸如此類的特征。特征控制子類是用基于所要求的特征的類名的TTypeDescription指定的。TTelephoneLineFeature-Control是多線索安全的,但并未設(shè)計(jì)成跨越邊界的共享。
<pre listing-type="program-listing"><![CDATA[class TTelephoneLineFeatureControlpublic MCollectible//用于訪問(wèn)定義的特征類型的靜態(tài)成員定義如下static const void GetHoldFeatureType(TTypeDescription&);static const void GetDropFeatureType(TTypeDescription&);static const void GetTransferFeatureType(TTypeDescription&);static const void GetConferenceFeature Type(TTypeDescription&);static const viod GetForwardFeatureType(TTypeDescription&); //注本類必須通過(guò)線路或線路管理建立 //公用解除程序 virtual~TTelephoneFeatureControl(); //客戶接口 //返回特征類型描述 virtual void GetFeatureType(TTypeDescription&)const=0; //返回當(dāng)前特征狀態(tài)virtual TToken GetStatus()const;//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneLineFeatureControl); virtual long Hash()const; virtual Boolean IsEqual(const MCollectible*)const;//注客戶不得分配或流送本類]]></pre>標(biāo)準(zhǔn)TTelephoneLineFeatureControl子類提供了五種標(biāo)準(zhǔn)特征控制子類,它們對(duì)應(yīng)于“大四”補(bǔ)充特征并加上通話轉(zhuǎn)交。1)暫時(shí)中斷并占線等候特征控制<pre listing-type="program-listing"><![CDATA[class TTelephoneHoldFeatureControlpublic TTelephoneLineFeatureControl//公用解除程序virtual~TTelephoneHoldFeatureControl();TTelephoneLineFeatureControl替換//返回特征類型描述virtual void GetFeatureType(TTypeDescription&)const;/客戶接口 //暫時(shí)中斷并占線等候當(dāng)前有效的通話 virtual void PutOnHold(); //恢復(fù)指定的通話 virtual void Reconnect(const TTelephoneCallHandle&);//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneHoldFeatureControl); virtual long Hash()const;virtual Boolean IsEqual(const MCollectible*)const;]]></pre>2)放棄特征控制<pre listing-type="program-listing"><![CDATA[class TTelephoneDropFeatureControlpublic TTelephoneLineFeatureControl//公用解除程序virtual~TTelephoneDropFeatureControl();//TTelephoneLineFeatureControl替換 //返回特征類型描述 virtual void GetFeatureType(TTypeDescription&)const;//客戶接口//放棄指定的通話virtual void Drop(const TTelephoneCallHandle&);//MCollectible替換MCollectibleDeclarationsMacro(TTelephoneDropFeatureControl);virtual longHash()const virtual Boolean IsEqual(const MCollectible*)const;]]></pre>3)轉(zhuǎn)接特征控制<pre listing-type="program-listing"><![CDATA[class TTelephoneTransferFeatureControlpublicTTelephoneLineFeatureControl//公用解除程序virtual~TTelephoneTransferFeatureControl();//TTelephoneLineFeatureControl替換 //返回特征類型描述 virtual void GetFeatureType(TTypeDescription&)const;//客戶接口//起動(dòng)轉(zhuǎn)接并將通話放置到指定的號(hào)碼virtual TTelephoneCallHandle*CreateCallAndStartTransfer(const TPhoneNumber&newNumber); //結(jié)束進(jìn)行中的轉(zhuǎn)接操作 virtual void CompleteTransfer(); //中止進(jìn)行中的轉(zhuǎn)接操作 virtual void CancelTransfer();//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneTransferFeatureControl); virtuallong Hash()const; virtualBoolean IsEqual(const MCollectible*)const;]]></pre>4)多方交談特征控制<pre listing-type="program-listing"><![CDATA[class TTelephoneConferenceFeatureControl;public TTelephoneLineFeatureControl//公用解除程序virtual~TTelephoneConferenceFeatureControl();//TTelephoneLineFeatureControl替換 //返回特征類型描述 virtual void GetFeatureType(TTypeDescription&)const;//客戶接口 //起動(dòng)多方交談操作并將通話放置到指定號(hào)碼 virtual TTelephoneCallHandle* CreateCallAndStartAddingToConference(const TPhoneNumber& newNumber); //完成正在進(jìn)行的多方交談操作 virtual void FinishAddingToConference(); //中止正在進(jìn)行的多方交談操作virtual void CancelAddingToConference();//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneConferenceFeatureControl); virtual longHash()const; virtual Boolean IsEqual(const MCollectible*)const;]]></pre>5)轉(zhuǎn)交特征控制<pre listing-type="program-listing"><![CDATA[class TTelephoneForwardFeatureControlpublic TTelephoneLineFeatureControl//公用解除程序virtual~TTelephoneForwardFeatureControl();//TTelephoneLineFeatureControl替換 //返回特征類型描述 virtual void GetFeatureType(TTypeDescription&)const;//客戶接口 //轉(zhuǎn)交線路給指定的號(hào)碼 virtual void Forward(const TPhoneNumber&phoneNumber); //撤消通話轉(zhuǎn)交 virtual void CancelForward();//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneForwardFeatureControl); virtual long Hash()const; virtual Boolean IsEqual(const MCollectible*)const;TTelephoneHandsetConfigurationData(電話手機(jī)配置數(shù)據(jù))]]></pre>本類表示一個(gè)特定的電話手機(jī)的配置。它標(biāo)識(shí)該電話手機(jī)可連接的一條或多條電話線路。這已參照?qǐng)D15討論過(guò)。
<pre listing-type="program-listing"><![CDATA[class TTelephoneHandsetConfigurationDatapublic MCollectible//構(gòu)造程序//用手機(jī)能夠連接的電話線的配置初始化TTelephoneHandsetConfigurationData(const TCollection&);TTelephoneHandsetConfigurationData(constTTelephoneLineConfigurationData&);//拷貝構(gòu)造程序TTelephoneHandsetConfigurationData(constTTelephoneHandsetConfigurationData&);//只用于流送與分配的系統(tǒng)預(yù)置構(gòu)造程序TTelephoneHandsetConfigurationData();//解除程序virtual~TTelephoneHandsetConfigurationData();//賦值運(yùn)算符TTelephoneHandsetConfiguationData&operator=(constTTellephoneHandsetConfigurationData&);//訪問(wèn)功能 //為手機(jī)能夠連接的所有電話線建立配置數(shù)據(jù)對(duì)象 virtual void CreateConnectibleLineConfigurations(TCollection&)const;//MCollectible替換MCollectibleDeclarationsMacro(TTelephoneHandsetConfigurationData); virtual long Hash()const; virtual Boolean lsEqual(const MCollectible*)const; virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;TTelephoneHandsetHandle]]></pre>圖18提供TTelephoneHandsetHandle的功能表示,它是物理電話終端設(shè)備的標(biāo)準(zhǔn)代理者。它提供監(jiān)視掛鉤狀態(tài)的機(jī)制(1800)并允許建立對(duì)應(yīng)于手機(jī)的內(nèi)部揚(yáng)聲器與麥克風(fēng)的音頻對(duì)象(1802,1804)。它還生成供通知框架使用的用于登記與手機(jī)相關(guān)的受關(guān)注的電話事件(1806)。作為一種物理設(shè)備,手機(jī)通常提供對(duì)一條特定的電話線路的手動(dòng)控制,從而拿起手機(jī)就要導(dǎo)致某處的電話線路成為摘機(jī)。在用于音頻I/O之前,手機(jī)必須從其線路上“斷開(kāi)”。也有可能將一個(gè)手機(jī)連接到一組電話線中的一條上。TTelephoneHandsetHandle是多線索安全的,但并未設(shè)計(jì)成跨越組邊界的共享。
<pre listing-type="program-listing"><![CDATA[class TTelephoneHandsetHandlepublic MCollectible//公用構(gòu)造程序 //用配置數(shù)據(jù)初始化 TTelephoneHandsetHandle(const TTelephoneHandsetConfigurationData&);//拷貝建造器 TTelephoneHandsetHandle(const TTelephoneHandsetHandle&); //只用于流送與分配的系統(tǒng)預(yù)置構(gòu)造程序 TTelephoneHandsetHandle(); //公用解除程序 virtual~TTelephoneHandsetHandle();//賦值運(yùn)算符virtual TTelephoneHandsetHandle&operator=(constTTelephoneHandsetHandle&);//應(yīng)用接口 //檢驗(yàn)掛鉤狀態(tài) virtual Boolean IsOnHook()const; //檢驗(yàn)連接狀態(tài) virtual Boolean IsConnected()const; //連接到一條特定的電話線 //注手機(jī)一次只能連接到一條線路 virtual void ConnectToTelephoneLine(const TTelephoneLineHandle&); //從一條特定的電話線上斷開(kāi) virtual void DisconnectFromTelephoneLine(); //為當(dāng)前連接到該手機(jī)的線路建立配置 virtual TTelephoneLineConfigurationData* CreateLineConfigurationData()const; //為可用來(lái)連接該手機(jī)的所自線路建立配置數(shù)據(jù)對(duì)象 virtual void CreateConnectibleLineConfigurations(TCollection&)const;//音頻I/O//建立適當(dāng)類型的揚(yáng)聲器與麥克風(fēng)音頻對(duì)象 注這些對(duì)象表示手機(jī)本身而不是它所連接的線路的音頻I/O能力 virtual TSpeaker*CreateSpeaker(); virtual TMicrophone*CreateMicropone();//通知框架支持 //返回這一手機(jī)的掛鉤狀態(tài)關(guān)心事物 virtual TInterest*CreateHookInterest()const; //返回這一手機(jī)的振鈐通知關(guān)心事物 virtual TInterest*CreateRingInterest()const;MCollectible替換 MCollectibleDeclarationsMacro(TTelepnoneHandsetHandle); virtual long Hash()const; virtual Boolean IsEqual(const MCollectible*)const; virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;TInterest子類]]></pre>圖19示出TInterest子類。本發(fā)明利用三種特定的TInterest子類來(lái)通知狀態(tài)更新TTelephoneInterest 1900,TTelephoneCallInterest 1908,以及TTelephoneFeatureInterest1912。TTelephoneInterest 1900允許客戶請(qǐng)求通知影響一條特定電話線或手機(jī)的某些電話事件。這些事件包括掛鉤狀態(tài)中的改變1902,來(lái)自進(jìn)入呼叫的振鈴指示1904,及到達(dá)的遠(yuǎn)程生成的數(shù)字串1906。TTelephoneCallInterest 1908允許客戶請(qǐng)求通知一個(gè)特定的電話連接過(guò)程中的變化1910。TTelephoneFeatureInterest 1912同樣允許客戶請(qǐng)求通知一種電話特征的特定事例的過(guò)程中的變化1914??蛻魬?yīng)該通過(guò)調(diào)用TTelephoneLineHandle與TTelephoneHandsetHandle所提供的適當(dāng)成員功能來(lái)建立上述類的事例1916。它們都不是多線索安全的。
<pre listing-type="program-listing"><![CDATA[·TTelephoneInterestclass TTelephoneInterestpublic TInterest//公用構(gòu)造程序TTelephoneInterest(const TTelephoneInterest&);TTelephoneInterest();//公用解除程序virtual~TTelephoneInterest();//賦值運(yùn)算符virtual TTelephoneInterest&operator=(const TTelephoneInterest&);//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneInterest); virtual long Hash()const; virtual BooleanIsEqual(const MCollectible*)const; virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;·TTelephoneCallInterestclass TTelephoneCallInterestpubllic TInterest//公用構(gòu)造程序TTelephoneCallInterest(const TTelephoneCallInterest&);TTelephoneCallInterest();//公用解除程序virtual~TTelephoneCallInterest();//賦值運(yùn)算符virtual TTelephoneCallInterest& operator=(const TTelephoneCallInterest&);//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneCallInterest); virtual long Hash()const; virtual Boolean IsEqual(constMCollectible*)const; virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;·TTelephoneFeatureInterestclass TTelephoneFeatureInterestpublic TInterst//公用構(gòu)造程序TTelephoneFeatureInterest(const TTelephoneFeatureInterest&);TTelephoneFeatureInterest();//公用解除程序virtual~TTelephoneFeatureInterest();//賦值運(yùn)算符virtual TTelephoneFeatureInterest&operator=(const TTelephoneFeatureInterest);//MCollectible替換 MColloectibleDeclarationsMacro(TTelephoneFeatureInterest); virtual longHash()const; virtual Boolean IsEqual(const MCollectible*)const;virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;]]></pre>關(guān)心事物名常量下述公用靜態(tài)常量是為與通知框架一起使用而定義的 ·定義在TTelephoneInterest范圍內(nèi)的關(guān)心事物名<pre listing-type="program-listing"><![CDATA[//掛鉤狀態(tài)更新 stati cconst TToken& kHookStatus; //電話振鈴關(guān)心事物名 static const TToken& kRingNotification; //TTelephone數(shù)字關(guān)心事物名 static const TToken& kDigitsReceived;]]></pre>·定義在TTelephoneCallInterest范圍內(nèi)的關(guān)心事物名<pre listing-type="program-listing"><![CDATA[//通話狀態(tài) static const TToken& kCallStatus;]]></pre>·定義在TTelephoneFeatureInterest范圍內(nèi)的關(guān)心事物名<pre listing-type="program-listing"><![CDATA[//電話特征狀態(tài)static const TToken& kFeatureStatus]]></pre>
TNotification子類圖20示出從TNotification子類得出的功能關(guān)系。有三種TNotification的面向電話的子類。TTelephoneStatusNotification2000輸送一個(gè)狀態(tài)更新2002并包含一個(gè)TTelephoneInterest,一個(gè)TTelephoneCallInterest,或一個(gè)TTelephoneFeatureInterest 2004來(lái)替代一個(gè)簡(jiǎn)單的TInterest。取決于與它們相關(guān)的操作的進(jìn)行,可將狀態(tài)更新分配給四種類型之一成功,失敗,進(jìn)行中,或未知。這允許應(yīng)用執(zhí)行一個(gè)進(jìn)入通知的初步分類而無(wú)須明顯地檢驗(yàn)其狀態(tài)字段。TTelephoneRingNotification 2006在它已被應(yīng)答之前輸送一個(gè)進(jìn)入呼叫的電話號(hào)碼2008。最后,TTelephoneDigitsNotification 2010輸送來(lái)自一個(gè)遠(yuǎn)程連接的電話鍵盤(pán)的原始DTMF數(shù)字2012??蛻敉ǔMㄟ^(guò)通知框架2016而不是通過(guò)建立它們自己的事例來(lái)得到這些類的事例2014。這些類不是多線索安全的。
<pre listing-type="program-listing"><![CDATA[·狀態(tài)通知 class TTelephoneStatusNotificationpublic TNotification//公用構(gòu)造程序TTelephoneStatusNotification(const TTelephoneStatusNotification&);TTelephoneStatusNotification(const TInterest&);//公用解除程序virtual~TTelephoneStatusNotification();//賦值運(yùn)算符virtual TTelephoneStatusNotification&operator=(const TTelephoneStatusNotification&);//客戶接口//取得/設(shè)置狀態(tài)信息 TToken GetStatus()const;//取得通知分類 long GetClassification()const;//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneStatusNotification); virtual long Hash()const; virtual Boolean IsEqual(const MCollectible*)const; virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;·振鈴?fù)ㄖ猚lass TTelephoneRingNotificationpublic TNotification//公用構(gòu)造程序TTelephoneRingNotification(const TPhoneNumber&);TTelephoneRingNotification();TTelephoneRingNotification(const TTelephoneRingNotification&);//公用解除程序virtual~TTelephoneRingNotification();//賦值運(yùn)算符virtual TTelephoneRingNotification&operator=(const TTelephoneRingNotification&);//客戶接口 //抽取呼叫方電話號(hào)碼 void GetIncomingNumber(TPhoneNumber&)const;//Mcollectible替換MCollectibleDeclarationsMacro(TTelephoneRingNotification); virtual long Hash()const; virtual Boolean IsEqual(const MCollectible*)const; virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;·進(jìn)入數(shù)字通知class TTelephoneDigitsNotificationpublic TNotification//公用構(gòu)造程序 TTelephoneDigitsNotification(const TTelephoneDigitsNotification&); TTelephoneDigitsNotification();//公用解除程序 virtual~TTelephoneDigitsNotification();//賦值運(yùn)算符virtual TTelephoneDigitsNotification&operator=(const TTelephoneDigitsNotification&);//客戶接口 viod GetDigits(TPhoneCharacters&)const;//MCollectible替換 MCollectibleDeclarationsMacro(TTelephoneDigitsNotification); virtual long Hash()const; virtual BooleanIsEqual(const MCollectible*)const; virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;]]></pre>
狀態(tài)常量下述公用靜態(tài)常量TToken標(biāo)記是為T(mén)TelephoneStatusNotification∷的范圍內(nèi)的電話狀態(tài)更新而定義的·線路狀態(tài)常量KOnHook-線路或手機(jī)掛機(jī)KOffHook-線路或手機(jī)摘機(jī)·通話狀態(tài)常量kCallIdle-通話無(wú)效。系統(tǒng)預(yù)置狀態(tài)。
kIncompleteCallInfo-通話安排正在進(jìn)行,但需要更多信息。
kCallReorder-通話安排不能前進(jìn)。號(hào)碼中有錯(cuò)誤。
kCallCannotComplete-通話安排不能完成。
kReadyToDial-存在撥號(hào)音。
kFastBusy-撥號(hào)音暫停。
kDialingComplete-成功地完成撥號(hào)。
kRingbackDetected-收到返回振鈴指示。目的地電話正在振鈴。
kBusyDetected-收到忙音指示。目的地電話號(hào)碼正忙。
kNoAnswer-目的地電話號(hào)碼無(wú)應(yīng)答。
kCallActive-通話已成功地連接。
kCallOnHold-通話已被暫時(shí)中斷處于占線等候狀態(tài)。
kCallTerminationDetected-網(wǎng)絡(luò)或連接方已結(jié)束通話?!ぬ卣骺刂瞥A縦ActivateInProgress-已確認(rèn)特征激活請(qǐng)求。
kActivateComplete-特征現(xiàn)被激活。
kCannotActivate-不能激活特征。
kDeactivateInProgress-已確認(rèn)特征釋放請(qǐng)求。
kDeactivateComplete-特征現(xiàn)被釋放。
kCannotDeactivate-不能釋放特征。
kErrorState-出現(xiàn)一個(gè)不明錯(cuò)誤。ETelephoneStatusClassificationETelephoneStatusClassification是一種在TTelephoneStatusNotification范圍內(nèi)定義的危害,用以表示一種狀態(tài)通知的通用分類,從而客戶能適當(dāng)?shù)仨憫?yīng)而無(wú)須檢驗(yàn)狀態(tài)值。定義的值為kSuccess-成功地完成操作kFailure-沒(méi)有完成操作kInProgress-正在正常進(jìn)行操作kUnknown-對(duì)于這一狀態(tài)操作的進(jìn)行不明轉(zhuǎn)換器類數(shù)據(jù)格式轉(zhuǎn)換是通過(guò)諸如T8KMuLawTo22KConverter,T8KALawTo22K-Converter,T22KTo8KMuLawConverter,和T22KTo8KALawConverter等轉(zhuǎn)換器進(jìn)行的。這些類繼承MAudio并且不增加它們自己的新的接口協(xié)議。II.電話系統(tǒng)開(kāi)發(fā)人員的對(duì)象除了上面討論的對(duì)象以外,電話系統(tǒng)開(kāi)發(fā)人員在開(kāi)發(fā)新的電話設(shè)備時(shí)需要進(jìn)一步的對(duì)象用來(lái)工作。例如,諸如AT&T等第三方開(kāi)發(fā)人員可能希望增加對(duì)專有電話設(shè)備的支持和/或擴(kuò)展本發(fā)明來(lái)提供高級(jí)通訊能力。本發(fā)明將盡可能快與好地滿足第三方開(kāi)發(fā)人員的這些努力。電話體系結(jié)構(gòu)在使得與標(biāo)準(zhǔn)對(duì)象相關(guān)的現(xiàn)存代碼的潛在重復(fù)使用最大化的同時(shí),還應(yīng)預(yù)見(jiàn)這些擴(kuò)展的需要。
對(duì)象的體系結(jié)構(gòu)概述電話開(kāi)發(fā)人員須考慮三類種在上面應(yīng)用部分中未描述的類。抽象的電話線路類定義對(duì)電話網(wǎng)絡(luò)功能的一個(gè)標(biāo)準(zhǔn)接口。它具有與TTelephoneLineHandle面對(duì)面的主代理者關(guān)系,并包括用于與可能存在多個(gè)組中的處理進(jìn)行通信的內(nèi)裝式機(jī)構(gòu)。由TTelephoneFeature及其子類提供用于訪問(wèn)超出簡(jiǎn)單的掛/摘機(jī)與撥號(hào)功能的通用補(bǔ)充特征的接口。希望在專用電話硬件上提供對(duì)標(biāo)準(zhǔn)功能的訪問(wèn)的開(kāi)發(fā)人員將需要產(chǎn)生線路類的子類及預(yù)先定義的特征子類。電話線圖21表示抽象的主類TTelephoneLine,它提供對(duì)電話網(wǎng)絡(luò)的物理連接的一個(gè)軟件模型。每一條電話線路具有相關(guān)的(1)一種掛鉤狀態(tài)(掛或摘)2100,(2)包含一組唯一的號(hào)碼簿號(hào)碼2102的一個(gè)TPhoneEndpoint,以及(3)一組本身可用的電話特征2104。此外,一條線路管理向其引導(dǎo)狀態(tài)更新的一張有效的處理表2116。
TTelephoneLine包含純虛擬的成員功能,用于進(jìn)行摘機(jī),掛機(jī),以及撥出數(shù)字。這些功能中的每一種的實(shí)現(xiàn)必須由開(kāi)發(fā)人員提供。在大多數(shù)情況下,這種實(shí)現(xiàn)將需要與專用于給定的硬件/軟件環(huán)境的一個(gè)I/O訪問(wèn)管理程序和/或一個(gè)聽(tīng)音程序任務(wù)通信。
例如,如果物理電話接口位于運(yùn)行一個(gè)特定任務(wù)A的γ總線卡上,設(shè)備驅(qū)動(dòng)器的角色便可出作為T(mén)TelephoneLine子類的一個(gè)成員字段的示例的一個(gè)TaskACard對(duì)象來(lái)?yè)?dān)任。對(duì)該子類的OffHook方法的調(diào)用會(huì)導(dǎo)致線路向TaskACard發(fā)送一則包含適當(dāng)?shù)拿钆c數(shù)據(jù)的報(bào)文。通過(guò)一個(gè)包含TaskAListener的聽(tīng)音程序任務(wù)向該線路送回應(yīng)答。然后,線路子類建立適當(dāng)?shù)腡Notification子類并通過(guò)從TTelephoneLine繼承的ReceiveUpdate方法將它們向下傳送到相關(guān)的TTelephoneLineHandle。
開(kāi)發(fā)人員可能感興趣的兩個(gè)其它的成員功能為CreateSpeaker與CreateMicrophone。這兩個(gè)功能具有簡(jiǎn)單地返回一個(gè)NIL(零)指針的系統(tǒng)預(yù)置實(shí)現(xiàn)。然而,建立請(qǐng)求調(diào)度程序來(lái)平整非零指針供另一方的TTelephoneLineHandle再現(xiàn)。一個(gè)最佳實(shí)施例包含與實(shí)際電話硬件對(duì)應(yīng)的音頻對(duì)象以及對(duì)聲音服務(wù)程序的適當(dāng)調(diào)用來(lái)例示這些對(duì)象。注意在許多情況中(諸如連接在串行端口上的一個(gè)標(biāo)準(zhǔn)的外部調(diào)制解調(diào)器),不可能在主計(jì)算機(jī)上傳進(jìn)或傳出實(shí)際的語(yǔ)音數(shù)據(jù)而必須保留系統(tǒng)預(yù)置實(shí)現(xiàn)。
保證按正常序列來(lái)生成由線路處理與通話處理類所期望的通知事件是TTelephoneLine子類的責(zé)任。電話特征為了提供超出建立與斷開(kāi)連接所需的高級(jí)特征,設(shè)想基本TTelephoneLine類支持諸如最普遍使用的五種“暫時(shí)中斷并占線等候”,“放棄”,“轉(zhuǎn)接”,“多方交談”,與“轉(zhuǎn)交”高級(jí)電話特征的請(qǐng)求的調(diào)度與處理。在一個(gè)給定的電話開(kāi)關(guān)上可以得到的特定特征組既取決于該開(kāi)關(guān)的內(nèi)在能力,還取決于該開(kāi)關(guān)的客戶所選訂的服務(wù)。由于這一點(diǎn)以及由于每年開(kāi)關(guān)制造商推出更新與更精巧的特征,TTelephoneLine工作在一組復(fù)雜的特征上,從而多形地激活與釋放它們。
繼續(xù)參見(jiàn)圖21,其中示出了TTelephoneLineFeature的子類。TTelephoneLineFeature為所有特征從其中導(dǎo)出的基本類,它定義激活/釋放協(xié)議。從TTelephoneLineFeature 2104可導(dǎo)出一組標(biāo)準(zhǔn)特征子類TTelephoneHoldFeature 2106,TTelephoneDropFeature 2108,TTelephoneTransferFeature 2110,TTelephoneConferenceFeature2112,以及TTelephoneForwardFeature 2114。其中每一個(gè)與保持該特征的控制協(xié)議的任何子類所使用的一種類型描述相關(guān)聯(lián)。上列五種特征的標(biāo)準(zhǔn)類型描述是由TTelephoneLineFeatureControl通過(guò)靜態(tài)成員功能提供的。
希望提供實(shí)現(xiàn)標(biāo)準(zhǔn)特征組的開(kāi)發(fā)人員必須建立TTelephoneHoldFeature 2106,TTelephoneDropFeature 2108,TTelephoneTransferFeature 2110,TTelephoneConferenceFeature2112,以及TTelephoneForwardFeature 2114的子類,替換繼承的純虛擬功能激活與釋放,以便執(zhí)行有用的工作。
圖22示出在2202處,如果具有著沒(méi)有標(biāo)準(zhǔn)TTelephoneLineFeature子類存在的高級(jí)特征情況下的過(guò)程。在2204處,如果該特征是標(biāo)準(zhǔn)的,便使用它。如果該特征不是標(biāo)準(zhǔn)的,則依賴于開(kāi)發(fā)人員通過(guò)置換純虛擬的成員功能GetTypeDescription在2206提供一個(gè)類型描述,并在2208處提供激活與釋放的實(shí)現(xiàn)。開(kāi)發(fā)人員還必須在2210處定義一個(gè)特征控制子類以提交給線路處理,并且必須在2212處置換CreateFeatureControl,以使其返回控制的一個(gè)實(shí)例。電話配置本發(fā)明采用兩種配置信息。例如,從一個(gè)可顯示號(hào)碼到一個(gè)可撥號(hào)碼的轉(zhuǎn)換要求知道本地區(qū)的代碼,以及用于訪問(wèn)長(zhǎng)途服務(wù)的前綴。這一類信息可隨地區(qū)變化,但對(duì)于裝設(shè)在一個(gè)給定地點(diǎn)的所在電話線路則是通用的。另一方面,本地電話號(hào)碼及與該號(hào)碼相關(guān)聯(lián)的分機(jī)所能利用的特征則是在同一地點(diǎn)內(nèi)隨不同線路而不同的信息。
在企業(yè)安裝中,可由系統(tǒng)管理人員提供地點(diǎn)專用的配置信息并包含有分配給單個(gè)用戶的裝機(jī)組件。用戶仍必須指定線路專用的配置。非企業(yè)用戶要負(fù)責(zé)提供這兩組信息。配置數(shù)據(jù)的實(shí)際顯示與采集可能需要開(kāi)發(fā)人員生成一個(gè)能夠采集輸入的專用應(yīng)用程序或一個(gè)數(shù)據(jù)模型。
配置信息是由TTelephoneLineConfigurationData表示的,它是包含一個(gè)由給定的TTelephoneLine所需要的所有地點(diǎn)與線路專用的配置數(shù)據(jù)的一個(gè)輕加權(quán)配置類。一種類似的關(guān)系可在TTelephoneHandsetConfigurationData與TTelephoneHandset之間得出。這兩個(gè)類已在前一部分中描述過(guò)。音頻對(duì)象如果開(kāi)發(fā)人員的TTelephoneLine子類能夠捕捉與再現(xiàn)實(shí)際的語(yǔ)音信號(hào),則其依賴于電話開(kāi)發(fā)人員通過(guò)聲音服務(wù)程序提供支持這一能力所需的音頻類。例如,對(duì)從ISDN卡提供音頻I/O感興趣的開(kāi)發(fā)人員要編寫(xiě)MAudio/TAudioProcessor對(duì)以表示該硬件的輸入與輸出能力。電話開(kāi)發(fā)人員的編程接口本節(jié)詳細(xì)描述前一節(jié)中所引入的開(kāi)發(fā)人員工具的類與成員功能。想要實(shí)現(xiàn)標(biāo)準(zhǔn)功能和特定電話環(huán)境的特征的開(kāi)發(fā)人員將對(duì)TTelephoneLine以及標(biāo)準(zhǔn)的TTelephoneLineFeature和TTelephoneLineFeatureControl子類再行分類。想要增加新特征與功能的開(kāi)發(fā)人員將需要TTelephoneLineFeature與TTelephonelineFetureControl的其他子類。必須支持專用的終端設(shè)備的開(kāi)發(fā)人員將編寫(xiě)TTeleponeHandset與TTelephoneHandsetHandle的子類。TTelephoneLine圖23示出TTelephoneLine 2300的功能動(dòng)作。這是表示一條電話線路的基本對(duì)象。它提供對(duì)簡(jiǎn)單的電話網(wǎng)絡(luò)功能的低級(jí)接口。功能包括TakeOffHook 2302,PutOnHook 2304,DialNumber 2306,以及SendDigits 2308。該線路建立TelephoneCallHandle 2310來(lái)表示連接,從其TTelephoneLineFeature組中得到TTelephoneFeatureControl2312,并且也能建立麥克風(fēng)與揚(yáng)聲器音頻對(duì)象2314。一個(gè)TTelephoneLine與一個(gè)或多個(gè)稱作TTelephoneLineHandle的代理對(duì)象相關(guān)聯(lián)。處理中繼對(duì)它們的主線路的請(qǐng)求,后者又依次將電話掛鉤、振鈴、通話、特征與數(shù)字通知分配給線路處理。諸如暫時(shí)中斷并占線等候,放棄,轉(zhuǎn)接,多方交談等高級(jí)特征是通過(guò)TTelephoneLineFeature的子類支持的。TTelephoneLine已設(shè)計(jì)成由屬于不同的組的管理安全地共享。
<pre listing-type="program-listing"><![CDATA[class TTelephoneLineprotected MRemoteDispatcher, public MDelegatingNotifier, private MReferenceCounted//公用構(gòu)造程序virtual~TTelephoneLine();//公用訪問(wèn)功能//指定該線路的配置//注客戶可能想要改變一條現(xiàn)有線路的配置virtual void SetConfigurationData(const TTelephoneLineConfigurationData&);//建立與返回該線路的配置virtual TTelephoneLineConfigurationData*CreateConfigurationData()const;//受保護(hù)的構(gòu)造程序//指定本地配置信息TTelephoneLine(const TTelephoneLineConfigurationData&);//拷貝構(gòu)造程序TTelephoneLine(const TTelephoneLine&);//系統(tǒng)預(yù)置構(gòu)造程序,只用于流送TTelephoneLine();//受保護(hù)的賦值運(yùn)算符TTelephoneLine&operator=(const TTelephoneLine&);//子類接口 //在特征表上增加一個(gè)新特征對(duì)象 //線路子類應(yīng)在它們的構(gòu)造程序中建立與采用特征 virtual void AdoptFeature(TTelephoneLineFeature*); //指定該線路實(shí)例為之配置的特征類型 //采用特征后必須在構(gòu)造程序中調(diào)用的 //如果要配置的特征不存在便生成異常 virtual void ConfigureFeatures(const TCollection&); //響應(yīng)外部事件更新線路與傳播通知 virtual void ReceiveUpdate(TNotification&); //掛鉤狀態(tài)設(shè)定程序 virtual void SetHookStatus(const TToken&);//來(lái)自管理的進(jìn)程請(qǐng)求,這些成員功能是受保護(hù)的//注以下4種純虛擬功能的特定實(shí)現(xiàn)必須為使用的實(shí)際電話硬件提供 //將線路摘機(jī) virtual void TakeOffHook()=O; //將線路掛機(jī) virtual void PutOnHook()=0; //撥全部指定的電話號(hào)碼 virtual void DialNumber(const TPhoneNumber&)=0; //送出原始DTMF數(shù)字 virtual void SendDigits(const TPhoneCharacters&)=0;//其余的受保護(hù)的請(qǐng)求管理具有系統(tǒng)預(yù)置的實(shí)現(xiàn) //作為原子功能放置通話-提供系統(tǒng)預(yù)置實(shí)現(xiàn) virtual TTelephoneCallHandle*CreateAndPlaceCall(const TPhoneNumber&); //作為原子功能應(yīng)答通話-提供系統(tǒng)預(yù)置實(shí)現(xiàn)virtual TTelephoneCallHandle*CreateAndAnswerCall(); //返回該線路上正在進(jìn)行的所有通話的管理 virtual void CreateCallList(TCollection&)const; //返回當(dāng)前掛鉤狀態(tài) vi rtual TToken UpdateHookStatus()const //返回指定的通話的當(dāng)前狀態(tài) virtual TToken UpdateCallStatus(const TTelephoneCallHandle&); ///返回對(duì)應(yīng)于所請(qǐng)求的特征類型的特征控制對(duì)象 virtual TTelephoneLineFeatureControl*CreateFeatureControl(const TTypeDescription&)const;//受保護(hù)的音頻I/O功能 //建立適當(dāng)類型的揚(yáng)聲器與麥克風(fēng)音頻對(duì)象 virtual TSpeaker*CreateSpeaker()=0; virtual TMicrophone*CreateMicrophone()=0;//受保護(hù)的通話管理功能 //建立一個(gè)新連接 virtual TTelephoneCallHandle*AddCallAndCreateHandle( const TPhoneNumber&); //定位與指定的狀態(tài)匹配的通話管理 virtual TTelephoneCallHandle*FindCallAndCreateHandle(const TToken&callState)const; //消除一個(gè)存在的連接 virtual void DeleteCall(const TTelephoneCallHandle&);//受保護(hù)的特征管理功能 //定位指定類型的特征 virtual TTelephoneLineFeature*GetFeature( const TTypeDescription&featureType)const;//受保護(hù)的生成通知的功能 virtual TNotification*CreateHookNotification(const TToken& HookState,TTelephoneStatusNotification∷ETelephoneStatusClassificationclassification=TTelephoneStatusNotification∷kSuccess)constvirtual TNotification*CreateRingNotification(constTPhoneNumber&)const;vritual TNotification*CreateCallNotification(const TToken&callState, const TTelephoneCallHandle&, TTelephoneStatusNotification∷ETelephoneStatusClassification classification=TTelephoneStatusNotification∷kSuccess)const;virtual TNotification*CreateFeatureNotification(const TToken& featureState,const TTelephoneLineFeature&, TTelephoneStatusNotification∷ETelephoneStatusClassification classification=TTelephoneStatusNotification∷kSuccess)const;virtual TNotificationuCreateDigitsNotification(const TPhoneCharacters&) const;//公用MCollectible替換 VersionDeclarationsMacro(TTelephoneLine); virtual longHash()const; virtual Boolean IsEqual(const MCollectible*)const;//受保護(hù)的流送運(yùn)算符只能由子類調(diào)用 virtual TStream&operator<<=(TStream&fromWhere); virtual TStream&operator>>=(TStream&toWhere)const;TTel ephoneHandset]]></pre>圖24示出TTelephoneHandset 2400執(zhí)行的功能流程。這是代表一個(gè)物理電話手機(jī)的基本對(duì)象。它也能建立麥克風(fēng)與揚(yáng)聲器音頻對(duì)象2402。一個(gè)TTelephoneHandset 2400與一個(gè)或多個(gè)稱作TTelephoneHandsetHandle 2404的代理對(duì)象相關(guān)聯(lián)。管理中斷對(duì)它們的手機(jī)的請(qǐng)求2406,后者又依次將狀態(tài)更新2408分配給管理。TTelephoneHandset 2400已設(shè)計(jì)成由屬于不同組的管理安全地共享。
<pre listing-type="program-listing"><![CDATA[class TTelephoneHandsetprotected MRemoteDispatcher, public MDelegatingNotifier, public MReferenceCounted//公用解除程序virtual~TTelephoneHandset();//公用訪問(wèn)功能//指定該手機(jī)的配置//注客戶可能想要改變一條現(xiàn)有線路的配置virtual void SetConfigurationData(const TTelephoneHandsetConfigurationData&);//建立與返回該手機(jī)的配置virtual TTelephoneHandsetConfigurationData*CreateConfigurationData() const;//受保護(hù)的構(gòu)造程序//指定本地配置信息TTelephoneHandset(const TTelephoneHandsetConfigurationData&);//拷貝構(gòu)造程序TTelephoneHandset(const TTelephoneHandset&);//系統(tǒng)預(yù)置構(gòu)造程序-只用于流送TTelephoneHandset();//賦值運(yùn)算符TTelephoneHandset&operator=(const TTelephoneHandset&);//子類接口 //響應(yīng)外部事件更新線路及傳播通知 virtual void ReceiveUpdate(TNotification&); //受保護(hù)的掛鉤狀態(tài)設(shè)定程序 virtual void SetHookStatus(const TToken&theStatus); //用指定的配置定位可連接的電話線路 //為便于實(shí)現(xiàn)“ConnectToTelephoneLine”純虛擬功能而提供本功能 virtual TTelephoneLine*FindLine( const TTelephoneLineConfigurationData&);//來(lái)自管理的進(jìn)程請(qǐng)求-這些成員功能是受保護(hù)的//注對(duì)于使用的實(shí)際電話硬件,必須提供用于以下二種純虛擬功能的特定實(shí)現(xiàn) //連接到配置數(shù)據(jù)指定的線路 //自動(dòng)進(jìn)行可連接性檢驗(yàn),連接狀態(tài)維護(hù) virtual void ConnectToTelephoneLine(const TTelephoneLineHandle&)=0; //從當(dāng)前相關(guān)的線路上斷開(kāi) //自動(dòng)維護(hù)連接狀態(tài) virtual void DisconnectFromTelephoneLine()=0;//其余的受保護(hù)的請(qǐng)求管理具有系統(tǒng)預(yù)置的實(shí)現(xiàn) //掛鉤狀態(tài)獲取程序 virtual TToken UpdateHookStatus()const; //連接狀態(tài)獲取程序 virtual Boolean UpdateConnectionStatus()const;//獲取當(dāng)前連接的電話線路的配置數(shù)據(jù) //任何時(shí)刻,手機(jī)可連接在這些線路中的零或一條上 virtual TTelephoneLineConfigurationData*CreateLineConfigurationData()const; //為手機(jī)可以連接的所有電話線路建立配置數(shù)據(jù)對(duì)象 virtual void CreateConnectibleLineConfigurations(Tcollection&) const;//受保護(hù)的音頻I/O功能//建立適當(dāng)類型的揚(yáng)聲器與麥克風(fēng)音頻對(duì)象//注這些對(duì)象表示手機(jī)而不是它所連接的電話線路的本地音頻I/O能力virtual TSpeaker*CreateSpeaker()=0;virtual TMicrophone*CreateMicrophone()=0;//受保護(hù)的生成通知功能virtual TNotification*CreateHookNotification(const TToken& hookState, TTelephoneStatusNotification∷ETelephoneStatusClassificationclassificaiton=TTelephoneStatusNotification∷kSuccess)const virtual TNotification*CreateRingNotification(const TPhoneNumber&)const;//公用MCollectible替換 VersionDeclarationsMacro(TTelephoneHandset); virtual longHash()const; virtual Boolean IsEqual(const MCollectible*)const;//受保護(hù)的流送運(yùn)算符只能由子類調(diào)用 virtual TStream&operator<<==(TStream&fromWhere); virtual TStream&operator>>==(TStream&toWhere);TTelephoneLineFeature]]></pre>圖25示出TTelephoneLineFeature 2500的功能。TTelephoneLineFeature為定義一組標(biāo)準(zhǔn)的高級(jí)電話線路特征的一個(gè)基本類。它定義多種形式的激活2502與釋放2504高級(jí)電話特征2510的協(xié)議,并提供判定它們的類型2506及查詢它們的狀態(tài)字段2508的方法。TTelephoneLineFeature不是多線索安全的,但是由線路以安全的方式訪問(wèn)。
<pre listing-type="program-listing"><![CDATA[class TTelephoneLineFeatureprotected MRemoteDispatcher//公用解除程序 virtual~TTelephoneLineFeature();//公用訪問(wèn)功能//返回特征類型描述-純虛擬功能 virtual voidGetFeatureType(TTypeDescription&)const=0; //返回當(dāng)前特征狀態(tài) virtual TToken UpdateStatus()const; //建立匹配控制對(duì)象 //純虛擬部件功能-必須加以替換 virtual TTelephoneLineFeatureControl*CreateFeatureControl()const=0;//受保護(hù)的構(gòu)造程序 //供子類使用-系統(tǒng)預(yù)置成釋放狀態(tài) TTelephoneLineFeature(); //拷貝構(gòu)造程序 TTelephoneLineFeature(const TTelephoneLineFeature&);//受保護(hù)的賦值運(yùn)算符 TTelephoneLineFeature&operater=(const TTelephoneLineFeature&);//子類接口 //多利形式激活/釋放特征//純虛擬功能-必須加以替換virtualvoid Activate()=0;virtualvoid Deactivate()=0;//公用MCollectible替換VersionDeclarationsMacro(TTelephoneLineFeature);virtual longHash()const;virtual Boolean IsEqual(const MCollectible*)const;//受保護(hù)的流送運(yùn)算符只能由子類調(diào)用virtual TStream&operator<<=(TStream&fromWhere);virtual TStream&operator>>=(TStream&toWhere)const;標(biāo)準(zhǔn)TTelephoneLineFeature子類·暫時(shí)中斷并占線等候特征class TTelephoneHoldFeaturepublic TTelephoneLineFeature//解除程序 virtual~TTelephoneHoldFeature();//TTelephoneLineFeature替換 //返回標(biāo)準(zhǔn)暫時(shí)中斷并占線等候類型描述virtual void GetFeatureType(TTypeDescri ption&)const;//返回標(biāo)準(zhǔn)暫時(shí)中斷并占線等候控制對(duì)象virtual TTelephoneFeatureControl*CreateFeatureControl()const;//受保護(hù)的構(gòu)造程序TTelephoneHoldFeature();TTelephoneHoldFeature(const TTelephoneHoldFeature&);·放棄特征class TTelephoneDropFeaturepublic TTelephoneLineFeature//公用解除程序 virtual~TTelephoneDropFeature();//TTelephoneLineFeature替換//返回標(biāo)準(zhǔn)放棄類型描述virtual void GetFeatureType(TTypeDescription&)const;//返回標(biāo)準(zhǔn)放棄控制對(duì)象virtual TTelephoneFeatureControl*CreateFeatureControl()const;//受保護(hù)的構(gòu)造程序TTelephoneDropFeature()TTelephoneDropFeature(const TTelephoneDropFeature&);·轉(zhuǎn)接特征class TTelephoneTransferFeaturepublic TTelephoneLineFeature//解除程序 virtual~TTelephoneTransferFeature();// TTelephoneLineFeature替換 //返回標(biāo)準(zhǔn)轉(zhuǎn)接類型描述 virtual void GetFeatureType(TTypeDescription&)const; //返回標(biāo)準(zhǔn)轉(zhuǎn)接控制對(duì)象 virtual TTelephoneFeatureControl*CreateFeatureControl()const;//受保護(hù)的構(gòu)造程序 TTelephoneTranferFeature(); TTelephoneTransferFeature(const TTelephoneTransferFeature&);·多方交談特征class TTelephoneConferenceFeaturepublic TTelephoneLineFeature//解除程序 virtual~TTelephoneConferenceFeature();//TTelephoneLineFeature替換 //返回標(biāo)準(zhǔn)多方交談?lì)愋兔枋?virtual void GetFeatureType(TTypeDescription&)const; //返回標(biāo)準(zhǔn)多方交談控制對(duì)象 virtual TTelephoneFeatureControl*CreateFeatureControl()const;//受保護(hù)的構(gòu)造程序 TTelephoneConferenceFeature(); TTelephoneConferenceFeature(const TTelephoneConferenceFeature&);·轉(zhuǎn)交特征class TTelephoneForwardFeaturepublic TTelephoneLineFeature//公用解除程序 virtual~TTelephoneForwardFeature();//TTelephoneLineFeature替換 //返回標(biāo)準(zhǔn)轉(zhuǎn)交類型描述 virtual void GetFeatureType(TTypeDescription&)const; //返回標(biāo)準(zhǔn)轉(zhuǎn)交控制對(duì)象 virtual TTelephoneFeatureControl*CreateFeatureControl()const;//受保護(hù)的構(gòu)造程序TTelephoneForwardFeature();TTelephoneForwardFeature(const TTelephoneForwardFeature&);TTelephoneLineHandle]]></pre>已在應(yīng)用編寫(xiě)人員接口部分中描述了本類的構(gòu)造程序,解除程序,以及一些其它的成員功能。在編寫(xiě)一個(gè)TTelephoneLineFeatureControl子類時(shí),TTelephoneLineHandle所提供的下述低級(jí)控制功能可能有用。
<pre listing-type="program-listing"><![CDATA[ //將線路摘機(jī) virtual void TakeOffHook(); //將線路掛機(jī) virtual void PutOnHook(); //撥全部指定的電話號(hào)碼 virtual void DialNumber(const TPhoneNumber&); //送出原始DTMF數(shù)字 virtual void SendDigits(const TPhoneCharacters&);TTelephoneFeatureControl]]></pre>以下是用于TTelephoneFeatureControl的功能的類似的表。它們內(nèi)部地用于實(shí)現(xiàn)控制的特征特定的協(xié)議。GetLineHandle返回的指針給出對(duì)其關(guān)聯(lián)的線路管理的公用成員功能的控制訪問(wèn)。
<pre listing-type="program-listing"><![CDATA[ //發(fā)送激活/釋放請(qǐng)求到對(duì)應(yīng)的特征對(duì)象 virtual void Activate()virtual void Deactivate(); //返回參照給通話的線路管理 TTelephoneLineHandle* GetLineHandle()const]]></pre>音頻考慮與公用電話網(wǎng)絡(luò)本身的交互作用通常是間歇的且相當(dāng)慢,從而施加很少(如果有的話)嚴(yán)格的性能限制。反之,音頻數(shù)據(jù)的出現(xiàn)帶來(lái)實(shí)時(shí)要求組的標(biāo)準(zhǔn),這些要求連同模/數(shù)與數(shù)/模轉(zhuǎn)換硬件一起工作。跟不上這些硬件的要求會(huì)引入不良的數(shù)據(jù)不連續(xù)性,其結(jié)果是不但降低語(yǔ)音數(shù)據(jù)的清晰性程度,并且十分難聽(tīng)(甚至痛苦)。然而,這些實(shí)時(shí)要求不應(yīng)損害諸如用戶接口工具等非實(shí)時(shí)處理的性能。
具體而言,錄制或播放一個(gè)聲道的音頻不會(huì)在諸如(a)選擇一個(gè)菜單項(xiàng),(b)鍵入一個(gè)字符,(c)選擇一個(gè)圖形對(duì)象,或(d)一個(gè)正文范圍等標(biāo)準(zhǔn)用戶操作上提供任何感覺(jué)得到的不利影響。在下列各種情況中這應(yīng)當(dāng)是可能的1)從電話手機(jī)上捕捉并錄制到盤(pán)上的8KHz對(duì)數(shù)壓擴(kuò)的取樣2)從電話網(wǎng)絡(luò)上捕捉并錄制到盤(pán)上的8KHz對(duì)數(shù)壓擴(kuò)的取樣3)從盤(pán)上檢索到并播放到手機(jī)上的8KHz對(duì)數(shù)壓擴(kuò)的取樣4)從盤(pán)上檢索到并播放到網(wǎng)絡(luò)上的8KHz對(duì)數(shù)壓擴(kuò)的取樣
5)從盤(pán)上檢索到并播放到系統(tǒng)揚(yáng)聲器上的8KHz對(duì)數(shù)壓擴(kuò)的取樣6)從盤(pán)上檢索到并播放到手機(jī)上的22KHz線性取樣7)從盤(pán)上檢索到并播放到網(wǎng)絡(luò)上的228KHz線性取樣情況5至7要求具有同時(shí)壓擴(kuò)到線性或線性到壓擴(kuò)的轉(zhuǎn)換的取樣速率轉(zhuǎn)換。
為了使本發(fā)明與音頻對(duì)象一起操作,電話對(duì)象支持各式各樣的標(biāo)準(zhǔn)。例如,設(shè)想成目標(biāo)機(jī)器支持μ律與A律格式兩者并提供轉(zhuǎn)換成和來(lái)自標(biāo)準(zhǔn)音頻格式的轉(zhuǎn)換。通過(guò)提供與音頻對(duì)象交互作用的能力,電話世界和普通聲音世界之間的邊界呈現(xiàn)為平滑與“無(wú)縫”的。有可能通過(guò)聲音服務(wù)程序來(lái)示例封裝電話線路和電話手機(jī)的音頻輸入或輸出能力的一個(gè)標(biāo)準(zhǔn)麥克風(fēng)或揚(yáng)聲器對(duì)象。
根據(jù)一個(gè)最佳實(shí)施例的實(shí)例以上的討論提供了可能用于電話設(shè)備接口的某些示范性對(duì)象的描述。以下提供使用以上討論的某些對(duì)象的實(shí)例。放置一次通話<pre listing-type="program-listing"><![CDATA[//建立一個(gè)新的TTelephoneHandle.//線路配置是一個(gè)TTelephoneHandsetConfigurationData對(duì)象TTelephoneLineHandle myLineHandle(lineConfiguration);//建立一個(gè)新的通話對(duì)象TPhoneNumber myNumber=TPhoneNumber(“974-0001”)TTelephoneCallHandle*myPhoneCall=myLineHandle.CreateAndPlaceCall(myNumber);//OK,離開(kāi)電話的時(shí)間到了myPhoneCall.HangUp();delete myPhoneCall應(yīng)答一次通話//為了示例,我們說(shuō)明一個(gè)特殊的類來(lái)接收振鈴?fù)ㄖ猚lass TRingHandler{public TRingHandler(const TTelephoneLineHandle*);virtual ~TRingHandler();virtual void HandleRing(const TTelephoneRingNotification&);privateTTelephoneLineHandle* fLineHandleTTelephoneCallHandle* fCallHandle;TMemberFunctionConnection fConnection;}//TRingHandler的定義如下TRingHandlerTRingHandler(const TTelephoneLineHandle*lineHandle) fLineHandle(lineHandle)fConnection.SetReceiver(this,(NotificationMemberFunction) &TRingHandler∷ReceiveEvent); fConnection.AdoptInterest(fLineHandle->CreateRingInterest()); fConnection.Connect();}TRingHandler∷~TRingHandler(){}TRingHandler∷HandleRing(const TNotification&ringNotification){ //在連接通話前,可以問(wèn)誰(shuí)在呼叫 TPhoneNumber callingParty; ((const TTelephoneRingNotification&) theNotification).GetIncomingNumber(callingParty); //繼續(xù)及應(yīng)答它 fCallHandle=fLineHandle->CreateAndAnswerCall()}暫時(shí)中斷通話處于占線等候//建立一個(gè)新的TTelephoneHandle如上TTelephoneLineHandle myLineHandle(lineConfiguration);//協(xié)商暫時(shí)中斷并占線等候特征//實(shí)際上,這將在例示線路以前用代理完成TDeque featureList;TTypeDescription holdFeatureType;TTelephoneLineFeatureControl∷GetHoldFeatureType(holdFeatureType);featureList.AddLast(&holdFeatureType);TTypeDescription*featureType=myLineHandle.ChoosePreferredType(featureList);Boolean canHold=(featureType!=NIL)//建立一個(gè)新的通話對(duì)象TPhoneNumber myNumber=TPhoneNumber(“974-0001”)TTelephoneCallHandle*myPhoneCall=myLineHandle.CreateAndPlaceCall (myNumber);//OK,通話現(xiàn)在是有效的,因此暫時(shí)中斷并處于占線等候if((myPhoneCall->GetStatus()==TTelephoneStatusNotification∷ kCallActive)&&(canHold)){ TTelephoneFeatureControl*holdControl; holdControl=myLineHandle.CreateFeatureControl(holdFeatureType) holdControl->PutOnHold(); //他已等待太久,讓我們?cè)倥c他連接 holdControl->Reconnect(myPhoneCall);}]]></pre>增加一種新的電話特征<pre listing-type="program-listing"><![CDATA[//--------------------------------------------------//TFancyFeature-說(shuō)明//--------------------------------------------------class TFancyFeaturepublic TTelephoneLineFeature{public//構(gòu)造程序 TFancyFeature(); TFancyFeature(const TFancyFeature&);//解除程序 virtual~TFancyFeature();//賦值運(yùn)算符 TFancyFeature& operator=(const TFancyFeature&);//TTelephoneLineFeature替換//返回新的特征類型描述virtual void GetFeatureType(TTypeDescription&)const;//返回新的特征控制對(duì)象virtual TTelephoneFeatureControl*CreateFeatureControl()const;//激活特征virtual void Activate();//釋放特征virtual void Deactivate();//MCollectible替換MCollectibleDeclarationsMacro(TFancyFeature) virtual long Hash()const; virtual Boolean IsEqual(const MCollectible*)const virtual TStream& operator<<=(TStream&fromWhere) virtual TStream& operator>>=(TStream&toWhere)const}//-------------------------------------------------------//MFancyFeature-定義//-------------------------------------------------------//構(gòu)造程序?qū)崿F(xiàn) TFancyFeature∷TFancyFeature(){}//解除程序?qū)崿F(xiàn) TFancyFeature∷~TFancyFeature(){}//返回新的特征類型描述void GetFeatureType(TTypeDescription&featureType)const;{ TFancyFeatureControl∷GetFancyFeatureType(featureType);//建立新的特征控制TTelephoneFeatureControl*TFancyFeature∷CreateFeatureControl()const{ TTelephoneFeatureControl*fancyControl=new TfancyFeatureControl(); return fancyControl;}//激活特征void TFancyFeature∷Activate(){ //Do Actual Work to Activate Feature }//釋放特征void TFancyFeature∷Deactivate(){ //進(jìn)行實(shí)際工作來(lái)釋放特征}//MCollectible替換MCollectibleDefinitionsMacro(TFancyFeature,0);//---------------------------------------------------------// MFancyFeatureControl-說(shuō)明class TFancyFeatureControlpublic TTelephoneFeatureControl{publicstatic const void GetFancyFeatureType(TTypeDescription&);//解除程序 virtual~TFancyFeatureControl();// TTelephoneLineFeatureControl替換 //返回特征類型描述 virtual void GetFeatureType(TTypeDescription&)const;//客戶接口 //訪問(wèn)該特征-可能需要傳遞線路或通話管理參數(shù) virtual void TurnOnFancyFeature(); viriual void TurnOffFancyFeature(); //Mcollectible替換 MCollectibleDeclarationsMacro(TFancyFeatureControl); virtual Long Hash()const; virtual Boolean IsEqual(const MCollectible*)const;protected virtual TStream& operator<<=(TStream&fromWhere); virtual TStream& operator>>=(TStream&toWhere)const;//構(gòu)造程序 //被來(lái)自指定的特征的值初始化 TFancyFeatureControl(const TFancyFeatureControl&);//拷貝構(gòu)造程序 TFancyFeatureControl(const TFancyFeatureControl&); // TFancyFeature調(diào)用的系統(tǒng)預(yù)置構(gòu)造程序 TFancyFeatureControl(); //賦值運(yùn)算符 TFancyFeatureControl&operator=(const TFancyFeatureControl&);//只有一個(gè)TFancyFeature能構(gòu)造該類 friend class TFancyFeature;};//----------------------------------------------------------// TFancyFeatureControl-定義//----------------------------------------------------------const void TTelephoneLineFeatureControl∷GetFancyFeatureType (TTypeDescription&featureType){ static const TTypeDescription fancyType(“BrandXFancyFeature”); featureType=fancyType;}//解除程序TFancyFeatureControl∷~TFancyFeatureControl(){}//返回特征類型描述void TFancyFeatureControl∷GetFeatureType(TTypeDescription&featureType) const{ GetFancyFeatureType(featureType);//客戶接口void TFancyFeatureControl∷TurnOnFancyFeature() Activate();}void TFancyFeatureControl∷TurnOffFancyFeature() Deactivate();}//MCollectible替換MCollectibleDefinitionsMacro(TFancyFeatureControl,0);//構(gòu)造程序//用來(lái)自指定特征的值初始化TFancyFeatureControl∷TFancyFeatureControl(const TFancyFeature& theFeature)∷TTelephoneLineFeatureControl(theFeature){}//拷貝構(gòu)造程序TFancyFeatureControl∷TFancyFeatureControl(const TFancyFeatureControl& source) TTelephoneLineFeatureControl(source){}//只為流送與賦值調(diào)用系統(tǒng)預(yù)置構(gòu)造程序TFancyFeatureControl∷TFancyFeatureControl()TTel ephoneLi neFeatureControl(){}//賦值運(yùn)算符TFancyFeatureControl& TFancyFeatureControl∷operator=( const TFancyFeatureControl&source){ //無(wú)自我賦值 if(&source!=this){ TTelephoneFeatureControloperator=(source); } return*this;}]]></pre>預(yù)定義的電話常數(shù)名稱 意義電話通知所關(guān)心的事物名TTelephoneInterest∷kHookStatus 掛鉤狀態(tài)更新TTelephoneCallInterest∷kCallStatus 通話狀態(tài)更新TTelephoneFeatureInterest∷kFeatureStatus 特征狀態(tài)更新TTelephoneInterest∷kRingNotification 進(jìn)入通話通知TTelephoneInterest∷kDigitsReceived 進(jìn)入DTMF通知電話線路狀態(tài)TTelephoneStatusNotification∷kOnHook 線路是掛機(jī)的TTelephoneStatusNotification∷kOffHook線路是摘機(jī)的電話通話狀態(tài)TTelephoneStatusNotification∷kCallIdle 系統(tǒng)預(yù)置狀態(tài)TTelephoneStatusNotification∷kIncompleteCallInfo 放置通話需要更多信息TTelephoneStatusNotification∷kCallReorder 通話放置不能進(jìn)行TTelephoneStatusNotification∷kCallCannotComplete 測(cè)到特殊服務(wù)信息音調(diào)TTelephoneStatusNotification∷kReadyToDial 存在撥號(hào)音TTelephoneStatusNotification∷kFastBusy撥號(hào)音時(shí)間過(guò)完TTelephoneStatusNotification∷kDialingComplete 完成撥出TTelephoneStatusNotification∷kRingbackDetected遠(yuǎn)程連接正在“振鈴”TTelephoneStatusNotification∷kBusyDetected收到忙音,遠(yuǎn)程電話忙TTelephoneStatusNotification∷kNoAnswer遠(yuǎn)程電話未應(yīng)答TTelephoneStatusNotification∷kCallActive 通話已成功連接TTelephoneStatusNotification∷kCallOnHold 通話已被暫時(shí)中斷并處于占線等候TTelephoneStatusNotification∷kCallTerminationDetected 另一方已終止電話特征狀態(tài)TTelephoneStatusNotification∷kActivateInProgress 確認(rèn)特征激活請(qǐng)求TTelephoneStatusNotification∷kActivateComplete現(xiàn)在激活特征TTelephoneStatusNotification∷kCannotActivate 不能激活特征TTelephoneStatusNotification∷kDeactivate 正在進(jìn)行特征釋放請(qǐng)求確認(rèn)TTelephoneStatusNotification∷kDeactivateComplete 現(xiàn)在釋放特征TTelephoneStatusNotification∷kCannotDeactivate不能釋放特征通用錯(cuò)誤狀態(tài)TTelephoneStatusNotification∷kErrorState 不好或未定義的狀態(tài)基本電話通話狀態(tài)機(jī)以下提供利用上面討論的某些對(duì)象的一種通話狀態(tài)機(jī)的實(shí)現(xiàn)。起始狀態(tài)kCallIdle[Outbound Call]動(dòng)作TTelephoneLineHandle∷TakeOffHook結(jié)束狀態(tài)kReadyToDial起始狀態(tài)kCallIdle[Incoming Call]動(dòng)作TTelephoneLineHandle∷TakeOffHook結(jié)束狀態(tài)kCallActive起始狀態(tài)kReadyToDial事件kFastBusyDetected 結(jié)束狀態(tài)kFastBusyDetected動(dòng)作TTelephoneLineHandle∷SendDigits結(jié)束狀態(tài)kDialingComplete動(dòng)作TTelephoneLineHandle∷SendDigits結(jié)束狀態(tài)kIncompleteCallInfo動(dòng)作TTelephoneLineHandle∷SendDigits結(jié)束狀態(tài)kCallReorder動(dòng)作TTelephoneCallHandle∷HangUp結(jié)束狀態(tài)kCallIdle起始狀態(tài)kFastBusyDetected動(dòng)作TTelephoneCallHandle∷HangUp結(jié)束狀態(tài)kCallIdle起始狀態(tài)kDialingComplete事件kRingbackDetected 結(jié)束狀態(tài)kRingbackDetec事件kBusyDetected 結(jié)束狀態(tài)kBusyDetected事件kCallCannotComplete 結(jié)束狀態(tài)kCallCannotComplete動(dòng)作TTelephoneCallHandle∷HangUp結(jié)束狀態(tài)kCallIdle起始狀態(tài)kIncompleteCallInfo動(dòng)作TTelephoneCallHandle∷HangUp結(jié)束狀態(tài)kCallIdle起始狀態(tài)kCallReorder動(dòng)作TTelephoneCallHandle∷HangUp結(jié)束狀態(tài)kCallIdle起始狀態(tài)kRingbackDectected事件kCallActive 結(jié)束狀態(tài)kCalIActive
事件kNoAnswer 結(jié)束狀態(tài)kNoAnswer動(dòng)作TTelephoneCallHandle∷HangUp 結(jié)束狀態(tài)kCallIdle起始狀態(tài)kBusyDetected動(dòng)作TTelephoneCallHandle∷HangUp 結(jié)束狀態(tài)kCallIdle起始狀態(tài)kCallCannotComplete動(dòng)作TTelephoneCallHandle∷HangUp 結(jié)束狀態(tài)kCallldle起始狀態(tài)TTelephoneLine∷kCallActive事件kCallIdle結(jié)束狀態(tài)kCallIdle動(dòng)作TTelephoneCallHandle∷HangUp 結(jié)束狀態(tài)kCallIdle起始狀態(tài)TTelephoneLine∷kNoAnswer動(dòng)作TTelephoneCallHandle∷HangUp 結(jié)束狀態(tài)kCallIdle雖然已經(jīng)以特定系統(tǒng)環(huán)境中的最佳實(shí)施例描述了本發(fā)明,熟悉本技術(shù)的人員應(yīng)能認(rèn)識(shí)到在所附的權(quán)利要求書(shū)的精神與范圍內(nèi)的其它與不同的硬件與軟件環(huán)境中可通過(guò)修改上述實(shí)施例來(lái)實(shí)踐本發(fā)明。
權(quán)利要求
1.一種電話裝置,包括(a)一個(gè)處理器;(b)一個(gè)連接在所述處理器上并受其控制的存儲(chǔ)器;(c)一個(gè)常駐在所述存儲(chǔ)器中并控制所述處理器的操作的面向?qū)ο蟮牟僮飨到y(tǒng);(d)一個(gè)與所述面向?qū)ο蟮牟僮飨到y(tǒng)控制下的處理器相連的顯示器;(e)一個(gè)連接在所述處理器上的電話部件;(f)一個(gè)存儲(chǔ)在所述存儲(chǔ)器中并顯示在所述顯示器上的電話對(duì)象,所述電話對(duì)象表示在所述面向?qū)ο蟮牟僮飨到y(tǒng)控制下的電話部件;以及(g)用于由面向?qū)ο蟮牟僮飨到y(tǒng)利用所述電話對(duì)象控制所述電話部件的裝置。
2.根據(jù)權(quán)利要求1所述的電話裝置,還包括用于將從所述電話部件接收的信息翻譯成所述面向?qū)ο蟮牟僮飨到y(tǒng)能夠利用的信息的裝置。
3.根據(jù)權(quán)利要求1所述的電話裝置,還包括用于將從所述電話對(duì)象接收的信息翻譯成所述電話部件能夠利用的信息的裝置。
4.根據(jù)權(quán)利要求1所述的電話裝置,其中,所述電話對(duì)象包括與電話對(duì)象相關(guān)聯(lián)的一種方法及數(shù)據(jù)。
5.根據(jù)權(quán)利要求1所述的電話裝置,還包括用于將所述電話部件連接在所述處理器上的裝置。
6.根據(jù)權(quán)利要求5所述的電話裝置,還包括用于將一條電話線路連接在所述處理器上的裝置。
7.根據(jù)權(quán)利要求5所述的電話裝置,還包括用于將一個(gè)手機(jī)連接在所述處理器上的裝置。
8.根據(jù)權(quán)利要求5所述的電話裝置,還包括用于建立對(duì)所述處理器的一次通話的裝置。
9.根據(jù)權(quán)利要求1所述的電話裝置,還包括通過(guò)所述電話對(duì)象啟動(dòng)所述電話部件的特征的裝置。
10.根據(jù)權(quán)利要求5所述的電話裝置,還包括用于在所述電話部件與所述處理器之間傳遞信息的裝置。
11.根據(jù)權(quán)利要求10所述的電話裝置,還包括用于在所述電話部件與所述處理器之間交換DTMF音調(diào)的裝置。
12.根據(jù)權(quán)利要求1所述的電話裝置,還包括用于在一個(gè)電話部件與所述面向?qū)ο蟮牟僮飨到y(tǒng)之間為查詢服務(wù)的裝置。
13.根據(jù)權(quán)利要求1所述的電話裝置,還包括用于在一個(gè)電話部件與所述面向?qū)ο蟮牟僮飨到y(tǒng)之間交換通知信息的裝置。
14.一種用于在一個(gè)計(jì)算機(jī)系統(tǒng)上啟動(dòng)電話部件的方法,包括帶有一個(gè)連接的存儲(chǔ)器,顯示器,與電話部件的一個(gè)處理器,包括(a)用常駐在所述存儲(chǔ)器中的一個(gè)面向?qū)ο蟮牟僮飨到y(tǒng)控制所述處理器的操作;(b)建立一個(gè)存儲(chǔ)在所述存儲(chǔ)器中并顯示在所述顯示器上的電話對(duì)象,所述電話對(duì)象代表在所述面向?qū)ο蟮牟僮飨到y(tǒng)的控制下的電話部件;以及(c)由所述面向?qū)ο蟮牟僮飨到y(tǒng)利用所述電話對(duì)象控制所述電話部件。
15.根據(jù)權(quán)利要求14所述的方法,還包括將從電話部件接收的信息翻譯成所述面向?qū)ο蟮牟僮飨到y(tǒng)能夠利用的信息的步驟。
16.根據(jù)權(quán)利要求14所述的方法,還包括將從所述電話對(duì)象接收的信息翻譯成所述電話部件能夠利用的信息的步驟。
17.根據(jù)權(quán)利要求14所述的方法,其中,所述電話對(duì)象包括與所述電話對(duì)象相關(guān)聯(lián)的一種方法與數(shù)據(jù)。
18.根據(jù)權(quán)利要求14所述的方法,還包括將所述電話部件連接在所述處理器上的步驟。
19.根據(jù)權(quán)利要求18所述的方法,還包括將一條電話線路連接在所述處理器上的步驟。
20.根據(jù)權(quán)利要求18所述的方法,還包括將一個(gè)手機(jī)連接在所述處理器上的步驟。
21.根據(jù)權(quán)利要求18所述的方法,還包括建立一個(gè)對(duì)所述處理器的通話的步驟。
22.根據(jù)權(quán)利要求14所述的方法,還包括通過(guò)所述電話對(duì)象啟動(dòng)所述電話部件的特征的步驟。
23.根據(jù)權(quán)利要求18所述的方法,包括在所述電話部件與所述處理器之間傳遞信息的步驟。
24.根據(jù)權(quán)利要求23所述的方法,包括在所述電話部件與所述處理器之間交換DTMF音調(diào)的步驟。
25.根據(jù)權(quán)利要求14所述的方法,包括在一個(gè)電話部件與所述面向?qū)ο蟮牟僮飨到y(tǒng)之間交換狀態(tài)信息的步驟。
26.根據(jù)權(quán)利要求14所述的方法,包括在一個(gè)電話部件與所述面向?qū)ο蟮牟僮飨到y(tǒng)之間交換通知信息的步驟。
全文摘要
一種用于啟動(dòng)一組對(duì)象接口應(yīng)用部件和電話系統(tǒng)部件的方法和系統(tǒng)。根據(jù)將接口的電話系統(tǒng)的部件,可選擇特定的對(duì)象。一個(gè)特定的對(duì)象可與電話系統(tǒng)的一個(gè)或多個(gè)部件接口。電話系統(tǒng)的部件可以是該電話系統(tǒng)的任何可標(biāo)識(shí)的方面。例如,對(duì)象可表示一個(gè)手機(jī)或一條線路,也可表示無(wú)形的部件,例如,信號(hào)或過(guò)程,包含通話進(jìn)行音調(diào),通話建立,通話暫時(shí)中斷處于占線等候,多方交談,或其他通話特征。
文檔編號(hào)H04M11/00GK1133662SQ94193863
公開(kāi)日1996年10月16日 申請(qǐng)日期1994年1月6日 優(yōu)先權(quán)日1993年10月26日
發(fā)明者邁可爾·羅素·丟辭, 史蒂文·H·米而恩, 大衛(wèi)·B·哥德斯密 申請(qǐng)人:塔里根特公司