專利名稱:多媒體通信網(wǎng)絡(luò)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信網(wǎng)絡(luò)。本發(fā)明特別涉及能以諸如聲音、圖像和數(shù)據(jù)等多種媒體在兩個(gè)或多個(gè)用戶之間實(shí)現(xiàn)會(huì)議的多媒體通信網(wǎng)絡(luò)。
背景技術(shù):
面對(duì)面會(huì)議的主要特征可用多媒體會(huì)議系統(tǒng)來模擬。這些會(huì)議系統(tǒng)允許各個(gè)與會(huì)者從他們各自的工作場所以諸如聲音、圖像和數(shù)據(jù)等多種媒體相互溝通,而不需要將他們聚集在同一地點(diǎn)。
在一種現(xiàn)有技術(shù)的方法中,這些會(huì)議系統(tǒng)包括多個(gè)復(fù)雜而昂貴的計(jì)算機(jī)工作站,這些工作站通過傳輸設(shè)備連在一起,這些傳輸設(shè)備僅僅用作要在工作站之間溝通的信息的傳遞機(jī)構(gòu)。這樣一種分布式的結(jié)構(gòu)存在一些大的問題,從而它無法成為一種普及的,商業(yè)上可行的結(jié)構(gòu)。在這些現(xiàn)有技術(shù)分布式環(huán)境的每個(gè)工作站中,包含了必需的橋接電路和同步電路等大量的多媒體數(shù)據(jù)處理能力,用來使與會(huì)者開會(huì)。這樣做增加了每個(gè)可能的多媒體用戶的費(fèi)用,這就使用戶通常對(duì)多媒體通信不感興趣或不堪負(fù)擔(dān)。此外,現(xiàn)有技術(shù)局限于在桌面上使用,不能方便地實(shí)現(xiàn)長時(shí)間且靈活的多媒體會(huì)議的環(huán)境,這是由于至少要有一個(gè)工作站在會(huì)議環(huán)境所需期間始終開著。這對(duì)于所有要離開會(huì)議而后又能順利返回并繼續(xù)參加會(huì)議的與會(huì)者來說就很不方便。要在分布式環(huán)境中對(duì)與會(huì)者作適當(dāng)演出,上述多媒體會(huì)議的各個(gè)部分也很難同步。在此情況下,難于在完全不同的通信設(shè)備(例如,兩臺(tái)運(yùn)行不同操作系統(tǒng)的計(jì)算機(jī)之)間建立多媒體連接。
除了上面描述的分布式結(jié)構(gòu)之外,還有一些集中式結(jié)構(gòu),這些結(jié)構(gòu)包括了在網(wǎng)絡(luò)中的而不是在局部的工作站中的媒體橋接電路。例如,AT&T長途通信網(wǎng)絡(luò)包含了一些聲頻和視頻橋接能力,諸如包含在AT&T聯(lián)合電話會(huì)議業(yè)務(wù)(Alliance TeleconferencingServices)和AT&T全球商業(yè)電視會(huì)議業(yè)務(wù)(Global Businese VideoConferencing Services)中的橋接能力。雖然這些業(yè)務(wù)是有用的電信業(yè)務(wù),但本發(fā)明申請(qǐng)人發(fā)現(xiàn)它們有一些重要的部分需要改進(jìn)。申請(qǐng)人認(rèn)為它們難于在具有不同媒體能力且數(shù)目可變的用戶之間召開靈活的長時(shí)間多媒體會(huì)議。諸如電話呼叫等同步通信方式和諸如電子信箱等非同步通信方式不容易歸并到現(xiàn)有技術(shù)的多媒體通信系統(tǒng)中?,F(xiàn)有技術(shù)的多媒體通信系統(tǒng)也難于把各個(gè)與會(huì)者所擁有的完全不同的通信設(shè)備組合進(jìn)一有效的多媒體會(huì)議系統(tǒng)。具有不同大小的多媒體通信能力的與會(huì)者難于自由進(jìn)出一給定的多媒體會(huì)議。在諸如可通過一復(fù)雜的網(wǎng)絡(luò)(例如擴(kuò)大的局域網(wǎng)絡(luò)或如公用電話網(wǎng)等廣域網(wǎng))連接在一起的許多可能的用戶之間沒有方便的辦法實(shí)行多媒體通信。例如,采用現(xiàn)有的多媒體會(huì)議系統(tǒng)無法使電信公司向它的廣大電話用戶提供多媒體通信業(yè)務(wù)。
發(fā)明內(nèi)容
上面提到的問題可以由多媒體通信網(wǎng)絡(luò)來解決,該網(wǎng)絡(luò)提供了從一個(gè)或數(shù)個(gè)多媒體端口出入的共用多媒體工作環(huán)境。具體地說,多媒體通信網(wǎng)絡(luò)包括至少一個(gè)會(huì)議室服務(wù)器(meeting room server),它位于網(wǎng)絡(luò)中并連至為用戶提供出入網(wǎng)絡(luò)的多個(gè)端口。響應(yīng)于由連至一個(gè)多媒體端口的用戶終端的指令,會(huì)議室服務(wù)器在網(wǎng)絡(luò)中建立了一專用電子電路結(jié)構(gòu)。根據(jù)用電子電路結(jié)構(gòu)來實(shí)現(xiàn)電子多媒體會(huì)議的人們的要求,電子電路結(jié)構(gòu)具有由該網(wǎng)絡(luò)用戶設(shè)立的預(yù)定的特性并具有預(yù)選的在網(wǎng)絡(luò)內(nèi)的存在時(shí)間。電子電路結(jié)構(gòu)可以是一數(shù)據(jù)結(jié)構(gòu),它代表網(wǎng)絡(luò)中的可控持續(xù)虛擬會(huì)議室。可以用包括任意數(shù)目與會(huì)者的這一會(huì)議室來舉行會(huì)議。那些與會(huì)者可以用多種媒體與其他人溝通。他們不需要每個(gè)人在所有媒體中都具有相同的通信能力。與會(huì)者可對(duì)應(yīng)于在虛擬會(huì)議室中舉行的會(huì)議來去。即使所有的與會(huì)者都離開了會(huì)議,虛擬會(huì)議室仍存在于網(wǎng)絡(luò)中,并可在以后的時(shí)間被采用,用以由相同的與會(huì)者或別的與會(huì)者重新開始或繼續(xù)開會(huì)。虛擬會(huì)議室可由相同的與會(huì)者或別的與會(huì)者用于開始或繼續(xù)開其他的會(huì)。因此虛擬會(huì)議室是舉行會(huì)議的真實(shí)會(huì)議場所的電子模擬。
附圖概述
圖1是一種根據(jù)本發(fā)明原理構(gòu)成的說明性多媒體網(wǎng)絡(luò)。
圖2是一種包括兩個(gè)多媒體工作站的說明性連接拓?fù)?,這兩個(gè)工作站通過圖1的多媒體網(wǎng)絡(luò)的有關(guān)部分相連。
圖3a—3d是在圖2的會(huì)議室服務(wù)器中建立的一種說明性虛擬會(huì)議室的表示。
圖4是表示相應(yīng)于網(wǎng)絡(luò)中所建立一虛擬會(huì)議室的圖1中一會(huì)議室服務(wù)器工作的狀態(tài)圖。
圖5是表示相應(yīng)于網(wǎng)絡(luò)中所建立一虛擬會(huì)議室的圖2中一會(huì)話管理器工作的狀態(tài)圖。
圖6是與存儲(chǔ)裝置相關(guān)聯(lián)的綜合媒體服務(wù)器的方框圖,根據(jù)本發(fā)明該服務(wù)器協(xié)助實(shí)現(xiàn)虛擬會(huì)議室的持續(xù)特性。
本發(fā)明的最佳實(shí)施方式圖1示出一多媒體網(wǎng)絡(luò)10,它能有選擇地將許多個(gè)裝置中的一個(gè)或數(shù)個(gè)裝置連在一起,從而使信息可以從一個(gè)裝置傳送到另一個(gè)裝置。這些裝置可以包括一個(gè)或數(shù)個(gè)多媒體工作站,諸如示于圖1的一對(duì)多媒體工作站12和14。把多媒體工作站12和14分別連至網(wǎng)絡(luò)10的相應(yīng)多媒體端口,從而能相互溝通,還能與以諸如聲音、圖像和數(shù)據(jù)等多種媒體連至網(wǎng)絡(luò)10的其他裝置相互溝通。能與圖1中的網(wǎng)絡(luò)10互連的其他裝置包括攝像機(jī)16、錄像機(jī)18、傳真裝置20、電話22和電視機(jī)24。電話22可以是簡單的普通老電話業(yè)話(POTS)電話、綜合業(yè)務(wù)數(shù)字網(wǎng)(ISDN)電話、蜂窩狀或其他無線電話或諸如個(gè)人通信裝置等任何其他的聲頻電信裝置。示于圖1的每個(gè)裝置用對(duì)網(wǎng)絡(luò)10的適當(dāng)端口的合適接續(xù)與網(wǎng)絡(luò)10相連。
網(wǎng)絡(luò)10包含多個(gè)服務(wù)器,用于在示于圖1的裝置中的被選出的裝置之間實(shí)現(xiàn)預(yù)定媒體的連接。網(wǎng)絡(luò)10包含一個(gè)或數(shù)個(gè)會(huì)議室服務(wù)器1,2,…,i,每個(gè)會(huì)議室服務(wù)器是一個(gè)相應(yīng)于在網(wǎng)絡(luò)10中建立的虛擬會(huì)議室的信息庫。下面將詳細(xì)說明虛擬會(huì)議室的特性。會(huì)議室服務(wù)器也協(xié)調(diào)并控制對(duì)網(wǎng)絡(luò)10中的媒體服務(wù)器的訪問。媒體服務(wù)器包括一個(gè)或數(shù)個(gè)數(shù)據(jù)服務(wù)器1,2,…,j;一個(gè)或數(shù)個(gè)視頻服務(wù)器1,2,…,k;以及一個(gè)或數(shù)個(gè)聲頻服務(wù)器1,2?!?,1。數(shù)據(jù)服務(wù)器把示于圖1的裝置的輸入和輸出的數(shù)據(jù)部分有選擇地與示于圖1的其他裝置的已選數(shù)據(jù)輸入端和輸出端相連。同樣,視頻服務(wù)器有選擇地連接示于圖1的裝置的視頻輸入端和視頻輸出端。而聲頻服務(wù)器有選擇地連接那些裝置的聲頻輸入端和聲頻輸出端。網(wǎng)絡(luò)10還包含一個(gè)或數(shù)個(gè)姓名服務(wù)器1,2,…,m,每個(gè)姓名服務(wù)器可存儲(chǔ)連至網(wǎng)絡(luò)10的裝置的地址以及由媒體服務(wù)器和會(huì)議室服務(wù)器所采用的網(wǎng)絡(luò)資源的地址。會(huì)議室服務(wù)器對(duì)由姓名服務(wù)器掌握的信息作出反應(yīng),以在被選的用戶和被選的虛擬會(huì)議室之間建立聯(lián)系。
在本發(fā)明的一個(gè)例子中,示于圖1的服務(wù)器可以作為軟件實(shí)體在諸如由Sun微系統(tǒng)公司(Sun Microsystem)制造的一臺(tái)或數(shù)臺(tái)基于UNIX_的工作站上實(shí)現(xiàn)。如下面更詳細(xì)描述的那樣,可以在圖1所示的多媒體網(wǎng)絡(luò)10中建立可控持續(xù)虛擬會(huì)議室,可用這些會(huì)議室在網(wǎng)絡(luò)10的兩個(gè)或多個(gè)用戶之間靈活地進(jìn)行任何所需方向的多媒體會(huì)議。
圖2示出圖1中的工作站12和14通過網(wǎng)絡(luò)10的說明性多媒體連接。工作站12包含一用戶接口26,它可包括一計(jì)算機(jī)目視界面。接口26也可包括諸如鍵盤、鼠標(biāo)器、基于筆的輸入裝置或語音驅(qū)動(dòng)輸入裝置等數(shù)據(jù)輸入裝置。把用戶接口26連至?xí)捁芾砥?8。會(huì)話管理器28協(xié)調(diào)位于工作站12中的一組媒體管理器的活動(dòng)。會(huì)話管理器28也是工作站12中的信令代理機(jī),該代理機(jī)發(fā)信號(hào)通知網(wǎng)絡(luò)10建立或破壞由工作站12的操作者所用的一個(gè)或數(shù)個(gè)虛擬會(huì)議室。會(huì)話管理器28也用來對(duì)網(wǎng)絡(luò)10發(fā)信號(hào),用以在可被工作站12的操作者訪問的每個(gè)虛擬會(huì)議室中建立各種會(huì)議配置。
工作站12還包含一組媒體管理器,它們與有關(guān)的硬件裝置和軟件實(shí)體相關(guān)聯(lián),這些軟、硬件在有關(guān)的媒體中產(chǎn)生輸出并在這些媒體中從其他的與會(huì)者那里接收輸入。工作站12包含一數(shù)據(jù)管理器30,它接收由在工作站12中運(yùn)行的一個(gè)或數(shù)個(gè)應(yīng)用程序產(chǎn)生的數(shù)據(jù),這些應(yīng)用程序有空白表格軟件(spreadsheet)程序、字處理程序、圖形程序,等等。數(shù)據(jù)管理器30通過網(wǎng)絡(luò)10把數(shù)據(jù)傳給其他的與會(huì)者,具體地說,在本發(fā)明的這個(gè)例子中,傳給參加會(huì)議的多媒體工作站的其他類似的管理器。工作站12還包含一視頻管理器32,它從與工作站12相關(guān)聯(lián)的一個(gè)或數(shù)個(gè)視像裝置接收視頻信號(hào),這些視像裝置有電視攝像機(jī)、錄像機(jī)、掃描變換器,等等。視頻管理器32通過網(wǎng)絡(luò)10把視頻信號(hào)傳送給其他的與會(huì)者,例如,傳送給類似的多媒體工作站中的其他的視頻管理器。最后,工作站12包括一聲頻管理器34,它與一個(gè)或數(shù)個(gè)聲響裝置相關(guān)聯(lián),這些聲響裝置有電話、傳聲器,等等。除了從工作站12通過網(wǎng)絡(luò)10把信號(hào)送至其他的與會(huì)者之外,媒體管理器30、32和34還從其他的與會(huì)者那里接收有關(guān)信號(hào)并以適當(dāng)?shù)姆绞桨堰@些信號(hào)傳送給工作站12的用戶。例如,管理器30、32和34可使數(shù)據(jù)和圖像顯示在電視機(jī)或視頻監(jiān)視器上,而聲響經(jīng)揚(yáng)聲器放出。在本發(fā)明的其他例子中,在工作站12中還可以有其他的媒體管理器,例如,處理由工作站12產(chǎn)生或接收的傳真信號(hào)的管理器。
會(huì)話管理器28與數(shù)據(jù)管理器30之間的信號(hào)信息在線路29上傳送;會(huì)話管理器28與視頻管理器32之間的信號(hào)信息在線路31上傳送;會(huì)話管理器28與聲頻管理器34之間的信號(hào)信息在線路33上傳送。同樣,工作站14包含與會(huì)話管理器38相連的用戶接口36。工作站14還包含數(shù)據(jù)管理器40、視頻管理器42和聲頻管理器44,它們分別通過信號(hào)線39、41和43與會(huì)話管理器38相連。工作站12和24可以是基于UNIX_的例如由Sun微系統(tǒng)公司等制造的計(jì)算機(jī)或工作站。管理器和用戶接口可以是在上述計(jì)算機(jī)上的軟件實(shí)體。
把諸如圖2中的工作站12和14的用戶終端連至網(wǎng)絡(luò)10的多媒體端口。在多媒體端口中,從連至多媒體端口的各用戶終端接收多種媒體中的信號(hào)和通信業(yè)務(wù)。有一例多媒體端口,也將多種媒體中的信號(hào)和通信業(yè)務(wù)送至與多媒體端口相連的用戶終端。如何把工作站12和14的信號(hào)和多媒體通信業(yè)務(wù)接至網(wǎng)絡(luò)10的多媒體端口的詳細(xì)情形在圖2中示出,并描述如下。
在工作站12和14之間的多媒體連接中,工作站12的會(huì)話管理器28用適當(dāng)?shù)木€路46經(jīng)過網(wǎng)絡(luò)10連至工作站14的會(huì)話管理器38。每個(gè)多媒體工作站與圖1所示的一個(gè)特定的會(huì)議室服務(wù)器相關(guān)聯(lián)。在圖2所示的例子中,工作站12和14都與同一個(gè)會(huì)議室服務(wù)器48相關(guān)聯(lián),例如,這個(gè)會(huì)議室服務(wù)器可以是示于圖1的會(huì)議室服務(wù)器1。
工作站12和14之間的連接由一工作站用戶首先在會(huì)議室服務(wù)器48中建立一持續(xù)虛擬會(huì)議室而開始,虛擬會(huì)議室是由一個(gè)會(huì)話管理器28或38向服務(wù)器48沿線路45或46發(fā)送指令而建立起來的。虛擬會(huì)議室包括在會(huì)議室服務(wù)器48中的一數(shù)據(jù)結(jié)構(gòu),它代表分派給通信接續(xù)的某些計(jì)算機(jī)資源和在工作站12和14之間的信號(hào)。例如,那些資源可包括與會(huì)議室服務(wù)器48相關(guān)聯(lián)的存儲(chǔ)器的部分或全部、計(jì)算機(jī)文件、數(shù)據(jù)庫表、或其他的存儲(chǔ)器或存儲(chǔ)裝置。在網(wǎng)絡(luò)10的每個(gè)會(huì)議室服務(wù)器中可以建立一個(gè)以上的會(huì)議室。給每個(gè)虛擬會(huì)議室一個(gè)獨(dú)有的標(biāo)識(shí),會(huì)議室的可能用戶可以用該標(biāo)識(shí)訪問該會(huì)議室。虛擬會(huì)議室可包含一些服務(wù)器的標(biāo)識(shí),這些服務(wù)器將被用來在工作站12和14之間的各種媒體中實(shí)行連接。此外,虛擬會(huì)議室將包含在虛擬會(huì)議室中開會(huì)的與會(huì)者的標(biāo)識(shí)。在虛擬會(huì)議室里可以舉行一個(gè)或數(shù)個(gè)會(huì)議,給每個(gè)會(huì)議一個(gè)獨(dú)有的存儲(chǔ)在虛擬會(huì)議室中的標(biāo)識(shí)。虛擬會(huì)議室還可以包含有關(guān)被允許使用會(huì)議室的可能與會(huì)者的某些訪問權(quán)利的信息。在某些情形中,對(duì)于虛擬會(huì)議室來說,包含有關(guān)其已存在于網(wǎng)絡(luò)中的時(shí)間長度的信息可能有好處。例如,在網(wǎng)絡(luò)10是電話網(wǎng)絡(luò)的情形下,對(duì)于虛擬會(huì)議室來說,包含有關(guān)初始建立時(shí)刻以及實(shí)際開會(huì)所用時(shí)間的信息將是有好處的。這一信息可用于給用虛擬會(huì)議室開會(huì)的電話用戶開帳單并把那些會(huì)議的信息存儲(chǔ)在網(wǎng)絡(luò)中。
圖3a至3d是虛擬會(huì)議室47的圖解,該虛擬會(huì)議室可由圖2中的會(huì)議室服務(wù)器48建立。在圖3a的例子中,會(huì)議室包括服務(wù)器48的存儲(chǔ)器中為該虛擬會(huì)議室劃出來的一指定區(qū)域。在存儲(chǔ)單元49中存儲(chǔ)獨(dú)有的虛擬會(huì)議室標(biāo)識(shí)。在存儲(chǔ)單元51中存儲(chǔ)對(duì)虛擬會(huì)議室的訪問權(quán)利。這些訪問權(quán)利表明誰可用此虛擬會(huì)議室。在存儲(chǔ)單元53中存儲(chǔ)預(yù)約屬性。預(yù)約屬性包括有關(guān)已預(yù)約此虛擬會(huì)議室人員的信息;會(huì)議室已被預(yù)約的時(shí)間段;以及將使用的媒體服務(wù)器的標(biāo)識(shí)。任何沒有在預(yù)約屬性中識(shí)別的其他用戶在已預(yù)約的時(shí)間段內(nèi)不能使用會(huì)議室。通過采用某種優(yōu)先級(jí)方案可以解決預(yù)約矛盾。在不矛盾的時(shí)刻,一虛擬會(huì)議室可被多重預(yù)約。在存儲(chǔ)單元55中存儲(chǔ)與虛擬會(huì)議室47相關(guān)聯(lián)的m個(gè)媒體服務(wù)器的識(shí)別特性說明。如圖3b所示,每個(gè)服務(wù)器說明可包括唯一識(shí)別每個(gè)服務(wù)器的標(biāo)識(shí)59。那些服務(wù)器說明還可包含連接信息61,例如,有關(guān)服務(wù)器的網(wǎng)絡(luò)地址。服務(wù)器說明還可包含誰有權(quán)訪問該特定服務(wù)器的信息63;與服務(wù)器的每個(gè)付款用戶使用程度有關(guān)的信息65;反映上面已描述的與此服務(wù)器有關(guān)的預(yù)約屬性的預(yù)約信息67;以及服務(wù)說明69,它確定由此服務(wù)器處理的特定類型的聲音、圖像或數(shù)據(jù)業(yè)務(wù),例如,話音留言、聲訊服務(wù)、NTSC電視(壓縮與非壓縮)、告示板服務(wù)、游戲、氣象、新聞,等等。
會(huì)議室47還可包含有關(guān)一組與會(huì)者之間會(huì)談的顯示。在存儲(chǔ)單元57中存儲(chǔ)識(shí)別n個(gè)用這個(gè)虛擬會(huì)議室已召開或?qū)⒄匍_的會(huì)議的說明。如圖3c所示,每個(gè)會(huì)議說明包含一存儲(chǔ)在存儲(chǔ)單元71中的獨(dú)有的會(huì)議標(biāo)識(shí);訪問權(quán)利73;開帳單信息75;以及一個(gè)或多個(gè)與會(huì)者說明77。如圖3d所示,每個(gè)如圖3c所示的與會(huì)者說明可包含一獨(dú)有的標(biāo)識(shí)79;有關(guān)該與會(huì)者是否使用該會(huì)議室的狀態(tài)說明81;靜態(tài)媒體說明83,它指明該與會(huì)者與之通信的媒體;動(dòng)態(tài)媒體說明85,它指明該與會(huì)者當(dāng)前正與之通信的媒體;以及輪廓87,它包含可能對(duì)網(wǎng)絡(luò)有用的有關(guān)與會(huì)者的信息,諸如與會(huì)者參加該會(huì)議的時(shí)間長度、在會(huì)議進(jìn)程中與會(huì)者使用何種資源,以及是否和如何給該與會(huì)者開帳單。服務(wù)器48可以包含任意個(gè)數(shù)的會(huì)議室。每個(gè)會(huì)議室可包含任意個(gè)數(shù)的服務(wù)器、任意個(gè)數(shù)的會(huì)議和在每個(gè)會(huì)議中任意個(gè)數(shù)的與會(huì)者。每個(gè)與會(huì)者可以用諸如聲音、圖像和數(shù)據(jù)等多種通信媒體中的任意一種或數(shù)種進(jìn)行通信。
在會(huì)議室服務(wù)器48中建立的虛擬會(huì)議室具有持續(xù)的特征,這意味著由虛擬會(huì)議室確定的數(shù)據(jù)結(jié)構(gòu)可以網(wǎng)絡(luò)中保存一段預(yù)定的時(shí)間,而該段時(shí)間可由網(wǎng)絡(luò)用戶控制。即使沒有用戶與會(huì)議室或網(wǎng)絡(luò)相連,虛擬會(huì)議室仍能在網(wǎng)絡(luò)中保留。此外,虛擬會(huì)議室在網(wǎng)絡(luò)中持續(xù)的時(shí)間長度可由虛擬會(huì)議室的一個(gè)或數(shù)個(gè)用戶控制。這樣一個(gè)持續(xù)的會(huì)議室也是一種機(jī)制,可能用這樣一種機(jī)制來記錄當(dāng)一多媒體會(huì)議或其他會(huì)議進(jìn)行時(shí)發(fā)生的某些預(yù)選的事件。這些事件以后將在網(wǎng)絡(luò)中存儲(chǔ)一段預(yù)定的時(shí)間,這段預(yù)定的時(shí)間是由一個(gè)或數(shù)個(gè)與會(huì)者設(shè)置的,它與任何與會(huì)者是否實(shí)際上與網(wǎng)絡(luò)相連或者使用虛擬會(huì)議室無關(guān)。例如,在多媒體網(wǎng)絡(luò)10是一電話網(wǎng)絡(luò)的情形中,所有的與會(huì)者都可掛機(jī)走開而由與會(huì)者選擇的會(huì)議信息將存儲(chǔ)在網(wǎng)絡(luò)中,以備他們之中的任何人將來重新取用。這種存儲(chǔ)性能還允許將會(huì)議中斷,并在以后從會(huì)議中斷處重新開始。新的與會(huì)者可以參加一正在舉行的會(huì)議,并可迅速了解該會(huì)議早些時(shí)候所發(fā)生的事。虛擬會(huì)議室中的某些或全部信息可由該虛擬會(huì)議室的經(jīng)選擇的一些或全體用戶予以刪除。
在工作站12和14之間的多媒體會(huì)議中,會(huì)議室服務(wù)器48用雙向通信線路52與網(wǎng)絡(luò)10中的一個(gè)數(shù)據(jù)服務(wù)器50相連。會(huì)議室服務(wù)器48用一雙向通信線路56與網(wǎng)絡(luò)10中的一個(gè)視頻服務(wù)器54相連。同樣,會(huì)議室服務(wù)器48用雙向通信線路60與網(wǎng)絡(luò)10中的一個(gè)聲頻服務(wù)器58相連。網(wǎng)絡(luò)10中的一個(gè)姓名服務(wù)器62通過雙向通信線路64與會(huì)議室服務(wù)器48相連。
數(shù)據(jù)服務(wù)器50分別在雙向通信線路60和68上接收在工作站12和14中的數(shù)據(jù)管理器30和40產(chǎn)生的數(shù)據(jù)輸出和信號(hào)。來自每一個(gè)工作站12和14的數(shù)據(jù)輸出和信號(hào)由數(shù)據(jù)服務(wù)器50送至其他的工作站,從而由每個(gè)工作站產(chǎn)生的數(shù)據(jù)可以為兩個(gè)工作站12和14的用戶共享。這由數(shù)據(jù)服務(wù)器50來完成,它在線路66上接收工作站12的數(shù)據(jù)管理器30的數(shù)據(jù)輸出和信號(hào),并在線路68上將該輸出和信號(hào)送至工作站14中的數(shù)據(jù)管理器40。數(shù)據(jù)管理器50還在線路68上接收從工作站14的數(shù)據(jù)管理器40的數(shù)據(jù)輸出和信號(hào),并在線路66上將該數(shù)據(jù)輸出和信號(hào)送至工作站12的數(shù)據(jù)管理器30。
視頻服務(wù)器54在雙向通信線路70上接收工作站12的視頻管理器32的視頻輸出和視頻信號(hào),并在雙向通信線72上接收工作站14的視頻管理器42的視頻輸出和視頻信號(hào)。視頻服務(wù)器54通過通信線路72把在通信線路70上從工作站12接收到的視頻輸出和視頻信號(hào)送至工作站14。視頻服務(wù)器54還通過通信線路70把在通信線路72上從工作站14接收到的視頻輸出和視頻信號(hào)送至工作站12。
聲頻服務(wù)器58在雙向通信線路74上接收工作站12的聲頻管理器34的聲頻輸出和聲頻信號(hào),并通過通信線路76把該聲頻輸出和聲頻信號(hào)送至工作站14中的聲頻管理器44。聲頻服務(wù)器58還在雙向通信線路76上接收工作站14的聲頻管理器44的聲頻輸出和聲頻信號(hào),并通過線路74把該聲頻輸出和聲頻信號(hào)送至聲頻管理器34。
雖然示于圖2的本發(fā)明的例子只涉及兩個(gè)多媒體工作站之間的連接,但本發(fā)明對(duì)于可包括在一個(gè)會(huì)議中的任何個(gè)數(shù)的與會(huì)者同樣適用。數(shù)據(jù)服務(wù)器50、視頻服務(wù)器54和聲頻服務(wù)器58主要起橋接電路的作用,用于把與會(huì)者的有關(guān)媒體的輸出組合起來,并在適當(dāng)?shù)耐ㄐ怕窂缴蠈⒛切┹敵鲋羞x出的一些輸出送往與會(huì)者。把一些服務(wù)器組合并協(xié)調(diào)起來,使多個(gè)與會(huì)者可參加一多媒體會(huì)議的工作是由多媒體服務(wù)器48處理的,該多媒體服務(wù)器使用存儲(chǔ)在一虛擬會(huì)議室中的信息,該會(huì)議室是為在與會(huì)者之間舉行會(huì)議而建立的。把會(huì)議室接口78連至?xí)h室服務(wù)器48,從而可向服務(wù)器48提供由網(wǎng)絡(luò)管理人員等給出的某些信息。可以通過接口78獲得有關(guān)網(wǎng)絡(luò)10中的會(huì)議室的信息。會(huì)議室服務(wù)器用通信線路80與網(wǎng)絡(luò)10中的其他的會(huì)議室服務(wù)器相連,通信線路80的一頭接于服務(wù)器48的輸入/輸出端口。當(dāng)指派與會(huì)者采用網(wǎng)絡(luò)中的不同的會(huì)議室服務(wù)器時(shí),需要線路80。
圖4是一狀態(tài)圖,該圖相應(yīng)于單個(gè)虛擬會(huì)議室詳細(xì)地表示出圖1中的會(huì)議室服務(wù)器48的工作性質(zhì)。對(duì)于由服務(wù)器48管理的每個(gè)虛擬會(huì)議室,可以用類似的狀態(tài)圖。在圖4中,相應(yīng)于一給定虛擬會(huì)議室服務(wù)器48可以存在的每個(gè)狀態(tài)圖用一橢圓形結(jié)構(gòu)來示意地表示。狀態(tài)之間的轉(zhuǎn)換用一標(biāo)有數(shù)字,而數(shù)字前有字母“E”的箭頭來表示。自身環(huán)用數(shù)字前加“SL”來表示。表I是示于圖4的所有狀態(tài)轉(zhuǎn)換的一覽表。表I是允許轉(zhuǎn)換的完整的一覽表,轉(zhuǎn)換稱為“邊”(edge),表中包括在狀態(tài)之間觸發(fā)(trigger)轉(zhuǎn)換的標(biāo)識(shí)以及作為觸發(fā)的結(jié)果而產(chǎn)生的動(dòng)作(action)。
在服務(wù)器48中建立一虛擬會(huì)議室之前,服務(wù)器48處于接地狀態(tài)82。服務(wù)器48從與服務(wù)器48相關(guān)聯(lián)的工作站中的會(huì)話管理器接收一指令以建立一個(gè)空的虛擬會(huì)議室,該虛擬會(huì)議室可以是存儲(chǔ)器空間的分配或是對(duì)于特定會(huì)議的其他計(jì)算機(jī)資源,而該會(huì)議將由建立此虛擬會(huì)議室的用戶和其他用戶加入。會(huì)議室服務(wù)器48離開接地狀態(tài)82而進(jìn)入空會(huì)議室狀態(tài)84。將有一些合適的服務(wù)器與空會(huì)議室相關(guān)聯(lián),以在預(yù)定的媒體中舉行會(huì)議。這些服務(wù)器可從諸如示于圖1的網(wǎng)絡(luò)中的服務(wù)器的集合中挑選。當(dāng)一服務(wù)器將與虛擬會(huì)議室相關(guān)聯(lián)時(shí),會(huì)議室服務(wù)器48就離開空會(huì)議室而作為例如建立該虛擬會(huì)議室的工作站中的會(huì)話管理器的指令的結(jié)果進(jìn)入等待狀態(tài)86。一旦所要求的服務(wù)器實(shí)際上已被分派至虛擬會(huì)議室,例如,當(dāng)一被要求與虛擬會(huì)議室相關(guān)聯(lián)的服務(wù)器產(chǎn)生一認(rèn)可信息后,于是,會(huì)議室服務(wù)器48就進(jìn)入狀態(tài)88,該狀態(tài)表明有一個(gè)至少帶有一個(gè)相關(guān)聯(lián)的服務(wù)器的虛擬會(huì)議室。當(dāng)服務(wù)器處于狀態(tài)88,根據(jù)來自會(huì)話管理器的指令,可以有另外的服務(wù)器加至虛擬會(huì)議室,如圖4的第二等待狀態(tài)90所示。
除了建立空的虛擬會(huì)議室并把預(yù)定的網(wǎng)絡(luò)資源與該虛擬會(huì)議室相關(guān)聯(lián)之外,實(shí)際會(huì)議可在虛擬會(huì)議室中舉行,由此與會(huì)者可以在選定的媒體中互相聯(lián)系。兩個(gè)或多個(gè)與會(huì)者可以共享一個(gè)或多個(gè)聲音媒體(諸如通常的語音會(huì)話)、數(shù)據(jù)媒體(諸如某些計(jì)算機(jī)程序)以及圖像媒體(諸如由放在與會(huì)者所在場所的攝像機(jī)攝得的圖像)。關(guān)于這一點(diǎn),會(huì)話管理器向會(huì)議室服務(wù)器48發(fā)信號(hào),用以在虛擬會(huì)議室中召開一個(gè)有唯一標(biāo)識(shí)的會(huì)議。服務(wù)器48離開狀態(tài)88而進(jìn)入狀態(tài)90,在此狀態(tài)中,虛擬會(huì)議室包括一些服務(wù)器,而且正在此狀態(tài)中開一個(gè)會(huì)議。在狀態(tài)90中,可以增加另外的服務(wù)器,如圖4中的等待狀態(tài)92所示。當(dāng)服務(wù)器48處于狀態(tài)90時(shí),可以有任意個(gè)數(shù)的與會(huì)者加至?xí)h或離開會(huì)議,如圖4的自身環(huán)SL2所示。會(huì)議可以中斷,這時(shí)所有的與會(huì)者或者繼續(xù)與網(wǎng)絡(luò)相連或者實(shí)際上完全脫離網(wǎng)絡(luò)10,如圖4中從狀態(tài)90轉(zhuǎn)換到狀態(tài)94所示。由于虛擬會(huì)議室具有持續(xù)特性,會(huì)議室以及有關(guān)會(huì)議的信息將根據(jù)會(huì)議室用戶的需要繼續(xù)存儲(chǔ)在網(wǎng)絡(luò)10中。會(huì)議可以由一個(gè)或數(shù)個(gè)用戶在會(huì)議中斷的地方重新開始,如從狀態(tài)94至狀態(tài)90的轉(zhuǎn)換所示。
除了上面所描述的狀態(tài)和轉(zhuǎn)換之外,會(huì)議室服務(wù)器48還可以從空會(huì)議室狀態(tài)84進(jìn)入狀態(tài)96,它包含這樣一種情形,在服務(wù)器48中有一正在開會(huì)的虛擬會(huì)議室,但到那時(shí)為止,還沒有服務(wù)器。如等待狀態(tài)98所表示的那樣可加入服務(wù)器,由此可進(jìn)入狀態(tài)90,在該狀態(tài)中,有一虛擬會(huì)議室,并有服務(wù)器和與會(huì)者與該會(huì)議室相關(guān)聯(lián)。響應(yīng)于來自預(yù)選的會(huì)話管理器的指令,會(huì)議室服務(wù)器48可以從示于圖4的任何其他狀態(tài)進(jìn)入結(jié)束狀態(tài)100,在該狀態(tài)中,把虛擬會(huì)議室以及它的內(nèi)容完全從網(wǎng)絡(luò)10中的存儲(chǔ)單元中擦除。
圖5是表示相應(yīng)于單個(gè)虛擬會(huì)議室情形的多媒體工作站會(huì)話管理器工作的狀態(tài)圖。類似于圖5的另外的狀態(tài)圖可以代表相應(yīng)于其他一些虛擬會(huì)議室情形時(shí)該會(huì)話管理器的工作。如圖4中的情形那樣,圖5的狀態(tài)圖包括會(huì)話管理器可以存在的狀態(tài)以及在狀態(tài)之間允許的轉(zhuǎn)換的表示。表II是允許的轉(zhuǎn)換的完整的一覽表,轉(zhuǎn)換稱之為“邊”,表中包括在狀態(tài)之間觸發(fā)轉(zhuǎn)換的標(biāo)識(shí)以及作為觸發(fā)的結(jié)果而產(chǎn)生的動(dòng)作。
為作本描述,假設(shè)工作站12的一個(gè)用戶需要呼叫工作站14的一個(gè)用戶。在工作站的一個(gè)用戶為在網(wǎng)絡(luò)10中建立一個(gè)虛擬會(huì)議室而發(fā)出一個(gè)指令之前,會(huì)話管理器的工作處于接地狀態(tài)102。當(dāng)工作站12的一個(gè)用戶想與別人(例如,工作站14的一個(gè)用戶)通信,他或她就向工作站12的用戶接口輸入一請(qǐng)求。這與主叫方撥被叫方的電話號(hào)碼以在兩方之間開始電話呼叫的情形相同或類似。想要與另一個(gè)工作站的用戶相聯(lián)系的那個(gè)用戶可以人為地選擇將采用哪一種媒體來舉行會(huì)議。換一種做法,有關(guān)將采用哪一種媒體的信息可存儲(chǔ)在兩個(gè)工作站用戶之間的某處,用以自動(dòng)地在用戶之間構(gòu)成合適的聯(lián)系。一旦工作站12的起始用戶提出了與另一用戶建立聯(lián)系的要求,會(huì)話管理器28就進(jìn)入等待狀態(tài)104,在此期間會(huì)話管理器28等待會(huì)議室服務(wù)器48在網(wǎng)絡(luò)10中建立一個(gè)會(huì)適的虛擬會(huì)議室。在會(huì)話管理器28被告知已建立虛擬會(huì)議室之后,會(huì)話管理器28就進(jìn)入等待狀態(tài)106,在此期間會(huì)話管理器等待這樣一個(gè)指示,即會(huì)議室服務(wù)器48已經(jīng)使一些合適的媒體服務(wù)器與剛建立的虛擬會(huì)議室相關(guān)聯(lián)。每當(dāng)把服務(wù)器加至一虛擬會(huì)議室時(shí),會(huì)話管理器28就組織工作站12中的本地設(shè)備與每個(gè)媒體服務(wù)器合適地連接,這些媒體服務(wù)器是與由會(huì)議室服務(wù)器48建立的虛擬會(huì)議室相關(guān)聯(lián)的。在所有的合適的媒體服務(wù)器都已與虛擬會(huì)議室相關(guān)聯(lián)后,會(huì)話管理器28就進(jìn)入狀態(tài)108,該狀態(tài)指明會(huì)議室有服務(wù)器。當(dāng)會(huì)話管理器處于狀態(tài)108時(shí),通過從狀態(tài)108至狀態(tài)112并返回的轉(zhuǎn)換,可以把另外的服務(wù)器加至?xí)h室。當(dāng)在狀態(tài)108時(shí),通過從狀態(tài)108至狀態(tài)110并返回的轉(zhuǎn)換,也可以把服務(wù)器從會(huì)議室去掉。當(dāng)從會(huì)議室去掉服務(wù)器時(shí),會(huì)話管理器28還從會(huì)議中解除分配相應(yīng)的本地設(shè)備。
當(dāng)會(huì)話管理器處于狀態(tài)108時(shí),可以在虛擬會(huì)議室中開會(huì)。會(huì)話管理器28從狀態(tài)108轉(zhuǎn)換至狀態(tài)114,在此期間,會(huì)話管理器等待開會(huì)。另一種做法是,會(huì)話管理器28可通過狀態(tài)150而到達(dá)狀態(tài)114,在狀態(tài)150中不涉及會(huì)議室與服務(wù)器的關(guān)聯(lián)。當(dāng)會(huì)話管理器到達(dá)下面將要描述的會(huì)議在進(jìn)行中狀態(tài)122時(shí),也可把服務(wù)器沿通過狀態(tài)150的路徑加至已建立的虛擬會(huì)議室。這種狀態(tài)類似于上面描述過的狀態(tài)104。
在虛擬會(huì)議室中開辦一會(huì)議可以是在會(huì)議室中為會(huì)議建立某個(gè)標(biāo)識(shí)。當(dāng)已在虛擬會(huì)議室中開辦一會(huì)議時(shí),會(huì)話管理器28就由狀態(tài)114轉(zhuǎn)換至狀態(tài)116,在該狀態(tài)中,會(huì)話管理器28請(qǐng)求會(huì)議室服務(wù)器48把有關(guān)工作站用戶要接觸的人的信息(例如,用戶的場所)給會(huì)話管理器28。當(dāng)獲得這種信息時(shí),會(huì)話管理器28由狀態(tài)116轉(zhuǎn)換至狀態(tài)118,在該狀態(tài)中,會(huì)話管理器等待要送給將與之接觸的人的消息以及該對(duì)象表示想會(huì)見工作站12的用戶的回音。當(dāng)接收到回音表明被呼方想要與主呼方會(huì)見時(shí),會(huì)話管理器28就送一消息至?xí)h室服務(wù)器48,把被呼方標(biāo)識(shí)加至虛擬會(huì)議室。會(huì)議室服務(wù)器在狀態(tài)120中等待對(duì)此的證實(shí)。當(dāng)收到這一證實(shí)后,會(huì)話管理器28就從狀態(tài)120轉(zhuǎn)換至?xí)h在進(jìn)行中狀態(tài)122,在此狀態(tài)中,兩個(gè)工作站中的用戶聯(lián)系起一起,并可在已選擇的媒體中互相通信。
上面所描述的是這樣一種情形,即由工作站12的用戶發(fā)起與工作站14的用戶進(jìn)行聯(lián)系。在另一種情形中,即由工作站14的用戶發(fā)起與工作站12的用戶進(jìn)行聯(lián)系時(shí),會(huì)話管理器28從接地狀態(tài)102轉(zhuǎn)換至狀態(tài)124,在該狀態(tài)中,工作站12的用戶被邀請(qǐng)與工作站14的用戶參加一個(gè)多媒體會(huì)議。在狀態(tài)124中,會(huì)話管理器28等待工作站12的用戶接受這一邀請(qǐng)。當(dāng)工作站12的用戶已接受邀請(qǐng)時(shí),會(huì)話管理器28就從狀態(tài)124轉(zhuǎn)換至等待狀態(tài)126,在該狀態(tài)中,會(huì)話管理器28等待證實(shí)工作站12已加入會(huì)議之中,在此之后,會(huì)話管理器28從狀態(tài)126轉(zhuǎn)換至狀態(tài)122。
當(dāng)會(huì)議正在進(jìn)行而會(huì)話管理器28處于狀態(tài)122時(shí),通過如圖5所示的在狀態(tài)122、128、130和132之間的轉(zhuǎn)換,可以把另外的與會(huì)者邀入到會(huì)議中來。通過如圖5所示的在狀態(tài)122和134之間的轉(zhuǎn)換,可以使與會(huì)者退出。通過如圖5所示的在狀態(tài)122和136之間的轉(zhuǎn)換,可以使服務(wù)器加入。通過如圖5所示的在狀態(tài)122和138之間的轉(zhuǎn)換,也可以使服務(wù)器退出。
通過使與會(huì)者不與會(huì)話管理器(例如,會(huì)話管理器28)掛斷的辦法,任何參加會(huì)議的與會(huì)者可以暫時(shí)離開會(huì)議,這時(shí)會(huì)話管理器進(jìn)入狀態(tài)140。當(dāng)一個(gè)不掛斷的與會(huì)者想回至?xí)h,會(huì)話管理器28從狀態(tài)140轉(zhuǎn)換至狀態(tài)142,如果同意不掛斷的與會(huì)者重新進(jìn)入會(huì)議,則再由狀態(tài)142轉(zhuǎn)換至狀態(tài)122。
一個(gè)或數(shù)個(gè)與會(huì)者(例如工作站12的用戶)可以完全中斷會(huì)議,由此所有的與會(huì)者可以處于不掛斷狀態(tài)或者甚至實(shí)際上與網(wǎng)絡(luò)10脫離的狀態(tài)。然而,虛擬會(huì)議室以及它的某些或全部的相關(guān)聯(lián)的數(shù)據(jù)可保存在網(wǎng)絡(luò)中,從而會(huì)議可以從它中斷的地方恢復(fù)。下面將要描述的媒體服務(wù)器的存儲(chǔ)能力還允許在會(huì)議中斷后回至?xí)h的那些人能回顧會(huì)議的某些或全部經(jīng)歷。當(dāng)會(huì)議中斷時(shí),會(huì)話管理器28從狀態(tài)122轉(zhuǎn)換至狀態(tài)144再至狀態(tài)146。在會(huì)議重新開始時(shí),會(huì)話管理器28從狀態(tài)146轉(zhuǎn)換至狀態(tài)148,此后該會(huì)話管理器又回至狀態(tài)122。
當(dāng)會(huì)話管理器處接地狀態(tài)102,工作站12的用戶可詢問已在網(wǎng)絡(luò)10中存在的一個(gè)虛擬會(huì)議室中可以獲得的設(shè)備的性質(zhì)。會(huì)話管理器從狀態(tài)102轉(zhuǎn)換至狀態(tài)152,并組織適當(dāng)?shù)谋镜卦O(shè)備與在虛擬會(huì)議室中的設(shè)備相連接。一旦完成這項(xiàng)工作,會(huì)話管理器28就從狀態(tài)152轉(zhuǎn)換至狀態(tài)114,并繼續(xù)以上面已敘述的方式在狀態(tài)114以及其后的狀態(tài)中運(yùn)行。
當(dāng)會(huì)話管理器28處于接地狀態(tài)102時(shí),工作站12的一個(gè)用戶也可試圖加入當(dāng)時(shí)正在進(jìn)行的一個(gè)會(huì)議。如果用戶這樣表示想進(jìn)入一個(gè)正在進(jìn)行的會(huì)議,會(huì)話管理器28就從狀態(tài)102轉(zhuǎn)換至狀態(tài)154。事實(shí)上,向網(wǎng)絡(luò)詢問會(huì)議,并要求一個(gè)正在開會(huì)的與會(huì)者向該用戶發(fā)出參加會(huì)議的邀請(qǐng)。當(dāng)上述指示到來時(shí),會(huì)話管理器28從狀態(tài)154轉(zhuǎn)換至狀態(tài)124,并如上面所述的那樣繼續(xù)工作。在工作站12的用戶已經(jīng)是一正在舉行的會(huì)議的與會(huì)者而會(huì)話管理器28處于狀態(tài)122的情形中,由還不是會(huì)議一方的另一工作站用戶的請(qǐng)求使會(huì)話管理器28從狀態(tài)122轉(zhuǎn)換至狀態(tài)156。如果工作站12的用戶向新來者發(fā)出邀請(qǐng),則會(huì)話管理器28由狀態(tài)156轉(zhuǎn)換至狀態(tài)130后,再返回至狀態(tài)122。如果工作站12的用戶拒絕邀請(qǐng)新來者,則會(huì)話管理器28由狀態(tài)156直接回至狀態(tài)122。
如圖5所示,可以由會(huì)話管理器28從示于圖5中的一個(gè)經(jīng)選擇的狀態(tài)進(jìn)入結(jié)束狀態(tài)158。結(jié)束狀態(tài)158可以看作等價(jià)于接地狀態(tài)102。
圖6是示于圖1的一個(gè)媒體服務(wù)器的示意圖。所有的媒體服務(wù)器都可使用這種結(jié)構(gòu)。媒體服務(wù)器包括一個(gè)媒體橋路160,它用來從每個(gè)與會(huì)者那里接收有關(guān)媒體的輸出。媒體橋路160把從與會(huì)者處來的經(jīng)選擇的媒體輸出組合起來,并將該組合再送回經(jīng)選擇的與會(huì)者。由一個(gè)控制器162來管理與會(huì)者輸出的組合以及將那些輸出送回與會(huì)者的工作。在聲頻服務(wù)器的情形下,媒體橋路可以是任何一種電話會(huì)議橋路,它接收每個(gè)與會(huì)者的聲頻輸出并將那些聲頻輸出的經(jīng)選擇的一些送至每個(gè)與會(huì)者。在數(shù)據(jù)服務(wù)器的情形下,媒體橋路可以是諸如窗口橋路(windows bridge)或X窗口數(shù)據(jù)橋路等任何一種數(shù)據(jù)橋路,它接收來自與會(huì)者的數(shù)據(jù)輸出,并將那些數(shù)據(jù)輸出的經(jīng)選擇的一些送至每個(gè)與會(huì)者。同樣,在視頻服務(wù)器的情形下,任何一種視頻橋路可以用作媒體橋路160,用以從與會(huì)者處接收視頻輸出并將視頻輸出的經(jīng)選擇的一些送至每個(gè)與會(huì)者。媒體橋路160可與位于網(wǎng)絡(luò)中的存儲(chǔ)裝置164相連,該存儲(chǔ)裝置用于存儲(chǔ)有關(guān)虛擬會(huì)議室中的一個(gè)會(huì)議的各方面的信息。例如,當(dāng)媒體橋路160是視頻橋路時(shí),存儲(chǔ)裝置164可以存儲(chǔ)諸如會(huì)議經(jīng)選擇部分的圖像記錄等有關(guān)會(huì)議的圖像信息,在媒體橋路是數(shù)據(jù)橋路的情形下,存儲(chǔ)裝置還可存儲(chǔ)涉及計(jì)算機(jī)程序的某些信息,這些程序(例如,可執(zhí)行程序的狀態(tài))已被與會(huì)者共享。當(dāng)媒體橋路是聲頻橋路時(shí),存儲(chǔ)裝置還可存儲(chǔ)某些或整個(gè)會(huì)議的聲音記錄。媒體橋路160還可以與位于網(wǎng)絡(luò)10外面的類似的存儲(chǔ)裝置166相連。
附錄1是多媒體網(wǎng)絡(luò)10的例示性的協(xié)議。附錄2和3是表示上面已作較一般描述的執(zhí)行一會(huì)議服務(wù)器和一會(huì)話管理器任何的計(jì)算機(jī)程序清單。程序是用人們普遍知道的C++計(jì)算機(jī)語言編寫的。這些程序可以在運(yùn)行公知UNIX_操作系統(tǒng)的Sun微系統(tǒng)公司的工作站編譯和執(zhí)行。這些計(jì)算機(jī)程序是有版權(quán)的程序,其版權(quán)屬于美國電話電報(bào)公司(1993),因而在除了作此專利的紙質(zhì)復(fù)印件之外不得拷貝這些程序。
表I邊E1觸發(fā)MR_CREATE_MEETING(自會(huì)話管理器)動(dòng)作發(fā)送回答MR_CREATE_MEETING(至?xí)捁芾砥?邊E2/E11觸發(fā)MR_CREATE_ROOM(自會(huì)話管理器)動(dòng)作發(fā)送回答MR_CREATE_ROOM(至?xí)捁芾砥?邊E3/E7/E14/E18觸發(fā)MR_ADD_SERVER(自會(huì)話管理器)動(dòng)作發(fā)送GEN_ASSOCIATE_ROOM(至適當(dāng)?shù)拿襟w服務(wù)器)邊E4/E8-1/E15/E19-1觸發(fā)出錯(cuò)GEN_ASSOCIATE_ROOM(自媒體服務(wù)器)動(dòng)作發(fā)送Error MR_ADD_SERVER(至?xí)捁芾砥?邊E5/E8-2/E16/E19-2觸發(fā)回答GEN_ASSOCIATE_ROOM(自媒體服務(wù)器)動(dòng)作發(fā)送回答MR_ADD_SERVER(至?xí)捁芾砥?NS++(NS=會(huì)議室中服務(wù)器的數(shù)目)邊E6觸發(fā)MR_DROP_SERVER and NS=1動(dòng)作發(fā)送GEN_DISASSOCIATE_ROOM(至適當(dāng)?shù)拿襟w服務(wù)器)發(fā)送Reply_MR_DROP_SERVER邊E9觸發(fā)MR_DESTROY_MEETING(自會(huì)話管理器)動(dòng)作發(fā)送回答MR_DESTROY_MEETING(至?xí)捁芾砥?邊E10觸發(fā)MR_DROP_PARTICIPANT and NP=1(自會(huì)話管理器)(NP=與會(huì)者數(shù)目)動(dòng)作發(fā)送回答MR_DROP_PARTICIPANT(至?xí)捁芾砥?邊E12觸發(fā)MR_DROP_PARTICIPANT and NP=1(自會(huì)話管理器)(NP=與會(huì)者數(shù)目)動(dòng)作發(fā)送回答MR_DROP_PARTICIPANT(至?xí)捁芾砥?邊E13觸發(fā)MR_DESTROY_MEETING(自會(huì)話管理器)動(dòng)作發(fā)送回答MR_DESTROY_MEETING(至?xí)捁芾砥?邊E17觸發(fā)MR_DROP_SERVER and NS=1動(dòng)作發(fā)送GEN_DISASSOCIATE_ROOM(至適當(dāng)?shù)拿襟w服務(wù)器)發(fā)送Reply_MR_DROP_SERVER邊E20/E22觸發(fā)MR_SUSPEND_MEETING(自會(huì)話管理器)動(dòng)作回答MR_SUSPEND_MEETING(至?xí)捁芾砥?邊E21/E23觸發(fā)MR_RESUME_MEETING(自會(huì)話管理器)動(dòng)作回答MR_RESUME_MEETING(至?xí)捁芾砥?邊E24.
觸發(fā)MR_DESTROY_ROOM(自會(huì)話管理器)動(dòng)作回答MR_DESTROY_ROOM(至?xí)捁芾砥?邊SL1-1,SL2-1觸發(fā)MR_ADD_PARTICIPANT(自會(huì)話管理器)動(dòng)作發(fā)送回答MR_ADD_PARTICIPANT(至?xí)捁芾砥?NP++邊SL1-2,SL2-2觸發(fā)MR_DROP_PARTICIPANT and NP>1(自會(huì)話管理器)動(dòng)作發(fā)送回答MR_DROP_PARTICIPANT(至?xí)捁芾砥?NP-
表II邊E1觸發(fā)EVE_CREATE_MEETING(自虛擬會(huì)議室)EVE_CREATE_PERSISTENT_MEETING(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_CREATE_ROOM(至?xí)h室)若(觸發(fā)=EVE_CREATE_MEETING情形=TRANSIENT_MEETING;若(觸發(fā)=EVE_CREATE_PERSISTENT_MEET-ING)情形=PERSISTENT_MEETING;NS=服務(wù)器數(shù)目邊E2觸發(fā)EVE_VI_CREATE_MEET_IN_EROOM(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_LIST_SERVERS邊E3觸發(fā)EVE_VI_JOIN_MEETING(自虛擬會(huì)議室)動(dòng)作發(fā)送EVE_JOIN_MEETING(至?xí)h所有人)邊E4觸發(fā)EVE_MEETING_INVITE(自同等會(huì)話管理器)動(dòng)作發(fā)送請(qǐng)求VI_MEETING_INVITATION(至虛擬會(huì)議室)邊E5觸發(fā)回答MR_CREATE_ROOM(自會(huì)議室)動(dòng)作發(fā)送MR_ADD_SERVER(至?xí)h室)邊E6
觸發(fā)出錯(cuò)MR_CREATE_ROOM(自會(huì)議室)動(dòng)作發(fā)送事件EVE_VI_ADDED_PARTICIPANT失敗(至虛擬會(huì)議室)邊E7觸發(fā)回答MR_ADD_SERVER(自會(huì)議室)和NS=O動(dòng)作若(成功){發(fā)送MAN_CONNECT_TO_BRIDGE至適當(dāng)?shù)谋镜毓芾砥鱹邊E9觸發(fā)EVE_CREATE_ROOM_W-SERVERS(自虛擬會(huì)議室動(dòng)作發(fā)送MR_CREATE_ROOM(至?xí)h室)NS=服務(wù)器數(shù)目邊E10觸發(fā)回答MR_CREATE_MEETING成功(自會(huì)議室)動(dòng)作發(fā)送MR_GET_PERSON_INFO(至?xí)h室)邊E12-1(E12)觸發(fā)EVE_DROPPED_PARTICIPANT participant SELF(自一同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_DROPPED_PARTICIPANT(至虛擬會(huì)議室)邊E12-2(E69)觸發(fā)EVE_MEETING_DESTROYED(自一同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_MEETING_DESTROYED(至虛擬會(huì)議室)邊E12-3(E70)觸發(fā)EVE_ROOM_DESTROYED(自一同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_ROOM_DESTROYED(至虛擬會(huì)議室)邊E13觸發(fā)回答MR_GET_PERSON_INFO(自會(huì)議室)動(dòng)作發(fā)送EVE_MEETING_INVITATION(至同等會(huì)話管理器)邊E14觸發(fā)回答MR_ADD_PARTICIPANT(自會(huì)議室)動(dòng)作發(fā)送事件EVE_VI_ADDED_PARTICIPANT成功(至虛擬會(huì)議室)發(fā)送事件EVE_ADDED_PARTICIPANT(至所有同等的會(huì)話管理器)邊E15觸發(fā)EVE_VI_SUSPEND_MEETING(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_SUSPEND_MEETING(至?xí)h室)邊E16觸發(fā)出錯(cuò)MR_SUSPEND_MEETING(自會(huì)議室)動(dòng)作發(fā)送EVE_MEETING_SUSPENDED失敗(至虛擬會(huì)議室)邊E17觸發(fā)回答MR_SUSPEND_MEETING(自會(huì)議室)動(dòng)作發(fā)送EVE_EVE_MEETING_SUSPENDED(至所有同等的會(huì)話管理器)發(fā)送EVE_MEETING_SUSPENDED成功(至虛擬會(huì)議室)邊E18觸發(fā)EVE_MEETING_SUSPENDED(自一同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_MEETING_SUSPENDED(至虛擬會(huì)議室)邊E19觸發(fā)EVE_MEETING_RESUMED(自一同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_MEETING_RESUMED(至虛擬會(huì)議室)邊E25觸發(fā)回答VI_MEETING_INVITATION Accepted(自虛擬會(huì)議室)動(dòng)作發(fā)送EVE_ACCEPT_INVITATION(至主叫會(huì)話管理器)邊E26觸發(fā)EVE_ADDED_PARTICIPANT participant SELF(自一同等的會(huì)話管理器)動(dòng)作發(fā)送MAN_CONNECT_TO_BRIDGE(至適當(dāng)?shù)谋镜毓芾砥?邊E27觸發(fā)回答VI_MEETING_INVITATION被拒絕(自虛擬會(huì)議室)動(dòng)作發(fā)送EVE_REJECT_INVITATION(至主叫會(huì)話管理器)邊E28觸發(fā)EVE_MEETING_INVITE(至同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_ACCEPT_INVITATION(至請(qǐng)求者)邊E29觸發(fā)EVE_JOIN_MEETING_REJECTED(從同等的會(huì)話管理器)
動(dòng)作發(fā)送EVE_VI_JOIN_MEETING失敗(至虛擬會(huì)議室)邊E31觸發(fā)回答MR_CREATE_ROOM(自會(huì)議室)動(dòng)作發(fā)送MR_CREATE_MEETING(至?xí)h室)邊E32觸發(fā)請(qǐng)求EVE_CREATE_MEETING(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_CREATE_MEETING(至?xí)h室)邊E33觸發(fā)出錯(cuò)MR_CREATE_MEETING(自會(huì)議室)動(dòng)作發(fā)送事件EVE_VI_ADDED_PARTICIPANT失敗(至虛擬會(huì)議室)邊E34觸發(fā)回答MR_ADD_PARTICIPANT(自會(huì)議室)動(dòng)作發(fā)送事件EVE_VI_ADDED_PARTICIPANT成功(至虛擬會(huì)議室)發(fā)送事件EVE_ADDED_PARTICIPANT(至所有同等的會(huì)話管理器)邊E37觸發(fā)出錯(cuò)MR_ADD_PARTICIPANT(自會(huì)議室)動(dòng)作發(fā)送EVE_VI_ADDED PARTICIPANT失敗(至虛擬會(huì)議室)邊E38觸發(fā)EVE_ACCEPT_INVITATION(自同等的會(huì)話管理器)動(dòng)作發(fā)送MR_ADD_PARTICIPANT(至?xí)h室)邊E39觸發(fā)EVE_REJECT_INVITATION(自同等的會(huì)話管理器)
動(dòng)作發(fā)送事件EVE_VI_ADDED_PARTICIPANT失敗(至虛擬會(huì)議室)邊E40觸發(fā)出錯(cuò)MR_ADD_PARTICIPANT(自會(huì)議室)動(dòng)作發(fā)送事件EVE_VI_ADDED_PARTICIPANT失敗(至虛擬會(huì)議室)邊E41觸發(fā)EVE_VI_LEAVE_MEETING(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_LEAVE_MEETING(自會(huì)議室)發(fā)送請(qǐng)求EVE_LEFT_MEETING(至所有同等的會(huì)話管理器)邊E42觸發(fā)EVE_VI_REENTER_MEETING(自虛擬會(huì)議室)動(dòng)作發(fā)送請(qǐng)求MR_REENTER_MEETING(至?xí)h室)邊E43觸發(fā)回答MR_REENTER_MEETING(自會(huì)議室)動(dòng)作發(fā)送EVE_REENTER_MEETING(至所有同等的會(huì)話管理器)發(fā)送EVE_REENTER_MEETING成功(至虛擬會(huì)議室)邊E44觸發(fā)出錯(cuò)MR_REENTER_MEETING(自會(huì)議室)動(dòng)作發(fā)送EVE_REENTER_MEETING失敗(至虛擬會(huì)議室)邊E45觸發(fā)EVE_VI_RESUME_MEETING(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_RESUME_MEETING(至?xí)h室)邊E46觸發(fā)回答MR_RESUME_MEETING(自會(huì)議室)動(dòng)作發(fā)送EVE_MEETING_RESUMED(自虛擬會(huì)議室)發(fā)送EVE_MEETING_RESUMED(至所有同等的會(huì)話管理器)邊E47觸發(fā)出錯(cuò)MR_RESUME_MEETING(自會(huì)議室)動(dòng)作發(fā)送EVE_MEETING_RESUMED失敗(至虛擬會(huì)議室)邊E48觸發(fā)EVE_VI_ADD_SERVER(自虛擬會(huì)議室)動(dòng)作發(fā)送請(qǐng)求MR_ADD_SERVER(至?xí)h室)邊E49觸發(fā)回答MR_ADD_SERVER(自會(huì)議室)動(dòng)作發(fā)送MAN_CONNECT_TO_BRIDGE(至適當(dāng)?shù)谋镜毓芾砥?發(fā)送EVE_SERVER_ADDED(至虛擬會(huì)議室)發(fā)送EVE_SERVER_ADDED(至所有同等的會(huì)話管理器)邊E50觸發(fā)出錯(cuò)MR_ADD_SERVER(自會(huì)議室)動(dòng)作發(fā)送EVE_SERVER_ADDED(失敗?)(至虛擬會(huì)議室)邊E51觸發(fā)EVE_VI_DROP_SERVER(自虛擬會(huì)議室)動(dòng)作發(fā)送請(qǐng)求MR_DROP_SERVER(至?xí)h室)邊E52觸發(fā)回答MR_DROP_SERVER(自會(huì)議室)
動(dòng)作發(fā)送MAN_DISCONNECT_FROM_BRIDGE(至適當(dāng)?shù)谋镜毓芾砥?發(fā)送EVE_SERVER_DROPPED(至虛擬會(huì)議室)發(fā)送EVE_SERVER_DRIOPPED(至所有同等的會(huì)話管理器)邊E53觸發(fā)出錯(cuò)MR_DROP_SERVER(自會(huì)議室)動(dòng)作發(fā)送EVE_SERVER_DROPPED(失???)(至虛擬會(huì)議室)邊E56觸發(fā)出錯(cuò)MR_GET_PERSON_INFO(自會(huì)議室)動(dòng)作發(fā)送事件EVE_VI_ADDED_PARTICIPANT失敗(至虛擬會(huì)議室)邊E57觸發(fā)回答MR_GET_PERSON_INFO(自會(huì)議室)動(dòng)作發(fā)送EVE_MEETING_INVITATION(至同等的會(huì)話管理器)邊E58觸發(fā)EVE_REJECT_INVITATION(自同等的會(huì)話管理器)動(dòng)作發(fā)送事件EVE_VI_ADDED_PARTICIPANT失敗(至虛擬會(huì)議室)邊E59觸發(fā)EVE_ACCEPT_INVITATION(自同等的會(huì)話管理器)動(dòng)作發(fā)送MR_ADD_PARTICIPANT(至?xí)h室)邊SELF1(E60)觸發(fā)回答MR_ADD_SERVER(自會(huì)議室)和NS>0動(dòng)作若(成功){發(fā)送MAN_CONNECT_TO_BRIDGE至適當(dāng)?shù)谋镜毓芾砥鱹若(NS>0)發(fā)送MR_ADD_SERVER(至?xí)h室)邊SELF2-1(E61)觸發(fā)EVE_ADDED_PARTICIPANT participant NOT SE-FL(自一同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_VI_ADDED_PARTICIPANT(至虛擬會(huì)議室)邊SELF2-2(E62)觸發(fā)EVE_DROPPED_PARTICIPANT participant NOTSELF(自一同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_DROPPED_PARTICIPANT(至虛擬會(huì)議室)邊SELF2-3(E63)觸發(fā)EVE_LEFT_MEETING(自一同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_LEFT_MEETING(至虛擬會(huì)議室)邊SELF2-4(E64)觸發(fā)EVE_REENTER_MEETING(自一同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_REENTER_MEETING(至虛擬會(huì)議室)邊SELF2-5(E65)觸發(fā)EVE_SERVER_ADDED(自一同等的會(huì)話管理器)動(dòng)作發(fā)送MAN_CONNECT_TO_GRIDGE(至適當(dāng)?shù)谋镜毓芾砥?發(fā)送EVE_SERVER_ADDED(至虛擬會(huì)議室)發(fā)送EVE_SERVER_ADDED(至所有同等的會(huì)話管理器)邊SELF2-6(E66).
觸發(fā)EVE_SERVER_DROPPED(自一同等的會(huì)話管理器)動(dòng)作發(fā)送MAN_DISCONNECT_FROM_BRIDGE(至適當(dāng)?shù)谋镜毓芾砥?發(fā)送EVE_SERVER_DROPPED(至虛擬會(huì)議室)發(fā)送EVE_SERVER_DROPPED(至所有同等的會(huì)話管理器)邊ET1(E67)觸發(fā)暫停(等待EVE_ACCEPT_INVITATION)動(dòng)作發(fā)送EVE_VI_ADDED_PARTICIPANT失敗(至虛擬會(huì)議室)邊ET2(E68)觸發(fā)暫停(等待EVE_MEETING_INVITATION)動(dòng)作發(fā)送EVE_VI_JOIN_MEETING失敗(至虛擬會(huì)議室)邊ET3(E68)觸發(fā)暫停(等待EVE_ADDED_ PARTICIPANT self)動(dòng)作發(fā)送EVE_VI_JOIN_MEETING失敗(至虛擬會(huì)議室)邊E71觸發(fā)EVE_VI_ADD_SERVER(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_ADD_SERVER(至?xí)h室)邊E72-1觸發(fā)回答MR_ADD_SERVER(自會(huì)議室)動(dòng)作發(fā)送MAN_CONNECT_TO_BRIDGE(至適當(dāng)?shù)谋镜毓芾砥?邊E72-2觸發(fā)出錯(cuò)MR_ADD_SERVER(自會(huì)議室)
動(dòng)作無邊E73觸發(fā)EVE_VI_DROP_SERVER(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_DROP_SERVER(至?xí)h室)邊E74-1觸發(fā)回答MR_DROP_SERVER(自會(huì)議室)動(dòng)作發(fā)送MAN_DISCONNECT_FROM_BRIDGE(至適當(dāng)?shù)谋镜毓芾砥?邊E74-2觸發(fā)出錯(cuò)MR_DROP_SERVER(自會(huì)議室)動(dòng)作無邊E75觸發(fā)EVE_VI_ADD_PARTICIPANT(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_GET_PERSON_INFO(至?xí)h室)邊E76觸發(fā)出錯(cuò)MR_GET_PERSON_INFO(自會(huì)議室)動(dòng)作發(fā)送事件EVE_VI_ADDED_PARTICIPANT失敗(至虛擬會(huì)議室)邊E77觸發(fā)EVE_MEETING_SUSPENDED(自同等的會(huì)話管理器)動(dòng)作EVE_MEETING_SUSPENDED(至虛擬會(huì)議室)邊E78觸發(fā)EVE_VI_DROP_PARTICIPANT(自虛擬會(huì)議室)動(dòng)作發(fā)送MR_DROP_PARTICIPANT(至?xí)h室)邊E79觸發(fā)回答MR_DROP_PARTICIPANT(自會(huì)議室)
動(dòng)作發(fā)送EVE_DROP_PARTICIPANT(至虛擬會(huì)議室)發(fā)送EVE_DROP_PARTICIPANT(至所有同等的會(huì)話管理器)邊E80觸發(fā)出錯(cuò)MR_DROP_PARTICIPANT(自會(huì)議室)動(dòng)作無邊E83觸發(fā)回答MR_DROP_PARTICIPANT(自會(huì)議室)&&participant=SELF動(dòng)作發(fā)送EVE_DROP_PARTICIPANT(至虛擬會(huì)議室)發(fā)送EVE_DROP_PARTICIPANT(至所有同等的會(huì)話管理器)邊E84-1觸發(fā)回答MR_LIST_SERVER(自會(huì)議室)動(dòng)作發(fā)送MR_CREATE_MEETING(至?xí)h室)邊E85觸發(fā)出錯(cuò)MR_LIST_SERVERS(自會(huì)議室)動(dòng)作E6動(dòng)作邊E86觸發(fā)EVE_MEETING_JOIN(自同等的會(huì)話管理器)動(dòng)作發(fā)送EVE_VI_JOIN_MEETING(至虛擬會(huì)議室)邊E87觸發(fā)EVE_JOIN_MEETING_ACCEPTED(自虛擬會(huì)議室)動(dòng)作發(fā)送EVE_MEETING_INVITE(至同等的會(huì)話管理器)邊E88
觸發(fā)EVE_JOIN_MEETING_REJECTED(自虛擬會(huì)議室)動(dòng)作EVE_JOIN_MEETING_REJECTED(至等同的會(huì)話管理器)
<pre listing-type="program-listing"><![CDATA[附錄1.na.nf.H1″PROTOCOL BETWEEN MR SERVER AND ITS CLIENTS″.H2 ″Overall Room Control″1. CreateRoom REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_CREATE_ROOM CARD32 seq_no CARD32 length CARD32 MR_id CARD32 owner ROQM_ATTRIBUTES attrib Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_CREATE_ROOM CARD32 seq_no CARD32 length CARD32 room_id Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_CREATE_ROOM CARD32 seq_no CARD32 length ERR_CODE err_code2. DestroyRoom REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code RM_DESTROY_ROOM CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code RM_DESTROY_ROOM CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code RM_DESTROY_ROOM CARD32 seq_no CARD32 length ERR_CODE err_code3. ListRooms REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_LIST_ROOMS CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_LIST_ROOMS CARD32 seq_no CARD32 length CARD32 list_length L_ROOM list_of_roomsError-> REP_TYPE rep_type ERROR_MR_SERVER REP CODE rep_code MR_LIST_ROOMS CARD32 seq_no CARD32 length ERR_CODE err_code4. ShcwRoomStatus REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_SHOW_ROOM_STATUS CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY MR SERVER REP_CODE rep_code MR_SHOW_ROOM_STATUS CARD32 seq_no CARD32 length STATUS status LOCK_STATUS lock_status CARD32 list_length L_MEDIA_SERV_INFO media_list Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_SHOW_ROOM_STATUS CARD32 seq_no CARD32 length ERR_CODE err_code5. ShowRoomAttributes REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_SHOW_ROOM_ATTRIBUTES CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_SHOW_ROOM_ATTRIBUTES CARD32 seq_no CARD32 length ROOM_ATTRIBUTES attrib Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_SHOW_ROOM_ATTRIBUTES CARD32 seq_no CARD32 length ERR_CODE err_code6. AlterRoomAttributes REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_ALTER_ROOM_ATTRIBUTES CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 room_id ROOM_ATTRIBUTES attribReply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE_rep_code MR_ALTER_ROOM_ATTRIBUTES CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_ALTER_ROCM_ATTRIBUTES CARD32 seq_no CARD32 length ERR_CODE err_code7. LockRoom REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_LOCK_ROOM CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_LOCK_ROOM CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_LOCK_ROOM CARD32 seq_no CARD32 length ERR_CODE err_code8. UnlockRocm REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_UNLOCK_ROOM CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_UNLOCK_ROOM CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE_rep_code MR_UNLOCK_ROOM CARD32 seq_no CARD32 length ERR_CODE err_code.H3″Overall Meeting Control″1. CreateMeeting REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_CREATE_MEETING CARD32 seq_no CARD32 lengthCARD32 MR_id CARD32src CARD32 room_id MEETING_ATTRIBUTES attrib Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_CREATE_MEETING CARD32 seq_no CARD32 length CARD32 meeting_id Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_CREATE_MEETING CARD32 seq_no CARD32 length ERR_CODE err_code2. DestroyMeeting REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_DESTROY_MEETING CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 meeting_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_DESTROY_MEETING CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_DESTROY_MEETING CARD32 seq_no CARD32length ERR_CODE_err_code3. ListMeetings REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_LIST_MEETINGS CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_LIST_MEETINGS CARD32 seq_no CARD32 length CARD32 list_length L_MEETING list_of_meetings Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_LIST_MEETINGS CARD32 seq_no CARD32 length ERR_CODE err_code4. ShowMeetingStatusREQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_SHOW_MEETING_STATUS CARD32 seq_no CARD32 length CARD32 MR_id CARD32 Src CARD32 meeting_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP CODE rep_code MR_SHOW_MEETING_STATUS CARD32 seq_no CARD32 length CARD8status CARD32 room_id CARD32 owner CARD32 list_length L_PART_SERV part_serv_list Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_SHOW_MEETING_STATUS CARD32 seq_no CARD32 length ERR_CODE err_code4. ShowMeetRoomStatus REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_SHOW_MEETROOM_STATUS CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP CODE rep_code MR_SHOW_MEETING_STATUS CARD32 seq_no CARD32 length CARD8status CARD32 meeting_id CARD32 owner CARD32 list_length L_PART_SERV part_serv_list Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_SHOW_MEETING_STATUS CARD32 seq_no CARD32 length ERR_CODE err_code5. ShowMeetingAttributes REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_SHOW_MEETING_ATTRIBUTES CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 meeting_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_SHOW_MEETING_ATTRIBUTES CARD32 seq_noCARD32 length MEETING_ATTRIBUTES attrib Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_SHOW_MEETING_ATTRIBUTES CARD32 seq_no CARD32 length ERR_CODE err_code6. AlterMeetingAttributes REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_ALTER_MEETING_ATTRIBUTES CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 meeting_id MEETING_ATTRIBUTES attrib Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_ALTER_MEETING_ATTRIBUTES CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_ALTER_MEETING_ATTRIBUTES CARD32 seq_no CARD32 length ERR_CODE err_code7. AddParticipant REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_ADD_PARTICIPANT CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 meeting_id PARTICIPANT participant Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_ADD_PARTICIPANT CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_ADD_PARTICIPANT CARD32 seq_no CARD32 length ERR_CODE err_code8. DropParticipant REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_DROP_PARTICIPANT CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 meeting_id PARTICIPANT participantReply-> REP_TYPE rep_type REPLY_MR_SERVER REP CODE rep_code MR_DROP_PARTICIPANT CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_DROP_PARTICIPANT CARD32 seq_no CARD32 length ERR_CODE err_code9. LeaveMeeting REQ_TYPE req_type REQUEST_MR_SERVER REQ CODE req_code MR_LEAVE_MEETING CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 meeting_id CARD32 list_length L_MEDIA media_list Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_LEAVE_MEETING CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_LEAVE_MEETING CARD32 seq_no CARD32 length ERR_CODE err_code10. ReenterMeeting REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_REENTER_MEETING CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 meeting_id CARD32 list_length L_MEDIA server_list Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_REENTER_MEETING CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_REENTER_MEETING CARD32 seq_no CARD32 length ERR_CODE err_code11. SuspendMeeting REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_SUSPEND_MEETING CARD32seq_no CARD32 lengthCARD32 MR_id CARD32 src CARD32 meeting_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE_rep_code MR_SUSPEND_MEETING CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_SUSPEND_MEETING CARD32 seq_no CARD32 length ERR_CODE err_code12. ResumeMeeting REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_RESUME_MEETING CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 meeting_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_RESUME_MEETING CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_RESUME_MEETING CARD32 seq_no CARD32 length ERR_CODE err_code.H2″Meeting Association with a Room″1. ShowAssociatedRoom REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_SHOW_ASSOCIATED_ROOM CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 meeting_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_SHOW_ASSOCIATED_ROOM CARD32 seq_no CARD32 length CARD32 room_id Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_SHOW_ASSOCIATED_ROOM CARD32 seq_no CARD32 length ERR_CODE err_code2. ShowAssociatedMeeting REQ_TYPE req_type REQUEST_MR_SERVERREQ_CODE req_code MR_SHOW_ASSOCIATED_MEETING CARD32 seq_no CARD32 length CARD32 MR_id CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_SHOW_ASSOCIATED_MEETING CARD32 seq_no CARD32 length CARD32 meeting_id Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_SHOW_ASSOCIATED_MEETING CARD32 seq_no CARD32 length ERR_CODE err_code. H2″Media Server Associations With a Room″1. AddServer EEO_TYPE req_type REOUEST_MR_SERVER REO_CODE req_code MR_ADD_SERVER CARD32 seq_no CARD32 length CARD32 src CARD32 room_id MEDIAserver STRING user_desc CARD32 list_length L_PARTICIPANT participant_list Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_ADD_SERVER CARD32 seq_no CARD32 length SERV_CONN conn Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_ADD_SERVER CARD32 seq_no CARD32 length ERR_CODE err_code2. DropServer REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_DROP_SERVER CARD32 seq_uo CARD32 length CARD32 src CARD32 room_id MEDIAserver STRING user_desc Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_DROP_SERVER CARD32 seq_no CARD32 lengthError-> REP_TYPE rep_type EROR_MR_SERVER REP_CODE rep_code MR_DROP_SERVER CARD32 seq_no CARD32 length ERR_CODE err_code3. SetServerAccessList REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_SET_SERVER_ACCESS_LIST CARD32 seq_no CARD32 length CARD32 src CARD32 room_id MEDIAserver CARD32 list_length L_PARTICIPANT participant_list Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_SET_SERVER_ACCESS_LIST CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_SET_SERVER_ACCESS_LIST CARD32 seq_no CARD32 length ERR_CODE err_code4. ListServers REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_LIST_SERVERS CARD32 seq_no CARD32 length CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_LIST_SERVERS CARD32 seq_no CARD32 length CARD32 list_length L_MEDIA server_list Error-> REP_TYPE rep_type ERROR_MR_SERVER REP_CODE rep_code MR_LIST_SERVERS CARD32 seq_no CARD32 length CARD32 err_code5. GetServerInfo REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_GET_SERVER_INFO CARD32 seq_no CARD32 length CARD32 src MEDIAserver STRING user_desc Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_GET_SERVER_INFOCARD32 seq_no CARD32 length SERV_CONN conn Error-> REP_TYPE rep_rype ERROR_MR_SERVER REP_CODE rep_code MR_GET_SERVER_INFO CARD32 seq_no CARD32 length ERR_CODE err_code.H2″Name Service Messages″1. CreateUser REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_CREATE_USER CARD32 seq_no CARD32 length STRING name CONN_LIST connection_list Reply-> REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_CREATE_USER CARD32 seq_no CARD32 length CARD32 id ID Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_CREATE_USER CARD32 seq_no CARD32 length ERR_CODE err_code2. CreateDuplicateUser REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_CREATE_DUP_USER CARD32 seq_no CARD32 length CARD32ID STRING name CONN_LIST connection_list Reply-> REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_CREATE_DUP_USER CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_CREATE_DUP_USER CARD32 seq_no CARD32 length ERR_CODE err_code3. DeleteUser REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_DELETE_USER CARD32 seq_no CARD32 length CARD32ID CONN_LIST connection_listReply-> REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_CHANGE_USER CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_CHANGE_USER CARD32 seq_no CARD32 length ERR_CODE err_code4. GetPersonInfo REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_GET_PERSON_INFO CARD32 seg_no CARD32 length CARD32 part_id ID Reply-> REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_GET_PERSON_INFO CARD32 seg_no CARD32 length CARD32 part_id STRING name CARD32 list_length L_NM_CONNECTIONS list_of_all_connections Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_GET_PERSON_INFO CARD32 seq_no CARD32 length ERR_CODE err_code5. CreateNMEntry REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_CREATE_NM_ENTRY CARD32 seq_no CARD32 length NM_ADDR nm_address RANGE_ID range Reply-> REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_CREATE_NM_ENTRY CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_CREATE_NM_ENTRY CARD32 seq_no CARD32 length ERR_CODE err_code6. DeleteNMEntry REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_DELETE NM ENTRY CARD32 seq_no CARD32 length NM_ADDR nm_address Reply->REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_DELETE_NM_ENTRY CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP CODE rep_code REG_DELETE_NM_ENTRY CARD32 seq_no CARD32 length ERR_CODE err_code7. GetNMEntry REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_GET_NM_ENTRY CARD32 seq_no CARD32 length CARD32 id Reply-> REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_GET_NM_ENTRY CARD32 seq_no CARD32 length NM_ADDR nm_address Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_GET_NM_ENTRY CARD32 seq_no CARD32 length ERR_CODE err_code8. GetPhoneInfo REQ_TYPE rep_type REQUEST_REGISTPY_SERVER REQ_CODE req_code REG_GET_PHONE_INFO CARD32 seq_no CARD32 length CARD32 part_id Id Reply-> REP_TYPE rep_type REPLY_REGISTRY_SERVER REQ_CODE req_code REG_GET_PHONE_INFO CARD32 seq_no CARD32 length CARD32 part_id STRING name CARD32 list_length L_PHONE_CONNECTIONS list_of_all_phone_numbers Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_GET_PHONE_INFO CARD32 seq_no CARD32 length ERR_CODE err_code8. GetVideoclassInfo//Return info about all devices with class_id,part_id REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_GET_VIDEO_CLASS_INFO CARD32 seq_no CARD32 length CARD32 participant_id //-ve pid means return with only class_id as match CARD32 class_id Reply->REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_GET_VIDEO_CLASS_INFO CARD32 seq_no CARD32 length. CARD32 list_length L_VIDEO_CONNECTIONS list_of_all_video_conns Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_GET_VIDEO_CLASS_INFO CARD32 seq_no CARD32 length CARD32 participant_id ERR_CODE err_code8. GetVideoDevInfo REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE_req_code REG_GET_VIDEO_DEV_INFO CARD32 seq_no CARD32 length CARD32 vid Reply-> REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_GET_VIDEO_DEV_INFO CARD32 seq_no CARD32 length VIDEO_LIST vid_list Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_GET_VIDEO_DEV_INFO CARD32 seq_no CARD32 length ERR_CODE err_code9. GetVideoDeviceList REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_GET_VIDEO_DEV_LIST CARD32 seq_no CARD32 length Reply-> REP_TYPE rep_type REPLY_REGISTRY_SERVER REP_CODE rep_code REG_GET_VIDEO_DEV_LIST CARD32 seq_no CARD32. length VIDEO_LIST vid_list Error-> REP_TYPE rep_type ERROR_REGISTRY_SERVER REP_CODE rep_code REG_GET_VIDEO_DEV_INFO CARD32 seq_no CARD32 length ERR_CODE err_code.H1″Protocol between Conversation Managers″.H2″Requests″1. ShowAssociatedRoom REQ_TYPE req_type REQUEST_CM REQ_CODE_req_code CM_SHOW_ASSOCIATED_ROOMCARD32 seq_no CARD32 length CARD32 src CARD32 meeting_id Reply-> REP_TYPE rep_type REPLY_CM REP_CODE req_code CH_SHOW_ASSOCIATED_ROOM CARD32 seq_no CARD32 length CARD32 src CARD32 room_id Error-> REP_TYPE rep_type REPLY_CM REP_CODE req_code CM_SHOW_ASSOCIATED_ROOM CARD32 seq_no CARD32 length ERR_CODE err_code2. ShowAssociatedMeeting REQ_TYPE req_type REQUEST_CM REQ_CODE req_code CM_SHOW_ASSOCIATED_MEETING CARD32 seq_no CARD32 length CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY_CM REP_CODE req_code CM_SHOW_ASSOCIATED_MEETING CARD32 seq_no CARD32 length CARD32 src CARD32 meeting_id Error-> REP_TYPE rep_type REPLY_CM REP_CODE req_code CM_SHOW_ASSOCIATED_MEETING CARD32 seq_no CARD32 length ERR_CODE err_code.H2″Events″1. EveMeetingInvite REQ_TYPE req_type EVENT_CM REQ_CODE req_code EVE_MEETING_INVITE CARD32 seq_no CARD32 length CARD32 src STRING src_name CARD32 room_id CARD32 meeting_id CARD32 list_length L_MEDIA server_list CARD32 list_length L_PART_MED_INFO part_list2. EveAcceptInvitation REQ_TYPE req_type EVENT_CM REQ_CODE req_code EVE_ACCEPT_INVITATION CARD32 seq_no CARD32 length CARD32 srcCARD32 room_id CARD32 meeting_id CARD32 list_length L_MEDIA server_list3. EveMeetingJoin REQ_TYPE req_type EVENT_CM REQ_CODE req_code EVE_MEETING_JOIN CARD32 seq_no CARD32 lenqth CARD32 src CARD32 room_id CARD32 meeting_id4. EveAddedParticipant REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_ADDED_PARTICIPANT CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 meeting_id CARD32 participant CARD32 list_length L_MEDIA_SERV_INFO media_list5. EveDroppedParticipant REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_DROPPED_PARTICIPANT CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 meeting_id CARD32 participant6. EveMeetingDestroyed REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_MEETING_DESTROYED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 meeting_id7. EveRoomDestroyed REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_ROOM_DESTROYED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id8. EveLeftMeeting REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_LEFT_MEETING CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 meeting_id CARD32 person_id CARD32 list_length L_MEDIA server_list9. EveReenterMeetingREP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_REENTER_MEETING CARD32 Seq_no CARD32 length. CARD32 src CARD32 room_id CARD32 meeting_id CARD32 person_id CARD32 list_length L_MEDIA server_list10.EveMeetingSuspended REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_MEETING_SUSPENDED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 meeting_id11. EveMeetingResumde REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_MEETING_RESUMED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 meeting_id12. EveServerAdded REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_SERVER_ADDED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 meeting_id MEDIA_SERV_INFO media_info CARD32 list_len L_PARTICIPANT part_list//participant list who have access13. EveServerDropped REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_SERVER_DROPPED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 meeting_id14. EveRoomLocked REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_ROOM_LOCKED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id16. EveRoomUnocked REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_ROOM_UNLOCKED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id17. EveServerAccessListSet REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_SERVER_ACCESS_LIST_SET CARD32 seq_no. CARD32 length CARD32 src MEDIAmedia_number STRING media_name CARD32 list_length L_PARTICIPANT part_list//list of participants granted access18. EveServerAccessDenied REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_SERVER_ACCESS_DENIED CARD32 seq_no CARD32 length CARD32 src MEDIAmedia number STRING media name CARD32 participant19. EveRejectInvitation REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_REIECT_INVITATION CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 meeting_id.H1″Media Server Messages″.H2″Generic Requests to Media Servers″1. AssociateServer REQ_TYPE req_type REQUEST_GEN_SERVER REQ_CODE req_code GEN_ASSOCIATE_SERVER CARD32 seq_no CARD32 length CARD32 room_id Reply-> REP_TYPE rep_type REPLY_GEN_SERVER REP_CODE rep_code GEN_ASSOCIATE_SERVER CARD32 seq_no CARD32 length CARD32 port Error-> REP_TYPE rep_type ERROR_GEN_SERVER REP_CODE rep_code GEN_ASSOCIATE_SERVER CARD32 seq_no CARD32 length ERR_CODE err_code2. DisassociateServer REQ_TYPE req_type REQUEST_GEN_SERVER REQ_CODE req_code GEN_DISASSOCIATE_SERVER CARD32 seq_no CARD32 length CARD32 room_id Reply-> REP_TYPE rep_type REPLY_GEN_SERVER REP_CODE rep_code GEN_DISASSOCIATE_SERVERCARD32 seg_no CARD32 length Error-> REP_TYPE rep_type ERROR_GEN_SERVER REP_CODE rep_code GEN_DISASSOCIATE_SERVER CARD32 seq_no CARD32 length ERR_CODE err_code3. SetAccessList REQ_TYPE req_type REQUEST_GEN_SERVER REQ_CODE req_code GEN_SET_ACCESS_LIST CARD32 seq_no CARD32 length CARD32 room_id CARD32 list_length L_PARTICIPANT participant_list Reply-> REP_TYPE rep_type REPLY_GEN_SERVER REP_CODE rep_code GEN_SET_ACCESS_LIST CARD32 seq_no CARD32 length Error-> REP_TYPE rep_type ERROR_GEN_SERVER REP_CODE rep_code GEN_SET_ACCESS_LIST CARD32 seq_no CARD32 length ERR_CODE err_code.H2″Events from MR Server to Media Servers″1. EveAddedParticipant REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_ADDED_PARTICIPANT CARD32 seq_no CARD32length CARD32room_id CARD32 meeting_id CARD32 participant2. EveDroppedParticipant REP_TYPE rep_type EVENT_MR_SERVERREP_CODE rep_code EVE_DROPPED_PARTICIPANT CARD32 seq_no CARD32 length CARD32room_id CARD32 meeting_id CARD32 participant3. EveMeetingCreated REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_MEETING_CREATED CARD32 seq_no CARD32 length CARD32room_id CARD32 meeting_id4. EveMeetingDestroyed REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_MEETING_DESTROYED CARD32 seq_no CARD32 lengthCARD32room_id CARD32 meeting_id5. EveRoomDestroyed REP_TYPE rep_type EVENT_MR_SERVER REP CODE rep_code EVE_ROOM_DESTROYED CARD32 seq_no CARD32 length CARD32src CARD32 room_id6. EveLeftMeeting REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_LEFT_MEETING CARD32 seq_no CARD32 length CARD32room_id CARD32 meeting_id CARD32 person_id7. EveReenterMeeting REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_REERNTER_MEETING CARD32 seq_no CARD32 length CARD32 room_id CARD32 meeting_id CARD32 person_id8. EveMeetingSuspended REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_MEETING_SUSPENDED CARD32 seq_no CARD32 length CARD32room_id CARD32 meeting_id9. EveMeetingResumed REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_MEETING_RESUMED CARD32 seq_no CARD32 length CARD32room_id CARD32 meeting_id.H2″X BRIDGE MESSAGES″1. CreateApplication REQ_TYPE req_type REQUEST_X_BRIDGE REQ_CODE req_code X_CREATE_APPL CARD32 seq_no CARD32 length CARD32 src CARD32 room_id CARD32 machine STRING appl_name /*application attribs here*/ Reply-> None Error-> REP_TYPE rep_type ERROR_X_BRIDGE REP_CODE rep_code X_CREATE_APPL CARD32 seq_no CARD32 lengthERR_CODE err_code2. AssociateApplication REQ_TYPE req_type REQUEST_X_BRIDGE REQ_CODE req_code X_ASSOCIATE_APPL CARD32 seq_no CARD32 length CARD32 src CARD32 room_id APPL_ID appl_id Reply-> None Error-> REP_TYPE rep_type ERROR_X_BRIDGE REP_CODE rep_code X_ASSOCIATE_APPL CARD32 seq_no CARD32 length ERR_CODE err_code3. DisassociateApplication REQ_TYPE req_type REQUEST_X_BRIDGE REQ_CODE req_code X_DISASSOCIATE_APPL CARD32 seq_no CARD32 length CARD32 src APPL_ID appl_id Reply-> None Error-> REP_TYPE rep_type ERROR_X_BRIDGE REP_CODE rep_code X_DISASSOCIATE_APPL CARD32 seq_no CARD32 length ERR_CODE err_code4. DestroyApplication REQ_TYPE req_type REQUEST_X_BRIDGE REQ_CODE req_code X_DESTROY_APPL CARD32 seq_no CARD32 length CARD32 src APPL_ID appl_id Reply-> None Error-> REP_TYPE rep_type ERROR_X_BRIDGE REP_CODE rep_code X_DESTROY_APPL CARD32 seq_no CARD32 length ERR_CODE err_code5. SetInputFilter REQ_TYPE req_type REQUEST_X_BRIDGE REQ_CODE req_code X_SET_INPUT CARD32 seq_no CARD32 length CARD32 src APPL_ID appl_id CARD32 list_length L_PART_INMODE part_mode_listReply-> None Error-> REP_TYPE rep_type ERROR_X_BRIDGE REP_CODE rep_code X_SET_INPUT CARD32 seq_no CARD32 length ERR_CODE err_code6. SetOutputFilter REQ_TYPE req_type REQUEST_X_BRIDGE REQ_CODE req_code X_SET_OUTPUT CARD32 seq_no CARD32 length CARD32 src APPL_ID appl_id CARD32 list_length L_PART_OUTMODE part_mode_list Reply-> None Error-> REP_TYPE rep_type ERROR_X_BRIDGE REP_CODE rep_code X_SET_OUTPUT CARD32 seq_no CARD32 length ERR_CODE err_code7. GetApplicationStatus REQ_TYPE req_type REQUEST_X_BRIDGE REQ_CODE req_code X_APPL_STATUS CARD32 seq_no CARD32 length CARD32 src APPL_ID appl_id Reply-> REP_TYPE rep_type REPLY_X_BRIDGE REP_CODE rep_code X_APPL_STATUS CARD32 seq_no CARD32 length APPL_STATUS appl_stat Error-> REP_TYPE rep_type ERROR_X_BRIDGE REP_CODE rep_code X_APPL_STATUS CARD32 seq_no CARD32 length ERR_CODE err_code8. ListApplicationsInRoom REQ_TYPE req_type REQUEST_X_BRIDGE REQ_CODE req_code X_LIST_ROOM_APPLS CARD32 seq_no CARD32 length CARD32 src CARD32 room_id Reply-> REP_TYPE rep_type REPLY_X_BRIDGE REP_CODE rep_code X_LIST_ROOM_APPLS CARD32seq_no CARD32 lengthCARD32 list_length L_APPL appl_list Error-> REP_TYPE rep_type ERROR_X_BRIDGE REP_CODE rep_code X_LIST_ROOM_APPLS CARD32 seq_no CAED32 length ERR_CODE err_code.H2″Requests from X Bridge to local X managers″1. StartApplication REQ_TYPE req_type REQUEST_LOCALX REQ_CODE req_code LOCX_START_APPL CARD32 seq_no CARD32 length CARD32 src APPL_ID appl_id STRING appl_name Reply-> REP_TYPE rep_type REPLY_LOCALX REP_CODE rep_code LOCX_START_APPL CARD32 seq_no CARD32 length CARD8status//success or failure Error-> REP_TYPE rep_type ERROR_LOCALX REP_CODE rep_code LOCX_START_APPL CARD32 seq_no CARD32 length ERR_CODE err_code2. KillApplication REQ_TYPE req_type REQUEST_LOCALX REQ_CODE req_code LOCX_KILL_APPL CARD32 seq_no CARD32 length CARD32 src APPL_ID appl_id Reply-> None Error-> None.H2″Events from X Bridge to local X managers″L. EveApplicationAdded REP_TYPE rep_type EVENT_X_BRIDGE REP_CODE rep_code EVE_X_APPL_ADDED CARD32 seq_no CARD32 length APPL_ID appl_id2. EveApplicationAssociated REP_TYPE rep_type EVENT_X_BRIDGE REP_CODE rep_code EVE_X_APPL_ASSOCIATED CARD32 seq_no CARD32 length APPL_ID appl_id3. EveApplicationDestroyedREP_TYPE rep_type EVENT_X_BRIDGE REP_CODE rep_code EVE_X_APPL_DESTROYED CARD32 seq_no CARD32 length. APPL_ID appl_id4. EveApplicationDisassociated REP_TYPE rep_type EVENT_X_BRIDGE REP_CODE rep_code EVE_X_APPL_DISASSOCIATED CARD32 seq_no CARD32 length APPL_ID appl_id5. EveInputFilterSet REP_TYPE rep_type EVENT_X_BRIDGE REP_CODE rep_code EVE_X_INPUT_SET CARD32 seq_no CARD32 length APPL_ID appl_id APPL_MODE mode6. EveOutputFilterSet REP_TYPE rep_type EVENT_X_BRIDGE REP_CODE rep_code EVE_X_OUTPUT_SET CARD32 seq_no CARD32 length APPL_ID appl_id APPL_MODE mode.H2″VIDEO BRIDGE MESSAGES″.H3″Protocol between Video Bridge and Local Video Manager″1. Input_filter REQ_TYPE req_type REQUEST_VIDEO_BRIDGE REQ_CODE req_code VID_INPUT_FILTER CARD32 seq_no CARD32 length CARD32 room_id CARD32 srcID CARD32 list_length L_INP_FILT filt_participants Reply-> None Error-> REP_TYPE rep_type ERROR_VIDEO BRIDGE REP CODE rep_code VID_INPUT_FILTER CARD32 seq_no CARD32 length ERR_CODE err_code2. Output_filter REQ_TYPE req_type REQUEST_VIDEO_BRIDGE REQ_CODE req_code VID_OUTPUT_FILTER CARD32 seq_no CARD32 length CARD32 room_id CARD32 src ID CARD32 list_length L_INP_FILT filt_participants Reply-> NoneError-> REP_TYPE rep_type ERROR_VIDEO_BRIDGE REP_CODE rep_code VID_OUTPUT_FILTER CARD32 seq_n CARD32 length ERR_CODE err_code3. Start_logging REQ_TYPE req_type REQUEST_VIDEO_BRIDGE REQ_CODE req_code VID_START_LOGGING CARD32 seq_no CARD32 length CARD32 room_id CARD32 src ID STRING log_params Reply-> None Error-> REP_TYPE rep_type ERROR VIDEO BRIDGE REP_CODE rep_code VID_START_LOGGING CARD32 seq_no CARD32 length ERR_CODE err_code4. Stop_logging REQ_TYPE req_type REQUEST_VIDEO_BRIDGE REQ_CODE req_code VID_STOP_LOGGING CARD32 seq_no CARD32 length CARD32 src ID CARD32 room_id Reply-> None Error-> REP_TYPE rep_type ERROR VIDEO BRIDGE REP CODE rep_code VID_STOP_LOGGING CARD32 seq_no CARD32 length ERR_CODE err_code5. Set_switch_params REQ_TYPE req_type REQUEST_VIDEO BRIDGE REQ_CODE req_code VID_SET_SWITCH_PARAMS CARD32 seq_no CARD32 length CARD32 src ID VID_SWITCH_PARAMS vid_sw Reply-> None Error-> REP_TYPE rep_type ERROR VIDEO BRIDGE REP_CODE rep_code VID_SET_SWITCH_PARAMS CARD32 seq_no CARD32 length ERR_CODE err_code.H2″Protocol between Video Bridges″Requests1. Device Info REQ_TYPE req_type REQUEST_VIDEO_RRIDGE REQ_CODE req_code VID_DEVICE_INFO CAED32 seq_no. CARD32 length Reply-> REP_TYPE rep_type REPLY_VIDEO_BRIDGE REP_CODE rep_code VID_DEVICE_INFO CARD32 seq_no CARD32 length VID_DEV_INFO vid_dev Error-> None2. Send_Single REQ_TYPE req_type REQUEST_VIDEO_BRIDGE REQ CODE req_code VID_SEND_SINGLE CARD32 seq_no CARD32 length PARTICIPANT src Reply-> REQ_TYPE req_type REPLY_VIDEO_BRIDGE REQ_CODE req_code VID_SEND_SINGLE CARD32 seq_no CARD32 length VID_SINGLE_INFO info Error-> REQ_TYPE req_type ERROR VIDEO BRIDGE REQ_CODE req_code VID_SEND_SINGLE CARD32 seq_no CARD32 length ERR_CODE error3. Send_Composite REQ_TYPE req_type REQUEST_VIDEO_BRIDGE REQ_CODE req_code VID_SEND_COMPOSITE CARD32seq_no CARD32 length CARD32 list_length L_PARTICIPANT participant_list Reply-> REQ_TYPE req_type REPLY_VIDEO_BRIDGE REQ_CODE req_code VTD_SEND_COMPOSITE CARD32 seq_no CARD32 length VID_COMPOSITE_INFO info Error-> REQ_TYPE req_type ERROR_VIDEO_BRIDGE REQ_CODE req_code VID_SEND_CCMPOSITE CARD32 seq_no CARD32 length ERR_CODE error.H1″Events from Local Interface to Local Media Managers″1. SuspendServer REQ_TYPE req_type EVENT_CM REQ_CODE req_code MAN_SUSPEND_MANAGER CARD32 seq_no CARD32 length2.RegumeServer REQ_TYPE req_type EVENT_CM REQ_CODE req_code MAN_RESUME_MANAGER CARD32 seq_no CARD32 length3. ConnectToBridge REQ_TYPE req_type EVENT_CM REQ_CODE req_code MAN_CONNECT_TO_BRIDGE CARD32 seq_no CARD32 length CARD32 room_id SERV_CONN server_connection4. DisconnectFromBridge REQ_TYPE req_type_type EVENT_CM REQ_CODE req_code MAN_DISCONNECT_FROM_BRIDGE CARD32 seq_no CARD32 length CARD32 room_id.H1″Events from Local Media Managers to Conversation Manager″1. ManagerUp REQ_TYPE req_type EVENT_MAN REQ_CODE req_code EVE_MAN_UP CARD32 seq_no CARD32 length MEDIAmedia STREING udesc2. StateChange REQ_TYPE req_type EVENT_MAN REQ_CODE req_code EVE_STATE_CHANGE CARD32 seq_no CARD32 length CARD8state//codeCONNECTION_NORMAL=1,CONNECTION_BROKEN=0.H1″Events from Conversation Manager to Local Media Managers″1. ParticipantInfo REQ_TYPE req_type EVENT_CM REQ_CODE req_code EVE_PARTICIPANT_INFO CARD32 seq_no CARD32 length STRING participant_name PARTICIPANT participant_id.H1″Requests from Conversation Manager to VI″1. MeetingInvitation REQ_TYPE req_type REQUEST_VI REQ_CODE req_code VI_MEETING_INVITATION CARD32 seq_no CARD32 length CARD32 meeting_id //the real id CARD32 participant_id CARD32 list_length L_MEDIA media Reply-> REP_TYPE rep_type REPLY_VI REP_CODE rep_code VI_MEETING_INVITATION CARD32 seq_noCARD32 length CARD8 status //1=rejected,1=accepted CARD32 pseudo_meeting_id CARD32 list_length L_MEDIA media Error-> REP_TYPE rep_type ERROR_VI REP_CODE rep_code VI_MEETING_INVITATION CARD32 seq_no CARD32 length ERR_CODE err_code.H1″Events from CM to VI″1. AddedParticipant REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_VI_ADDED_PARTICIPANT CARD32 seq_no CARD32 length CARD8status //0=failed,1=success CARD32 pseudo_meeting_id CARD32 participant_id CARD32 list_length L_MEDIA media.H1″Events from VI to CM″1.VIUp REQ_TYPE req_type EVENT_VI REQ_CODE req_code EVE_VI_UP CARD32 seq_no CARD32 length //length is zero1. CreateMeeting REP_TYPE rep_type EVENT_VI REP_CODE rep_code EVE_CREATE_MEETING CARD32 seq_no CARD32 length CARD32 pseudo_meeting_id CARD32 participant_id CARD8audio_flag //0=media absent,1=media included CARD8 video_flag CARD8xwin_flag2. CreatePersistentMeeting REP_TYPE rep_type EVENT_VI REPCODE rep_code EVE_CREATE_PERSISTENT_MEETING CARD32 seq_no CARD32 length CARD32 pseudo_meeting_id CARD32participant_id CARD8 audio_flag //0=media absent,1=media included CARD8video_flag CARD8xwin_flagProtocol between Video Manager and Visual InterfaceEvents from Visual Interface to Local Video Manager1. OpenDisplay REP_TYPE rep_type EVENT_VI REP_CODE rep_code EVE_OPEN_DISPLAY CARD32 seq_no CARD32 length2. ViewParticipant REP_TYPE rep_type EVENT_VI REP_CODE rep_code EVE_VIEW_PARTICIPANT CARD32 seq_no CARD32 length CARD32 display_desc CARD32 room_id CARD32 part_id CARD32 xpos //upper left hand corner CARD32 ypos`CARD32 window_size //1-full size,2-half size,3 .../******* don′t know if needed, too similar to one next *****/2. ViewVideoSrc REP_TYPE rep_type EVENT_VI REP_CODE rep_code EVE_VIEW_VIDEO_SRC CARD32 seq_no CARD32 length CARD32 display_desc CARD32 room_id CARD32 vid CARD32 xpos //upper left hand corner CARD32 ypos CARD32 window_size//1-full size, 2-half size, 3.../****************/3. ShareVideo REP_TYPE rep_type EVENT_VI REP_CODE rep_code EVE_SHARE_VIDEO CARD32 seq_no CARD32 length CARD32 display_desc CARD32 room_id CARD32 vid CARD32 xpos //upper left hand corner CARD32 ypos CARD32 window_size //1-full size, 2-half size, 3 ...4. GetVideoId REP_TYPE rep_type EVENT_VI REP_CODE rep_code EVE_GET_VIDEO_ID CARD32 seq_no CARD32 length STRING description5. SetVideoDisplayParams REP_TYPE rep_type EVENT_VI REP_CODE rep_code EVE_SET_VIDEO_DISPLAY_PARAMS CARD32 seq_no CARD32 length CARD32display_desc CARD32 xpos //upper left hand corner CARD32 ypos CARD32 window_size //1-full size,2-half size,3... STRING chroma_key6 CloseDisplay REP_TYPE rep_typeEVENT_VI REP CODE rep_codeEVENT_CLOSE_DISPLAY CARD32 seq_no CARD32 length CARD32 display_descriptorProtocol between Visual Interface and Video ManagerEvents from Local Video Manager to Visual Interface1. DisplayDescInfo REP_TYPE rep_type EVENT_VIDEO_MGR REP_CODE rep_code EVE_DISPLAY_DESC CARD32 length CARD32 display_descriptor2. GetVideoId REP_TYPE rep_type EVENT_VIDEO_MGR REP_CODE rep_code EVE_GET_VIDEO_ID CARD32 seq_no CARD32 length CARD32video_id //returned value3. VidoRequestFail REP_TYPE rep_type EVENT VIDEO MGR REP_CODE rep_code EVE_SHARE_VIDEO CARD32 seq_no CARD32 length CARD32 room_id CARD32 display_descriptor CARD32filiure_type /** shared_dev_in_use, dev_not_available, request_preempted **/4. SharedVideoInvite REP_rep_type EVENT_VIDEO_MGR REP_CODE rep_code EVE_SHARED_VIDEO_INVITE CARD32 seq_no CARD32 length CARD32 room_id5. SharedVideoAccept REP_TYPE rep_type EVENT_VIDEO_MGR REP_CODE rep_code EVE_SHARED_VIDEO_ACCEPT CARD32 seq_no CARD32 length CARD32 room id CARD32 display descriptor.tr~.TLMRA Multimedia Meeting Service (Appendices).AU″J. Robert Ensor.″JRE HO 11353 2979 4F-607 vax135!jre.AU″Murali Aravamudan″MA MH 51152 7396 7E-418 ulysses!mur.MT O.bp.HU″APPENDIX A″.DFPROTOCOL TYPE DEFINITIONSBYTE8-bit valueINT88-bit signed integerINT16 16-bit signed integerINT32 32-bit signed integerCARD8 8-bit unsigned integerCARD16 16-bit unsigned integerCARD32 32-bit unsigned integerREQ_TYPE CARD8REQ_CODE CARD8ERR_CODE CARD32STRING[CARD32,<item>]//length, actual string id length*CARD8L ROOMListOfCARD32FULL_ROOM [CARD32, STRING] // room_id, room_nameL FULL ROOM ListOfFULL_ROOMPARTICIPANT CARD32//IDL PARTICIPANT ListOfPARTICIPANTMEDIA CARD8//0-Audio,1-Phone,2-Video,3-XWindows, //4-MSWindows 5-Mac 6-CwqL_MEDIAListOfMEDIASTATUSCARD8//0=EMPTY ROOM,1=ROCM_W_MEETING,2=ROOM_W_RESOURCES, //3=ROOM_W_MEETING_RESOURCES,4=ROOM_W_SUSPENDED_MEETINGLOCK_STATUSCARD8//0=LOCKED,1=UNLOCKEDROOM_ATTRIBCARD32MEETING_ATTRIBCARD8CONN_LIST[STRING,CARD32]//<Machine, Port>PHONE_LIST[STRING,STRING,STRING,STRING,STRING,STRING,STRING,STRING] which is [LocationCode,OutsideDialPrefix,InterexchangeCarrier, AreaCode,Phone,InternalPhone,CountryE CountryCode]VIDEO_LIST [CARD32,CARD32,String,String,String,String,String, String,CARD32,CARD32,CARD32,CARD32] which is[vid,vid_dev_type,function,location_mach, loc mach add,control mach,control mach_add,control_dev, switch_type,io_type,io_number,pid]L_CONNECTIONS ListOfCONN_LISTL_NM_CONNECTIONSListOfCONN_LISTL_PHONE_CONNECTIONSListOfPHONE_LISTL_VIDEO_CONNECTIONSListOfVIDEO_LISTNM ADDR <STRING,CARD32>RANGE_CommObjMgr(){} virtual void process(MmConnection pconn)=O; int IsAlive(){return(is_alive);}protected MRInterface * Iface; int is alive; int next_id;};class LocalSessionMgrpublic CommObjMgr{public LocalSessionMgr(MRInterface *iface)CommObjMgr(iface) {ia_alive=1;} void process(MmConnection pconn);private void garbage_collect(); List_of_p(LocalSession) client_list;};class FrontEndMgrpublic GommObjMgr{public FrontEndMgr(MRInterface *iface)CommObjMgr(ifate) {is_alive=1;} void process(MmConnection pconn); void GetObjectList(List_of_p(FrontEnd)&amp; fend_list) { fend_list=client_list;} private void garbage collec(); void garbage_collect() List_of_p(FrontEnd) client_list;};class ReqNMMgrpublic CommObjMgr{public ReqNMMgr(MRInterface *iface); void process(MmConnection pconn); int send_to_NM(Message *msg); private ReqNM *nm_obj;); class ReqMRMgrpublic CommObjMgr{ public ReqMRMgr(MRIn terface *iface)CommObjMgr(iface){is_alive=1;} void process(MmConnection pconn); int send_to_MR(String machine,int port,Message *msg); private void garbage collect(); List_of_p(ReqMR) server_list;Jan 5 115622 19939 Page 1 of obj_man.hobj_man.h ob.j_man.h}; ...List_of_pdeclare#endifJan 5 11561999 Page 2 of obj_man.hproto.h proto.h#ifnder_MR_PROTO_H#define_MR_PROTO_H 1#include<mr_msg_.h>#include<medserv_msg.h>#include<generator.h>#include<common.h>class Protocol{public Protocol(MRInterface *iface); -Protocol(){}; void interpret_header,(char *header,CARD8&amp; type,CARD8&amp; opcdoe, CARD32&amp; seq CARD32&amp; len); Message *construct_msg(char *header,CARD8 type,CARD8 opcode, CARD32 seq,CARD32 len,cahr*data,Connection *conn);private MessagePtr(*Gen_func_tab[MAX_MSG_TYPES]MAX_MSGS])(char *, CARD8,CARD8,CARD2,CARD32,char *,Connection *); MRInterface *Iface; Convert *Conv;};# endifJan5 115614 1993Page 1 of proto.hroom.h room.h#ifndef_ ROOM_H#define _ROOM_H 1#include<NM_types.h>#include<common.h>#include<String.h>#include<system_proto.h>List_of_pdeclare(Conferee) List_of_pdeclareclass Conferee{public Conferee(int c_id){id=cid;} Conferee(); int ID(){return(id);} void add_media(MediaDesc med); void drop_ media(MediaDesc med); void suspend media(MediaDesc med); void suspend_media(List_of_p(MediaDesc)&amp; med_list); void resume media(kMediaDesc med); void resume media(List_of_p(MediaDesc)&amp; med_list); List_of_p{FullMediaDesc)get_mcdia_list(){return(media_list);}private int id; ConfereeStatus status; List_of_p(FullMediaDesc) media_list;//list of servers used by}; //this confereeclass Meeting {public Meeting(int meeting id,CARD32 mowner,RoomAttrib mattr, Room *mroom,RoomMgr *mRMgr); - Meeting(); int MeetingId(){return(id);} int num_conferees(){return(conf_list.length());} MeetingAttrib get_meeting_attrib(){return(attrib);} void set meeting_attrib(MeetingAttrib m_attrib){attrib=m_attrib;} void get_meeting_info(List(ParticipantInfo)&amp; info); void get_meeting_partcipants(List(int)&amp; plist); int get_meeting_owner(){return owner;} MeetingStatus get_meeting_status(){retur*n status;} int add_participanrt(int participant); int drop_participant(int participant); void addmedia(*int participant,MediaDesc med); void drop_media(int participant, MediaDesc med); void dropmedia(MediaDesc med); void restrict_media_access(List(int)&amp; part_list,MediaDesc med); void suspend_media(MediaDesc med); void resume media(MediaDese med); int suspend_meeting(); int resume_meeting(); int state_check(); int leave_meeting(int participant, List_of_p(MediaDesc )&amp; media_list); int reenter_meeting(int participant, List_of_p(MediaDesc)&amp; media_list);private void drop all_participants(); void change_owner(); int id; Room *room; CARD32 owner; MeetingAttrib attrib; MeetingStatus status;Jan 5 115614 1993 Page 1 of room. hroom.h room.h RoomMgr*RMgr; ...List_of_pdeclare EventNotifier *EveNot; List of_p(Conferee) conf_list; int err;};enum MRScope{e_MEETING_SCOPE,c_ROOM_SCOPE};struct MediaServerInfoInRoom{ int server; MediaServerStatus status; MRScope scope;};List_of_pdeclare(MediaServerInfoInRoom) List_of_pdeclareclass Room{public Room(int room_id,CARD32 rowner,RoomAttrib rattr, String&amp; rname, RoomMgr*rRMgr); -Room(); iht RoomId(){return(id);} int MRId(){return(MR_id);} iht IsClosed(){return(attrib);} String RoomName(){raturn(room_name);} void meeting_destroyed(); _void meetingcreated(Meeting* m); RoomAttrib room_attrib(){return(attrib);} void set_room_attrib(RoomAttrib r_attrib){attrib=r_attrib;} RoomStatus room status(){return(status);} RoomLockStgus room lock status(){return(lock_status);} void set_room_status(RoomStatus r_status){status=r_status;} int has_meeting){return(meeting? 1∶O);} Meeting*get_meeting(){return(meeting);} int add_server(int server_id,Medis media,String&amp; user_desc, List(int)&amp; part_list); int drop server(int server_id,Medis medis,String&amp; user_desc); int suspend_server(int server_id,Medlia medis,String&amp; user_desc); int resume_server(int server_id,Medis media,String&amp; user_dese); int set_access_list(int server_id,Medis media,String&amp; user_dese, List(int)&amp; part list); int list servers(List_of_p(FullMediaDesc)&amp; media_list); int is_server_present(int server_id); void associated_servers(List(int)&amp; serv_list); void MediaServerDied(int m); int lock(); int unlock(); int state_check(){return O;}private void set_meeting(Meeting *m); int id; String room name; Meeting * meeting;; RoomAttrib attrib; CAR D32 owner; int MR id; RoomStatus status; RoomLockStatus lock status; RoomMgr *RMgr; EventNotifier *EveNot; MediaServerMgr *MSMgr; List_of_p(MediaServerInfoInRoom)server_list; //list of all servers (media ids) in the room int err;};List_of_pdecare(Room) List_of_pdeclareJan 5 115614 1993 Page 2 of room.hroom.hroom.h ...List_of_pdeclare// All int returns will be-ve if error. ALL ERR_CODEs are-veclass RoomMgr{public RoomMgr(MRInterface *MRIface,Range r); -RoomMgr{}; MRInterface *MRIface(){retturn(Iface);} int is valid room(int room_id); int IsServerPresent(int room_id,iht server id); void AssociatedServersInRoom(int room_id,List(int)&amp; slist); int ActiveRoom(){return(active_room->Roomld()); } iht CreateRoom(CARD32 owner, RoomAttrib attrib,String&amp; rname); int DestroyRoom(CARD32 requester,int id); int ListRooms(CARD32 requester, List(int)&amp; rlist, List(String)&amp; name_list); int ShowRoomStatus(CARD32 requester,int room_id, RoomStatus&amp; stat, RoomLockStatus&amp; lock_stat); int ShowRoomAttributes(CARD32 requester,int room_id,RoomAttrib&amp; attrib); int AlterRoomAttributes(CARD32 requester,int room_id,RoomAttrib attrib); int LockRoom(CARD32 requester,int room_id); int UnlockRoom(CARD32 requester, int room_id); int CreateMeeting(CARD32 owner,int room_id,MeetingAttrib attrib); int DestroyMeeting(CARD32 requester,int meeting_id); int ListMeetings(CARD32 requester,List(int)&amp; rlist); int ShowMeetingStatus(CARD32 requester,int meeting_id, List(ParticipantInfo)&amp; info, int&amp; p_room_id, int&amp; owner, MeetingStatus&amp; status); int ShowMeetRoomstatus(CARD32 requester,int room_id, List(ParticipantInfo)&amp; info, int&amp; p_meeting_id, int&amp; owner,MeetingStatus&amp; status); int ListMeetingParticipants(int meeting_id,List(int)&amp; plist); int ShowMeetingAttributes(CARD32 requester,int meeting_id, MeetingAttrib&amp; attrib); int AlterMeetingAttributes(CARD32 requester,int meeting_id, MeetingAttrib attrib); int ShowAssociatedRoom(CARD32 requester, int meeting_id, int&amp; room_id); int ShowAssociatedMeeting(CARD32 requester,int room_id, int&amp; meeting_id); int AddParticipant(CARD32 requester,int meeting_id, intparticipant) int DropParticipant(CARD32 requester,int meeting_id, int participant); int SuspendMeeting(CARD32 requester,int meeting_id); int ResumeMeeting(CARD32 requester,int meeting_id); void MediaServerDied(int m); int AddServer(int room_id, int server_id,Media media, String&amp; user_desc,List(int)&amp; part list); int DropServer(int room_idt server_id,Mediamedia, String&amp; user_desc); int SuspendServe(int room_id, int server-id, Media medm, Strm ~&amp; user_desc); int ResumeServer(int room-id,int server_id,Media media,String&amp; user_desc); int SetAccessList(int room_id, intt serverid, Media media, String&amp; user desc, List(int)&amp; part list); Lat ListServers(CARD32 requester, inst room_id, List of_p(FullMediaDesc)&amp; media_list); int LeaveMeeting(CARD32 requester,int meeting_id, List of_p(MediaDesc)&amp; media_list); int ReenterMeeting(CARD32 requester,int meeting_id, List_of_p(MediaDesc)&amp; media_list);private int generate_room_id(); void free_room_id(int id); int generate_meeting_id();Jan 5 115614 1993 Page s of room.hroom.h room.h void free_meeting_id(int id); ...List_of_pdeclare MRInterface *Iface; Range range; Room *active_room;//Room that is currently active List_or_p(Room) room_list; List(int) used_room_id_list; List(int) free_room_id_list; List(int) used_meeting_id_list; List(int) free_meeting_id_list;};# endifJan 5 115614 1993Page 4 of room.hserver_reg.h server__reg.h#ifndef_SERVER_REGISTRY#define _SERVER_REGISTRY l#include<List.h>#include <NM_types.h>#include <sysent.h>#include<String.h>#include<iostream.h>#include<fstream.h>#include<common.h>struct MediaServerInfo{ MediaServerInfo(Media pType,String&amp; pUserDesc, MediaServerConn&amp; pConn, String&amp; pInitializer, String&amp; pOtherInfo); Media MediaType; String UserDesc; String Initializer; String OtherInfo; MediaServerConn Conn;};atruet MRServerConnInfo { MRServerConnInfo(String&amp; pMachine,int pPort,int pStartRange, int pEndRange) {Machine=pMachine;Port=pPort;StasrtRange=pStartRange; EndRange=pEndRange;} String Machine; int Port; int StartRange; int EndRange;};List_of_pdeclare(MediaServerInfo);List_of_pdeclare(MRServerConnInfo);class ServerRegistry{public ServerRegistry(MRInterface *irace, String p_in_file); void LisrAllMediaServerInfo(List_of_p(MediaServerInfo)&amp; plist); void ListAllMRServerConnInfo(List_of_p(MRServerConnInfo)&amp; slist); MediaServerInfo* ListMediaServerInfo(Media med, String&amp; key); int in_my_range(int id){return((id>=MyStartRange &amp;&amp; id <=MyEndRange)?1∶O);} int server_for_id(int id,String&amp; mach, int&amp; port); void default_name server(String&amp; mach,int&amp; port); void my_range(Range&amp; r){rstart=MyStartRange; r.end=MyEndRange;}private void read_file(); void my range(); void flush_to_file(); MRInterface *Iface; List_of_p(MediaServerInfo) MediaServerList; List_of_p(MRScrverConnInfo)MRServerList; String MyName,name server mathine; int MyStartRange, MyEndRange,name_server_port; String in_file,out_file;};#endifJan 5 115621 1993Page 1 of seroer_reg.hclient.Cclient.C#define DEBUG 1#include<iface.h>#include<room.h># include<client.h>#include<server_reg.h>List_of_pimplement(SeqNoPair)List_of_pimplement#define CHECK_MMC_CONNECTION(conn) if(conn->IsAssigned()==MmEnumMmFalse){\ deactivate_self();\ return(-l);\ }#define VOID_CHECK_MfC_CONNECTION(con)if(conn->IsAssigned()==MmEnumMmFalse){\ deactivate_self()\ return;\Blockimplement(char)Blockimplementint Connectionheader len=MSG HEADER LEN;//MR Interface * ConnectionIface=(MR Interface *)NULL; /Block(char)Connectionbuf(INIT_MAX_BUFLEN);ConnectionConnection(MR Interface *iface,MmConnection pconn) Connection// if (Iface==NULL){ if Iface=iface; Prot=Iface->Proto(); alive=1; conn=pconn;//}void Gonnection::client_dead() client dead{ NW->HangUp(connection()); alive=O;}void Gonnection::reply_for_routed_msg(Message *msg,char*header, char *data,int data_len){#ifdef DEBUG cout<<″Redirecting reply from Server\n″; cout.flush();# endif if(send(header,header_len)<O}{ cout<<″Write Error″<< _FILE_<<″″<<(int)_LINE_<<endl; delete msg; return; } if(send(data,data_len)_<O){ cout<<"Write Error″<<_FILE__<<″″<< (int)__LINE_<<endl; } delete msg;}void Connection::send_disconnect() send_disconnect{ char tmpbuf[2O]; tmpbuf[MSG_HOFFSET_TYPE]=REQUJEST MR SERVER; tmpbuf[MSG_HOFFSETCODE]=MR DISCONNECT; Conv()->IntToBuf(O,tmpbuf+MSG_HOFFSET_SEQ); Conv()->IntToBuf(O, tmpbuf+MSG_HOFFSET_LEN);Jan 5 115610 1993 Page 1 of client. Cclient. Cclient. C if(send(tmpbuf,MSG_HEADER_LEN)==-1){...send_disconnect }deactivate_self();int Connectionsend(char *data,int len)send{ CHECK_MMC_CONNECTION(conn) if (NW->W(wǎng)rite(conn,data,len)<len){ deactivate_self(); return(-l); } return(O);int Connectionsend(Message*msg) send{ CHECK_MMC_CONNCTION(conn) if(NW_>W(wǎng)rite(conn,msg_>msg_header(),MSG_HEADER_LEN)<MSG_HEADER_LEN){ deactivate self(); return(-i); CHECK_MMC_CONNECTION(conn) if(NW_>W(wǎng)rite(conn,msg->msg_data),msg->msg_len())<msg->msg_len()){ deactivate_self(); return(-1); return(O);int Connectionsend(MedServRequestClass*msg) send{ CHECK_MMC_CONNCETION(conn) if(NW->W(wǎng)rite(conn,msg->msg_headeer(),MSG_HEADER_LEN)<MSG_HEADER_LEN){ deactivate_self(); return(-1); } CHECK_MMC_CONNECTION(conn) if(NW->W(wǎng)rite(conn,msg->request_buffer(),msg->msg_len())<msg->msg_len()){ deactivate self(); return(-l); } return(O);void Connection::client_process_msg() client_process_msg{ CARD8 type,opcode; CARD32 msg_seq,msg_len; Message *msg; enum msg_obj_states status; VOID CHECK_MMC_CONNECTION(conn) if(NW->Read(header,header_len)<header_len){# ifdef DEBUG cout<<″Read Error″<< _FILE_<< ″″<<(int)_LINE_<<endl;# endif deactivete_self(); return; } Prot->interpret_header(header,type,opcode,msg_seq,msg_len);#ifdef DEBUG cout<<″Len″<< msg_len<<″″<< msg_seq<<″Type″ <<(int)type<<″Opcode″<<(int)opcode<<endl; cout.flush();# endifJan 5 115610 1993 Page 2 of client.Cclient. C client.C if(msg_len>O){ ...client_process_msg buf.reserve(msg_len); VOID_CHECK_MMC_CONNECTION(conn) if(NW->Read(buf,msg_len)< msg_len){#ifdef DEBUG cout<<″Read Error″<<_FILE_<<″″<< (int)_LINE<<endl;#endif deactivate_self(); return; } } msg=Prot->construct_msg(header,type,opcode,msg_seq,msg_len,buf,this); if(msg_){ status=msg->action(); switch(status){ case e_MSG PENDING break; case e_MSG_SERVICED default delete msg; break; } }} //client_msgCnnectionConnection() Connection////////////////////////////////////////////////////////////////////////LocalSession Methods//////////////////////////////////////////////////////////////////////LocalSession::LocalSession(MRInterface *iface, MmConnection pCli) LocalSession Connection(iface, pCli){}void LocalSession::process_msg()process_msg{ client_process_msg();} // process_msg////////////////////////////////////////////////////////////////////////FrontEnd Methods//////////////////////////////////////////////////////////////////////FrontEnd::FrontEnd(MRInterface *iface,MmConnection pCli) FrontEnd Connection(iface,pCli) {}void FrontEnd::process_msg() process_msg{ client_process_msg();} // process_msg////////////////////////////////////////////////////////////////////////ReqMR Methods//////////////////////////////////////////////////////////////////////ReqMR::ReqMR(MRInterface */iface,MmConnection serv) Connection(iface,serv){Jan 5 115610 1993Page 3 of client.Cclient. Ccllent. C} ...process_msgvoid ReqMR::proeess_msg{} process_msg{ CARD8 type, opcode; CARD32 msg_seq,msg_len; Message *mag; enum msg_obj_states status; VOID CHECK MMC CONECTION(conn) if (NW-Read(header, header_len)<header len){# ifdef DEBUG cout<< "Read Error::"<<_FILE_<< ""<< (int)_LINE_endl;#endif deactivate_self(); return; } Prot->tetrepret_header(header, type, opcode, msg_seq,msg_len);#ifdef DEBUG cout<<"Received from other MR Server:: Len:<<msg_len<<mag_seq<< end cout.flush();# endif if (msg_len>O) { buf.reserve(msg_len); VOID CHECK MMC_CONNECTION(conn) if(NW->Read(buf,msg_lea)<msg_len){#ifdef DEBUG cout <<"Read Error::" <<_FILE_<<'"<< (int)__endl;#endif deactivate_self; return; request_msg-MsgSource{}- reply_for_routed_msg(request_msg,header,buf,msg_len); send disconnect();}//process_msg/////////////////////////////////////////////////////ReqNM Methods///////////////////////////////////////////////////ReqNM::ReqNM(MRInterface *iface, MmConnection serv)ReqNM ;Connection(iface, zerv){ nm_seq_no=O;}int ReqNM::send_request_msg{Message *msg) send__request_msg{ nm seq_no++; // SHOULD REUSE LATER SeqUoPair *sp =new SeqNoPair(msg,msg->msg_seq_no()} if (!sp) { cout<<"FATAL MEM ALLOC ERROR:" <<(int)_FILE <<" "<<(int)_LINE_<<endl; } msg list.insert next(sp); msg->set msg_seq_no(nm_seq_no);# ifdef DEBUG cout<<"'msg-seq:"<<msg-msg_seq_no{}<<endl;# endlf return(send(msg));}Jan 5 11:58:10 1998 Page 4 of ciient.Cclient. Cclient. Cvoid ReqNM::process_msg() process_msg{ CARD8 type,opcode; CARD32 msg_seq,msg_len; Message *m; List_of_piter(SeqNoPair) mlist(msg_list); enum msg_obj_states status; VOID_CHECK_MMC_CONNECTION(conn) if{NW->Read(header,header_len)<header_len){# ifdef DEBUG cout<< ″Read Error″<<_FILE_<< ″″<<(int)_LINE_ <<endl;#endif deactivate_self(); return; } Prot->intepret_header(header,type,opcode,msg_seq,msg_len);#ifdef DEBUG cout <<″Received from Name Server::Len″ <<msg_len <<″″<<msg_seq<<″ Type cout.flush();#endif if{msg_len>O){ buf.reserve(msg_len); VOID_CHECK_MMC_CONNECTION(conn) if(NW->Read(buf,msg_len)<msg_len){#ifdef DEBUG cout<<″Read Error::″<<_FILE_<<″″<<(int)_LINE_<<endl;#endif _ deactivate_self(); return; } The code below presumes that the MR Server would have requested the Name Server ONLY on behalf of a LocalSession and NEVER on its //own volition. If the latter ease is to be taken care,we need to // write a different method for ′m′(instead of reply_for_routed). // traverse msg_list and find request_msg SeqNoPair *p; mlist.rest(); while(mlist.next(p)){ m=p->GesMsg();#ifdef DEBUG cout<<″m- seq″ m->seq<< m->msg_seq_no) <<″ m->code″<<(int)m->msg_cod#endif if(m->msg_code)==opcode &amp;&amp; m->msg_seq_no()==msg_seq){ Conv()->IntToBuf(p->GetOrigSeq(), header+MSG_HOFFSET_SEQ); m->MsgSorce()->reply_for_routed_msg(m,header, buf, msg_len); mlist.remove_prev(); delete p; } }} //process_msgJan 5 115610 1993 Page 5 of client. Ceve_msg. Ceve_msg.C# include<eve_msg.h>EveTemplatel::EveTemplatel(char *header, CARD8 msg_typ, CARD msg_code,int msg_seq_no,int msg_len,char*msg_data, Connection *invoker,List(MmConnection)&amp; server_list, int src,int room_id,int meeting_id,int participant) EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len, msg_data,invoker,server_list) { build(src,room_id,meeting_id,participant); send_event();EveTemplate2EveTemplate2(char *header,CARD8 msg_typ, CARD8 msg_code,int msg_seq_no,int msg_len,char*msg_data, Connection *invoker,List(MmConneection)&amp; sever_list, int src,int room_id) EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len, msg_data,invoker,server_list) { build(src,room_id); send_event(); EveTemplate3::EveTemplate3(char *header,CARD8 msg_typ, CARD8 msg_code,int msg_seq_no,int msg_len,char *msg_data, Connection *invoker,List(MmConnection)&amp; server_list, int src,int room_id,int meeting_id,List(int)&amp; plist) EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len, msg_data,invoker,server_list) { build(src,room_id,meeting_id,plist); send_event(); EvcTemplate4::EveTemplate4(char *header,CARD8 msg_typ, CARD8 msg_code,int msg_seq_no,int msg_len,char *msg_data, Connection *invoker,List(MmConnection)&amp; server_list,int src, int room_id,int meeting_id,Media med,String&amp; user_desc) EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len, msg_data,invoker,server_list) build(src,room_id,meeting_id,med,user_desc); send_event(); }EveTemplate5EveTemplate5(char *header,CARD8 msg typ, CARD8 msg_code,int msg_seq_no,int msg_len,char *msg_data Connection *invoker,List(MmConnection)&amp; serverl_list, int src,int room_id,int meeting_id) EventClass(header,msg_trp,msg_code,msg_seq_no,msg_len, msg_data,invoker,server_list) { build(src,room_id,meeting_id); send_evennt(); }EveTemplate6::EveTemplate6(char*header,CARD8 msg_typ, CARD8 msg_code,int msg_seq_no,int msg_len,char *msg_data, Connection *invoker,List(MmConection)&amp; sever_list,int src, int room_id,int meeting_id,Media med,String&amp; user_desc, List(int)&amp; part_list) EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len, msg_data,invoker,server_list) build(src,room_id,meeting_id,med,user_desc,part_list); send_event(); Jan 5 115610 1993 Page 1 of eve_msg.Ceve_msg.Ceve_msg.C}JAn 5 115610 1999 Page 2 of eve_msg.Cevent.Cevent. C#include<event.h>#inelude <eve msg.h>#include<iface.h>#include<med serv.h>#include<o(jì)bj_man.h>#include<room.h>Listimplement(MmConnection) ListmplementEvent Notifier::EventNotifier(MRInterface *iface) EventNotifier{ Iface=iface; seq_no=O;}void EventNotifier::server_conn_list(int room_id, List(MmConnection)&amp; conn_list){ int server; List(int) server_list; Iface->RoomManager()->AssociatedServersInRoom(room_id,server_list); conn_list.reset();#ifdef DEBUG cout << ″Server List Length ″<<server_lsit.length()<<endl; cout.flush();#endif server_list.reset(); while(server_list.next(server)){ conn_list.insert_next(Iface-> MediaServerManager()->ServerConnection(server)); //Should also include all the FrontEnd connections in list //so that they too receive the events List_of_p(FrontEnd) fend_list; FrontEnd*fend; Iface->FEManager>GetObjectList(fend_list); fend_list.reset(); while (fend_list.nert(fend)){ if(fend) conn_list.insert_next(fend->connection());#ifdef DEBUG cout<<″Event Conn List Length″<< conn_list.length()<<endl; cout.flush();#endifvoid EventNotifier::fend_conn_list(list(MmConnection)&amp; conn_list) List List_of_p(FrontEnd) fend_list; FrontEnd *fend; conn_list.reset(); Iface- >FEManager()->GetObjectList(fend_list); fend list.reset(); while (fend_list.next(fend)){ if (fend) conn_list.insert_next(fend->connection()); }}void EventNotifier::Templatel(CARD8 code,int room_id,int src, int meeting_id,int participant){ List(MmConnection) conn_list; EveTemplatel*eve; Jan 5 115610 1993Page 1 of event.Cevent. C event. C ...List server_conn_list(room_id,conn_list); if (conn_list.length()>O){ eve=new EveTemplatel((char *)NULL,EVENT_MR_SERVER, code,next_seq_no), O, (char *)NULL,Iface->PersistentConnection(), conn_list,sro,room_id,meeting_id,participant); //constructor would hsve sent the event delete eve; }}void EventNotifierTemplate2(CARD8 code,int room_id,int src,int id) Template2{ List(MmConnection)conn_list; EveTemplate2 *eve; server_conn_list(room_id,conn_list); if(conn_list.length()>O){ eve=new EveTemplate2((char *)NULL,EVENT_MR_SERVER, code,next_seq_no(), O,(char*)NULL,Iface->PersistentConnection(), conn_list,src,id); // constructor would have sent the event deiete eve; }}void EventNotifierTemplate4(CARD8 code, int src, int room_id,int meeting_id,Media med,String user_desc){ List(MmConnection) conn_list; EveTemplate4 *eve; fend_conn_list(conn_list); if(conn_list.length()>O){ eve=new EveTemplate4((char *)NULL,EVENT_MR_SERVER, code,next_seq_no(), O,(char *)NULL,Iface->PersistentConnection(), conn_list,src,room_id, meeting_id,med,user_desc); constructor would have sent the event elete eve; }}void EventNotifier::Template5(CARD8 code,int src, int room_id, int meeting_id){ List(MmConnection) conn_list; EveTemplate5 *eve; server_conn_list(room_id,conn_list); if(conn_list.length()>O) { eve=new EveTemplate5((char *)NULL,EVENT_MR_SERVER, code,next_seq_no), O, (char *)NULL,Iface->PersistentConnection(), conn_list,src,room_id,meeting_id); //constructor would have sent the event delete eve; }}void EventNotifier::Template6(CARD8 code, int src, int room id,int meeting_id,Media med, String user_desc, List(int)&amp; part_list) { List(MmConnection) conn_list; EveTemplate6 *eve; Jan 5 115610 1993Page 2 of event.Cevent. C event. C#ifdef DEBUG... Temptate2 cout<<″Template6PLIST_LEN″<< part list.length(); cout.flush();#endif fend_conn_lsit(conn_list); if(conn_list.length()>O){ eve=new EveTemplate6((char *)NULL,EVENT_MR_SERVER, code,next_seq_no), O, (char *)NULL,Iface->PersistentConnection(), conn_list,src,room_id,meeting_id,med, user_desc,part_list); constuctor would have sent the event delete eve; }}void EventNotierAddeParticipant(int room_id,int src, int meeting_id,int participant){ Templatel(EVE_ADDED_PARTICIPANT,rOOm_id,src,meeting_id,} participant);void EventNotifierDroppedPartcipant(int room_id,int src, int meeting_id,int participant){ Templatel(EVE_DROPPED_PARTICIPANTT,room_id,src,mecting_id,} partcipant);void EventNotifierLeftMeeting(int room_id, int src, int meeting_id,int parcipant){ Templatel(EVE_LEFT_MEETING,room_id,src,meeting_id, participant);void EventNotifier::ReenterMeeting(int room id,int src, int meeting_id, int partipant){ Templatel(EVE_REENTER_MEETING, room_id,srt,meeting_id, participant);}void EventNotifier::MeetingDestroyed(int room_id,int src, int meeting_id){ Template5(EVE_MEETING_DESTROYED,src,room_id,meeting_id);}void EventNotifier::RoomCreated(int room_id,int src) RoomCreated{ Template2(EVE_ROOM_CREATED,room_id,src,room_id);}void EventNotifierRoomDestroyed(int room_id,int src) RoomDestroyed{ Template2(EVE_ROOM_DESTROYED,room_id,src,room_id);}void EventNotifier::RoomLocked(int room_id,int src)RoomLocked Template2(EVE_ROOM_LOCKED,room_id,src,room_id);void EventNotifierRoomUnlocked(int room_id,int src) RoomUnlocked{Jan 5 115610 1993 Page 3 of event. Cevent. C event. C Template2(EVE_ROOM_UNLOGKED,room_id,src,room_id); ...RoomUnloeked int src,void EventNotifierMeetingSuspended(int room id int meeting_id){} Template5(EVE_MEETING_SUSPENDED,src,room_id,meeting_id);void EventNotifier::MeetingResumed(int room_id,int src,{ int meeting_id) Template5(EVE_MEETING_RESUMED,src,room_id,meeting_id);}void EventNotifier::MeetingCreated(int room_id,int src,int meeting_id)MeetingCreated{ Template5(EVE_MEETING_CREATED,src,room_id,meeting_id);}void EventNotifier::MeetingInfo(int room_id,int src,int meeting_id) MeetingInfo{ List(MmConnection)conn_list; List(int) plist; EveTemplate3 *eve; server_conn_list(room_id,conn_list); if(Iface->RoomManger()->ListMeetingParticipants(meeting_id,plist)<O) return; if(conn_list.length()>O){ eve=new EveTemplate3((char*)NULL.EVENT_MR_SERVER, EVE_MEETING_INFO,next_seq_no(), O,(char *)NULL,Iface->PersistentConnection(), conn_list,src,room_id,meeting_id,plist); //constructor would have sent the event delete eve; }}void EventNotifier::ServerAdded(int src,int room_id,int meeting_id, Media med,String user_desc,List(int)&amp; part_list){ Template6(EVE_SERVER_ADDED,src,room_id,meeting_id, med,user_desc,part_list); }void EventNotifierServerDropped(int src,int room_id,int meeting_id, Media med,String user_desc){ Template4(EVE_SERVER_DROPPED,src,room_id,meeting_id, med,user_desc);}void EventNotifierServerAccessListSet(int src,int room id, int meeting_id,Media med,String user_desc,List(int)&amp; part_list){ Template6(EVE_SERVER_ACCESS_LIST_SET,src,room_id, meeting_id, med,user_desc,part_list);}Jan 5 115610 1993 Page 4 of event. cgenerator. C generator. C#include<iostream.h>#inelude<generattor.h> Mesage * ProtoGenerator::default_generator(char * header, CARD8 type, CARD8 opcode, CARD32 aeq, CARD32 len, char*data,Connection *invoker){ cerr<<″Illegal Message or Message not implemented Type″<<type << ″Code″<< opcode<<endl; cerr.flush(); return(new IllegalMessage(header,type,opcode,seq,len,data,invoker));}Message * ProtoGenerator::Gen_Disconnect(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len, char *data, Connection *invoker){ return(new Disconnect(header,type,opcode,seq,len, data, invoker));}Message * ProtoGeneratorGen_CreateRoom(char * header,CARD8 type,CARD8 opcode, CARD32 seq, CARD32 len,char *data,Connection *invoker){ if(len<MR_CREATE_ROOM_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new CreateRoom(header,type,opcode,seq,len,data,invoker));}Message * ProtoGenerator::Gen_DestroyRoom(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len, char *data,Connection *invoker){ if(len<MR_DESTROY_ROOM_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new DestroyRoom(header,type,opcode,seq,len,data,invoker));}Message * ProtoGenerator::Gen_ListRooms(char * header, CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len, char *data,Connection*invoker){ if(len<MR_LIST_ROOMS_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new ListRooms(header,type,opcode,seq,len,data,invoker));}Message * ProtoGeneratorGen ShowRoomStatus(char * header,CARD8 type,CARD8 opcode,CARD32 seq CARD32 len,char *data,Connection *invoker){ if(len<MR_SHOW_ROOM_STATUS_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); teturn(new ShowRoomstatus(header,type,opcode,seq,len,data,invoker));}Message * ProtoGenerator::Gen_ShowRoomAttributes(char * header,CARD8 type,CARD8 opcode,CARD32 se CARD32 len, char *data,Connection *invoker) { if(len<MR_SHOW_ROOM_ATTRIBUTES_LEN) return(new IIlegalMessage(header,type,opcode,seq,len,data,invoker)); return(new ShowRoomAttributes(header,type,opcode,seq,len,data,invoker));} Message * ProtoGenerator::Gen_AlterRoomAttributes(char * header,CARD8 type,CARD8 opcode,CARD32 GARD32 len,char *data,Connection *invoker){ if(len<MR_ALTER_ROOM_ATTRIBUTES_LEN) return(new IllealMessage(header,type,opcode,seq,len,data,invoker)); return(new AlterRoomAttributes(header,type,opcode,sec,len,data,invoker));}Jan 5 115611 1993Page 1 of generator. Cgenerator. C generator.CMessage * ProtoGeneratorGen_LockRoom(char* header,CARD8 type,CARD8 opcode, CARD32 seq, CARD32 Ien,char *data Connection *invoker{ if(len<MR_LOCK_ROOM_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new LockRoom(header,type,opcode,seq,len,data,invoker));}Meessage * ProtoGeneratorGen_UnlockRoom(char* header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data Connection *invoker){ if(len<MR_UNLOCK_ROOM_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new UnlockRoom(header,type,opcode,seq,len,data,invoker));}Message * ProtoGeneratorGen ShowAssociatedRoom(char* header,CARD8 type,CARD8 opcode,CARD32 se CARD32 len, char *data,Connection*invoker){ if(len< MR_SHOW_ASSOCLATED_ROOM_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new ShowAssociateRoom(header,type,opcode,seq,len,data,invoker));}Message * ProtoGeneratorGen_ShowAssociatedMeeting(char * header,CARD8 type,CARD8 opcode,CARD3 CARD32 len,char *data,Connection *invoker){ if(len< MR_SHOW_ASSOCLATED_MEETING_LEN) retrtn(new IllegalMeessage(header,opcode,opcode,len,len,data,invoker)); return(new ShowAssociatedMeeting(header,type,opcode,seq,len,data, invoker));Meessae * ProtoGeneratorGen_CreateMeeting(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,COnnection *invoker) if(len<MR_CREATE_MEETING_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new CreateMeeting(header,type,opcode,seq,len,data,invoker));}Message * ProtoGeneratorGen_DestroyMeeting(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ if(len<MR_DESTROY_MEETING_ LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new DestroyMeeting(header,type,opcode,seq,len,data,invoker));}Message * ProtoGeneratorGen_ListMeetings(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ if(len<MR_LIST_MEETINGS_LEN) return(new IllegalMessage(header,opcode,opcode,len,data,invoker)); return(new ListMeetings(header,type,opcode,seq,len,data,invoker));}Message * ProtoGeneratorGen_ShowMeetingStatus(char * header,CARD8 type,CARD8 opcode,CARD32 seq. CARD32 len,char *data,Connection *invoker){ if(len< MR_SHOWMEETING_STATUS_LEN) return(new IlleglMeessage(header,type,opcode,seq,len,data,invoker)); return(new ShowMeetingStatus(header,type,opcode,seq,len,data,invoker));}Meessage * ProtoGeneratorGen_ShowMeetRoomStatus(char * header,CARD8 type,CARD8 opcode,CARD32 seqJan 5 115611 1993 Page 2 of generator.Cgenerator. C generator. C CARD32 len, char *data,Connection *invoker) if(len< MR_SHOW_MEETING_STATUS_LEN) return(new IllegalMessage(header,type,opcode,seq, len,data,invoker)); return(new ShowMeetRoomStatus(header,type,opcode,seq,len,data,invoker)); Meessage *ProtoGeneratorGen_ShowMeetingAttributes(char * header,CARD8 type,CARD8 opcode,CARD3 CARD32 len,char *data,Connection *invoker){ if(len<MR_SHOW_MEETING ATTRIBUTES LEN) return(new IllegalMfessage(header,type,opcode,seq,len,data,invoker)); return(new ShowMeetingAttributes(header,type,opcode,seq,len,data,invoker));}Message * ProtoGeneratorGen_AlterMeetingAttributes(char * header,CARD8 type,CARD8 opcode,CARD32 CARD32 len,char *data,Connection *invoker){ if(len<MR_ALTER_MEETING_ATTRIBUTES_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new AlterMeetingAttributes(header,type,opcode,seq,len,data,invoker));} Message * ProtoGeneratorGen_AddParticipant(char * header,CARD8 type,CARD8 opcode,CARD32 seq CARD32 len,char *data,Connection *invoker){ if(len< MR_ADD_PARTICIPANT LEN) return(new IllegalMessage(hader,type,opccoe,seq,len,data,invoker)); return(new AddParticipant(header,type,opcode,seq,len,data,invoker));} Message * ProtoGeneratorGen_DropParticipant(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ if(len <MR_DROP_PARCIPANT_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new DropParticipant(header,type,opcode,seq,len,data,invoker)); Message * ProtoGeneratorGen LeayeMeeting(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker) if(len<MR_LEAVE_MEETING_LEN) return(new IllegalMessage(header,type,opcode,len,len,data_invoker)); return(new LeaveMeeting(header,type,opcode,seq,len,data,invoker)); Message * ProtoGeneratorGen_ReenterMeeting(char * header,CARD8 type,CARD8 opcoe,CARD32 seq, CARD32 len,char *data,Connection *invoker){ if(len<MR_REENTER_MEETING_LEN) return(new IlleglMessage(header,type,opcode,seq,len,data,invoker)); return(new ReenterMeeting(header,type,opcode,seq,len,data,invoker)); Message *ProtoGeneratorGen_SuspendMeeting(char * header,CARD8 type,CARD8 opcdee,CARD32 seq, CARD2 len,char *data,Connection *invoker){ if(len<MR_SUSPEND_NEETING_LEN) return(new IllegalMeessage(header,type,opcode,seq,len,data,invoker)); return(new SuspendMeeting(header,type,opcode,seq,len,data,invoker)); Message * ProtoGeneratorGen_ResumeMeeting(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ if(len<MR_RESUME_MEETING_LEN) return(new IllegalMessage(heaer,type,opcode,seq,len,data,invoker));Jan 5 115611 1999Page 3 of generator.Cgenerator.C generator. C return(new ResumeMeeting(header,type,opcode,seq,len,data,invoker)); Message * ProtoGeneratorGen_AddServer(char * header,CARD8 type,CARD* opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ if(len<MR_ADD_SERVER_LEN) return(new IllegalMessage(header,type, opcode,seq,len,data,invoker)); return(new AddServer(header,type,opcode,seq,len,data,invoker));}Message * ProtoGeneratorGen_DropServer(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ if(len<MR_DROP_SERVER_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new DropServer(header,type,opcode,seq,len,data,invoker)); Message * ProtGeneratorGen_SetServerAccessList(char * header,CARD8 type,CARD8 opcode,CARD32 seq CARD32 len,char *data,Connection *invoker) { if(len<MR_SET_SERVER_ACCESS_LIST_LEN) return(new IllegalMessage(headr,type,opcode,seq,len,data,invoker)); return(new SetServerAccessList(header,type,opcode,len,len,data,invoker)); Message * ProtoGeneratorGen ListServers(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data Connection *invoker){ if (len<MR_LIST_SERVERS_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new LisServers(hader,type,opcode,seq,len,data,invoker));} Message * ProtoGeneratorGen_GetServerInfo(char * header,CARD8 type,Card opcode,CARD32 seq, CARD32 len,char *data, Connection *invoker){ return(new GetServerInfo(header,type,opcode,seq,len,data,invoker)); Message * ProtoGeneratorGen_SuspendServer(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ if(len<MR_SUSPEND_SERVER_LEN) return(new IllegalMessage((header,type,opcode,seq,len,data,invoker)); return(new SuspendServer(header,type,opcode,seq,len,data,invoker));} Message * ProtoGenertorGen_ResumeServer(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char*data,Connection *invoker){ if(len<MR_RESUME_SERVER_LEN) return(new IllegalMessage(header,type,opcode,seq,len,data,invoker)); return(new ResumeServe((header,type,opcode,seq,len,data,invoker));} Message * ProtoGeneratorGen NameServerMsg(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ return(new NameServerMsg((header,type,opcode,seq,len,data,invoker)); Messagee * ProtoGeneratorGen CreateUser(char * header,CARD8 type, CARD8 opcode, CARD32 seq, CARD2 len,char *data,Connection *invoker){ return(new CreateUser(header,type,opcode,seq,len,data, invoker));}Jan 5 115611 1993 Page 4 of generator.Cgenerator. C generator.C Message * ProtoGenerstorGen CreateDupUser(char * header,CARD8 type, CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ return(new CreateDupUser(header,type,opcode,seq,len,data,invoker));} Message *ProtoGeneratorGen_DeleteUser(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ return(new DeleteUser(header,type,opcode,seq,len,data,ivoker));} Meessage * ProtoGeneratorGen_GetPersonInfo(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD2 len,char *data,Connection *invoker){ return(new GetPersonInfo(header,type,opcode,seq,len,data,invoker));} Message * ProtoGeneratorGen_CreateNMEntry(char* header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char*data, Connectrn *invoker){ return(new CreateNMEntry(header,type,opcode,seq,len,data,invoker));} Meessage * ProtoGeneratorGen_DeleteNMEntry(char *header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker){ return(new DeleteNMEntry(header,type,opcode,seq,len,data, nvoker));} Message * ProtoGenertorGen_GeNMEntry(char * header,CARD8 type,CARD8 opcode,CARD32 seq, CARD32 len,char *data,Connection *invoker)){ return(new GetNMEntry(header,type,opcode,seq,len,data,invoker));}Jan5 115611 1993 Page 5 of generator.Ciface.C iface. C#define DEBUG 1#deflne DEFAULT_INPUT_REGLSTRY ″SERVDESC″#deflne DEFAULT_ROOM_START_O#deflne DEFAULT_ROOM_END 1000#include<iface.h>#include<client.h>#include<sysent.h>#include<stdlib.h>#include<room.h>#include<server_reg.h>#include<o(jì)bj_man.h>#include<stream.h>#include<med_serv.h>#include<event.h>//#include<Args.h>List_of_pimplement(CommObjMgr) List_of_pimplementMRInterface *G_Iface;main(int argc,char *argv ())main{ cout.<< ″Staring Server\n″; cout.flush(); G_Iface=new MRInterface(); G_Iface->startup(argc,argv);}voidMRInterfacestartup (int argc,char **argv) startup{ int port=MR CLIFACE PORT; String in_file=DEFAULT_INPUT_REGISTRY; int; c; extern char *optarg; extern int optind; Range range; FE_port=MR_FEND_PORT; while((c=getopt(argc,argv,″fpio″))?。?1){ switch(c){ case ′p′ port=atoi(optarg); break; case ′r FE_port=atoi(optarg); bresk; esse′i′ in_file=optarg; bresk; default cout<<″UsageMRServer[-p<client_port>][-f<frontend_port>][-i in_ exit(1); } } if(NW->ActivateServerPort(port)?。?MmRnumMmOK){ cout<< ″Cannot open listening port...\n″;cout.flush(); exit(1); } if(NW->ActivateServerPort(FE_port)?。?MmEnumMmOK){ cout<< ″Cannot open front end listening port...\n; cout.flush(); exit(1);Jan 5 115611 1993Page 1 of iface.Ciface.C iface. C }...startwp if(!(SReg=new ServerRegistry(this,in_file))){ cout ″Fatal Memory Alloc Error ″<< FILE <<″″ <<_LINE_<<endl; exit(1); } SReg->my_range(range); MSMgr=new MediaServerMgr(this); if(!MSMgr){ cout <<″Fatal Memory Alloc. Error″<< _FILE_<<″" <<_LINE<<endl; exit(1); object_list.insert_next((CommObjMgr *)MSMgr); NMMgr=new ReqNMMgr(this); if(!NMMgr){ cout<< ″Fatal Memory Alloc.Error″<<_FILE_<< ″″ <<_LINE_<<endl; exit(1); } if(!NMMgr->IsAlive()){ cout<<″Cannot talk to NameServer.exiting...\n″; exit(1); } object_list.insert_next((CommObjMgr *)NMMgr); MRMgr=new ReqMRMgr(this); if(!MRMgr){ cout << ″Fatal Memory Alloc.Error ″ << _FILE << ″″ << _LINE_<<endl; exit(I); } object_list.insert_next((CommObjMgr *)MRMgr); Range rangel;// rangel.start=rangel.end=O; rangl.start=range.start;rangel.end=range.end; if(!(RMgr=new RoomMgr(this,rangel))){ cout <<″Fatal Memory Alloc.Error″<< FILE <<″″ <<_LINE_<<endl; exit(l); } LSMgr=new LocalSessionMgr(this); if(!LSMgr){ cout<<″Fatal Memory Alloc.Error″<<_FILE_<<″″ <<_LINE_<<endl; exit(1); } object_list.insert_next((CommObjMgr *LSMgr); if(!FEMgr)=new FrontEndMgr(this); cout<< ″Fatal Memory Alloc.Error ″ << FILE << ″″ <<_LINE_<< endl; exit(l); }// THIS WILL NOT BE INSERTED IN THE OBJECT LIST // HANDLE AS SPECIAL CASE IN main_loop if(!(ConvMethods=new Convert())){ cout<<″Fatal Memory Alloc.Error″ << _FILE_<< ″″ <<_LINE_ <<endl; exit(1); }Jan 5 114611 1993 Page 2 of iface.Ciface. C iface. C if(!(Prot=new Protocol(this))){ ...startup <<Fatal Memory Alloc. Error″<<_FILE<<″″ <<_LINE_<<endl; exit(1); } // This is a dummy connection- used to initialise some //objects which need a Cooection* if(!(PersConn=new ReqMR(this,MmConnection()))){ cout<<″Fatal Memory Alloc.Error″<<_FILE_<<″″ <<_LINE<<endl; exit(1); } if(!(EveNot=new EventNotifier(this))){ cout<<″Fatal Memory Alloc.Error″<<_FILE<< ″″ ?。迹糭LINE<<endl; exit(1); } main_loop();voidMRInterfacemain_loop() main_loop{ List_of_piter(CommObjMgr)olist(object_list); CommObjMgr *obj;//NW->Block(); for (;;){ if(NW->Select()!=MmEnumMmOK) continue; if(NW->CurrentConnection()->ServerPort()==FE_port){ // Special easemsg from front end FEMgr->process(NW->CurrentConnection()); } elae{ oiist.reset(); while (olist.next(obj)) obj->process(NW->CurrentConnection()); }void MRInterfacegarbage_collect() garbage_collectMRInterface″MRInterface()MRInterface{ if(Prot) delete prot; if(RMgr) delete RMgr; if(SReg) delete SReg; if(MSMgr) delete MSMgr; if (NMMgr)delete NMMgr; if(LSMgr)delete LSMgr; if(MRMgr)delete MRMgr; if(EveNot)delete EveNot; if(persConn)delete PersConn; if(FEMgr)delete FEMgr;void shutdown() shutdown if(G_Iface)delete G_Iface;Jan 5 115611 1993Page 3 of iface. Ciface. Ciface. C exit(1);} shatdownJan 5 115611 1993Page 6 of iface.Cmed_serv.Cmed_serv.C#inelude<iface.h>#include<room.h>#include<client.h>#include<med_serv.h>#inciude<server_reg.h>List_of_pimplement(MediaServer)List_of_pimplement(MedServRequestClass)List_of_pimplementList_of_pimplement////////////////////////////////////////////////////////////////////////MediaServer Methods//////////////////////////////////////////////////////////////////////MediaServer MediaServer(MRInterrace *iface, MmConnection serv,int_med_id,int room,MediaServerInfo *info) Connection(iface,serv){ id=med_id;Medium=info->MediaType;UserDesc=info->UserDesc; mgr_con_info=conn_info=info->Conn;void MediaServerprocess_msg() process_msg{ CARD8 type,opcode; CARD32 msg_seq,msg_len; MedServRequestClass*m; enum msg_obj_states status; if(NW->Read(header,header_len)<header_len){#ifdef DEBUG cerr<<″Read Error″<<_FlLE_<<″″<<(int)_LINE_<<endl;#endif dcactivate_self(); reurn; } Prot->interpret_header(header,type,opcode,msg_seq,msg_len);# ifdef DEBUG cerr<<″Received from Media ServerLen″<<msg_len<<″ Seq″<< msg_seq <<″Type cerr.flush();# endif if(msg_len>O){ buf.reserve(msg_len); if(NW->Read(bnf,msg_len)<msg_len){# ifdef DEBUG cerr<< ″Read Error″<<_FILE_<<″ ″<<(int)_LlNE_<<endl;# endif deactivate_self(); return; } Haadling replies for this class is a bit funny--Since the messages of this class were sent on receipt of some other // messages,we have to take action on the original messages // rather than this message. // Search for matching opcode/seo_no in msg_list // Invoke action on that message and delete it msg_list.reset(); while (msg_list.next(m))(){ if(m->msg_code()==opcode &amp;&amp; m->mgs_seq_no()==stimulant()){ if(type==ERROR_GEN_SERVER &amp;&amp; m->stimulant()){ (void)m->stimulant()->error_obj()->e_action ERROR_MR_SERVER,(CARD32)m->stimulant()- >msg_code(), m->stimulant()->msg_seq_no(),-ERR_SERV_CONN_REJECT); Jan 115610 1993Page 1 of med_serv.Cmed_serv.Cmed_serv. C }...process_msg elac (void) m->special_action(buf,msg_len); msg_list.remove_prev(); delete m; }} // process_msgint MediaServersend_request_msg(MedServtClass *medserv_msg) send_request_msg{ msg_list.insert_next(medserv_msg); return(send(medserv_msg));}MediaServer″MediaSeever() MediaServer{# ifdef DEBUGcout <<″MediaServer″<<(int)Medium<< ″Deleted\n″;cout.flush();# endif Iface->RoomManager()->MediaServerDied(id);}//////////////////////////////////////MediaServerMgr methods//////////////////////////////////void MediaServerMgrprocess(MmConnection serv)process{ List_of_piter(MediaServer) clist(server_list); MediaServer *obj; clist.reset(); while(clist.next(obj)){ if(obj->connection()==serv){ obj->process_msg(); garbage_coll(); return; } }}MediaServerMgr-MediaServerMgr()MediaServerMgr{ MediaServer *m; server_list.reset(); while(server_list.next(m)){ if(m)delete m; }}int MediaServerMgrinit_media_server(RequestClass *stimulant, int room,Media m,String user_desc,List(int) part_list){ List_of_piter(MediaServer)slist(server_list); MediaServer *med=(MediaServer *) NULL; MmConnection server; MediaServerlnfo *info; String machine; int port,dummy,len; char host[HOST_NAME_LEN]; AssociateServer *msg; int found=-1,err; slist.reset();Jan 5 115610 19939 Page 2 of med_serrv.Cmed_serv.C med_serv.C while(slist.next(med)){ ...MediaServerMgr dummy=(med->user_desc()==user_desc)?1:0; if(dummy &amp;&amp; med->medium()==m){ if(Iface->RoomManager()->IsServerPresent(room,med->Serverld())) return(-ERR_SERVER_ALREADY_ADDED); found=med->ServerId(); break; } } if(fonnd==-1){// Not in the list. Create a new one. if(info=Iface ->ServRed()->List Media ServerInfo(m,user desc)){ if(info->Conn.conn_type==INTERNET_CONNECTION){ server=NW->CallServer(info->Conn.machine.dump(host), info->Conn.port); if(server->IsAssigned()==MmEnum::MmFalse){ cout<<″Cannot connect to″<<info->Conn.machine <<″::″<<info->Conn.port<<endl; return(-ERR_CANNOT_CONTACT_MEDIA_SERVER); } server->NameTag(″MS″); med=new MediaServer(Iface,server,++next_server_id, if(med)room,info); server_list.insert_next(med); } } else{ return(-ERR_CANNOT_CONTACT_MEDIA_SERVER); } } if (!med)return(-ERR_NO_TESOURCES); //send an AssociateServer msg to the media server msg=new AssociateServer(stimulant,NULL,REQUEST_GEN_SERVER, GEN_ASSOCIATE_SERVER,next_seq_no(),O,NULL,med, room,part list,m,user desc); if(!msg)return(-ERR_NO_RESOURCES); if{med->send request_msg(msg))<0) return(-ERR_CANNOT_CONTACT_MEDLA_SERVER); return(0);}MediaServer * MediaserverMgr::get_media_server(Media m,String user_desc) get_ media_server{ List_of_piter(MediaServer)slist(server_list); MediaServer *med=(MediaServer *)NULL; int dummy; slist.reset(); while(slist.next(med)){ dummy=(med->user_desc()==user desc)?1:0; if(dummy &amp;&amp; med->medium()==m) break; } return(med);{MediaServer *MediaServerMgr::get_media_serer(int sever_id) get_media_server{ List_of_piter(MediaServer)slist(server list); MediaServer *med=(MediaServer *)NULL; ine dummy; slist.reset(); while(slist.next(med)){ if(med->ServerId()==server_id)Jan 5 115610 1993 Page S of med_serv.Cmed_serv.C med_serv.C break; ... get_media_server return(med);int MediaServerMgrAddServer(RequestClass *msg,CARD32 requeser,int room_id, Media media String&amp; user_desc,List(int)&amp; part_list) { int serv; //ADD SECURITY // if bad room,error.If server already in room,error.If cannot // contact server,error. if(Iface->RoomManager()->is valid_room(room_id)) return(-ERR_BAD_ROOM_ID) return(init_media_server(msg,room_id,media,user_desc,part_list));}int MediaServerMgrDropServer(RequstClass *msg,CARD32 requester, int room_id,Media media,String user_desc){ MediaServer *serv; MedServRequesClass *req; //ADD SECURITY if(!Ifaace->RoomManager()- >is_valid_room(room_id)) return(-ERR_BAD_ROOM_ID); if((serv=get_media_server(media,user_desc))(MediaServer * )NULL) return(-ERR_CANNOT_CONTACT_MEDIA_SERVER); req=new DisassociateServer(msg,NULL,REQUEST_GEN_SERVER, GEN_DISASSOCIATE_SERVER,next_seq_no(),O,NULL,serv, room_id,media,user_desc); if(!req)return(-ERR_NO_RESOURCES); if(serv->send_request_msg(req)<O) return(-ERR_CANNOT_CONTACT_MEDIA_SERVER); return(O);}void MediaServerMgrDropServer(int room_id,int server_id)DropServer{ MediaServer *serv; MedServRequestClass *req; Media media; String user_desc; serv=get_media_server(server_id); if(!serv)return; if(get_server_info(server_id,media,user_desc)<O) return; req=new DisassociateServer((RequestClass*)NULL,NULL, REQUEST_GEN_SERVER,GEN_DISASSOCIATE_SERVER,next_seq_no(), O,NULL,serv,room_id,media,user_desc); if(!req)return; (void)serv->send_request_msg(req); return;}int MediaServerMgrSuspendServer(RequestClass *msg,CARD32 requester, int room_id,Media media,String&amp; user_desc){ MediaServer *serv; MedServRequestClass *req; //ADD SECURITY (!Iface->RoomManger()->is_valid_room(room_id)) return(-ERR_BAD_ROOM_ID); if((serv=get_media_server(media,user_desc))==(MediaServer*)NULL) return(-ERR_CANNOT_CONTACT_MEDIA_SERVER);Jan 5 115610 1993 Page 4 of med_serv.Cmed_serv.C med_serv.C req=new GeSuspendServer(msg,NULL,REQUEST_GEN_SERVER,...DropServer GEN_SUSPEND_SERVER,next_seq_no(),O,NULL,serv, room_id,media,user_desc); if(!req)return(-ERR_NO_RESOURCES); if(serv->send_request_msg(req)<O) return(- ERR_CANNOT_CONTACT_MEDIA_SERVER); return(O);} int MediaServerMgrResumeServer(RequestClass *msg,CARD32 requester, int room_id,Media media,String&amp; user_desc){ MediaServer *serv; MedServRequestClass *req; //ADD SECURITY if(!Iface->RoomManager()->is_valid_room(room_id)) return(-ERR_BAD_ROOM_ID) if((serv=get_media_server(media,user_desc))==(MediaServer*)NULL) return(-ERR_CANNOT_CONTACT_MEDIA_SERVER); req=new GenResmeServer(msg,NULL,REQUEST_GEN_SERVER, GEN_RESUME_SERVER,next_seq_no(),O,NULL,serv, room_id,media,user_desc); if(!req)return(-ERR_NO_RESOURCES); if(serv->send_request_msg(req)<O) return(-ERR_CANNOT_CONTACT_MEDIA_SERVER); return(o);}int MediaServerMgrSetServerAccessList(RequestClass *msg, CARD32 requesr,int room_id,Media media,String&amp; user desc, List(int)&amp; part_list) { MediaServer *serv; MedServRequestClass *req; //ADD SECURITY if(Iface->RoomManager()->is_valid_room(room_id)) return(-ERR_BAD_ROOM_ID) if((serv=get_media_server(media,user_desc))==(MediaServer*)NULL) return(-ERR_CANNOT_CONTACT_MEDIA_SERVER); req=new SetAccessList(msg,NULL,REQUEST_GEN_SERVER, GEN_SET_ACCESS_LIST,next_seq_no(),O,NULL,serv, room_id,part_list,media,user_desc); if(!req)return(-ERR_NO_RESOURCES); if(serv->send_request_msg(req)<O) return(-ERR_CANNOT_CONTACT_MEDIA_SERVER); return(o);}void MediaServerMgrsend(int m,char *data,int len) send{ List_of_piter(MediaServer)slist(server_list); MediaServer *med=(Mediaserver *)NULL; slist.reset(); while(slist.next(med)){ if(med->ServerId()==m){ med->send(data,len); return; } }}void MediaServerMgrsend_to_all_servers(char *data,int len) sent_to_all_servers{ List_of_piter(MediaServer) slist(server_list); MediaServer *med=(MediaServer *)NULL;Jan 5 115610 1993 Page 5 of med_serv.Cmed_serv. C med_serv. C slist.rese (); ...send_to_all_sereera while(slist.next(med)) (void)med->send(data,len);void MediaServerMgrgarbage_collect() garbage_collect { List_of_piter(MediaServer) clist(server_list); MediaServer *obj; clist.reset(); while(clist.next(obj)){ if(!obj->is_alive()){ delete obj; clist.remove_prev();int MediaServerMgrget_server_connection(Media m, String&amp; user_desc, Media ServerConn&amp; conn) { List_of_piter(MediaServer)slist(server_list); MediaServer *med=(MediaServer *) NULL; int dummy; slist.reset(); while(slist.next(med)){ dummy=(med->user_desc()== user_desc)?1 0; if(med->medium()==m&amp;&amp; dummy) return(med->get_server_connection(conn)); } return(-1);int MediaServerMgrget_manager connection(Media m, String&amp; user desc, MediaServerC onn&amp; conn) { List_of_piter(MediaServer)slist(server_list); MediaServer *med =(MediaServer *) NULL; int dummy; slist.reset(); while(slist.next(med)){ dummy =(med->user_desc()==user_desc)?1 0; if(med->medium()==m &amp;&amp; dummy) return(med->get_manager_connection(conn)); } return(-1);void MediaServerMgrset_manager_port(Media m,String&amp; user_desc, int port){ List_of_piter(MediaServer) slist(server_list); MediaServer(*med=(MediaServer *)NULL; int dummy; slist.reset(); while(slist.next(med)){ dummy=(med->user_desc()==user_desc)?1∶0; if(med->medium()==m &amp;&amp; dummy) med->set_manager_port(port); }Jan 5 115610 1993Page 6 of med_serv.Cmed_serv.Cmed_serv.Cint MediaServerMgrget_server_id(Media m,String&amp; user desc) get_server_id{ List_of_piter(MediaServer)slist(server_list); MediaServer*med=(MediaServer *)NULL; int dummy; slist.reset(); while(slist.next(med)){ dummy=(med->user_desc()==user_desc)?1∶0; if(med->medium()== m &amp;&amp; dummy) return(med->ServerId()); } return(-1);}int MediaServerMgrget_server_info(int server,Media&amp; m,{ String&amp; user_desc) list_of_piter(MediaServer) slist(server_list); MediaServer *mde=(MediaServer *)NULL; int dummy; slist.reset{); while(slist.next(med)){ if(med->ServerId()==server){ m=med->medium(); user_desc=med->user_desc(); return(O); } } return(-1);}MmConnection MediaServrMgrServerConnection(int server)ServerConnection{ List_of_piter(MediaServer) slist(server_list); MediaServer *med=(MediaServer *)NULL; slist.reset(); while(slist.next(med)){ if (med->ServerId()==server){ return(med->connection()); } } return(MmConnection)NULL);Jan 5 115610 1993Page 7 of med_serv.C]]></pre>
<pre listing-type="program-listing"><![CDATA[medserv_msg. C medserv_msg.C //return(e_MSG_PENDING); ...action} //GetServerInfoacctionvoid REP_GetServerInfor_sction(MedisServerConn&amp; conn) r_action{ int rep_len,pos=MSG_HEADER_LEN; rep_buf.reserve(conn.machine.length()+8); rep_buf[pos++]=INTERNET_CONNECTION; Conv->IntToBuf(conn.nachine.length(),((char *)rep buf)+pos);pos+=4; strcpy(((char_ *)rep_buf)+pos,conn.machine);pos+=conn.machine.lensth(); Conv->IntToBuf(conn.port,((char *)rep_buf)+pos);pos+=4; rep_len=len_in_CARD32(pos-MSG_HEADER_LEN); fill_reply_header(type,opcode,seq_no,rep_len; (void)Invoker->send(rep_buf,MSG_HEADER_LEN+rep_len*4);}/////////////////////////////////////MedServRequest class metbods///////////////////////////////////AssociateServerAssociateServer(RequestClass *stimulant, char *header,CARD8 msg_typ, CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker, int proom,List(int)&amp; plist, Media pmedia, String&amp; puser_desc) MedServRequestClass(stimulant,header,msg_typ, msg_code,msg_seq_no,msg_len,msg_data,invoker, proom,pmedia,puser_desc){ art_list=plist; //sbould send part_list LATER common_build();}void AssociateServerspecial_action(Block(ehar)&amp; reply_data, int rdata_len){ REP AddServer *reply; MediaServerConn conn; int server_port; int server_id; int err=-ERR_SERV_CONN_REJECT; server_port=Conv->BufToInt(reply_data); //The Media Server would hare returned the port,number in which it //it is listcning for connections from the Local Media Agents. The //MR Server would know aoout the machine name of the Media Server //as it was able to connect to the Media Server. (void)MSMgr->set_manager_port(media,user_desc,server_port); server_id = MSMgr->get_server_id(media,user_desc); if(rdata_len==4 &amp;&amp;(err=RMgr->AddServer (room,server_id,media,user_desc,part_list))>=O &amp;&amp; stim_msg){ reply=new REP_AddServer(NULL,REPLY_MR_SERVER, stim_msg->msg_code(),stim_msg->msg_seq_no(), O,NULL,stim_msg->MsgSource()); (void)MSMgr->get_manager_connection(media,user_dese,conn); reply->r_action(conn); stim_msg->MsgSource()->serviced_msg(stim_msg); delete reply; } if(err<O &amp;&amp; stim_msg){Jan 5 115609 1993 Page 5 of medserv_msg. Cmedserv_msg. C medserv_msg.C (void) stimulant()->error_obj()->e_action(ERROR_MR_SERVER,...r_action (CARD32)stimulant()->msg_code(), (CARD32)stimulant()->msg_seq_no(),-err); stim_msg->MsgSouree()->servieed_msg(stim_msg); }}DisassociateServerDisassociateServer(RequestClass *stimulant, char *header,CARD8 msg_typ, CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker, int proom, Media pmedia,String&amp; puser_desc) MedServRequestClass(stimulant,header,msg_typ, msg_code,msg_seq_no,msg_len,msg_data,invoker, proom,pmedia,puser_desc){ common_build();}void DisassociateServerspecial_action(Block(char)&amp; reply data, int rdata_len){ int server_id,err; server_id=MSMgr->get_server_id(media,user_desc); if ((err=RMgr->DropServer(room,server_id, media,user_desc))>=O &amp;&amp; stim_msg){ (void)stim_msg->error_obj()->success return(REPLY_MR_SERVER, (CARD32)stimulant()->msg_code(), (CARD32)stimulant()->msg_seq_no()); } if(err<O &amp;&amp; stim_msg){ (void)stimulant()->error_obj()->e_action(ERROR_MR_SERVER, (CARD32)stimulant()->msg_code(), (CARD32)stimulant()->msg_seq_no(),-err); stim_msg->MsgSource()->serviced_msg(stim_msg); }}GenSuspen dServerGenSuspendServer(RequestClass *stimulant, char *header,CARD8 msg_tyP, CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker, int proon,Media pmedia,String&amp; puser desc) MedServRequestClass(stimulant,header,msg_typ, msg_code,msg_seq_no,msg_len,msg_data,involrer, proom, pmedia,puser_desc){ common_build();}void GenSuspendServerspecial action(Block(char)&amp; reply_data, int_rdata_len){ int server_id,err; server_id=MSMgr->get_server_id(media,user_desc); if((err=RMgr->SuspendServer(room,server_id, media,user_desc))>=O &amp;&amp; stim_msg){ (void)stim_msg->error_obj()->success_return(REPLY_MR_SERVER, (CARD32)stimulant()- >msg code(), (CARD32)stimulant()->msg_seq_no()); stim_msg->MsgSource()->serviced_msg(stim_msg); } if(err<O &amp;&amp; stim_msg){ (void)stimulant()->error_obj()->e_action(ERROR_MR_SERVER, (CARD32)stimulant()->msg_code(), (CARD32)stimulant()->msg_seq_no(), --err);Jan 5 115609 1993 Page 6 of medserv_msg. Cmedserv_msg. C medserv_msg.C stim_msg->MsgSource)->serviced_msg(stim_msg); ...r_action }}GenResumeServerGenResumeServer(REquestClass*stimulant, char *header,CARD8 msg_typ, CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker, int proom,Media pmedia,String&amp; puser_desc) MedServRequestClass(stimulant,header,msg_typ, msg_code,msg_seq_no,msg_len,msg_data,invoker, proom,pmedia,puser_desc){ common_build();void GenResumeServerspecial_action(Block(char)&amp; reply_data, int rdata_len) int sever_id,err; server_id=MSMgr->get_server_id(media,user-desc); if((err=RMgr->ResumeServer(room,server)id, media,user_desc))>=O&amp;&amp; stim_msg){ (void)stim_msg->obj()->success_return(REPLY_MR_SERVER, (CARD32)stimulant()->msg_code(), (CARD32)stimulant()->msg_seq_no()); stim_msg->MsgSource()->serviced_msg(stim_msg); } if(err<O &amp;&amp; stim_msg){ (void)stimulant()->error_obj()->e_action(ERROR_MR_SERVER, (CARD32)stimulant()->msg_code(), (CARD32)stimulant()->msg_seq_no(),-err); stim_msg->MsgSource()->servced_msg(stim_msg); }}SetAccessListSetAccessList(RequestClass *stimulant,char *heaer, CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker, int proom,List(int)&amp; plist, Media pmedia,String&amp; puser_desc) MedServClass(stimulant,header,msg_typ, msg_code,msg_seq_no,msg_len,msg_data,invoker, proom,pmedia,puser_desc){ int p; part_list=plist; req_buf.reserve(MSG_HEADER_LEN+8+plist.length()*4); Conv->IntToBnf(room,((char *)req_buf)+pos);_pos+=4; Conv->IntToBnf(plist.length(),((char *)req_buf)+pos);pos+=4; while(Plist_next(p)){ Conv->IntToBuf(p,((char *)req_buf)+pos);pos+=4; len=len_in_CARD32(pos)<<2; fill_request_header();}void SetAccessListspecial_action(Block(char)&amp; reply_data, int rdata_len) int server_id,err; server_id=MSMgr->get_server_id(media,user_desc); if ((err=RMgr->SetAccessList(room,server_id,media, user_desc,part_list))>=O &amp;&amp; stim_msg){ (void) stim_msg->error_obj()->successr_obj()->sccess_return(REPLY_MR_SERVER,Jan 5 115609 1993 Page 7 of medserv_msg. Cmedserv_msg. C medserv msg .C (CARD32)stimulant()->msg_code() ...r_action (CARD32)stimulant()>msg_seq_no()); stim_msg->MsgSource()->serviced_msg(stim_msg); if(err<O &amp;&amp; stim_msg){ (void)stimul()->error_obj()->e_action(ERROR_MR_SERVER, (CARD32_stimulant()->msg_code(), (CARD32)stimulamt()->msg_seq_n0(),-err); stim_msg->MsgSource()->serviced_msg(stim_msg);Jan 5 115609 1993 Page 8 of medserv_msg.Cmr_msg.C mr_msg.C#define DUMMY_CLIENT1#include<iface.h>#include<client.h>#include<iostream.h>#include<room.h>msg_obj_states CreateRoomaction() action{ int id; RoomAttrib rattrib; CARD32 owner; String room_name; if((err=routing_action())<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); else if(err>O) return(e_MSG_PENDING); (void)Conv->BufToCARD32(data+pos,res_len,nbytes,owner);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes,(int)rattrib);pos+=nbytes; if(Conv->BufToString(data+pos,res_len,nbytes,room_name)<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err));#ifdef DUMP_MSG cout<<″REQUEST_MR_SERVERCreateRoom/″<<seq_no<<“/” ?。迹?len<< ″ Owner″<<o(jì)wner<<Attrib ″<< (int)rattrib<<″Name″<<room_name<<end); cout.flush();#endif id=RMgr->CreateRoom(owner,rattrib,room_name); if(id<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-id));#ifdef DEBUG cout<<″NEW >MRIface()->ServReg()->server_for_id(MR_id, machine,port)==O){ cerr<< ″Cannot find server in Registry\n″; reurn(-ERR_MR_SERVER_DOWN);# ifdef DEBUG cout<< Mach″<<machine<< ″″<< port<<endl;cout.flush();# endif if(Invoker->MRIface()->ReqMRManager()->send_to_MRJan 5 115611 1993 Page 1 of msg.Cmsg.C msg.C (machine,port,this)<O)..for_some_other_MR return(-ERR_MR_SERVER_DOWN); return(1);}msg_obj_states Disconneetaction()action{#ifdef DEBUG cout<< ″Dhconnect received\n″;cout.flush();#endif Invoker->deactivate_self(); return(e_MSG_SERVICED);}void GenericReplyClassfill_reply_header(CARD8 msg type,CARD8 msg opcoe, CARD32 msg_seq_no,CARD32 msg_len){ rep_buf[MSG_HOFFSET_TYPE]=msg_type; rep_buf[MSG_HOFFSET_CODE]=msg_opcode; Conv->IntToBuf(msg_seq_no,((char *)rep_buf)+MSG_HOFFSET_SEQ); Conv->IntToBuf((msg_len,((char *)rep_buf)+MSG_HOFFSET_LEN);}void GenericReplyClasssend_reply() send_reply{ fill_reply_header(type,opcode,seq_no,rep_len); (void)Invoker->send(rep_bur,MSG_HEADER_LEN+(rep_len<<2));}msg_obj_states ErrorClasssuccess_return(CARD32 err_type, CARD32 msg_code,CARD32 seq_no){ fill_reply_headef(err_type,msg_code,seq_no,O); Invoker->send(re_buf,MSG_HEADER_LEN); return(e_MSG_SERVICED); }void ErrorClasssend_error(CARD32 err_type,CARD32 msg_code, CARD32 seq_no,CARD32 err_code){ fill_reply_header(err_type,msg_code,seq_no,1); Conv->InToBuf(err_code,((char *)rep_buf)+MSG_HEADER_LEN); if(Invoker->send(rep_buf,MSG_HEADER_LEN+4)==-1) return;}msg_obj_states ErrorClasse_action(CARD32 err_type,CARD32 msg_code, CARD32 seq_no,CARD32 err_code){ send_error(err_type,msg_code,seq_no, err_code); return(e_MSG_SERVICED);}msg_obj_states IllegalMeeageaction() action{ flll_reply_hader(ERROR_MR_SERVER,opcode,seq_no,1);//len Conv->IntToBuf(ERR_BAD_LENGTH,((char *)req_buf)+MSG_HEADER_LEN); (void) Invoker->send(rep_buf,MSG_HEADER_LEN+4); return(e_MSG_SERVICED); }int MRMRRequestClassrouting_action() routing-action{ int MR_id; (void)Conv->BufToCARD32(data+pos,res_len,nbytes,MR_id);pos+=nbytes; return(for_some_other_MR(MR_id));}Jan 5 115611 1993 Page 2 of mag.Cmsg.C msg.C void MedServRequestClassfill_request_hesder() ...rorting_action { header[MSG_HOFFSET_TYPE]=type; header[MSG_HOFFSET_CODE]= opcode; Conv->IntToBuf(seq_no,header+MSG_HOFFSET SEQ); } Conv->IntToBuf(len>>2,header+MSG_HOFFSET_LEN); void MedServRequestClasscommon build() { -common_build req_buf.reserve(4); Conv->IntToBuf(room,((char *)req_buf)+pos);pos+=4; len=len_in_CARD32(pos)<<2; fill_requess_header(); } void EventClassbuild(int src,int idl) build { len=1; rep_buf.reserve(MSG_HEADER_LEN+len*4); fill_reply_header(type,opcode,seq_no,len); } Conv->IntToBuf(idl,((char *)rep_buf)+pos);pos+=4; void EventClassbuild(int sre,int idl,int id2,int participant) build{ len=3; req_buf.reserve(MSG_HEADER_LEN+len*4); fill_reply_header(type,opcode,seq_no,len); Conv->InToBuf(id1,((char *)req_buf)+pos);pos+=4; Conv->IntToBuf(id2,((char *rep_buf)+pos);pos+=4; Conv->IntToBuf(participant,((char *)rep_buf)+pos);pos+=4;}void EventClassbuild(int src,int idl,int id2) build{ len=2; rep buf.reserve(MSG_HEADER_LEN+len*4); fill_reply_header(type,opcode,seq_no,len); Conv->IntToBuf(idl,((char *)rep buf)+pos);pos+=4; Conv->IntToBuf(id2,((char *)rep_buf)+pos);pos+=4;} void EventClassbuild(int src,int idl,int id2,List(int)&amp; plist)List{ int part; len=3+plist.length(); rep_buf. reserve(MSG_HEADER_LEN+len* 4); fill_reply_header(type,opcode,seq_no,len); Conv->IntToBuf(idl,((char *)rep_buf)+);pos+=4; Conv->IntToBuf(id2,((char *)rep_buf)+pos);pos+=4; Conv->IntToBuf(plist.length(),((char *)rep_buf)+pos);pos+=4; plist.reset(); while (plist.next(part)){ Conv->IntToBuf(part,((char *)rep_buf)+pos);pos+=4; }void EventClassbuild(int src,int room_id,int meeting_id,Media med,{String&amp; user_desc) int part; len=len_in_CARD32(4+4+1+4+user desc.length()); rep_buf.reserve(MSG_HEADER LEN+len*4); Conv->IntToBuf(room_id,((char *)rep_buf)+pos);pos+=4;Jan 5 115611 1993 Page 3 of msg.Cmsg.Cmsg.C Conv.->IncToBul(meeting_id,((char *)rep_buf)+pos);pas+=4; ...List rep_buf[pos++]=(char) med; Conv->IntToBuf(user_desc.length(),((char *)rep_buf)+pos);pos+=4; strcpy(((char *)rep_buf)+pos,user_desk);pos+=user_desc.length(); fill_reply_header(type,opcode,seq_no,len); void EvencClassbuild(Int ste, int room_id,int meetins_id,Media med, String&amp; user_desc,List(int)&amp; plist){ int parc; 1eh=len_in_CARD32(4+4+1+4+user_desc.length()+4+(4*plist.length())); rep_buf.reserve(MSG_HEADER_LEN+len*4); Conv->IntToBuf(room_id,((char *)rep_buf)+pos);pos+=4; Cony->IncToBuf(meeting_id,((char *)rep_buf)+pos);pos+=4; rep_buf[pos++]=(char)med; Conv->IntToBuf(user_desc.length(),((char *)rep_buf)+pos);pos+=4; scrcpy(((char *)rep_buf]+pos,user_desc);pas+=user_desc.length(); Cony->IntToBul(plisc.length(),((char *)rep_buf)+pas);pos+=4; plit.reset(); while(plist.next(part)){ Cony->IncToBuf(part,((char *)rep_buf)+pcs);pos +=4;#ifdef DEBUG cout<<″NUMPART<<plist.length();coup.flush();# endif fill_reply_header(type,opcode,seq_no,len);}void EventClasssend_event() send_event{ MmConnection conn; slist.rest(); while(slist.next(conn)){ (void)NW->W(wǎng)rite(conn,rep_buf,MSG_HEADEE_LEN+(len<<2)); }Jan 5 1158 1993Page 4 of msg.Cobj_man.Cobj_man.C#indude<o(jì)bj_man.h>#inelude<server_reg.h>List_of_pimplement(LoealSession) List_of_pimmplementList_of_pimplement(FrontEnd) List_of_pimplementList_of_pimplement(ReqMR) List_of_pimplement CommObjMgrCommObjMgr(MRInterface * iface) CommObjMgr{ Iface=iface;}void LocalSessionMgrprocess(MmConnection cli) process{ List_of_piter(LocalSession)clist(client_list); LocalSession *obj; clist.reset(); while(clist.next(obj)){ //check creation if(obj->connection()==cli){ obj->process_msg(); garbage_collect(); return; } } if(strcmp(cli->NameTag(),″″)) return // Not a new client if({obj=new LocalSession(iface,cli))==NULL){ cout<<″Fatal Mem. Allocation Error ″<<_FILE_<< ″″<< ″_LINE_″<< endl; return; } clist.insert_next(obi); obj->process_msg();}void Loc alSessionMgrgarbage_collect() garbage_collect{ List_of_piter(LocalSession) clist(client_list); LocalSession *obj; clist.reset(); while(clist.next(obj)){ if(!obj->is_alive()){ delete obj; clist.remove_prev(); } }}////////////////////////////FrontEndMgr methods//////////////////////////void FrontEndMgrprocess(MmConnection cli) process{ List_of_piter(FrontEnd)clist(client_list); FrontEnd *obj; clist.reset(); while (clist.next(obj)){ //check creation if(obj->connection()==cli){ obj->process_msg();Jan 5 115604 1993 Page 1 of obj_man. Cobj_man.C obj_man. C garbage_collect(); ...proocess return; if((obj=new FrontEnd(Iface,cli))==NULL){ cout<<″Fatal Mem.Allocation Error″<<_FILE_<< ″″<< ″_LINE_″<<endl; return; clist.insert_next(obj); obj->process_msg();# ifdef DEBUG cout<< ″Got conn. from front end\n″; cout.flush();# endif}void FrontEndMgrgarbage_collect() garbage collect{ List_of_piter(FrontEnd)clist(client_list); FrontEnd *obj; clist.reset(); while(clist.next(obj)){ if(!obj->is_alive()){ delete obj; clist.remove_prev(); } }////////////////////////////ReqNMMgr methods//////////////////////////ReqNMMgrReqNMMgr(MRInterface *iface) CommObjMgr(iface) CommObjMgr{ String machine; int port; MmConnection server; char host[HOST_NAME_LEN]; is_alive=O; Iface->ServReg()->default_name_server(machine,port); server=NW->CallServer(machine.dump(host),port); server->NameTag(″NM″); // handle error here if(server >IsAssigned()==MmEnumMmFalse){ cout<< ″Cannot connect to″machine <<″″<< port<<endl; } if((nm_obj=new_ReqNM(Iface,server))==NULL){ cout<< ″Fatal Mem.Alloction Error ″<<_FILE_<< ″ ″<<_LINE_<< endl; return; } is_alive=1;} int ReqNMMgrsend_to_NM(Message *msg) send_to_NM return(nm_obj->send_request_msg(msg));void ReqNMMgrprocess(MmCnnection serv) processJan 5 115604 1993 Page 2 of obj_man.Cobj_man. C obj_man.C{..process if(nm_obj->connection()==serv) nm_obj->process_msg();}////////////////////////////ReqMRMgr methods//////////////////////////int ReqMRMgrsend_to_MR(String machine,int port,Message *msg) send_to_MR{ ReqMR *obj; MmConnection server; char host[HOST_NAME_LEN];# ifdef DEBUG cout<< ″Sending msg to other MR″<< machine<<″″<<port<<endl; cout.flush();# endif server=NW->CallServer(machine.dump(host),port); server->NameTag(″MR″); hadle error here if(server->IsAssined()== MmEnumMmFalse){ cout<< ″Cannot connect to ″<< machine<<″″<<port<< endl; return(-1); } if((obj=new ReqMR(Iface,server))==NULL){ cout<< ″Fatal Mem.Allocation Error<<_FILE_<< ″″<< ″_LINE_″<< endl; return-1); } server_list.insert_next(obj); return(obj->send_request_msg(msg));void ReqMRMgrprocess(MmConnection serv)process{ List_of_piter(ReqMR) clist(server_list); ReqMR*obj; clist.reset(); while(clist.next(obj)){ if(obj->connection()==serv){ obj->process_msg(); garbage_collect(); return; } }void ReqMRMgrgarbage_collect() garbage_collect{ List_of_piter(ReqMR) clist(server_list); ReqMR *obj; clist.reset(); while(clist.next(obj)){ if(!obj->is_alive()){ MW>HangUp(obj->connection()); delete obj; clist.remove_prev(); } }Jan 5 115604 1993 Page 3 of obj_man.Cproto. Cproto. C#includeProtocok:Prococol(MRlnterface.irate) Protocol{ Iface=iface; Cony=Iface->Cony(); for(int i=0;i<MAX_MSG_TYPES;i++){ for (int j=0; j<MAX_MSGS;j++){ Gen_func_tab[i][j]=ProcoGeneratordefault_generator, } }]]></pre> <pre listing-type="program-listing"><![CDATA[for(int j=0;j<MAX_RECISTRY_SERVER_MSSGS;j++) Gen_func_tab[REQUEST_REGISTRY_SERVERI][j]=ProtoGeneratorGen_NameServerMsg; Gen_func_tab[REQUEST_MR_SERVER][MR_DISCONNCT]=protoGeneramrGen_Disconnect;}void Protocolinterpret_header(char *header,CARD8&amp; type, CARD8&amp; opcode,CARD32&amp; seq,CARD32&amp; len){ int tmp; type=headcr[MSG_HOFFSET_TYPE]; opcode=header[MSG_HOFFSET_CODE]; if(type<0||type>MAX_MSG_TYPES)type=O; if(opcode<0]||opcode>MAX_MSGS)_opcode=O; seq=Conv->BufToInt(header+MSG_HOFFSET_SEQ);#ifdef DEBUG//cout<< ″IN PROTO SEQ″<< seq<< endl;#endifJan 5 115612 1993Page 1 of proto. Cproto.C proto.Ctmp=Conv->BufToInt(header+MSG_HOFFSET_LEN); …prootocollen=tmp<<MSG_UNIT;}Message*Protocolconstnct_msg(char*header,CARD8 type,CARD8 opcode,CARD32 seq,CARD32 len,char*data,Connection*conn){if(type>=MAX_MSG_TYPES||opcode>=MAX_MSGS){cout<<Tllegal Type/Opcode*<<(int)type<<””<<(int)opcode<<end1;type=REQUEST_MR_SERVER;opcode=MAX_MSGS-1;}return(Gen_func_tab[(int)type][(int)opcode](header,type,opcode,seq len,data,conn));}Jan 5 115612 1993 Page 2 of proto.Croom.C room.C#include<o(jì)bj_man.h>#include<room.h>#include<iface.h>#include<med_serv.h>#define DEFAULT_ROOMS 1000Listimplement(int)ListimplementListmplement(String) ListimplementList_of_pimplement(Room) List_of_pimplementList_of_pimplement(Conferee) List_of_pimplementListimplement(ParticipantInfo)ListimplementList_of_pimplement(MediaDesc) List_of_pimplementList_of_pimplement(FullMediaDesc) List_of_pimplementList_of_pimplement(MediaServerInfoInRoom) List_of_pinpfement////////////////////////////////////////////////////Room Methods//////////////////////////////////////////////////RoomRoom(int room_id,CARD32 rowner,RoomAttrib rattr,{ String&amp; rname,RoomMgr *rRMgr) id =room_id; attrib=rattr; MR_id=owner=rowner; status=e EMPTY_ROOM; lock_status=e_UNLOCKED; meeting=(Meeting *)NULL; if (rname==″) room_name=″NoName″; else room_name=rname; RMgr=rRMgr; MSMgr=RMgr->MRIface()->MediaServerManager(); EveNot=RMgr->MRIface()->EveNotifier(); EveNot->RoomCreated(RoomId(),O);//src is O (MR)}int Roomlock() lock{ if (lock_status==e_LOCKED) return(-ERR ROOM_LOCKED); lock status=e_LOCKED; EveNot->RoomLocked(RoomId(), O); return(SUCCESS);}void Roommeeting_created(Meeting *m)meeting_created{ set_meeting(m); if(m){ if(server_list.length()>O) status=e_ROOM_W_MEETING_RESOURCES; else status=e_ROOM_W_MEETING; }}void Roommeeting_destroyed()meeting_destroyed{ MediaServerInfoInRoom *info; server_list.reset(); while(server_list.next(info)){ if(info>scope==e MEETING_SCOPE){ MSMgr->DropServer(Roomld(),info->server);Jan 5 115612 1993 Page 1 of room.Croom. Croom. C delete info; ... meeting_destroycd server_list.remove_prev(); } } if(server_list.length()>O) status=e_ROOM_W_RESOURCES; else status=e_EMPTY ROOM; set_meeting((Meeting *) NULL);}int Roomunlock() unlock{ if(lock_status==e_UNLOCKED) return(-ERR_ROOM_ALREADY_UNLOCKED); lock_status=e_UNLOCKED; EveNot->RoomUnlocked(Roomld(),O); return(SUCCESS);}void Roomset_meeting(Meeting *m)set_meeting{ meeting=m;}Room-Room() Room{ int m; if(meeting)delete meeting;#ifdef DEBUG cout<< ″Room″<<id<<″Deleted\n″;cout.flush();# endif Should send room destroyed event to all servers EveNot->RoomDestroyed(RoomId(),O);//src is O (MR)void RoomMediaServerDied(int id) MediaServerDied{ MediaServerInfoInRoom *info; server_list.reset(); while(server_list.next(info)){ if(info->server==id){ delete info; server_list.remove_prev(); } }}int Roomis_server_presnt(int server_id) is_server_present{ List_of_piter(MediaServerInfoInRoom)slist(server_list); MediaServerInfoInRoom *info; slist.reset(); while (slist.next(info)){ if(info->server==sever_id) return(1); } return(O);}int Roomadd_server(int server_id,Media media, String&amp; user_desc, List(int)&amp; part_list){ Jan 5 115612 1993 page 2 of room. Croom. Croom. C int p; ...is_server_present MediaDesc med; MediaServerInfoInRoem *info; server_list.reset(); while(server_list.next(info)){ if(info->server==server_id){ return(-1); } } info=new MediaServerInfoInRoom; info->server=server_id;info->status=e_SERV_NORMAL; info->scope=(has_meeting())?e_MEETING_SCOPEe_ROOM_SCOPE; server_list.insert_next(info); EveNot->ServerAdded(O,RoomId(), has_meeting()?meeting->MeetingId()O, media,user_desc,part_list); med.server=media; med.user_desc=user desc; if(has_meeting()){ part_list.reset(); while(part_list.next(p)){ meeting->add_media(p,med); EveNot->MeetingInfo(RoomId(),O,meeting->MeetingId()); status=e_ROOM_W_MEETING_RESOURCES; } else status=e_ROOM_W_RESOURCES; return(O);}int Roomset_access_list(int server_id,Media media,String&amp; user_desc, List(int)&amp; part_list){ int p; MediaDesc med; med.server=media; med.user_desc=user_desc; if(has_meeting()){ meeting->restrict_media_access(part_list,med); EveNot->ServerAccessListSet(O,Roomld(), has_meeting()?meeting->MeetingId()O, media,user_desc,part_list); } return(O);}int Roomdrop_server(int server_id,Media media,String&amp; user_desc) drop_server{ MediaDesc med; MediaServerInfoInRoom *info; server_list.reset(); while(server_list.next(info)){ if(info>server==server_id){ delete info; server_list.remove_prev(); } } med.server=media; med.user_desc=user desc; if(has_meeting)) meeting->drop_media(med);Jan 5 115612 1993 Page 3 of room. Croom. C room. C ...drop_seruer EveNot- >ServerDropped(O, Roomld(),has_meeting()?meeting->MeetingId()O, media,user_desc); if (server list.length()==O) status =(has_meeting())?e_ROOM_W_MEETING e_EMPTY_ROOM; return(o);}int Roomsuspend_server(int server_id,Medis media, String&amp; user_desc) suspend server MediaDesc med; int s; MediaServerInfoInRoom *info; List_of_piter(MediaServerInfoInRoom)slist(server_list); slist.reset(); while(slist.next(info)){ if(info->server==server_id) info->status=e_SERV_SUSPENDED; } med.server=media; med.user_desc=user_desc; if(has_meeting()) meeting->suspend_media(med); return(O);}int Roomresume_server(int server_id, Media media, String&amp; user_desc)resume__server{ MediaDesc med; int s; MediaServerInfoInRoom *info; List_of_piter(MediaServerInfoInRoom)slist(server_list); slist.reset(); while(slist.next(info)){ if(info->server==server_id) info->status=e_SERV_NORMAL; } med.server=media; med.user_desc=user_desc; if(has_meeting()) meeting->resume_media(med); return(O);}int Roomlist_servers(List_of_p(FullMediaDesc)&amp; media_list) List_of_p{ int s; List_of_piter(MediaServerInfoInRoom) slist(server_list); FullMediaDesc *m; MediaServerInfoInRoom *info; MediaServerConn conn_info; Media media; String user_desc; media_list.reset(); slist.reset(); while(slist.next(info)){ if(MSMgr->get_server_info(info->server,media,user_desc)>=O){ m=newFullMidiaDesc; m->server=media; m->user_desc=user_desc; m->status=info->status;Jan 5 115612 1993Page 4 of room. Croom. C room. C if(MSMgr->get_manager_connection(media,user_desc List_of_p conn_mm) >= O) {{ m->machine=conn_info.machine; m->port=conn_info.port; } media_list .insert _next(m); } return(o);}void Roomassociated_servers(List(int)&amp; serv_list) List{ List_of_piter(MediaServerInfoInRoom) slist(server_list); MediaServerInfoInRoom *info; serv_list.reset(); slist.reset(); while(slist.next(info)){ serv_list.insert_next(info->server); }}////////////////////////////////////////////////////MeetingMethods//////////////////////////////////////////////////MeetingMeeting(int meeting_id,CARD32 mowner,RoomAttrib mattr, Room * mroom, RoomMgr * mRMgr){ id=meeting_id; attrib=mattr; owner=mowner; RMgr=mRMgr; EveNot=RMgr->MRIface()->EveNotifier(); room=mroom; staus=e_MNORMAL; EveNot->MeetingCreated(room->RoomId(),O,Meetingld()); //Add the owner as a participant (void) add_participant(owner);MeetingMeeting() Meeting{ drop_all_participants(); //Should send meeting destroyed event to all servers EveNot->MeetingDestroyed(room->Roomld(),O,Meetingld());}int Meetingstate_check() state_check{ if(status==e_MSUSPENDED) return(-ERR_METING_SUSPENDED); if(room->room_lock_status()==e_LOCKED) return(-ERR_ROOM_LOCKED);}void Meetingget_meeting_info(List(PartieipantInfo)&amp; info) List{ List_of_piter(Conferee)clist(conf_list); Conferee *c; PerticipantInfo p; cliet.reset(); info.reset(); while(clistnext(c)){ p.participant=c->ID();Jan 5 115612 1993Page 5 of room. Croom. C room. C p.media_list=c->get_med_list(); ...List info.insert_next(p);void Meetingget_meeting_participants(List(int)&amp; plist)lsit{ List_of_piter(Conferee)clist(conf_list); Conferee *c; clist.reset(); plist.reset(); while(clist.next(c)){ plist.insert_next(c->ID()); }int Meetingadd_participant(int participant) add_participant{ Conferee *c; if((err=state_check())< O)return(err); conf_list.reset(); while (conf_list.next(c)){if (c->ID)==participant } if(c=new Conferee(participant)) conf_list.insert_next(c); else{ cout<<″Fatal mem alloc error″<<_FILE_<<″″ << _LINE_; cout.flush(); return(-ERR_NO_RESOURCES); EveNot->Addedparticipant(room->RoomId(),OMeetingId(), participant); return(SUCCESS);int Meetingdrop_partcipant(int participant)drop_participant{ Conferee *c; if((err=state_check())<O)return(err); conf_list.rest(); while(conf_list.next(c)){ if(c->ID()==parcipant){ delete c; conf_list.remove_prev(); EveNot->Droppedparticipant(room->Roomd(),O, MeetingId(),partcipant); change_owner(); return(SUCCESS); } return(-ERR_PARTICIPANT_NOT_PRESENT);void Meetingchange_owner()change_owner{ Conferee *c; conf_list.reset(); if(conf_list.next(c)){ if(c){ owner=c->ID();# ifdef DEBUG cout<<″New Meeting Owner″<< owner<<endl;Jan 5 115612 1993 Page 6 of room C room. C room. C# endif ...change_owner } }}int Meetingsuspend_meeting()suspend meeting{ if(status==e MSUSPENDED) return(-ERR_MEETING_SUSPENDED); sstatus=e_MSUSPENDED; EveNot->MeetingSuspended(room->RoomId(),O,Meetingd()); return(SUCCESS);}int Meetingresume_meeting) resume meeting{ status=e_MNORMAL; EveNot->MeetingResumed(room->RoomId(),O,MeetigId()); return(SUCCESS); }void Meetingdrop_all_participants() drop_all_participants{ Conferee *c; conf_list.reset(); while(conf_list.next(c)){ EveNot->DroppedParticipant(room->RoomId(),O, MeetingId(),c->ID()); delete c; conf_list.remove_prev(); }void Meetingadd_media(CARD2 participant,MediaDesc med)add_media{ List_of_piter(Conferee)clist(conf_list); Conferee *c; clist.reset(); while(clist.next(c)){ if(c->ID)==participant){ c->add_media(med); break; } }void Meetingdrop_media(CARD32 paticipant,MediaDesc med) drop_media{ List_of_piter(Conferee) clist(conf_list); Conferee *c; clist.reset(); while(clist.next(c)){ if(c->ID()==participant){ c->drop_media(med); break; } }void Meetingdrop_media(MediaDesc med)drop_media{ List_of_piter(Conferee) clist(conf_list); Conferee*c; clist.reset(); while(clist.next(c)){Jan 5 115612 1993 Page 7 of room. Croom. Croom. C c->drop_media(med); ... drop_media }}void Meetingsuspend_mediA(MediaDesc med) suspend_media{ List_of_piter(Conferee)clist(conf_list); Conferee *c; clist.reset(); while(clsit.next(c)){ c->suspend_media(med); }} void Meetingresume_media(MediaDesc med)resume_media{ List_of_piter(Conferee)clist(conf_list); Conferee *c; clist.reset(); while(clist.next(c)){ c->resume_media(med); }}void Meetingrestrict_media_access(List(int)&amp; part_list,MediaDesc med) list { List list_of_piter(Conferee)clist(conf_list); Conferee *c; clist.reset(); while (clist.next(c)){ part_list.reset(); if(part_list.find_next(c->ID()) c->add_media(med); else c->drop_media(med); }}int Meetingleave_meeting(int participant, List_of_p(MediaDesc)&amp; media_list){ List list_of_piter(Conferee)clist(conf_list); Conferee *c; clist.reset(); while(clist.next(c)){ if(c->ID)()==participant){ c->suspend_media(media_list); EveNot->leftMeetint(room->RoomId(),O,MeetintId(), participant); return(O); } } return(-ERR_PARTICIPANT_NOT_PRESENT);}int Meetingreentr_meeting(int participant, List_of_(MediaDesc)&amp; media_list) List List_of_piter(Conferee)clist(conf_list); Conferee *c; clist.reset(); while(clist.next(c)){ if(c->ID()==partcipant){Jan 5 115612 1999 Page 8 of room.C////////////////////////////////////////////////////Conferee Methods//////////////////////////////////////////////////ConfereeConferee() Conferee{ FullMediaDesc *m; media_list.reset(); while(media_list.next(m)){ delete m; }}void Confereeadd_media(MediaDesc med) add_media{ FullMediaDesc *mm; medis_list.reset(); while(media_list.next(m)){ if(m>server==med.server &amp;&amp; m->user_desc==med.user_desc) return; if(m=new FulIMediaDesc){ m->server=med.server;m->user_desc=med.user_dese; m->status=c_SERV_NORMAL; media_list.insert_next(m); }}void Confereedrop_medis(MediaDesc med) drop_media{ FullMediaDesc *m; media_list.reset(); while(media_list.next(m)){ if(m->server==med.server &amp;&amp; m->user_desc==med.user_desc){ media_list.remove_prev(); delete m; return; }}void Confereesuspend_mmedia(MediaDesc med) suspend_media{ FullMediaDesc *m; media_list.reset(); while(media_list.next(m)){ if(m->server==med.server &amp;&amp; m->user_desc==med.user_desc){ m->status=e_SERV_SUSPENDED; return; } }}void Confereesuspend_mmedia(List_of_p(MediaDesc)&amp; med_list) List_of_p{Jan 5 115612 1993 Page 9 of room. Croom. C room. C FullMediaDesc *m; ...List_of_p MediaDesc* mdesc; med_list.reset(); while(med_list.next(mdesc)){ media_list.reset(); while(media_list.next(m)){ if(m->server==mdesc->server &amp;&amp; m->user_desc==mdesc->user_desc){ m->status=e_SERV_SUSPENDED; } }}void Confereeresume_media(List_of_p(MediaDesc)&amp; med_list) List_of_p{ FulIMediaDesc *m; MediaDesc *mdesc; med_list.reset(); while(med_list.next(mdesc)){ media_list.reset(); while(media_list.next(m)){ if(m->server==mdesc->server &amp;&amp; m->user_desc==mdesc->user_desc){ m->status=e_SERV_NORMAL; } } }}void Confereeresume_media(MediaDesc med) resume_media{ FullMediaDesc *m; media_list.reset(); while(media_list.next(m)){ if(m->server==med.server &amp;&amp; m->user_desc==med.user_desc){ m- >status=e_SERV_NORMAL; return; } })////////////////////////////////////////////////////RoomMgr Methods//////////////////////////////////////////////////RoomMgrRoomMgr(MRInterface *MRIface,Range r)RoomMgr{ Iface=MRlface; if (r.start<=r. end) r.end=r.start+DEFAULT_ROOMS; for(int i=r.end-rstart;i>=O;i--){ free_room_id_list.insern_next(r.start+i); free_meeting_id_list.insert_next(rstart+i); } range=r;RoomMgr-RoomMgr) RoomMgr{ Room *r; room_list.reset(); while(room_list.next(r)) if(r)delete r;Jan 5 115612 1993Page 10 of room. Croom. C room. C} ...RoomMgrint RoomMgris_valid_room(int room_id)is_valid_room{ Rooom *r; List_of_piter(Room)riter(room_list); riter.reset(); while (riter.next(r)){ if(r->RoomId()==room_id) return(1); } return(O);}int RoomMgrgenerate_room_id()generate_room_id{ int id; free_room_id_list.reset(); used_room_id_list.reset(); if(free_room_id_list.next(id)){ free_room_id_list.remove_prev(); usde_room_id_list.insert_next(id); return(id), } return(-1);}// LATER SOme bug in list deletion;check latervoid RoomMgrfree_room_id(int id) free_room_id{ used_room_id_list.reset(); free_room_id_list.reset(); if(used_room_id_list.find_next(id)){ used_room_id_list.remove_prev(); free_room_id_list.insert_next(id); }}int RoomMgrgenerate_meeting_id() generate_meeting_id{ int id; free_meeting_id_list.reset(); used_meeting_id_list.reset(); if(free_meeting_id_list.next(id)) { free_meeting_id_list.remove_prev(); used_meeting_id_list.insert_next(id); return(id); } return(-1);}// LATERSOme bug in list deletion;check latervoid RoomMgrfree_meeting_id(int id)free_meeting_id{ used_meeting_id_list.reset(); free_meeting_id_list.reset(); if (used_meeting_id_list.find_next(id)}{ used meeting_id_list.remove_prev(); free_meeting_id_list.insert_next(id); }}int RoomMgrCreateRoom(CARD32 owner,RoomAttrib attrib,String&amp; rname) CreateRoomJan 5 115612 1993 Page 11 of room. Croom. C room. C ... CreateRoom Room *r; //ADD SECURITY LATER int id=generate_room_id(); if (id<0) return(-ERR_NO_RESOURCES); if((r=new Room(id, owner,attrib,rname,this))==NULL) return(-ERR_NO_RESOURCES); room_list.inser_next(r); return(id);}int RoomMgrDestroyRoom(CARD32 requester,int room_id) DestroyRoom{ Room *r; room_list.reset(); while(room_list.next(r)){ if(r->Roomid()==room_id){ //ADD SECURITY LATER free_room_id(room_id); delete r; room_list.remove_prev(); return(SUCCESS); } } return(-ERR_BAD_ROOM_ID);}int RoomMgrListRooms(CARD32 requster,List(int)&amp; rlist, List(String)&amp; name_list) Room *r; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER rlist.reset(); riter.reset(); name_list.reset(); whil (riter.next(r)){ rlist.insert_next(r->RoomId()); name_list.insert_next(r->RoomName)); } return(SUCCESS);}int RoomMgrShowRoomStatus(CARD32 requester,int room id, RoomStatus&amp; stat, RoomLockStatus&amp; lock_stat){ Room *r; List_of_piter(Room)riter(room_list); //ADD SECURITY LATER riter.reset(); while(riter.next(r)){ if(r->RoomId()==room_ia){ stat=r->room_status(); lock_stat=r->room_lock_status(); return(SUCCESS); } } return(-ERR_BAD_ROOM_ID);}int RoomMgrShowRoomAtributes(CARD32 requester,Jan 5 115612 1993 Page 12 of room. Croom. Croom. C int room_id, RoomAttrib&amp; attrib)...DestroyRoom{ Room *r; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER riter.reset(); while(riter. next(r)){ if(r->RoomId()==room_id){ attrib=r->room_attrib(); return(SUCCESS); } } return(-ERR_BAD_ROOM_ID);}int RoomMgrAlterRoomAttributes(CARD32 requester,int room_id, RoomAttrib attrib) { Room *r; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER riter.reset(); while (riter.next(r)){ if(r->RoomId()==room_id){ r->set room attrib(attrib); return(SUCCESS); } } return(-ERR_BAD_ROOM_ID);}int RoomMgrLockRoom(CARD32 requester,int room_id) LocRoom{ Room *r; List_of_piter(Room)rite(room_list); //ADD SECURITY LATER riter.reset(); while (riter.next(r)){ if(r->RoomId()==room_id) return(r->lock()); } return(-ERR_BAD_ROOM_ID);}int RoomMgrUnlockRoom(CARD2 requester,int room_id) UnlockRoom{ Room *r; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER riter.reset(); while(riter.next(r)){ if(r->RoomId()==room_id) return(r->unlock()); } return(-ERR_BAD_ROOM_ID);}int RoomMgrCreateMeeting(CARD32 owner,CARD32 room_id, MeetingAttrib attrib){ Room *r; Meeting *m;Jan 5 115612 1993Page 13 of room.Croom. Croom. C List_of_piter(Room)riter(room_list); ... UnlockRoom riter.reset(); while(riter.next(r)){ if(r->RoomId()==room id){ if(r->has_meeting()) return(-ERR_ROOM_HAS_MEETNG); else{ int id=generate_meeting_id(); if(id<O) return(-ERR_NO_RESOURCES); if((m=new Meeting(id,owner, attrib,r,this))==NULL) return(ERR_NO_RESOURCES); r->meeting_created(m); return(id); } } } return(-ERR_BAD_ROOM_ID);int RoomMgrDestroyMeeting(CARD32 requester,int meeting_id)DestroyMeeting{ Room *r; Meeting *m; List_of_piter(Room)riter(room_list); //ADD SECURITY LATER riter.reset(); while (riter.next(r)){ if((m=r->get_meeting))?。?Meeting *)NULL &amp;&amp; m->MeetingId()== meeting_id){ free_meeting_id(meeting_id); delete m; r->meeting_destroyed(); return(SUCCESS); } } return(-ERR_BAD_MEETING_ID);int RoomMgrListMeetings(CARD32 requster,List(int&amp; rlist) List{ Room *r; Meeting *m; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER rlist.reset(); riter.reset(); while(riter.next(r)){ if(m=r->get_meeting()) rlist.insert_next(m->Meetingld()); } return(SUCCESS);}int RoomMgrShowMeetinStatus(CARD32 requester,int meeting_id, List(ParticipantInfo)&amp; info,int&amp; p_room_id, int&amp; owner,MeetingStatus&amp; status){ Room *r; Meeting *m; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER riter.reset();Jan 5 115612 1993 Page 14 of room. Croom. Croom. C while (riter.next(r)){ ...List if((m=r->get_meeting())!=(Meeting *)NULL &amp;&amp; rm->MeetingId()==meeting_id){ m->get_meeting_info(info); p_room_id=r->RoomId(0; owner=m->get_meeting_owner(); status=m->get_meeting_status(); return(SUCCESS); } } return(- ERR_BAD_MEETING_ID);} int RoomMgrShowMeetRoomStatus(CARD32 requester, int room id, List(ParticipantInfo)&amp; info, int&amp; p_meeting_id, int&amp; owner,MeetingStatus&amp; statuss) { Room *r; Meeting *m; List_of_piter(Room)riter(room_list); // ADD SECURITY LATER riter.reeet(); while(riter.next(r)){ if(r->RoomId()==room_id){ if(m==r->get_meeting()){ m->get_mneeting_info(info); p_meeting_id=m->MeetingId(); owner=m->get_meeting_owner(); status=m->get_meeting_status(); return(SUCCESS); } else { p_meeting_id =owner=-1; return(SUCCESS); } } } return(-ERR_BAD_MEETING_ID);}int RoomMgrListMeetingParticipants(int meeting_id, List(int)&amp; plist) List Room *r; Meeting *m; List_of_piter(Room) riter(room_list ); //ADD SECURITY LATER riter.reset(); while(riter.next(r)){ if((m=r->get_meeting())?。?Meeting *)NULL &amp;&amp; m->MeetingId()==meeting_id){ m->get_meeting_participants(plist); return(SUCCESS); } return(-ERR_BAD_MEETING_ID);}int RoomMgrShowMeetingAttributes(CARD32 requester,int meeting_id, MeetingAttrib&amp; attrib) Room *r; Meeting *m; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER riter.reset();Jan 5 115612 1993Page 15 of roon. Croom. Croom. C while (riter.next(r)){ ...List if((m=r->get meeting())?。?Meeting *)NULL &amp;&amp; m->Meetingld()==meeting_id){ attrib=m->get_meeting_attrib(); return(SUCCESS); } } return(-ERR_BAD_MEETING_ID);int RoomMgrShowAssociatedMeeting(CARD32 requester,int room id, int&amp; meeting_id) { Room *r; Meeting *m; List_of_piter(Room)riter(room_list); //ADD SECURITY LATER riter.reset(); while (riter.next(r)){ if(r->Roomld()== room_id){ if(r->has_meeting()&amp;&amp;(m=r->get meeting())){ meeting_id=m->Meetingld(); return(SUCCESS); } else return(-ERR_ROOM_HAS_NO_MEETING); } } return(-ERR_BAD_ROOM_ID);}int RoonMgrShowAssociatedRoom(CARD32 requester,int meeting_id, int&amp; room_id){ Room *r; Meeting *m; List_of_piter(Room)riter(room_list); //ADD SECURITY LATER riter.reset(); while (riter.next(r)){ if(r->has meeting() &amp;&amp; (m=r->get_meeting()) &amp;&amp; m->MeetingId()==meeting_id){ room_id=r->RoomId(); return(SUCCESS); } } return(-ERR_BAD_MEETING_ID);}int RoomMgrAlterMeetingAttributes(CARD32 requester, int meeting_id, MeetingAttrib attrib){ Room *r; Meeting *m; List_of_piter(Eoom)riter(room_list); //ADD SECURITY LATER riter.reset(); while(rite.next(r)){ if((m=r->get meeting())?。?Meeting *)NULL &amp;&amp; m->MeetingId()==meeting_id){ m->set_meeting_attrib(attrib); return(SUCCESS); } } return(-ERR_BAD_MEETING_ID);Jan 5 115612 1993Page 16 of room. Croom. C room. C} ...Listint RoomMgrAddParticipant(CARD32 requester, int meeting_id,{ int participant) Room *r; Meeting *m; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER riter.reset(); while(riter.next(r)){ if((m=r->get_meeting())?。?Meeting *)NULL &amp;&amp; m->MeetingId()==meeting_id){ return(m->add_partieipant(participant)); } }} return(-ERR_BAD_MEETING_ID);int RoomMgrDropParticipant(CARD32 requester, int meeting_id, int participant){ Room *r; Meeting *m; int err; List_of_piter(Room) riter(room_list); //ADD SECURTTY LATER riter.reset(); while(riter.next(r)){ if((m=r->get_meeting())?。?(Meeting *)NULL &amp;&amp; m->MeetingId()==meeting_id){ err=m->drop_participant(participant); if(m->num_conferees()==O){ delete m; r->meeting_destroyed(); } return(err); } return(-ERR_BAD_MEETING_ID);}int RoomMgrSuspendMeeting(CARD32 requester,int meeting_id) SuspendMeeting{ Room *r; Meeting *m; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER riter.reset(); while(riter.next(r)){ if((m=r->get_meeting())?。?Meeting *)NULL &amp;&amp; m->MeetingId()==meeting_id){ return(m->suspend_meeting()); } } return(-ERR_BAD_MEETING_ID);}int RoomMgrResumeMeeting(CARD32 requester, int meeting_id) ResumeMeeting Room *r; Meeting *m; List_of_piter(Room)riter(room_list); //ADD SECURITY LATERJan 5 115612 1993 Page 17 of room. Croom. Croom. C riter.reset();...ResumeMeeting while(riter.next(r)){ if((m=r->get_meeting())?。?Meeting *)NULL &amp;&amp; m->MeetingId()==meeting_id){ return(m->resume_meeting()); } } return(-ERR_BAD_MEETING_ID);int RoomMgrAddServer(int room_id,int server_id, Media media,String&amp; user_desc,List(int)&amp;part_list){ Room *r; List_of_piteer(Room) riter(room_list); riter.reset(); while(riter.next(r)){ if(r->RoomId()==room_id) return(r->add_server(server_id,media,user_desc,part_list)); } return(-ERR_BAD_ROOM_ID);}int RoomMgrDropServer(int room_id,int server_id,Media media, String&amp; user_desc){ Room *r; List_of_piter(Room)riter(room_list); riter.reset(); while(riter.next(r)){ if(r->RoomId()==room_id) return(r->drop_server(server_id,media,user_desc)); } return(-ERR_BAD_ROOM_ID);}int RoomMgrSuspendServer(int room_id,int server_id,Media media, String&amp; user_desc){ Room *r; List_of_piter(Room)ritet(room_list); riter.reset(); while(riter.next(r)){ if(r->RoomId()==room_id) return(r->suspend_(server_id,media,user_desc); } return(-ERR_BAD_ROOM_ID);}int RoomMgrResumeServer(int room_id,int server_id,Media media, String&amp; user_desc){ Room *r; List_of_piter(Room)riter(room_list); riter.reset(); while(riter.next(r)){ if(r->RoomId()==room_id) return(r->server(server_id, media,user_desc)); } return(-ERR_BAD_ROOM_ID);}int RoomMgrSetAccessList(int room_id,int server_id,Jan 5 115612 1993 Page 18 of room.Croom. Croom. C Media media,String&amp; user_desc,List(int)&amp; part_list)...ResmeMeeting Room *r; List_of_piter(Room)riter(room_list); riter.rest(); while(riter.next(r)){ if(r->RoomId==room_id) return(r->set_access_list(server_id,media,user_desc,part_list)); } return(-ERR_BAD_ROOM_ID);}int RoomMgrListServers(CARD32 requester,int room id, List_of_p(FullMediaDesc)&amp; media_list){ Room *r; List_of_piter(Room)rite(room_list); riter.reset(); while(riter.next(r)){ if(r->RoomId()==room_id) return(r->list_servers(media_list)); } return(-ERR_BAD_ROOM_ID);}int RoomMgrleaveMeeting(CARD32 requester,int meeting_id, List_of_p(MediaDesc)&amp; media_list){ Room *r; Meeting *m; List_of_piter(Room) riter(room_list); riter.reset(); while (riter.next(r)){ if(r->has_meeting() &amp;&amp; (m=r->get_meething()) &amp;&amp; m-->MeetingId()==meeting_id){ return(m->leave_meething(requester,media_list)); } } return(-ERR_BAD_MEETING_ID);int RoomMgrReenterMeeting(CARD32 requester,int meeting_id, List_of_p(MediaDesc)&amp; media_list){ Room *r; Meeting *m; List_of_piter(Room) riter(room_list); riter.reset(); while(riter.next(r)){ if(r->has_meeting()&amp;&amp;(m=r->get_meeting)) &amp;&amp; m->MeetingId()==meeting_id}{ return(m->reenter_meeting(requester,media_list)); } } return(-ERR_BAD_MEETING_ID);}void RoomMgrMediaServerDied(int m)MediaServerDied Room *r; List_of_piter(Room) riter(room_list}; riter.reset(); while(riter.next(r)){Jan 5 115612 1993 Page 19 of room. Croom. Croom. C r->MediaServerDied(m); ...MediaServerDicd }}int RoomMgrIsServerPresent(int room_id,int server_id) IsServerPresent{ Room *r; List_ofpiter(Room) riter(room_list); riter.reset(); while(riter.next)){ if(r->RoomId== room_id) return(r-> is_server_present(server_id)); return(O);}void RoomMgrAssociatedServersInRoom(int room_id,Lis(int)&amp; slist) List{ Room *r; List_of_piter(Room) riter(room_list); riter.reset(); while(riter.next(r)){ if(r->RoomId()==room_id) r->associated_servers(slist); }}int ParicipantInfooperator==(const ParticipantInfo&amp; p)operator{ return(participant==p.participant &amp;&amp; media_list==p.media_list);}Jan 5 115612 1993Page 20 of room.Cserver_reg. C server_reg.C#define DEBUG 1#define MAK_ARBIT_STRING 500int INET_ADDR=1;#include# includeList_of_pimplement(MediaServerInfo) List_of_pimplementList_of_pimplement(MRServerConnINfo) List_of_ptmplementMediiaServerInfoMediaServerInfo(Media pTYPe,String&amp; pUserDesc, MediaServerConn&amp; pConn,Strig&amp; pInitialiser, String&amp; pOtherInfo){ MediaType=pType;UserDesc=pUserDesc;Initializer=pInitializer; OtherInfo=pOtherInfo;Conn=pConn;}ServerRegistryServerRegistry(MRInterface *iface,String p_in_file) ServerRegistry{ char host[HOST_NAME_LEN+1]; Iface=iface; in file=p_in_file; read_file(); if (gethostname(host,HOST_NANE_LEN)<O){ cout<<″gethostname failed″<<_EILE_<<″″<<_LINE_; if(INET_ADDR) { struct hostent *hp; struct in_addr incr inct_a if ((hp=gethostbyname(bost))==NULL){ fprintf(stderr,″gethostbyname failed%s %d\n*,_FILE_,_LINE_); } else { bzero((char *)&amp;cinet_a,siseof(struct in_addr)); bcopy(hp->h_addr,(char *)&amp;inet_a (hp->h_length>4)?-4hp->h_length); strcpy(host,inet_ntoa(inet_a)); } } MyName=host; my_range();}void ServerRegistryread_file() read_file{ int num entries; ifstream data_file,(in_file,iosin); int MediaType; int ch; String UserDese,Machine,header; MediaServererConn Conn; char Initialiser[MAX_ARBIT_STRING],OtherInfo[MAX_ARBIT_STRING]; int Port,StartRange,cntl,cnt2; MediaServerInfo *pers; MRServerConnInfo *serv; if (!data_file){ cout<<″Can′t open file″<< in_file; exit(l); } //Read default name server data file>>header; if (header?。健錘ameServer″){Jan 5 115619 1993Page 1 of server_reg.Cserver_reg. Cserver_reg. Ccout >>NameServer not defined\n″; ...read_file exit(1); } data>>name_server_machine>>name_server_machine>>name_server_port; /Read MediaServerInfo data file>>num_entries; for (int i=O;i<num entries;i++){ data file >> MediaType +> +serDesc>>Conn.conn_type; switch (Conn.conn_type) ease INTERNET CONNECTION data file>>Conn.machine>>Conn.port>>entl; break; ease GENERIC_CONNECTIONdefault data file>>Conn.generic>>cntl; break; while((ch=data fiLe.get())==′′||c(diǎn)h==\t′); data file.putback(ch); data_file.getline(Initializer,cnt1+1); data_file>>cnt2; while((ch=data_file.get())==′′||c(diǎn)h==\t′); data_file.putback(ch); datafile.getline(OtherInfo,cnt2+1); pers=new MediaServerInfo)MediaType,UserDesc, Conn,String(Initializer),String(OTHERInfo));# ifdef DEBUGcout << MediaType << ″″ << UserDesc << ″ ″<< cntl.<<″″ << Initializer<<″″<< cnt2 << ″ ″<< OtherInfo <<endl; cout.fiush();# endif if (pers)MediaServerList.insert_next(pers); //Read MRServerConnInfo data_file <<num_entries; for (i=O;i< num entries;i++){ data_file>>Machine >>Port >> StartRange>>EndRange; serv=new MRServerCnnInfo(Machine,Port,StartRange,EndRange); if (serv) MRServerList.insert_next(serv); }}void ServerRegistryListALLMediaServerInfo(List_of_p(MediaServerInfo)&amp; plist) List_of_p{ plist=MediaSererList;}void ServerRegistryListAILMRServerConnInfo(List_of_(MRServerConnInfo)&amp; slist) List_of_P{ sList=MRServerList;MediaServerInfo* ServerRegistryListMediaServerInfo(Media med, String&amp; key){ MediaServerInfo *t; List_of_piter(MediaSrverInfo) mlist(MediaServerList); mlist.reset(); while(mlist.next(t)){ // cout << t->UserDesc ″<< t->UserDesc << endl;Jan 5 115619 1999Page 2 of serv_reg.Cserver_reg. C server_reg. C if(t->MediaType==med &amp;&amp; t->UserDesc==key){ ...List_of_p return(t); } // cout.flush(); return((MediaServerInfo*)NULL); } void ServerRegistmy_range() my_range { MRServerConnInfo *s; List_of_piter(MRServerConnInfo)slist(MRServerList); MyStartRange=MyEndRange=-1; slist.reset(); while(slist.next(s)){ if (s->Machine==MyName){ MyStartRange=s->StartRange; MyEndRange=s->EndRange;#ifdef DEBUG cout<< ″\nMY RANGE″ << MyStarRange<< ″″<< MyEndRange << endl;#endifint ServerRegistryserver_for_id(int id, String&amp; mach,int&amp; port) server_for _id MRServerConnInfo *s; int found=O; List_of_piter(MRServerConnInfo)slist(MRServerList); slist.reset(); while(slist.next(s)){ if (id>=s->StartRange &amp;&amp; id<=s->EndRange) { port=s->Port; mach=s->Machne; found=1; break; }# ifdef DEBUG#endif//cout << ″Server_for_id″<<mach<< ″″<< port<<endf; return(found);}void ServerRegistydefault_name_server(String&amp; mach,int&amp; port)default_name_server{ mach=name_server_machine; port=name_server_port;}Jan 5 115619 1993Page 3 of server_reg. Cname StdinSpooldate Thu Jan 14 095247owner rapport (Sid Ahuja2, 4f601, x 5569at (O O cc)window (O O O)imagesize ( O O)imagaspace (O O O O)jobheader onjamresistance onlanguage impressSystem Version TURBO UltraScript 6.OT Rev. A IP/II,Serial #911217Page images processed 82Pages printed 82Paper size (width,height) 256O, 3328Document length 249729 bytes]]></pre>
附錄3
<pre listing-type="program-listing"><![CDATA[};class IR_DropParticipantpublic TncomingReply{public IR_DropParticipant(CARD8 msg_typ,CARD8 msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){}};class IR_ListRoomspublic IncomingReply{public IR_ListRooms(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingReply(msg_typ,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IR_ListMeetingspublic IncomingReply{public IR_ListMeetings(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} void action();};class IR_ListServerspublic IncomingReply{public IR_ListServers(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection*invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} void action ();}; class IR_LeaveMeetingpublic IncomingReply{public IR_LeaveMeetintg(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char * msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){}};class IR_ReenterMeetingpublic IncomingReply{public IR_ReenterMeeting(CARD8 msg_try,CARD8 msg_code,int msg_seq_no, int msg_len,char * msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {}};class IR_SuspendMeetingpublic IncomingReply{publicIR_SuspentMeeting(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len, char *msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){}};class IR_ResumMeetingpublic IncomingReply{public IR_ResumeMeeting(CARD8msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no,};msg_len,msg_data,invoker){} class IR_GetPersonInfopublic IncomingReply{ public IR_GetPersonInfo(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(); }; class IR_ShowMeetingStatuspublic IncomingReply{ public IR_ShowMeetingStatus(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len, char *msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} void action(););class IR_ShowMeetRoomStatuspublic IncomingReply{public IR_showMeetRoomStatus(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(); };class IR_VIMeetingInvitationpublic IncomingReply{public IR_VIMeetingInvitation(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingReply(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action ();};/////////////////// EVENTS from VIclass IE_EveCreateMeetingpublic IncomingEvent{public IE_EveCreateMeeting(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(););class IE_EveCreataPersistentMeetingpublic IncomingEvent{public IE_EveCreatePersistentMeeting(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len, char *msg_data, Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVICreateMeetInERoompublic IncomingEvent{public IE_EveVICreateMeetInERoom(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVIAddparticipantpublic IncomingEvent{public IE_EveVIAddParticipant(CARD8 msg_typ,msg_8 msg_code,int msg_seq_no, int msg_len,char msg_data,Connection*invoker) IncomingtEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVIDropParticipantpublic IncomingEvent{public IE_EveVIDropParticipant(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char * msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVISuspendMeetingpublic IncomingEvent{public IE_EveVISuspendMeeting(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(););class IE_EveVIResumeMeetinggpublic IncomingEvent{public IE_EveVIResumMeeting(CARD8 msg_typ,CARD8_msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_no, msg_len,msg_data,invoker){} void action();};class IE_EveVIReenterMeetingpublic IncomingEvent{public IE_EveVIReenterMeeting(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVILeaveMeetingpublic IncomingEvent{public IE_EveVILeaveMeeting(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(); };class IE EveVIAddServerpublic IncomingEvent{ public IE_EveVIAddserver(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(); };class IE_EveVIDropServerpublic IncomingEvent{publicIE_EveVIDropServer(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();}; class IE_EveVIDestroyMeetingpublic IncomingEvent{ public IE_EveViDestroyMeeting(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVIListRoomspublic IncomingEvent{public IE_EveVIListRooms(CARD8 msg_typ,CARD8 msg_code, int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent{msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVIListMeetingspublic IncomingEvent{public IE_EveVIListMeetings(CARD8 msg_typ,CARD8 msg_code, int msg_seq_no, int msg_len, char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} void action(););class IE_EveVIShowMeetingStatuspublic IncomingEvent{public IE_EveVIShowMeetingStatus(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_oode,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVIShowMeetRoomStatuspublic IncomingEvent{public IE_EveVIShowMeetRocmStatus(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVIJoinMeetingpublic IncomingEvent{public IE_EveVIJoinMeeting(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVIJoinMeetingRejectedpublic IncomingEvent{public IE_EveVIJoinMeetingRejected(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_iyb,msg_code,msg_seq_no,msg_len,msg_data,invoker){} void action(); }; class IE_EveVIJoinMeetingAcceptedpublic IncomingEvent{ public IE_EveVTJoinMeetingAccepted(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(){} };class IE_EveVIGetPersonNamepublic IncomingEvent{public IE_EveVIGetPersonName(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data, Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(){}};class IE_EveVIGetPersonImagepublic IncomingEvent{public IE_EveVIGetPersonImage(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(){}};class IE_EveVIGetPersonIdpublic IncomingEvent{public IE_EveVIGetPersonId(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msq_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(){}};class IE_EveVIUppublic IncomingEvent{public IE_EveVIUp(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(){}};class IE_EveVIDownpublic IncomingEvent{public IE_EveVIDown(CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data, Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action();};class IE_EveVIShowAssocRoompublic IncomingEvent{public IE_EveVIShowAssocRoom(CARD8 msg_typ,CARD8 msq_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker) IncomingEvent(msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} void action(){}};]]></pre>
<pre listing-type="program-listing"><![CDATA[class Connection {public Connection (Controller *ctrl, MmConnection pconn, ConnectionObjectTypes otype); -Connection(); MmConnection connection(){return(conn);} int send(char *data, int len}; iht send(message *msg); Controller *Control(){return(Ctrl);} int is_alive()(return(alive);} RoomFsmMgr *RoomManager(){return (Ctrl->RoomManager());} void deactivate_self()(client_dead();} void serviced_msg(Message *msg){delete msg;} virtual void process_msg()=0; ConnectionObjectTypes object_type(){return obj_type;}protected void client_process_msg(); void client_dead(); int alive; ConnectionOb jectTypes obj_type; Controller *Ctrl; char header[MSG_HEADER_LEN]; static iht header_len; Block (char) buf; MmConnection conn;};enum LocalMediastate{e_LM_INACTIVE,e_LM_ACTIVE};class LocalMediapublic Connection {public LocalMedia (Controller *ctrl, MmConnection pcli) Connection(ctrl, pcli, e_LM) media_state = e_LM_ACTIVE; } void process_msg () {client_process_msg();} Media get_media ()(return m;} String get_udesc(){return udesc;} int is_match(Media p_m,String&amp; p_udesc) { int tmp=(udesc==p_udesc)?1∶0; return((tmp &amp;&amp; (m==p_m))?1∶0); } int is_match (Media p_m) return((m==p_m)?1∶0); } void update(Media p_med,string&amp; p_udesc) { m=p_med;p_udesc=udesc; } LocalMediaState state(){return media_state;} void set active(){media_state=e_LM_ACTIVE;} void set_inactive(){media_state=e_LM_INACTIVE; private Media m; String udesc; LocalMediaState media_state;};class MRServerpublic Connection { public MRServer(Controller *ctrl,MmConnection pCli) Connection(ctrl,pCli,e_MR){} void process_msg(-) {client_process_msg();} }; class VisualInyerfacepublic Connection{ public VisualInterface(Controller*ctrl,MmConnection pCli) Connection(ctrl,pCli,e_VI) {} void ptocess_msg(){clien_process_msg();} }; class EventNotifierpublic Connection{public EventMotifier(Controller *ctrl,MmConnection pCli) Connection(ctrl,pCli,e_EN){} void process_msg(){client_process_msg();} };#endif#ifndef_CONTROLLER_H_#define_CONTROLLER_H_1#include<proto.h>#include <msg.h>#include<ports.h>void CM_shutdown();class Controller{public Controller() {}; -Controller(); // Parse cmd line arguments,create other objects in the system virtual void startup(int argc,char *aefv[]); // an infinite loop with a select statement (default polling on four //ports. When a message arrives in one of these ports, //the corresponding objects manager′s processing method is invoked. virtual void main_loop(); // Starts four listeng ports-one for the VI and three for the // local media managers virtual void listen(); // Sets the listening port for the MRServer. To be effective, this method //should be invoked before listen()is invoked. void set.VI_port(int port){VI_port=port;} //Sets the listening port for the local media managers. To be effective, //this method should be invoked before listeh() is invoked. void set_LocalMediaPort(int port){LM_port=port;) //Returns the listening port where the VI connects int VIPort(){return VI_port;} // Returns the listening port where the local media managers connect int LocaLmediaPort(){return LM_port;} // Handle for the RoomMnager object RoomF smMgr *RoomManager() {return(RMgr);}string MyName(){return my_name;) int MyId(){return my_id;} //Handle for the protocol object Protocol *Proto(){return(prot);) //Handle for the Convert object(which is used for network to host //conversion and vice versa. Convert *Conv(){ return(ConvMethods);} MRServerManager* MRMgr(){return_MRMgr;} EventNotifierManager* ENMgr(){return_ENMgr;} LocaLMediaManger* LMMg(){return_LMMgr;} VisualInterfacaManger* VIMgr(){return_VIMgr;}protected Protocol *Prot; Convert*ConvMethods; RoomF smMgr*Rmgr; MRServerManager *_MRMgr; EventNotifierManager *_ENMgr; LocalmediaManager * LMMgr; VisualInterfaceManager *_VIMgr; String MR_machine; String EN_machine; int MR_port; int EN_port; int VI_port; int LM_port; int my_id; String my_name;};#endif#ifndef_GENERATOR_H#define _GENERATOR_H 1#include<msg. h>#include<cm_msg.h>/* prototypes of the functions which create message objects*/IncomingMessage *default_generator(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_ErrMsg(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_CreateRoom(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_DestroyRoom(CARD8,CARD8,CARD2,CARD32,char *,Connection *);IncomingMessage *Gen_IR_CreataMeeting(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_DestroyMeeting(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_AddServer(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_Dropserver(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_AddParticipant(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_DropParticipant(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_ListRooms(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_ListMeetings(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_ListServers(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_LeaveMeeting(CARD8,CARD8,CARD32,CARD32,char *,Connection *);IncomingMessage *Gen_IR_ReenteMeeting(CARD8,CARD8,CARD32,CARD32,char *,Connection *)IncomingMessage *Gen_IR_SuspendMeeting(CARD8,CARD8,CARD32,CARD32,char *, Connection *);IncomingMessage *Gen_IR_ResumeMeeting(CARD8,CARD8,CARD32,CARD32,char *,Connection *);Inc=ingaeaaage *Gen_IR_GetpersonInfp(CARD8, CARD8, CARD32, CARD32,char*, Connection*);InccmingMessage*Gen_IR_ShowMeetingStatus(CARD8,CARD8,CARD32,CARD32,char*,Connection *)InccmingMessage*Gen_IR_ShowMeetRoomstatus(CARD8,CARD8,CARD32,CARD32,char*,Connection ,InccmingMessage*Gen_IR_VIMeetingInvitation(CARD8,CARD8,CARD32,CARD32,char*,ConnectionInccmingMessage*Gen_IE_EveCreateMeeting(CARD8,CARD8,CARD32,CARD32,char*,Connection *),InccmingMessage*Gen_IE_EveCreateperaiatentMeeting(CARD8,CARD8,CARD32,CARD32, char *,ConnInccmingMessage*Gen_IE_EveVICreateMeetINERoom(CARD8,CARD8,CARD32,CARD32,char*,Connect;InccmingMessage*Gen_IE_EveVIShowMeetroomStatys(CARD8,CARD8,CARD32,CARD32,char*, ConnectInccmingMessage*Gen_IE_EveVIShowMeetingStatus(CARD8,CARD8,CARD32,CARD32,char*, ConnectInccmingMessage*Gen_IE_EveVIJoinMeeting(CARD8,CARD8,CARD32,CARD32,char*, Connection *),InccmingMessage*Gen_IE_EveVIAddParticipant(CARD8,CARD8,CARD32,CARD32,char*,Connection.InccmingMessage*Gen_IE_EveVIDropParticipant(CARD8,CARD8,CARD32,CARD32,char*,ConnectioInccmingMessage*Gen_IE_EveVISuspancMeeting(CARD,CARD8,CARD32,CARD32,char*, ConnectionInccmingMessage*Gen_IE_EveVIResusaMeeting(CARD8,CARD8,CARD2,CARD32,char*,Connection InccmingMessage*Gen_IE_EveVIReentermeating(CARD8,CARD8,CARD32,CARD32,char*, Connection*)InccmingMessage*Gen_IE_EveVILeavaMeeting(CARD8,CARD8,CARD32,CARD32,char*, Connection *)InccmingMessage*Gen_IE_EveVIAddSarver(CARD8,CARD8,CARD32,CARD32,char*, Connection *);InccmingMessage*Gen_IE_EveVIDropSarver(CARD8,CARD8,CARD32,CARD32,char*, Connection *);InccmingMessage*Gen_IE_EveVIDestroyRoom(CARD8,CARD8,CARD32,CARD32,char*,Connection *),InccmingMessage*Gen_IE_EveVIDeSstroyHeeting(CARD8,CARD8,CARD32,CARD32,char*,ConnectionInccmingMessage*Gen_IE_EveVIListRooms(CARD8,CARD8,CARD32,CARD32,char*, Connection *);InccmingMessage*Gen_IE_EveVIListHeetings(CARD8,CARD8,CARD32,CARD32,char*,Connection *)InccmingMessage*Gen_IE_EveVIGetPersonName(CARD8,CARD8,CARD32,CARD32,char*,Connection InccmingMessage*Gen_IE_EveVIGetPersonImage(CARD8,CARD8,CARD32,CARD32,char*,Connection*)InccmingMessage*Gen_IE_EveVIGetPersonId(CARD8,CARD8,CARD32,CARD32,char*,Connection *),InccmingMessage*Gen_IE_EveVIOP(CARD8,CARD8,CARD32,CARD32,char*,Connection *);InccmingMessage*Gen_IE_EveVIDown(CARD8,CARD8,CARD32,CARD32,char*,Connection *);InccmingMessage*Gen_IE_EveVIShowAssocroom(CARD8,CARD8,CARD32,CARD32,char*,Connection,InccmingMessage*Gen_IE_EveVIJoinMeetingAccapted(CARD8,CARD8,CARD32,CARD32,char*,Conne(InccmingMessage*Gen_IE_EveVIJoinMeetingRejected(CARD8,CARD8,CARD2,CARD32,char*,ConneInccmingMessage*Gen_IE_EveMeetingInvite(CARD8,CARD8,CARD32,CARD32,char*,Connection *),InccmingMessage*Gen_IE_EveAcceptInvitation(CARD8,CARD8,CARD32,CARD32,char*, ConnectionInccmingMessage*Gen_IE_EversjactInvitation(CARD8,CARD8,CARD32,CARD32,char*,ConnectionInccmingMessage*Gen_IE_EveServerAddsd(CARD8,CARD8,CARD32,CARD32,char*, Connectionn *);InccmingMessage*Gen_IE_EveServerDroppde(CARD8,CARD8,CARD32,CARD32,char*,Connection *),InccmingMessage*Gen_IE_EveJoinMeeting(CARD8,CARD8,CARD32,CARD32,char*,Connection *);InccmingMessage*Gen_IE_EveJoinMeetingrejected(CARD8,CARD8,CARD32,CARD32,char*,ConnectInccmingMessage*Gen_IE_EveRoomDestroyed(CARD8,CARD8,CARD32,CARD32,char*,Connection *),InccmingMessage*Gen_IE_EveMeetingDestroyed(CARD8,CARD8,CARD32,CARD32,char*,Connection*)InccmingMessage*Gen_IE_EveAddedparticipant(CARD8,CARD8,CARD32,CARD32,char*,ConnectionInccmingMessage*Gen_IE_EveDroppedparticipant(CARD8,CARD8,CARD32, CARD32,char*,ConnecoInccmingMessage*Gen_IE_EveRoomLocked(CARD8,CARD8,CARD32,CARD32,char*,Connection*);InccmingMessage*Gen_IE_EveRoomUnlocked{CARD8,CARD8,CARD32,CARD32,char*,Connection*);InccmingMessage*Gen_IE_EveleftMeeting(CARD8,CARD8,CARD32,CARD32,char*,Connection *);InccmingMessage*Gen_IE_EveReentarmeeting(CARD8,CARD8,CARD2,CARD32,char*,Connection *;InccmingMessage*Gen_IE_EveMeetingSuspended(CARD8,CARD8,CARD32,CARD32,char*,ConnectionIncomingMessage*Gen_IE_EvemeetingResumed(CARD8,CARD8,CARD32,CARD32,char*,Connection *)IncomingMessage*Gen_IE_EvelMStatachange(CARD8,CARD8,CARD32,CARD32,char*,Connection*),IncomingMessage*Gen_IE_EveLMOp(CARD8,CARD8,CARD32,CARD32,char*,Connection*);#endif#ifndef _Ioc_H_#define _IOC_H_#define MEDIA_UNSETO#define MEDIA_SET1#include<systam_proto.h>#include<FE_types. h>#include<String.h>#include<List. h>struct MediaBrdgeDeac{ Median; string udesc; string machina; int port; int req-doee; int active; /* int operator-(cinat madiaBridgedesc &amp; p) ( return(m - p.m&amp;&amp; udeac=p.udeac); } */ ); List_of_pdaclare(ModiaBridgedesc) class mediBridgadescList { public mediaBridgedescList(); -MediaBridgeDEscList(); //copy constructor mediaBridgedescList(const mediaBridgeDescList &amp; rhs); //assign constructor mediaSridgeDescList&amp; operator-(const MediaBridgadascList &amp; rhs); int langth(){return.(list.longth());} int num_yet_to_aorvice(){yet_to_service);} int nert_bridge_to_service(mediaSridgeDe sc*6 bridge); void add(media m,string&amp; user_desc); void add(mediaSridgeDesc&amp; med); void remove(media m); void update(media m,string&amp;machina, int port,int is_active=O); void update_prav_request(string&amp; machina, int port,int is_active); void updste_applicable_media(medisBridgeDescList&amp; mdesc); int is_present (MediaBriDGEdesc*b); List_of_P(MadiaBridgeDesc)&amp;media_list(){return list;} mediaBridgeDesc* Lastmedia(){return last_msdia;)private mediaBridgeDasc* node_presant(medi&amp;BridgeDesc*node); void assign_or_copy(const mediaBridgeDescList&amp; rhs); list_of_p (mediaBridgeDesc)list; mediaBridgeDesc*last_media; //media spacified in the last MR_ADD_SERVER msg int yet_to_service;};class PartMsdiaBridgeDescList(public PartMediaBridgeDescList(int p, MediaBridgeDascList&amp; pasd) {participant=p;med=pesd;} int participant(){return participant;} MediaBridgeDescList&amp; MediaList(){return med;}private int participant; MediaBridgeDescList med;};List_of_Pdsclare(partMsdiaBridgeDescList)struct InterObjectBuffer{ CARD8 msg_type;struct sl{ CARD32 psaudo_id; CARD32 participant; string room_name; CARD32 attrib; MediaBridgeDescList med;}eve_creats_saeting;struct s2 { CARD32 room_id; madiaBridgeDescLIST med;} eve_accept_invitation;struct s3( CARD32 pseudo_id; CARD32 real id; CARD32 participant;) eve_create_meating_in_erocm;struct s4{ CARD32room_id;} Rap_mr_create_room;struct s5{ CARD32 meeting_id;} Rap_mr_create_meeting;struct s6{ String machine; int port;) Rap_mr_add_server;struct 37{ String machine; int port;} Rap_rsg_get_person_info;struct s8{ CARD32 pseudo_id;} etsrl;struct sg{ CARD32 err_code;}err;struct s11{ CARD32 participant; String part_name; CARD32 room_id; CARD32 meeting_id; mediasridgeDescList med; List_of_p(partMsdiaBridgeDescList) part_med;)eve_meeting_invite;struct s12{ CARD32 vi_room_id; mediaBridgeDascList med} Rep_vi_meeting_invitation;// Note that right now the VI send the reject also as a REP instead//of an ERR-change VIstruct sl3{ CARD32room_id; CARD32 meeting_id;]]></pre>
<pre listing-type="program-listing"><![CDATA[ murHeading cm_msg.hDate Tue Jan26 180354 EST1993Job-Id z-581Printer lwt2]]></pre>
<pre listing-type="program-listing"><![CDATA[void IR_Addserver∷action(){ pos++;//ignore first field if(Conv—>BufToStrinq(data+pos,res_len,nbytes, iob.Rep_mr_add_server.machine)<0){ return; } pos+=nbytes; (void)Conv—>BufToCARD32(data+pos,res_len,nbytes, iob.Rep_mr_add_server.port); pos+=nbytes;]]></pre>
<pre listing-type="program-listing"><![CDATA[ fire(iob);}RoomFsm∷-RoomFsm(){ if(meeting)delete meeting;}void RoomFsm∷next_msg_prepare(){ last_seq=RMgr—>Next SeqNo();}int RoomFsm∷fire(InterobjectBufferk iob){ int input=TO;]]></pre>
<pre listing-type="program-listing"><![CDATA[ break; default break; } break;case EVENT_CM switch(iob.msg code){ case EVE_MEETING_INVITE input=T4; break; case EVE_DROPPED_PARTICIPANT Self=(RMgr—>MySelf()==iob.tamplatel.participant)?10; input=(Self)?T11T43; break; case EVE_JOIN_MEETING input=T62; break; case EVE_JOIN_MEETING_REJECTED input=T64; break; case EVE_ACCEPT_INVITATION input=T13; break; case EVE_PEJECT_INVITATION input=T26; break; case EVE_MEETING_SUSPENDED input=T17; break; case EVE_MEETING_RESUMED input=T31; break; case EVE_ADDED_PARTICIPANT Self=(RMgr—>MySelf()=iob.eve_added_participant.participant); input=(Self)?T20T42; break; case EVE_LEFT_MEETING input=T44; break; case EVE_REENTER_MEETING input=T45; break; case EVE_SERVER_ADDED input=T46; break; case EVE_SERVER_DROPPED input=T47; break; case EVE_MEETING_DESTROYED input=T49; break;]]></pre>
<pre listing-type="program-listing"><![CDATA[ input=(iob.msg_type==REPLY_MR_SERVER)?T16T15; break; case MR_REENTER_MEETING input=(iob.msg_type==REPLY_MR_SERVER)?T29T30; break; case MR_RESUME_MEETING input=(iob.msg type==REPLY_MR_SERVER)?T32T33; break; default break; } break;case REPLY_REGISTRY_SERVER;case ERROR_REGISTRY_SERVER; switch(iob.msg_code){ case REG_GET_PERSON_INFO; input=(iob.msg_type==REPLY_REGISTRY_SERVER)?T40T41; break; default break; } break;case REPLY_VIcase ERROR_VI switch(iob.msg_code){ case VI_MEETING_INVITATION; input=(iob.msg_type=REPLY_VI)?T19T21; break; default break; } break;case TIMEOUT switch(iob.msg_code){ case TIMEOUT input=T48; break; default break; } break;default break;}return(fire(input,iob));}int RoomFsm∷fire(unsigned input,InterobjectBufferk iob){ int ret;#ifdef DEBUG cout<<“FSM_INPUT”<< input<<“Current State“<<current_state<<”New St#endif]]></pre>
權(quán)利要求
1.一種多媒體通信網(wǎng)絡(luò),其特征在于,包括多個(gè)多媒體端口,每個(gè)端口用于將網(wǎng)絡(luò)連至一個(gè)用戶終端;至少一個(gè)會(huì)議室服務(wù)器,它連至多媒體端口,用以響應(yīng)于來自任何一個(gè)用戶終端的指令,在網(wǎng)絡(luò)中建立一個(gè)代表可控持續(xù)虛擬會(huì)議室的一種電子電路結(jié)構(gòu);以及對(duì)會(huì)議室服務(wù)器作出響應(yīng),用以在多個(gè)端口的一些經(jīng)選擇的端口之間,在一種或數(shù)據(jù)經(jīng)選擇的媒體內(nèi)實(shí)行連接的裝置。
2.如權(quán)利要求1所述的多媒體網(wǎng)絡(luò),其特征在于,實(shí)行連接的裝置包括多個(gè)電子設(shè)備,用于在兩個(gè)或多個(gè)用戶之間用第一種媒體舉行會(huì)議。
3.如權(quán)利要求2所述的多媒體網(wǎng)絡(luò),其特征在于,實(shí)行連接的裝置包括多個(gè)電子設(shè)備,用于在兩個(gè)或多個(gè)用戶之間用第二種媒體舉行會(huì)議。
4.如權(quán)利要求3所述的多媒體網(wǎng)絡(luò),其特征在于,實(shí)行連接的裝置包括多個(gè)電子設(shè)備,用于在兩個(gè)或多個(gè)用戶之間用第三種媒體舉行會(huì)議。
5.如權(quán)利要求4所述的多媒體網(wǎng)絡(luò),其特征在于,第一種媒體是聲頻媒體。
6.如權(quán)利要求4所述的多媒體網(wǎng)絡(luò),其特征在于,第二種媒體是視頻媒體。
7.如權(quán)利要求4所述的多媒體網(wǎng)絡(luò),其特征在于,第三種媒體是數(shù)據(jù)媒體。
8.如權(quán)利要求4所述的多媒體網(wǎng)絡(luò),其特征在于,用第一種媒體舉行會(huì)議的多個(gè)電子設(shè)備包括多個(gè)聲頻服務(wù)器。
9.如權(quán)利要求4所述的多媒體網(wǎng)絡(luò),其特征在于,用第二種媒體舉行會(huì)議的多個(gè)電子設(shè)備包括多個(gè)視頻服務(wù)器。
10.如權(quán)利要求4所述的多媒體網(wǎng)絡(luò),其特征在于,用第三種媒體中舉行會(huì)議的多個(gè)電子設(shè)備包括多個(gè)數(shù)據(jù)服務(wù)器。
11.如權(quán)利要求10所述的多媒體網(wǎng)絡(luò),其特征在于,數(shù)據(jù)服務(wù)器包括窗口橋路。
12.如權(quán)利要求4所述的多媒體網(wǎng)絡(luò),其特征在于進(jìn)一步包括一種裝置,用于把經(jīng)選擇的一些電子設(shè)備與代表由會(huì)議室服務(wù)器產(chǎn)生的虛擬會(huì)議室的電路結(jié)構(gòu)相關(guān)聯(lián)。
13.如權(quán)利要求12所述的多媒體網(wǎng)絡(luò),其特征在于進(jìn)一步包括一種裝置,用于建立代表經(jīng)選擇的用戶與虛擬會(huì)議室之間的關(guān)聯(lián)的電子電路會(huì)議結(jié)構(gòu)。
14.如權(quán)利要求13所述的多媒體網(wǎng)絡(luò),其特征在于進(jìn)一步包括姓名服務(wù)器,它含有代表多媒體網(wǎng)絡(luò)多個(gè)可能用戶的電子電路結(jié)構(gòu);以及用于在經(jīng)選擇的用戶與正響應(yīng)于姓名服務(wù)器的虛擬會(huì)議室建立關(guān)聯(lián)的裝置。
15.如權(quán)利要求1所述的多媒體網(wǎng)絡(luò),其特征在于,多種多媒體中的每一種包括會(huì)話管理器輸入,它分別對(duì)來自各用戶終端內(nèi)會(huì)話管理器的指令作出響應(yīng);數(shù)據(jù)管理器輸入,它分別對(duì)各用戶終端內(nèi)的數(shù)據(jù)管理器作出響應(yīng);視頻管理器輸入,它分別對(duì)各用戶終端內(nèi)的視頻管理器作出響應(yīng);以及聲頻管理器輸入,它分別對(duì)各用戶終端內(nèi)的聲頻管理器作出響應(yīng)。
16.如權(quán)利要求1所述的多媒體網(wǎng)絡(luò),其特征在于,會(huì)議室服務(wù)器包括輸入/輸出端口,用于與多媒體網(wǎng)絡(luò)中的另外的會(huì)話管理器進(jìn)行通信。
17.一種與多媒體通信網(wǎng)絡(luò)相連的用戶終端,其特征在于,包括用戶接口;會(huì)話管理器,它與用戶接口相連,用于與通信網(wǎng)絡(luò)中的會(huì)話管理器相連;數(shù)據(jù)管理器,用于把會(huì)話管理器與網(wǎng)絡(luò)中的數(shù)據(jù)服務(wù)器相連;視頻管理器,用于把會(huì)話管理器與網(wǎng)絡(luò)中的視頻服務(wù)器相連;以及聲頻管理器,用于把會(huì)話管理器與網(wǎng)絡(luò)中的聲頻服務(wù)器相連。
全文摘要
一種多媒體網(wǎng)絡(luò)中代表虛似會(huì)議室的電路結(jié)構(gòu),可模擬真實(shí)會(huì)議室,便于在分開的與會(huì)者之間召開靈活且長時(shí)間的多媒體會(huì)議。與會(huì)者可通過聲音、圖像和數(shù)據(jù)中的一種或數(shù)種相互通信。由用戶控制虛擬會(huì)議室存在于網(wǎng)絡(luò)中的時(shí)間長短,而且其存在與用戶是否連接會(huì)議室無關(guān)。會(huì)議室是一種媒介,可協(xié)調(diào)各種媒體服務(wù)器的活動(dòng),以用多于一種媒體在與會(huì)者之間舉行會(huì)議。服務(wù)器與存儲(chǔ)裝置相關(guān)聯(lián),后者可存儲(chǔ)虛擬會(huì)議室舉行多媒體會(huì)議的某些方面。
文檔編號(hào)H04M3/42GK1121758SQ94191862
公開日1996年5月1日 申請(qǐng)日期1994年4月15日 優(yōu)先權(quán)日1993年4月22日
發(fā)明者蘇迪爾·拉曼·阿胡賈, 穆拉利·阿拉范穆丹, 詹姆斯·羅伯特·恩索爾 申請(qǐng)人:At&T有限公司