CN1121758A - 多媒体通信网络 - Google Patents

多媒体通信网络 Download PDF

Info

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
Application number
CN94191862A
Other languages
English (en)
Inventor
苏迪尔·拉曼·阿胡贾
穆拉利·阿拉范穆丹
詹姆斯·罗伯特·恩索尔
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
AT&T Corp
Original Assignee
AT&T Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by AT&T Corp filed Critical AT&T Corp
Publication of CN1121758A publication Critical patent/CN1121758A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N1/00Scanning, transmission or reproduction of documents or the like, e.g. facsimile transmission; Details thereof
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L12/00Data switching networks
    • H04L12/02Details
    • H04L12/16Arrangements for providing special services to substations
    • H04L12/18Arrangements for providing special services to substations for broadcast or conference, e.g. multicast
    • H04L12/1813Arrangements for providing special services to substations for broadcast or conference, e.g. multicast for computer conferences, e.g. chat rooms
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04MTELEPHONIC COMMUNICATION
    • H04M3/00Automatic or semi-automatic exchanges
    • H04M3/42Systems providing special services or facilities to subscribers
    • H04M3/56Arrangements for connecting several subscribers to a common circuit, i.e. affording conference facilities
    • H04M3/567Multimedia conference systems
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N1/00Scanning, transmission or reproduction of documents or the like, e.g. facsimile transmission; Details thereof
    • H04N1/32Circuits 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
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04MTELEPHONIC COMMUNICATION
    • H04M3/00Automatic or semi-automatic exchanges
    • H04M3/42Systems providing special services or facilities to subscribers
    • H04M3/42221Conversation recording systems
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04MTELEPHONIC COMMUNICATION
    • H04M3/00Automatic or semi-automatic exchanges
    • H04M3/42Systems providing special services or facilities to subscribers
    • H04M3/56Arrangements for connecting several subscribers to a common circuit, i.e. affording conference facilities
    • H04M3/562Arrangements for connecting several subscribers to a common circuit, i.e. affording conference facilities where the conference facilities are distributed
    • YGENERAL 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
    • Y10TECHNICAL SUBJECTS COVERED BY FORMER USPC
    • Y10STECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10S379/00Telephonic communications
    • Y10S379/908Multimedia

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)
  • 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)&amp; 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)&amp; 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)&amp; server list,

                                          int src, int room id, int meeting_id,

                                          List(int)&amp; 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)&amp; server list,int src,

                                         int room_id,int meeting_id, Media med,

                                         String&amp; 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)&amp; 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)&amp; server_list,int src,

                                                        int room_id,int meeting_id, Media med,

                                                        String&amp; user_desc, List(int)&amp; 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)&amp; 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)&amp; 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)&amp; part_list);

        void server_conn_list(int room id,List(MmConnection)&amp; conn_list);        

        void fend_conn_list(List(MmConnection)&amp; 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&amp; info)

                                    {info=conn_info;return O;}

        void set_manager_port(int port){mgr_conn_info.port=port;}

        int get_manager_connection(MediaServerConn&amp; 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&amp; m, String&amp; user_desc);

    int get_server_connection(Media m, String&amp; user_desc,    

                                                        MediaServerConn&amp; conn);

    int get_manager_connectioa(Media m,String&amp; user_desc,

                                                        MediaServerConn&amp; conn);

    void set_manager_port(Media m,String&amp; user desc,int port);

       MmConnection ServerConncction{int server);

       int get_server id(Media m,String&amp; 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&amp; user_desc,List(int)&amp; part_list); 

       int DropServer(RequestGlass *msg,GARD32 requester, int room_id,

               Media media, String&amp; user_desc);                     

       void DropServer(int room_id, int server_id);

       int SuspendServer(RequestClaas *mag, CAARD32 requester, int room_id,

                Media media, Striag&amp; user_desc);                        

       int ResumeServer(RequestClass *msg,CARD32 requester, int room_id,

                Media media, String&amp; user_desc);                       

       int SetServerAccessList(RequestClass *msg, CARD32 requester, int room_id,

                Media media, String&amp; user_desc, List(int)&amp; 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&amp;;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)&amp; 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&amp; 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)&amp; plist,

                                        Medit pmedia,String&amp; puser_desc);

        void special_action(Block(char)&amp; 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&amp; puser_desc);

        void special_action(Block(char)&amp; 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&amp; puser_desc);

        void special_action(Block(char)&amp; 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&amp; puser_desc);

        void special_action(Block(char)&amp; 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)&amp; plist,

                                 Media pmedia, String&amp; puser_desc);

        void special_action(Block(char)&amp; 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)&amp; room_list,List(String)&amp; 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)&amp; 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)&amp; 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)&amp; 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&amp; 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)&amp; 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)&amp; plist);

        void build(int src,int room_id,int meeting_id,

                             Media med,String&amp; user desc);

        void build(int src,int room_id,int meeting_id,

                             Media med,String&amp; user_desc,List(int)&amp; 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&amp; 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)&amp;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)&amp; 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&amp; type,CARD8&amp; opcdoe,

                                           CARD32&amp; seq CARD32&amp; len);

        Message *construct_msg(char *header,CARD8 type,CARD8 opcode,

                   CARD32 seq,CARD32 len,cahr*data,Connection *conn);
private:

      MessagePtr(*Gen_func_tab[MAX_MSG_TYPES]MAX_MSGS])(char *,

                            CARD8,CARD8,CARD2,CARD32,char *,Connection *);

        MRInterface *Iface;

        Convert *Conv;
};
# 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)&amp; med_list);

       void resume media(kMediaDesc med);           

       void resume media(List_of_p(MediaDesc)&amp; med_list);

       List_of_p{FullMediaDesc)get_mcdia_list(){return(media_list);}
private:

       int id;

       ConfereeStatus status;

       List_of_p(FullMediaDesc) media_list;//list of servers used by
};                                                     //this 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)&amp; info);           

       void get_meeting_partcipants(List(int)&amp; plist);

       int get_meeting_owner(){return owner;}

       MeetingStatus get_meeting_status(){retur*n status;}

       int add_participanrt(int participant);

       int drop_participant(int participant);

       void addmedia(*int participant,MediaDesc med);

       void drop_media(int participant, MediaDesc med);

       void dropmedia(MediaDesc med);                             

       void restrict_media_access(List(int)&amp; part_list,MediaDesc med);

       void suspend_media(MediaDesc med);    

       void resume media(MediaDese med);

       int suspend_meeting();

       int resume_meeting();

       int state_check();

       int leave_meeting(int participant,

                                                    List_of_p(MediaDesc )&amp; media_list);

       int reenter_meeting(int participant,

                                                    List_of_p(MediaDesc)&amp; media_list);
private:

      void drop all_participants();

     void change_owner();

      int id;

      Room *room;

       CARD32 owner;

      MeetingAttrib attrib;

      MeetingStatus status;
Jan  5 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&amp; rname, RoomMgr*rRMgr);

      -Room();

      iht RoomId(){return(id);}

         int MRId(){return(MR_id);}

         iht IsClosed(){return(attrib);}

         String RoomName(){raturn(room_name);}

         void meeting_destroyed();         

         _void meetingcreated(Meeting* m);

      RoomAttrib room_attrib(){return(attrib);}

         void set_room_attrib(RoomAttrib r_attrib){attrib=r_attrib;}

      RoomStatus room status(){return(status);}         

         RoomLockStgus room lock status(){return(lock_status);}

        void set_room_status(RoomStatus r_status){status=r_status;}

      int has_meeting){return(meeting? 1∶O);}       

        Meeting*get_meeting(){return(meeting);}

         int add_server(int server_id,Medis media,String&amp; user_desc,

                            List(int)&amp; part_list);    

         int drop server(int server_id,Medis medis,String&amp; user_desc);

         int suspend_server(int server_id,Medlia medis,String&amp; user_desc);

         int resume_server(int server_id,Medis media,String&amp; user_dese);

         int set_access_list(int server_id,Medis media,String&amp; user_dese,

                                     List(int)&amp; part list);

         int list servers(List_of_p(FullMediaDesc)&amp; media_list);

         int is_server_present(int server_id);            

        void associated_servers(List(int)&amp; serv_list);

        void MediaServerDied(int m);        

      int lock();

         int unlock();

         int state_check(){return O;}
