CN1121758A - 多媒体通信网络 - Google Patents
多媒体通信网络 Download PDFInfo
- Publication number
- CN1121758A CN1121758A CN94191862A CN94191862A CN1121758A CN 1121758 A CN1121758 A CN 1121758A CN 94191862 A CN94191862 A CN 94191862A CN 94191862 A CN94191862 A CN 94191862A CN 1121758 A CN1121758 A CN 1121758A
- Authority
- CN
- China
- Prior art keywords
- msg
- meeting
- room
- server
- list
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N1/00—Scanning, transmission or reproduction of documents or the like, e.g. facsimile transmission; Details thereof
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L12/00—Data switching networks
- H04L12/02—Details
- H04L12/16—Arrangements for providing special services to substations
- H04L12/18—Arrangements for providing special services to substations for broadcast or conference, e.g. multicast
- H04L12/1813—Arrangements for providing special services to substations for broadcast or conference, e.g. multicast for computer conferences, e.g. chat rooms
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04M—TELEPHONIC COMMUNICATION
- H04M3/00—Automatic or semi-automatic exchanges
- H04M3/42—Systems providing special services or facilities to subscribers
- H04M3/56—Arrangements for connecting several subscribers to a common circuit, i.e. affording conference facilities
- H04M3/567—Multimedia conference systems
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N1/00—Scanning, transmission or reproduction of documents or the like, e.g. facsimile transmission; Details thereof
- H04N1/32—Circuits or arrangements for control or supervision between transmitter and receiver or between image input and image output device, e.g. between a still-image camera and its memory or between a still-image camera and a printer device
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04M—TELEPHONIC COMMUNICATION
- H04M3/00—Automatic or semi-automatic exchanges
- H04M3/42—Systems providing special services or facilities to subscribers
- H04M3/42221—Conversation recording systems
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04M—TELEPHONIC COMMUNICATION
- H04M3/00—Automatic or semi-automatic exchanges
- H04M3/42—Systems providing special services or facilities to subscribers
- H04M3/56—Arrangements for connecting several subscribers to a common circuit, i.e. affording conference facilities
- H04M3/562—Arrangements for connecting several subscribers to a common circuit, i.e. affording conference facilities where the conference facilities are distributed
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S379/00—Telephonic communications
- Y10S379/908—Multimedia
Landscapes
- Engineering & Computer Science (AREA)
- Multimedia (AREA)
- Signal Processing (AREA)
- General Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Telephonic Communication Services (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
- Two-Way Televisions, Distribution Of Moving Picture Or The Like (AREA)
- Computer And Data Communications (AREA)
- Interconnected Communication Systems, Intercoms, And Interphones (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
- Silicates, Zeolites, And Molecular Sieves (AREA)
- Polymers With Sulfur, Phosphorus Or Metals In The Main Chain (AREA)
Abstract
一种多媒体网络中代表虚似会议室的电路结构,可模拟真实会议室,便于在分开的与会者之间召开灵活且长时间的多媒体会议。与会者可通过声音、图像和数据中的一种或数种相互通信。由用户控制虚拟会议室存在于网络中的时间长短,而且其存在与用户是否连接会议室无关。会议室是一种媒介,可协调各种媒体服务器的活动,以用多于一种媒体在与会者之间举行会议。服务器与存储装置相关联,后者可存储虚拟会议室举行多媒体会议的某些方面。
Description
技术领域
本发明涉及通信网络。本发明特别涉及能以诸如声音、图像和数据等多种媒体在两个或多个用户之间实现会议的多媒体通信网络。
背景技术
面对面会议的主要特征可用多媒体会议系统来模拟。这些会议系统允许各个与会者从他们各自的工作场所以诸如声音、图像和数据等多种媒体相互沟通,而不需要将他们聚集在同一地点。
在一种现有技术的方法中,这些会议系统包括多个复杂而昂贵的计算机工作站,这些工作站通过传输设备连在一起,这些传输设备仅仅用作要在工作站之间沟通的信息的传递机构。这样一种分布式的结构存在一些大的问题,从而它无法成为一种普及的,商业上可行的结构。在这些现有技术分布式环境的每个工作站中,包含了必需的桥接电路和同步电路等大量的多媒体数据处理能力,用来使与会者开会。这样做增加了每个可能的多媒体用户的费用,这就使用户通常对多媒体通信不感兴趣或不堪负担。此外,现有技术局限于在桌面上使用,不能方便地实现长时间且灵活的多媒体会议的环境,这是由于至少要有一个工作站在会议环境所需期间始终开着。这对于所有要离开会议而后又能顺利返回并继续参加会议的与会者来说就很不方便。要在分布式环境中对与会者作适当演出,上述多媒体会议的各个部分也很难同步。在此情况下,难于在完全不同的通信设备(例如,两台运行不同操作系统的计算机之)间建立多媒体连接。
除了上面描述的分布式结构之外,还有一些集中式结构,这些结构包括了在网络中的而不是在局部的工作站中的媒体桥接电路。例如,AT&T长途通信网络包含了一些声频和视频桥接能力,诸如包含在AT&T联合电话会议业务(Alliance TeleconferencingServices)和AT&T全球商业电视会议业务(Global Businese VideoConferencing Services)中的桥接能力。虽然这些业务是有用的电信业务,但本发明申请人发现它们有一些重要的部分需要改进。申请人认为它们难于在具有不同媒体能力且数目可变的用户之间召开灵活的长时间多媒体会议。诸如电话呼叫等同步通信方式和诸如电子信箱等非同步通信方式不容易归并到现有技术的多媒体通信系统中。现有技术的多媒体通信系统也难于把各个与会者所拥有的完全不同的通信设备组合进一有效的多媒体会议系统。具有不同大小的多媒体通信能力的与会者难于自由进出一给定的多媒体会议。在诸如可通过一复杂的网络(例如扩大的局域网络或如公用电话网等广域网)连接在一起的许多可能的用户之间没有方便的办法实行多媒体通信。例如,采用现有的多媒体会议系统无法使电信公司向它的广大电话用户提供多媒体通信业务。
发明内容
上面提到的问题可以由多媒体通信网络来解决,该网络提供了从一个或数个多媒体端口出入的共用多媒体工作环境。具体地说,多媒体通信网络包括至少一个会议室服务器(meeting room server),它位于网络中并连至为用户提供出入网络的多个端口。响应于由连至一个多媒体端口的用户终端的指令,会议室服务器在网络中建立了一专用电子电路结构。根据用电子电路结构来实现电子多媒体会议的人们的要求,电子电路结构具有由该网络用户设立的预定的特性并具有预选的在网络内的存在时间。电子电路结构可以是一数据结构,它代表网络中的可控持续虚拟会议室。可以用包括任意数目与会者的这一会议室来举行会议。那些与会者可以用多种媒体与其他人沟通。他们不需要每个人在所有媒体中都具有相同的通信能力。与会者可对应于在虚拟会议室中举行的会议来去。即使所有的与会者都离开了会议,虚拟会议室仍存在于网络中,并可在以后的时间被采用,用以由相同的与会者或别的与会者重新开始或继续开会。虚拟会议室可由相同的与会者或别的与会者用于开始或继续开其他的会。因此虚拟会议室是举行会议的真实会议场所的电子模拟。
附图概述
图1是一种根据本发明原理构成的说明性多媒体网络。
图2是一种包括两个多媒体工作站的说明性连接拓扑,这两个工作站通过图1的多媒体网络的有关部分相连。
图3a—3d是在图2的会议室服务器中建立的一种说明性虚拟会议室的表示。
图4是表示相应于网络中所建立一虚拟会议室的图1中一会议室服务器工作的状态图。
图5是表示相应于网络中所建立一虚拟会议室的图2中一会话管理器工作的状态图。
图6是与存储装置相关联的综合媒体服务器的方框图,根据本发明该服务器协助实现虚拟会议室的持续特性。
本发明的最佳实施方式
图1示出一多媒体网络10,它能有选择地将许多个装置中的一个或数个装置连在一起,从而使信息可以从一个装置传送到另一个装置。这些装置可以包括一个或数个多媒体工作站,诸如示于图1的一对多媒体工作站12和14。把多媒体工作站12和14分别连至网络10的相应多媒体端口,从而能相互沟通,还能与以诸如声音、图像和数据等多种媒体连至网络10的其他装置相互沟通。能与图1中的网络10互连的其他装置包括摄像机16、录像机18、传真装置20、电话22和电视机24。电话22可以是简单的普通老电话业话(POTS)电话、综合业务数字网(ISDN)电话、蜂窝状或其他无线电话或诸如个人通信装置等任何其他的声频电信装置。示于图1的每个装置用对网络10的适当端口的合适接续与网络10相连。
网络10包含多个服务器,用于在示于图1的装置中的被选出的装置之间实现预定媒体的连接。网络10包含一个或数个会议室服务器1,2,…,i,每个会议室服务器是一个相应于在网络10中建立的虚拟会议室的信息库。下面将详细说明虚拟会议室的特性。会议室服务器也协调并控制对网络10中的媒体服务器的访问。媒体服务器包括一个或数个数据服务器1,2,…,j;一个或数个视频服务器1,2,…,k;以及一个或数个声频服务器1,2。…,1。数据服务器把示于图1的装置的输入和输出的数据部分有选择地与示于图1的其他装置的已选数据输入端和输出端相连。同样,视频服务器有选择地连接示于图1的装置的视频输入端和视频输出端。而声频服务器有选择地连接那些装置的声频输入端和声频输出端。网络10还包含一个或数个姓名服务器1,2,…,m,每个姓名服务器可存储连至网络10的装置的地址以及由媒体服务器和会议室服务器所采用的网络资源的地址。会议室服务器对由姓名服务器掌握的信息作出反应,以在被选的用户和被选的虚拟会议室之间建立联系。
在本发明的一个例子中,示于图1的服务器可以作为软件实体在诸如由Sun微系统公司(Sun Microsystem)制造的一台或数台基于UNIX_的工作站上实现。如下面更详细描述的那样,可以在图1所示的多媒体网络10中建立可控持续虚拟会议室,可用这些会议室在网络10的两个或多个用户之间灵活地进行任何所需方向的多媒体会议。
图2示出图1中的工作站12和14通过网络10的说明性多媒体连接。工作站12包含一用户接口26,它可包括一计算机目视界面。接口26也可包括诸如键盘、鼠标器、基于笔的输入装置或语音驱动输入装置等数据输入装置。把用户接口26连至会话管理器28。会话管理器28协调位于工作站12中的一组媒体管理器的活动。会话管理器28也是工作站12中的信令代理机,该代理机发信号通知网络10建立或破坏由工作站12的操作者所用的一个或数个虚拟会议室。会话管理器28也用来对网络10发信号,用以在可被工作站12的操作者访问的每个虚拟会议室中建立各种会议配置。
工作站12还包含一组媒体管理器,它们与有关的硬件装置和软件实体相关联,这些软、硬件在有关的媒体中产生输出并在这些媒体中从其他的与会者那里接收输入。工作站12包含一数据管理器30,它接收由在工作站12中运行的一个或数个应用程序产生的数据,这些应用程序有空白表格软件(spreadsheet)程序、字处理程序、图形程序,等等。数据管理器30通过网络10把数据传给其他的与会者,具体地说,在本发明的这个例子中,传给参加会议的多媒体工作站的其他类似的管理器。工作站12还包含一视频管理器32,它从与工作站12相关联的一个或数个视像装置接收视频信号,这些视像装置有电视摄像机、录像机、扫描变换器,等等。视频管理器32通过网络10把视频信号传送给其他的与会者,例如,传送给类似的多媒体工作站中的其他的视频管理器。最后,工作站12包括一声频管理器34,它与一个或数个声响装置相关联,这些声响装置有电话、传声器,等等。除了从工作站12通过网络10把信号送至其他的与会者之外,媒体管理器30、32和34还从其他的与会者那里接收有关信号并以适当的方式把这些信号传送给工作站12的用户。例如,管理器30、32和34可使数据和图像显示在电视机或视频监视器上,而声响经扬声器放出。在本发明的其他例子中,在工作站12中还可以有其他的媒体管理器,例如,处理由工作站12产生或接收的传真信号的管理器。
会话管理器28与数据管理器30之间的信号信息在线路29上传送;会话管理器28与视频管理器32之间的信号信息在线路31上传送;会话管理器28与声频管理器34之间的信号信息在线路33上传送。同样,工作站14包含与会话管理器38相连的用户接口36。工作站14还包含数据管理器40、视频管理器42和声频管理器44,它们分别通过信号线39、41和43与会话管理器38相连。工作站12和24可以是基于UNIX_的例如由Sun微系统公司等制造的计算机或工作站。管理器和用户接口可以是在上述计算机上的软件实体。
把诸如图2中的工作站12和14的用户终端连至网络10的多媒体端口。在多媒体端口中,从连至多媒体端口的各用户终端接收多种媒体中的信号和通信业务。有一例多媒体端口,也将多种媒体中的信号和通信业务送至与多媒体端口相连的用户终端。如何把工作站12和14的信号和多媒体通信业务接至网络10的多媒体端口的详细情形在图2中示出,并描述如下。
在工作站12和14之间的多媒体连接中,工作站12的会话管理器28用适当的线路46经过网络10连至工作站14的会话管理器38。每个多媒体工作站与图1所示的一个特定的会议室服务器相关联。在图2所示的例子中,工作站12和14都与同一个会议室服务器48相关联,例如,这个会议室服务器可以是示于图1的会议室服务器1。
工作站12和14之间的连接由一工作站用户首先在会议室服务器48中建立一持续虚拟会议室而开始,虚拟会议室是由一个会话管理器28或38向服务器48沿线路45或46发送指令而建立起来的。虚拟会议室包括在会议室服务器48中的一数据结构,它代表分派给通信接续的某些计算机资源和在工作站12和14之间的信号。例如,那些资源可包括与会议室服务器48相关联的存储器的部分或全部、计算机文件、数据库表、或其他的存储器或存储装置。在网络10的每个会议室服务器中可以建立一个以上的会议室。给每个虚拟会议室一个独有的标识,会议室的可能用户可以用该标识访问该会议室。虚拟会议室可包含一些服务器的标识,这些服务器将被用来在工作站12和14之间的各种媒体中实行连接。此外,虚拟会议室将包含在虚拟会议室中开会的与会者的标识。在虚拟会议室里可以举行一个或数个会议,给每个会议一个独有的存储在虚拟会议室中的标识。虚拟会议室还可以包含有关被允许使用会议室的可能与会者的某些访问权利的信息。在某些情形中,对于虚拟会议室来说,包含有关其已存在于网络中的时间长度的信息可能有好处。例如,在网络10是电话网络的情形下,对于虚拟会议室来说,包含有关初始建立时刻以及实际开会所用时间的信息将是有好处的。这一信息可用于给用虚拟会议室开会的电话用户开帐单并把那些会议的信息存储在网络中。
图3a至3d是虚拟会议室47的图解,该虚拟会议室可由图2中的会议室服务器48建立。在图3a的例子中,会议室包括服务器48的存储器中为该虚拟会议室划出来的一指定区域。在存储单元49中存储独有的虚拟会议室标识。在存储单元51中存储对虚拟会议室的访问权利。这些访问权利表明谁可用此虚拟会议室。在存储单元53中存储预约属性。预约属性包括有关已预约此虚拟会议室人员的信息;会议室已被预约的时间段;以及将使用的媒体服务器的标识。任何没有在预约属性中识别的其他用户在已预约的时间段内不能使用会议室。通过采用某种优先级方案可以解决预约矛盾。在不矛盾的时刻,一虚拟会议室可被多重预约。在存储单元55中存储与虚拟会议室47相关联的m个媒体服务器的识别特性说明。如图3b所示,每个服务器说明可包括唯一识别每个服务器的标识59。那些服务器说明还可包含连接信息61,例如,有关服务器的网络地址。服务器说明还可包含:谁有权访问该特定服务器的信息63;与服务器的每个付款用户使用程度有关的信息65;反映上面已描述的与此服务器有关的预约属性的预约信息67;以及服务说明69,它确定由此服务器处理的特定类型的声音、图像或数据业务,例如,话音留言、声讯服务、NTSC电视(压缩与非压缩)、告示板服务、游戏、气象、新闻,等等。
会议室47还可包含有关一组与会者之间会谈的显示。在存储单元57中存储识别n个用这个虚拟会议室已召开或将召开的会议的说明。如图3c所示,每个会议说明包含一存储在存储单元71中的独有的会议标识;访问权利73;开帐单信息75;以及一个或多个与会者说明77。如图3d所示,每个如图3c所示的与会者说明可包含一独有的标识79;有关该与会者是否使用该会议室的状态说明81;静态媒体说明83,它指明该与会者与之通信的媒体;动态媒体说明85,它指明该与会者当前正与之通信的媒体;以及轮廓87,它包含可能对网络有用的有关与会者的信息,诸如与会者参加该会议的时间长度、在会议进程中与会者使用何种资源,以及是否和如何给该与会者开帐单。服务器48可以包含任意个数的会议室。每个会议室可包含任意个数的服务器、任意个数的会议和在每个会议中任意个数的与会者。每个与会者可以用诸如声音、图像和数据等多种通信媒体中的任意一种或数种进行通信。
在会议室服务器48中建立的虚拟会议室具有持续的特征,这意味着由虚拟会议室确定的数据结构可以网络中保存一段预定的时间,而该段时间可由网络用户控制。即使没有用户与会议室或网络相连,虚拟会议室仍能在网络中保留。此外,虚拟会议室在网络中持续的时间长度可由虚拟会议室的一个或数个用户控制。这样一个持续的会议室也是一种机制,可能用这样一种机制来记录当一多媒体会议或其他会议进行时发生的某些预选的事件。这些事件以后将在网络中存储一段预定的时间,这段预定的时间是由一个或数个与会者设置的,它与任何与会者是否实际上与网络相连或者使用虚拟会议室无关。例如,在多媒体网络10是一电话网络的情形中,所有的与会者都可挂机走开而由与会者选择的会议信息将存储在网络中,以备他们之中的任何人将来重新取用。这种存储性能还允许将会议中断,并在以后从会议中断处重新开始。新的与会者可以参加一正在举行的会议,并可迅速了解该会议早些时候所发生的事。虚拟会议室中的某些或全部信息可由该虚拟会议室的经选择的一些或全体用户予以删除。
在工作站12和14之间的多媒体会议中,会议室服务器48用双向通信线路52与网络10中的一个数据服务器50相连。会议室服务器48用一双向通信线路56与网络10中的一个视频服务器54相连。同样,会议室服务器48用双向通信线路60与网络10中的一个声频服务器58相连。网络10中的一个姓名服务器62通过双向通信线路64与会议室服务器48相连。
数据服务器50分别在双向通信线路60和68上接收在工作站12和14中的数据管理器30和40产生的数据输出和信号。来自每一个工作站12和14的数据输出和信号由数据服务器50送至其他的工作站,从而由每个工作站产生的数据可以为两个工作站12和14的用户共享。这由数据服务器50来完成,它在线路66上接收工作站12的数据管理器30的数据输出和信号,并在线路68上将该输出和信号送至工作站14中的数据管理器40。数据管理器50还在线路68上接收从工作站14的数据管理器40的数据输出和信号,并在线路66上将该数据输出和信号送至工作站12的数据管理器30。
视频服务器54在双向通信线路70上接收工作站12的视频管理器32的视频输出和视频信号,并在双向通信线72上接收工作站14的视频管理器42的视频输出和视频信号。视频服务器54通过通信线路72把在通信线路70上从工作站12接收到的视频输出和视频信号送至工作站14。视频服务器54还通过通信线路70把在通信线路72上从工作站14接收到的视频输出和视频信号送至工作站12。
声频服务器58在双向通信线路74上接收工作站12的声频管理器34的声频输出和声频信号,并通过通信线路76把该声频输出和声频信号送至工作站14中的声频管理器44。声频服务器58还在双向通信线路76上接收工作站14的声频管理器44的声频输出和声频信号,并通过线路74把该声频输出和声频信号送至声频管理器34。
虽然示于图2的本发明的例子只涉及两个多媒体工作站之间的连接,但本发明对于可包括在一个会议中的任何个数的与会者同样适用。数据服务器50、视频服务器54和声频服务器58主要起桥接电路的作用,用于把与会者的有关媒体的输出组合起来,并在适当的通信路径上将那些输出中选出的一些输出送往与会者。把一些服务器组合并协调起来,使多个与会者可参加一多媒体会议的工作是由多媒体服务器48处理的,该多媒体服务器使用存储在一虚拟会议室中的信息,该会议室是为在与会者之间举行会议而建立的。把会议室接口78连至会议室服务器48,从而可向服务器48提供由网络管理人员等给出的某些信息。可以通过接口78获得有关网络10中的会议室的信息。会议室服务器用通信线路80与网络10中的其他的会议室服务器相连,通信线路80的一头接于服务器48的输入/输出端口。当指派与会者采用网络中的不同的会议室服务器时,需要线路80。
图4是一状态图,该图相应于单个虚拟会议室详细地表示出图1中的会议室服务器48的工作性质。对于由服务器48管理的每个虚拟会议室,可以用类似的状态图。在图4中,相应于一给定虚拟会议室服务器48可以存在的每个状态图用一椭圆形结构来示意地表示。状态之间的转换用一标有数字,而数字前有字母“E”的箭头来表示。自身环用数字前加“SL”来表示。表I是示于图4的所有状态转换的一览表。表I是允许转换的完整的一览表,转换称为“边”(edge),表中包括在状态之间触发(trigger)转换的标识以及作为触发的结果而产生的动作(action)。
在服务器48中建立一虚拟会议室之前,服务器48处于接地状态82。服务器48从与服务器48相关联的工作站中的会话管理器接收一指令以建立一个空的虚拟会议室,该虚拟会议室可以是存储器空间的分配或是对于特定会议的其他计算机资源,而该会议将由建立此虚拟会议室的用户和其他用户加入。会议室服务器48离开接地状态82而进入空会议室状态84。将有一些合适的服务器与空会议室相关联,以在预定的媒体中举行会议。这些服务器可从诸如示于图1的网络中的服务器的集合中挑选。当一服务器将与虚拟会议室相关联时,会议室服务器48就离开空会议室而作为例如建立该虚拟会议室的工作站中的会话管理器的指令的结果进入等待状态86。一旦所要求的服务器实际上已被分派至虚拟会议室,例如,当一被要求与虚拟会议室相关联的服务器产生一认可信息后,于是,会议室服务器48就进入状态88,该状态表明有一个至少带有一个相关联的服务器的虚拟会议室。当服务器处于状态88,根据来自会话管理器的指令,可以有另外的服务器加至虚拟会议室,如图4的第二等待状态90所示。
除了建立空的虚拟会议室并把预定的网络资源与该虚拟会议室相关联之外,实际会议可在虚拟会议室中举行,由此与会者可以在选定的媒体中互相联系。两个或多个与会者可以共享一个或多个声音媒体(诸如通常的语音会话)、数据媒体(诸如某些计算机程序)以及图像媒体(诸如由放在与会者所在场所的摄像机摄得的图像)。关于这一点,会话管理器向会议室服务器48发信号,用以在虚拟会议室中召开一个有唯一标识的会议。服务器48离开状态88而进入状态90,在此状态中,虚拟会议室包括一些服务器,而且正在此状态中开一个会议。在状态90中,可以增加另外的服务器,如图4中的等待状态92所示。当服务器48处于状态90时,可以有任意个数的与会者加至会议或离开会议,如图4的自身环SL2所示。会议可以中断,这时所有的与会者或者继续与网络相连或者实际上完全脱离网络10,如图4中从状态90转换到状态94所示。由于虚拟会议室具有持续特性,会议室以及有关会议的信息将根据会议室用户的需要继续存储在网络10中。会议可以由一个或数个用户在会议中断的地方重新开始,如从状态94至状态90的转换所示。
除了上面所描述的状态和转换之外,会议室服务器48还可以从空会议室状态84进入状态96,它包含这样一种情形,在服务器48中有一正在开会的虚拟会议室,但到那时为止,还没有服务器。如等待状态98所表示的那样可加入服务器,由此可进入状态90,在该状态中,有一虚拟会议室,并有服务器和与会者与该会议室相关联。响应于来自预选的会话管理器的指令,会议室服务器48可以从示于图4的任何其他状态进入结束状态100,在该状态中,把虚拟会议室以及它的内容完全从网络10中的存储单元中擦除。
图5是表示相应于单个虚拟会议室情形的多媒体工作站会话管理器工作的状态图。类似于图5的另外的状态图可以代表相应于其他一些虚拟会议室情形时该会话管理器的工作。如图4中的情形那样,图5的状态图包括会话管理器可以存在的状态以及在状态之间允许的转换的表示。表II是允许的转换的完整的一览表,转换称之为“边”,表中包括在状态之间触发转换的标识以及作为触发的结果而产生的动作。
为作本描述,假设工作站12的一个用户需要呼叫工作站14的一个用户。在工作站的一个用户为在网络10中建立一个虚拟会议室而发出一个指令之前,会话管理器的工作处于接地状态102。当工作站12的一个用户想与别人(例如,工作站14的一个用户)通信,他或她就向工作站12的用户接口输入一请求。这与主叫方拨被叫方的电话号码以在两方之间开始电话呼叫的情形相同或类似。想要与另一个工作站的用户相联系的那个用户可以人为地选择将采用哪一种媒体来举行会议。换一种做法,有关将采用哪一种媒体的信息可存储在两个工作站用户之间的某处,用以自动地在用户之间构成合适的联系。一旦工作站12的起始用户提出了与另一用户建立联系的要求,会话管理器28就进入等待状态104,在此期间会话管理器28等待会议室服务器48在网络10中建立一个会适的虚拟会议室。在会话管理器28被告知已建立虚拟会议室之后,会话管理器28就进入等待状态106,在此期间会话管理器等待这样一个指示,即会议室服务器48已经使一些合适的媒体服务器与刚建立的虚拟会议室相关联。每当把服务器加至一虚拟会议室时,会话管理器28就组织工作站12中的本地设备与每个媒体服务器合适地连接,这些媒体服务器是与由会议室服务器48建立的虚拟会议室相关联的。在所有的合适的媒体服务器都已与虚拟会议室相关联后,会话管理器28就进入状态108,该状态指明会议室有服务器。当会话管理器处于状态108时,通过从状态108至状态112并返回的转换,可以把另外的服务器加至会议室。当在状态108时,通过从状态108至状态110并返回的转换,也可以把服务器从会议室去掉。当从会议室去掉服务器时,会话管理器28还从会议中解除分配相应的本地设备。
当会话管理器处于状态108时,可以在虚拟会议室中开会。会话管理器28从状态108转换至状态114,在此期间,会话管理器等待开会。另一种做法是,会话管理器28可通过状态150而到达状态114,在状态150中不涉及会议室与服务器的关联。当会话管理器到达下面将要描述的会议在进行中状态122时,也可把服务器沿通过状态150的路径加至已建立的虚拟会议室。这种状态类似于上面描述过的状态104。
在虚拟会议室中开办一会议可以是在会议室中为会议建立某个标识。当已在虚拟会议室中开办一会议时,会话管理器28就由状态114转换至状态116,在该状态中,会话管理器28请求会议室服务器48把有关工作站用户要接触的人的信息(例如,用户的场所)给会话管理器28。当获得这种信息时,会话管理器28由状态116转换至状态118,在该状态中,会话管理器等待要送给将与之接触的人的消息以及该对象表示想会见工作站12的用户的回音。当接收到回音表明被呼方想要与主呼方会见时,会话管理器28就送一消息至会议室服务器48,把被呼方标识加至虚拟会议室。会议室服务器在状态120中等待对此的证实。当收到这一证实后,会话管理器28就从状态120转换至会议在进行中状态122,在此状态中,两个工作站中的用户联系起一起,并可在已选择的媒体中互相通信。
上面所描述的是这样一种情形,即由工作站12的用户发起与工作站14的用户进行联系。在另一种情形中,即由工作站14的用户发起与工作站12的用户进行联系时,会话管理器28从接地状态102转换至状态124,在该状态中,工作站12的用户被邀请与工作站14的用户参加一个多媒体会议。在状态124中,会话管理器28等待工作站12的用户接受这一邀请。当工作站12的用户已接受邀请时,会话管理器28就从状态124转换至等待状态126,在该状态中,会话管理器28等待证实工作站12已加入会议之中,在此之后,会话管理器28从状态126转换至状态122。
当会议正在进行而会话管理器28处于状态122时,通过如图5所示的在状态122、128、130和132之间的转换,可以把另外的与会者邀入到会议中来。通过如图5所示的在状态122和134之间的转换,可以使与会者退出。通过如图5所示的在状态122和136之间的转换,可以使服务器加入。通过如图5所示的在状态122和138之间的转换,也可以使服务器退出。
通过使与会者不与会话管理器(例如,会话管理器28)挂断的办法,任何参加会议的与会者可以暂时离开会议,这时会话管理器进入状态140。当一个不挂断的与会者想回至会议,会话管理器28从状态140转换至状态142,如果同意不挂断的与会者重新进入会议,则再由状态142转换至状态122。
一个或数个与会者(例如工作站12的用户)可以完全中断会议,由此所有的与会者可以处于不挂断状态或者甚至实际上与网络10脱离的状态。然而,虚拟会议室以及它的某些或全部的相关联的数据可保存在网络中,从而会议可以从它中断的地方恢复。下面将要描述的媒体服务器的存储能力还允许在会议中断后回至会议的那些人能回顾会议的某些或全部经历。当会议中断时,会话管理器28从状态122转换至状态144再至状态146。在会议重新开始时,会话管理器28从状态146转换至状态148,此后该会话管理器又回至状态122。
当会话管理器处接地状态102,工作站12的用户可询问已在网络10中存在的一个虚拟会议室中可以获得的设备的性质。会话管理器从状态102转换至状态152,并组织适当的本地设备与在虚拟会议室中的设备相连接。一旦完成这项工作,会话管理器28就从状态152转换至状态114,并继续以上面已叙述的方式在状态114以及其后的状态中运行。
当会话管理器28处于接地状态102时,工作站12的一个用户也可试图加入当时正在进行的一个会议。如果用户这样表示想进入一个正在进行的会议,会话管理器28就从状态102转换至状态154。事实上,向网络询问会议,并要求一个正在开会的与会者向该用户发出参加会议的邀请。当上述指示到来时,会话管理器28从状态154转换至状态124,并如上面所述的那样继续工作。在工作站12的用户已经是一正在举行的会议的与会者而会话管理器28处于状态122的情形中,由还不是会议一方的另一工作站用户的请求使会话管理器28从状态122转换至状态156。如果工作站12的用户向新来者发出邀请,则会话管理器28由状态156转换至状态130后,再返回至状态122。如果工作站12的用户拒绝邀请新来者,则会话管理器28由状态156直接回至状态122。
如图5所示,可以由会话管理器28从示于图5中的一个经选择的状态进入结束状态158。结束状态158可以看作等价于接地状态102。
图6是示于图1的一个媒体服务器的示意图。所有的媒体服务器都可使用这种结构。媒体服务器包括一个媒体桥路160,它用来从每个与会者那里接收有关媒体的输出。媒体桥路160把从与会者处来的经选择的媒体输出组合起来,并将该组合再送回经选择的与会者。由一个控制器162来管理与会者输出的组合以及将那些输出送回与会者的工作。在声频服务器的情形下,媒体桥路可以是任何一种电话会议桥路,它接收每个与会者的声频输出并将那些声频输出的经选择的一些送至每个与会者。在数据服务器的情形下,媒体桥路可以是诸如窗口桥路(windows bridge)或X窗口数据桥路等任何一种数据桥路,它接收来自与会者的数据输出,并将那些数据输出的经选择的一些送至每个与会者。同样,在视频服务器的情形下,任何一种视频桥路可以用作媒体桥路160,用以从与会者处接收视频输出并将视频输出的经选择的一些送至每个与会者。媒体桥路160可与位于网络中的存储装置164相连,该存储装置用于存储有关虚拟会议室中的一个会议的各方面的信息。例如,当媒体桥路160是视频桥路时,存储装置164可以存储诸如会议经选择部分的图像记录等有关会议的图像信息,在媒体桥路是数据桥路的情形下,存储装置还可存储涉及计算机程序的某些信息,这些程序(例如,可执行程序的状态)已被与会者共享。当媒体桥路是声频桥路时,存储装置还可存储某些或整个会议的声音记录。媒体桥路160还可以与位于网络10外面的类似的存储装置166相连。
附录1是多媒体网络10的例示性的协议。附录2和3是表示上面已作较一般描述的执行一会议服务器和一会话管理器任何的计算机程序清单。程序是用人们普遍知道的C++计算机语言编写的。这些程序可以在运行公知UNIX_操作系统的Sun微系统公司的工作站编译和执行。这些计算机程序是有版权的程序,其版权属于美国电话电报公司(1993),因而在除了作此专利的纸质复印件之外不得拷贝这些程序。
表I边E1:
触发:MR_CREATE_MEETING(自会话管理器)
动作:发送回答MR_CREATE_MEETING(至会话管理器)边E2/E11:
触发:MR_CREATE_ROOM(自会话管理器)
动作:发送回答MR_CREATE_ROOM(至会话管理器)边E3/E7/E14/E18:
触发:MR_ADD_SERVER(自会话管理器)
动作:发送GEN_ASSOCIATE_ROOM(至适当的媒体服务器)边E4/E8-1/E15/E19-1:
触发:出错GEN_ASSOCIATE_ROOM(自媒体服务器)
动作:发送Error MR_ADD_SERVER(至会话管理器)边E5/E8-2/E16/E19-2:
触发:回答GEN_ASSOCIATE_ROOM(自媒体服务器)
动作:发送回答MR_ADD_SERVER(至会话管理器)
NS++(NS=会议室中服务器的数目)边E6:
触发:MR_DROP_SERVER and NS=1
动作:发送GEN_DISASSOCIATE_ROOM(至适当的媒体服
务器)
发送Reply_MR_DROP_SERVER边E9:
触发:MR_DESTROY_MEETING(自会话管理器)
动作:发送回答MR_DESTROY_MEETING(至会话管理器)边E10:
触发:MR_DROP_PARTICIPANT and NP=1(自会话管理
器)
(NP=与会者数目)
动作:发送回答MR_DROP_PARTICIPANT(至会话管理器)边E12:
触发:MR_DROP_PARTICIPANT and NP=1(自会话管理
器)
(NP=与会者数目)
动作:发送回答MR_DROP_PARTICIPANT(至会话管理器)边E13:
触发:MR_DESTROY_MEETING(自会话管理器)
动作:发送回答MR_DESTROY_MEETING(至会话管理器)边E17:
触发:MR_DROP_SERVER and NS=1
动作:发送GEN_DISASSOCIATE_ROOM(至适当的媒体服
务器)
发送Reply_MR_DROP_SERVER边E20/E22:
触发:MR_SUSPEND_MEETING(自会话管理器)
动作:回答MR_SUSPEND_MEETING(至会话管理器)边E21/E23:
触发:MR_RESUME_MEETING(自会话管理器)
动作:回答MR_RESUME_MEETING(至会话管理器)边E24.
触发:MR_DESTROY_ROOM(自会话管理器)
动作:回答MR_DESTROY_ROOM(至会话管理器)边SL1-1,SL2-1:
触发:MR_ADD_PARTICIPANT(自会话管理器)
动作:发送回答MR_ADD_PARTICIPANT(至会话管理器)
NP++边SL1-2,SL2-2:
触发:MR_DROP_PARTICIPANT and NP>1(自会话管理器)
动作:发送回答MR_DROP_PARTICIPANT(至会话管理
器)
NP-
表II边E1:
触发:EVE_CREATE_MEETING(自虚拟会议室)
EVE_CREATE_PERSISTENT_MEETING(自虚拟
会议室)
动作:发送MR_CREATE_ROOM(至会议室)
若(触发=EVE_CREATE_MEETING
情形=TRANSIENT_MEETING;
若(触发=EVE_CREATE_PERSISTENT_MEET-
ING)
情形=PERSISTENT_MEETING;
NS=服务器数目边E2:
触发:EVE_VI_CREATE_MEET_IN_EROOM(自虚拟会议室)
动作:发送MR_LIST_SERVERS边E3:
触发:EVE_VI_JOIN_MEETING(自虚拟会议室)
动作:发送EVE_JOIN_MEETING(至会议所有人)边E4:
触发:EVE_MEETING_INVITE(自同等会话管理器)
动作:发送请求VI_MEETING_INVITATION(至虚拟会议室)边E5:
触发:回答MR_CREATE_ROOM(自会议室)
动作:发送MR_ADD_SERVER(至会议室)边E6:
触发:出错MR_CREATE_ROOM(自会议室)
动作:发送事件EVE_VI_ADDED_PARTICIPANT失败(至虚拟会议室)边E7:
触发:回答MR_ADD_SERVER(自会议室)和NS=O
动作:若(成功){发送MAN_CONNECT_TO_BRIDGE至
适当的本地管理器}边E9:
触发:EVE_CREATE_ROOM_W-SERVERS(自虚拟会议室
动作:发送MR_CREATE_ROOM(至会议室)
NS=服务器数目边E10:
触发:回答MR_CREATE_MEETING成功(自会议室)
动作:发送MR_GET_PERSON_INFO(至会议室)边E12-1(E12):
触发:EVE_DROPPED_PARTICIPANT participant SELF
(自一同等的会话管理器)
动作:发送EVE_DROPPED_PARTICIPANT(至虚拟会议室)边E12-2(E69):
触发:EVE_MEETING_DESTROYED(自一同等的会话管
理器)
动作:发送EVE_MEETING_DESTROYED(至虚拟会议室)边E12-3(E70):
触发:EVE_ROOM_DESTROYED(自一同等的会话管理
器)
动作:发送EVE_ROOM_DESTROYED(至虚拟会议室)边E13:
触发:回答MR_GET_PERSON_INFO(自会议室)
动作:发送EVE_MEETING_INVITATION(至同等会话管理器)边E14:
触发:回答MR_ADD_PARTICIPANT(自会议室)
动作:发送事件EVE_VI_ADDED_PARTICIPANT成功
(至虚拟会议室)
发送事件EVE_ADDED_PARTICIPANT(至所有同
等的会话管理器)边E15:
触发:EVE_VI_SUSPEND_MEETING(自虚拟会议室)
动作:发送MR_SUSPEND_MEETING(至会议室)边E16:
触发:出错MR_SUSPEND_MEETING(自会议室)
动作:发送EVE_MEETING_SUSPENDED失败(至虚拟会议室)边E17:
触发:回答MR_SUSPEND_MEETING(自会议室)
动作:发送EVE_EVE_MEETING_SUSPENDED(至所有
同等的会话管理器)
发送EVE_MEETING_SUSPENDED成功(至虚拟会
议室)边E18:
触发:EVE_MEETING_SUSPENDED(自一同等的会话管理器)
动作:发送EVE_MEETING_SUSPENDED(至虚拟会议室)边E19:
触发:EVE_MEETING_RESUMED(自一同等的会话管理器)
动作:发送EVE_MEETING_RESUMED(至虚拟会议室)边E25:
触发:回答VI_MEETING_INVITATION Accepted(自虚拟会议室)
动作:发送EVE_ACCEPT_INVITATION(至主叫会话管理器)边E26:
触发:EVE_ADDED_PARTICIPANT participant SELF(自一同等的会话管理器)
动作:发送MAN_CONNECT_TO_BRIDGE(至适当的本地管理器)边E27:
触发:回答VI_MEETING_INVITATION被拒绝(自虚拟会议室)
动作:发送EVE_REJECT_INVITATION(至主叫会话管理器)边E28:
触发:EVE_MEETING_INVITE(至同等的会话管理器)
动作:发送EVE_ACCEPT_INVITATION(至请求者)边E29:
触发:EVE_JOIN_MEETING_REJECTED(从同等的会话管理器)
动作:发送EVE_VI_JOIN_MEETING失败(至虚拟会议室)边E31:
触发:回答MR_CREATE_ROOM(自会议室)
动作:发送MR_CREATE_MEETING(至会议室)边E32:
触发:请求EVE_CREATE_MEETING(自虚拟会议室)
动作:发送MR_CREATE_MEETING(至会议室)边E33:
触发:出错MR_CREATE_MEETING(自会议室)
动作:发送事件EVE_VI_ADDED_PARTICIPANT失败(至虚拟会议室)边E34:
触发:回答MR_ADD_PARTICIPANT(自会议室)
动作:发送事件EVE_VI_ADDED_PARTICIPANT成功
(至虚拟会议室)
发送事件EVE_ADDED_PARTICIPANT(至所有同
等的会话管理器)边E37:
触发:出错MR_ADD_PARTICIPANT(自会议室)
动作:发送EVE_VI_ADDED PARTICIPANT失败(至虚拟会议室)边E38:
触发:EVE_ACCEPT_INVITATION(自同等的会话管理器)
动作:发送MR_ADD_PARTICIPANT(至会议室)边E39:
触发:EVE_REJECT_INVITATION(自同等的会话管理器)
动作:发送事件EVE_VI_ADDED_PARTICIPANT失败(至虚拟会议室)边E40:
触发:出错MR_ADD_PARTICIPANT(自会议室)
动作:发送事件EVE_VI_ADDED_PARTICIPANT失败(至虚拟会议室)边E41:
触发:EVE_VI_LEAVE_MEETING(自虚拟会议室)
动作:发送MR_LEAVE_MEETING(自会议室)
发送请求EVE_LEFT_MEETING(至所有同等的会话
管理器)边E42:
触发:EVE_VI_REENTER_MEETING(自虚拟会议室)
动作:发送请求MR_REENTER_MEETING(至会议室)边E43:
触发:回答MR_REENTER_MEETING(自会议室)
动作:发送EVE_REENTER_MEETING(至所有同等的会话
管理器)
发送EVE_REENTER_MEETING成功(至虚拟会议
室)边E44:
触发:出错MR_REENTER_MEETING(自会议室)
动作:发送EVE_REENTER_MEETING失败(至虚拟会议室)边E45:
触发:EVE_VI_RESUME_MEETING(自虚拟会议室)
动作:发送MR_RESUME_MEETING(至会议室)边E46:
触发:回答MR_RESUME_MEETING(自会议室)
动作:发送EVE_MEETING_RESUMED(自虚拟会议室)
发送EVE_MEETING_RESUMED(至所有同等的会
话管理器)边E47:
触发:出错MR_RESUME_MEETING(自会议室)
动作:发送EVE_MEETING_RESUMED失败(至虚拟会议室)边E48:
触发:EVE_VI_ADD_SERVER(自虚拟会议室)
动作:发送请求MR_ADD_SERVER(至会议室)边E49:
触发:回答MR_ADD_SERVER(自会议室)
动作:发送MAN_CONNECT_TO_BRIDGE(至适当的本地
管理器)
发送EVE_SERVER_ADDED(至虚拟会议室)
发送EVE_SERVER_ADDED(至所有同等的会话管理
器)边E50:
触发:出错MR_ADD_SERVER(自会议室)
动作:发送EVE_SERVER_ADDED(失败?)(至虚拟会议室)边E51:
触发:EVE_VI_DROP_SERVER(自虚拟会议室)
动作:发送请求MR_DROP_SERVER(至会议室)边E52:
触发:回答MR_DROP_SERVER(自会议室)
动作:发送MAN_DISCONNECT_FROM_BRIDGE(至适当的本地管理器)发送EVE_SERVER_DROPPED(至虚拟会议室)发送EVE_SERVER_DRIOPPED(至所有同等的会话管理器)边E53:
触发:出错MR_DROP_SERVER(自会议室)
动作:发送EVE_SERVER_DROPPED(失败?)(至虚拟会议室)边E56:
触发:出错MR_GET_PERSON_INFO(自会议室)
动作:发送事件EVE_VI_ADDED_PARTICIPANT失败(至虚拟会议室)边E57:
触发:回答MR_GET_PERSON_INFO(自会议室)
动作:发送EVE_MEETING_INVITATION(至同等的会话管理器)边E58:
触发:EVE_REJECT_INVITATION(自同等的会话管理器)
动作:发送事件EVE_VI_ADDED_PARTICIPANT失败(至虚拟会议室)边E59:
触发:EVE_ACCEPT_INVITATION(自同等的会话管理器)
动作:发送MR_ADD_PARTICIPANT(至会议室)边SELF1(E60):
触发:回答MR_ADD_SERVER(自会议室)和NS>0
动作:若(成功){发送MAN_CONNECT_TO_BRIDGE至
适当的本地管理器}
若(NS>0)发送MR_ADD_SERVER(至会议室)边SELF2-1(E61):
触发:EVE_ADDED_PARTICIPANT participant NOT SE-FL(自一同等的会话管理器)
动作:发送EVE_VI_ADDED_PARTICIPANT(至虚拟会议室)边SELF2-2(E62):
触发:EVE_DROPPED_PARTICIPANT participant NOTSELF(自一同等的会话管理器)
动作:发送EVE_DROPPED_PARTICIPANT(至虚拟会议室)边SELF2-3(E63):
触发:EVE_LEFT_MEETING(自一同等的会话管理器)
动作:发送EVE_LEFT_MEETING(至虚拟会议室)边SELF2-4(E64):
触发:EVE_REENTER_MEETING(自一同等的会话管理器)
动作:发送EVE_REENTER_MEETING(至虚拟会议室)边SELF2-5(E65):
触发:EVE_SERVER_ADDED(自一同等的会话管理器)
动作:发送MAN_CONNECT_TO_GRIDGE(至适当的本地
管理器)
发送EVE_SERVER_ADDED(至虚拟会议室)
发送EVE_SERVER_ADDED(至所有同等的会话管理
器)边SELF2-6(E66).
触发:EVE_SERVER_DROPPED(自一同等的会话管理器)
动作:发送MAN_DISCONNECT_FROM_BRIDGE(至适当
的本地管理器)
发送EVE_SERVER_DROPPED(至虚拟会议室)
发送EVE_SERVER_DROPPED(至所有同等的会话
管理器)边ET1(E67):
触发:暂停(等待EVE_ACCEPT_INVITATION)
动作:发送EVE_VI_ADDED_PARTICIPANT失败(至虚拟会议室)边ET2(E68):
触发:暂停(等待EVE_MEETING_INVITATION)
动作:发送EVE_VI_JOIN_MEETING失败(至虚拟会议室)边ET3(E68):
触发:暂停(等待EVE_ADDED_ PARTICIPANT self)
动作:发送EVE_VI_JOIN_MEETING失败(至虚拟会议室)边E71:
触发:EVE_VI_ADD_SERVER(自虚拟会议室)
动作:发送MR_ADD_SERVER(至会议室)边E72-1:
触发:回答MR_ADD_SERVER(自会议室)
动作:发送MAN_CONNECT_TO_BRIDGE(至适当的本地管理器)边E72-2:
触发:出错MR_ADD_SERVER(自会议室)
动作:无边E73:
触发:EVE_VI_DROP_SERVER(自虚拟会议室)
动作:发送MR_DROP_SERVER(至会议室)边E74-1:
触发:回答MR_DROP_SERVER(自会议室)
动作:发送MAN_DISCONNECT_FROM_BRIDGE(至适当的本地管理器)边E74-2:
触发:出错MR_DROP_SERVER(自会议室)
动作:无边E75
触发:EVE_VI_ADD_PARTICIPANT(自虚拟会议室)
动作:发送MR_GET_PERSON_INFO(至会议室)边E76:
触发:出错MR_GET_PERSON_INFO(自会议室)
动作:发送事件EVE_VI_ADDED_PARTICIPANT失败(至虚拟会议室)边E77:
触发:EVE_MEETING_SUSPENDED(自同等的会话管理器)
动作:EVE_MEETING_SUSPENDED(至虚拟会议室)边E78:
触发:EVE_VI_DROP_PARTICIPANT(自虚拟会议室)
动作:发送MR_DROP_PARTICIPANT(至会议室)边E79:
触发:回答MR_DROP_PARTICIPANT(自会议室)
动作:发送EVE_DROP_PARTICIPANT(至虚拟会议室)
发送EVE_DROP_PARTICIPANT(至所有同等的会
话管理器)边E80:
触发:出错MR_DROP_PARTICIPANT(自会议室)
动作:无边E83:
触发:回答MR_DROP_PARTICIPANT(自会议室)&&participant=SELF
动作:发送EVE_DROP_PARTICIPANT(至虚拟会议室)
发送EVE_DROP_PARTICIPANT(至所有同等的会
话管理器)边E84-1:
触发:回答MR_LIST_SERVER(自会议室)
动作:发送MR_CREATE_MEETING(至会议室)边E85:
触发:出错MR_LIST_SERVERS(自会议室)
动作:E6动作边E86:
触发:EVE_MEETING_JOIN(自同等的会话管理器)
动作:发送EVE_VI_JOIN_MEETING(至虚拟会议室)边E87:
触发:EVE_JOIN_MEETING_ACCEPTED(自虚拟会议室)
动作:发送EVE_MEETING_INVITE(至同等的会话管理器)边E88:
触发:EVE_JOIN_MEETING_REJECTED(自虚拟会议室)
动作:EVE_JOIN_MEETING_REJECTED(至等同的会话管理器)
附录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_code 2. 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_code 3. 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_rooms <dp n="d34"/> Error-> REP_TYPE rep_type ERROR_MR_SERVER REP CODE rep_code MR_LIST_ROOMS CARD32 seq_no CARD32 length ERR_CODE err_code 4. 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_code 5. 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_code 6. 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 attrib <dp n="d35"/> Reply-> 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_code 7. 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_code 8. 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 length <dp n="d36"/> CARD32 MR_id CARD32 src 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_code 2. 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 CARD32 length ERR_CODE_err_code 3. 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_code 4. ShowMeetingStatus: <dp n="d37"/> REQ_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 CARD8 status 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_code 4. 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 CARD8 status 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_code 5. 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_no <dp n="d38"/> CARD32 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_code 6. 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_code 7. 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_code 8. 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 participant <dp n="d39"/> Reply-> 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_code 9. 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_code 10. 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_code 11. SuspendMeeting: REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_SUSPEND_MEETING CARD32 seq_no CARD32 length <dp n="d40"/> CARD32 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_code 12. 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_code 2. ShowAssociatedMeeting: REQ_TYPE req_type REQUEST_MR_SERVER <dp n="d41"/> REQ_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 MEDIA server 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_code 2. 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 MEDIA server STRING user_desc Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_DROP_SERVER CARD32 seq_no CARD32 length <dp n="d42"/> Error-> REP_TYPE rep_type EROR_MR_SERVER REP_CODE rep_code MR_DROP_SERVER CARD32 seq_no CARD32 length ERR_CODE err_code 3. 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 MEDIA server 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_code 4. 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_code 5. GetServerInfo: REQ_TYPE req_type REQUEST_MR_SERVER REQ_CODE req_code MR_GET_SERVER_INFO CARD32 seq_no CARD32 length CARD32 src MEDIA server STRING user_desc Reply-> REP_TYPE rep_type REPLY_MR_SERVER REP_CODE rep_code MR_GET_SERVER_INFO <dp n="d43"/> CARD32 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_code 2. CreateDuplicateUser : REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_CREATE_DUP_USER CARD32 seq_no CARD32 length CARD32 ID 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_code 3. DeleteUser : REQ_TYPE req_type REQUEST_REGISTRY_SERVER REQ_CODE req_code REG_DELETE_USER CARD32 seq_no CARD32 length CARD32 ID CONN_LIST connection_list <dp n="d44"/> Reply-> 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_code 4. 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_code 5. 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_code 6. 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-> <dp n="d45"/> 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_code 7. 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_code 8. 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_code 8. 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-> <dp n="d46"/> 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_code 8. 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_code 9. 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_ROOM <dp n="d47"/> CARD32 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_code 2. 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_list 2. EveAcceptInvitation: REQ_TYPE req_type EVENT_CM REQ_CODE req_code EVE_ACCEPT_INVITATION CARD32 seq_no CARD32 length CARD32 src <dp n="d48"/> CARD32 room_id CARD32 meeting_id CARD32 list_length L_MEDIA server_list 3. 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_id 4. 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_list 5. 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 participant 6. 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_id 7. EveRoomDestroyed: REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_ROOM_DESTROYED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id 8. 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_list 9. EveReenterMeeting: <dp n="d49"/> REP_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_list 10.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_id 11. 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_id 12. 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 access 13. 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_id 14. EveRoomLocked: REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_ROOM_LOCKED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id 16. EveRoomUnocked: REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_ROOM_UNLOCKED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id <dp n="d50"/> 17. EveServerAccessListSet: REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_SERVER_ACCESS_LIST_SET CARD32 seq_no. CARD32 length CARD32 src MEDIA media_number STRING media_name CARD32 list_length L_PARTICIPANT part_list//list of participants granted access 18. EveServerAccessDenied: REP_TYPE rep_type EVENT_CM REP_CODE rep_code EVE_SERVER_ACCESS_DENIED CARD32 seq_no CARD32 length CARD32 src MEDIA media number STRING media name CARD32 participant 19. 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_code 2. 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_SERVER <dp n="d51"/> CARD32 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_code 3. 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 CARD32 length CARD32 room_id CARD32 meeting_id CARD32 participant 2. EveDroppedParticipant: REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_DROPPED_PARTICIPANT CARD32 seq_no CARD32 length CARD32 room_id CARD32 meeting_id CARD32 participant 3. EveMeetingCreated: REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_MEETING_CREATED CARD32 seq_no CARD32 length CARD32 room_id CARD32 meeting_id 4. EveMeetingDestroyed: REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_MEETING_DESTROYED CARD32 seq_no CARD32 length <dp n="d52"/> CARD32 room_id CARD32 meeting_id 5. EveRoomDestroyed: REP_TYPE rep_type EVENT_MR_SERVER REP CODE rep_code EVE_ROOM_DESTROYED CARD32 seq_no CARD32 length CARD32 src CARD32 room_id 6. EveLeftMeeting: REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_LEFT_MEETING CARD32 seq_no CARD32 length CARD32 room_id CARD32 meeting_id CARD32 person_id 7. 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_id 8. EveMeetingSuspended: REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_MEETING_SUSPENDED CARD32 seq_no CARD32 length CARD32 room_id CARD32 meeting_id 9. EveMeetingResumed: REP_TYPE rep_type EVENT_MR_SERVER REP_CODE rep_code EVE_MEETING_RESUMED CARD32 seq_no CARD32 length CARD32 room_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 length <dp n="d53"/> ERR_CODE err_code 2. 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_code 3. 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_code 4. 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_code 5. 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_list <dp n="d54"/> Reply-> None Error-> REP_TYPE rep_type ERROR_X_BRIDGE REP_CODE rep_code X_SET_INPUT CARD32 seq_no CARD32 length ERR_CODE err_code 6. 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_code 7. 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_code 8. 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 CARD32 seq_no CARD32 length <dp n="d55"/> CARD32 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 CARD8 status//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_code 2. 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_id 2. EveApplicationAssociated: REP_TYPE rep_type EVENT_X_BRIDGE REP_CODE rep_code EVE_X_APPL_ASSOCIATED CARD32 seq_no CARD32 length APPL_ID appl_id 3. EveApplicationDestroyed: <dp n="d56"/> REP_TYPE rep_type EVENT_X_BRIDGE REP_CODE rep_code EVE_X_APPL_DESTROYED CARD32 seq_no CARD32 length. APPL_ID appl_id 4. EveApplicationDisassociated: REP_TYPE rep_type EVENT_X_BRIDGE REP_CODE rep_code EVE_X_APPL_DISASSOCIATED CARD32 seq_no CARD32 length APPL_ID appl_id 5. 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 mode 6. 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 src ID 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_code 2. 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-> None <dp n="d57"/> Error-> REP_TYPE rep_type ERROR_VIDEO_BRIDGE REP_CODE rep_code VID_OUTPUT_FILTER CARD32 seq_n CARD32 length ERR_CODE err_code 3. 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_code 4. 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_code 5. 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″ Requests: <dp n="d58"/> 1. 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-> None 2. 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 error 3. Send_Composite: REQ_TYPE req_type REQUEST_VIDEO_BRIDGE REQ_CODE req_code VID_SEND_COMPOSITE CARD32 seq_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 length <dp n="d59"/> 2.RegumeServer: REQ_TYPE req_type EVENT_CM REQ_CODE req_code MAN_RESUME_MANAGER CARD32 seq_no CARD32 length 3. 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_connection 4. 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 MEDIA media STREING udesc 2. StateChange: REQ_TYPE req_type EVENT_MAN REQ_CODE req_code EVE_STATE_CHANGE CARD32 seq_no CARD32 length CARD8 state //code:CONNECTION_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_no <dp n="d60"/> CARD32 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 CARD8 status //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 zero 1. 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 CARD8 audio_flag //0=media absent,1=media included CARD8 video_flag CARD8 xwin_flag 2. CreatePersistentMeeting: REP_TYPE rep_type EVENT_VI REPCODE rep_code EVE_CREATE_PERSISTENT_MEETING CARD32 seq_no CARD32 length CARD32 pseudo_meeting_id CARD32 participant_id CARD8 audio_flag //0=media absent,1=media included CARD8 video_flag CARD8 xwin_flag Protocol between Video Manager and Visual Interface: Events from Visual Interface to Local Video Manager 1. OpenDisplay: REP_TYPE rep_type EVENT_VI REP_CODE rep_code EVE_OPEN_DISPLAY CARD32 seq_no CARD32 length <dp n="d61"/> 2. 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 description 5. SetVideoDisplayParams: REP_TYPE rep_type EVENT_VI REP_CODE rep_code EVE_SET_VIDEO_DISPLAY_PARAMS CARD32 seq_no CARD32 length CARD32 display_desc CARD32 xpos //upper left hand corner CARD32 ypos CARD32 window_size //1-full size,2-half size,3... STRING chroma_key 6 CloseDisplay: REP_TYPE rep_type EVENT_VI REP CODE rep_code EVENT_CLOSE_DISPLAY CARD32 seq_no CARD32 length CARD32 display_descriptor Protocol between Visual Interface and Video Manager: Events from Local Video Manager to Visual Interface <dp n="d62"/> 1. DisplayDescInfo REP_TYPE rep_type EVENT_VIDEO_MGR REP_CODE rep_code EVE_DISPLAY_DESC CARD32 length CARD32 display_descriptor 2. GetVideoId: REP_TYPE rep_type EVENT_VIDEO_MGR REP_CODE rep_code EVE_GET_VIDEO_ID CARD32 seq_no CARD32 length CARD32 video_id //returned value 3. 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 CARD32 filiure_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_id 5. 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 <dp n="d63"/> .tr~ .TL MR:A 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″ .DF PROTOCOL TYPE DEFINITIONS: BYTE: 8-bit value INT8: 8-bit signed integer INT16: 16-bit signed integer INT32: 32-bit signed integer CARD8: 8-bit unsigned integer CARD16: 16-bit unsigned integer CARD32: 32-bit unsigned integer REQ_TYPE: CARD8 REQ_CODE: CARD8 ERR_CODE: CARD32 STRING:[CARD32,<item>]//length, actual string id length*CARD8 L ROOM: ListOfCARD32 FULL_ROOM: [CARD32, STRING] // room_id, room_name L FULL ROOM: ListOfFULL_ROOM PARTICIPANT: CARD32//ID L PARTICIPANT: ListOfPARTICIPANT MEDIA: CARD8//0-Audio,1-Phone,2-Video,3-XWindows, //4-MSWindows 5-Mac 6-C <dp n="d64"/> :wq L_MEDIA:ListOfMEDIA STATUS:CARD8//0=EMPTY ROOM,1=ROCM_W_MEETING,2=ROOM_W_RESOURCES, //3=ROOM_W_MEETING_RESOURCES,4=ROOM_W_SUSPENDED_MEETING LOCK_STATUS:CARD8//0=LOCKED,1=UNLOCKED ROOM_ATTRIB:CARD32 MEETING_ATTRIB:CARD8 CONN_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_LIST L_NM_CONNECTIONS:ListOfCONN_LIST L_PHONE_CONNECTIONS:ListOfPHONE_LIST L_VIDEO_CONNECTIONS:ListOfVIDEO_LIST NM ADDR: <STRING,CARD32> RANGE_ID: <CARD32,CARD32> SERV_CONN_TYPE:CARD8 // O for X like connections,l for Uninterpreted SERV_CONN: <STRING,CARD32> SERVER_DESC:[MEDIA,STRING,SERV_CONN,STRING,STRING] L_SERVERS:ListOfSERVER_DESC MEDIA_SERV_INFO:[MEDIA,SERV_CONN] L_MEDIA_SERV_INFO:ListOfMEDIA_SERV_INFO MR_EVENTS:CARD32//meeting_destroyed,server_added etc. L_MR_EVENTS:ListOfMR_EVENTS PART_SERV:[PARTICIPANT,MEDIA] L_PART_SERV:ListOfPART_SERV .DE .bp .HU″APPENDIX B″ .DF PROTOCOL MESSAGE HEADER STRUCTURE: Three classes of messages between Server-Client: (i)Requests(Client->Server) (ii)Replies(Server->Client) (iii)Events(Server->Client) (iv)Errors(Server->Client) Here′Server′can be one of the following:MR Server,Registry Server, X Bridge,Video Bridge,and Audio Bridge. All packet lengths will be multiples of 4 bytes. The Header structure for any of these packets will be 10 bytes long. Header Structure of a Request Packet(the first 4 bytes): <dp n="d65"/> REQ_TYPE req_type REQ_CODE req_code CARD32 seq_no//sequence number for asynchronous protocol CARD32 length//X uses 18 bits for largest message The req_type indicates what type of request(request to a MR Server,request to a Registry server,request to a Media Server etc.). The req_code is the actual request opcode (e.g.,create a room,show participant A,list rooms etc.). Since the protocols are asynchronous we need a sequence number so that a client can correlate replies/errors from the server with its requests. Header Structure of a Reply/Event/Error Packet(the first 4 bytes): REPLY_TYPE rep_type REP_CODE rep_code CARD32 seq_no CARD32 length The rep_type indicates what type of reply(a proper reply from one of the servers,an event from one of the servers,an error from one of the servers).The rep_code is the actual reply/event/error. .DE
附录2 client.h client.h #ifndef_CLIENT_H #define_CLIENT_H 1 #define INIT_MAX_BUFLEN 65536 #include <NM_types.h> #include<syslem_proto.h> #include<common.h> #include<Ligt.h> #include<String.h> #include<Block.h> #include<pcpp/pString.h> List_of_pdeclare(MessageInfo) List_of_pdeclare Blockdeclare(char) Blockdeclare class Connection{ public: Connection(MRInterface *iface,MmConnection pconn); ~Connection(); MmConnection connetion(){return(conn);} int send(char *dala,int len); int send(Message *msg); int send(MedServRequestClass *msg); Protocol *Proto(){return(Prot);} Convert *Conv(){return(Iface->Conv());} MRInterface *MRIface(){return(Iface);} int is_alive(){return(alive);} RoomMgr *RoomManager(){return(Iface->RoomManager());} void deactivate_self(){client_dead();} void reply_for_routed_msg(Message *msg,char *header,char*data, int data_len); void serviced_msg(Message*msg){delete msg;} void send_disconnect(); virtual void process_msg()=0; protected: void client_process_msg(); void client_dead(); int alive; MRInterface *Iface; Protocol *Prot; char header[MSG_HEADER_LEN]; //static char header[MSG_HFADER_LEN]; static int header_len; Block(char) buf; //static Block(char) buf; MmConnection conn; }; class SeqNoPair{ public: SeqNoPair(Message*m,int orig_seq):msg(m),orig_seq_no(orig_seq){} Message *GetMsg){return msg;} int GetOriSeq(){return orig_seq_no;} private: Message *msg; int orig)seq no; }; List_of_pdeclare(SeqNoPair) List_of_pdeclare class ReqNM:public Connection{ public:ReqNM(MRInterface *iface,MmConnection serv); int send_request_msg(Message *msg); Jan 5 11:56:19 1999 Page 1 of client.h <dp n="d67"/> client.h client.h void process_msg(); ...Liar_of_pdeclare private: int nm_seq_no; List_of_p(SeqNoPair)msg_list; }; class LocalSession:public Connection{ public: LocalSession (MRInterface *iface,MmConnection pCli); void process_msg(); }; class FrontEnd:public Connection { public: FrontEnd(MRInterface *iface,MmConnection pCli); void process_msg(); }; class ReqMR: public Connection { public: ReqMR(MRInterface *iface,MmConnection serv); void process_msg(); int send_request_msg(Message *msg) { request_msg=msg; return(send(msg)); } private: Messsage *request_msg; }; #endif Jan 5 11:56:19 1993 Page 2 of client.h <dp n="d68"/> common.h common.h #ifndef_COMMON_H #define_COMMON_H 1 #include<sys/types.h> #include<sys/time.h> #include<netdb.h> //For struet hostent #include<sys/socket.h> //For AF_INET #include<cc/hetinet/in.h> //For struct in_ addr #include<arpa/inet.h> //For inet_ntoa //class UserIterfade; class MRInterface; class EventNotifier; class MRServerConnInfo: class ServerRegistry; class MediaServerInfo; class Protocol; class Connection; class LocalSession; class FrontEnd; class ReqMR; class ReqNM; class Room; class Meeting; class Conferee; class RoomMgr; class Convert; class Message; class MediaServer; class CommObjMgr; class MediaServerMgr; class LocalSessionMgr; class FrontEnMgr; class ReqMRMgr; class ReqNMMgr; sruct MessageInfo; #define HOST_NAME_LEN 1024 #include<Mm/MmNetworkMan.h> #include <Mm/MmEnum.h> #include<Mm/MmConnection.h> #include <NM_types.h> Listdeclare(MmConnection) Listdeclare Listdeclare(String} Listdeclare #define NW (MmNetworkManager::NetworkManager()) #endif Jan 5 11:56:21 1993 Page 1 of common.h <dp n="d69"/> eve_msg.h eve_msg.h #ifndef_EVE_MSG_H #define_EVE_MSG_H 1 #include<msg.h> class EveTemplatel:public EventClass{ public: EveTemplatel(char *header,CARD8 msg_typ,CARD8 msg_ code, int msg_seq_no,int msg_len,char *msg_data, Connection *invoker, List(MmConnection)& server_list, int src, int room id, int meeting_id,int participant);}; class EveTemplate2: public EventClass{ public: EveTemplate2(char *header,CARD8 msg_trp,CARD8 msg_code, int msg_seq_no,int msg_len,char*msg_data, Connection *invoker, List(MmConnection)& server_list, int src, int room_id); }; class EveTemplate3:public EventClass{ public: EveTemplate3(char *header, CARD8 msg_typ, CARD8 msg_code, int msg_seq_no, int msg_len,char*msg_data Connection * invoker, List(MmConnection)& server list, int src, int room id, int meeting_id, List(int)& plist); }; class EveTemplate4: public EventClass{ public: EveTemplate4(char *header,CARD8 msg_trp,CARD8 msg_code, int msg_seq_no,int msg_len,char *msg_data, Connection * invoker, List(MmConnection)& server list,int src, int room_id,int meeting_id, Media med, String& user_desc); }; class EveTemplate5: public EventClass{ public: EveTemplate5(char *header,CARD8 msg_typ,CARD8 msg_code, int msg_seq_no, int msg_leh,char *msg_data, Connection *invoker, List(MmConnection)& server_list, int src, int room_id,int meeting_id); }; class EveTemplate6:public EventClass{ public: EveTemplate6(char *header,CARD8 msg_trp,CARD8 msg_code, int msg_seq_no,int msg_len,char *msg_data, Connection *invoker, List(MmConnection)& server_list,int src, int room_id,int meeting_id, Media med, String& user_desc, List(int)& part_list); }; #endif Jan 5 11:56:22 1993 Page 1 of eve_mag.h <dp n="d70"/> event.h event.h #ifndef_MR_EVENT H #define_MR_EVENT_H 1 #include<common.h> class EventNotifier{ public: EventNotifier(MRInterface *iface); void AddedParticipant(int room_id,int src,int meeting_id, int participant); void DroppedParticipant(int room_id,int src,int meeting_id, int participant; void LeftMeeting(int room_id,int src,int meeting_id, int participant); void ReenterMeeting(int room id,iht src,int meeting_id, int participant); void RoomCreated(int room_id,int src); void RoomDestroyed(int room_id,int sre); void RoomLocked(int room_id,int src); void RoomUnlocked(int room_id,int src); void MeetingCreated(int room_id,int src, int meeting_id); void MeetingDestroyed(int room_id,int src,int meeting_id); void MeetingSuspended(int room_d,int src,int meeting_id); void MeetingResumed(int room_id,int src,int meeting_id); void Meetinginfo(int room_id,int src,int meeting_id); void ServerAdded(int src,int room_id,int meeting_id, Media med,String user_desc,List(int)& part_list); void ServerDropped(int src,int room_id,int meeting_id, Media med, String user_desc); void ServerAccessListSet(int src,int room_id,int meeting_id, Media med,String user_desc,List(int)& part_list); private: void Templatel( CARD8 code,int room_id,int src, int id,int participant); void Template2(CARD8 code,int room_id,int src,int id); void Template4(CARD8 code,int src,int room_id,int meeting_id, Media med,Strin user_desc); void Template5(CARD8 code,int src,int room_id,int meeting_id); void Template6(CARD8 code,srt sre,int room_id,int meeting_id, Media med, String user desc,List(int)& part_list); void server_conn_list(int room id,List(MmConnection)& conn_list); void fend_conn_list(List(MmConnection)& conn_list); int next_seq_no(){return(++seq_no);} int seq_no; MRInterface *Iface; }; #endif Jan 5 11:56:22 1993 Page 1 of eventh <dp n="d71"/> generator.h generator.h #ifndef_GENERATOR_H #define _GENERATOR_H 1 #include<msg.h> #include<mr msg.h> #include <medserv_msg.h> /* The following functions will creaie a message objcct.Note that only messages that are reccived by the MR Server will have an equivalent funetion (Rcqucats,Evcnts and Replies generated by the MR Server have no relation to this set of functions. */ class ProtoGenerator{ public: static Message *default_generator(char*,CARD8,CARD8,CARD32,CARD2,char*,Connection *); static Message *Gen_CreateRoom(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_DestroyRoom(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_ListRooms(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_ShowRoomStaus(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_ShowRoomAttributes(char*,CARD8,CARD8,CARD32,CARD32 char*,Connection static Message *Gen_AlterRoomAttributes(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection: static Message *Gen_LockRoom(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_UnlockRoom(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_ShowAssociatedRoom(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection static Message *Gen_SnowAssociatedMeeting(char*,CARD8,CARD8,CARD32;CARD32,char*,Connection static Message *Gen_CreateMeeting(char*,CARD8,CARD32,CARD32,CARD32,char*,Connection *); static Message *Gen_DestroyMeeting(char*,CARD8,CARD8,CARD32,CARD32,char*, Connection *); static Message *Gen_ListMeetings(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_ShowMeetingStatus(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*) static Message *Gen_ShowMeetRoomStatus(char*,CARD8,CARD8,CARD2,CARD32,char*,Connection; static Message *Gen_ShowMeetingAttributes(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection static Message *Gen_ShowMewtingAttributes(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection static Message *Gen_AddParticipant(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_DropParticipant(char*,CARD8,CARD8,CARD32,CARD32,char *,Connection *); static Message *Gen_LeaveMeeting(char*,CARD8,CARD8,CARD32,CARD32,char *,Connection *); static Message *Gen_ReenterMeeting(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_SuspendMeeting(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_ResumeMeeting(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_AddServer(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_DropServer(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_SetServerAccessList(char*,CARD8,CARD8,CARD32,CARD32,char *,Connection*): static Message *Gen_ListServers(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection*); static Message *Gen_GetServerInfo(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection *); static Message *Gen_SuspendServer(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection *); static Message *Gen_ResumServer(char*,CARD8,CARD8,CARD32,CARD2,char*,Connection *); static Message *Gen_NameServerMsg(char*,CARD8,CARD8,CARD32,CARD32,char *,Connection *); static Message *Gen_CreateUser(char*,CARD8,CARD8,CARD32,CARD32,char*, Connection *); static Message *Gen_CreateDupUser(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection *); static Message *Gen_DeleteUser(char*,CARD8,CARD8,CARD32,CARD32,char *,Connection *); static Message *Gen_GetPersonInfo(char*,CARD8,CARD8,CARD32,CARD32,char*,Connection *); static Message *Gen_CreateNMEntry(char*,CARD8,CARD8,CARD32,CARD32,char *,Connection *); static Message *Gen_DeleteNMEntcry(char*,CARD8,CARD8,CARD32,CARD32,char *,Connection*); static Message *Gen_GetNMEntry(char*,CARD8,CARD8,CARD32,CARD32,char *, Connection *); static Message *Gen_Disconnect(char*,CARD8,CARD8,CARD32,CARD32,char *, Connection *); }; Jan 5 11:56:21 1993 Page 1 of generator.h <dp n="d72"/> generator.h generator.h #endif Jn5 11:56:21 1993 Page 2 of generator.h <dp n="d73"/> iface.h iface.h #ifndef_IFACE_H #define_IFACE_H 1 #include<common.h> #include<proto.h> #include<msg.h > #include<mr_msg.h > #include<medserv_msg.h> #include<ports.h> #include<iostream.h> #include<fstream.h> #include<convert.h> List_of_pdeclare(CommObjMgr) List_of_pdeclare void shutdown(); class MRInterface{ public: MRInterface(){}; -MRInterface(); void starup(int argc,char *argv()); RoomMgr *RoomManger(){return(RMgr);} MediaServerMgr *MediaServerManager(){return(MSMgr);} ReqMRMgr *ReqMRManager(){return(MRMgr);} ReqNMMgr *ReqNMManager(){return(NMMgr);} EventNotifier *EveNotifier(){return{EveNot);} FrontEndMgr *FEManager{return(FEMgr);} Protocl *Proto() {return(Prot);} Convert *Conv(){return(ConvMethods);} ServerRegistry *ServReg(){return(SReg);} Connection *PersistentConnection(){return(PersConn);} private: //Connection and Coordination void main_loop(); void garbage_collect(); List_of_p(CommObjMgr) object_list; Protocol *Part; Convert *ConvMethods; RoomMgr *RMgr; EventNotifier *EveNot; ServerRegistry *SReg; MediaServerMgr *MSMgr; ReqNMMgr *NMMgr; ReqMRMgr *MRMgr; LocalSessionMgr *LSMgr; FrontEndMgr *FEMgr; Connection *PersConn; int FE_port; }; # endif Jan 5 11:56:14 1993 Page I of iface.h <dp n="d74"/> med serv.h med_serv.h #include<obj man.h> List_of_pdeclare(MediaServer) List_of_pdeclare List_of_pdeclare List_of_pdeclare(MedServRequestClass) class MediaServer:public Connection{ public: MediaServer(MRInterface *iface,MmConnection serv, int med_id,int room,MediaServerInfo *info); void process_msg(); int ServerId(){return(id);} Meidia medium(){return(Medium);} String user_desc(){return(UserDesc);} int get_server_connection(MediaServerConn& info) {info=conn_info;return O;} void set_manager_port(int port){mgr_conn_info.port=port;} int get_manager_connection(MediaServerConn& info) {info=mgr_conn_iofo;return O;} int seind_request_msg(MedServRequestClass *medserv_msg); -MediaServer(); private: int id; MediaServerConn conn_info; MediaServerConn mgr_conn_info; Media Medium; String UserDesc; List_of_p(MedServRequestClass) msg_list; }; class MediaServerMgr:public CommObjMgr{ public: MediaServerMgr(MRInterface *iface): CommObjMgr(iface) {is_alive=1;next server id=0;gen_seq_no=0;} -MediaServerMgr(); void process(MmConnection serv); int get_server_info(int server, Media& m, String& user_desc); int get_server_connection(Media m, String& user_desc, MediaServerConn& conn); int get_manager_connectioa(Media m,String& user_desc, MediaServerConn& conn); void set_manager_port(Media m,String& user desc,int port); MmConnection ServerConncction{int server); int get_server id(Media m,String& user desc); void send(int m, char *data, int len); void send_to_all_servers(char *data, int len); int AddServer(RequestClass *msg, CARD32 requester,int room_id, Meaia media,String& user_desc,List(int)& part_list); int DropServer(RequestGlass *msg,GARD32 requester, int room_id, Media media, String& user_desc); void DropServer(int room_id, int server_id); int SuspendServer(RequestClaas *mag, CAARD32 requester, int room_id, Media media, Striag& user_desc); int ResumeServer(RequestClass *msg,CARD32 requester, int room_id, Media media, String& user_desc); int SetServerAccessList(RequestClass *msg, CARD32 requester, int room_id, Media media, String& user_desc, List(int)& part_list); private: void garbage_collect(); int init_media_server(RequestClass *stimulant, int room, Media m, String uscr_desc, List(int) part_list); Jan 5 11:56:22 1993 page 1 of med_serv.h <dp n="d75"/> med_serv.h med_serv.h MediaServere* get_media_server(Media m,String user_dese); ...Liet_of_pdeclare MediaServere* get_media_server{int server_id}; int next_seq_no(){return(++sen_seq_no);} List_of_p(MediaSqerver)server_liar; int gen_seq_no; int next_server_id; Block(char)send_buf; }; Jan 5 11:56:22 1993 Page 2 of med_serv.h <dp n="d76"/> medserv_msg.h medserv_msg.h #ifndef_MEDSERV MSG H #define_MEDSERV_MSG_H 1 #include <msg.h> #include <iostream.h> class REP_AddServer:public ReplyClass{ public: REP_AddServer(char*header,CARD8 msg_try,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data, Connection *invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} msg_obj_states action(){return(e_MSG_SERVICED);} void r_action(MediaServerConn&;conn); }; class AddServer:public RequestClass{ public: AddServer(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): RequestClass(hesder,msg_code,msg_code,msg_seq_no, msg_len,msg_data, invoker) {} msg_obj_states action(); }; class DropServer:public RequestClass{ public: DropServer(char *header, CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg data Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; class SetServerAccessList:public RequestClass{ public: SetServerAccessList(char *header,CARD8 msg_trp,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; class REP_ListServers:public ReplyClass{ public: REP_ListServers(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker}: ReplyClass(hesder,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} msg_obj_states action(){return(c_MSG_SERVICED);} void r_action{List_of_p{FullMediaDesc)& med_list); }; class ListServers:public requestClass{ public: ListServers(char *header,CARD8 msg_tyP,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} msg_obj_states action(); }; class REP_GetServerInfo:public ReplyClass{ public: REP_GetServerInfo(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection*invoker): ReplyClass(header,msg_typ,msg_code_msg_seq_no, Jan 5 11:56:22 1993 Page 1 of medserv_msg.h <dp n="d77"/> medserv_msg.h medserv_msg.h msg_len,msg_data,invoker) {} msg_obj_states action(){return(e_ MSG_SERVICED);} void r_action(MediaServerConn& conn); }; class GetServerInfo:public RequestClass{ public: GetServerInfo(char *header,CARD8 msg_typ,CARD8 msg code,int msg_seq_no, int msg_len,char*msg_data Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data invoker) {} msg_obj_states action(); }; class SuspendServer:public RequestClass { public: SuspendServer(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} msg_obj_states action(); }; class ResumeServer:public RequestClass{ public: ResumeServer(char *header,CARD8 msg_typ,CARD8 msg code,int msg_seq_no, int msg_len,char*msg_data Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; ////////////////////////////////////////////////////////////////////// //Reply and Error messages from Generic Media Servers ////////////////////////////////////////////////////////////////////// class AssociateServer:public MedServRequestClass{ public: AssociateServer(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)& plist, Medit pmedia,String& puser_desc); void special_action(Block(char)& reply_data, int rdata_len); private: List(int) part_list; }; class DisassociateServer: public MedServRequestClass{ public: DisassociateServer(ReqnestClass *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& puser_desc); void special_action(Block(char)& reply_data,int rdata_len); }; class GenSuspendServer: public MedServRequestClass{ public: GenSuspendServer(RequestClass *stimulant,char *headier,CARD8 msg_typ, CARD8 msg_code, int msg_seq_no, int msg_len,chsr *msg_data,Connection *invoker, int proom, Media pmedia, String& puser_desc); void special_action(Block(char)& reply_data, int rdata_len); }; class GenResumeServer: public MedServRequestClass{ Jan 5 11:56:22 1993 page 2 of medserv_msg.h <dp n="d78"/> medserv_msg.h medserv_msg.h public: GenResumeServer(RequestClass *stimulant,char *hesder,CARD8 msg_typ, CARD8 msg_code, int msg_seq_no, int msg_len,char *msg_data,Connection *invoker, int proom, Media pmedia,String& puser_desc); void special_action(Block(char)& reply_data,int rdata_len); }; class Set AccessList: public MedServRequestClass{ public: SetAccessList(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)& plist, Media pmedia, String& puser_desc); void special_action(Block(char)& reply_data, int rdata_len); private: List(int) part_list; }; #endif Jan 5 11:56:22 1993 Page 3 of medserv_msg.h <dp n="d79"/> mr_msg.h mr_msg.n #ifnderf_MR_MSG_H #define_MR_MSG_H 1 #inelude<msg.h> /*********************************************************************/ /* */ /* REQUEST MESSAGES TO MR SERVER */ /* */ /*********************************************************************/ class Disconnect: public RequestClass { public: Disconnect{char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} msg_obj_states action(); }; class REP_CreateRoom:public ReplyClass{ public: REP_CreateRoom(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} void r_action(int id); msg_obj_states action(){return(e_MSG_SERVICED);} }; class CreateRoom:public MRMRRequestClass { public: CreateRoom(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): MRMRRequestclass(header,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); private: REP_CreateRoom * reply; }; class DestroyRoom:public MRMRRequestClass{ public: DestroyRoom(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data_invoker){} msg_obj_states action(); }; class REP_Listrooms:public ReplyClass{ public: REP_ListRooms(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Conntion *invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data invoker) {} msg_obj_states action(){return(e_MSG_SERVICED);} void r_action(List(int)& room_list,List(String)& name_list); }; class ListRooms:public MRMRRequestClass{ public: ListRooms(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): MRMRRequestClass(header,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); Jan 5 11:56:21 1993 Page 1 of mr_msg.h <dp n="d80"/> mr_msg.h mr_msg.h private: REP_ListROoms * reply; }; class REP ShowRoomStatus:public ReplyClass{ public: REP_ShowRoomStatus(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): ReplyClass(heaer,msg_typ,msg_code,msg_seq_no, msg_len,msg_data invoker){} msg_obj_ststes action(){return(e_MSG_SERVICED);} void r_action(RoomStatus stat,RoomLockStatus lock_stat); }; class ShowRoomStatus:public MRMRRequestClass{ public: ShowRoomStatus(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection*invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); private: REP_ShowRoomstatus *reply; }; class REP_ShowRoomattributes:public ReplyClass{ public: REP_ShowRoomAttributes(char *header,CARD8 msg_try,CARD8 msg code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): ReplyClass(header,msg_typ,msg_seq_no, msg_len,msg_data,invoker) {} msg_obj_states action{}{return(e_MSG_SERVICED);} void r_action(RoomAttrib attrib); }; class ShowRoomAttributes:public MRMRRequestClass{ public: ShowRoomAttributes(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); private: REP_ShowRoomAttibutes *reply; }; class AlterRoomAttributes:public MRMRRequestClass{ public: AlterRoomattributes(cahr *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection*invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; class LockRoom:public MRMRRequestClass{ public: LockRoom(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection*invoker): ~MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} msg_obj_states action(); }; class UnlockRoom:public MRMRRequestClass{ Jan 5 11:56:21 1993 Page 2 of mr_msg.h <dp n="d81"/> mr_msg.h mr_msg.h public: UnlockRoom(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data, Connection*invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; class REP_ShowAssociatedRoom:public ReplyClass{ public: REP_ShowAssociatedRoom(char*header,CARD8 msg_try,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection*invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_ obj_states action(){return(e_MSG_SERVICED);} void r_action(int room_id); }; class ShowAssociatedRoom:public MRMRRequestClass{ public: ShowAssociatedRoom(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, _ int msg_len,char*msg_data,Connection*invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); private: REP_ShowAssociatedRoom *reply; }; class REP_ShowAssociatedMeeting:public ReplyClass{ public: REP_ShowAssociatedMeeting(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(){return(e_MSG_SERVICED);} void r_action(int meeting_id); }; class ShowAssocatedMeeting:public MRMRRequestClass{ public: ShowAssociatedMeeting(char *header, CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): MRRMRRequestClass(header,msg_try,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); private: REP_ShowAssociatedMeeting *reply; }; class REP_CreateMeetingg:public ReplyClass { public: REP_CreateMeeting(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data, Conntion *invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(){return(e_MSG_SERVICED);} void r_action(int id); }; class CreatetMeeting:public MEMRRequestClass{ public: CreateMeeting(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char* msg_data,Connection *invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, Jan 5 11:56:21 1993 Page 3 of mr_msg.h <dp n="d82"/> mr_msg.h mr_msg.h msg_len,msg_data,invoker){} msg_obj_states action(); private: REP_CreateMeeting *reply; }; class DestroyMeeting: public MRMRRequestClass{ public: DestroyMeeting(char *healer,CARD8 msg_typ,CARD8 msg code, int msg_seq_no, int msg_len,char *msg data,Connection *invoker): MRMRRequeatClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; class REP_ListMeetings:public ReplyClass { public: REP_ListMeetings(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj states action(){return(e_MSG_SERVICED);} void r_action(List(int)& meeting_list); }; class ListMeetings:public MRMRRequestClass{ public: ListMeetings(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); private: REP_ListMeetings *reply; }; class REP_ShowMeetingStatus:public ReplyClass{ public: REP_ShowMeetingStatus(char *header, CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg data,invoker) {} msg_obj_states action(){return(e_MSG_SERVICED);} void r_action(List(ParticipantInfo)& info,int room_id, int owner, MeetingStatus status); }; class ShowMeetingStatus:public MRMRRequestClass{ public: ShowMeetingStatus(char *header,CARD8 msg_typ, CARD8 msg_code, int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): MRMRRequestClass(header, msg_typ,msg__code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); private: REP_ShowMeetingStatus *reply; }; class REP ShowMeetRoomStatus:public ReplyClass{ public: REP_ShowMeetRoomStatus(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(){return(e_MSG_SERVICED);} Jan 5 11:56:21 1993 Page 4 of mr_msg.h <dp n="d83"/> mr_msg.h mr_msg.h void r_action(List(ParticipantInfo)& info, int meeting_id, int owner, Meeting status); }; class ShowMeetRoomStatus:public MRMRRequestClass{ public: ShowMeetRoomStatus(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data Connecion *invoker): MRMRRequestClass(header,msg_code,msg_code,msg_seq_no, msg_len, msg_data,invoker){} msg_obj_states action(); private: REP_ShowMeetRoomStatus *reply; }; class REP_ShowMeetingAttributes:public RepllyClass{ public: REP_ShowMeetingAttributes(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data Connection *invoker): ReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(){return(e_MSG_SERVICED);} void r_action(MeetingAttrib attrib); }; class ShowMeetingAttributes:public MRMRRequestClass{ public: ShowMeetingAttributes(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, _ int msg_len,char*msg_data,Connection *invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len, msg_data,invoker){} msg_obj_states action(); private: REP_ShowMeetingAttributes * reply; }; class AlterMeetingAttributes:public MRMRRequestClass{ public: AlterMeetingAttributes(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data Connection *invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; class AddParticipant:public MRMRRequestClass{ public: AddParticipant(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; class DropParticipant:public MRMRRequestClass{ public: DropParticipant(chat*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection*invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj)states action(); }; class LeaveMeeting:public MRMRRequstClass{ public: LeaveMeeting(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, Jan 5 11:56:21 1993 Page 5 of mr_msg.h <dp n="d84"/> mr_msg.h mr_msg.h int msg_len,char*msg_data,Connection*invoker): MRMRRequest Class(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; class ReenterMeeting:public MRMRRequestClass{ public: ReenterMeeting(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg data,Connection *invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); };class SuspendMeeting:public MRMRRequestClass{ public: SuspendMeeting(char *header,CARD8 msg_try,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data Connection *invoker): MRMRRequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; class ResumeMeeting:public MRMRRequestClass{ public: ResumeMeeting(char *header,CARD8 msg_try,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): MRMRRequestClass(header,msg_code,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(); }; // Name Server Messages class CreateUser:public RequestClass{ public: CreateUser(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(){return(e_MSG_SERVICED);} }; class GreateDupUser:public RequestClass{ public: CreateDupUser(char *header,CARD8 msg_typ,CARD8 msg_code,msg_seq_no, int msg_len,char*msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(){return(e_MSG_SERVICED);} }; class DeleteUser:public RequestClass{ public: DeleteUser(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data Conncetion *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} msg_obj_states action(){return(e_MSG_SERVICED);} }; class GetPesonInfo:pubkic RequestClass{ public: GetPersonInfo(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} Jan 5 11:56:21 1993 Page 6 of mr_msg.h <dp n="d85"/> mr_msg.h mr_msg.h msg_obj_states action(){return(e_MSG_SERVICED);} }; class CreateNMEntry:public RequestClass{ publlic: CreateNMEntry(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int,msg_len,char*msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data invoker){} msg_obj_states action(){return(e_MSG_SERVICED);} }; class DeleteNMEntry:public RequestClass{ public: DeleteNMEntry(char*header,CARD8 msg_try,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} msg_obj_states action(){return(e_MSG_SERVICED);} }; class GetNMEntry:public RequestClass{ public: GetNMEntry(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_leu,msg_data, invoker) {} msg_obj_states action(){return(e_MSG_SERVICED);} }; class NameServerMsg:public RequestClass{ public: NameServerMsg(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data invoker) {} msg_obj_states action(); }; # endif Jan 511:56:21 1993 Page 7 of mr_msg.h <dp n="d86"/> msg.h msg.h #ifndef_MSG_H #define _MSG_H 1 #include <NM_types.h> #include<system_proto.h> #include<common.h> #include<List.h> #include<Block.h> #include<event.h> #define INIT_MAX_REPLYSIZE 8192 Blockdeclare(char) Blockdeclare enum msg_obj_states{e_MSG_IN_SERVICE,e MSG RFMDY, e_MSG_PENDING, e_MSG_SERVICED }; class Message { public: Message(char *m_header, CARD8 msg_typ, CARD8 msg_code, int msg_seo_no, int msg_len,char * msg_data,Connection *invoker); CARD8 msg_type(){return type;} CARD8 msg_code(){return opcode;} int msg_seq_no(){return seq_no;} int msg_len(){return len;} char *msg_data(){return data;} char *msg_header(){return header;} void set_msg seq_no(int s); Connection *MsgSource(){return Invoker;} int for_NameServer(); int for_some_other_MR(int MR_id); virtual msg_obj_states action()=O; protected: int len_in_CARD32(int len_in_bytes); CARD8 type; CARD8 opcode; int seq_no; int len; char header[MSG_HEADER_LEN]; char *data; Connection *Invoker; Convert *Cony; RoomMgr *RMgr; MediaServerMgr *MSMgr; // temp vars int err,nbytes; int pos;//position in data to start processing }; List of_pdeclare(Message) List_of_pdeclare typedef Message * MessagePtr; /////////////////////////////////////////////////////////////////////// //Classes lf Message:Request,Reply,Event& Error /////////////////////////////////////////////////////////////////////// class GenericReplyClass: public Message{ public: GenericReplyClass(char *header, CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len, char *msg_data, Connection *invoker): Message(header, msg_typ,msg_code,msg_seq_no,msg_len, msg_data,invoker) {pos=MSG_HEADER_LEN;rep_len=O;} Jan 5 11:56:15 1993 Page 1 of msg.h <dp n="d87"/> msg.h msg.h virtual msg_obj_states action()=O; ...List_of_pdeclare protected: void fill reply_header(CARD8 msg_type,CARD8 msg_opcode, CARD32 msg_seq_no,CARD32 msg_len); void send_reply(); retie Block(char) rep_buf; int rep_len; }; class ReplyClass:public GenericReplyClass{ public: ReplyClass(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char *msg_data, Connection *invoker): GenericReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker){} virtual msg_obj_states action()=O; }; class EventClass:public GenericReplyClass{ public: EventClass(char *header,CARD8 msg_typ,CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data Connection *invoker, List(MmConnection)& server_list): GenericReplyClass(header,msg_typ,msg_code,msg_seq_no, msg_len, msg_data invoker) {slist=server_list;} void build(int src,int idl); void build(int src,int idl,int id2); void build(int src,int idl, int id2,int participant); void build(int src,int idl, int id2,List(int)& plist); void build(int src,int room_id,int meeting_id, Media med,String& user desc); void build(int src,int room_id,int meeting_id, Media med,String& user_desc,List(int)& plist); void send event(); virtual msg_obj_states action(){return(e_MSG_SERVICED);} private: List(MmConnection)slist; }; class ErrorClass:public GenericReplyClass{ public: ErrorClass(Connection *invoker): GenericReplyClass(NULL, O, O, O, O,NULL,invoker){} void connection(Connection *invoker) {Invoker=invoke;} msg_obj_states sction(){return(e_MSG_SERVICED);} msg_obj_states e_action(CARD32 err_type,CARD32 msg_code, CARD32 seq_no,CARD32 err_code); msg_obj_states success_return(CARD32 err,CARD2 msg_code, CARD32 seq_no); private: void send_error(CARD32 err type,CARD32 msg_code, CARD32 seq_no,CARD32 err_code); }; class IllegalMessage:public GenericReplyClass { public: IllegalMessage(char*header,CARD8 msg_typ,CARD8 msg_code,int msg_no, int msg_len,char *msg_data,Connection *innvoker): GeneericReplyClass(header,msg_typ,msg_code,msg_seq_no,msg_len,msg_data,invoker) {} msg_obj_states action(); }; class RequestClass:public Messge{ Jan 5 11:56:15 1993 Page 2 of msg.h <dp n="d88"/> msg.h msg.h public: ...List_of_pdeclare RequestClass(char *hesder,CARD8 msg_typ, CARD8 msg_code,int msg_seq_no, int msg_len,char*msg_data,Connection *invoker): Messaage(header,msg_typ,msg_code,msg_seq_no,msg_len,msg_data,invoker){ res_len=len; error=new ErrorClass(invoker); -RequesstClass(){delete error;} ErrorClass *error_obj(){return error;} virtual msg_obj_states action()=O; protected: ErrorClass *error; int res_len;//residue length of data }; class MedServRequestClass:public RequestClass{ public: MedServRequestClass(RequestClass *stimulant_msg,char *header, CARD8 msg_typ,CARD8 msg_c_ode, int msg_seq_no, int msg_len,char *msg_data,Connectoon *invoker, int proom,Media pmedia, String& puser_desc): RequestClass(header, msg_typ, msg_code,msg_seq_no, msg_len,msg_data,invoker) { stim_msg=stimulant msg; media=pmedia;user_desc=puser_desc;room=proom; } RequestClass *stimulant(){return stim_msg;} msg_obj_states action(){return(e_MSGSERVICED);} virtual void special_action(Block(char)&reply_data,int rdata_len)=O; char *request_buffer(){return (req_buf);} protected: void common_build(); void fill request_header(); Block(ehar) req_buf; RequestClass * stim_msg; Media media; String user_desc; int room; }; class MRMRRequestClass:public RequestClass{ public: MRMRRequestClass(char *header,CARD8 msg_typ,CARD8 msg_code,) int msg seq_no,int msg_len,char *msg_data,Connection *invoker): RequestClass(header,msg_typ,msg_code,msg_seq_no, msg_len,msg_data,invoker) {} virtual msg_obj_states action()=O; protected: int routing_action(); }; # endif Jan 511:56:15 1993 page 3 of msg.h <dp n="d89"/> obj_ man.h obj_man.h #ifndef_OBJ_MAN_H #difine_OBJ_MAN_H #include<common.h> #inciude<iface.b> #include<client.h> List_of_pdeclare(LocalSession) List_of_pdeclare(FrontEnd) List_of_pdeclare(ReqMR) List_of_pdeclare List_of_pdeclare List_of_paeclare class CommObjMgr{ public: CommObjMgr(MRInterface *iface); - CommObjMgr(){} virtual void process(MmConnection pconn)=O; int IsAlive(){return(is_alive);} protected: MRInterface * Iface; int is alive; int next_id; }; class LocalSessionMgr:public 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 FrontEndMgr:public GommObjMgr{ public: FrontEndMgr(MRInterface *iface):CommObjMgr(ifate) {is_alive=1;} void process(MmConnection pconn); void GetObjectList(List_of_p(FrontEnd)& fend_list) { fend_list=client_list;} private: void garbage collec(); void garbage_collect() List_of_p(FrontEnd) client_list; }; class ReqNMMgr:public CommObjMgr{ public: ReqNMMgr(MRInterface *iface); void process(MmConnection pconn); int send_to_NM(Message *msg); private: ReqNM *nm_obj; ); class ReqMRMgr:public 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 11:56:22 19939 Page 1 of obj_man.h <dp n="d90"/> obj_man.h ob.j_man.h }; ...List_of_pdeclare #endif Jan 5 11:56:1999 Page 2 of obj_man.h <dp n="d91"/> proto.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& type,CARD8& opcdoe, CARD32& seq CARD32& 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; }; # endif Jan5 11:56:14 1993 Page 1 of proto.h <dp n="d92"/> room.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_pdeclare class 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)& med_list); void resume media(kMediaDesc med); void resume media(List_of_p(MediaDesc)& 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 conferee class 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)& info); void get_meeting_partcipants(List(int)& 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)& 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 )& media_list); int reenter_meeting(int participant, List_of_p(MediaDesc)& media_list); private: void drop all_participants(); void change_owner(); int id; Room *room; CARD32 owner; MeetingAttrib attrib; MeetingStatus status; Jan 5 11:56:14 1993 Page 1 of room. h <dp n="d93"/> room.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_pdeclare class Room{ public: Room(int room_id,CARD32 rowner,RoomAttrib rattr, String& 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& user_desc, List(int)& part_list); int drop server(int server_id,Medis medis,String& user_desc); int suspend_server(int server_id,Medlia medis,String& user_desc); int resume_server(int server_id,Medis media,String& user_dese); int set_access_list(int server_id,Medis media,String& user_dese, List(int)& part list); int list servers(List_of_p(FullMediaDesc)& media_list); int is_server_present(int server_id); void associated_servers(List(int)& 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_pdeclare Jan 5 11:56:14 1993 Page 2 of room.h <dp n="d94"/> room.h room.h ...List_of_pdeclare // All int returns will be-ve if error. ALL ERR_CODEs are-ve class 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)& slist); int ActiveRoom(){return(active_room->Roomld()); } iht CreateRoom(CARD32 owner, RoomAttrib attrib,String& rname); int DestroyRoom(CARD32 requester,int id); int ListRooms(CARD32 requester, List(int)& rlist, List(String)& name_list); int ShowRoomStatus(CARD32 requester,int room_id, RoomStatus& stat, RoomLockStatus& lock_stat); int ShowRoomAttributes(CARD32 requester,int room_id,RoomAttrib& 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)& rlist); int ShowMeetingStatus(CARD32 requester,int meeting_id, List(ParticipantInfo)& info, int& p_room_id, int& owner, MeetingStatus& status); int ShowMeetRoomstatus(CARD32 requester,int room_id, List(ParticipantInfo)& info, int& p_meeting_id, int& owner,MeetingStatus& status); int ListMeetingParticipants(int meeting_id,List(int)& plist); int ShowMeetingAttributes(CARD32 requester,int meeting_id, MeetingAttrib& attrib); int AlterMeetingAttributes(CARD32 requester,int meeting_id, MeetingAttrib attrib); int ShowAssociatedRoom(CARD32 requester, int meeting_id, int& room_id); int ShowAssociatedMeeting(CARD32 requester,int room_id, int& 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& user_desc,List(int)& part list); int DropServer(int room_idt server_id,Mediamedia, String& user_desc); int SuspendServe(int room_id, int server-id, Media medm, Strm ~& user_desc); int ResumeServer(int room-id,int server_id,Media media,String& user_desc); int SetAccessList(int room_id, intt serverid, Media media, String& user desc, List(int)& part list); Lat ListServers(CARD32 requester, inst room_id, List of_p(FullMediaDesc)& media_list); int LeaveMeeting(CARD32 requester,int meeting_id, List of_p(MediaDesc)& media_list); int ReenterMeeting(CARD32 requester,int meeting_id, List_of_p(MediaDesc)& media_list); private: int generate_room_id(); void free_room_id(int id); int generate_meeting_id(); Jan 5 11:56:14 1993 Page s of room.h <dp n="d95"/> room.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; }; # endif Jan 5 11:56:14 1993 Page 4 of room.h <dp n="d96"/> server_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& pUserDesc, MediaServerConn& pConn, String& pInitializer, String& pOtherInfo); Media MediaType; String UserDesc; String Initializer; String OtherInfo; MediaServerConn Conn; }; atruet MRServerConnInfo { MRServerConnInfo(String& 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)& plist); void ListAllMRServerConnInfo(List_of_p(MRServerConnInfo)& slist); MediaServerInfo* ListMediaServerInfo(Media med, String& key); int in_my_range(int id){return((id>=MyStartRange && id <=MyEndRange)?1∶O);} int server_for_id(int id,String& mach, int& port); void default_name server(String& mach,int& port); void my_range(Range& 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; }; #endif Jan 5 11:56:21 1993 Page 1 of seroer_reg.h <dp n="d97"/> client.C client.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()==MmEnum::MmFalse){\ deactivate_self();\ return(-l);\ } #define VOID_CHECK_MfC_CONNECTION(con)if(conn->IsAssigned()==MmEnum::MmFalse){\ deactivate_self()\ return;\ Blockimplement(char) Blockimplement int Connection::header len=MSG HEADER LEN; //MR Interface * Connection::Iface=(MR Interface *)NULL; /Block(char)Connection::buf(INIT_MAX_BUFLEN); Connection::Connection(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 11:56:10 1993 Page 1 of client. C <dp n="d98"/> client. C client. C if(send(tmpbuf,MSG_HEADER_LEN)==-1){ ...send_disconnect }deactivate_self(); int Connection:send(char *data,int len) send { CHECK_MMC_CONNECTION(conn) if (NW->Write(conn,data,len)<len){ deactivate_self(); return(-l); } return(O); int Connection:send(Message*msg) send { CHECK_MMC_CONNCTION(conn) if(NW_>Write(conn,msg_>msg_header(),MSG_HEADER_LEN)<MSG_HEADER_LEN){ deactivate self(); return(-i); CHECK_MMC_CONNECTION(conn) if(NW_>Write(conn,msg->msg_data),msg->msg_len())<msg->msg_len()){ deactivate_self(); return(-1); return(O); int Connection:send(MedServRequestClass*msg) send { CHECK_MMC_CONNCETION(conn) if(NW->Write(conn,msg->msg_headeer(),MSG_HEADER_LEN)<MSG_HEADER_LEN){ deactivate_self(); return(-1); } CHECK_MMC_CONNECTION(conn) if(NW->Write(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(); # endif Jan 5 11:56:10 1993 Page 2 of client.C <dp n="d99"/> client. 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_msg Cnnection::Connection() 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 11:56:10 1993 Page 3 of client.C <dp n="d100"/> client. C cllent. C } ...process_msg void 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.C <dp n="d101"/> client. C client. C void 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 && 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_msg Jan 5 11:56:10 1993 Page 5 of client. C <dp n="d102"/> eve_msg. C eve_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)& 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(); EveTemplate2:EveTemplate2(char *header,CARD8 msg_typ, CARD8 msg_code,int msg_seq_no,int msg_len,char*msg_data, Connection *invoker,List(MmConneection)& 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)& server_list, int src,int room_id,int meeting_id,List(int)& 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)& server_list,int src, int room_id,int meeting_id,Media med,String& 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(); } EveTemplate5::EveTemplate5(char *header,CARD8 msg typ, CARD8 msg_code,int msg_seq_no,int msg_len,char *msg_data Connection *invoker,List(MmConnection)& 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)& sever_list,int src, int room_id,int meeting_id,Media med,String& user_desc, List(int)& 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 11:56:10 1993 Page 1 of eve_msg.C <dp n="d103"/> eve_msg.C eve_msg.C } JAn 5 11:56:10 1999 Page 2 of eve_msg.C <dp n="d104"/> event.C event. C #include<event.h> #inelude <eve msg.h> #include<iface.h> #include<med serv.h> #include<obj_man.h> #include<room.h> Listimplement(MmConnection) Listmplement Event Notifier::EventNotifier(MRInterface *iface) EventNotifier { Iface=iface; seq_no=O; } void EventNotifier::server_conn_list(int room_id, List(MmConnection)& 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(); #endif void EventNotifier::fend_conn_list(list(MmConnection)& 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 11:56:10 1993 Page 1 of event.C <dp n="d105"/> event. 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 EventNotifier::Template2(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 EventNotifier::Template4(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)& part_list) { List(MmConnection) conn_list; EveTemplate6 *eve; Jan 5 11:56:10 1993 Page 2 of event.C <dp n="d106"/> event. C event. C #ifdef DEBUG ... Temptate2 cout<<″Template6:PLIST_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 EventNotier:AddeParticipant(int room_id,int src, int meeting_id,int participant) { Templatel(EVE_ADDED_PARTICIPANT,rOOm_id,src,meeting_id, } participant); void EventNotifier::DroppedPartcipant(int room_id,int src, int meeting_id,int participant) { Templatel(EVE_DROPPED_PARTICIPANTT,room_id,src,mecting_id, } partcipant); void EventNotifier::LeftMeeting(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 EventNotifier::RoomDestroyed(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 EventNotifier:RoomUnlocked(int room_id,int src) RoomUnlocked { Jan 5 11:56:10 1993 Page 3 of event. C <dp n="d107"/> event. C event. C Template2(EVE_ROOM_UNLOGKED,room_id,src,room_id); ...RoomUnloeked int src, void EventNotifier:MeetingSuspended(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)& part_list) { Template6(EVE_SERVER_ADDED,src,room_id,meeting_id, med,user_desc,part_list); } void EventNotifier::ServerDropped(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 EventNotifier::ServerAccessListSet(int src,int room id, int meeting_id,Media med,String user_desc,List(int)& part_list) { Template6(EVE_SERVER_ACCESS_LIST_SET,src,room_id, meeting_id, med,user_desc,part_list); } Jan 5 11:56:10 1993 Page 4 of event. c <dp n="d108"/> generator. 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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen 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 11:56:11 1993 Page 1 of generator. C <dp n="d109"/> generator. C generator.C Message * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen 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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_ShowMeetRoomStatus(char * header,CARD8 type,CARD8 opcode,CARD32 seq Jan 5 11:56:11 1993 Page 2 of generator.C <dp n="d110"/> generator. 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 *ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen 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 * ProtoGenerator::Gen_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 *ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 11:56:11 1999 Page 3 of generator.C <dp n="d111"/> generator.C generator. C return(new ResumeMeeting(header,type,opcode,seq,len,data,invoker)); Message * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtGenerator::Gen_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 * ProtoGenerator::Gen 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 * ProtoGenerator::Gen_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 * ProtoGenerator::Gen_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 * ProtoGenertor::Gen_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 * ProtoGenerator::Gen 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 * ProtoGenerator::Gen 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 11:56:11 1993 Page 4 of generator.C <dp n="d112"/> generator. C generator.C Message * ProtoGenerstor::Gen 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 *ProtoGenerator::Gen_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 * ProtoGenerator:Gen_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 * ProtoGenerator::Gen_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 * ProtoGenerator:Gen_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 * ProtoGenertor::Gen_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)); } Jan 5 11:56:11 1993 Page 5 of generator.C <dp n="d113"/> iface.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<obj_man.h> #include<stream.h> #include<med_serv.h> #include<event.h> //#include<Args.h> List_of_pimplement(CommObjMgr) List_of_pimplement MRInterface *G_Iface; main(int argc,char *argv ()) main { cout.<< ″Staring Server\n″; cout.flush(); G_Iface=new MRInterface(); G_Iface->startup(argc,argv); } void MRInterface::startup (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,″f:p:i:o:″))!=-1){ switch(c){ case ′p′: port=atoi(optarg); break; case ′r: FE_port=atoi(optarg); bresk; esse′i′: in_file=optarg; bresk; default: cout<<″Usage:MRServer[-p<client_port>][-f<frontend_port>][-i in_ exit(1); } } if(NW->ActivateServerPort(port)!= MmRnum::MmOK){ cout<< ″Cannot open listening port...\n″;cout.flush(); exit(1); } if(NW->ActivateServerPort(FE_port)!= MmEnum::MmOK){ cout<< ″Cannot open front end listening port...\n; cout.flush(); exit(1); Jan 5 11:56:11 1993 Page 1 of iface.C <dp n="d114"/> iface.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 11:46:11 1993 Page 2 of iface.C <dp n="d115"/> iface. 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(); void MRInterface::main_loop() main_loop { List_of_piter(CommObjMgr)olist(object_list); CommObjMgr *obj; // NW->Block(); for (;;){ if(NW->Select()!=MmEnum::MmOK) continue; if(NW->CurrentConnection()->ServerPort()==FE_port){ // Special ease:msg from front end FEMgr->process(NW->CurrentConnection()); } elae{ oiist.reset(); while (olist.next(obj)) obj->process(NW->CurrentConnection()); } void MRInterface::garbage_collect() garbage_collect MRInterface::″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 11:56:11 1993 Page 3 of iface. C <dp n="d116"/> iface. C iface. C exit(1); } shatdown Jan 5 11:56:11 1993 Page 6 of iface.C <dp n="d117"/> med_serv.C med_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_pimplement List_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 MediaServer::process_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 Server::Len:″<<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 && m->mgs_seq_no()==stimulant()){ if(type==ERROR_GEN_SERVER && 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 11:56:10 1993 Page 1 of med_serv.C <dp n="d118"/> med_serv.C med_serv. C } ...process_msg elac (void) m->special_action(buf,msg_len); msg_list.remove_prev(); delete m; } } // process_msg int MediaServer::send_request_msg(MedServtClass *medserv_msg) send_request_msg { msg_list.insert_next(medserv_msg); return(send(medserv_msg)); } MediaServer::″MediaSeever() MediaServer { # ifdef DEBUG cout <<″MediaServer″<<(int)Medium<< ″Deleted\n″;cout.flush(); # endif Iface->RoomManager()->MediaServerDied(id); } //////////////////////////////////// //MediaServerMgr methods ////////////////////////////////// void MediaServerMgr::process(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 MediaServerMgr::init_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 11:56:10 19939 Page 2 of med_serrv.C <dp n="d119"/> med_serv.C med_serv.C while(slist.next(med)){ ...MediaServerMgr dummy=(med->user_desc()==user_desc)?1:0; if(dummy && 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 && 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 11:56:10 1993 Page S of med_serv.C <dp n="d120"/> med_serv.C med_serv.C break; ... get_media_server return(med); int MediaServerMgr::AddServer(RequestClass *msg,CARD32 requeser,int room_id, Media media String& user_desc,List(int)& 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 MediaServerMgr::DropServer(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 MediaServerMgr::DropServer(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 MediaServerMgr::SuspendServer(RequestClass *msg,CARD32 requester, int room_id,Media media,String& 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 11:56:10 1993 Page 4 of med_serv.C <dp n="d121"/> med_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 MediaServerMgr::ResumeServer(RequestClass *msg,CARD32 requester, int room_id,Media media,String& 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 MediaServerMgr::SetServerAccessList(RequestClass *msg, CARD32 requesr,int room_id,Media media,String& user desc, List(int)& 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 MediaServerMgr::send(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 MediaServerMgr::send_to_all_servers(char *data,int len) sent_to_all_servers { List_of_piter(MediaServer) slist(server_list); MediaServer *med=(MediaServer *)NULL; Jan 5 11:56:10 1993 Page 5 of med_serv.C <dp n="d122"/> med_serv. C med_serv. C slist.rese (); ...send_to_all_sereera while(slist.next(med)) (void)med->send(data,len); void MediaServerMgr::garbage_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 MediaServerMgr::get_server_connection(Media m, String& user_desc, Media ServerConn& 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&& dummy) return(med->get_server_connection(conn)); } return(-1); int MediaServerMgr::get_manager connection(Media m, String& user desc, MediaServerC onn& 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 && dummy) return(med->get_manager_connection(conn)); } return(-1); void MediaServerMgr::set_manager_port(Media m,String& 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 && dummy) med->set_manager_port(port); } Jan 5 11:56:10 1993 Page 6 of med_serv.C <dp n="d123"/> med_serv.C med_serv.C int MediaServerMgr::get_server_id(Media m,String& 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 && dummy) return(med->ServerId()); } return(-1); } int MediaServerMgr:get_server_info(int server,Media& m, { String& 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 MediaServrMgr::ServerConnection(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 11:56:10 1993 Page 7 of med_serv.C
medserv_msg. C medserv_msg.C //return(e_MSG_PENDING); ...action } //GetServerInfo::acction void REP_GetServerInfo::r_sction(MedisServerConn& 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 /////////////////////////////////// AssociateServer::AssociateServer(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)& plist, Media pmedia, String& 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 AssociateServer::special_action(Block(ehar)& 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 &&(err=RMgr->AddServer (room,server_id,media,user_desc,part_list))>=O && 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 && stim_msg){ Jan 5 11:56:09 1993 Page 5 of medserv_msg. C <dp n="d129"/> medserv_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); } } DisassociateServer::DisassociateServer(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& puser_desc): MedServRequestClass(stimulant,header,msg_typ, msg_code,msg_seq_no,msg_len,msg_data,invoker, proom,pmedia,puser_desc) { common_build(); } void DisassociateServer::special_action(Block(char)& 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 && stim_msg){ (void)stim_msg->error_obj()->success return(REPLY_MR_SERVER, (CARD32)stimulant()->msg_code(), (CARD32)stimulant()->msg_seq_no()); } if(err<O && 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 dServer::GenSuspendServer(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& puser desc): MedServRequestClass(stimulant,header,msg_typ, msg_code,msg_seq_no,msg_len,msg_data,involrer, proom, pmedia,puser_desc) { common_build(); } void GenSuspendServer::special action(Block(char)& 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 && 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 && stim_msg){ (void)stimulant()->error_obj()->e_action(ERROR_MR_SERVER, (CARD32)stimulant()->msg_code(), (CARD32)stimulant()->msg_seq_no(), --err); Jan 5 11:56:09 1993 Page 6 of medserv_msg. C <dp n="d130"/> medserv_msg. C medserv_msg.C stim_msg->MsgSource)->serviced_msg(stim_msg); ...r_action } } GenResumeServer::GenResumeServer(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& puser_desc): MedServRequestClass(stimulant,header,msg_typ, msg_code,msg_seq_no,msg_len,msg_data,invoker, proom,pmedia,puser_desc) { common_build(); void GenResumeServer:special_action(Block(char)& 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&& 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 && 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); } } SetAccessList::SetAccessList(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)& plist, Media pmedia,String& 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 SetAccessList::special_action(Block(char)& 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 && stim_msg){ (void) stim_msg->error_obj()->successr_obj()->sccess_return(REPLY_MR_SERVER, Jan 5 11:56:09 1993 Page 7 of medserv_msg. C <dp n="d131"/> medserv_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 && 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 11:56:09 1993 Page 8 of medserv_msg.C <dp n="d132"/> mr_msg.C mr_msg.C #define DUMMY_CLIENT1 #include<iface.h> #include<client.h> #include<iostream.h> #include<room.h> msg_obj_states CreateRoom::action() 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_SERVER:CreateRoom/″<<seq_no<<“/” << len<< ″ Owner:″<<owner<<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 ID:″<<id<<endl;cout.flush(); #endif reply=new REP_CreateRoom(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL,Invoker); if(!reply){ cout<<″Fatal Mem Alloc. Error:″<<_FILE_<<″″<<_LINE_<<endl; return(e_MSG_SERVICED); } reply->r_action(id); delete reply; return(e_MSG_SERVICED); } //CreateRoom::action void REP_CreateRoom::r_action(int id) r_action { Conv->IntToBuf(id,((char*)rep_buf)+pos);pos+=4; rep_len=1; send_reply(); } msg_obj_states DestroyRoom::action() action { int room_id; int requester; # ifdef DEBUG cout<<″DestroyRoom called\n″;cout.flush(); # endif Jan 5 11:56:11 1993 Page 1 of mr_msg.C <dp n="d133"/> mr_msg. C mr_msg. C ...action 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+poss,res_len,nbytes, requester);pos+=nbytes; (void)Conv->BufToCARD32(data+poss,res_len,nbytes,room_id);pos+=nbytes; # ifdef DUMP_MSG cout<<″REQUEST_MR_SERVER:DestroyRoom/″<<seq_no<<″/″ << len<< ″RoomId:″<< room_id<<endl; cout.flush(); #endif if((err=RMgr->DestroyRoom(requester,room_id))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->success_return(REPLY_MR_SERVER,opcode,seq_no)); } msg_obj_states ListRooms::action() action { CARD32 requester; List(int)room_list; List(Strig)name_list; #ifdef DEBUG cout<<″ListRooms called\n″;cout.flush(); #endif if((err=routing_action())<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); else if(err>O) (void)Conv->BufToCARD32(data+pos,res_len,nbytes,requester);pos+=nbytes; if((err=RMgr->ListRooms(requester,room_list,name_list))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); reply=new REP_ListRooms(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL,Invoker); if (!reply){ cout<<″Fatal Mem Alloc.Error:″<<_FILE_ <<″ ″ <<_LINE_<<endl; return(e_MSG_SERVICED); } reply->r_action(room_list,name_list); delete reply; return(e_MSG_SERVICED); } //ListRooms::action void REP_ListRooms::r_ation(List(int)& room_list, List(String)& name_list) { int id,list_len=room_list.length(); rep_buf.reserve(4+list_len*4); if (list_len){ room_list.reset(); name.list.reset(); Conv->IntToBuf(list_len,((char *)rep_buf)+pos);pos+=4; #ifdef DEBUG cout<< ″RoomList Len:″<<list_len<<″:List″;cout.flush(); #endif while(room_list.next(id)){ String name; Jan 5 11:56:11 1993 Page 2 of_msg.C <dp n="d134"/> mr_msg.C mr_msg.C name list.next(name); ...action Conv>IntToBuf(id,((char *)rep_buf)+pos);pos+=4; Conv->IntToBuf(name.length(),((char *)rep_buf)+pos);pos+=4; strcpy(((char *)rep_buf+pos),name); pos+=name.length(); # ifdef DEBUG cout<<″″<< id<< ″″; # endif } } rep_len=len_in_CARD32(pos-MSG_HEADER_LEN); send_reply(); } msg_obj_states ShowRoomStatus::action() action { int room_id; CARD2 requester; RoomStatus stat; RoomLockStatus lock_stat; # ifdef DEBUG cout<<″ShowRoomStatus caled\n″;cout.flush(); #endif if((err=routing_action())<O) return(error->e_action(ERROR_MRR_SERVER,opcode,seq_no,-err)); else if(err>O) return(e_MSG_PENDING); (void)Conv->BufToCARD32(data+pos,res_len,nbytes,requester);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes,room_id);pos+=nbytes; if((err=RMgr->ShowRoomStatus(requester,room_id,stat,lock_stat))<O) return(errr->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); reply =new REP_ShowRoomStatus(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL,Invoker); if (!reply) { cout<<″Fatal Mem Alloc.Error:″<<_FILE<<″″<<_LINE_<<endl; return(e_MSG_SERVICED); reply->r_action(stat,lock_stat); delete reply; return(e_MSG_SERVICED); } //ShowRoomStatus::action void REP_ShowRoomStatus::r_action(RoomStatus stat,RoomLockStatus lock_stat) r_action { rep_buf[pos++]=(char)stat; rep_buf[pos++]=(char)lock_stat; #ifdef DEBUG cout<<″RoomStatus:″<<(int) stat<<″LockStat:″<<(int)lock_stat<<endl;cout.flush( #endif replen=1; send_reply(); msg_obj_states ShowRoomAttributes::action() action int room_id; CARD32 requester; RoomAttrib attrib; Jan 5 11:56:11 1993 Page s of mr_msg.C <dp n="d135"/> mr_msg. C mr_msg.C #ifdef DEBUG cout<<″ShowRoomAttributes called\n″;cout.flush(); …action #endif 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,requester);pos+= nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes,room_id);pos+= nbytes; if((err=RMgr->SbowRoomAttributes(requester,room_id,attrib))< reply=new REP_ShowRoomAttributes(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL, Invoker); ir(!reply){ cout<<″Fatal Mem Alloc. Error:″<<_FILE_<<″″<<LINE<<endl; return(e_MSG_SERVICED); } reply->r_action(attrib); delete reply; return(e_MSG_SERVICED); } //ShowRoomAttributes::action void REP_ShowRoomAttributes::r_action(RoomAttrib attrib) r_action { rep_buf[pos++]=(char)attrib; rep_len=1; # ifdef DEBUG cout<< ″RootAttributes:″<<(int) attrib<<endl;cout.flush(); # endif rep_len=1; send_reply(); } msg_obj_states AlterRoomAttributes::action(0 action { int room_id; CARD32 requester; RoomAttrib attrib; # ifdef DEBUG cout<<″AlterRoomAttributes called\n″;cout.flush(); # endif if((err=routing_action())<O) return(error->e_action(ERROR,opcode,seq_no,-err)); else if(err>O) return(e_MSG_PENDING); (void)Conv->BufToCARD32(data+pos,res_len,nbytes,requester);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes,room_id);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes,(int)attrib);pos+=nbytes; if((err=RMgr->AlterRoomAttributes(requester,room_id,attrib))< return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->success_return(REPLY_MR_SERVER,opcode,seq_no); } //AlterRoomAttributes::action msg_ob_states LockRoom::action() action { int room_id,nbytes,pos=O; CARD32 requester; Jen 5 11:56:11 1993 Page 4 of mr_msg.C <dp n="d136"/> mr_msg. C mr_msg.C int err,res_len=len; ...action # ifdef DEBUG cout<<″LockRoom called\n″;cout.flush(); # endif 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, requester);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, room_id);pos+=nbytes; if((err=RMgr->LockRoom(requester,roomid))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->succest_return(REPLY_MR-SERVER,opcode,seq_no)); } //LockRoom::action msg_obj_states UnlockRoom::action() action { int room_id; CARD32 requester; # ifdef DEBUG cout<<″UnlockRoom called\n″;cout.flush(); # endif 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->BufToCAR D32(data+pos,res_len,nbytes,requester);pos+= nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, room_id);pos+=nbytes; if((err=RMgr->UnlockRoom(requester,room_id))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->success_return(REPLY_MR_SERVER,opcode,seo_no)); } //UnlockRoom::action msg_obj_states S howAssocist edRoo m::action() action { int meeting_id, room_id; CARD32 requester; # ifdef DEBUG cout<<″ShowAssociatedRoom called\n″;cout.flush(); # endif 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)Cony->BufToCARD32(data+pos,res_len,nbytes,requester);pos+=nbytes; void)Conv->BufToCARD32(data+pos,res_len,nbytes,meeting_id);pos+= nbytes; if((err=RMgr->ShowAssociatedRoom(requester,meeting_id,room_id))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); reply=new REP_ShowAssociatedRoom(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL,Invoker); if(!reply){ cout<<″Fatal Mem Alloc. Error:″<<_FILE_<<″″_LINE_<<endl; return(e_MSG_SERVICED); Jan 5 11:56:11 1993 Page 5 of mr_msg.C <dp n="d137"/> mr_msg.C mr_msg. C } ...action reply->r_action(room_id); delete reply; return(e_MSG_SERVICED); }//ShowAssociatedRoom::action void REP_ShowAssoeiatedRoom::r_action(int room_id) r_action # ifdef DEBUG cout<< ″RoomId:″<<room_id<<endl;cout.flush(); # endif Conv->IntToBuf(room_id, ((ehar *)rep_buf)+pos); poe+=4; rep_len=1; send_reply(); } msg_ob j_states ShowAssociatedMeetting::action() action { int meeting_id, room_id; CARD32 requestter; # ifdef DEBUG cout<< ″ShowAssociatedMeeting called\n″;cout.flush(); # endif if((err=routting_acttion())<O) (return(error->e action(ERROR_MR_SERVER,opcode,seq_no,-err)); else if(err>O) return(e_MSG_PENDING); (void)Conv->BufToCARD32(data+poss,res_len,nbytes,requester);pos+=nbytes; (void)Conv->BufToCARD32(data+poss,res_len,nbytes, room_id); pos+=nbytes; if((err=RMgr->ShowAssociatedMeeting(requester,room_id, meeting_id))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); reply=new REP_ShowAssociatedMeeting(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL,Invoker); if(!reply){ cout<< ″Fatal Mem Alloc. Error:″<< _FILE_<<″″<< LINE<<endl; return(e_MSG_SERVICED); } reply->r_action(meeting_id); delete reply; return(e_MSG_SERVICED); } //S howAssociatedMeeting::action void REP_ShowAssociatedMeeting:r_action(int meeting_id) r_action { # ifdef DEBUG cout<< ″meetingId:″<< meetingg_id<<endl;cout.flush(); # endif Conv->lnttToBuf(meeting_id,((char *)rep_buf)+pos); pos+=4; rep_len=1; send_reply(); msg_obj_states CreateMeeting::action() action { int id; MeetingAttrib mattrib; CARD32 owner, room_id; if((err=routing_action())<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); Jan 5 11:56:11 1993 page 6 of mr_msg. C <dp n="d138"/> mr_msg.C mr_msg. C else if(err>O) ...action return(e_MSG_PENDING); (void)Conv->BufToCARD32(data+poss,res_len,nbytes, owner);pos+=nbytes; (void)Conv->BufToCARD32(data+poss,res_len,nbytes,room_id);pos+=nbytes; (void)Conv->BufToCARD32(data+poss,res_len,nbytes,(int)mattrib);pos+=nbytes; #ifdef DUMP_MSG cout<< ″REQUEST_MR_SERVER:CreateMeeting/″<<seq_no<<″/″ << len<<″Owner:″<<owner<<endl; cout.flush(); # endif id=RMgr->CreateMeeting(owner,room_id,mattrib); if(id<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no, -id)); # ifdef DEBUG cout<<″NEW ID: ″<<id<<endl;cout.flush(); # endif reply=new REP_CreateMeeting(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL,Invoker); if (!reply){ cout<<″Fatal Mem Alloc. Error:″<<_FILE_<<″″<<_LINE_<<endl; return(e_MSG_SERVICED); } reply->r_action(id); delete reply; return(e_MSG_SERVICED); } //CreateMeeting::action void REP_CreateMeeting::r_action(int id) r_action { Conv->InToBuf(id,((char *)rep_buf)+pos);pos+=4; rep_len=1; send_reply(); } msg_obj_seates DestroyMeeting::action() action { int meeting_id; int requester; # ifdef DEBUG cout<<″DesroyMeeting called\n″;cout.flush(); # endif 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+poss,res_len,nbytes,requester);pos+=nbytes; (void)Conv->BufToCARD32(data+poss,res_len,nbytes,meeting_id); pos+= nbytes; # ifdef DUMP_MSG cout<< ″REQUEST_MR_SERVER:DestroyMeeting/″<<seq_no<<″/″ << len<<″MeetingId:″<<meeting_id<<endl; cout.flush(); # endif if((err=RMgr->DestoryMeeting(requester,meeting_id))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->success_return(REPLY_MR_SERVER,opcode,seq_no)); } Jan 5 11:56:11 1993 Page 7 of mr_msg.C <dp n="d139"/> mr_msg. C mr_msg. C ...action msg_obj_states ListMeetings::action() action CARD32 requester; List(int) meeting_list; #ifdef DEBUG cout << ″ListMeetings callde\n″; cout.flush(); #endif if((err=routing_action())<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq,opcode,seq_no,-err)); else if(err>O) return(e_MSG_PENDING); (void)Conv->BufToCARD32(data+pos,res_len,nbytes,requester);pos+=nbytes; if((err=RMgr->ListMeetings(requester,meeting list))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); reply=new REQ_ListMeetings(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL,Invoker); if(!reply){ cout <<″Fatal Mem Alloc. Error:″<<_FILE_<<″″<<_LINE_<<_LINE_<<endl; return(e_MSG_SERVICED); } reply->r_action(meeting_list); delete reply; return(e_MSG_SERVICED); } /ListMeeting::action void REP_ListMeetings::r_action(List(int)& meeting_list) List { int id, list_len=meeting_list.length(); rep_buf.reserve(4+list_len*4); if (list_len){ meeting_list.reset(); Conv->IntToBuf(list_len,((char *)rep_buf)+pos);pos+=4; # ifdef DEBUG cout <<″MeetingList Len:″<<list_len<<″:List″;cout.flush(); # endif while(meeting_list.next(id)){ Conv->IntToBuf(id,((char *)rep_buf)+pos);pos+=4; # ifdef DEBUG cout<< ″″<< id << ″″; # endif } } rep_len=len_in_CARD32(pos-MSG_HEADER_LEN); send_reply(); } msg_obj_states ShowMeetingStatus::action() action { int room_id,meeting_id,owner; CARD32 requester; List(ParticipantInfo) info; MeetingStatus status; # ifdef DEBUG cout<< ″ShowMeetingStatus called\n″;cout.flush(); # endif if((err= routing_action())<O) Jan 5 11:56:11 1993 Page 8 of mr_msg.C <dp n="d140"/> mr_msg.C mr_msg. C return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); ...action else if(err>O) return(e_MSG_PENDING); (void)Conv->BufToCARD32(data+pos,res_len,nbyes,requester);pos+=nbytes); (void)Conv->BufToCARD32(data+pos,res_len,nbyes, meeting_id);pos+=nbytes; if((err=RMgr->ShowMeetingStatus(requester,meeting_id, info,room_id,owner,status))<O){ return(error->e_action(ERROR_MR_SERVER,opcode,seq_no, -err)); reply=new REP_ShowMeetingStatus(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL,Invoker); if(!reply){ cout<<″Fatal Mem Alloc. Error:″<<_FILE_<<″″<<_LINE_<<endl; return(e_MSG_SERVICED); } reply>r_action(info,room_id,owner,status); delete reply; return(e_MSG_SERVICED); } //ShowMeetingStatus::action void REP_ShowMeetingStatus::r_action(List(ParticipantInfo)& info, int room_id,int owner,MeetingStatus status) ParticipantInfo node; FullMediaDesc *m; List_of_p(FullMediaDesc) med_list; int list_len=info.length(); # ifdef DEBUG # endif rep_buf:reserve(9+list_len*(8+MAX_MEDIA_TYPES)); rep_buf[pos++]=(char) status; Conv->IntToBuf(room_id,((char *)rep_buf)+pos);pos+=4; Conv->IntToBuf(owner,((char *)rep_buf)+pos);pos+=4; Conv->IntToBuf(list_len,((char *)rep_buf)+pos);pos+=4; # ifdef DEBUG cout<< ″infolist len:″ << list_len<<″:List″; # endif if(list_len){ innfo.reset(); while(info.next(node)){ Conv->InToBuf(node.participant, ((char *)rep_buf)+pos);pos+=4; mde_list=node.media_list;med_list.reset(); Conv->IntToBuf(med_list.length(),((char *)rep_buf)+pos);pos+=4; while(med_list.next(m)){ rep_buf[pos++]=(char)m->serer; Conv->IntToBuf(m->user_desc.length(),((char *)rep_buf)+pos);pos+=4; strcpy((char *)rep_buf)+pos,m->user_desc); pos+=m->user_desc.length(); rep_buf[pos++]=(char)m->status; } } } rep_len=len_in_CARD32(pos-MSG_HEADER_LEN); send_reply(); } msg_obj_states ShowMeetRoomStatus::action() action { int_room_id,meeting_id,owner; CARD requester; List(ParticipantInfo)info; MeetingStatus status; Jan 5 11:56:11 1993 Page 9 of mr_ msg. C <dp n="d141"/> mr_msg.C mr_msg.C #ifdef DEBUG …action cout<<″ShowMeetRoomStatus called\n″;cout.flush(); #endif if((err=routing_action())<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); else if(err>O) return(e_MSG_PENDING); voidConv->BufToCARD32(data+pos,res_len,nbytes,requester);pos+=nbytes; voidConv->BufToCARD32(data+pos,res_len,nbytes,room_id);pos+=nbytes; if((err.=RMgr->ShowMeetRoomStatus(requester,room_id, info,meeting_id,owner,status))<O){ } return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); reply=new REP_ShowMeetRoomStatus(NULL,REPLY_MR_SERVER,opcode,seq_no,O, NULL,Invoker); if(!reply){ cout<<″Fatal Mem Alloc. Error:″<<_FILE<<″″<<_LINE_<<endl; return(e_MSG_SERVICED); } reply->r_action(info,meeting_id,owner,status); delete reply; return(e_MSG_SERVICED); } //ShowMeetingStatus::action void REP_ShowMeetRoomStatus::r action(List(ParticipantInfo)& info, { int meeting_id,int owner,MeetingStatus status) ParticipantInfo node; FuIImediaDesc *m; List of_p(FuILMediaDesc) med_list; int list_len=info.length(); #ifdef DEBUG #endif rep_buf.reserve(g+list_len*(8+MAX_MEDIA_TYPES)); req_buf(pos++)=(char)status; Conv->IntToBuf(meeting_id, ((char *)rep_buf)+pos);pos+=4; Conv->IntToBuf(owner,((char*)rep_buf)+pos;pos+=4; Conv->IntToBuf(list_len,((char *)req_buf+pos);pos+=4; #ifdef DEBUG cout<<″infolist len:″<<list_len<<″:list″; #endif if(list_len){ info.reset(); while(info.next(node){ Conv->IntToBuf(node.paricipant, ((char *)rep_buf)+pos);pos+=4; med_list=node.media_list;med_list.reset(); Couv->IntToBuf(med_list.length(),((char *)rep_buf)+pos);pos+=4; while(med_list.next(m)){ rep_buf[pos++]=(char)m->server; Conv->IntToBuf(m->user_desc.lenth(),((char *)rep_buf)+pos);pos+=4; strcpy(((char *)req_buf)+pos,m->user_desc); pos+=m->userdesc.length(); rep_buf(pos++)=(char)m->status; } } rep_len=len_in_CARD32(pos-MSG_HEADER_LEN); send_reply(); } Jan 5 11:56:11 1993 Page 10 of mr_msg. C <dp n="d142"/> mr_msg. C mr_msg. C msg_obj_states ShowMeetingAttributes::action() ...action action int meeting_id; CARD32 requester; MeetingAttrib attrib; # ifdef DEBUG cout<<″ShowMeetingAttributes called\n″;cout.flush(); # endif 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,requester);pos+=nbytes; void)Conv->BufToCARD32(data+pos,res_len,nbytes,meeting_id);pos+=nbytes; if((err=RMgr->ShowMeetingAttributes(requester, meeting_id,attrib))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); reply=new REP_ShowMeetingAttributes(NULL,REPLY_MR_SERVER,opcode,seq_no,O, if(!reply){ NULL,Invoker); cout<<″Fatal Mem Alloc. Error:″ <<_FILE_<< ″″<<_LINE_<<endl; return(e_MSG_SERVICED); } reply->r_action(attrib); delete reply; return(e_MSG_SERVICED); }//ShowMeetingAttributes::action void REP_ShowMeetingAttributes::r_action(MeetingAttrib attrib) r_action rep buf[pos++]=(char) attrib; rep_len=1; # ifdef DEBUG cout<< ″MeetingAttributes:″<<(int) attrib<<endl;cout.flush(); # endif rep_len=1; send_reply(); } msg_obj_states AlterMeetingAttributes::action() action { int meeting_id; CARD32 requester; MeetingAttrib attrib; # ifdef DEBUG cout<< ″AlterMeetingAttributes called\n″;cout.flush(); # endif 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,requester); pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes,meeting_id);pos+=nbytes; (void) Conv->BufToCARD32(data+pos,res_len,nbytes,(int)attrib);pos+=nbytes; if((err=RMgr->AlterMeetingAttributes(requester,meeting_id,attrib))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->success_return(REPLY_MR_SERVER,opcode,seq_no)); Jan 5 11:56:11 1993 Page 11 of mr_msg.C <dp n="d143"/> mr_msg.C mr_msg. C } //AlterMeetingAttributes::action ..action msg_obj_st ates AddParticipant ::action() action int meeting_id; CARD32 requester; int participant; # ifdef DEBUG cout<< ″AddParticipant called\n″;cout.flush(); # endif 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,requester);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes,meeting_id);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, participant);pos+=nbytes; if((err=RMgr->AddParticipant{requester,meeting_id,participant))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->success_return(REPLY_MR_SERVER,opcode,seq_no); } //AddParticipant::action msg_obj_states DropParticipant::action() action { int meeting_id; CARD32 requester; int participant; # ifdef DEBUG cout<< ″DropParticipant called\n″;cout.flush(); # endif 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,requester);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, meeting_id);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, participant);pos+=nbytes; if((err=RMgr->DropParticipant(requester,meeting_id,participant))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->success_(REPLY_MR_SERVER,opcode,seq_no); } //DropParticipant::action msg_obj_states SuspendMeeting::action() action { int meeting_id; CARD32 requester; # ifdef DEBUG cout<<″SuspendMeeting called\n″; cout.flush(); # endif 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,requester);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes meeting_id);pos+=nbytes; if((err=RMgr->SuspendMeeting(requester,meeting_id))<O) Jan 5 11:56:11 1993 Page 12 of mr_msg.C <dp n="d144"/> mr_msg.C mr_msg.C return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); ...action // return(error->success_return(REPLY_MR_SERVER,opcode,seq_no); } //SuspendMeeting::action msg_obj_states ResumeMeeting::action() action int meeting_id; CARD32 requester; # ifdef DEBUG cout<<″ResumeMeeting called\n″;cout.flush(); # endif 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,ren_len,nbytes,requester);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,ren_len,nbytes,meeting_id);pos+=nbytes; if((err=RMgr->ResumeMeeting(requester,meeting_id))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->success_return(REPLY_MR_SERVER,opcode,seq no)); } //ResumeMeeting::action msg_obj_states LeaveMeeting::action() action int meeting_id; CARD2 requester; int list len; int partcipant; List_of_p(MediaDesc)med_list; MediaDesc *m; # ifdef DEBUG cout<< ″LeaveMeeting called\n″; cout.flush(); # endif 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,requester);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, meeting_id);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, participant);pos+=nbytes; if ((err=RMgr->LesveMeeting(requester,meeting_id,med_list))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(error->success_return(REPLY_MR_SERVER,opcode,seq_no)); } //LeaveMeeting::action msg_obj_states ReenterMeeting::action() action int meeting_id; CARD32 requester; int list_len; int partcipant; List_of_p(MediaDesc) med_list; MediaDesc *m; # ifdef DEBUG cout<<″ReenterMeeting called\n″; cout.flush(); # endif if((err=routing_action())<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); Jan 5 11:56:11 1993 Page 13 of mr_msg.C <dp n="d145"/> mr_mss.C mr_msg. C else if(err>O) ...action return(e_MSG_PENDING); (void)Conv->BufToCARD32(data+pos,res_len,nbytes,requestr);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes,meeting_id);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, participant);pos+=nbytes; if((err=RMgr->ReenterMeeting(requester,meeting_id,med list))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); med_list.reset(); while(med_list.next(m) && m) delete m; return(error->success_return(REPLY_MR_SERVER,opcode,seq_no)); } /ReenterMeeting::action /*********** Finet Granularity:USe LATER msg_obj_states LeaveMeeting::action() { int meeting_id; CARDD92 requester; int list len; List_of_p(McdiaDesc) med list; MediaDesc *m; # ifdef DEBUG cout<< ″LeaveMeeting called\n″; cout.flush(); # endif if((err=routing_action())<O) rcturn(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, requester);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, meeting_id);pos+=nbytes; (void)Conv->BufToCARD32(data+pos,res_len,nbytes, list_len);pos+=nbytes; med list.reset(); for(int i=O;i<list_len;i++){ m=new MediaDesc; if(m){ m->server=(Media)data/poa++/; if(Conv->BufToString(data+pos,res_len, nbytes, m->user_dese)<O) return(error.>e_action(ERROR_MR_SERVER,opcode, seq_no,ERR_INCOMPLETE_MSG)); med_list. insert_next(m); else return(error->e_action(ERROR_MR_SERVER,opcode, SEq_no,-ERR_NO_RESOURES)); } if((err=RMgr->LeaveMeeting(requeater,meeting_id,med_list))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); med_list.reaet(); while (med_list.next(m)&& m) delete m; return(error->succss_return(REPLY_MR_SERVER, opcode,seq_no)); } //LeaveMeeting::action msg_obj_states ReenterMeetinq::action() int meeting_id; CARD32 requester; int list_len; List_of_p(MedisDesc) med_list; MediaDese * m; Jan 5 11:56:11 1993 Page 14 of mr_msg.C <dp n="d146"/> mr_msg. C mr_msg. C # ifdef DEBUG cost<< ″ReesterMeeting called\n″;cost.flush(); # endif if((err=rosting_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,requester);pos+=nbytes; void)Conv->BufToCARD32(data+pos,res_len,nbytes, meeting_id);pos+=nbytes; void)Conv->BufToCARD32(data+pos,res_len,nbytes,list_len);pos+=nbytes; med_list.reset(); for (int i=O;i<list_len;i++){ m=new MediaDesc; if (m) { m->server=(Medin)data(pos++/; if(Conv->BsfToString(data+pos,res_len,nbytes, m->user_desc)<O) return(error->e_action(ERROR_MR_SERVER,opcode, seq_no,ERR_INCOMPLETE_MSG)); med_list.insert_next(m); } else return(error.>e_action(ERROR_MR_SERVER,opcode, seq_no,-ERR_NO_RESOURCES)); } if((err=RMgr->ReenterMeeting(reqsester,meeting_id,med_list))<O) return(error.>e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); med_list.reser(); while(med_list.next(m) 88 m) delete m; return(error->success_return(REPLY_MR_SERVER,opcode,seq_no)); } //ReenterMeeting::action ***********/ ...action msg_obj_states NameServerMsg::action() action int err; # ifdef DEBUG cout<<″Ruting NameServerMsg\n″;cout.flush(); # endif if((err=for NameServer))<O) return(error->e_action(ERROR_MR_SERVER,opcode,seq_no,-err)); return(e_MSG_PENDING); } Jan 5 11:56:11 1993 Page 15 of mr_mag.C <dp n="d147"/> msg. C msg. C #define DEBUG 1 #define DUMMY_CLIENT 1 #include<iface.h> #include<server_reg.h> #include <obj_man.h> #include <client.h> # include <iostream.h> # include<room.h> Block(char) GenericReplyClass::rep_buf(INIT_MAX_REPLYSIZE); List_of_pimplement(Message) List_of_pimplement Message::Message(char *m header, CARD8 msg typ, CARD8 msg_code,int msg_seq_no, int msg_len, char *msg_data,Connection *invoker) if (m_header){ for (int i=O;i<MSG_HEADER_LEN;i++) header[i]=m_header[i]; type=msg_typ;opcode=msg_code; seq_no=msg_seq_no;len=msg_len; data=msg_data;Invoker=invoker; Rmgr=Invoker->RoomManager(); Conv=Invoker->Conv(); MSMgr=Invoker->MediaServerManager(); pos=O; void Message:set_msg_seq_no(int s) set_msg_seq_no { seq_no=3; Conv->IntToBuf(seq_no,header+MSG_HOFFSET_SEQ); int Message::len_in_CARD32(int len_in_bytes) len_in_CARD32 { int rep_ceil; rep_ceil=len_in_bytes%4; return((len_in_bytes/4)+(rep_ceil ?1∶O)); int Message::for_NameServer() for_NameServer { if(Invoker->MRIface()->ReqNMManager()->send_to_NM(this)<O) return(-ERR_MR_SERVER_DOWN); int Message::for_some_other_MR(int_MR_id) for_some_other_MR String machine; int port; //cout<<″ID:″<<MR_id<<endl; if(Invoker->()->ServReg()->in_my_range(MR_id)) return(O); if(Invoker- >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_MR Jan 5 11:56:11 1993 Page 1 of msg.C <dp n="d148"/> msg.C msg.C (machine,port,this)<O) ..for_some_other_MR return(-ERR_MR_SERVER_DOWN); return(1); } msg_obj_states Disconneet::action() action { #ifdef DEBUG cout<< ″Dhconnect received\n″;cout.flush(); #endif Invoker->deactivate_self(); return(e_MSG_SERVICED); } void GenericReplyClass::fill_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 GenericReplyClass:send_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 ErrorClass::success_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 ErrorClass:send_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 ErrorClass::e_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 IllegalMeeage::action() 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 MRMRRequestClass::routing_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 11:56:11 1993 Page 2 of mag.C <dp n="d149"/> msg.C msg.C void MedServRequestClass::fill_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 MedServRequestClass::common 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 EventClass::build(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 EventClass::build(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 EventClass::build(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 EventClass::build(int src,int idl,int id2,List(int)& 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 EventClass::build(int src,int room_id,int meeting_id,Media med, { String& 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 11:56:11 1993 Page 3 of msg.C <dp n="d150"/> msg.C msg.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 EvencClass::build(Int ste, int room_id,int meetins_id,Media med, String& user_desc,List(int)& 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 EventClass::send_event() send_event { MmConnection conn; slist.rest(); while(slist.next(conn)){ (void)NW->Write(conn,rep_buf,MSG_HEADEE_LEN+(len<<2)); } Jan 5 11:58: 1993 Page 4 of msg.C <dp n="d151"/> obj_man.C obj_man.C #indude<obj_man.h> #inelude<server_reg.h> List_of_pimplement(LoealSession) List_of_pimmplement List_of_pimplement(FrontEnd) List_of_pimplement List_of_pimplement(ReqMR) List_of_pimplement CommObjMgr::CommObjMgr(MRInterface * iface) CommObjMgr { Iface=iface; } void LocalSessionMgr::process(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 alSessionMgr::garbage_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 FrontEndMgr::process(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 11:56:04 1993 Page 1 of obj_man. C <dp n="d152"/> obj_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 FrontEndMgr::garbage_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 ////////////////////////// ReqNMMgr::ReqNMMgr(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()==MmEnum:MmFalse){ 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 ReqNMMgr:send_to_NM(Message *msg) send_to_NM return(nm_obj->send_request_msg(msg)); void ReqNMMgr::process(MmCnnection serv) process Jan 5 11:56:04 1993 Page 2 of obj_man.C <dp n="d153"/> obj_man. C obj_man.C { ..process if(nm_obj->connection()==serv) nm_obj->process_msg(); } ////////////////////////// //ReqMRMgr methods ////////////////////////// int ReqMRMgr:send_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()== MmEnum:MmFalse){ 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 ReqMRMgr::process(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 ReqMRMgr:garbage_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 11:56:04 1993 Page 3 of obj_man.C <dp n="d154"/> proto. C proto. C #include <iface.h > Protocok: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]=ProcoGenerator::default_generator, } }
for(int j=0;j<MAX_RECISTRY_SERVER_MSSGS;j++) Gen_func_tab[REQUEST_REGISTRY_SERVERI][j]=ProtoGenerator::Gen_NameServerMsg; Gen_func_tab[REQUEST_MR_SERVER][MR_DISCONNCT]=protoGeneramr::Gen_Disconnect; } void Protocol::interpret_header(char *header,CARD8& type, CARD8& opcode,CARD32& seq,CARD32& 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; #endif Jan 5 11:56:12 1993 Page 1 of proto. C <dp n="d155"/> proto.C proto.C tmp=Conv->BufToInt(header+MSG_HOFFSET_LEN); …prootocol len=tmp<<MSG_UNIT; } Message*Protocol::constnct_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 11:56:12 1993 Page 2 of proto.C <dp n="d156"/> room.C room.C #include<obj_man.h> #include<room.h> #include<iface.h> #include<med_serv.h> #define DEFAULT_ROOMS 1000 Listimplement(int) Listimplement Listmplement(String) Listimplement List_of_pimplement(Room) List_of_pimplement List_of_pimplement(Conferee) List_of_pimplement Listimplement(ParticipantInfo) Listimplement List_of_pimplement(MediaDesc) List_of_pimplement List_of_pimplement(FullMediaDesc) List_of_pimplement List_of_pimplement(MediaServerInfoInRoom) List_of_pinpfement ////////////////////////////////////////////////// //Room Methods ////////////////////////////////////////////////// Room::Room(int room_id,CARD32 rowner,RoomAttrib rattr, { String& 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 Room::lock() lock { if (lock_status==e_LOCKED) return(-ERR ROOM_LOCKED); lock status=e_LOCKED; EveNot->RoomLocked(RoomId(), O); return(SUCCESS); } void Room::meeting_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 Room::meeting_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 11:56:12 1993 Page 1 of room.C <dp n="d157"/> room. C room. 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 Room::unlock() unlock { if(lock_status==e_UNLOCKED) return(-ERR_ROOM_ALREADY_UNLOCKED); lock_status=e_UNLOCKED; EveNot->RoomUnlocked(Roomld(),O); return(SUCCESS); } void Room::set_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 Room::MediaServerDied(int id) MediaServerDied { MediaServerInfoInRoom *info; server_list.reset(); while(server_list.next(info)){ if(info->server==id){ delete info; server_list.remove_prev(); } } } int Room::is_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 Room::add_server(int server_id,Media media, String& user_desc, List(int)& part_list) { Jan 5 11:56:12 1993 page 2 of room. C <dp n="d158"/> room. C room. 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_SCOPE:e_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 Room:set_access_list(int server_id,Media media,String& user_desc, List(int)& 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 Room::drop_server(int server_id,Media media,String& 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 11:56:12 1993 Page 3 of room. C <dp n="d159"/> room. 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 Room:suspend_server(int server_id,Medis media, String& 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 Room::resume_server(int server_id, Media media, String& 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 Room::list_servers(List_of_p(FullMediaDesc)& 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 11:56:12 1993 Page 4 of room. C <dp n="d160"/> room. 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 Room::associated_servers(List(int)& 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 ////////////////////////////////////////////////// Meeting::Meeting(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); Meeting::Meeting() Meeting { drop_all_participants(); //Should send meeting destroyed event to all servers EveNot->MeetingDestroyed(room->Roomld(),O,Meetingld()); } int Meeting::state_check() state_check { if(status==e_MSUSPENDED) return(-ERR_METING_SUSPENDED); if(room->room_lock_status()==e_LOCKED) return(-ERR_ROOM_LOCKED); } void Meeting::get_meeting_info(List(PartieipantInfo)& 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 11:56:12 1993 Page 5 of room. C <dp n="d161"/> room. C room. C p.media_list=c->get_med_list(); ...List info.insert_next(p); void Meeting::get_meeting_participants(List(int)& 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 Meeting::add_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 Meeting::drop_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 Meeting::change_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 11:56:12 1993 Page 6 of room C <dp n="d162"/> room. C room. C # endif ...change_owner } } } int Meeting::suspend_meeting() suspend meeting { if(status==e MSUSPENDED) return(-ERR_MEETING_SUSPENDED); sstatus=e_MSUSPENDED; EveNot->MeetingSuspended(room->RoomId(),O,Meetingd()); return(SUCCESS); } int Meeting::resume_meeting) resume meeting { status=e_MNORMAL; EveNot->MeetingResumed(room->RoomId(),O,MeetigId()); return(SUCCESS); } void Meeting::drop_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 Meeting::add_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 Meeting::drop_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 Meeting::drop_media(MediaDesc med) drop_media { List_of_piter(Conferee) clist(conf_list); Conferee*c; clist.reset(); while(clist.next(c)){ Jan 5 11:56:12 1993 Page 7 of room. C <dp n="d163"/> room. C room. C c->drop_media(med); ... drop_media } } void Meeting::suspend_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 Meeting::resume_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 Meeting::restrict_media_access(List(int)& 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 Meeting::leave_meeting(int participant, List_of_p(MediaDesc)& 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 Meeting::reentr_meeting(int participant, List_of_(MediaDesc)& media_list) List List_of_piter(Conferee)clist(conf_list); Conferee *c; clist.reset(); while(clist.next(c)){ if(c->ID()==partcipant){ Jan 5 11:56:12 1999 Page 8 of room.C <dp n="d164"/> ////////////////////////////////////////////////// //Conferee Methods ////////////////////////////////////////////////// Conferee:Conferee() Conferee { FullMediaDesc *m; media_list.reset(); while(media_list.next(m)){ delete m; } } void Conferee::add_media(MediaDesc med) add_media { FullMediaDesc *mm; medis_list.reset(); while(media_list.next(m)){ if(m>server==med.server && 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 Conferee::drop_medis(MediaDesc med) drop_media { FullMediaDesc *m; media_list.reset(); while(media_list.next(m)){ if(m->server==med.server && m->user_desc==med.user_desc){ media_list.remove_prev(); delete m; return; } } void Conferee::suspend_mmedia(MediaDesc med) suspend_media { FullMediaDesc *m; media_list.reset(); while(media_list.next(m)){ if(m->server==med.server && m->user_desc==med.user_desc){ m->status=e_SERV_SUSPENDED; return; } } } void Conferee::suspend_mmedia(List_of_p(MediaDesc)& med_list) List_of_p { Jan 5 11:56:12 1993 Page 9 of room. C <dp n="d165"/> room. 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 && m->user_desc==mdesc->user_desc){ m->status=e_SERV_SUSPENDED; } } } void Conferee::resume_media(List_of_p(MediaDesc)& 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 && m->user_desc==mdesc->user_desc){ m->status=e_SERV_NORMAL; } } } } void Conferee::resume_media(MediaDesc med) resume_media { FullMediaDesc *m; media_list.reset(); while(media_list.next(m)){ if(m->server==med.server && m->user_desc==med.user_desc){ m- >status=e_SERV_NORMAL; return; } } ) ////////////////////////////////////////////////// //RoomMgr Methods ////////////////////////////////////////////////// RoomMgr::RoomMgr(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 11:56:12 1993 Page 10 of room. C <dp n="d166"/> room. C room. C } ...RoomMgr int RoomMgr::is_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 RoomMgr::generate_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 later void RoomMgr::free_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 RoomMgr::generate_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); } // LATER:SOme bug in list deletion;check later void RoomMgr::free_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 RoomMgr::CreateRoom(CARD32 owner,RoomAttrib attrib,String& rname) CreateRoom Jan 5 11:56:12 1993 Page 11 of room. C <dp n="d167"/> room. 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 RoomMgr:DestroyRoom(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 RoomMgr::ListRooms(CARD32 requster,List(int)& rlist, List(String)& 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 RoomMgr::ShowRoomStatus(CARD32 requester,int room id, RoomStatus& stat, RoomLockStatus& 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 RoomMgr::ShowRoomAtributes(CARD32 requester, Jan 5 11:56:12 1993 Page 12 of room. C <dp n="d168"/> room. C room. C int room_id, RoomAttrib& 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 RoomMgr:AlterRoomAttributes(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 RoomMgr:LockRoom(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 RoomMgr::UnlockRoom(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 RoomMgr::CreateMeeting(CARD32 owner,CARD32 room_id, MeetingAttrib attrib) { Room *r; Meeting *m; Jan 5 11:56:12 1993 Page 13 of room.C <dp n="d169"/> room. C room. 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 RoomMgr::DestroyMeeting(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 && m->MeetingId()== meeting_id){ free_meeting_id(meeting_id); delete m; r->meeting_destroyed(); return(SUCCESS); } } return(-ERR_BAD_MEETING_ID); int RoomMgr::ListMeetings(CARD32 requster,List(int& 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 RoomMgr::ShowMeetinStatus(CARD32 requester,int meeting_id, List(ParticipantInfo)& info,int& p_room_id, int& owner,MeetingStatus& status) { Room *r; Meeting *m; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER riter.reset(); Jan 5 11:56:12 1993 Page 14 of room. C <dp n="d170"/> room. C room. C while (riter.next(r)){ ...List if((m=r->get_meeting())!=(Meeting *)NULL && 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 RoomMgr::ShowMeetRoomStatus(CARD32 requester, int room id, List(ParticipantInfo)& info, int& p_meeting_id, int& owner,MeetingStatus& 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 RoomMgr::ListMeetingParticipants(int meeting_id, List(int)& 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 && m->MeetingId()==meeting_id){ m->get_meeting_participants(plist); return(SUCCESS); } return(-ERR_BAD_MEETING_ID); } int RoomMgr::ShowMeetingAttributes(CARD32 requester,int meeting_id, MeetingAttrib& attrib) Room *r; Meeting *m; List_of_piter(Room) riter(room_list); //ADD SECURITY LATER riter.reset(); Jan 5 11:56:12 1993 Page 15 of roon. C <dp n="d171"/> room. C room. C while (riter.next(r)){ ...List if((m=r->get meeting())!=(Meeting *)NULL && m->Meetingld()==meeting_id){ attrib=m->get_meeting_attrib(); return(SUCCESS); } } return(-ERR_BAD_MEETING_ID); int RoomMgr::ShowAssociatedMeeting(CARD32 requester,int room id, int& 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()&&(m=r->get meeting())){ meeting_id=m->Meetingld(); return(SUCCESS); } else return(-ERR_ROOM_HAS_NO_MEETING); } } return(-ERR_BAD_ROOM_ID); } int RoonMgr::ShowAssociatedRoom(CARD32 requester,int meeting_id, int& 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() && (m=r->get_meeting()) && m->MeetingId()==meeting_id){ room_id=r->RoomId(); return(SUCCESS); } } return(-ERR_BAD_MEETING_ID); } int RoomMgr::AlterMeetingAttributes(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 && m->MeetingId()==meeting_id){ m->set_meeting_attrib(attrib); return(SUCCESS); } } return(-ERR_BAD_MEETING_ID); Jan 5 11:56:12 1993 Page 16 of room. C <dp n="d172"/> room. C room. C } ...List int RoomMgr::AddParticipant(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 && m->MeetingId()==meeting_id){ return(m->add_partieipant(participant)); } } } return(-ERR_BAD_MEETING_ID); int RoomMgr::DropParticipant(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 && 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 RoomMgr::SuspendMeeting(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 && m->MeetingId()==meeting_id){ return(m->suspend_meeting()); } } return(-ERR_BAD_MEETING_ID); } int RoomMgr::ResumeMeeting(CARD32 requester, int meeting_id) ResumeMeeting Room *r; Meeting *m; List_of_piter(Room)riter(room_list); //ADD SECURITY LATER Jan 5 11:56:12 1993 Page 17 of room. C <dp n="d173"/> room. C room. C riter.reset(); ...ResumeMeeting while(riter.next(r)){ if((m=r->get_meeting())!=(Meeting *)NULL && m->MeetingId()==meeting_id){ return(m->resume_meeting()); } } return(-ERR_BAD_MEETING_ID); int RoomMgr:AddServer(int room_id,int server_id, Media media,String& user_desc,List(int)&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 RoomMgr::DropServer(int room_id,int server_id,Media media, String& 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 RoomMgr::SuspendServer(int room_id,int server_id,Media media, String& 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 RoomMgr:ResumeServer(int room_id,int server_id,Media media, String& 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 RoomMgr::SetAccessList(int room_id,int server_id, Jan 5 11:56:12 1993 Page 18 of room.C <dp n="d174"/> room. C room. C Media media,String& user_desc,List(int)& 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 RoomMgr:ListServers(CARD32 requester,int room id, List_of_p(FullMediaDesc)& 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 RoomMgr:leaveMeeting(CARD32 requester,int meeting_id, List_of_p(MediaDesc)& media_list) { Room *r; Meeting *m; List_of_piter(Room) riter(room_list); riter.reset(); while (riter.next(r)){ if(r->has_meeting() && (m=r->get_meething()) && m-->MeetingId()==meeting_id){ return(m->leave_meething(requester,media_list)); } } return(-ERR_BAD_MEETING_ID); int RoomMgr::ReenterMeeting(CARD32 requester,int meeting_id, List_of_p(MediaDesc)& media_list) { Room *r; Meeting *m; List_of_piter(Room) riter(room_list); riter.reset(); while(riter.next(r)){ if(r->has_meeting()&&(m=r->get_meeting)) && m->MeetingId()==meeting_id}{ return(m->reenter_meeting(requester,media_list)); } } return(-ERR_BAD_MEETING_ID); } void RoomMgr:MediaServerDied(int m) MediaServerDied Room *r; List_of_piter(Room) riter(room_list}; riter.reset(); while(riter.next(r)){ Jan 5 11:56:12 1993 Page 19 of room. C <dp n="d175"/> room. C room. C r->MediaServerDied(m); ...MediaServerDicd } } int RoomMgr::IsServerPresent(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 RoomMgr:AssociatedServersInRoom(int room_id,Lis(int)& 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 ParicipantInfo::operator==(const ParticipantInfo& p) operator { return(participant==p.participant && media_list==p.media_list); } Jan 5 11:56:12 1993 Page 20 of room.C <dp n="d176"/> server_reg. C server_reg.C #define DEBUG 1 #define MAK_ARBIT_STRING 500 int INET_ADDR=1; #include<server_reg.h> # include<common.h> List_of_pimplement(MediaServerInfo) List_of_pimplement List_of_pimplement(MRServerConnINfo) List_of_ptmplement MediiaServerInfo::MediaServerInfo(Media pTYPe,String& pUserDesc, MediaServerConn& pConn,Strig& pInitialiser, String& pOtherInfo) { MediaType=pType;UserDesc=pUserDesc;Initializer=pInitializer; OtherInfo=pOtherInfo;Conn=pConn; } ServerRegistry::ServerRegistry(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 *)&cinet_a,siseof(struct in_addr)); bcopy(hp->h_addr,(char *)&inet_a (hp->h_length>4)?-4:hp->h_length); strcpy(host,inet_ntoa(inet_a)); } } MyName=host; my_range(); } void ServerRegistry::read_file() read_file { int num entries; ifstream data_file,(in_file,ios::in); 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!=″NameServer″){ Jan 5 11:56:19 1993 Page 1 of server_reg.C <dp n="d177"/> server_reg. C server_reg. C cout >>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_CONNECTION: default: data file>>Conn.generic>>cntl; break; while((ch=data fiLe.get())==′′||ch==\t′); data file.putback(ch); data_file.getline(Initializer,cnt1+1); data_file>>cnt2; while((ch=data_file.get())==′′||ch==\t′); data_file.putback(ch); datafile.getline(OtherInfo,cnt2+1); pers=new MediaServerInfo)MediaType,UserDesc, Conn,String(Initializer),String(OTHERInfo)); # ifdef DEBUG cout << 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 ServerRegistry:ListALLMediaServerInfo(List_of_p(MediaServerInfo)& plist) List_of_p { plist=MediaSererList; } void ServerRegistry:ListAILMRServerConnInfo(List_of_(MRServerConnInfo)& slist) List_of_P { sList=MRServerList; MediaServerInfo* ServerRegistry::ListMediaServerInfo(Media med, String& key) { MediaServerInfo *t; List_of_piter(MediaSrverInfo) mlist(MediaServerList); mlist.reset(); while(mlist.next(t)){ // cout << t->UserDesc: ″<< t->UserDesc << endl; Jan 5 11:56:19 1999 Page 2 of serv_reg.C <dp n="d178"/> server_reg. C server_reg. C if(t->MediaType==med && t->UserDesc==key){ ...List_of_p return(t); } // cout.flush(); return((MediaServerInfo*)NULL); } void ServerRegist::my_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; #endif int ServerRegistry:server_for_id(int id, String& mach,int& 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 && 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 ServerRegisty::default_name_server(String& mach,int& port) default_name_server { mach=name_server_machine; port=name_server_port; } Jan 5 11:56:19 1993 Page 3 of server_reg. C <dp n="d179"/> name Stdin Spooldate Thu Jan 14 09:52:47 owner rapport (Sid Ahuja2, 4f601, x 5569 at (O O cc) window (O O O) imagesize ( O O) imagaspace (O O O O) jobheader on jamresistance on language impress System Version TURBO UltraScript 6.OT Rev. A IP/II,Serial #91:12:17 Page images processed: 82 Pages printed: 82 Paper size (width,height): 256O, 3328 Document length: 249729 bytes
附录3
}; class IR_DropParticipant:public 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_ListRooms:public 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_ListMeetings:public 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_ListServers:public 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_LeaveMeeting:public 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_ReenterMeeting:public 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_SuspendMeeting:public IncomingReply{ public: IR_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_ResumMeeting:public 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, <dp n="d182"/> }; msg_len,msg_data,invoker){} class IR_GetPersonInfo:public 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_ShowMeetingStatus:public 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_ShowMeetRoomStatus:public 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_VIMeetingInvitation:public 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 VI class IE_EveCreateMeeting:public 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_EveCreataPersistentMeeting:public 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_EveVICreateMeetInERoom:public 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(); }; <dp n="d183"/> class IE_EveVIAddparticipant:public 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_EveVIDropParticipant:public 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_EveVISuspendMeeting:public 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_EveVIResumeMeetingg:public 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_EveVIReenterMeeting:public 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_EveVILeaveMeeting:public 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 EveVIAddServer:public 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_EveVIDropServer:public IncomingEvent{ public: <dp n="d184"/> IE_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_EveVIDestroyMeeting:public 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_EveVIListRooms:public 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_EveVIListMeetings:public 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_EveVIShowMeetingStatus:public 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_EveVIShowMeetRoomStatus:public 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_EveVIJoinMeeting:public 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_EveVIJoinMeetingRejected:public 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, <dp n="d185"/> msg_len,msg_data,invoker){} void action(); }; class IE_EveVIJoinMeetingAccepted:public 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_EveVIGetPersonName:public 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_EveVIGetPersonImage:public 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_EveVIGetPersonId:public 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_EveVIUp:public 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_EveVIDown:public 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_EveVIShowAssocRoom:public 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(){} };
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 LocalMedia:public 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& p_udesc) { int tmp=(udesc==p_udesc)?1∶0; return((tmp && (m==p_m))?1∶0); } int is_match (Media p_m) return((m==p_m)?1∶0); } void update(Media p_med,string& 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; }; <dp n="d191"/> class MRServer:public Connection { public: MRServer(Controller *ctrl,MmConnection pCli): Connection(ctrl,pCli,e_MR){} void process_msg(-) {client_process_msg();} }; class VisualInyerface:public Connection{ public: VisualInterface(Controller*ctrl,MmConnection pCli) Connection(ctrl,pCli,e_VI) {} void ptocess_msg(){clien_process_msg();} }; class EventNotifier:public 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);} <dp n="d192"/> 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 *); <dp n="d193"/> 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*,Connection InccmingMessage*Gen_IE_EveCreateMeeting(CARD8,CARD8,CARD32,CARD32,char*,Connection *), InccmingMessage*Gen_IE_EveCreateperaiatentMeeting(CARD8,CARD8,CARD32,CARD32, char *,Conn InccmingMessage*Gen_IE_EveVICreateMeetINERoom(CARD8,CARD8,CARD32,CARD32,char*,Connect; InccmingMessage*Gen_IE_EveVIShowMeetroomStatys(CARD8,CARD8,CARD32,CARD32,char*, Connect InccmingMessage*Gen_IE_EveVIShowMeetingStatus(CARD8,CARD8,CARD32,CARD32,char*, Connect: InccmingMessage*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*,Connectio: InccmingMessage*Gen_IE_EveVISuspancMeeting(CARD,CARD8,CARD32,CARD32,char*, Connection InccmingMessage*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*,Connection InccmingMessage*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*,Conne InccmingMessage*Gen_IE_EveMeetingInvite(CARD8,CARD8,CARD32,CARD32,char*,Connection *), InccmingMessage*Gen_IE_EveAcceptInvitation(CARD8,CARD8,CARD32,CARD32,char*, Connection InccmingMessage*Gen_IE_EversjactInvitation(CARD8,CARD8,CARD32,CARD32,char*,Connection InccmingMessage*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*,Connect: InccmingMessage*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*,Connection InccmingMessage*Gen_IE_EveDroppedparticipant(CARD8,CARD8,CARD32, CARD32,char*,Conneco InccmingMessage*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*,Connection IncomingMessage*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> <dp n="d194"/> struct MediaBrdgeDeac{ Median; string udesc; string machina; int port; int req-doee; int active; /* int operator-(cinat madiaBridgedesc & p) ( return(m - p.m&& udeac=p.udeac); } */ ); List_of_pdaclare(ModiaBridgedesc) class mediBridgadescList { public: mediaBridgedescList(); -MediaBridgeDEscList(); //copy constructor mediaBridgedescList(const mediaBridgeDescList & rhs); //assign constructor mediaSridgeDescList& operator-(const MediaBridgadascList & 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& user_desc); void add(mediaSridgeDesc& med); void remove(media m); void update(media m,string&machina, int port,int is_active=O); void update_prav_request(string& machina, int port,int is_active); void updste_applicable_media(medisBridgeDescList& mdesc); int is_present (MediaBriDGEdesc*b); List_of_P(MadiaBridgeDesc)&media_list(){return list;} mediaBridgeDesc* Lastmedia(){return last_msdia;) private: mediaBridgeDasc* node_presant(medi&BridgeDesc*node); void assign_or_copy(const mediaBridgeDescList& 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& pasd) {participant=p;med=pesd;} int participant(){return participant;} MediaBridgeDescList& MediaList(){return med;} private: int participant; MediaBridgeDescList med; }; List_of_Pdsclare(partMsdiaBridgeDescList) struct InterObjectBuffer{ CARD8 msg_type; <dp n="d195"/> 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{ CARD32 room_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 VI struct sl3{ CARD32 room_id; CARD32 meeting_id;
mur Heading: cm_msg.h Date: Tue Jan26 18:03:54 EST1993 Job-Id: z-581 Printer: lwt2
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;
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;
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)?1:0; input=(Self)?T11:T43; 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)?T20:T42; 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;
input=(iob.msg_type==REPLY_MR_SERVER)?T16:T15; break; case MR_REENTER_MEETING: input=(iob.msg_type==REPLY_MR_SERVER)?T29:T30; break; case MR_RESUME_MEETING: input=(iob.msg type==REPLY_MR_SERVER)?T32:T33; 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)?T40:T41; break; default: break; } break; case REPLY_VI: case ERROR_VI: switch(iob.msg_code){ case VI_MEETING_INVITATION; input=(iob.msg_type=REPLY_VI)?T19:T21; 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
Claims (17)
1.一种多媒体通信网络,其特征在于,包括:
多个多媒体端口,每个端口用于将网络连至一个用户终端;
至少一个会议室服务器,它连至多媒体端口,用以响应于来自任何一个用户终端的指令,在网络中建立一个代表可控持续虚拟会议室的一种电子电路结构;以及
对会议室服务器作出响应,用以在多个端口的一些经选择的端口之间,在一种或数据经选择的媒体内实行连接的装置。
2.如权利要求1所述的多媒体网络,其特征在于,实行连接的装置包括:
多个电子设备,用于在两个或多个用户之间用第一种媒体举行会议。
3.如权利要求2所述的多媒体网络,其特征在于,实行连接的装置包括:
多个电子设备,用于在两个或多个用户之间用第二种媒体举行会议。
4.如权利要求3所述的多媒体网络,其特征在于,实行连接的装置包括:
多个电子设备,用于在两个或多个用户之间用第三种媒体举行会议。
5.如权利要求4所述的多媒体网络,其特征在于,第一种媒体是声频媒体。
6.如权利要求4所述的多媒体网络,其特征在于,第二种媒体是视频媒体。
7.如权利要求4所述的多媒体网络,其特征在于,第三种媒体是数据媒体。
8.如权利要求4所述的多媒体网络,其特征在于,用第一种媒体举行会议的多个电子设备包括多个声频服务器。
9.如权利要求4所述的多媒体网络,其特征在于,用第二种媒体举行会议的多个电子设备包括多个视频服务器。
10.如权利要求4所述的多媒体网络,其特征在于,用第三种媒体中举行会议的多个电子设备包括多个数据服务器。
11.如权利要求10所述的多媒体网络,其特征在于,数据服务器包括窗口桥路。
12.如权利要求4所述的多媒体网络,其特征在于进一步包括:
一种装置,用于把经选择的一些电子设备与代表由会议室服务器产生的虚拟会议室的电路结构相关联。
13.如权利要求12所述的多媒体网络,其特征在于进一步包括:
一种装置,用于建立代表经选择的用户与虚拟会议室之间的关联的电子电路会议结构。
14.如权利要求13所述的多媒体网络,其特征在于进一步包括:
姓名服务器,它含有代表多媒体网络多个可能用户的电子电路结构;以及用于在经选择的用户与正响应于姓名服务器的虚拟会议室建立关联的装置。
15.如权利要求1所述的多媒体网络,其特征在于,多种多媒体中的每一种包括:
会话管理器输入,它分别对来自各用户终端内会话管理器的指令作出响应;
数据管理器输入,它分别对各用户终端内的数据管理器作出响应;
视频管理器输入,它分别对各用户终端内的视频管理器作出响应;以及
声频管理器输入,它分别对各用户终端内的声频管理器作出响应。
16.如权利要求1所述的多媒体网络,其特征在于,会议室服务器包括:
输入/输出端口,用于与多媒体网络中的另外的会话管理器进行通信。
17.一种与多媒体通信网络相连的用户终端,其特征在于,包括:
用户接口;
会话管理器,它与用户接口相连,用于与通信网络中的会话管理器相连;
数据管理器,用于把会话管理器与网络中的数据服务器相连;
视频管理器,用于把会话管理器与网络中的视频服务器相连;以及
声频管理器,用于把会话管理器与网络中的声频服务器相连。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US08/052,492 | 1993-04-22 | ||
US08/052,492 US5471318A (en) | 1993-04-22 | 1993-04-22 | Multimedia communications network |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1121758A true CN1121758A (zh) | 1996-05-01 |
Family
ID=21977957
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN94191862A Pending CN1121758A (zh) | 1993-04-22 | 1994-04-15 | 多媒体通信网络 |
Country Status (12)
Country | Link |
---|---|
US (2) | US5471318A (zh) |
EP (1) | EP0698328B1 (zh) |
JP (1) | JP3032014B2 (zh) |
KR (1) | KR100312668B1 (zh) |
CN (1) | CN1121758A (zh) |
AU (1) | AU679995B2 (zh) |
BR (1) | BR9406356A (zh) |
CA (1) | CA2160895C (zh) |
DE (1) | DE69433643T2 (zh) |
NZ (1) | NZ266588A (zh) |
TW (1) | TW239248B (zh) |
WO (1) | WO1994024807A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103238149A (zh) * | 2010-10-15 | 2013-08-07 | 惠普发展公司,有限责任合伙企业 | 输入/输出通信 |
CN103580879A (zh) * | 2012-08-02 | 2014-02-12 | 华为技术有限公司 | 一种会议资源分配方法及装置 |
Families Citing this family (169)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6594688B2 (en) * | 1993-10-01 | 2003-07-15 | Collaboration Properties, Inc. | Dedicated echo canceler for a workstation |
US7185054B1 (en) | 1993-10-01 | 2007-02-27 | Collaboration Properties, Inc. | Participant display and selection in video conference calls |
US5689641A (en) * | 1993-10-01 | 1997-11-18 | Vicor, Inc. | Multimedia collaboration system arrangement for routing compressed AV signal through a participant site without decompressing the AV signal |
JP2987067B2 (ja) * | 1994-11-14 | 1999-12-06 | 松下電器産業株式会社 | 動画像データ送信装置 |
US7690043B2 (en) * | 1994-12-19 | 2010-03-30 | Legal Igaming, Inc. | System and method for connecting gaming devices to a network for remote play |
US5724508A (en) | 1995-03-09 | 1998-03-03 | Insoft, Inc. | Apparatus for collaborative computing |
US5784570A (en) * | 1995-04-07 | 1998-07-21 | At&T Corp | Server for applying a recipient filter and compressing the input data stream based upon a set of at least one characteristics in a multiuser interactive virtual environment |
US5559875A (en) * | 1995-07-31 | 1996-09-24 | Latitude Communications | Method and apparatus for recording and retrieval of audio conferences |
US5845282A (en) * | 1995-08-07 | 1998-12-01 | Apple Computer, Inc. | Method and apparatus for remotely accessing files from a desktop computer using a personal digital assistant |
US5737495A (en) * | 1995-09-29 | 1998-04-07 | Intel Corporation | Method and apparatus for managing multimedia data files in a computer network by streaming data files into separate streams based on file attributes |
US6560707B2 (en) | 1995-11-06 | 2003-05-06 | Xerox Corporation | Multimedia coordination system |
US6301339B1 (en) | 1995-11-15 | 2001-10-09 | Data Race, Inc. | System and method for providing a remote user with a virtual presence to an office |
US5956491A (en) | 1996-04-01 | 1999-09-21 | Marks; Daniel L. | Group communications multiplexing system |
US5717747A (en) * | 1996-05-31 | 1998-02-10 | Lucent Technologies Inc. | Arrangement for facilitating plug-and-play call features |
US5802058A (en) * | 1996-06-03 | 1998-09-01 | Lucent Technologies Inc. | Network-independent connection management |
US6898620B1 (en) | 1996-06-07 | 2005-05-24 | Collaboration Properties, Inc. | Multiplexing video and control signals onto UTP |
US6266328B1 (en) | 1996-08-26 | 2001-07-24 | Caritas Technologies, Inc. | Dial up telephone conferencing system controlled by an online computer network |
US6275222B1 (en) | 1996-09-06 | 2001-08-14 | International Business Machines Corporation | System and method for synchronizing a graphic image and a media event |
JPH10108154A (ja) * | 1996-10-01 | 1998-04-24 | Canon Inc | 会議システムおよびこれに用いる通信端末、画像表示方法、記憶媒体 |
US5963217A (en) * | 1996-11-18 | 1999-10-05 | 7Thstreet.Com, Inc. | Network conference system using limited bandwidth to generate locally animated displays |
JP3848725B2 (ja) * | 1997-04-04 | 2006-11-22 | 富士通株式会社 | 双方向通信システム |
US6075571A (en) * | 1997-07-29 | 2000-06-13 | Kuthyar; Ashok K. | Composite image display device and service for video conferencing |
US6917962B1 (en) * | 1997-10-22 | 2005-07-12 | Brokercom Inc. | Web-based groupware system |
US6088702A (en) * | 1998-02-25 | 2000-07-11 | Plantz; Scott H. | Group publishing system |
US6600725B1 (en) * | 1998-12-16 | 2003-07-29 | At&T Corp. | Apparatus and method for providing multimedia conferencing services with selective information services |
US6425012B1 (en) * | 1998-12-28 | 2002-07-23 | Koninklijke Philips Electronics N.V. | System creating chat network based on a time of each chat access request |
US7136062B1 (en) | 1999-09-14 | 2006-11-14 | Microsoft Corporation | Scalable multiparty conferencing and collaboration system and method of dynamically allocating system resources and providing true color support in same |
US6850985B1 (en) * | 1999-03-02 | 2005-02-01 | Microsoft Corporation | Security and support for flexible conferencing topologies spanning proxies, firewalls and gateways |
US6584493B1 (en) | 1999-03-02 | 2003-06-24 | Microsoft Corporation | Multiparty conferencing and collaboration system utilizing a per-host model command, control and communication structure |
WO2000052886A1 (en) * | 1999-03-02 | 2000-09-08 | Microsoft Corporation | Scalable multiparty conferencing and collaboration system and method of dynamically allocating system resources |
US6851053B1 (en) | 1999-03-02 | 2005-02-01 | Microsoft Corporation | Multiparty conference authentication |
US6570590B1 (en) | 1999-03-02 | 2003-05-27 | Microsoft Corporation | Application sharing in a frame |
WO2000056014A1 (fr) * | 1999-03-12 | 2000-09-21 | Fujitsu Limited | Dispositif de traitement et procede permettant de promouvoir les modalites de discussion lors d'une teleconference |
US20040193722A1 (en) * | 1999-08-30 | 2004-09-30 | Donovan Kevin Remington Joseph Bartholomew | Universal instant messaging system for the internet |
US7353251B1 (en) * | 1999-12-23 | 2008-04-01 | Polycom, Inc. | Automated call launching |
US7006494B1 (en) | 2000-01-04 | 2006-02-28 | Cisco Technology, Inc. | System and method for a virtual telephony intermediary |
US7079495B1 (en) | 2000-01-04 | 2006-07-18 | Cisco Technology, Inc. | System and method for enabling multicast telecommunications |
US7069432B1 (en) | 2000-01-04 | 2006-06-27 | Cisco Technology, Inc. | System and method for providing security in a telecommunication network |
US6804254B1 (en) | 2000-01-04 | 2004-10-12 | Cisco Technology, Inc. | System and method for maintaining a communication link |
WO2001065381A1 (en) * | 2000-02-29 | 2001-09-07 | Boyd John E | A computer-based networking service and method and system for performing the same |
US7844670B2 (en) * | 2000-04-03 | 2010-11-30 | Paltalk Holdings, Inc. | Method and computer program product for establishing real-time communications between networked computers |
US20020023134A1 (en) * | 2000-04-03 | 2002-02-21 | Roskowski Steven G. | Method and computer program product for establishing real-time communications between networked computers |
US7013340B1 (en) | 2000-05-18 | 2006-03-14 | Microsoft Corporation | Postback input handling by server-side control objects |
JP3555865B2 (ja) * | 2000-08-30 | 2004-08-18 | 日本電気株式会社 | Atm・ネーム・システム |
US7957514B2 (en) | 2000-12-18 | 2011-06-07 | Paltalk Holdings, Inc. | System, method and computer program product for conveying presence information via voice mail |
US7085842B2 (en) * | 2001-02-12 | 2006-08-01 | Open Text Corporation | Line navigation conferencing system |
JP4512964B2 (ja) * | 2001-02-13 | 2010-07-28 | ソニー株式会社 | 情報処理装置および方法、記録媒体、並びにプログラム |
US7380250B2 (en) | 2001-03-16 | 2008-05-27 | Microsoft Corporation | Method and system for interacting with devices having different capabilities |
US7493397B1 (en) | 2001-06-06 | 2009-02-17 | Microsoft Corporation | Providing remote processing services over a distributed communications network |
US6915454B1 (en) | 2001-06-12 | 2005-07-05 | Microsoft Corporation | Web controls validation |
US20040039626A1 (en) * | 2001-09-26 | 2004-02-26 | Dirk Voorhees | System and method for tracking appointment data |
US20050002388A1 (en) * | 2001-10-29 | 2005-01-06 | Hanzhong Gao | Data structure method, and system for multimedia communications |
EP1451981A1 (en) * | 2001-10-29 | 2004-09-01 | MPNET International, Inc. | Method, system, and data structure for multimedia communications |
US7120667B2 (en) * | 2001-10-30 | 2006-10-10 | Hewlett-Packard Development Company, L.P. | Method and system for ad hoc networking of computer users |
US7428725B2 (en) | 2001-11-20 | 2008-09-23 | Microsoft Corporation | Inserting devices specific content |
US7398209B2 (en) * | 2002-06-03 | 2008-07-08 | Voicebox Technologies, Inc. | Systems and methods for responding to natural language speech utterance |
US20040006595A1 (en) * | 2002-07-03 | 2004-01-08 | Chiang Yeh | Extended features to conferencing system using a web-based management interface |
US7693720B2 (en) | 2002-07-15 | 2010-04-06 | Voicebox Technologies, Inc. | Mobile systems and methods for responding to natural language speech utterance |
US20130260879A1 (en) | 2002-10-09 | 2013-10-03 | Michael W. Saunders | System and Method for Connecting Gaming Devices to a Network for Remote Play |
US7574653B2 (en) | 2002-10-11 | 2009-08-11 | Microsoft Corporation | Adaptive image formatting control |
US7391763B2 (en) * | 2002-10-23 | 2008-06-24 | International Business Machines Corporation | Providing telephony services using proxies |
US7003286B2 (en) * | 2002-10-23 | 2006-02-21 | International Business Machines Corporation | System and method for conference call line drop recovery |
US7191129B2 (en) * | 2002-10-23 | 2007-03-13 | International Business Machines Corporation | System and method for data mining of contextual conversations |
US7133831B2 (en) * | 2002-10-23 | 2006-11-07 | International Business Machines Corporation | System and method for processing personal telephony recorder commands |
US7065198B2 (en) * | 2002-10-23 | 2006-06-20 | International Business Machines Corporation | System and method for volume control management in a personal telephony recorder |
US7761505B2 (en) | 2002-11-18 | 2010-07-20 | Openpeak Inc. | System, method and computer program product for concurrent performance of video teleconference and delivery of multimedia presentation and archiving of same |
US7653192B1 (en) * | 2002-12-20 | 2010-01-26 | Nortel Networks Limited | Multimedia augmented conference bridge |
US8296361B1 (en) * | 2004-01-08 | 2012-10-23 | Cisco Technology, Inc. | Method and system for managing conference resources |
US7890604B2 (en) | 2004-05-07 | 2011-02-15 | Microsoft Corproation | Client-side callbacks to server events |
US9026578B2 (en) | 2004-05-14 | 2015-05-05 | Microsoft Corporation | Systems and methods for persisting data between web pages |
US8065600B2 (en) * | 2004-05-14 | 2011-11-22 | Microsoft Corporation | Systems and methods for defining web content navigation |
US7464386B2 (en) | 2004-05-17 | 2008-12-09 | Microsoft Corporation | Data controls architecture |
US8667401B1 (en) | 2004-05-26 | 2014-03-04 | Adobe Systems Incorporated | System and method for archiving collaborative electronic meetings |
US8069117B1 (en) | 2004-05-28 | 2011-11-29 | Adobe Systems Incorporated | Ad hoc access rights in restricted-access electronic space |
US7734802B1 (en) | 2004-05-28 | 2010-06-08 | Adobe Systems Incorporated | Dynamically adaptable collaborative electronic meeting space |
US8091029B1 (en) | 2004-05-28 | 2012-01-03 | Adobe Systems Incorporated | Presenter-only meeting canvas for collaborative electronic meeting space |
US7702730B2 (en) | 2004-09-03 | 2010-04-20 | Open Text Corporation | Systems and methods for collaboration |
US8150920B2 (en) | 2004-11-01 | 2012-04-03 | Nokia Corporation | System, method and computer program product for providing content to a terminal and directing the rendering of such content at the terminal |
DE102004053597B4 (de) * | 2004-11-05 | 2008-05-29 | Infineon Technologies Ag | Verfahren zum automatischen Erzeugen und/oder Steuern einer Telekommunikations-Konferenz mit einer Vielzahl von Teilnehmern, Telekommunikations-Konferenz-Endgerät und Telekommunikations-Konferenz-Servereinrichtung |
US8077635B2 (en) * | 2005-01-28 | 2011-12-13 | Cisco Technology, Inc. | Method and system for reserving facility resources for a conference |
US20070035548A1 (en) * | 2005-08-12 | 2007-02-15 | Searete Llc | Rating technique for virtual world environment |
US8457614B2 (en) * | 2005-04-07 | 2013-06-04 | Clearone Communications, Inc. | Wireless multi-unit conference phone |
US20060244818A1 (en) * | 2005-04-28 | 2006-11-02 | Comotiv Systems, Inc. | Web-based conferencing system |
US7685316B2 (en) * | 2005-06-16 | 2010-03-23 | Cisco Technology, Inc. | System and method for coordinated network configuration |
US7640160B2 (en) * | 2005-08-05 | 2009-12-29 | Voicebox Technologies, Inc. | Systems and methods for responding to natural language speech utterance |
US7620549B2 (en) | 2005-08-10 | 2009-11-17 | Voicebox Technologies, Inc. | System and method of supporting adaptive misrecognition in conversational speech |
US7949529B2 (en) | 2005-08-29 | 2011-05-24 | Voicebox Technologies, Inc. | Mobile systems and methods of supporting natural language human-machine interactions |
EP1934971A4 (en) | 2005-08-31 | 2010-10-27 | Voicebox Technologies Inc | DYNAMIC LANGUAGE SCRIPTURE |
JP4799154B2 (ja) * | 2005-12-02 | 2011-10-26 | キヤノン株式会社 | 会議支援システム、入力ボード及びその制御方法、プログラム |
US20070133438A1 (en) * | 2005-12-14 | 2007-06-14 | Cisco Technology, Inc. | Method and system for reserving resources in a conferencing system |
US20070198637A1 (en) * | 2006-01-04 | 2007-08-23 | Scott Deboy | Conferencing system with data file management |
US20070156829A1 (en) * | 2006-01-05 | 2007-07-05 | Scott Deboy | Messaging system with secure access |
US20070239827A1 (en) * | 2006-02-13 | 2007-10-11 | Scott Deboy | Global chat system |
US8375421B1 (en) * | 2006-03-02 | 2013-02-12 | F5 Networks, Inc. | Enabling a virtual meeting room through a firewall on a network |
US20070286366A1 (en) * | 2006-03-17 | 2007-12-13 | Scott Deboy | Chat presence system |
US20070276910A1 (en) * | 2006-05-23 | 2007-11-29 | Scott Deboy | Conferencing system with desktop sharing |
US20070279483A1 (en) * | 2006-05-31 | 2007-12-06 | Beers Ted W | Blended Space For Aligning Video Streams |
US8705558B2 (en) * | 2006-06-01 | 2014-04-22 | Cisco Technology, Inc. | Swapping bandwidth reservations |
US20070282793A1 (en) * | 2006-06-01 | 2007-12-06 | Majors Kenneth D | Computer desktop sharing |
US20080005245A1 (en) * | 2006-06-30 | 2008-01-03 | Scott Deboy | Conferencing system with firewall |
US20080043964A1 (en) * | 2006-07-14 | 2008-02-21 | Majors Kenneth D | Audio conferencing bridge |
US20080021968A1 (en) * | 2006-07-19 | 2008-01-24 | Majors Kenneth D | Low bandwidth chat system |
US7764632B2 (en) * | 2006-08-24 | 2010-07-27 | Interwise Ltd. | Software bridge for multi-point multi-media teleconferencing and telecollaboration |
WO2008030729A2 (en) | 2006-09-02 | 2008-03-13 | Ttb Technologies, Llc | Computer-based methods for arranging meetings and systems for performing the same |
US8266535B2 (en) | 2006-09-11 | 2012-09-11 | Broadnet Teleservices, Llc | Teleforum apparatus and method |
US20080065999A1 (en) * | 2006-09-13 | 2008-03-13 | Majors Kenneth D | Conferencing system with document access |
US20080066001A1 (en) * | 2006-09-13 | 2008-03-13 | Majors Kenneth D | Conferencing system with linked chat |
US20080065727A1 (en) * | 2006-09-13 | 2008-03-13 | Majors Kenneth D | Conferencing system with improved access |
US8073681B2 (en) | 2006-10-16 | 2011-12-06 | Voicebox Technologies, Inc. | System and method for a cooperative conversational voice user interface |
US20080120371A1 (en) * | 2006-11-16 | 2008-05-22 | Rajat Gopal | Relational framework for non-real-time audio/video collaboration |
US7818176B2 (en) | 2007-02-06 | 2010-10-19 | Voicebox Technologies, Inc. | System and method for selecting and presenting advertisements based on natural language processing of voice-based input |
US20080209330A1 (en) * | 2007-02-23 | 2008-08-28 | Wesley Cruver | System and Method for Collaborative and Interactive Communication and Presentation over the Internet |
US20080307105A1 (en) * | 2007-06-11 | 2008-12-11 | Microsoft Corporation | Streaming media archiver for live events |
US9357025B2 (en) | 2007-10-24 | 2016-05-31 | Social Communications Company | Virtual area based telephony communications |
US8397168B2 (en) * | 2008-04-05 | 2013-03-12 | Social Communications Company | Interfacing with a spatial virtual communication environment |
US9009603B2 (en) | 2007-10-24 | 2015-04-14 | Social Communications Company | Web browser interface for spatial communication environments |
US8407605B2 (en) | 2009-04-03 | 2013-03-26 | Social Communications Company | Application sharing |
US20090288007A1 (en) * | 2008-04-05 | 2009-11-19 | Social Communications Company | Spatial interfaces for realtime networked communications |
US7769806B2 (en) | 2007-10-24 | 2010-08-03 | Social Communications Company | Automated real-time data stream switching in a shared virtual area communication environment |
US8130425B2 (en) * | 2007-10-26 | 2012-03-06 | At&T Intellectual Property I, Lp | Methods and apparatus to route fax calls in an internet protocol (IP) multimedia subsystem (IMS) network |
US8140335B2 (en) | 2007-12-11 | 2012-03-20 | Voicebox Technologies, Inc. | System and method for providing a natural language voice user interface in an integrated voice navigation services environment |
US20090222519A1 (en) * | 2008-03-03 | 2009-09-03 | John Boyd | Computer-based methods for arranging meetings and systems for performing the same |
EP2279472A4 (en) | 2008-04-05 | 2013-11-20 | Social Communications Co | APPARATUS AND METHODS BASED ON A SHARED VIRTUAL SPACE COMMUNICATION ENVIRONMENT |
US9514444B2 (en) | 2009-01-15 | 2016-12-06 | Sococo, Inc. | Encapsulating virtual area based communicant assemblies |
US7945595B1 (en) | 2008-05-12 | 2011-05-17 | Adobe Systems Incorporated | System and method for generating an item list in electronic content |
US10055392B2 (en) | 2008-05-12 | 2018-08-21 | Adobe Systems Incorporated | History-based archive management |
US7949633B1 (en) | 2008-05-12 | 2011-05-24 | Adobe Systems Incorporated | Shared edit access of electronic content |
US9418054B2 (en) | 2008-05-12 | 2016-08-16 | Adobe Systems Incorporated | Document comment management |
US9176943B2 (en) | 2008-05-12 | 2015-11-03 | Adobe Systems Incorporated | Comment presentation in electronic documents |
US8996621B2 (en) | 2008-05-12 | 2015-03-31 | Adobe Systems Incorporated | Asynchronous comment updates |
US9329744B2 (en) | 2008-05-12 | 2016-05-03 | Adobe Systems Incorporated | Segmented scroll bar |
US8589161B2 (en) | 2008-05-27 | 2013-11-19 | Voicebox Technologies, Inc. | System and method for an integrated, multi-modal, multi-device natural language voice services environment |
US9305548B2 (en) | 2008-05-27 | 2016-04-05 | Voicebox Technologies Corporation | System and method for an integrated, multi-modal, multi-device natural language voice services environment |
US8893017B2 (en) | 2008-05-29 | 2014-11-18 | Adobe Systems Incorporated | Tracking changes in a database tool |
US8886720B2 (en) * | 2008-06-23 | 2014-11-11 | Microsoft Corporation | Managing unified communications conferences via categories |
CN102362283A (zh) * | 2008-12-05 | 2012-02-22 | 社会传播公司 | 管理网络通信环境中的交互 |
US8331545B2 (en) * | 2008-12-11 | 2012-12-11 | International Business Machines Corporation | Handling communication session disconnection and reconnection |
US9288242B2 (en) | 2009-01-15 | 2016-03-15 | Social Communications Company | Bridging physical and virtual spaces |
US9065874B2 (en) | 2009-01-15 | 2015-06-23 | Social Communications Company | Persistent network resource and virtual area associations for realtime collaboration |
US9319357B2 (en) | 2009-01-15 | 2016-04-19 | Social Communications Company | Context based virtual area creation |
US9853922B2 (en) | 2012-02-24 | 2017-12-26 | Sococo, Inc. | Virtual area communications |
US9942181B2 (en) * | 2009-01-15 | 2018-04-10 | Sococo, Inc. | Context based virtual area creation |
US8326637B2 (en) | 2009-02-20 | 2012-12-04 | Voicebox Technologies, Inc. | System and method for processing multi-modal device interactions in a natural language voice services environment |
WO2011027475A1 (ja) * | 2009-09-07 | 2011-03-10 | 株式会社東芝 | テレビ会議装置 |
US20110083377A1 (en) * | 2009-10-13 | 2011-04-14 | Randall Lee Graffis | Big drawer |
US9171541B2 (en) | 2009-11-10 | 2015-10-27 | Voicebox Technologies Corporation | System and method for hybrid processing in a natural language voice services environment |
US9502025B2 (en) | 2009-11-10 | 2016-11-22 | Voicebox Technologies Corporation | System and method for providing a natural language content dedication service |
KR101565665B1 (ko) | 2010-08-16 | 2015-11-04 | 소우셜 커뮤니케이션즈 컴퍼니 | 네트워크 통신 환경에서 커뮤니컨트 상호작용을 촉진하는 방법 |
EP2614482A4 (en) | 2010-09-11 | 2014-05-14 | Social Communications Co | RELATIONSHIP-BASED PRESENCE DISPLAY IN VIRTUAL AREA CONTEXTS |
WO2012135231A2 (en) | 2011-04-01 | 2012-10-04 | Social Communications Company | Creating virtual areas for realtime communications |
US9230549B1 (en) | 2011-05-18 | 2016-01-05 | The United States Of America As Represented By The Secretary Of The Air Force | Multi-modal communications (MMC) |
US20130171975A1 (en) * | 2012-01-04 | 2013-07-04 | Qualcomm Incorporated | Selectively Buffering Media In Response To A Session Disruption Within A Wireless Communications System |
US20130268592A1 (en) * | 2012-04-06 | 2013-10-10 | Gface Gmbh | Content-aware persistent user room |
GB2511668A (en) * | 2012-04-12 | 2014-09-10 | Supercell Oy | System and method for controlling technical processes |
US20140032670A1 (en) * | 2012-07-30 | 2014-01-30 | Google Inc. | Access control in communication environments |
US10218754B2 (en) | 2014-07-30 | 2019-02-26 | Walmart Apollo, Llc | Systems and methods for management of digitally emulated shadow resources |
US9626703B2 (en) | 2014-09-16 | 2017-04-18 | Voicebox Technologies Corporation | Voice commerce |
US9898459B2 (en) | 2014-09-16 | 2018-02-20 | Voicebox Technologies Corporation | Integration of domain information into state transitions of a finite state transducer for natural language processing |
US9747896B2 (en) | 2014-10-15 | 2017-08-29 | Voicebox Technologies Corporation | System and method for providing follow-up responses to prior natural language inputs of a user |
US10614799B2 (en) | 2014-11-26 | 2020-04-07 | Voicebox Technologies Corporation | System and method of providing intent predictions for an utterance prior to a system detection of an end of the utterance |
US10431214B2 (en) | 2014-11-26 | 2019-10-01 | Voicebox Technologies Corporation | System and method of determining a domain and/or an action related to a natural language input |
US20170054768A1 (en) * | 2015-08-20 | 2017-02-23 | Avaya Inc. | System and method for free-form conference |
US11044296B1 (en) * | 2015-09-18 | 2021-06-22 | Marvell Asia Pte, Ltd. | Ethernet controller with integrated TSN/AVB control point and time slave |
US9609121B1 (en) * | 2016-04-07 | 2017-03-28 | Global Tel*Link Corporation | System and method for third party monitoring of voice and video calls |
WO2018023106A1 (en) | 2016-07-29 | 2018-02-01 | Erik SWART | System and method of disambiguating natural language processing requests |
US11271762B2 (en) * | 2019-05-10 | 2022-03-08 | Citrix Systems, Inc. | Systems and methods for virtual meetings |
CN111147440A (zh) * | 2019-11-11 | 2020-05-12 | 视联动力信息技术股份有限公司 | 一种基于视联网的状态信息处理方法及装置 |
US11750745B2 (en) | 2020-11-18 | 2023-09-05 | Kelly Properties, Llc | Processing and distribution of audio signals in a multi-party conferencing environment |
DE102021101645A1 (de) * | 2021-01-26 | 2022-07-28 | alfaview Video Conferencing Systems GmbH & Co. KG | Videokonferenzsystem und zugehöriges Computerprogrammprodukt |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5008853A (en) * | 1987-12-02 | 1991-04-16 | Xerox Corporation | Representation of collaborative multi-user activities relative to shared structured data objects in a networked workstation environment |
IT1219727B (it) * | 1988-06-16 | 1990-05-24 | Italtel Spa | Sistema di comunicazione a larga banda |
US5136634A (en) * | 1989-03-10 | 1992-08-04 | Spectrafax Corp. | Voice operated facsimile machine network |
JP2793308B2 (ja) * | 1989-12-21 | 1998-09-03 | 株式会社日立製作所 | 対話システム |
US5195086A (en) * | 1990-04-12 | 1993-03-16 | At&T Bell Laboratories | Multiple call control method in a multimedia conferencing system |
US5193110A (en) * | 1990-10-09 | 1993-03-09 | Boston Technology, Incorporated | Integrated services platform for telephone communication system |
US5253341A (en) * | 1991-03-04 | 1993-10-12 | Rozmanith Anthony I | Remote query communication system |
US5192999A (en) * | 1991-04-25 | 1993-03-09 | Compuadd Corporation | Multipurpose computerized television |
US5347306A (en) * | 1993-12-17 | 1994-09-13 | Mitsubishi Electric Research Laboratories, Inc. | Animated electronic meeting place |
-
1993
- 1993-04-22 US US08/052,492 patent/US5471318A/en not_active Expired - Lifetime
-
1994
- 1994-04-01 TW TW083102895A patent/TW239248B/zh not_active IP Right Cessation
- 1994-04-15 DE DE69433643T patent/DE69433643T2/de not_active Expired - Lifetime
- 1994-04-15 BR BR9406356A patent/BR9406356A/pt unknown
- 1994-04-15 NZ NZ266588A patent/NZ266588A/xx not_active IP Right Cessation
- 1994-04-15 EP EP94916535A patent/EP0698328B1/en not_active Expired - Lifetime
- 1994-04-15 JP JP6523502A patent/JP3032014B2/ja not_active Expired - Fee Related
- 1994-04-15 KR KR1019950704673A patent/KR100312668B1/ko not_active IP Right Cessation
- 1994-04-15 AU AU68155/94A patent/AU679995B2/en not_active Ceased
- 1994-04-15 WO PCT/US1994/004209 patent/WO1994024807A1/en active IP Right Grant
- 1994-04-15 CN CN94191862A patent/CN1121758A/zh active Pending
- 1994-04-15 CA CA002160895A patent/CA2160895C/en not_active Expired - Lifetime
-
1995
- 1995-03-16 US US08/405,062 patent/US6392760B1/en not_active Expired - Lifetime
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103238149A (zh) * | 2010-10-15 | 2013-08-07 | 惠普发展公司,有限责任合伙企业 | 输入/输出通信 |
CN103580879A (zh) * | 2012-08-02 | 2014-02-12 | 华为技术有限公司 | 一种会议资源分配方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
EP0698328B1 (en) | 2004-03-24 |
BR9406356A (pt) | 1996-01-02 |
KR100312668B1 (ko) | 2001-12-28 |
WO1994024807A1 (en) | 1994-10-27 |
NZ266588A (en) | 1997-01-29 |
DE69433643D1 (de) | 2004-04-29 |
TW239248B (zh) | 1995-01-21 |
DE69433643T2 (de) | 2004-12-23 |
CA2160895A1 (en) | 1994-10-27 |
CA2160895C (en) | 2004-06-15 |
EP0698328A4 (en) | 1999-11-03 |
JPH08511917A (ja) | 1996-12-10 |
EP0698328A1 (en) | 1996-02-28 |
US5471318A (en) | 1995-11-28 |
JP3032014B2 (ja) | 2000-04-10 |
AU679995B2 (en) | 1997-07-17 |
US6392760B1 (en) | 2002-05-21 |
KR960702243A (ko) | 1996-03-28 |
AU6815594A (en) | 1994-11-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1121758A (zh) | 多媒体通信网络 | |
CN100351745C (zh) | 调用预定时间视频会议的服务器 | |
CN1226885C (zh) | 无线电通信装置和其中建立双模式呼叫的方法 | |
CN100344097C (zh) | 视频会议呼叫建立 | |
CN1263302C (zh) | 远程会议系统和远程会议支持方法 | |
CN1227862C (zh) | 多媒体信息通信系统 | |
CN1133662A (zh) | 面向对象的电话系统 | |
CN1312635A (zh) | 多业务通信系统及方法 | |
CN1242588C (zh) | 网络访问系统 | |
CN1258291C (zh) | 多媒体信息通讯服务系统、使用者终端用程序及记录介质 | |
CN1852081A (zh) | 一种通过下一代网络实现多方会议的方法 | |
CN1223936C (zh) | 网络应用程序分散执行系统,终端设备及其网络应用程序执行方法,以及终端设备的操作方法 | |
CN1914893A (zh) | 用Web浏览器统一管理局域网、广域网和因特网上的不同类型的通信的方法及装置 | |
CN1677979A (zh) | 通过网络在计算机之间共享对象的系统和方法 | |
CN101064726A (zh) | 地址变换装置、消息处理方法及网络系统 | |
CN1870532A (zh) | 一种信令跟踪方法和系统 | |
CN1359585A (zh) | 用于从配置在综合电信网络中的实体中提供至业务节点的接入的系统与方法 | |
CN1643505A (zh) | 视频会议系统结构 | |
CN1805442A (zh) | Ims网络中具有会聚应用服务器逻辑和网关逻辑的呼叫控制 | |
CN1497932A (zh) | 管理个人电话记录的系统和方法 | |
CN1941816A (zh) | 生成电信会议控制消息或控制电信会议的方法及相关装置 | |
CN1615646A (zh) | 通信装置 | |
CN1399839A (zh) | 包括一个或多个有程序设计功能的电话通信设备的分布式通信网络 | |
CN1838763A (zh) | 可视通信服务器、可视通信程序及可视通信方法 | |
CN1848881A (zh) | 通信过程中处理主叫号码显示的实现方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C01 | Deemed withdrawal of patent application (patent law 1993) | ||
WD01 | Invention patent application deemed withdrawn after publication |