http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java index c1788f7..64409b7 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/FormatHelper.java @@ -1,81 +1,81 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.db.util; - -import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4; - -import java.util.regex.Pattern; - -import org.apache.openmeetings.db.entity.user.User; - -public class FormatHelper { - /** - * taken from BidiUtils - * - * A regular expression for matching right-to-left language codes. See - * {@link #isRtlLanguage} for the design. - */ - private static final Pattern RtlLocalesRe = Pattern.compile("^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Arab|Hebr|Thaa|Nkoo|Tfng))" - + "(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)"); - - /** - * Check if a BCP 47 / III language code indicates an RTL language, i.e. - * either: - a language code explicitly specifying one of the right-to-left - * scripts, e.g. "az-Arab", or - * <p> - * - a language code specifying one of the languages normally written in a - * right-to-left script, e.g. "fa" (Farsi), except ones explicitly - * specifying Latin or Cyrillic script (which are the usual LTR - * alternatives). - * <p> - * The list of right-to-left scripts appears in the 100-199 range in - * http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic and - * Hebrew are by far the most widely used. We also recognize Thaana, N'Ko, - * and Tifinagh, which also have significant modern usage. The rest (Syriac, - * Samaritan, Mandaic, etc.) seem to have extremely limited or no modern - * usage and are not recognized. The languages usually written in a - * right-to-left script are taken as those with Suppress-Script: - * Hebr|Arab|Thaa|Nkoo|Tfng in - * http://www.iana.org/assignments/language-subtag-registry, as well as - * Sindhi (sd) and Uyghur (ug). The presence of other subtags of the - * language code, e.g. regions like EG (Egypt), is ignored. - */ - public static boolean isRtlLanguage(String languageString) { - return languageString != null && RtlLocalesRe.matcher(languageString).find(); - } - - public static String formatUser(User u) { - return formatUser(u, false); - } - - // TODO check RIGHTS here (email might need to be hidden) - public static String formatUser(User u, boolean isHTMLEscape) { - String user = ""; - if (u != null) { - String email = u.getAddress() == null ? "" : u.getAddress().getEmail(); - if (u.getFirstname() == null && u.getLastname() == null) { - user = email; - } else { - user = String.format("\"%s %s\" <%s>", u.getFirstname(), u.getLastname(), email); - } - user = isHTMLEscape ? escapeHtml4(user) : user; - } - return user; - } -} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openmeetings.db.util; + +import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4; + +import java.util.regex.Pattern; + +import org.apache.openmeetings.db.entity.user.User; + +public class FormatHelper { + /** + * taken from BidiUtils + * + * A regular expression for matching right-to-left language codes. See + * {@link #isRtlLanguage} for the design. + */ + private static final Pattern RtlLocalesRe = Pattern.compile("^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Arab|Hebr|Thaa|Nkoo|Tfng))" + + "(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)"); + + /** + * Check if a BCP 47 / III language code indicates an RTL language, i.e. + * either: - a language code explicitly specifying one of the right-to-left + * scripts, e.g. "az-Arab", or + * <p> + * - a language code specifying one of the languages normally written in a + * right-to-left script, e.g. "fa" (Farsi), except ones explicitly + * specifying Latin or Cyrillic script (which are the usual LTR + * alternatives). + * <p> + * The list of right-to-left scripts appears in the 100-199 range in + * http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic and + * Hebrew are by far the most widely used. We also recognize Thaana, N'Ko, + * and Tifinagh, which also have significant modern usage. The rest (Syriac, + * Samaritan, Mandaic, etc.) seem to have extremely limited or no modern + * usage and are not recognized. The languages usually written in a + * right-to-left script are taken as those with Suppress-Script: + * Hebr|Arab|Thaa|Nkoo|Tfng in + * http://www.iana.org/assignments/language-subtag-registry, as well as + * Sindhi (sd) and Uyghur (ug). The presence of other subtags of the + * language code, e.g. regions like EG (Egypt), is ignored. + */ + public static boolean isRtlLanguage(String languageString) { + return languageString != null && RtlLocalesRe.matcher(languageString).find(); + } + + public static String formatUser(User u) { + return formatUser(u, false); + } + + // TODO check RIGHTS here (email might need to be hidden) + public static String formatUser(User u, boolean isHTMLEscape) { + String user = ""; + if (u != null) { + String email = u.getAddress() == null ? "" : u.getAddress().getEmail(); + if (u.getFirstname() == null && u.getLastname() == null) { + user = email; + } else { + user = String.format("\"%s %s\" <%s>", u.getFirstname(), u.getLastname(), email); + } + user = isHTMLEscape ? escapeHtml4(user) : user; + } + return user; + } +}
http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-db/src/site/site.xml ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/site/site.xml b/openmeetings-db/src/site/site.xml index c26954e..0d9f35c 100644 --- a/openmeetings-db/src/site/site.xml +++ b/openmeetings-db/src/site/site.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> -<project xmlns="http://maven.apache.org/DECORATION/1.7.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/DECORATION/1.7.0 http://maven.apache.org/xsd/decoration-1.7.0.xsd" - name="Apache OpenMeetings Project"> - - <body> - <menu ref="parent"/> - <menu name="Project"> - <item name="About" href="/index.html" /> - <item name="Info" href="/project-info.html" /> - <item name="Summary" href="/project-summary.html" /> - <item name="License" href="/license.html" /> - <item name="Dependencies" href="/dependencies.html" /> - <item name="Dependency Convergence" href="/dependency-convergence.html" /> - <item name="RAT Report" href="/rat-report.html" /> - <item name="JavaDoc" href="/apidocs/index.html" target="_blank" /> - </menu> - </body> - <custom> - <reflowSkin> - <bottomNav maxSpan="12"> - <column>Parent Project</column> - <column>Project</column> - </bottomNav> - </reflowSkin> - </custom> -</project> +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<project xmlns="http://maven.apache.org/DECORATION/1.7.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/DECORATION/1.7.0 http://maven.apache.org/xsd/decoration-1.7.0.xsd" + name="Apache OpenMeetings Project"> + + <body> + <menu ref="parent"/> + <menu name="Project"> + <item name="About" href="/index.html" /> + <item name="Info" href="/project-info.html" /> + <item name="Summary" href="/project-summary.html" /> + <item name="License" href="/license.html" /> + <item name="Dependencies" href="/dependencies.html" /> + <item name="Dependency Convergence" href="/dependency-convergence.html" /> + <item name="RAT Report" href="/rat-report.html" /> + <item name="JavaDoc" href="/apidocs/index.html" target="_blank" /> + </menu> + </body> + <custom> + <reflowSkin> + <bottomNav maxSpan="12"> + <column>Parent Project</column> + <column>Project</column> + </bottomNav> + </reflowSkin> + </custom> +</project> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-flash/src/main/flex/main.mxml ---------------------------------------------------------------------- diff --git a/openmeetings-flash/src/main/flex/main.mxml b/openmeetings-flash/src/main/flex/main.mxml index f275526..de24955 100644 --- a/openmeetings-flash/src/main/flex/main.mxml +++ b/openmeetings-flash/src/main/flex/main.mxml @@ -1,321 +1,321 @@ -<?xml version="1.0"?> -<!-- - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - ---> -<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" - xmlns:s="library://ns.adobe.com/flex/spark" - xmlns:mx="library://ns.adobe.com/flex/mx" - width="570" height="900" pageTitle="Openmeetings" fontSize="12" - applicationComplete="appInit(event)" uncaughtError="uncaughtError(event)"> - <fx:Declarations> - <!-- Place non-visual elements (e.g., services, value objects) here --> - <mx:TraceTarget/> - </fx:Declarations> - <fx:Script><![CDATA[ - import mx.core.FlexGlobals; - - import org.apache.openmeetings.OmVideo; - - private var audioOnly:Boolean = false; - private var FPS:int; - private var bandwidth:int = 0; - private var quality:int = 100; - private var echoPath:int = 256; - private var echoSuppression:Boolean = true; - private var microphoneRateBest:int = 22;//5, 8, 11, 22, and 44 - private var selectedMic:int = -1; - private var selectedCam:int = -1; - private var video:OmVideo; - private var recName:String; - private var mic:Microphone = null; - [Bindable] - private var interview:Boolean = false; - - private function debug(...rest):void { - ExternalInterface.call("console.log", rest); - } - - private function camAvail():Boolean { - return !audioOnly && Camera.names.length > 0; - } - - private function micAvail():Boolean { - return Microphone.names.length > 0; - } - - private function appInit(evt:Event):void { - var params:Object = FlexGlobals.topLevelApplication.parameters; - debug("appInit()", params); - audioOnly = 'true' == params.audioOnly; - interview = 'true' == params.interview; - var _fps:int = parseInt(params.fps); - FPS = (isNaN(_fps) || _fps < 1 ? 30 : _fps); - video = new OmVideo(videoDisplay, params); - switch (params.mode) { - case 'settings': - { - ExternalInterface.addCallback("getDevices", function ():Object { - return { - cams: Camera.names - , mics: Microphone.names - }; - }); - ExternalInterface.addCallback("camChanged", function (val:int):void { - selectedCam = val; - camChanged(null); - }); - ExternalInterface.addCallback("micChanged", function (val:int):void { - selectedMic = val; - camChanged(null); - }); - ExternalInterface.addCallback("resChanged", function (width:int, height:int):void { - setResolution(width, height, true); - }); - ExternalInterface.addCallback("close", function ():void { - video.reset(); - }); - ExternalInterface.addCallback("init", function (camIdx:int, micIdx:int, width:int, height:int):void { - selectedCam = camIdx; - selectedMic = micIdx; - setResolution(width, height, true); - }); - ExternalInterface.addCallback("startRec", function ():void { - startTestRecording(); - }); - ExternalInterface.addCallback("play", function ():void { - playTestRecording(); - }); - ExternalInterface.call("VideoSettings.initSwf"); - } - break; - case OmVideo.BROADCAST: - { - selectedCam = params.cam; - selectedMic = params.mic; - video.resize(Math.max(300, params.width), Math.max(200, params.height)); - attachCamera(function():void { - video.resize(params.width, params.height); - video.reset(); - var cam:Camera = getCam(); - video.attachCamera(cam); - video.broadcast(params.broadcastId, cam, getMic()); - ExternalInterface.call("VideoManager.resetSize", params.uid); - }); - } - break; - case OmVideo.PLAY: - { - video.resize(params.width, params.height); - video.play(params.broadcastId); // TODO audio/video - } - break; - } - ExternalInterface.addCallback("vidResize", function (width:int, height:int):void { - video.resize(width, height); - video.vidResize(width, height); - }); - } - - private function uncaughtError(e:UncaughtErrorEvent):void { - debug("Unexpected ERROR", e); - } - - private function getMic():Microphone { - debug("Entering getMic ..."); - var _micro:Microphone = null; - if (selectedMic > -1) { - _micro = echoPath == 0 ? Microphone.getMicrophone(selectedMic) : Microphone.getEnhancedMicrophone(selectedMic); - - if (_micro != null) { - if (echoPath == 256) { - var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions(); - options.mode = MicrophoneEnhancedMode.FULL_DUPLEX; - options.echoPath = echoPath; - options.nonLinearProcessing = true; - _micro.enhancedOptions = options; - debug("echoPath set to " + echoPath + ", " + _micro.enhancedOptions); - } - _micro.codec = SoundCodec.NELLYMOSER; - _micro.framesPerPacket = 1; - _micro.setSilenceLevel(0, 2000); - debug("canvas.microphoneRateBest: " + microphoneRateBest); - _micro.rate = microphoneRateBest; - _micro.gain = 50; - // this has no effect if enhanced microphone is obtained - //Microphone setUseEchoSupression(bool) - debug("canvas.echoSuppression: " + echoSuppression); - _micro.setUseEchoSuppression(echoSuppression); - } - debug("... getMic DONE" + _micro); - } - return _micro; - } - - private function getCam():Camera { - debug("Entering getCam ..."); - var _camera:Camera = null; - if (selectedCam > -1) { - _camera = Camera.getCamera("" + selectedCam); - if (_camera != null && !_camera.muted) { - //FIXME need to be unified - if (interview) { - //we need a fixed frame rate for the videos to merge them later on - _camera.setMode(video.width, video.height, 24); - debug("IS INTERVIEW "); - _camera.setQuality(0, 98); - } else { - _camera.setMode(video.width, video.height, FPS); - debug("IS NO INTERVIEW "); - _camera.setQuality(bandwidth, quality); - } - } - debug("... getCam DONE " + _camera); - } - return _camera; - } - - private function attachCamera(callback:Function):void { - if (!camAvail()) { - return; - } - debug("Camera selected:: " + selectedCam); - var cam:Camera = getCam(); - debug("Camera selected:: " + cam); - if (cam != null) { - if (cam.muted) { - debug("Camera Muted"); - video.attachCamera(cam); - cam.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void { - debug("cameraStatusHandler! " + event); - cam.removeEventListener(StatusEvent.STATUS, arguments.callee); - switch (event.code) { - case 'Camera.Muted': - debug("Unable to connect to active camera."); - break; - case 'Camera.Unmuted': - callback(); - break; - } - }); - } else { - callback(); - } - } else { - var _mic:Microphone = getMic(); - if (_mic != null) { - if (_mic.muted) { - var nc:NetConnection = new NetConnection(); - nc.connect(null); - var ns:NetStream = new NetStream(nc); - ns.attachAudio(_mic); - _mic.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void { - debug("micStatusHandler! " + event); - _mic.removeEventListener(StatusEvent.STATUS, arguments.callee); - ns.close(); - nc.close(); - if (_mic.muted) { - debug("Unable to connect to active microphone."); - } else { - ExternalInterface.call("VideoSettings.allowRec", true); - } - }); - } - } - } - } - - private function _attachCamera(cam:Camera):void { - debug("_attachCamera():: muted ? " + cam.muted); - if (cam.muted) { - debug("Unable to connect to active camera."); - } else { - try { - video.reset(); - video.attachCamera(cam); - debug("_attachCamera()::done"); - } catch (error:Error) { - debug("_attach:: " + error.message + "\n" + error.getStackTrace()); - } - } - } - - private function settingsCameraCallback():void { - ExternalInterface.call("VideoSettings.allowRec", true); - _attachCamera(getCam()); - } - - private function setResolution(width:int, height:int, attach:Boolean):void { - if (!interview) { - debug("onselect WxH :: " + width + "x" + height); - - video.resize(width, height); - - if (attach) { - attachCamera(settingsCameraCallback); - } - } - } - - private function camChanged(e:Event):void { - attachCamera(settingsCameraCallback); - } - - private function playTestRecording():void { - video.play(recName + ".flv"); - } - - private function startTestRecording():void { - try { - var counter:int = 5; - timerText.visible = true; - timerText.text = "5 sec"; - var recTimer:Timer = new Timer(1000, counter); - var t:Date = new Date(); - recName = "TEST_SETUP_" + t.getTime(); - mic = getMic(); - var activityTimer:Timer = new Timer(100); - activityTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void { - ExternalInterface.call("VideoSettings.micActivity", mic.activityLevel); - }); - video.record(recName, getCam(), mic, function ():void { - if (mic != null) { - activityTimer.start(); - } - recTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void { - timerText.text = --counter + " sec"; - if (counter == 0) { - timerText.visible = false; - ExternalInterface.call("VideoSettings.allowPlay"); - playTestRecording(); - activityTimer.stop(); - mic = null; - } - }); - recTimer.start(); - }); - } catch (err:Error) { - debug("ERROR: " + err); - } - } - ]]></fx:Script> - - <mx:UIComponent id="videoDisplay" width="0" height="0" /> - <s:Label id="timerText" height="20" width="45" x="20" y="5" paddingLeft="5" paddingTop="5" - visible="false" backgroundColor="0xf5f5f5" fontWeight="bold"><s:text></s:text></s:Label> -</s:Application> +<?xml version="1.0"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + +--> +<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:s="library://ns.adobe.com/flex/spark" + xmlns:mx="library://ns.adobe.com/flex/mx" + width="570" height="900" pageTitle="Openmeetings" fontSize="12" + applicationComplete="appInit(event)" uncaughtError="uncaughtError(event)"> + <fx:Declarations> + <!-- Place non-visual elements (e.g., services, value objects) here --> + <mx:TraceTarget/> + </fx:Declarations> + <fx:Script><![CDATA[ + import mx.core.FlexGlobals; + + import org.apache.openmeetings.OmVideo; + + private var audioOnly:Boolean = false; + private var FPS:int; + private var bandwidth:int = 0; + private var quality:int = 100; + private var echoPath:int = 256; + private var echoSuppression:Boolean = true; + private var microphoneRateBest:int = 22;//5, 8, 11, 22, and 44 + private var selectedMic:int = -1; + private var selectedCam:int = -1; + private var video:OmVideo; + private var recName:String; + private var mic:Microphone = null; + [Bindable] + private var interview:Boolean = false; + + private function debug(...rest):void { + ExternalInterface.call("console.log", rest); + } + + private function camAvail():Boolean { + return !audioOnly && Camera.names.length > 0; + } + + private function micAvail():Boolean { + return Microphone.names.length > 0; + } + + private function appInit(evt:Event):void { + var params:Object = FlexGlobals.topLevelApplication.parameters; + debug("appInit()", params); + audioOnly = 'true' == params.audioOnly; + interview = 'true' == params.interview; + var _fps:int = parseInt(params.fps); + FPS = (isNaN(_fps) || _fps < 1 ? 30 : _fps); + video = new OmVideo(videoDisplay, params); + switch (params.mode) { + case 'settings': + { + ExternalInterface.addCallback("getDevices", function ():Object { + return { + cams: Camera.names + , mics: Microphone.names + }; + }); + ExternalInterface.addCallback("camChanged", function (val:int):void { + selectedCam = val; + camChanged(null); + }); + ExternalInterface.addCallback("micChanged", function (val:int):void { + selectedMic = val; + camChanged(null); + }); + ExternalInterface.addCallback("resChanged", function (width:int, height:int):void { + setResolution(width, height, true); + }); + ExternalInterface.addCallback("close", function ():void { + video.reset(); + }); + ExternalInterface.addCallback("init", function (camIdx:int, micIdx:int, width:int, height:int):void { + selectedCam = camIdx; + selectedMic = micIdx; + setResolution(width, height, true); + }); + ExternalInterface.addCallback("startRec", function ():void { + startTestRecording(); + }); + ExternalInterface.addCallback("play", function ():void { + playTestRecording(); + }); + ExternalInterface.call("VideoSettings.initSwf"); + } + break; + case OmVideo.BROADCAST: + { + selectedCam = params.cam; + selectedMic = params.mic; + video.resize(Math.max(300, params.width), Math.max(200, params.height)); + attachCamera(function():void { + video.resize(params.width, params.height); + video.reset(); + var cam:Camera = getCam(); + video.attachCamera(cam); + video.broadcast(params.broadcastId, cam, getMic()); + ExternalInterface.call("VideoManager.resetSize", params.uid); + }); + } + break; + case OmVideo.PLAY: + { + video.resize(params.width, params.height); + video.play(params.broadcastId); // TODO audio/video + } + break; + } + ExternalInterface.addCallback("vidResize", function (width:int, height:int):void { + video.resize(width, height); + video.vidResize(width, height); + }); + } + + private function uncaughtError(e:UncaughtErrorEvent):void { + debug("Unexpected ERROR", e); + } + + private function getMic():Microphone { + debug("Entering getMic ..."); + var _micro:Microphone = null; + if (selectedMic > -1) { + _micro = echoPath == 0 ? Microphone.getMicrophone(selectedMic) : Microphone.getEnhancedMicrophone(selectedMic); + + if (_micro != null) { + if (echoPath == 256) { + var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions(); + options.mode = MicrophoneEnhancedMode.FULL_DUPLEX; + options.echoPath = echoPath; + options.nonLinearProcessing = true; + _micro.enhancedOptions = options; + debug("echoPath set to " + echoPath + ", " + _micro.enhancedOptions); + } + _micro.codec = SoundCodec.NELLYMOSER; + _micro.framesPerPacket = 1; + _micro.setSilenceLevel(0, 2000); + debug("canvas.microphoneRateBest: " + microphoneRateBest); + _micro.rate = microphoneRateBest; + _micro.gain = 50; + // this has no effect if enhanced microphone is obtained + //Microphone setUseEchoSupression(bool) + debug("canvas.echoSuppression: " + echoSuppression); + _micro.setUseEchoSuppression(echoSuppression); + } + debug("... getMic DONE" + _micro); + } + return _micro; + } + + private function getCam():Camera { + debug("Entering getCam ..."); + var _camera:Camera = null; + if (selectedCam > -1) { + _camera = Camera.getCamera("" + selectedCam); + if (_camera != null && !_camera.muted) { + //FIXME need to be unified + if (interview) { + //we need a fixed frame rate for the videos to merge them later on + _camera.setMode(video.width, video.height, 24); + debug("IS INTERVIEW "); + _camera.setQuality(0, 98); + } else { + _camera.setMode(video.width, video.height, FPS); + debug("IS NO INTERVIEW "); + _camera.setQuality(bandwidth, quality); + } + } + debug("... getCam DONE " + _camera); + } + return _camera; + } + + private function attachCamera(callback:Function):void { + if (!camAvail()) { + return; + } + debug("Camera selected:: " + selectedCam); + var cam:Camera = getCam(); + debug("Camera selected:: " + cam); + if (cam != null) { + if (cam.muted) { + debug("Camera Muted"); + video.attachCamera(cam); + cam.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void { + debug("cameraStatusHandler! " + event); + cam.removeEventListener(StatusEvent.STATUS, arguments.callee); + switch (event.code) { + case 'Camera.Muted': + debug("Unable to connect to active camera."); + break; + case 'Camera.Unmuted': + callback(); + break; + } + }); + } else { + callback(); + } + } else { + var _mic:Microphone = getMic(); + if (_mic != null) { + if (_mic.muted) { + var nc:NetConnection = new NetConnection(); + nc.connect(null); + var ns:NetStream = new NetStream(nc); + ns.attachAudio(_mic); + _mic.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void { + debug("micStatusHandler! " + event); + _mic.removeEventListener(StatusEvent.STATUS, arguments.callee); + ns.close(); + nc.close(); + if (_mic.muted) { + debug("Unable to connect to active microphone."); + } else { + ExternalInterface.call("VideoSettings.allowRec", true); + } + }); + } + } + } + } + + private function _attachCamera(cam:Camera):void { + debug("_attachCamera():: muted ? " + cam.muted); + if (cam.muted) { + debug("Unable to connect to active camera."); + } else { + try { + video.reset(); + video.attachCamera(cam); + debug("_attachCamera()::done"); + } catch (error:Error) { + debug("_attach:: " + error.message + "\n" + error.getStackTrace()); + } + } + } + + private function settingsCameraCallback():void { + ExternalInterface.call("VideoSettings.allowRec", true); + _attachCamera(getCam()); + } + + private function setResolution(width:int, height:int, attach:Boolean):void { + if (!interview) { + debug("onselect WxH :: " + width + "x" + height); + + video.resize(width, height); + + if (attach) { + attachCamera(settingsCameraCallback); + } + } + } + + private function camChanged(e:Event):void { + attachCamera(settingsCameraCallback); + } + + private function playTestRecording():void { + video.play(recName + ".flv"); + } + + private function startTestRecording():void { + try { + var counter:int = 5; + timerText.visible = true; + timerText.text = "5 sec"; + var recTimer:Timer = new Timer(1000, counter); + var t:Date = new Date(); + recName = "TEST_SETUP_" + t.getTime(); + mic = getMic(); + var activityTimer:Timer = new Timer(100); + activityTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void { + ExternalInterface.call("VideoSettings.micActivity", mic.activityLevel); + }); + video.record(recName, getCam(), mic, function ():void { + if (mic != null) { + activityTimer.start(); + } + recTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void { + timerText.text = --counter + " sec"; + if (counter == 0) { + timerText.visible = false; + ExternalInterface.call("VideoSettings.allowPlay"); + playTestRecording(); + activityTimer.stop(); + mic = null; + } + }); + recTimer.start(); + }); + } catch (err:Error) { + debug("ERROR: " + err); + } + } + ]]></fx:Script> + + <mx:UIComponent id="videoDisplay" width="0" height="0" /> + <s:Label id="timerText" height="20" width="45" x="20" y="5" paddingLeft="5" paddingTop="5" + visible="false" backgroundColor="0xf5f5f5" fontWeight="bold"><s:text></s:text></s:Label> +</s:Application> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as ---------------------------------------------------------------------- diff --git a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as index c32e8a2..fbf540d 100644 --- a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as +++ b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as @@ -1,270 +1,270 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings { -import flash.events.AsyncErrorEvent; -import flash.events.NetStatusEvent; -import flash.external.ExternalInterface; -import flash.media.Camera; -import flash.media.H264Level; -import flash.media.H264Profile; -import flash.media.H264VideoStreamSettings; -import flash.media.Microphone; -import flash.media.Video; -import flash.media.VideoStreamSettings; -import flash.net.NetConnection; -import flash.net.NetStream; -import mx.core.UIComponent; - -public class OmVideo { - public static const CODEC_H264:String = "h264"; - public static const PLAY:String = "play"; - public static const BROADCAST:String = "broadcast"; - public static const RECORD:String = "record"; - public static const LIVE:String = "live"; - private var vid:Video; - private var ui:UIComponent; - private var nc:NetConnection; - private var ns:NetStream; - public var width:int; - public var height:int; - private var mode:String; - private var params:Object; - private var url:String; - private var fallback:Boolean; - - public function OmVideo(ui:UIComponent, params:Object) { - this.ui = ui; - this.params = params; - } - - private function getVideo():Video { - if (vid == null) { - vid = new Video(); - vid.width = width; - vid.height = height; - ui.addChild(vid); - } - return vid; - } - - public function resize(width:int, height:int):void { - this.width = ui.width = width; - this.height = ui.height = height; - } - - public function vidResize(width:int, height:int):void { - vid.width = width; - vid.height = height; - debug("OmVideo::resize", width, height); - } - - public function attachCamera(cam:Camera):void { - getVideo().attachCamera(cam); - } - - public function attachStream(ns:NetStream):void { - this.ns = ns; - getVideo().attachNetStream(ns); - } - - private function clear():void { - vid.attachNetStream(null); - vid.attachCamera(null); - vid.clear(); - ui.removeChild(vid); - vid = null; - } - - private function debug(... rest):void { - ExternalInterface.call("console.log", rest); - } - - private function createStream():void { - debug("createStream: "); - ns = new NetStream(nc); - ns.client = { - onMetaData: function(metadata:Object):void { - debug("onMetaData: ", metadata); - } - , onPlayStatus: function(metadata:Object):void { - debug("onPlayStatus: ", metadata); - } - , onCuePoint: function(metadata:Object):void { - debug("onCuePoint: ", metadata); - } - , ioError: function(error:Object):void { - debug("ioError: ", error); - } - , netStatus: function(status:Object):void { - debug("netStatus: ", status); - } - , asyncError: function(error:Object):void { - debug("asyncError: ", error); - } - }; - //this is a workaround, attaching the event to the client object does not work - ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus2); - } - - private function onNetStatus2(evt:Object):void { - debug("netStream_onNetStatus: ", evt.info.code, evt.target); - } - - private function _publish(mode:String, name:String, cam:Camera, mic:Microphone, f:Function):void { - if (ns != null){ - reset(); - } - this.mode = mode; - createStream(); - - if (cam != null) { - ns.attachCamera(cam); - attachCamera(cam); - - var videoStreamSettings:VideoStreamSettings = null; - debug("codec = " + params.videoCodec); - if (params.videoCodec === CODEC_H264) { - var vss:H264VideoStreamSettings = new H264VideoStreamSettings(); - vss.setProfileLevel(H264Profile.BASELINE, H264Level.LEVEL_5_1); - videoStreamSettings = vss; - } else { - videoStreamSettings = new VideoStreamSettings(); - } - videoStreamSettings.setQuality(cam.bandwidth, cam.quality); - videoStreamSettings.setKeyFrameInterval(cam.keyFrameInterval); - debug("::camera settings ", cam.keyFrameInterval, cam.width, cam.height, cam.fps); - videoStreamSettings.setMode(cam.width, cam.height, cam.fps); - ns.videoStreamSettings = videoStreamSettings; - } - if (mic != null) { - ns.attachAudio(mic); - //FIXME !!! no mute !!! muteMicro(this.micMuted); - } - - ns.publish(name, (mode == BROADCAST) ? LIVE : mode); - if (f != null) { - f.call(); - } - } - - private function _connect(url:String):void { - nc.connect(url, { - uid: params.uid - , sid: params.sid - , nativeSsl: 'best' == params.proxyType - }); - } - - private function connect(callback:Function):void { - if (nc == null || !nc.connected) { - url = params.url; - debug("NetConnection is not connected", url); - nc = new NetConnection(); - nc.addEventListener(NetStatusEvent.NET_STATUS, function onConnectionStatus(e:NetStatusEvent):void { - debug("ConnectionStatus: " + e.info.code); - switch (e.info.code) { - case 'NetConnection.Connect.Failed': - if (!fallback) { - fallback = true; - url = params.fallback; - _connect(url); - } - break; - case 'NetConnection.Connect.Success': - callback(); - break; - //TODO other cases - } - }); - nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, function (event:AsyncErrorEvent):void { - debug("login Async error" + event); - }); - nc.client = { - onMetaData: function (infoObject:Object):void { - debug("onMetaData::", infoObject); - } - , onBWDone: function(...rest):void { - debug("onBWDone"); - } - , onBWCheck: function(...rest):Number { - debug("onBWCheck"); - return 0; - } - , setId: function (id:Number):void { - debug("id: " + id); //TODO save connection id - } - }; - _connect(url); - } else { - callback(); - } - } - - public function broadcast(name:String, cam:Camera, mic:Microphone):void { - connect(function():void { - _publish(BROADCAST, name, cam, mic, null); - }); - } - - public function record(name:String, cam:Camera, mic:Microphone, f:Function):void { - connect(function():void { - _publish(RECORD, name, cam, mic, f); - }); - } - - public function play(name:String):void { - connect(function():void { - debug("PLAY::", name); - if (ns != null){ - reset(); - } - mode = PLAY; - createStream(); - //invokes Method in baseVideoView which shows the stream - getVideo().attachNetStream(ns); - //FIXME: Commented out, cause this leads to Buffer-Full/Buffer-Empty Events - //after re-syncing the stream - //this.setBuffer(0.1); - ns.play(name); - }); - } - - public function reset():void { - if (ns != null) { - switch (mode) { - case PLAY: - ns.pause(); - ns.dispose(); - clear(); - break; - case BROADCAST: - case RECORD: - ns.publish(null); //false in original code - default: - clear(); - ns.dispose(); - break; - } - } else { - clear(); - } - ns = null; - } -} -} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openmeetings { +import flash.events.AsyncErrorEvent; +import flash.events.NetStatusEvent; +import flash.external.ExternalInterface; +import flash.media.Camera; +import flash.media.H264Level; +import flash.media.H264Profile; +import flash.media.H264VideoStreamSettings; +import flash.media.Microphone; +import flash.media.Video; +import flash.media.VideoStreamSettings; +import flash.net.NetConnection; +import flash.net.NetStream; +import mx.core.UIComponent; + +public class OmVideo { + public static const CODEC_H264:String = "h264"; + public static const PLAY:String = "play"; + public static const BROADCAST:String = "broadcast"; + public static const RECORD:String = "record"; + public static const LIVE:String = "live"; + private var vid:Video; + private var ui:UIComponent; + private var nc:NetConnection; + private var ns:NetStream; + public var width:int; + public var height:int; + private var mode:String; + private var params:Object; + private var url:String; + private var fallback:Boolean; + + public function OmVideo(ui:UIComponent, params:Object) { + this.ui = ui; + this.params = params; + } + + private function getVideo():Video { + if (vid == null) { + vid = new Video(); + vid.width = width; + vid.height = height; + ui.addChild(vid); + } + return vid; + } + + public function resize(width:int, height:int):void { + this.width = ui.width = width; + this.height = ui.height = height; + } + + public function vidResize(width:int, height:int):void { + vid.width = width; + vid.height = height; + debug("OmVideo::resize", width, height); + } + + public function attachCamera(cam:Camera):void { + getVideo().attachCamera(cam); + } + + public function attachStream(ns:NetStream):void { + this.ns = ns; + getVideo().attachNetStream(ns); + } + + private function clear():void { + vid.attachNetStream(null); + vid.attachCamera(null); + vid.clear(); + ui.removeChild(vid); + vid = null; + } + + private function debug(... rest):void { + ExternalInterface.call("console.log", rest); + } + + private function createStream():void { + debug("createStream: "); + ns = new NetStream(nc); + ns.client = { + onMetaData: function(metadata:Object):void { + debug("onMetaData: ", metadata); + } + , onPlayStatus: function(metadata:Object):void { + debug("onPlayStatus: ", metadata); + } + , onCuePoint: function(metadata:Object):void { + debug("onCuePoint: ", metadata); + } + , ioError: function(error:Object):void { + debug("ioError: ", error); + } + , netStatus: function(status:Object):void { + debug("netStatus: ", status); + } + , asyncError: function(error:Object):void { + debug("asyncError: ", error); + } + }; + //this is a workaround, attaching the event to the client object does not work + ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus2); + } + + private function onNetStatus2(evt:Object):void { + debug("netStream_onNetStatus: ", evt.info.code, evt.target); + } + + private function _publish(mode:String, name:String, cam:Camera, mic:Microphone, f:Function):void { + if (ns != null){ + reset(); + } + this.mode = mode; + createStream(); + + if (cam != null) { + ns.attachCamera(cam); + attachCamera(cam); + + var videoStreamSettings:VideoStreamSettings = null; + debug("codec = " + params.videoCodec); + if (params.videoCodec === CODEC_H264) { + var vss:H264VideoStreamSettings = new H264VideoStreamSettings(); + vss.setProfileLevel(H264Profile.BASELINE, H264Level.LEVEL_5_1); + videoStreamSettings = vss; + } else { + videoStreamSettings = new VideoStreamSettings(); + } + videoStreamSettings.setQuality(cam.bandwidth, cam.quality); + videoStreamSettings.setKeyFrameInterval(cam.keyFrameInterval); + debug("::camera settings ", cam.keyFrameInterval, cam.width, cam.height, cam.fps); + videoStreamSettings.setMode(cam.width, cam.height, cam.fps); + ns.videoStreamSettings = videoStreamSettings; + } + if (mic != null) { + ns.attachAudio(mic); + //FIXME !!! no mute !!! muteMicro(this.micMuted); + } + + ns.publish(name, (mode == BROADCAST) ? LIVE : mode); + if (f != null) { + f.call(); + } + } + + private function _connect(url:String):void { + nc.connect(url, { + uid: params.uid + , sid: params.sid + , nativeSsl: 'best' == params.proxyType + }); + } + + private function connect(callback:Function):void { + if (nc == null || !nc.connected) { + url = params.url; + debug("NetConnection is not connected", url); + nc = new NetConnection(); + nc.addEventListener(NetStatusEvent.NET_STATUS, function onConnectionStatus(e:NetStatusEvent):void { + debug("ConnectionStatus: " + e.info.code); + switch (e.info.code) { + case 'NetConnection.Connect.Failed': + if (!fallback) { + fallback = true; + url = params.fallback; + _connect(url); + } + break; + case 'NetConnection.Connect.Success': + callback(); + break; + //TODO other cases + } + }); + nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, function (event:AsyncErrorEvent):void { + debug("login Async error" + event); + }); + nc.client = { + onMetaData: function (infoObject:Object):void { + debug("onMetaData::", infoObject); + } + , onBWDone: function(...rest):void { + debug("onBWDone"); + } + , onBWCheck: function(...rest):Number { + debug("onBWCheck"); + return 0; + } + , setId: function (id:Number):void { + debug("id: " + id); //TODO save connection id + } + }; + _connect(url); + } else { + callback(); + } + } + + public function broadcast(name:String, cam:Camera, mic:Microphone):void { + connect(function():void { + _publish(BROADCAST, name, cam, mic, null); + }); + } + + public function record(name:String, cam:Camera, mic:Microphone, f:Function):void { + connect(function():void { + _publish(RECORD, name, cam, mic, f); + }); + } + + public function play(name:String):void { + connect(function():void { + debug("PLAY::", name); + if (ns != null){ + reset(); + } + mode = PLAY; + createStream(); + //invokes Method in baseVideoView which shows the stream + getVideo().attachNetStream(ns); + //FIXME: Commented out, cause this leads to Buffer-Full/Buffer-Empty Events + //after re-syncing the stream + //this.setBuffer(0.1); + ns.play(name); + }); + } + + public function reset():void { + if (ns != null) { + switch (mode) { + case PLAY: + ns.pause(); + ns.dispose(); + clear(); + break; + case BROADCAST: + case RECORD: + ns.publish(null); //false in original code + default: + clear(); + ns.dispose(); + break; + } + } else { + clear(); + } + ns = null; + } +} +} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx ---------------------------------------------------------------------- diff --git a/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx b/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx index df65c1b..da55d60 100644 --- a/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx +++ b/openmeetings-flash/src/main/swf10/networkTesting/networktesting.lzx @@ -1,89 +1,89 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!-- - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - ---> -<canvas width="100%" height="100%" title="NetworkTesting"> - <switch> - <when property="$as3"> - <passthrough> - import flash.external.ExternalInterface; - </passthrough> - </when> - </switch> - <switch> - <when property="$debug"> - <method name="doDebugInit"> - canvas.setAttribute('debug', true); - </method> - <debug fontsize="11" oninit="Debug.showInternalProperties = true" width="40%" y="50%" x="60%" height="50%" /> - </when> - <otherwise> - <method name="doDebugInit"> - </method> - </otherwise> - </switch> - - <include href="testsView.lzx" /> - <include href="restCall.lzx" /> - - <handler name="oninit"><![CDATA[ - flash.external.ExternalInterface.call("loadingComplete"); - var lbls = ExternalInterface.call("getStringLabels"); - canvas.lbls = new Array(lbls.length); - for (var i = 0; i < lbls.length; ++i) { - canvas.lbls[lbls[i].id] = lbls[i].value; - } - var config = ExternalInterface.call("getConfig"); - doDebugInit(); - getSettings(config); - canvas.showTests(); - ]]></handler> - - <method name="lbl" args="key"> - var s = canvas.lbls['network.test.' + key]; - if ($debug) Debug.info("LBL ", key, s, canvas.lbls); - return !!s ? s : "Missing[" + key + "]"; - </method> - - <method name="getSettings" args="config"> - if ($debug) Debug.write("getSettings:: ", config); - canvas.setAttribute("rtmpProtocol", config.flashProtocol); - canvas.setAttribute("proxyType", config.proxy); - canvas.setAttribute("rtmpHost", config.host); - canvas.setAttribute("rtmpPort", config.flashPort); - - canvas.setAttribute("httpProtocol", config.httpProtocol); - canvas.setAttribute("httpHost", config.host); - canvas.setAttribute("httpPort", config.httpPort); - - canvas.setAttribute("uriContext", '/' + config.path); - canvas.setAttribute("rtmpUriPath", canvas.uriContext + "hibernate"); - </method> - - <method name="showTests"> - var tests = new lz.TestsView(canvas, {name:"testsView"}); - tests.testAll(); - </method> - - <attribute name="busy" type="boolean" value="false"/> - <attribute name="log" type="string" value="" /> - - <attribute name="testsView" value="null"/> - -</canvas> +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + +--> +<canvas width="100%" height="100%" title="NetworkTesting"> + <switch> + <when property="$as3"> + <passthrough> + import flash.external.ExternalInterface; + </passthrough> + </when> + </switch> + <switch> + <when property="$debug"> + <method name="doDebugInit"> + canvas.setAttribute('debug', true); + </method> + <debug fontsize="11" oninit="Debug.showInternalProperties = true" width="40%" y="50%" x="60%" height="50%" /> + </when> + <otherwise> + <method name="doDebugInit"> + </method> + </otherwise> + </switch> + + <include href="testsView.lzx" /> + <include href="restCall.lzx" /> + + <handler name="oninit"><![CDATA[ + flash.external.ExternalInterface.call("loadingComplete"); + var lbls = ExternalInterface.call("getStringLabels"); + canvas.lbls = new Array(lbls.length); + for (var i = 0; i < lbls.length; ++i) { + canvas.lbls[lbls[i].id] = lbls[i].value; + } + var config = ExternalInterface.call("getConfig"); + doDebugInit(); + getSettings(config); + canvas.showTests(); + ]]></handler> + + <method name="lbl" args="key"> + var s = canvas.lbls['network.test.' + key]; + if ($debug) Debug.info("LBL ", key, s, canvas.lbls); + return !!s ? s : "Missing[" + key + "]"; + </method> + + <method name="getSettings" args="config"> + if ($debug) Debug.write("getSettings:: ", config); + canvas.setAttribute("rtmpProtocol", config.flashProtocol); + canvas.setAttribute("proxyType", config.proxy); + canvas.setAttribute("rtmpHost", config.host); + canvas.setAttribute("rtmpPort", config.flashPort); + + canvas.setAttribute("httpProtocol", config.httpProtocol); + canvas.setAttribute("httpHost", config.host); + canvas.setAttribute("httpPort", config.httpPort); + + canvas.setAttribute("uriContext", '/' + config.path); + canvas.setAttribute("rtmpUriPath", canvas.uriContext + "hibernate"); + </method> + + <method name="showTests"> + var tests = new lz.TestsView(canvas, {name:"testsView"}); + tests.testAll(); + </method> + + <attribute name="busy" type="boolean" value="false"/> + <attribute name="log" type="string" value="" /> + + <attribute name="testsView" value="null"/> + +</canvas> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8e63647c/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx ---------------------------------------------------------------------- diff --git a/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx b/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx index ad1958f..0cb20a6 100644 --- a/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx +++ b/openmeetings-flash/src/main/swf10/networkTesting/rtmpConnection.lzx @@ -1,367 +1,367 @@ -<library> -<!-- - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - ---> - -<class name="rtmpConnection" extends="node"> - <switch> - <when property="$as3"> - <passthrough> - import flash.net.NetConnection; - import flash.events.NetStatusEvent; - </passthrough> - </when> - </switch> - - <attribute name="debug" value="false" type="boolean" /> - - <event name="onconnect"/> - <event name="onerror"/> - - <!-- this attribute holds a reference to the current/last called netremoteCall, - in case of error you can debug that way which call did fail --> - <attribute name="lastCalled" value="null" /> - - <attribute name="src" value="" type="string"/> - - <method name="connect"> - this._nc = new NetConnection(); - - // local reference to rtmpconnection - //this._nc.t = this; - - this._nc.proxyType = canvas.proxyType; - - var ok = this._nc.connect(src == "null" ? null : src, { - uid: "noclient" - }); - if (this.debug) { - if($debug) Debug.write("*** debug ***"); - } - - this._nc.addEventListener(NetStatusEvent.NET_STATUS, _onStatus); - - if($debug) Debug.write("devRtmpConnection/registerMethods()"); - var clientObj = {}; - clientObj.setId = this.setId; - - this._nc.client = clientObj; - - //Register Methods - //this.registerMethods(); - </method> - - <method name="setId" args="tId"> - if ($debug) Debug.write("setId ", tId); - </method> - - <method name="_onStatus" args="stats"><![CDATA[ - if ($debug) { - Debug.write("devrtmpconnection", this, "_onStatus", stats.info.code); - } - - var msg = ""; - var s; - - switch (stats.info.code) { - - case "NetConnection.Connect.Success": { - // The connection attempt succeeded. - //canvas.currentNC is the reference to the NetConnection that is used in the NetStream - msg = stats.info.code; - canvas.currentNC = this._nc; - s = 2; - break; - } - - case "NetConnection.Connect.Closed": { - msg = stats.info.code; - this._nc = null; - canvas.currentNC = null; - s = 0; - break; - } - - default: { - msg = stats.info.code; - s = 0; - break; - } - - } - - this.setAttribute("status", msg); - - if (s == 2) { - this.onconnect.sendEvent(); - } else { - this.onerror.sendEvent(); - } - - ]]> - </method> - - <method name="disconnect"> - if ($debug) Debug.write(" DISCONNECT "); - if (this._nc != null) { - this._nc.close(); - } - </method> - <!--- - With this function all methods are registered to the NetConnection - A server can invoke this Method with a call for it from the Client - Only subnodes of rtmpconnections which are a instance of netRemoteCallHib - are registered, to add dynamically methods to the remotefunction you will - have to invoke this method once again - -swagner - --> - <method name="registerMethods"> - <![CDATA[ - if (this.subnodes!=null){ - var clientObj = {}; - //Register all methods which are onstanceof netRemoteCallHib - for (var i=0;i<this.subnodes.length;i++){ - //If it is of Type netRemoteCallHib then register it to the NetConnection - if (this.subnodes[i] instanceof lz.netRemoteCallHib){ - clientObj[this.subnodes[i].funcname] = function( args ){ - return canvas.thishib.remoteCallMethod(arguments.callee,arguments); - //return hib.remoteCallMethod(arguments.callee,args); - } - } - } - this._nc.client = clientObj; - } - ]]> - </method> - - <!-- - Process the RemoteCall to the Right Funtion - -swagner - --> - <method name="remoteCallMethod" args="callee,args"> - <![CDATA[ - for (var eg in this._nc){ - if (this._nc[eg]==callee){ - if (this.debug) { - //_root.Debug.write.write("DEBUG invoked a function remotely: ",eg,args); - } - if (args.length == 1) { - return this.callFuntion(eg,args[0]); - } else { - return this.callFuntion(eg,args); - } - //return this.callFuntion(eg,args); - } - } - ]]> - </method> - - <!-- - Map the Function to a netRemoteCallHib - -swagner - --> - <method name="callFuntion" args="funcname,args"> - <![CDATA[ - for (var i=0;i<this.subnodes.length;i++){ - if (this.subnodes[i].funcname==funcname){ - return this.subnodes[i].onResult(args); - } - } - ]]> - </method> - - <method name="callRPC" args="func, obj, params"> - //if ($debug) Debug.write("*** call: func, obj, params",func,obj, typeof (params) ,params.length); - if (params.length != 0){ - //does this really work? - //ASSetPropFlags(_global, null, 8, 1); - //setPropertyIsEnumerable(8, 1); - //Debug.write("does it work?",arguments); - <!-- - this._nc.call.apply(this._nc,arguments); - --> - if (params.length==1){ - this._nc.call(func, obj,params[0]); - } else if (params.length==2){ - this._nc.call(func, obj,params[0],params[1]); - } else if (params.length==3){ - this._nc.call(func, obj,params[0],params[1],params[2]); - } else if (params.length==4){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3]); - } else if (params.length==5){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4]); - } else if (params.length==6){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5]); - } else if (params.length==7){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6]); - } else if (params.length==8){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7]); - } else if (params.length==9){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8]); - } else if (params.length==10){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9]); - } else if (params.length==11){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10]); - } else if (params.length==12){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11]); - } else if (params.length==13){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12]); - } else if (params.length==14){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13]); - } else if (params.length==15){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14]); - } else if (params.length==16){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15]); - } else if (params.length==17){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16]); - } else if (params.length==18){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17]); - } else if (params.length==19){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18]); - } else if (params.length==20){ - this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18],params[19]); - } - } else { - this._nc.call(func, obj); - } - </method> -</class> - - - <!--- - Net remote call. - @todo Document netremotecall class. - --> - <class name="netremotecall" extends="node"> - <switch> - <when property="$as3"> - <passthrough> - import flash.net.Responder; - </passthrough> - </when> - </switch> - - <!--- Name of the remote function. --> - <attribute name="funcname" value="$once{null}" type="string" /> - - <attribute name="remotecontext" value="null" /> - - <attribute name="dataobject" value="null" /> - - <attribute name="responder" value="null" /> - - <!--- Data handling event. args="value" --> - <event name="ondata" /> - - <!--- Error handling event. --> - <event name="onerror"/> - - <!--- Call the remote method, passing the array of params. --> - <method name="callRPC" args="params"><![CDATA[ - if (this.funcname == null) { - //Debug.write("No funcname given"); - if (this.onerror) this.onerror.sendEvent("No funcname given"); - return; - } - - if (params == null) { - params = new Array(); - - var subnodes = this.subnodes; - if (subnodes != null) { - var i; - var n = subnodes.length; - for (i = 0; i < n; i++) { - // If getValue method is declared in param, call that - // instead to get value. - var tsi = subnodes[i]; - //TODO: fixme - //if ((tsi["getValue"] != null) && (tsi.getValue["prototype"] != null)) { - // params[i] = tsi.getValue(); - // Debug.write("tsi.getValue():", tsi.getValue()); - //} else { - // params[i] = tsi.value; - //} - params[i] = tsi.getValue(); - } - } - - } else if (params.__proto__ != Array.prototype) { - //Debug.write(this.name, "error: first argument (params) is not an array"); - return -1; - } - - //if ($debug) Debug.write("call", this, this.parent, this.parent.status); - var rtmpObject = null; - if (this.parent instanceof lz.rtmpConnection){ - rtmpObject = this.parent; - } else if(this.remotecontext instanceof lz.rtmpConnection){ - rtmpObject = this.remotecontext; - } else { - if ($debug) Debug.warn("ERROR: no remotecontext availible abort call", this.funcname, this); - return; - } - //Debug.write('call', this, rtmpObject, rtmpObject.status); - //Debug.write('call', this.remotecontext); - if (rtmpObject.debug) Debug.write('call', this, rtmpObject, rtmpObject.status); - rtmpObject.lastCalled = this; - - this.responder = new Responder(onResult); - - rtmpObject.callRPC(this.funcname, this.responder, params); - - ]]> - </method> - - <!--- Handle the result returned from the remote method. --> - <method name="onResult" args="value"><![CDATA[ - // Can be overriden. - // Would be great if it can be used with dataobject, - // but I don't know how to convert Array/primitive to LzDataset/LzDataPointer. - ////Debug.write("netremotecall", this, "onResult", value); - - if (this.dataobject!=null) { - if ( this.dataobject instanceof LzDataset ) { - //Debug.write("onResult: ",this,value,dataobject); - var element = LzDataElement.valueToElement(value); - this.dataobject.setData(element.childNodes); - } else if ( this.dataobject instanceof LzDataElement ) { - var element = LzDataElement.valueToElement(value); - this.dataobject.appendChild( element ); - } else { - //TODO:fixme - //Debug.warn("dataobject is not LzDataset or LzDataElement: ",this,this.dataobject,delegate); - } - } - this.ondata.sendEvent(value); - ]]> - </method> - </class> - - <!--- - Net parameter. - Element to use inside netremotecall. - @todo Document netparam class. - --> - <class name="netparam" extends="node"> - <!--- The value of the netparam. --> - <attribute name="value" value="null"/> - </class> - -</library> +<library> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + +--> + +<class name="rtmpConnection" extends="node"> + <switch> + <when property="$as3"> + <passthrough> + import flash.net.NetConnection; + import flash.events.NetStatusEvent; + </passthrough> + </when> + </switch> + + <attribute name="debug" value="false" type="boolean" /> + + <event name="onconnect"/> + <event name="onerror"/> + + <!-- this attribute holds a reference to the current/last called netremoteCall, + in case of error you can debug that way which call did fail --> + <attribute name="lastCalled" value="null" /> + + <attribute name="src" value="" type="string"/> + + <method name="connect"> + this._nc = new NetConnection(); + + // local reference to rtmpconnection + //this._nc.t = this; + + this._nc.proxyType = canvas.proxyType; + + var ok = this._nc.connect(src == "null" ? null : src, { + uid: "noclient" + }); + if (this.debug) { + if($debug) Debug.write("*** debug ***"); + } + + this._nc.addEventListener(NetStatusEvent.NET_STATUS, _onStatus); + + if($debug) Debug.write("devRtmpConnection/registerMethods()"); + var clientObj = {}; + clientObj.setId = this.setId; + + this._nc.client = clientObj; + + //Register Methods + //this.registerMethods(); + </method> + + <method name="setId" args="tId"> + if ($debug) Debug.write("setId ", tId); + </method> + + <method name="_onStatus" args="stats"><![CDATA[ + if ($debug) { + Debug.write("devrtmpconnection", this, "_onStatus", stats.info.code); + } + + var msg = ""; + var s; + + switch (stats.info.code) { + + case "NetConnection.Connect.Success": { + // The connection attempt succeeded. + //canvas.currentNC is the reference to the NetConnection that is used in the NetStream + msg = stats.info.code; + canvas.currentNC = this._nc; + s = 2; + break; + } + + case "NetConnection.Connect.Closed": { + msg = stats.info.code; + this._nc = null; + canvas.currentNC = null; + s = 0; + break; + } + + default: { + msg = stats.info.code; + s = 0; + break; + } + + } + + this.setAttribute("status", msg); + + if (s == 2) { + this.onconnect.sendEvent(); + } else { + this.onerror.sendEvent(); + } + + ]]> + </method> + + <method name="disconnect"> + if ($debug) Debug.write(" DISCONNECT "); + if (this._nc != null) { + this._nc.close(); + } + </method> + <!--- + With this function all methods are registered to the NetConnection + A server can invoke this Method with a call for it from the Client + Only subnodes of rtmpconnections which are a instance of netRemoteCallHib + are registered, to add dynamically methods to the remotefunction you will + have to invoke this method once again + -swagner + --> + <method name="registerMethods"> + <![CDATA[ + if (this.subnodes!=null){ + var clientObj = {}; + //Register all methods which are onstanceof netRemoteCallHib + for (var i=0;i<this.subnodes.length;i++){ + //If it is of Type netRemoteCallHib then register it to the NetConnection + if (this.subnodes[i] instanceof lz.netRemoteCallHib){ + clientObj[this.subnodes[i].funcname] = function( args ){ + return canvas.thishib.remoteCallMethod(arguments.callee,arguments); + //return hib.remoteCallMethod(arguments.callee,args); + } + } + } + this._nc.client = clientObj; + } + ]]> + </method> + + <!-- + Process the RemoteCall to the Right Funtion + -swagner + --> + <method name="remoteCallMethod" args="callee,args"> + <![CDATA[ + for (var eg in this._nc){ + if (this._nc[eg]==callee){ + if (this.debug) { + //_root.Debug.write.write("DEBUG invoked a function remotely: ",eg,args); + } + if (args.length == 1) { + return this.callFuntion(eg,args[0]); + } else { + return this.callFuntion(eg,args); + } + //return this.callFuntion(eg,args); + } + } + ]]> + </method> + + <!-- + Map the Function to a netRemoteCallHib + -swagner + --> + <method name="callFuntion" args="funcname,args"> + <![CDATA[ + for (var i=0;i<this.subnodes.length;i++){ + if (this.subnodes[i].funcname==funcname){ + return this.subnodes[i].onResult(args); + } + } + ]]> + </method> + + <method name="callRPC" args="func, obj, params"> + //if ($debug) Debug.write("*** call: func, obj, params",func,obj, typeof (params) ,params.length); + if (params.length != 0){ + //does this really work? + //ASSetPropFlags(_global, null, 8, 1); + //setPropertyIsEnumerable(8, 1); + //Debug.write("does it work?",arguments); + <!-- + this._nc.call.apply(this._nc,arguments); + --> + if (params.length==1){ + this._nc.call(func, obj,params[0]); + } else if (params.length==2){ + this._nc.call(func, obj,params[0],params[1]); + } else if (params.length==3){ + this._nc.call(func, obj,params[0],params[1],params[2]); + } else if (params.length==4){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3]); + } else if (params.length==5){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4]); + } else if (params.length==6){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5]); + } else if (params.length==7){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6]); + } else if (params.length==8){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7]); + } else if (params.length==9){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8]); + } else if (params.length==10){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9]); + } else if (params.length==11){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10]); + } else if (params.length==12){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11]); + } else if (params.length==13){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12]); + } else if (params.length==14){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13]); + } else if (params.length==15){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14]); + } else if (params.length==16){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15]); + } else if (params.length==17){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16]); + } else if (params.length==18){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17]); + } else if (params.length==19){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18]); + } else if (params.length==20){ + this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18],params[19]); + } + } else { + this._nc.call(func, obj); + } + </method> +</class> + + + <!--- + Net remote call. + @todo Document netremotecall class. + --> + <class name="netremotecall" extends="node"> + <switch> + <when property="$as3"> + <passthrough> + import flash.net.Responder; + </passthrough> + </when> + </switch> + + <!--- Name of the remote function. --> + <attribute name="funcname" value="$once{null}" type="string" /> + + <attribute name="remotecontext" value="null" /> + + <attribute name="dataobject" value="null" /> + + <attribute name="responder" value="null" /> + + <!--- Data handling event. args="value" --> + <event name="ondata" /> + + <!--- Error handling event. --> + <event name="onerror"/> + + <!--- Call the remote method, passing the array of params. --> + <method name="callRPC" args="params"><![CDATA[ + if (this.funcname == null) { + //Debug.write("No funcname given"); + if (this.onerror) this.onerror.sendEvent("No funcname given"); + return; + } + + if (params == null) { + params = new Array(); + + var subnodes = this.subnodes; + if (subnodes != null) { + var i; + var n = subnodes.length; + for (i = 0; i < n; i++) { + // If getValue method is declared in param, call that + // instead to get value. + var tsi = subnodes[i]; + //TODO: fixme + //if ((tsi["getValue"] != null) && (tsi.getValue["prototype"] != null)) { + // params[i] = tsi.getValue(); + // Debug.write("tsi.getValue():", tsi.getValue()); + //} else { + // params[i] = tsi.value; + //} + params[i] = tsi.getValue(); + } + } + + } else if (params.__proto__ != Array.prototype) { + //Debug.write(this.name, "error: first argument (params) is not an array"); + return -1; + } + + //if ($debug) Debug.write("call", this, this.parent, this.parent.status); + var rtmpObject = null; + if (this.parent instanceof lz.rtmpConnection){ + rtmpObject = this.parent; + } else if(this.remotecontext instanceof lz.rtmpConnection){ + rtmpObject = this.remotecontext; + } else { + if ($debug) Debug.warn("ERROR: no remotecontext availible abort call", this.funcname, this); + return; + } + //Debug.write('call', this, rtmpObject, rtmpObject.status); + //Debug.write('call', this.remotecontext); + if (rtmpObject.debug) Debug.write('call', this, rtmpObject, rtmpObject.status); + rtmpObject.lastCalled = this; + + this.responder = new Responder(onResult); + + rtmpObject.callRPC(this.funcname, this.responder, params); + + ]]> + </method> + + <!--- Handle the result returned from the remote method. --> + <method name="onResult" args="value"><![CDATA[ + // Can be overriden. + // Would be great if it can be used with dataobject, + // but I don't know how to convert Array/primitive to LzDataset/LzDataPointer. + ////Debug.write("netremotecall", this, "onResult", value); + + if (this.dataobject!=null) { + if ( this.dataobject instanceof LzDataset ) { + //Debug.write("onResult: ",this,value,dataobject); + var element = LzDataElement.valueToElement(value); + this.dataobject.setData(element.childNodes); + } else if ( this.dataobject instanceof LzDataElement ) { + var element = LzDataElement.valueToElement(value); + this.dataobject.appendChild( element ); + } else { + //TODO:fixme + //Debug.warn("dataobject is not LzDataset or LzDataElement: ",this,this.dataobject,delegate); + } + } + this.ondata.sendEvent(value); + ]]> + </method> + </class> + + <!--- + Net parameter. + Element to use inside netremotecall. + @todo Document netparam class. + --> + <class name="netparam" extends="node"> + <!--- The value of the netparam. --> + <attribute name="value" value="null"/> + </class> + +</library>
