Video Conferencia
From Dokeos
Integración de Servidores:
La nueva funcionalidad de Video Conferencia de Dokeos se basa ahora en 3 servidores adicionales para proporcionar el entorno de video conferencia. Propiamente dicho en realidad son dos servidores TomCat y Red5, OpenLaszlo es un servlet, podría comprenderse como un compilador para renderizar la aplicación (interfase de ususario).
Trabajo esta en camino para necesitar solo el servidor Red5 (y quitar la necesidad del servidor Tomcat).
- TomCat: Servidor de aplicaciones JAVA (Servlet's y JSP)
- Red5: Servidor alternativo a Flash Transiciones
- Laszlo: Servidor de ambientes cinemáticos
El paquete (dokeos-openlaszlo-1.8) incluye el servidor TomCat., aunque al momento de la revisión puede presentar alteraciones sobre algunos sistemas respecto a los nombres de archivo que se corregirán en un futuro cercano. Por el momento es una aventura intentar instalarlo así que tómelo con calma.
Algunos de los presentes temas ayudarán a comprender e instalar con mayor suavidad el sistema de videoconferencia que es duda una de las fortalezas más importantes de la versión actual.
- Conocimientos del lado del servidor
- Tendencias de los desarrollos actuales RIA sobre los que se base la propuesta openLaszlo
- Esquemas de trabajo en los servidores de contenedores tipo TomCat para correr WAR (Archivos de Recursos Web)
- Paradigmas de los servlets de conformidad con J2E SUM
Sinopsis del funcionamiento del sistema de video conferencia DOKEOS
El modelo se base en 3 servidores: Apache Jerónimo donde corre la aplicación Dokeos, Toma Cat para el intercambio dinámico de los datos entre la aplicación LPS de openLazlo y red5 y las respuestas desde estos dos hacia apache en la aplicación dokeos.\
Todo ello se realiza en forma transparente para el usuario quien solo ve una aplicación corriendo en dokeos "la interfase gráfica". Sin embargo para que tales transacciones sean posibles son necesarios algunos pasos importantes para la comunicación de los datos. El aspecto mágico e importante consiste en crear el Plugin de conexión de puertos entre apache y tomCat lo cual es provisto por una extención de apache denominada mod_jdk la cual ha sido creada tanto para apache como para IIS. Esto quiere decir que si prefiere utilizar IIS por que se sienta más cómodo o con un conocimiento mayor puede preferir una DLL o bien un modulo .so para su distribución de apache.
En función de cualquier bifurcación que opte IIS o Apache necesitará crear el proceso complementario para la configuración de TomCat consistente en la creación de un mecanismo llamado WOKERS. Estos workers serán los que se encargarán realmente de hacer el paso mágico de los datos entre tomCat sus procesos y la respuestas devueltas al maravilloso puerto 80.
La aplicación LPS de openlazlo se comunica vía remota al servidor RED5 para crear los flujos de información en los diversos esquemas de funcionamiento tales como grabación, streaming o eco para crear los contenidos en FLV o Video conferencia en tiempo real. Una forma sencilla de comprender estos procesos de programación distribuida son similares a una mesa de billar donde el proceso (información) se envia a una banda y esa la empuja a la siguiente banda hasta completar las tres bandas y hacer una carambola.
RED5 es más pesado que tomCat, así que necesitará una máquina potente con suficiente memoria ram ya que los servlets se compilan en tiempo de ejecusión y en el caso de red5 este necesita cargar cerca de 70 paquetes de clases JAVA para correr la aplicación. No así TomCat que opera con una cantidad menor.
Es importante tener claro cual es el ambito concrero de openlaszlo y tomCat para hacer un montaje dentro de un sistema que ya tenga tomCat corriendo y pueda en lo futuro realizar una actualización cuando el sistema mejore en una versión mejorada.
En el caso de RED5 el ambito del desarrollo es más unificado ya que RED5 tiene una estructura más predefinida.
Documentación temporaria
Elementos visuales de la videoconferencia
estructura
functions (conference/global/functions) - script - dataset:languageData -- handler:ondata Llama al method:parseLanugageObject - method:parseLanugageObject Llama al method:initScreen Para mostrar el mensaje connecting to streaming server con el setAttribute Tenemos al rtc.connect - dataset:getSessionVarsData Envia el URL de su servidor ==> http://main/webrooms/checksession.php -- handler:ondata Captura el valor del XML por ejemplo: childNodes[0].childNodes[1].childNodes[5].childNodes[0] = the content of the <official_code> element - dataset:getSessionVars Muestra el mensaje del loading session data Llama al dataset:getSessionVarsData - method:addChatHistory Recupera los valores del nombre del cliente y el apellido - method:getFormatedChatHistory - method:addBroswerTabHistory - method:setModeratorName Recupera los valores del streamid y moderatorStreamID - method:addFolderSequence Recupera los valores del foldername camera (videoconference/Server/dokeos/lps/components/extensiones/av/camera) - class:camera -- event:onshow -- event:onindex -- method:getCameraNames -- method:setIndex -- method:showCamera -- method:_showCamera -- method:setMode -- method:setQuality videoview (videoconference/Server/dokeos/lps/components/extensiones/av/videoview) - class:stream -- event:onurl -- method:init -- method:setWidth -- method:setHeight -- method:setUrl stream (videoconference/Server/dokeos/lps/components/extensiones/av/stream) - class:stream -- method:_publishSetup -- method:broadcast -- method:record -- method:_updateRecordTime -- method:stop -- method:_findnc -- method:_createStream -- method:play -- event:onmute -- event:onlevel -- method:init -- method:_initMic -- method:setMute -- method:_updateLevel -- method:_updatePlayTime -- method:pause -- method:init -- method:_namefromurl -- method:_setUrl -- method:setUrl microphone (videoconference/Server/dokeos/lps/components/extensiones/av/microphone) - class:microphone -- event:onindex -- method:setIndex -- event:onmute -- event:onlevel -- method:init -- method:_initMic -- method:setMute -- method:_updateLevel videoconnection (conference/videoconnection) - name:thisrct id:rtc -- handler:onconnect -- handler:onerror -- netremotecall:setId --- handler:ondata -- netremotecall:setUserObjectOne2Four -- handler:ondata -- netremotecall:setUserObjectNewOne2Four --- handler:ondata -- netremotecall:getCurrentModerator --- handler:ondata -- netremotecall:newStream --- handler:ondata -- netremotecall:closeStream --- handler:ondata -- netremotecall:clientregisterRoom --- handler:ondata -- netremotecall:roomDisconnect --- handler:ondata -- netremotecall:getFiles --- handler:ondata -- netremotecall:sendVars --- handler:ondata -- netremotecall:sendVarsToWhiteboard --- handler:ondata -- netremotecall:setModerator --- handler:ondata -- netremotecall:sendMessage -- netremotecall:sendVarsToMessage --- handler:ondata -- netremotecall:sendVarsModeratorGeneral --- handler:ondata -- netremotecall:sendVarsToMessageWithClient --- handler:ondata -- netremotecall:createPoll --- handler:ondata -- netremotecall:newPoll --- handler:ondata -- netremotecall:vote --- handler:ondata -- netremotecall:getVotes --- handler:ondata -- netremotecall:getVotes --- handler:ondata -- netremotecall:checkHasVoted --- handler:ondata -- netremotecall:getPoll --- handler:ondata -- netremotecall:getPollTypeList --- method:setReferenceObj --- handler:ondata -- netremotecall:sendVarsToModeratorGeneral --- handler:ondata rtmpconnection (conference/rtmpconnection) - class:rtmpconnection -- method:init -- method:registerMethods -- method:remoteCallMethod -- method:callFuntion -- method:connect -- method:call - class:netremotecall -- method:call - class:netparam rtmpconnection (conference/rtmpconnection) - class:rtmpconnection -- method:init -- method:registerMethods -- method:remoteCallMethod -- method:callFuntion -- method:connect -- method:call - class:netremotecall -- method:call - class:netparam videoconferencia2 - canvas -- method:initScreen -- method:getLabelName -- view:bg -- view:mainbackroundmenu -- view:bg -- videocontainer:_videocontainer (conference/videoclassroom/videocontainer) --- class:videocontainer ---- method:addUser ---- method:initializeStreams ---- netremotecall:getClientListScope ---- netremotecall:setUsername ---- netremotecall:getCurrentModerator ---- method:addItem ---- method:addClientItem ---- method:startStream ---- method:getNewVideoObject ---- method:getNewVideoObjectByPos ---- method:closeStreamClient ---- method:disconnectclient ---- videoobject:_video1 (conference/videoclassroom/videoobject) ----- class:videoobject ------ method:getVideoReference ------ method:setIdentifier ------ method:resetValues ------ view:_innertop ------ view:_chatvideoinner ------- videoview:_videoview (lps/componentes/extensiones/av/videoview) -------- class:videoview --------- event:onurl --------- method:init --------- method:setWidth --------- method:setHeight --------- method:setUrl -------- stream:v_output -------- camera:cameraRef (lps/componentes/extensiones/av/camera) --------- class:camera --------- method:init --------- method:getCameraNames --------- method:setIndex --------- method:showCamera --------- method:showCamera --------- method:setMode --------- method:setQuality -------- microphone:microphoneRef (lps/componentes/extensiones/av/microphone) --------- class:microphone ---------- method:setIndex ---------- event:onmute ---------- event:onlevel ---------- method:init ---------- method:_initMic ---------- method:setMute ---------- method:_updateLevel ------ view:_loadness ------- method:setLevel ------- view:_loudness ------ view:resource:messagebox_info_rsc ------ view:infoview ------ view:infostuff ------- method:initUserObject ------- view:infoview ------- view:inner -- moderationpanelclass (conference/moderation/moderationpanelclass) --- class:moderationpanelclass -- menubardokeos:_menubardokeos (conference/tabbar/menubardokeos) --- class:charttabutton --- class:participantstabutton --- class:librarytabutton --- class:uploadtabutton --- class:wwwtabutton --- class:menubardokeos ---- innerdokeoslist:contentlist ---- view:_tabscontent ----- method:clearContent --- class:innerdokeoslist ---- method:setSelection ---- charttabutton ---- uploadtabutton ---- participantstabutton -- whiteboard:_whiteboard (conference/whiteboard/whiteboard) --- class:whiteboard ---- method:sendConfirmation ---- method:getconfirmationscode ---- method:resetDefaultConfirmations ---- method:clearAreaAndAddImage ---- view:backgroundtools_rsc ---- view:_paintmenu ----- method:selectButton ---- basedrawsave:_drawarea ----- method:onsharedMessage ---- view:boundboxesView --- handler:onsharedMessage --- handler:isloadingImage --- handler:isloadedImage -- view:currentmainobjectisMod -- htmlbg:_htmlbg (conference/tabcontent/wwwtab) --- class:htmlbg ---- view:htmlbgstuff ----- view:_htmlside ------ method:getText ------ method:setText ------ inputtext:_ctext ------- method:event:onkeyup ----- button:_button ------ method:sendEvent ----- basedrawchoose:resourceN:"close" ----- view:resource:htmlbg --- class:wwwtab ---- view:_uploadtaboutput ----- method:openbroowser ----- view:id:_browserhistory ------ method:addItem ------ view:histroy ------ vscrollbar:myscrollbar --- class:browserhistoryItem -- view:clickable:_hideit -- rtmpstatus -- view:main_content --- view:_content ---- method:clearAll -- view:close --- handler:onclick -- view:intro
Descripcion de Elementos
canvas
El canvas es el lienzo sobre el cual está desarrollada la aplicación desde la perspectiva de openlaszlo.
OpenLaszlo está conceptualizado bajo el paradigma de programación orientada a objetos y su propuesta como lenguaje de programación es crear aplicaciones RIA, Aplicaciones enriquecidas además de interactivas cinemáticas.
Utiliza sintaxis LZX como lenguaje de programación para generar los conceptos de clase, componentes o librerías auxiliandose de JAVASCRIPT para el flujo de control de la aplicación y el manejo de los eventos. LPS utiliza un compilador en JAVA por lo cual necesita correr dentro de un servidor de aplicaciones WEB JAVA.
Las graficas y librerias que representan los componentes tienen por objeto comprender más acerca de esta tecnología.
videocontainer
Descripcion de los métodos para la conexion con el servidor red5
Métodos
clase rtmpconnection
- método init
Definimos un objeto de tipo de conexion NetConnection y hacemos una referencia local de la variable de conexion rtmpconnection, llama al método
registerMethods
- método registerMethods
Registrar todos los métodos que son instanciados del netremotecall, si es de tipo netremotecall entonces se registra dentro del NetConnection llama al
método remoteCallMethod
- método remoteCallMethod
Invoca al método callFuntion
- método callFuntion
Si el valor del elemento del subnode es igual al nombre de la funcion entonces llama al método onResult
- método connect
Este código trabaja, si la conexión no ha fallado
- método call
Llama a los parametros, funciones u objetos y se vuelve a llamar a si mismo
clase netremotecall
- handler ondata
- método call
Hace referencia a la cadena de conexion mediante rtmpObject
- método onResult
Llama a eventos pero no de forma automatica como lo hace el handler
clase netparam
Tiene un atributo name de valor null de tipo expression
Funciones: conference/global/functions
- dataset:languageData
Trabaja con el idioma del sistema de la videoconferencia
Llama al método parseLanugageObject() (que tendria que llamarse parseLanguageObject())
- method:parseLanugageObject()
Llama al método initScreen()
- method:initScreen
Aqui estamos visualizando en la pantalla el mensaje connecting to streaming server
- dataset:getSessionVarsData
Envia una ruta de navegacion donde envia los valores http:// {el URL de su servidor} /webrooms/checksession.php
- handler:ondata
Con el setAttribute podemos mostrar los datos con el siguiente mensaje : loading language data
Aqui recogemos los valores enviados en el navegador y se visualizan
Invoca a al dataset languageData
- dataset languageData
- handler:ondata
Llama al método parseLanugageObject()
- method:parseLanugageObject()
Recoge valores enviados de los arrays t y t2
- method:getSessionVars()
Invoca al dataset:getSessionVarsData
- method:addChatHistory()
Recupera los valores del nombre del cliente y el apellido
- method:getFormatedChatHistory()
- method:setModeratorName()
Recupera los valores del streamid y moderatorStreamID
- method:addFolderSequence()
Recupera los valores del foldername
Conexion con el servidor streaming
Videoconnection
Esto es tanto para la videoconferencia.lzx como para la videoconferencia2.lzx
Dentro de Videoconnection existe un id="rtc" name="thisrct" de tipo rtmpconnection
En el src encontramos los atributos: protocolName, rmpthostlocal (tendria que ser rtmphostlocal), protocolPort y el currentcourse que es atributo del videoconference2.lzx
Function
En el dataset getSessionVarsData
Con el currentlanguage se aplica el idioma y con la variable addIt que por defecto es conf pregunta si es videoconferencia de una persona por eso acepta la
segunda videoconferencia
Diferencias entre la videoconferencia y la videoconferencia2
Videoconferencia
Videocontainer :
Dentro del netremotecall setUsername hay netparam que tienen métodos vars1, vars2 aqui esta official_code, vars3, vars4
Similitudes entre funciones de archivos del eclipse y java
(.lzx) y (.java)
| Java | Eclipse | ||
|---|---|---|---|
| Fichero | Función | Función | Fichero |
| dokeos/WEB-INF/src org.dokeos.videoconference/Application.java | setModerator | netremotecall:setModerator | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/Application.java | setUsername | netremotecall:setUsername | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer |
| dokeos/WEB-INF/src org.dokeos.videoconference/Application.java | getCurrentModerator | netremotecall:getCurrentModerator | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/Application.java | getClientListScope | netremotecall:getClientListScope | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer |
| dokeos/WEB-INF/src org.dokeos.videoconference/Application.java | sendVars | netremotecall:sendVars | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/Application.java | sendVarsModeratorGeneral | netremotecall:sendVarsModeratorGeneral | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/Application.java | sendMessage | netremotecall:sendMessage | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/RemoteService.java | createPoll | netremotecall:createPoll | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/RemoteService.java | getPollTypeList | netremotecall:getPollTypeList | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/RemoteService.java | vote | netremotecall:vote | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/RemoteService.java | getVotes | netremotecall:getVotes | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/RemoteService.java | getPoll | netremotecall:getPoll | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/RemoteService.java | checkHasVoted | netremotecall:checkHasVoted | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videoconference/RemoteService.java | checkHasVoted | netremotecall:checkHasVoted | videoconferencia/dokeos/ videoconference/conference/videoconnection |
| dokeos/WEB-INF/src org.dokeos.videobeans/RoomClient.java | setUsername | netremotecall:setUsername | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer |
| dokeos/WEB-INF/src org.dokeos.videobeans/UserSecurity.java | setUsername | netremotecall:setUsername | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer |
| dokeos/WEB-INF/src org.dokeos.videobeans/UserSecurity.java | setUsername | netremotecall:setUsername | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer |
| dokeos/WEB-INF/src org.dokeos.audiorecorder/RemoteService.java | getListOfFiles | netremotecall:getListOfFiles | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer |
| dokeos/WEB-INF/src org.dokeos.audiorecorder/RemoteService.java | getListOfFiles | netremotecall:getListOfFiles | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer |
| method:init | videoconferencia/dokeos/ videoconference/rtmpconnection | ||
| method:registerMethods | videoconferencia/dokeos/ videoconference/rtmpconnection | ||
| method:remoteCallMethod | videoconferencia/dokeos/ videoconference/rtmpconnection | ||
| method:callFuntion | videoconferencia/dokeos/ videoconference/rtmpconnection | ||
| method:connect | videoconferencia/dokeos/ videoconference/rtmpconnection | ||
| method:call | videoconferencia/dokeos/ videoconference/rtmpconnection | ||
| method:call | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:setId | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:setUserObjectOne2Four | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:setUserObjectNewOne2Four | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:getCurrentModerator | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:newStream | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:closeStream | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:clientregisterRoom | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:roomDisconnect | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:getFiles | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:sendVars | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:sendVarsToWhiteboard | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:setModerator | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:setNewModerator | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:sendMessage | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:sendVarsToMessage | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:sendVarsModeratorGeneral | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:sendVarsToMessageWithClient | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:createPoll | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:newPoll | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:vote | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:getVotes | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:checkHasVoted | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:getPoll | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:getPollTypeList | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:sendVarsToModeratorGeneral | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
| netremotecall:sendVarsToModeratorGeneral | videoconferencia/dokeos/ videoconference/conference/videoclassroom/videocontainer | ||
Cambios en el ícono "Members" (al dar clic en imágen bocina)
El moderador envia imágen a los demás usuarios
Desarrollo ocurriendo ahora
En el método __GrantVoice del fichero videocontainer que se encuentra dentro del videoclassroom, para que el objeto sea visto por el moderador y los
demas participantes se tiene que crear un atributo de nombre objMessage :
<attribute name="objMessage" value="null" />
Este atributo es utilizado por el método __GrantVoice como un array de valores especificos del usuario :
this.objMessage = new Array ();
this.objMessage[0] = 'grantvoice';
var nowTime = new Date();
var datumsString = nowTime.getHours()+':'+nowTime.getMinutes();
this.objMessage[1] = datumsString;
Debug.write("Setting Message");
this.objMessage[2] = 'openwindow';
this.objMessage[3] = canvas.currentusename;
this.objMessage[4] = ;
this.objMessage[5] = canvas.currentusercolor;
this.objMessage[6] = canvas.currentuserpos;
this.sendMessageWithClient.call();
Debug.write("send: ",this.objMessage);
Fuera del método se creó un netremotecall de nombre sendMessageWithClient :
<netremotecall name="sendMessageWithClient" funcname="sendMessageWithClient" remotecontext="$once{ canvas.thisrct }" >
<netparam name="vars"><method name="getValue">return this.parent.parent.objMessage;</method></netparam>
<handler name="ondata" args="value">
<![CDATA[
//The onResult-Handler will be called by the rtmpconnection
Debug.write("getValue : ",value);
]]>
</handler>
</netremotecall>
Tambien se agregó el método openWindow:
<method name="openWindow">
if(this._videosmall==null)
{
this._videosmall = new videoobjectsmall();
Debug.write("openWindow ");
}
</method>
A este array
this.objMessage[0] = 'grantvoice';
Llama al método grantVoiceAction() que se encuentra en el fichero videoconnection dentro del método sendVarsToMessageWithClient() :
else if (value.message[0]=='grantvoice'){
canvas.grantVoiceAction(value.message,value.client);
}
El método grantVoiceAction() es creado en la videoconferencia2 aqui tambien se llama al método openWindow() del fichero videocontainer :
<method name="grantVoiceAction" args="value,client">
<![CDATA[
Debug.write("grantVoiceAction: ",value,client);
switch(value[2])
{
case 'openwindow':
this._videocontainer.openWindow();
break;
case 'closewindow':
default:
this._videocontainer.closeWindow();
break;
}
]]>
</method>
El moderador canceló el envio de imágen a los demás usuarios
Desarrollo ocurriendo ahora
En el método ___RemoveVoice del fichero videocontainer que se encuentra dentro del videoclassroom, para que el objeto sea cerrado por el moderador y los
demas participantes se tiene que crear un atributo de nombre objMessage y es utilizado por el método ___RemoveVoice como un array de valores especificos
del usuario que esta ingresando.
El único detalle es el método closeWindow:
<method name="closeWindow">
Debug.write("closeWindow ");
this._videosmall.destroy();
</method>