private:

        void set_meeting(Meeting *m);

         int id; 

        String room name;

        Meeting * meeting;;

        RoomAttrib attrib;

         CAR D32 owner;

        int MR id;

        RoomStatus status;

        RoomLockStatus lock status;

      RoomMgr *RMgr;   

        EventNotifier *EveNot;

        MediaServerMgr *MSMgr;

        List_of_p(MediaServerInfoInRoom)server_list;

                       //list of all servers (media ids) in the room

        int err;
};
List_of_pdecare(Room)                                              List_of_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)&amp; slist);

        int ActiveRoom(){return(active_room->Roomld());

                                                                }

        iht CreateRoom(CARD32 owner, RoomAttrib attrib,String&amp; rname);

        int DestroyRoom(CARD32 requester,int id);

        int ListRooms(CARD32 requester, List(int)&amp; rlist,

                              List(String)&amp; name_list);

        int ShowRoomStatus(CARD32 requester,int room_id,

                      RoomStatus&amp; stat, RoomLockStatus&amp; lock_stat);

        int ShowRoomAttributes(CARD32 requester,int room_id,RoomAttrib&amp; attrib);

        int AlterRoomAttributes(CARD32 requester,int room_id,RoomAttrib attrib);

        int LockRoom(CARD32 requester,int room_id);

        int UnlockRoom(CARD32 requester, int room_id);

        int CreateMeeting(CARD32 owner,int room_id,MeetingAttrib attrib);

        int DestroyMeeting(CARD32 requester,int meeting_id);

        int ListMeetings(CARD32 requester,List(int)&amp; rlist);

        int ShowMeetingStatus(CARD32 requester,int meeting_id,

                  List(ParticipantInfo)&amp; info, int&amp; p_room_id,   

                   int&amp; owner, MeetingStatus&amp; status);    

        int ShowMeetRoomstatus(CARD32 requester,int room_id,

                  List(ParticipantInfo)&amp; info, int&amp; p_meeting_id,

                   int&amp; owner,MeetingStatus&amp; status);

        int ListMeetingParticipants(int meeting_id,List(int)&amp; plist);

        int ShowMeetingAttributes(CARD32 requester,int meeting_id,

                                      MeetingAttrib&amp; attrib);

        int AlterMeetingAttributes(CARD32 requester,int meeting_id,

                                                 MeetingAttrib attrib);

        int ShowAssociatedRoom(CARD32 requester, int meeting_id,

                                                      int&amp; room_id);

        int ShowAssociatedMeeting(CARD32 requester,int room_id,

                                                      int&amp; meeting_id);

        int AddParticipant(CARD32 requester,int meeting_id, intparticipant)

        int DropParticipant(CARD32 requester,int meeting_id, int participant);

        int SuspendMeeting(CARD32 requester,int meeting_id);

        int ResumeMeeting(CARD32 requester,int meeting_id);

        void MediaServerDied(int m);

        int AddServer(int room_id, int server_id,Media media,

                             String&amp; user_desc,List(int)&amp; part list);                

        int DropServer(int room_idt server_id,Mediamedia, String&amp; user_desc); 

        int SuspendServe(int room_id, int server-id, Media medm, Strm ~&amp; user_desc);

        int ResumeServer(int room-id,int server_id,Media media,String&amp; user_desc);

        int SetAccessList(int room_id, intt serverid, Media media,

                             String&amp; user desc, List(int)&amp; part list);

        Lat ListServers(CARD32 requester, inst room_id,                

                                                 List of_p(FullMediaDesc)&amp; media_list);

        int LeaveMeeting(CARD32 requester,int meeting_id,       

                                                 List of_p(MediaDesc)&amp; media_list);

        int ReenterMeeting(CARD32 requester,int meeting_id,         

                                                 List_of_p(MediaDesc)&amp; media_list);
private:

        int generate_room_id();

        void free_room_id(int id);

        int generate_meeting_id();
Jan 5 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&amp; pUserDesc,

                              MediaServerConn&amp; pConn, String&amp; pInitializer,

                              String&amp; pOtherInfo);

         Media MediaType;

         String UserDesc;

         String Initializer;

         String OtherInfo;

         MediaServerConn Conn;
};
atruet MRServerConnInfo {

         MRServerConnInfo(String&amp; pMachine,int pPort,int pStartRange,

                                        int pEndRange)

                   {Machine=pMachine;Port=pPort;StasrtRange=pStartRange;

                             EndRange=pEndRange;}

         String Machine;

         int Port;

         int StartRange;

         int EndRange;
};
List_of_pdeclare(MediaServerInfo);
List_of_pdeclare(MRServerConnInfo);
class ServerRegistry{
public:

         ServerRegistry(MRInterface *irace, String p_in_file);

         void LisrAllMediaServerInfo(List_of_p(MediaServerInfo)&amp; plist);

        void ListAllMRServerConnInfo(List_of_p(MRServerConnInfo)&amp; slist);

        MediaServerInfo* ListMediaServerInfo(Media med, String&amp; key);

         int in_my_range(int id){return((id>=MyStartRange &amp;&amp;

                                                                                                      id <=MyEndRange)?1∶O);}

        int server_for_id(int id,String&amp; mach, int&amp; port);

        void default_name server(String&amp; mach,int&amp; port);

        void my_range(Range&amp; r){rstart=MyStartRange; r.end=MyEndRange;}
private:

        void read_file();

        void my range();

        void flush_to_file();

        MRInterface *Iface;

        List_of_p(MediaServerInfo) MediaServerList;

        List_of_p(MRScrverConnInfo)MRServerList;

        String MyName,name server mathine;

        int MyStartRange, MyEndRange,name_server_port;

        String in_file,out_file;
};
#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 &amp;&amp; m->msg_seq_no()==msg_seq){ 

                             Conv()->IntToBuf(p->GetOrigSeq(), header+MSG_HOFFSET_SEQ);

                         m->MsgSorce()->reply_for_routed_msg(m,header,        

                                       buf, msg_len);

                             mlist.remove_prev();

                             delete p;

            }

     }
} //process_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)&amp; server_list,           

            int src,int room_id,int meeting_id,int participant):

                   EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len,

                                  msg_data,invoker,server_list)   
{

         build(src,room_id,meeting_id,participant);

         send_event();            
EveTemplate2:EveTemplate2(char *header,CARD8 msg_typ,

                   CARD8 msg_code,int msg_seq_no,int msg_len,char*msg_data,

            Connection *invoker,List(MmConneection)&amp; sever_list,           

              int src,int room_id) :                          

                   EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len,

                                   msg_data,invoker,server_list)   
{

         build(src,room_id);

     send_event();  
EveTemplate3::EveTemplate3(char *header,CARD8 msg_typ,

                   CARD8 msg_code,int msg_seq_no,int msg_len,char *msg_data,

           Connection *invoker,List(MmConnection)&amp; server_list,            

           int src,int room_id,int meeting_id,List(int)&amp; plist):

                   EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len,

                                          msg_data,invoker,server_list)   
{

        build(src,room_id,meeting_id,plist);

        send_event();  
EvcTemplate4::EveTemplate4(char *header,CARD8 msg_typ,

                   CARD8 msg_code,int msg_seq_no,int msg_len,char *msg_data,

           Connection *invoker,List(MmConnection)&amp; server_list,int src,   

                   int room_id,int meeting_id,Media med,String&amp; user_desc):

                   EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len,

                                  msg_data,invoker,server_list)   

        build(src,room_id,meeting_id,med,user_desc);

        send_event();  
}
EveTemplate5::EveTemplate5(char *header,CARD8 msg typ,

                   CARD8 msg_code,int msg_seq_no,int msg_len,char *msg_data

           Connection *invoker,List(MmConnection)&amp; serverl_list,

           int src,int room_id,int meeting_id) :         

                   EventClass(header,msg_trp,msg_code,msg_seq_no,msg_len,

                                            msg_data,invoker,server_list)   
{

        build(src,room_id,meeting_id);

        send_evennt();  
}
EveTemplate6::EveTemplate6(char*header,CARD8 msg_typ,

                   CARD8 msg_code,int msg_seq_no,int msg_len,char *msg_data,

           Connection *invoker,List(MmConection)&amp; sever_list,int src,

                   int room_id,int meeting_id,Media med,String&amp; user_desc,

                   List(int)&amp; part_list):                 

                   EventClass(header,msg_typ,msg_code,msg_seq_no,msg_len,

                                  msg_data,invoker,server_list)   

        build(src,room_id,meeting_id,med,user_desc,part_list);

        send_event();                           
