国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      多媒體通信網(wǎng)絡(luò)的制作方法

      文檔序號(hào):7565003閱讀:492來源:國知局
      專利名稱:多媒體通信網(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&amp;T長途通信網(wǎng)絡(luò)包含了一些聲頻和視頻橋接能力,諸如包含在AT&amp;T聯(lián)合電話會(huì)議業(yè)務(wù)(Alliance TeleconferencingServices)和AT&amp;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ì)議室)&amp;&amp;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;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;amp; type,CARD8&amp;amp; opcdoe,   CARD32&amp;amp; seq CARD32&amp;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;amp; med_list);   void resume media(kMediaDesc med);    void resume media(List_of_p(MediaDesc)&amp;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;amp; info);    void get_meeting_partcipants(List(int)&amp;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;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;amp; media_list);   int reenter_meeting(int participant,   List_of_p(MediaDesc)&amp;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;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;amp; user_desc,   List(int)&amp;amp; part_list);   int drop server(int server_id,Medis medis,String&amp;amp; user_desc);   int suspend_server(int server_id,Medlia medis,String&amp;amp; user_desc);   int resume_server(int server_id,Medis media,String&amp;amp; user_dese);   int set_access_list(int server_id,Medis media,String&amp;amp; user_dese,   List(int)&amp;amp; part list);   int list servers(List_of_p(FullMediaDesc)&amp;amp; media_list);   int is_server_present(int server_id);   void associated_servers(List(int)&amp;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;amp; slist);   int ActiveRoom(){return(active_room->Roomld());   }   iht CreateRoom(CARD32 owner, RoomAttrib attrib,String&amp;amp; rname);   int DestroyRoom(CARD32 requester,int id);   int ListRooms(CARD32 requester, List(int)&amp;amp; rlist,  List(String)&amp;amp; name_list);   int ShowRoomStatus(CARD32 requester,int room_id,  RoomStatus&amp;amp; stat, RoomLockStatus&amp;amp; lock_stat);   int ShowRoomAttributes(CARD32 requester,int room_id,RoomAttrib&amp;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;amp; rlist);   int ShowMeetingStatus(CARD32 requester,int meeting_id,  List(ParticipantInfo)&amp;amp; info, int&amp;amp; p_room_id,    int&amp;amp; owner, MeetingStatus&amp;amp; status);   int ShowMeetRoomstatus(CARD32 requester,int room_id,  List(ParticipantInfo)&amp;amp; info, int&amp;amp; p_meeting_id,   int&amp;amp; owner,MeetingStatus&amp;amp; status);   int ListMeetingParticipants(int meeting_id,List(int)&amp;amp; plist);   int ShowMeetingAttributes(CARD32 requester,int meeting_id,  MeetingAttrib&amp;amp; attrib);   int AlterMeetingAttributes(CARD32 requester,int meeting_id,   MeetingAttrib attrib);   int ShowAssociatedRoom(CARD32 requester, int meeting_id,  int&amp;amp; room_id);   int ShowAssociatedMeeting(CARD32 requester,int room_id,  int&amp;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;amp; user_desc,List(int)&amp;amp; part list);   int DropServer(int room_idt server_id,Mediamedia, String&amp;amp; user_desc);    int SuspendServe(int room_id, int server-id, Media medm, Strm ~&amp;amp; user_desc);   int ResumeServer(int room-id,int server_id,Media media,String&amp;amp; user_desc);   int SetAccessList(int room_id, intt serverid, Media media,   String&amp;amp; user desc, List(int)&amp;amp; part list);   Lat ListServers(CARD32 requester, inst room_id,   List of_p(FullMediaDesc)&amp;amp; media_list);   int LeaveMeeting(CARD32 requester,int meeting_id,    List of_p(MediaDesc)&amp;amp; media_list);   int ReenterMeeting(CARD32 requester,int meeting_id,    List_of_p(MediaDesc)&amp;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;amp; pUserDesc,  MediaServerConn&amp;amp; pConn, String&amp;amp; pInitializer,  String&amp;amp; pOtherInfo);   Media MediaType;   String UserDesc;   String Initializer;   String OtherInfo;   MediaServerConn Conn;};atruet MRServerConnInfo {   MRServerConnInfo(String&amp;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;amp; plist);   void ListAllMRServerConnInfo(List_of_p(MRServerConnInfo)&amp;amp; slist);   MediaServerInfo* ListMediaServerInfo(Media med, String&amp;amp; key);   int in_my_range(int id){return((id>=MyStartRange &amp;amp;&amp;amp;  id <=MyEndRange)?1∶O);}   int server_for_id(int id,String&amp;amp; mach, int&amp;amp; port);   void default_name server(String&amp;amp; mach,int&amp;amp; port);   void my_range(Range&amp;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;&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;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;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;amp; server_list,   int src,int room_id,int meeting_id,List(int)&amp;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;amp; server_list,int src,    int room_id,int meeting_id,Media med,String&amp;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;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;amp; sever_list,int src,   int room_id,int meeting_id,Media med,String&amp;amp; user_desc,   List(int)&amp;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;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;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;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;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;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;&amp;amp; m->mgs_seq_no()==stimulant()){  if(type==ERROR_GEN_SERVER &amp;amp;&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;&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;&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;amp; user_desc,List(int)&amp;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;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;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;amp; user desc,  List(int)&amp;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;amp; user_desc,   Media ServerConn&amp;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;&amp;amp; dummy)   return(med->get_server_connection(conn));   }   return(-1);int MediaServerMgrget_manager connection(Media m, String&amp;amp; user desc,   MediaServerC onn&amp;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;&amp;amp; dummy)   return(med->get_manager_connection(conn));   }   return(-1);void MediaServerMgrset_manager_port(Media m,String&amp;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;&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;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;&amp;amp; dummy)   return(med->ServerId());   } return(-1);}int MediaServerMgrget_server_info(int server,Media&amp;amp; m,{ String&amp;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;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;amp; plist,  Media pmedia, String&amp;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;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;&amp;amp;(err=RMgr->AddServer   (room,server_id,media,user_desc,part_list))>=O &amp;amp;&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;&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;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;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;&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;&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;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;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;&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;&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;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;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;&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;&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;amp; plist,   Media pmedia,String&amp;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;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;&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;&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;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;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;amp; user_desc,List(int)&amp;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;amp; type,   CARD8&amp;amp; opcode,CARD32&amp;amp; seq,CARD32&amp;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;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;amp; user_desc,   List(int)&amp;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;amp; user_desc,   List(int)&amp;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;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;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;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;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;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;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;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;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;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;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;&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;&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;&amp;amp; m->user_desc==med.user_desc){   m->status=e_SERV_SUSPENDED;   return;   }   }}void Confereesuspend_mmedia(List_of_p(MediaDesc)&amp;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;&amp;amp;   m->user_desc==mdesc->user_desc){   m->status=e_SERV_SUSPENDED;   }   }}void Confereeresume_media(List_of_p(MediaDesc)&amp;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;&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;&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;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;amp; rlist,  List(String)&amp;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;amp; stat, RoomLockStatus&amp;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;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;&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;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;amp; info,int&amp;amp; p_room_id,   int&amp;amp; owner,MeetingStatus&amp;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;&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;amp; info, int&amp;amp; p_meeting_id,    int&amp;amp; owner,MeetingStatus&amp;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;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;&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;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;&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;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;&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;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;&amp;amp; (m=r->get_meeting()) &amp;amp;&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;&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;&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;&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;&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;&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;amp; user_desc,List(int)&amp;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;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;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;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;amp; user_desc,List(int)&amp;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;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;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;&amp;amp; (m=r->get_meething()) &amp;amp;&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;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;&amp;amp;(m=r->get_meeting)) &amp;amp;&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;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;amp; p)operator{   return(participant==p.participant &amp;amp;&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;amp; pUserDesc,  MediaServerConn&amp;amp; pConn,Strig&amp;amp; pInitialiser,  String&amp;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;amp;cinet_a,siseof(struct in_addr));  bcopy(hp->h_addr,(char *)&amp;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;amp; plist) List_of_p{   plist=MediaSererList;}void ServerRegistryListAILMRServerConnInfo(List_of_(MRServerConnInfo)&amp;amp; slist) List_of_P{   sList=MRServerList;MediaServerInfo* ServerRegistryListMediaServerInfo(Media med,  String&amp;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;&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;amp; mach,int&amp;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;&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;amp; mach,int&amp;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;amp; p_udesc)   {   int tmp=(udesc==p_udesc)?1∶0;   return((tmp &amp;amp;&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;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;amp; p)   (   return(m - p.m&amp;amp;&amp;amp; udeac=p.udeac);   } */ ); List_of_pdaclare(ModiaBridgedesc) class mediBridgadescList { public   mediaBridgedescList();   -MediaBridgeDEscList();   //copy constructor   mediaBridgedescList(const mediaBridgeDescList &amp;amp; rhs);   //assign constructor   mediaSridgeDescList&amp;amp; operator-(const MediaBridgadascList &amp;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;amp; user_desc);   void add(mediaSridgeDesc&amp;amp; med);   void remove(media m);   void update(media m,string&amp;amp;machina, int port,int is_active=O);   void update_prav_request(string&amp;amp; machina, int port,int is_active);   void updste_applicable_media(medisBridgeDescList&amp;amp; mdesc);   int is_present (MediaBriDGEdesc*b);   List_of_P(MadiaBridgeDesc)&amp;amp;media_list(){return list;}   mediaBridgeDesc* Lastmedia(){return last_msdia;)private   mediaBridgeDasc* node_presant(medi&amp;amp;BridgeDesc*node);   void assign_or_copy(const mediaBridgeDescList&amp;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;amp; pasd)   {participant=p;med=pesd;}   int participant(){return participant;}   MediaBridgeDescList&amp;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有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1