Jan  5 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)&amp; conn_list)
{

         int server;

       List(int) server_list;

         Iface->RoomManager()->AssociatedServersInRoom(room_id,server_list);

         conn_list.reset();
#ifdef DEBUG

         cout << ″Server List Length: ″<<server_lsit.length()<<endl;

      cout.flush();
#endif

      server_list.reset();

      while(server_list.next(server)){

                   conn_list.insert_next(Iface->

                                 MediaServerManager()->ServerConnection(server));

         //Should also include all the FrontEnd connections in list

         //so that they too receive the events

         List_of_p(FrontEnd) fend_list;

         FrontEnd*fend;       

      Iface->FEManager>GetObjectList(fend_list);

      fend_list.reset();                       

         while (fend_list.nert(fend)){                      

                   if(fend) conn_list.insert_next(fend->connection());
#ifdef DEBUG

         cout<<″Event Conn List Length:″<< conn_list.length()<<endl;

      cout.flush();
#endif
void EventNotifier::fend_conn_list(list(MmConnection)&amp; conn_list)                                  List

        List_of_p(FrontEnd) fend_list;

        FrontEnd *fend;        

        conn_list.reset();

        Iface- >FEManager()->GetObjectList(fend_list);

        fend list.reset();                        

        while (fend_list.next(fend)){

                   if (fend) conn_list.insert_next(fend->connection());

      }
}
void EventNotifier::Templatel(CARD8 code,int room_id,int src,

                                             int meeting_id,int participant)
{

        List(MmConnection) conn_list;

        EveTemplatel*eve;     
Jan  5 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)&amp; 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)&amp; 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)&amp; 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 &amp;&amp; m->mgs_seq_no()==stimulant()){

                          if(type==ERROR_GEN_SERVER &amp;&amp; m->stimulant()){

                              (void)m->stimulant()->error_obj()->e_action

                                             ERROR_MR_SERVER,(CARD32)m->stimulant()- >msg_code(),

                                   m->stimulant()->msg_seq_no(),-ERR_SERV_CONN_REJECT);

                                                                                                                                                                                                                                                        
Jan   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 &amp;&amp; med->medium()==m){

                  if(Iface->RoomManager()->IsServerPresent(room,med->Serverld()))

                         return(-ERR_SERVER_ALREADY_ADDED);

                  found=med->ServerId();

                  break; 

             }

      }

        if(fonnd==-1){// Not in the list. Create a new one.

              if(info=Iface ->ServRed()->List Media ServerInfo(m,user desc)){

                    if(info->Conn.conn_type==INTERNET_CONNECTION){

                              server=NW->CallServer(info->Conn.machine.dump(host),

                                                                      info->Conn.port);

                              if(server->IsAssigned()==MmEnum::MmFalse){

                                     cout<<″Cannot connect to″<<info->Conn.machine

                                           <<″::″<<info->Conn.port<<endl;

                                     return(-ERR_CANNOT_CONTACT_MEDIA_SERVER);

                            }

                           server->NameTag(″MS″);

                           med=new MediaServer(Iface,server,++next_server_id,

                           if(med)                            room,info);

                                 server_list.insert_next(med);

                    }

             }

             else{

                          return(-ERR_CANNOT_CONTACT_MEDIA_SERVER);

             }

      }

       if (!med)return(-ERR_NO_TESOURCES);

       //send an AssociateServer msg to the media server

       msg=new AssociateServer(stimulant,NULL,REQUEST_GEN_SERVER,

                          GEN_ASSOCIATE_SERVER,next_seq_no(),O,NULL,med,

                          room,part list,m,user desc);

     if(!msg)return(-ERR_NO_RESOURCES);

       if{med->send request_msg(msg))<0)

             return(-ERR_CANNOT_CONTACT_MEDLA_SERVER);

     return(0);
}
MediaServer * MediaserverMgr::get_media_server(Media m,String user_desc)       get_ media_server
{

       List_of_piter(MediaServer)slist(server_list);

       MediaServer *med=(MediaServer *)NULL;

       int dummy;

       slist.reset();

     while(slist.next(med)){

                dummy=(med->user_desc()==user desc)?1:0;

                if(dummy &amp;&amp; med->medium()==m)

                         break;

       }

       return(med);
{
MediaServer *MediaServerMgr::get_media_serer(int sever_id)              get_media_server
{

       List_of_piter(MediaServer)slist(server list);

       MediaServer *med=(MediaServer *)NULL;

       ine dummy;

       slist.reset();

       while(slist.next(med)){

             if(med->ServerId()==server_id)
Jan  5 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&amp; user_desc,List(int)&amp; part_list)          
{

       int serv;

        //ADD SECURITY

        // if bad room,error.If server already in room,error.If cannot

        // contact server,error.

     if(Iface->RoomManager()->is valid_room(room_id))

                  return(-ERR_BAD_ROOM_ID)         

        return(init_media_server(msg,room_id,media,user_desc,part_list));
}
int 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&amp; user_desc)
{

        MediaServer *serv;

        MedServRequestClass *req;

                //ADD SECURITY

            (!Iface->RoomManger()->is_valid_room(room_id))

            return(-ERR_BAD_ROOM_ID);         

        if((serv=get_media_server(media,user_desc))==(MediaServer*)NULL)

           return(-ERR_CANNOT_CONTACT_MEDIA_SERVER);
Jan  5 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&amp; user_desc)
{

         MediaServer *serv;

         MedServRequestClass *req;

         //ADD SECURITY

         if(!Iface->RoomManager()->is_valid_room(room_id))

                   return(-ERR_BAD_ROOM_ID)         

     if((serv=get_media_server(media,user_desc))==(MediaServer*)NULL)

                   return(-ERR_CANNOT_CONTACT_MEDIA_SERVER);

         req=new GenResmeServer(msg,NULL,REQUEST_GEN_SERVER,

                              GEN_RESUME_SERVER,next_seq_no(),O,NULL,serv,

                              room_id,media,user_desc);   

     if(!req)return(-ERR_NO_RESOURCES);

         if(serv->send_request_msg(req)<O)

                   return(-ERR_CANNOT_CONTACT_MEDIA_SERVER);

     return(o);
}
int MediaServerMgr::SetServerAccessList(RequestClass *msg,

                   CARD32 requesr,int room_id,Media media,String&amp; user desc,

              List(int)&amp; part_list)                               
{

         MediaServer *serv;

        MedServRequestClass *req;

         //ADD SECURITY

         if(Iface->RoomManager()->is_valid_room(room_id))

             return(-ERR_BAD_ROOM_ID)        

     if((serv=get_media_server(media,user_desc))==(MediaServer*)NULL)

                   return(-ERR_CANNOT_CONTACT_MEDIA_SERVER);

     req=new SetAccessList(msg,NULL,REQUEST_GEN_SERVER,

                             GEN_SET_ACCESS_LIST,next_seq_no(),O,NULL,serv,

                             room_id,part_list,media,user_desc);

     if(!req)return(-ERR_NO_RESOURCES);  

        if(serv->send_request_msg(req)<O)

                   return(-ERR_CANNOT_CONTACT_MEDIA_SERVER);

     return(o);
}
void 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&amp; user_desc,

                                           Media ServerConn&amp; conn)   
{

       List_of_piter(MediaServer)slist(server_list);

       MediaServer *med=(MediaServer *) NULL;

       int dummy;

     slist.reset();

       while(slist.next(med)){

                dummy=(med->user_desc()== user_desc)?1 :0;

                if(med->medium()==m&amp;&amp; dummy)

                         return(med->get_server_connection(conn));

     }

       return(-1);
int MediaServerMgr::get_manager connection(Media m, String&amp; user desc,

                                     MediaServerC onn&amp; conn)     
{

       List_of_piter(MediaServer)slist(server_list);

       MediaServer *med =(MediaServer *) NULL;

       int dummy;

       slist.reset();

       while(slist.next(med)){

                 dummy =(med->user_desc()==user_desc)?1 :0;

                if(med->medium()==m &amp;&amp; dummy)

                         return(med->get_manager_connection(conn));

     }

     return(-1);
void MediaServerMgr::set_manager_port(Media m,String&amp; user_desc,

                                                    int port)
{

       List_of_piter(MediaServer) slist(server_list);

       MediaServer(*med=(MediaServer *)NULL;

       int dummy;

     slist.reset();

       while(slist.next(med)){

                dummy=(med->user_desc()==user_desc)?1∶0;

                if(med->medium()==m &amp;&amp; dummy)

                         med->set_manager_port(port);

     }
Jan  5 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&amp; user desc)                      get_server_id
{                                                                                                                                                                     

         List_of_piter(MediaServer)slist(server_list);

                   MediaServer*med=(MediaServer *)NULL;

        int dummy;

     slist.reset();

       while(slist.next(med)){

             dummy=(med->user_desc()==user_desc)?1∶0;

               if(med->medium()== m &amp;&amp; dummy)

                        return(med->ServerId());

     }
 return(-1);
}
int MediaServerMgr:get_server_info(int server,Media&amp; m,
{                                                  String&amp; user_desc)

     list_of_piter(MediaServer) slist(server_list);

         MediaServer *mde=(MediaServer *)NULL;

       int dummy;

    slist.reset{);

     while(slist.next(med)){

                if(med->ServerId()==server){

                         m=med->medium();

                         user_desc=med->user_desc();

                 return(O);

            }

     }

  return(-1);
}
MmConnection 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
Figure A9419186201291
Figure A9419186201301
Figure A9419186201311
medserv_msg. C                                           medserv_msg.C
   //return(e_MSG_PENDING);                                             ...action
} //GetServerInfo::acction
void REP_GetServerInfo::r_sction(MedisServerConn&amp; conn)                                   r_action
{                                                                     

        int rep_len,pos=MSG_HEADER_LEN;

        rep_buf.reserve(conn.machine.length()+8);

       rep_buf[pos++]=INTERNET_CONNECTION;

       Conv->IntToBuf(conn.nachine.length(),((char *)rep buf)+pos);pos+=4;

     strcpy(((char_ *)rep_buf)+pos,conn.machine);pos+=conn.machine.lensth();

       Conv->IntToBuf(conn.port,((char *)rep_buf)+pos);pos+=4;

       rep_len=len_in_CARD32(pos-MSG_HEADER_LEN);

       fill_reply_header(type,opcode,seq_no,rep_len;

       (void)Invoker->send(rep_buf,MSG_HEADER_LEN+rep_len*4);
}
///////////////////////////////////
//MedServRequest class metbods
///////////////////////////////////
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)&amp; plist,

                      Media pmedia, String&amp; puser_desc):

                MedServRequestClass(stimulant,header,msg_typ,

                      msg_code,msg_seq_no,msg_len,msg_data,invoker,

                               proom,pmedia,puser_desc)
{

        art_list=plist;

        //sbould send part_list LATER

       common_build();
}
void AssociateServer::special_action(Block(ehar)&amp; reply_data,

                                                                       int rdata_len)
{

       REP AddServer *reply;

       MediaServerConn conn;

       int server_port;

       int server_id;

     int err=-ERR_SERV_CONN_REJECT;

       server_port=Conv->BufToInt(reply_data);

       //The Media Server would hare returned the port,number in which it

       //it is listcning for connections from the Local Media Agents. The

       //MR Server would know aoout the machine name of the Media Server

       //as it was able to connect to the Media Server.

       (void)MSMgr->set_manager_port(media,user_desc,server_port);

       server_id = MSMgr->get_server_id(media,user_desc);

       if(rdata_len==4 &amp;&amp;(err=RMgr->AddServer

                         (room,server_id,media,user_desc,part_list))>=O &amp;&amp;

                    stim_msg){                

       reply=new REP_AddServer(NULL,REPLY_MR_SERVER,

                                     stim_msg->msg_code(),stim_msg->msg_seq_no(),

                                  O,NULL,stim_msg->MsgSource());

                (void)MSMgr->get_manager_connection(media,user_dese,conn);

                reply->r_action(conn);

                stim_msg->MsgSource()->serviced_msg(stim_msg);

                delete reply;

     }

       if(err<O &amp;&amp; stim_msg){
Jan  5 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&amp; puser_desc):

                MedServRequestClass(stimulant,header,msg_typ,

                      msg_code,msg_seq_no,msg_len,msg_data,invoker,

                                  proom,pmedia,puser_desc)
{

       common_build();
}
void DisassociateServer::special_action(Block(char)&amp; reply data,

                                                             int rdata_len)
{

       int server_id,err;

       server_id=MSMgr->get_server_id(media,user_desc);

       if ((err=RMgr->DropServer(room,server_id,

                         media,user_desc))>=O &amp;&amp; stim_msg){

                (void)stim_msg->error_obj()->success return(REPLY_MR_SERVER,

                               (CARD32)stimulant()->msg_code(),              

                                  (CARD32)stimulant()->msg_seq_no());

       }

       if(err<O &amp;&amp; stim_msg){

                (void)stimulant()->error_obj()->e_action(ERROR_MR_SERVER,

                                  (CARD32)stimulant()->msg_code(), 

                                  (CARD32)stimulant()->msg_seq_no(),-err);

                stim_msg->MsgSource()->serviced_msg(stim_msg);

     }
}
GenSuspen 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&amp; puser desc):

               MedServRequestClass(stimulant,header,msg_typ,

                     msg_code,msg_seq_no,msg_len,msg_data,involrer,

                               proom, pmedia,puser_desc)
{

       common_build();
}
void GenSuspendServer::special action(Block(char)&amp; reply_data,

                                                     int_rdata_len)
{

       int server_id,err;

       server_id=MSMgr->get_server_id(media,user_desc);

       if((err=RMgr->SuspendServer(room,server_id,

                         media,user_desc))>=O &amp;&amp; stim_msg){

                (void)stim_msg->error_obj()->success_return(REPLY_MR_SERVER,

                               (CARD32)stimulant()- >msg code(),

                                  (CARD32)stimulant()->msg_seq_no());

                stim_msg->MsgSource()->serviced_msg(stim_msg);

     }

       if(err<O &amp;&amp; stim_msg){

                (void)stimulant()->error_obj()->e_action(ERROR_MR_SERVER,

                                  (CARD32)stimulant()->msg_code(),    

                                  (CARD32)stimulant()->msg_seq_no(), --err);
Jan  5 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&amp; puser_desc):

                  MedServRequestClass(stimulant,header,msg_typ,

                        msg_code,msg_seq_no,msg_len,msg_data,invoker,

                          proom,pmedia,puser_desc)
{

     common_build();
void GenResumeServer:special_action(Block(char)&amp; reply_data,

                                                 int rdata_len)

        int sever_id,err;

        server_id=MSMgr->get_server_id(media,user-desc);

     if((err=RMgr->ResumeServer(room,server)id,

                    media,user_desc))>=O&amp;&amp; stim_msg){

           (void)stim_msg->obj()->success_return(REPLY_MR_SERVER,

                                    (CARD32)stimulant()->msg_code(),

                           (CARD32)stimulant()->msg_seq_no());

                   stim_msg->MsgSource()->serviced_msg(stim_msg);

     }

     if(err<O &amp;&amp; stim_msg){

            (void)stimulant()->error_obj()->e_action(ERROR_MR_SERVER,

                           (CARD32)stimulant()->msg_code(),

                         (CARD32)stimulant()->msg_seq_no(),-err);

                   stim_msg->MsgSource()->servced_msg(stim_msg);

     }
}
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)&amp; plist,

                         Media pmedia,String&amp; puser_desc):

                  MedServClass(stimulant,header,msg_typ,

                         msg_code,msg_seq_no,msg_len,msg_data,invoker,

                 proom,pmedia,puser_desc)
{

        int p;

        part_list=plist;

    req_buf.reserve(MSG_HEADER_LEN+8+plist.length()*4);

    Conv->IntToBnf(room,((char *)req_buf)+pos);_pos+=4;
   Conv->IntToBnf(plist.length(),((char *)req_buf)+pos);pos+=4;

        while(Plist_next(p)){

     Conv->IntToBuf(p,((char *)req_buf)+pos);pos+=4;

  len=len_in_CARD32(pos)<<2;
   fill_request_header();
}
void SetAccessList::special_action(Block(char)&amp; reply_data,

                                                        int rdata_len)

        int server_id,err;

        server_id=MSMgr->get_server_id(media,user_desc);

       if ((err=RMgr->SetAccessList(room,server_id,media,    

                                         user_desc,part_list))>=O &amp;&amp; stim_msg){

             (void) stim_msg->error_obj()->successr_obj()->sccess_return(REPLY_MR_SERVER,
Jan 5 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  &amp;&amp; stim_msg){

              (void)stimul()->error_obj()->e_action(ERROR_MR_SERVER,

                             (CARD32_stimulant()->msg_code(),

                             (CARD32)stimulamt()->msg_seq_n0(),-err);

              stim_msg->MsgSource()->serviced_msg(stim_msg);
Jan 5 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)&amp; room_list,

                                List(String)&amp; 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)&amp; 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)&amp; 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)&amp; 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) &amp;&amp; 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)&amp;&amp; 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)&amp; plist)                                List
{

        int part;

        len=3+plist.length();

        rep_buf. reserve(MSG_HEADER_LEN+len* 4);

        fill_reply_header(type,opcode,seq_no,len);

        Conv->IntToBuf(idl,((char *)rep_buf)+);pos+=4;

        Conv->IntToBuf(id2,((char *)rep_buf)+pos);pos+=4;

        Conv->IntToBuf(plist.length(),((char *)rep_buf)+pos);pos+=4;

        plist.reset();

        while (plist.next(part)){

           Conv->IntToBuf(part,((char *)rep_buf)+pos);pos+=4;

     }
void EventClass::build(int src,int room_id,int meeting_id,Media med,
{                                String&amp; user_desc)

        int part;

    len=len_in_CARD32(4+4+1+4+user desc.length());

        rep_buf.reserve(MSG_HEADER LEN+len*4);

        Conv->IntToBuf(room_id,((char *)rep_buf)+pos);pos+=4;
Jan  5 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&amp; user_desc,List(int)&amp; plist)
{

       int parc;

    1eh=len_in_CARD32(4+4+1+4+user_desc.length()+4+(4*plist.length()));

       rep_buf.reserve(MSG_HEADER_LEN+len*4);

       Conv->IntToBuf(room_id,((char *)rep_buf)+pos);pos+=4;

       Cony->IncToBuf(meeting_id,((char *)rep_buf)+pos);pos+=4;

     rep_buf[pos++]=(char)med;

       Conv->IntToBuf(user_desc.length(),((char *)rep_buf)+pos);pos+=4;

       scrcpy(((char *)rep_buf]+pos,user_desc);pas+=user_desc.length();

       Cony->IntToBul(plisc.length(),((char *)rep_buf)+pas);pos+=4;

     plit.reset();

       while(plist.next(part)){

                Cony->IncToBuf(part,((char *)rep_buf)+pcs);pos +=4;
#ifdef DEBUG

      cout<<″NUMPART:<<plist.length();coup.flush();
# endif

       fill_reply_header(type,opcode,seq_no,len);
}
void 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,

            }

       }
Figure A9419186201591
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&amp; type, 

                  CARD8&amp; opcode,CARD32&amp; seq,CARD32&amp; len)
{

        int tmp;

        type=headcr[MSG_HOFFSET_TYPE];

        opcode=header[MSG_HOFFSET_CODE];

        if(type<0||type>MAX_MSG_TYPES)type=O;

        if(opcode<0]||opcode>MAX_MSGS)_opcode=O;

        seq=Conv->BufToInt(header+MSG_HOFFSET_SEQ);
#ifdef DEBUG
//cout<< ″IN PROTO SEQ:″<< seq<< endl;
#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&amp; rname,RoomMgr *rRMgr)

         id =room_id;

         attrib=rattr;

         MR_id=owner=rowner;

         status=e EMPTY_ROOM;

         lock_status=e_UNLOCKED;

         meeting=(Meeting *)NULL;

     if (rname==″)

                   room_name=″NoName″;

         else

                   room_name=rname;

     RMgr=rRMgr;

        MSMgr=RMgr->MRIface()->MediaServerManager();

     EveNot=RMgr->MRIface()->EveNotifier();

     EveNot->RoomCreated(RoomId(),O);//src is O (MR)
}
int 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&amp; user_desc,

                               List(int)&amp; 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&amp; user_desc,

                           List(int)&amp; part_list)            
{

        int p;

        MediaDesc med;

        med.server=media;

        med.user_desc=user_desc;

        if(has_meeting()){

                 meeting->restrict_media_access(part_list,med);

                   EveNot->ServerAccessListSet(O,Roomld(),

                           has_meeting()?meeting->MeetingId():O,

                           media,user_desc,part_list);

     }

     return(O);
}
int Room::drop_server(int server_id,Media media,String&amp; user_desc)                   drop_server
{

        MediaDesc med;

        MediaServerInfoInRoom *info;

        server_list.reset();

        while(server_list.next(info)){

                   if(info>server==server_id){

                             delete info;

                             server_list.remove_prev();

            }

     }

        med.server=media;

        med.user_desc=user desc;

        if(has_meeting))  

                 meeting->drop_media(med);
Jan  5 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&amp; user_desc)             suspend server

       MediaDesc med;

       int s;

       MediaServerInfoInRoom *info;

       List_of_piter(MediaServerInfoInRoom)slist(server_list);

       slist.reset();

     while(slist.next(info)){

                if(info->server==server_id)

                         info->status=e_SERV_SUSPENDED;

     }                        

       med.server=media;

       med.user_desc=user_desc;

     if(has_meeting())

               meeting->suspend_media(med);

     return(O);
}
int Room::resume_server(int server_id, Media media, String&amp; user_desc)                resume__server
{

       MediaDesc med;

       int s;

       MediaServerInfoInRoom *info;

       List_of_piter(MediaServerInfoInRoom)slist(server_list);

     slist.reset();

     while(slist.next(info)){

                if(info->server==server_id)

                         info->status=e_SERV_NORMAL;

     }

       med.server=media;

       med.user_desc=user_desc;

     if(has_meeting())

               meeting->resume_media(med);

       return(O);
}
int Room::list_servers(List_of_p(FullMediaDesc)&amp; media_list)                               List_of_p
{

       int s;

       List_of_piter(MediaServerInfoInRoom) slist(server_list);

       FullMediaDesc *m;

       MediaServerInfoInRoom *info;

       MediaServerConn conn_info;

       Media media;

       String user_desc;

       media_list.reset();

     slist.reset();

     while(slist.next(info)){

                if(MSMgr->get_server_info(info->server,media,user_desc)>=O){

                         m=newFullMidiaDesc;

                         m->server=media;

                         m->user_desc=user_desc;

                         m->status=info->status;
Jan  5 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)&amp; serv_list)                                              List
{

        List_of_piter(MediaServerInfoInRoom) slist(server_list);

        MediaServerInfoInRoom *info;                  

        serv_list.reset();

      slist.reset();

        while(slist.next(info)){

                  serv_list.insert_next(info->server);

      }
}
//////////////////////////////////////////////////
//MeetingMethods
//////////////////////////////////////////////////
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)&amp; info)                                     List
{

        List_of_piter(Conferee)clist(conf_list);

        Conferee *c;

        PerticipantInfo p;

      cliet.reset();

        info.reset();

    while(clistnext(c)){

                   p.participant=c->ID();
Jan  5 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)&amp; plist)                                    lsit
{

   List_of_piter(Conferee)clist(conf_list);

     Conferee *c;

   clist.reset();

     plist.reset();

     while(clist.next(c)){

                  plist.insert_next(c->ID());

   }
int 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)&amp; part_list,MediaDesc med)                       list
 {                              

         List

           list_of_piter(Conferee)clist(conf_list);

         Conferee *c;

     clist.reset();

     while (clist.next(c)){

                   part_list.reset();

            if(part_list.find_next(c->ID())

                    c->add_media(med);

                   else

                             c->drop_media(med);

     }
}
int Meeting::leave_meeting(int participant,

                                                  List_of_p(MediaDesc)&amp; media_list)
{

        List

         list_of_piter(Conferee)clist(conf_list);

        Conferee *c;

     clist.reset();

     while(clist.next(c)){

            if(c->ID)()==participant){

                             c->suspend_media(media_list);

                   EveNot->leftMeetint(room->RoomId(),O,MeetintId(),

                                                                              participant);

                    return(O);

       }

     }

        return(-ERR_PARTICIPANT_NOT_PRESENT);
}
int Meeting::reentr_meeting(int participant,

                                        List_of_(MediaDesc)&amp; media_list)

        List

       List_of_piter(Conferee)clist(conf_list);

        Conferee *c;

    clist.reset();       

     while(clist.next(c)){

            if(c->ID()==partcipant){
Jan 5 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 &amp;&amp; m->user_desc==med.user_desc)

                             return;

        if(m=new FulIMediaDesc){

                   m->server=med.server;m->user_desc=med.user_dese;

                   m->status=c_SERV_NORMAL;

                   media_list.insert_next(m);

     }
}
void Conferee::drop_medis(MediaDesc med)                                         drop_media
{

        FullMediaDesc *m;

        media_list.reset();

        while(media_list.next(m)){

                   if(m->server==med.server &amp;&amp; m->user_desc==med.user_desc){

                             media_list.remove_prev();

                             delete m;

                             return;

             }
}
void Conferee::suspend_mmedia(MediaDesc med)                                   suspend_media
{

        FullMediaDesc *m;

        media_list.reset();

        while(media_list.next(m)){

                   if(m->server==med.server &amp;&amp; m->user_desc==med.user_desc){

                             m->status=e_SERV_SUSPENDED;

                             return;

             }

     }
}
void Conferee::suspend_mmedia(List_of_p(MediaDesc)&amp; 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 &amp;&amp;

                                       m->user_desc==mdesc->user_desc){

                           m->status=e_SERV_SUSPENDED;

            }

     }
}
void Conferee::resume_media(List_of_p(MediaDesc)&amp; med_list)                      List_of_p
{

        FulIMediaDesc *m;

        MediaDesc *mdesc;

     med_list.reset();

     while(med_list.next(mdesc)){

            media_list.reset();

                  while(media_list.next(m)){

                            if(m->server==mdesc->server &amp;&amp;

                                m->user_desc==mdesc->user_desc){

                           m->status=e_SERV_NORMAL;

                    }

            }

     }
}
void Conferee::resume_media(MediaDesc med)                                      resume_media
{

        FullMediaDesc *m;

     media_list.reset();

     while(media_list.next(m)){

                   if(m->server==med.server &amp;&amp; m->user_desc==med.user_desc){

                    m- >status=e_SERV_NORMAL;

                             return;

            }

     }
)
//////////////////////////////////////////////////
//RoomMgr Methods
//////////////////////////////////////////////////
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&amp; 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)&amp; rlist,

                                                          List(String)&amp; name_list)

       Room *r;

       List_of_piter(Room) riter(room_list);

     //ADD SECURITY  LATER

    rlist.reset();

       riter.reset();

       name_list.reset();

       whil (riter.next(r)){

                rlist.insert_next(r->RoomId());

            name_list.insert_next(r->RoomName));

     }

     return(SUCCESS);
}
int RoomMgr::ShowRoomStatus(CARD32 requester,int room id,

                         RoomStatus&amp; stat, RoomLockStatus&amp; lock_stat)
{

       Room *r;

       List_of_piter(Room)riter(room_list);

    //ADD SECURITY LATER

       riter.reset();

       while(riter.next(r)){

                if(r->RoomId()==room_ia){

                         stat=r->room_status();

                         lock_stat=r->room_lock_status();

                    return(SUCCESS);

            }

     }

    return(-ERR_BAD_ROOM_ID);
}
int 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&amp; attrib)                ...DestroyRoom
{

       Room *r;

       List_of_piter(Room) riter(room_list);

     //ADD SECURITY LATER

       riter.reset();

       while(riter. next(r)){

                if(r->RoomId()==room_id){

                         attrib=r->room_attrib();

                    return(SUCCESS); 

            }

     }

     return(-ERR_BAD_ROOM_ID);
}
int 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 &amp;&amp;

                             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&amp; rlist)                               List
{

        Room *r;

        Meeting *m;

        List_of_piter(Room) riter(room_list);

        //ADD SECURITY LATER

        rlist.reset();

        riter.reset();

        while(riter.next(r)){

            if(m=r->get_meeting())

                             rlist.insert_next(m->Meetingld());

     }

        return(SUCCESS);
}
int RoomMgr::ShowMeetinStatus(CARD32 requester,int meeting_id,

                   List(ParticipantInfo)&amp; info,int&amp; p_room_id,

                   int&amp; owner,MeetingStatus&amp; status)    
{

       Room *r;

        Meeting *m;

        List_of_piter(Room) riter(room_list);

        //ADD SECURITY LATER

        riter.reset();
Jan  5 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  &amp;&amp;

                                         rm->MeetingId()==meeting_id){

                              m->get_meeting_info(info);         

                              p_room_id=r->RoomId(0;

                              owner=m->get_meeting_owner();

                              status=m->get_meeting_status();

                              return(SUCCESS);      

            }

     }

         return(- ERR_BAD_MEETING_ID);
}
 int RoomMgr::ShowMeetRoomStatus(CARD32 requester, int room id,

                    List(ParticipantInfo)&amp; info, int&amp; p_meeting_id,   

                    int&amp; owner,MeetingStatus&amp; statuss)       
{

         Room *r;

         Meeting *m;

         List_of_piter(Room)riter(room_list);

     // ADD SECURITY LATER

         riter.reeet();

         while(riter.next(r)){

                    if(r->RoomId()==room_id){

                              if(m==r->get_meeting()){

                                        m->get_mneeting_info(info);

                                        p_meeting_id=m->MeetingId();

                                        owner=m->get_meeting_owner();

                                        status=m->get_meeting_status();

                              return(SUCCESS);     

                  }

                       else {

                                        p_meeting_id =owner=-1;

                              return(SUCCESS);

                  }

           }

    }

    return(-ERR_BAD_MEETING_ID);
}
int RoomMgr::ListMeetingParticipants(int meeting_id, List(int)&amp; plist)                          List

        Room *r;

        Meeting *m;

        List_of_piter(Room) riter(room_list );

    //ADD SECURITY LATER

        riter.reset();

        while(riter.next(r)){

                   if((m=r->get_meeting())!=(Meeting *)NULL  &amp;&amp;

                                        m->MeetingId()==meeting_id){

                             m->get_meeting_participants(plist); 

                  return(SUCCESS);

    }

    return(-ERR_BAD_MEETING_ID);
}
int RoomMgr::ShowMeetingAttributes(CARD32 requester,int meeting_id,

                                                             MeetingAttrib&amp; attrib)

        Room *r;

        Meeting *m;

        List_of_piter(Room) riter(room_list);

    //ADD SECURITY LATER

        riter.reset();
Jan  5 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  &amp;&amp;

                           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&amp; meeting_id)   
{

       Room *r;

       Meeting *m;

       List_of_piter(Room)riter(room_list);

     //ADD SECURITY LATER

       riter.reset();

       while (riter.next(r)){

            if(r->Roomld()== room_id){

                         if(r->has_meeting()&amp;&amp;(m=r->get meeting())){

                                  meeting_id=m->Meetingld();  

                           return(SUCCESS);

                    }

                         else

                         return(-ERR_ROOM_HAS_NO_MEETING);

            }                          

     }

     return(-ERR_BAD_ROOM_ID);
}
int RoonMgr::ShowAssociatedRoom(CARD32 requester,int meeting_id,

                                                    int&amp; room_id)
{

       Room *r;

       Meeting *m;

       List_of_piter(Room)riter(room_list);

     //ADD SECURITY LATER

       riter.reset();

       while (riter.next(r)){                         

                if(r->has meeting() &amp;&amp; (m=r->get_meeting()) &amp;&amp;

                           m->MeetingId()==meeting_id){

                         room_id=r->RoomId();     

                         return(SUCCESS);

            }

     }

     return(-ERR_BAD_MEETING_ID);
}
int 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  &amp;&amp;

                                  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  &amp;&amp;

                               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  &amp;&amp;

                                   m->MeetingId()==meeting_id){

                              err=m->drop_participant(participant);

                              if(m->num_conferees()==O){

                                        delete m;

                                        r->meeting_destroyed();

                  }

                  return(err);

           }

    return(-ERR_BAD_MEETING_ID);
}
int 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  &amp;&amp;

                                       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  &amp;&amp;

                                  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&amp; user_desc,List(int)&amp;part_list)
{

       Room *r;

       List_of_piteer(Room) riter(room_list);

     riter.reset();

       while(riter.next(r)){

                if(r->RoomId()==room_id)

                         return(r->add_server(server_id,media,user_desc,part_list));

     }

       return(-ERR_BAD_ROOM_ID);
}
int RoomMgr::DropServer(int room_id,int server_id,Media media,

                                               String&amp; user_desc)
{

       Room *r;

       List_of_piter(Room)riter(room_list);

       riter.reset();

       while(riter.next(r)){

            if(r->RoomId()==room_id)

                         return(r->drop_server(server_id,media,user_desc));

     }

     return(-ERR_BAD_ROOM_ID);
}
int RoomMgr::SuspendServer(int room_id,int server_id,Media media,

                                                String&amp; user_desc)
{

       Room *r;

       List_of_piter(Room)ritet(room_list);

       riter.reset();

       while(riter.next(r)){

            if(r->RoomId()==room_id)

                         return(r->suspend_(server_id,media,user_desc);

     }

     return(-ERR_BAD_ROOM_ID);
}
int RoomMgr:ResumeServer(int room_id,int server_id,Media media,

                                        String&amp; user_desc)
{

       Room *r;

       List_of_piter(Room)riter(room_list);

     riter.reset();

       while(riter.next(r)){

            if(r->RoomId()==room_id)

                   return(r->server(server_id, media,user_desc));

     }

     return(-ERR_BAD_ROOM_ID);
}
int 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&amp; user_desc,List(int)&amp; part_list)            ...ResmeMeeting

       Room *r;

       List_of_piter(Room)riter(room_list);

       riter.rest();

       while(riter.next(r)){

             if(r->RoomId==room_id)

                         return(r->set_access_list(server_id,media,user_desc,part_list));

     }

     return(-ERR_BAD_ROOM_ID);
}
int RoomMgr:ListServers(CARD32 requester,int room id,

                                         List_of_p(FullMediaDesc)&amp; media_list)
{                                                          

       Room *r;

       List_of_piter(Room)rite(room_list);

     riter.reset();

     while(riter.next(r)){

             if(r->RoomId()==room_id)

                         return(r->list_servers(media_list));

     }

     return(-ERR_BAD_ROOM_ID);
}
int RoomMgr:leaveMeeting(CARD32 requester,int meeting_id,

                                         List_of_p(MediaDesc)&amp; media_list)
{

       Room *r;

       Meeting *m;

       List_of_piter(Room) riter(room_list);

     riter.reset();

       while (riter.next(r)){

                if(r->has_meeting() &amp;&amp; (m=r->get_meething()) &amp;&amp;

                                m-->MeetingId()==meeting_id){

                         return(m->leave_meething(requester,media_list));

            }

     }

     return(-ERR_BAD_MEETING_ID);
int RoomMgr::ReenterMeeting(CARD32 requester,int meeting_id,

                                                    List_of_p(MediaDesc)&amp; media_list)
{

       Room *r;

       Meeting *m;

       List_of_piter(Room) riter(room_list);

       riter.reset();

       while(riter.next(r)){

             if(r->has_meeting()&amp;&amp;(m=r->get_meeting)) &amp;&amp;

                               m->MeetingId()==meeting_id}{

                         return(m->reenter_meeting(requester,media_list));

             }

     }

     return(-ERR_BAD_MEETING_ID);
}
void 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)&amp; slist)                           List
{

       Room *r;

       List_of_piter(Room) riter(room_list);

     riter.reset();

     while(riter.next(r)){

            if(r->RoomId()==room_id)

                         r->associated_servers(slist);

     }
}
int ParicipantInfo::operator==(const ParticipantInfo&amp; p)                                    operator
{

       return(participant==p.participant &amp;&amp;

                         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&amp; pUserDesc,

                  MediaServerConn&amp; pConn,Strig&amp; pInitialiser,

                  String&amp; 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 *)&amp;cinet_a,siseof(struct in_addr));

                  bcopy(hp->h_addr,(char *)&amp;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)&amp; plist)              List_of_p
{

        plist=MediaSererList;
}
void ServerRegistry:ListAILMRServerConnInfo(List_of_(MRServerConnInfo)&amp; slist)  List_of_P
{

        sList=MRServerList;
MediaServerInfo* ServerRegistry::ListMediaServerInfo(Media med,

                              String&amp; key)
{

        MediaServerInfo *t;

        List_of_piter(MediaSrverInfo) mlist(MediaServerList);

      mlist.reset();

     while(mlist.next(t)){

        // cout << t->UserDesc: ″<< t->UserDesc <<  endl;
Jan  5 11:56:19 1999                                                                        Page 2 of serv_reg.C
				
				<dp n="d178"/>
server_reg. C                                                  server_reg. C

                    if(t->MediaType==med &amp;&amp; t->UserDesc==key){                     ...List_of_p

                     return(t);                                                 

      }
 // cout.flush();

          return((MediaServerInfo*)NULL);
 }
 void 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&amp; mach,int&amp; port)                      server_for _id

         MRServerConnInfo *s;

         int found=O;

         List_of_piter(MRServerConnInfo)slist(MRServerList);

        slist.reset();

        while(slist.next(s)){

                   if (id>=s->StartRange &amp;&amp; id<=s->EndRange) {

                             port=s->Port;

                             mach=s->Machne;

                             found=1;

                             break;

            }
# ifdef DEBUG
#endif//cout << ″Server_for_id:″<<mach<< ″::″<< port<<endf;

        return(found);
}
void ServerRegisty::default_name_server(String&amp; mach,int&amp; 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(){}
};
Figure A9419186201921
Figure A9419186201931
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&amp; p_udesc)

                           {

                                         int tmp=(udesc==p_udesc)?1∶0;

                                         return((tmp &amp;&amp; (m==p_m))?1∶0);

                            }

             int is_match (Media p_m)

                                         return((m==p_m)?1∶0);

                            }

             void update(Media p_med,string&amp; p_udesc)

                            {

                                         m=p_med;p_udesc=udesc;

                            }

             LocalMediaState state(){return media_state;}

             void set active(){media_state=e_LM_ACTIVE;}

             void set_inactive(){media_state=e_LM_INACTIVE;
 private:

             Media m;

             String udesc;

             LocalMediaState media_state;
};
				
				<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 &amp; p)

                           (

                                        return(m - p.m&amp;&amp;  udeac=p.udeac);

                           }
 */
 );
 List_of_pdaclare(ModiaBridgedesc)
 class mediBridgadescList {
 public:

            mediaBridgedescList();

            -MediaBridgeDEscList();

            //copy constructor

            mediaBridgedescList(const mediaBridgeDescList &amp; rhs);

            //assign constructor

            mediaSridgeDescList&amp; operator-(const MediaBridgadascList &amp; rhs);

            int langth(){return.(list.longth());}

            int num_yet_to_aorvice(){yet_to_service);}

            int nert_bridge_to_service(mediaSridgeDe sc*6 bridge);

            void add(media m,string&amp; user_desc);

            void add(mediaSridgeDesc&amp; med);

            void remove(media m);

            void update(media m,string&amp;machina, int port,int is_active=O);

            void update_prav_request(string&amp; machina, int port,int is_active);

            void updste_applicable_media(medisBridgeDescList&amp; mdesc);

            int is_present (MediaBriDGEdesc*b);

            List_of_P(MadiaBridgeDesc)&amp;media_list(){return list;}

           mediaBridgeDesc* Lastmedia(){return last_msdia;)
private:

           mediaBridgeDasc* node_presant(medi&amp;BridgeDesc*node);

            void assign_or_copy(const mediaBridgeDescList&amp; rhs);

            list_of_p (mediaBridgeDesc)list;

           mediaBridgeDesc*last_media;

                                       //media spacified in the last MR_ADD_SERVER msg

            int yet_to_service;
};
class PartMsdiaBridgeDescList(
public:

            PartMediaBridgeDescList(int p, MediaBridgeDascList&amp; pasd)

                                       {participant=p;med=pesd;}

            int participant(){return participant;}

           MediaBridgeDescList&amp; MediaList(){return med;}
private:

            int     participant;

           MediaBridgeDescList med;
};
List_of_Pdsclare(partMsdiaBridgeDescList)
struct InterObjectBuffer{

           CARD8   msg_type;
				
				<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;
Figure A9419186202061
Figure A9419186202071
Figure A9419186202091
Figure A9419186202111
Figure A9419186202121
Figure A9419186202131
Figure A9419186202151
Figure A9419186202171
Figure A9419186202181
Figure A9419186202191
Figure A9419186202201
Figure A9419186202211
Figure A9419186202221
                   mur
Heading:  cm_msg.h
Date:     Tue Jan26 18:03:54 EST1993
Job-Id:   z-581
Printer:  lwt2
Figure A9419186202261
Figure A9419186202281
Figure A9419186202291
Figure A9419186202301
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;
Figure A9419186202311
Figure A9419186202321
Figure A9419186202351
Figure A9419186202361
Figure A9419186202371
Figure A9419186202381
Figure A9419186202391
Figure A9419186202401
Figure A9419186202421
Figure A9419186202441
Figure A9419186202491
Figure A9419186202511
Figure A9419186202551
Figure A9419186202561
Figure A9419186202571
Figure A9419186202581
Figure A9419186202601
Figure A9419186202621
Figure A9419186202641
Figure A9419186202651
Figure A9419186202661
Figure A9419186202681
Figure A9419186202701
Figure A9419186202711
Figure A9419186202721
Figure A9419186202741
Figure A9419186202751
Figure A9419186202771
Figure A9419186202781
Figure A9419186202811
Figure A9419186202821
Figure A9419186202831
Figure A9419186202861
Figure A9419186202871
Figure A9419186202881
Figure A9419186202901
Figure A9419186202911
Figure A9419186202921
Figure A9419186202931
Figure A9419186202941
Figure A9419186202951
Figure A9419186202971
Figure A9419186202981
     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;
Figure A9419186202991
               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;
Figure A9419186203011
              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
Figure A9419186203041
Figure A9419186203061
Figure A9419186203071

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.一种与多媒体通信网络相连的用户终端,其特征在于,包括:
用户接口;
会话管理器,它与用户接口相连,用于与通信网络中的会话管理器相连;
数据管理器,用于把会话管理器与网络中的数据服务器相连;
视频管理器,用于把会话管理器与网络中的视频服务器相连;以及
声频管理器,用于把会话管理器与网络中的声频服务器相连。
CN94191862A 1993-04-22 1994-04-15 多媒体通信网络 Pending CN1121758A (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US08/052,492 US5471318A (en) 1993-04-22 1993-04-22 Multimedia communications network
US08/052,492 1993-04-22

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
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
US7185054B1 (en) 1993-10-01 2007-02-27 Collaboration Properties, Inc. Participant display and selection in video conference calls
US6594688B2 (en) * 1993-10-01 2003-07-15 Collaboration Properties, Inc. Dedicated echo canceler for a workstation
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
US20030051136A1 (en) * 1995-11-06 2003-03-13 Pavel Curtis 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
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
US6570590B1 (en) 1999-03-02 2003-05-27 Microsoft Corporation Application sharing in a frame
US6850985B1 (en) 1999-03-02 2005-02-01 Microsoft Corporation Security and support for flexible conferencing topologies spanning proxies, firewalls and gateways
US6851053B1 (en) 1999-03-02 2005-02-01 Microsoft Corporation Multiparty conference authentication
WO2000052886A1 (en) * 1999-03-02 2000-09-08 Microsoft Corporation Scalable multiparty conferencing and collaboration system and method of dynamically allocating system resources
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
US7079495B1 (en) 2000-01-04 2006-07-18 Cisco Technology, Inc. System and method for enabling multicast telecommunications
US6804254B1 (en) 2000-01-04 2004-10-12 Cisco Technology, Inc. System and method for maintaining a communication link
US7006494B1 (en) 2000-01-04 2006-02-28 Cisco Technology, Inc. System and method for a virtual telephony intermediary
US7069432B1 (en) * 2000-01-04 2006-06-27 Cisco Technology, Inc. System and method for providing security in a telecommunication network
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
EP1451695A1 (en) * 2001-10-29 2004-09-01 MPNET International, Inc. System, method, 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
US10102713B2 (en) 2002-10-09 2018-10-16 Zynga Inc. 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
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
US7391763B2 (en) * 2002-10-23 2008-06-24 International Business Machines Corporation Providing telephony services using proxies
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
US8065600B2 (en) * 2004-05-14 2011-11-22 Microsoft Corporation Systems and methods for defining web content navigation
US9026578B2 (en) 2004-05-14 2015-05-05 Microsoft Corporation Systems and methods for persisting data between web pages
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
US7734802B1 (en) 2004-05-28 2010-06-08 Adobe Systems Incorporated Dynamically adaptable collaborative electronic meeting space
US8069117B1 (en) 2004-05-28 2011-11-29 Adobe Systems Incorporated Ad hoc access rights in restricted-access electronic 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
WO2007027989A2 (en) 2005-08-31 2007-03-08 Voicebox Technologies, Inc. Dynamic speech sharpening
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
US20070282793A1 (en) * 2006-06-01 2007-12-06 Majors Kenneth D Computer desktop sharing
US8705558B2 (en) * 2006-06-01 2014-04-22 Cisco Technology, Inc. Swapping bandwidth reservations
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
US20080065727A1 (en) * 2006-09-13 2008-03-13 Majors Kenneth D Conferencing system with improved access
US20080066001A1 (en) * 2006-09-13 2008-03-13 Majors Kenneth D Conferencing system with linked chat
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
US8407605B2 (en) 2009-04-03 2013-03-26 Social Communications Company Application sharing
US9813522B2 (en) * 2008-12-05 2017-11-07 Sococo, Inc. Managing interactions in a network communications environment
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
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
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
US9176943B2 (en) 2008-05-12 2015-11-03 Adobe Systems Incorporated Comment presentation in electronic documents
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
US9329744B2 (en) 2008-05-12 2016-05-03 Adobe Systems Incorporated Segmented scroll bar
US8996621B2 (en) 2008-05-12 2015-03-31 Adobe Systems Incorporated Asynchronous comment updates
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
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
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
US8331545B2 (en) * 2008-12-11 2012-12-11 International Business Machines Corporation Handling communication session disconnection and reconnection
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
US9942181B2 (en) * 2009-01-15 2018-04-10 Sococo, Inc. Context based virtual area creation
US9288242B2 (en) 2009-01-15 2016-03-15 Social Communications Company Bridging physical and virtual spaces
US9853922B2 (en) 2012-02-24 2017-12-26 Sococo, Inc. Virtual area communications
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
WO2011059997A1 (en) 2009-11-10 2011-05-19 Voicebox Technologies, Inc. System and method for providing a natural language content dedication service
WO2012024205A2 (en) 2010-08-16 2012-02-23 Social Communications Company Promoting communicant interactions in a network communications environment
KR20130077877A (ko) 2010-09-11 2013-07-09 소우셜 커뮤니케이션즈 컴퍼니 가상 영역 컨텍스트에서 관계 기반 존재 표시
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
WO2014022311A2 (en) * 2012-07-30 2014-02-06 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
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
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
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
US10331784B2 (en) 2016-07-29 2019-06-25 Voicebox Technologies Corporation 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)

* Cited by examiner, † Cited by third party
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

Cited By (2)

* Cited by examiner, † Cited by third party
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
EP0698328A1 (en) 1996-02-28
BR9406356A (pt) 1996-01-02
US6392760B1 (en) 2002-05-21
KR960702243A (ko) 1996-03-28
AU6815594A (en) 1994-11-08
KR100312668B1 (ko) 2001-12-28
AU679995B2 (en) 1997-07-17
DE69433643D1 (de) 2004-04-29
CA2160895C (en) 2004-06-15
EP0698328B1 (en) 2004-03-24
CA2160895A1 (en) 1994-10-27
JPH08511917A (ja) 1996-12-10
TW239248B (zh) 1995-01-21
EP0698328A4 (en) 1999-11-03
NZ266588A (en) 1997-01-29
DE69433643T2 (de) 2004-12-23
US5471318A (en) 1995-11-28
WO1994024807A1 (en) 1994-10-27
JP3032014B2 (ja) 2000-04-10

Similar Documents

Publication Publication Date Title
CN1121758A (zh) 多媒体通信网络
CN100351745C (zh) 调用预定时间视频会议的服务器
CN1231028C (zh) 在不同网络的匿名用户之间智能建立会话的分布式系统
CN1226885C (zh) 无线电通信装置和其中建立双模式呼叫的方法
CN100344097C (zh) 视频会议呼叫建立
CN1263302C (zh) 远程会议系统和远程会议支持方法
CN1227862C (zh) 多媒体信息通信系统
CN1133662A (zh) 面向对象的电话系统
CN1312635A (zh) 多业务通信系统及方法
CN1242588C (zh) 网络访问系统
CN1258291C (zh) 多媒体信息通讯服务系统、使用者终端用程序及记录介质
CN1852081A (zh) 一种通过下一代网络实现多方会议的方法
CN1223936C (zh) 网络应用程序分散执行系统,终端设备及其网络应用程序执行方法,以及终端设备的操作方法
CN1677979A (zh) 通过网络在计算机之间共享对象的系统和方法
CN101064726A (zh) 地址变换装置、消息处理方法及网络系统
CN1870532A (zh) 一种信令跟踪方法和系统
CN1359585A (zh) 用于从配置在综合电信网络中的实体中提供至业务节点的接入的系统与方法
CN1643505A (zh) 视频会议系统结构
CN1805442A (zh) Ims网络中具有会聚应用服务器逻辑和网关逻辑的呼叫控制
CN1497932A (zh) 管理个人电话记录的系统和方法
CN1941816A (zh) 生成电信会议控制消息或控制电信会议的方法及相关装置
CN1615646A (zh) 通信装置
CN1399839A (zh) 包括一个或多个有程序设计功能的电话通信设备的分布式通信网络
CN101047628A (zh) 一种电路域终端接入分组网络实现分组业务的系统和方法
CN1838763A (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