diff --git a/bbb-api-examples/PHP/bbb_api.inc.php b/bbb-api-examples/PHP/bbb_api.inc.php deleted file mode 100755 index 013e9cda9b43ffd1c7ac9d07203210cc46572948..0000000000000000000000000000000000000000 --- a/bbb-api-examples/PHP/bbb_api.inc.php +++ /dev/null @@ -1,158 +0,0 @@ -<? -/* -BigBlueButton - http://www.bigbluebutton.org - -Copyright (c) 2008-2009 by respective authors (see below). All rights reserved. - -BigBlueButton is free software; you can redistribute it and/or modify it under the -terms of the GNU Lesser General Public License as published by the Free Software -Foundation; either version 3 of the License, or (at your option) any later -version. - -BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with BigBlueButton; if not, If not, see <http://www.gnu.org/licenses/>. - -Author: DJP <DJP@architectes.org> - -*/ -require('bbb_api_conf.inc.php'); - -/* - * Create a meeting and return a URL to join it as moderator - */ -function getJoinURL($username, $meetingID, $welcome = '') -{ - $base_url_create = BIGBLUEBUTTONURL."api/create?"; - $base_url_join = BIGBLUEBUTTONURL."api/join?"; - $voiceBridge = 70000 + rand(0, 9999); - - // - // When creating a meeting, the 'name' parameter is the name of the meeting (not to be confused with - // the username). For example, the name could be "Fred's meeting" and the meetingID could be "ID-1234312". - // - // While name and meetinID could be different, we'll keep them the same. Why? Because calling api/create? - // with a previously used meetingID will return same meetingToken (regardless if the meeting is running or not). - // - // This means the first person to call getJoinURL with meetingID="Demo Meeting" will actually create the - // meeting. Subsequent calls will return the same meetingToken and thus subsequent users will join the same - // meeting. - // - // Note: We're hard-coding the password for moderator and attendee (viewer) for purposes of demo. - // - - $params = 'name='.urlencode($meetingID).'&meetingID='.urlencode($meetingID).'&attendeePW='.ATTENDEEPW.'&moderatorPW='.MODERATORPW.'&voiceBridge='.$voiceBridge; - if (trim($welcome)) - $params .= '&welcome='.urlencode($welcome); - $xml = bbb_wrap_simplexml_load_file($base_url_create.$params.'&checksum='.sha1($params.SALT)); - if ($xml && $xml->returncode == 'SUCCESS' && $meetingToken = trim($xml->meetingToken)) - { - $params = 'meetingToken='.$meetingToken.'&fullName='.urlencode($username).'&password='.MODERATORPW; - return ($base_url_join.$params.'&checksum='.sha1($params.SALT)); - } else if ($xml) - return ($xml->messageKey.' : '.$xml->message); - else - return ('Unable to fetch URL '.$base_url_create.$params.'&checksum='.sha1($params.SALT)); -} - -/* - * getJoinURLViewer() -- Get the URL to join a meeting as viewer - */ -function getJoinURLViewer($username, $meetingToken, $welcome = '') -{ - $base_url_join = BIGBLUEBUTTONURL."api/join?"; - - $params = 'meetingToken='.$meetingToken.'&fullName='.urlencode($username).'&password='.ATTENDEEPW; - - return ($base_url_join.$params.'&checksum='.sha1($params.SALT)); -} - -/* - * getURLisMeetingRunning() -- return a URL that the client can use to poll for whether the given meeting is running - * Beware : check that BIGBLUEBUTTONURL is reachable internally from your PHP Web Application Server. (Hosts, firewall...) - */ - -function getURLisMeetingRunning($meetingToken, $meetingID) -{ - $base_url = BIGBLUEBUTTONURL."api/isMeetingRunning?"; - $params = 'meetingToken='.$meetingToken.'&meetingID='.urlencode($meetingID); - - return ($base_url.$params.'&checksum='.sha1($params.SALT)); -} - -/* - * isMeetingRunning() -- check the BigBlueButton server to see if the meeting is running (i.e. there is someone in the meeting) - */ -function isMeetingRunning($meetingToken, $meetingID) -{ - $xml = bbb_wrap_simplexml_load_file(getURLisMeetingRunning($meetingToken, $meetingID)); - if ($xml && $xml->returncode == 'SUCCESS') - return (($xml->running == 'TRUE')?true:false); - else - return (false); -} - -/* - * getURLMeetingInfo() -- return a URL to get MeetingInfo - * Beware : check that BIGBLUEBUTTONURL is reachable internally from your PHP Web Application Server. (Hosts, firewall...) - */ -function getURLMeetingInfo($meetingID, $moderatorPW) -{ - $base_url = BIGBLUEBUTTONURL."api/getMeetingInfo?"; - $params = 'meetingID='.urlencode($meetingID).'&password='.$moderatorPW; - - return ($base_url.$params.'&checksum='.sha1($params.SALT)); -} - -/* - * getMeetings() -- Calls getMeetingInfo to obtain information on a given meeting. - */ -function getMeetingInfo($meetingID, $moderatorPW) -{ - $xml = bbb_wrap_simplexml_load_file(getURLMeetingInfo($meetingID, $moderatorPW)); - return (str_replace('</response>', '', str_replace("<?xml version=\"1.0\"?>\n<response>", '', $xml->asXML()))); -} - -/* - * getURLMeetings() -- return a URL for listing all running meetings - * Beware : check that BIGBLUEBUTTONURL is reachable internally from your PHP Web Application Server. (Hosts, firewall...) - */ -function getURLMeetings() -{ - $base_url = BIGBLUEBUTTONURL."api/getMeetings?"; - $params = 'random='.(rand() * 1000); - - return ($base_url.$params.'&checksum='.sha1($params.SALT)); -} - -/* - * getMeetings() -- Calls getMeetings to obtain the list of meetings, then calls getMeetingInfo for each meeting and concatenates the result. - */ -function getMeetings() -{ - $xml = bbb_wrap_simplexml_load_file(getURLMeetings()); - if ($xml && $xml->returncode == 'SUCCESS') - { - if ($xml->messageKey) - return ($xml->message->asXML()); - ob_start(); - echo '<meetings>'; - if (count($xml->meetings) && count($xml->meetings->meeting)) - { - foreach ($xml->meetings->meeting as $meeting) - { - echo '<meeting>'; - echo getMeetingInfo($meeting->meetingID, $meeting->moderatorPW); - echo '</meeting>'; - } - } - echo '</meetings>'; - return (ob_get_clean()); - } - else - return (false); -} -?> \ No newline at end of file diff --git a/bbb-api-examples/PHP/bbb_api.php b/bbb-api-examples/PHP/bbb_api.php new file mode 100755 index 0000000000000000000000000000000000000000..dee5ba24303880f76c7dfe441c822ecdc8cacb7b --- /dev/null +++ b/bbb-api-examples/PHP/bbb_api.php @@ -0,0 +1,356 @@ +<?php + +if(function_exists("curl_init()")) +{ + function bbb_wrap_simplexml_load_file($url) + { + $ch = curl_init() or die ( curl_error() ); + curl_setopt( $ch, CURLOPT_URL, $url ); + curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); + $data = curl_exec( $ch ); + curl_close( $ch ); + return (new SimpleXMLElement($data)); + } +} +else +{ + /* + * REQUIREMENT - PHP.INI + * allow_url_fopen = On + */ + function bbb_wrap_simplexml_load_file($url) + { + return (simplexml_load_file($url)); + } +} + +/* +@param +$userName = userName AND meetingID (string) +$welcomeString = welcome message (string) +$modPW = moderator password (string) +$vPW = viewer password (string) +$voiceBridge = voice bridge (integer) +$logout = logout url (url) +*/ +// create a meeting and return the url to join as moderator + + +// TODO:: +// create some set methods +class BigBlueButton { + + var $userName = array(); + var $meetingID; // the meeting id + + var $welcomeString; + // the next 2 fields are maybe not needed?!? + var $modPW; // the moderator password + var $attPW; // the attendee pw + + var $securitySalt; // the security salt; gets encrypted with sha1 + var $URL; // the url the bigbluebutton server is installed + var $sessionURL; // the url for the administrator to join the sessoin + var $userURL; + + var $conferenceIsRunning = false; + // this constructor is used to create a BigBlueButton Object + // use this object to create servers + // Use is either 0 arguments or all 7 arguments +public function __construct() { + + + $numargs = func_num_args(); + + if( $numargs == 0 ) { + echo "Constructor created"; + } + // pass the information to the class variables + else if( $numargs >= 6 ) { + $this->userName = func_get_arg(0); + $this->meetingID = func_get_arg(1); + $this->welcomeString = func_get_arg(2); + $this->modPW = func_get_arg(3); + $this->attPW = func_get_arg(4); + $this->securitySalt = func_get_arg(5); + $this->URL = func_get_arg(6); + + + $arg_list = func_get_args(); + for ($i = 0; $i < $numargs; $i++) { + echo "Argument $i is: " . $arg_list[$i] . "<br />\n"; + } + +// $this->createMeeting( $this->userName, $this->meetingID, $this->welcomeString, $this->modPW, $this->attPW, $this->securitySalt, $this->URL ); + // echo "Object created"; +// echo '<br />'; + }// end else if +} + +public function checkCurl($url) { + /* + * Is libcurl available ? + */ +if(function_exists("curl_init()")) +{ + //function bbb_wrap_simplexml_load_file($url) + //{ + $ch = curl_init() or die ( curl_error() ); + curl_setopt( $ch, CURLOPT_URL, $url ); + curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); + $data = curl_exec( $ch ); + curl_close( $ch ); + return (new SimpleXMLElement($data)); +// } +} +else +{ + /* + * REQUIREMENT - PHP.INI + * allow_url_fopen = On + */ + // function bbb_wrap_simplexml_load_file($url) + // { + return (simplexml_load_file($url)); + // } +} +} + +// a whole bunch of set and get functions for the variables +// set the user name + +public function setUserName( $userName ) { + $this->userName = urlencode($userName); +} + +public function getUserName() { return $this->userName; } + +// set the meetingID +public function setMeetingID( $meetingID ) { + $this->meetingID = urlencode($meetingID); +} + +public function getMeetingID() { return $this->meetingID; } + +// unsafe function, try not to use it +public function setModeratorPW( $modPW ) { + $this->modPW = $modPW; +} + +public function getModeratorPW() { return $this->modPW; } + +// same comment as for setModeratorPW +public function setAttendeePW( $attPW ) { + $this->attPW = $attPW; +} + +public function getAttendeePW() { $this->attPW; } + +public function setSecuritySalt( $salt ) { + $this->securitySalt = $salt; +} + +public function getSecuritySalt() { return $this->securitySalt; } + +public function setURL( $URL ) { + $this->URL = $URL; +} + +public function getURL() { return $this->URL; } + +public function createMeeting( $username, $meetingID, $welcomeString, $mPW, $aPW, $SALT, $URL ) { + $url_create = $URL."api/create?"; + $url_join = $URL."api/join?"; + $voiceBridge = 70000 + rand(0, 9999); + + $params = 'name='.urlencode($meetingID).'&meetingID='.urlencode($meetingID).'&attendeePW='.$aPW.'&moderatorPW='.$mPW.'&voiceBridge='.$voiceBridge; + + if( trim( $welcomeString ) ) + $params .= '&welcome='.urlencode($welcomeString); + + $xml = bbb_wrap_simplexml_load_file($url_create.$params.'&checksum='.sha1("create".$params.$SALT) ); + + if( $xml && $xml->returncode == 'SUCCESS' ) { + $params = 'meetingID='.urlencode($meetingID).'&fullName='.urlencode($username).'&password='.$mPW; + // create the url + $this->sessionURL = $url_join.$params.'&checksum='.sha1("join".$params.$SALT); + $conferenceIsRunning = true; + return ($url_join.$params.'&checksum='.sha1("join".$params.$SALT) ); + } + else if( $xml ) { + return ( $xml->messageKey.' : '.$xml->message ); + } + else { + return ('Unable to fetch URL '.$url_create.$params.'&checksum='.sha1("create".$params.$SALT) ); + } +} + +// return the url to join a meeting as viewer +public function joinAsViewer( $userName, $welcomeString = '', $aPW, $SALT, $URL ) { + $url_join = $URL."api/join?"; + $params = 'meetingID='.urlencode($meetingID).'&fullName='.urlencode($userName).'&password='.$aPW; + $this->userURL = $url_join.$params.'&checksum='.sha1("join".$params.$SALT); + return ($url_join.$params.'&checksum='.sha1("join".$params.$SALT) ); +} + +// getURLisMeetingRunning() -- return an URL that the client can use to poll for whether the given meeting is running +public function getUrlOfRunningMeeting( $meetingID, $URL, $SALT ) { + $base_url = $URL."api/isMeetingRunning?"; + $params = '&meetingID='.urlencode($meetingID); + return ($base_url.$params.'&checksum='.sha1("isMeetingRunning".$params.$SALT) ); +} + +// isMeetingRunning() -- check the BigBlueButton server to see if the meeting is running (i.e. there is someone in the meeting) +public function isMeetingRunning( $meetingID, $meetingID, $URL ) { + $xml = bbb_wrap_simplexml_load_file( $this->getUrlOfRunningMeeting( $meetingID, $meetingID, $URL ) ); + if( $xml && $xml->returncode == 'SUCCESS' ) + return ( ( $xml->running == 'TRUE' ) ? true : false); + else + return ( false ); +} + +// getURLMeetingInfo() -- return a URL to get MeetingInfo +public function getUrlFromMeetingInfo( $meetingID, $modPW, $URL, $SALT ) { + $base_url = $URL."api/getMeetingInfo?"; + $params = 'meetingID='.urlencode($meetingID).'&password='.$modPW; + return ( $base_url.$params.'&checksum='.sha1("getMeetingInfo".$params.$SALT)); +} + + // getMeetingInfo() -- Calls getMeetingInfo to obtain information on a given meeting. +public function getMeetingInfo( $meetingID, $modPW, $URL, $SALT ) { + $xml = bbb_wrap_simplexml_load_file( $this->getUrlFromMeetingInfo( $meetingID, $modPW, $URL, $SALT ) ); + return ( str_replace('</response>', '', str_replace("<?xml version=\"1.0\"?>\n<response>", '', $xml->asXML()))); +} + + // getMeetingXML() --calls isMeetingRunning to obtain the xml values of the response of the returned URL +public function getMeetingXML( $meetingID, $URL, $SALT ) { + $xml = bbb_wrap_simplexml_load_file( $this->getUrlOfRunningMeeting( $meetingID, $URL, $SALT ) ); + return ( str_replace('</response>', '', str_replace("<?xml version=\"1.0\"?>\n<response>", '', $xml->asXML()))); +} + +// getURLMeetings() -- return a URL for listing all running meetings +public function getUrlMeetings($URL, $SALT) { + $base_url = $URL."api/getMeetings?"; + $params = 'random='.(rand() * 1000 ); + return ( $base_url.$params.'&checksum='.sha1("getMeetings".$params.$SALT)); +} + +public function endMeeting( $meetingID, $mPW, $URL, $SALT ) { + $base_url = $URL."api/end?"; + $params = 'meetingID='.urlencode($meetingID).'&password='.$mPW; + return ( $base_url.$params.'&checksum='.sha1("end".$params.$SALT) ); +} + + + +// TODO: WRITE AN ITERATOR WHICH GOES OVER WHATEVER IT IS BEING TOLD IN THE API AND LIST INFORMATION +/* we have to define at least 2 variable fields for getInformation to read out information at any position +The first is: An identifier to chose if we look for attendees or the meetings or something else +The second is: An identifier to chose what integrated functions are supposed to be used + +@param IDENTIFIER -- needs to be put in for the function to identify the information to print out + current values which can be used are 'attendee' and 'meetings' +@param meetingID -- needs to be put in to identify the meeting +@param modPW -- needs to be put in if the users are supposed to be shown or to retrieve information about the meetings +@param URL -- needs to be put in the URL to the bigbluebutton server +@param SALT -- needs to be put in for the security salt calculation + +Note: If 'meetings' is used, then only the parameters URL and SALT needs to be used + If 'attendee' is used, then all the parameters needs to be used +*/ +public function getInformation( $IDENTIFIER, $meetingID, $modPW, $URL, $SALT ) { + // if the identifier is null or '', then return false + if( $IDENTIFIER == "" || $IDENTIFIER == null ) { + echo "You need to type in a valid value into the identifier."; + return false; + } + // if the identifier is attendee, call getUsers + else if( $IDENTIFIER == 'attendee' ) { + return getUsers( $meetingID, $modPW, $URL, $SALT ); + } + // if the identifier is meetings, call getMeetings + else if( $IDENTIFIER == 'meetings' ) { + return getMeetings( $URL, $SALT ); + } + // return nothing + else { + return true; + } + +} + + +// return the users in the current conference +public function getUsers( $meetingID, $modPW, $URL, $SALT ) { + $xml = bbb_wrap_simplexml_load_file( $this->getUrlFromMeetingInfo( $meetingID, $modPW, $URL, $SALT ) ); + if( $xml && $xml->returncode == 'SUCCESS' ) { + ob_start(); + if( count( $xml->attendees ) && count( $xml->attendees->attendee ) ) { + + foreach ( $xml->attendees->attendee as $attendee ) { + echo $attendee->fullName.'<br />'; + } + } + return (ob_end_flush()); + } + else { + return (false); + } +} + +// following FUNCTION is for TESTING!!! +public function getUsersXML( $meetingID, $modPW, $URL, $SALT ) { + $xml = bbb_wrap_simplexml_load_file( getUrlMeetingInfo( $meetingID, $modPW, $URL, $SALT ) ); + if( $xml && $xml->returncode == 'SUCCESS' ) { + ob_start(); + echo '<attendees>'; + if( count( $xml->attendees ) && count( $xml->attendees->attendee ) ) { + foreach ( $xml->attendees->attendee as $attendee ) { + echo '<attendee>'; + echo $attendee->fullName.'<br />'; + echo '</attendee>'; + } + } + else { + echo '<br />'."There are currently no users in the session right now.".'<br />'; + } + echo '</attendees>'; + return (ob_end_flush()); + } + else { + return (false); + } +} + +// getMeetings() -- Calls getMeetings to obtain the list of meetings, then calls getMeetingInfo for each meeting and concatenates the result. +public function getMeetings( $URL, $SALT ) { + $xml = bbb_wrap_simplexml_load_file(getUrlMeetings( $URL, $SALT ) ); + if( $xml && $xml->returncode == 'SUCCESS' ) { + if( $xml->messageKey ) + return ( $xml->message->asXML() ); + ob_start(); + echo '<meetings>'; + if( count( $xml->meetings ) && count( $xml->meetings->meeting ) ) { + foreach ($xml->meetings->meeting as $meeting) + { + echo '<meeting>'; + echo getMeetingInfo($meeting->meetingID, $meeting->moderatorPW, $URL, $SALT); + echo '</meeting>'; + } + } + echo '</meetings>'; + return (ob_get_clean()); + } + else { + return (false); + } +} + +function getServerIP() { + // get the server url + $sIP = $_SERVER['SERVER_ADDR']; + return $serverIP = 'http://'.$sIP.'/bigbluebutton/'; +} + +} +?> diff --git a/bbb-api-examples/PHP/bbb_api_conf.inc.php b/bbb-api-examples/PHP/bbb_api_conf.inc.php deleted file mode 100755 index 13b85f0ee07cf084b8d558062b2a7bf198b9007b..0000000000000000000000000000000000000000 --- a/bbb-api-examples/PHP/bbb_api_conf.inc.php +++ /dev/null @@ -1,40 +0,0 @@ -<? -// This is the security salt that must match the value set in the BigBlueButton server -define('SALT', '639259d4-9dd8-4b25-bf01-95f9567eaf4b'); - -// This is the URL for the BigBlueButton server -define('BIGBLUEBUTTONURL', 'http://192.168.7.131/bigbluebutton/'); - -/* - * Note: We're hard-coding the password for moderator and attendee (viewer) for purposes of demo. - */ -define('ATTENDEEPW', 'ap'); -define('MODERATORPW', 'mp'); - -/* - * Is libcurl available ? - */ -if(function_exists(curl_init)) -{ - function bbb_wrap_simplexml_load_file($url) - { - $ch = curl_init() or die ( curl_error() ); - curl_setopt( $ch, CURLOPT_URL, $url ); - curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); - $data = curl_exec( $ch ); - curl_close( $ch ); - return (new SimpleXMLElement($data)); - } -} -else -{ - /* - * REQUIREMENT - PHP.INI - * allow_url_fopen = On - */ - function bbb_wrap_simplexml_load_file($url) - { - return (simplexml_load_file($url)); - } -} -?> \ No newline at end of file diff --git a/bbb-api-examples/PHP/demo1.php b/bbb-api-examples/PHP/demo1.php index 12b22c6951dcaf1c8c9597786a29c282ac75daf1..308ea72b0779a08a442165d648a509c9618b48af 100755 --- a/bbb-api-examples/PHP/demo1.php +++ b/bbb-api-examples/PHP/demo1.php @@ -20,7 +20,7 @@ Author: DJP <DJP@architectes.org> */ -require('bbb_api.inc.php'); +require('bbb_api.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> @@ -33,6 +33,8 @@ require('bbb_api.inc.php'); <? if ($_REQUEST['action'] == 'create' && trim($_REQUEST['username'])) { + $sIP = $_SERVER['SERVER_ADDR']; + $serverIP = 'http://'.$sIP.'/bigbluebutton/'; /* * Got an action=create * @@ -40,8 +42,9 @@ if ($_REQUEST['action'] == 'create' && trim($_REQUEST['username'])) * Pass null for welcome message to use the default message (see defaultWelcomeMessage in bigbluebutton.properties) * */ - - $joinURL = getJoinURL($_REQUEST['username'], "Demo Meeting", null); + $joinURL = new BigBlueButton( $_REQUEST['username'], "Demo Meeting", null, "mp", "ap", $SALT, $sIP ); + $joinURL->createMeeting( $_REQUEST['username'], "Demo Meeting", null, "mp", "ap", $SALT, $sIP ); + //$joinURL = getJoinURL($_REQUEST['username'], "Demo Meeting", null); if (substr($joinURL, 0, 7) == 'http://') { ?> @@ -81,4 +84,4 @@ else include('demo_footer.php'); ?> </body> -</html> \ No newline at end of file +</html> diff --git a/bbb-voice-conference/config/app_konference/app_konference.so b/bbb-voice-conference/config/app_konference/app_konference.so old mode 100755 new mode 100644 index 32b12b71a80fc07864ed5641c1d19a2faea003d5..7a65fc3adc8a8b07a6bb2d772330e8e7a390e14b Binary files a/bbb-voice-conference/config/app_konference/app_konference.so and b/bbb-voice-conference/config/app_konference/app_konference.so differ diff --git a/bigbluebutton-client/README b/bigbluebutton-client/README new file mode 100644 index 0000000000000000000000000000000000000000..6822178493da88f65324843aef377abb22ca652f --- /dev/null +++ b/bigbluebutton-client/README @@ -0,0 +1,4 @@ +see http://code.google.com/p/bigbluebutton + +Developing the client +1. Copy src/conf/config.xml.dev to src/cong/config.xml diff --git a/bigbluebutton-client/build.xml b/bigbluebutton-client/build.xml index e27a1f0d3fd7d3c859d5ed61f0273a0108a1cd0e..c19e20a2ff74b37cbfb5ea9a5a2d29eb83a07aa1 100755 --- a/bigbluebutton-client/build.xml +++ b/bigbluebutton-client/build.xml @@ -1,60 +1,216 @@ <?xml version="1.0" encoding="utf-8"?> <!-- BigBlueButton Client build.xml for use by Hudson builds. --> -<project name="BigBlueButton Client" basedir="." default="cleanandmake" > +<project name="BigBlueButton Client" basedir="." default="clean-build-all" > <property environment="env" /> <property name="FLEX_HOME" value="${env.FLEX_HOME}" /> - <property name="RESOURCES_DIR" value="./resources" /> - <property name="APP_ROOT" value="./src" /> - <property name="ROOT_DIR" value="." /> - <property name="OUTPUT_DIR" value="./bin" /> + <property name="LOCALE_DIR" value="${FLEX_HOME}/frameworks/locale"/> + <property name="BASE_DIR" value="${basedir}" /> + <property name="RESOURCES_DIR" value="${BASE_DIR}/resources" /> + <property name="SRC_DIR" value="${BASE_DIR}/src" /> + + <property name="OUTPUT_DIR" value="${BASE_DIR}/bin" /> <taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar" /> - <target name="compile-bbb" depends="copy-config-xml, compile-bbb-dev" description="Compiling the BBB mxml files"/> - - <target name="cds" description="Compile Desktop standalone sharing"> - <mxmlc-compile src="${APP_ROOT}" target="DeskshareStandalone" /> + <!-- Declare module names here --> + <property name="BBB_MAIN" value="BigBlueButton" /> + <property name="CHAT" value="ChatModule" /> + <property name="VIEWERS" value="ViewersModule" /> + <property name="LISTENERS" value="ListenersModule" /> + <property name="PRESENT" value="PresentModule" /> + <property name="DESKSHARE" value="DeskShareModule" /> + <property name="DESKSHARE_SA" value="DeskshareStandalone" /> + <property name="PHONE" value="PhoneModule" /> + <property name="VIDEO" value="VideoconfModule" /> + <property name="HIGHLIGHTER" value="HighlighterModule" /> + <property name="DYN_INFO" value="DynamicInfoModule" /> + + <property name="AVAILABLE_LOCALES" value="az_AZ,de_DE,el_GR,en_US,es_ES,es_LA,fr_FR,hu_HU,it_IT,lt_LT,nb_NO,nl_NL,pl_PL,pt_BR,pt_PT,ro_RO,ru_RU,tr_TR,vi_VN,zh_CN,zh_TW"/> + + <xmlproperty file="${SRC_DIR}/conf/locales.xml" collapseAttributes="true"/> + + <target name="init-ant-contrib"> + <property name="ant-contrib.jar" location="${BASE_DIR}/build/lib/ant-contrib-0.6.jar"/> + <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${ant-contrib.jar}"/> </target> - <target name="compile-bbb-dev" description="Compiling the BBB without copying config.xml"> - <mxmlc-compile src="${APP_ROOT}" target="BigBlueButton" /> - <mxmlc-compile src="${APP_ROOT}" target="ChatModule" /> - <mxmlc-compile src="${APP_ROOT}" target="ViewersModule" /> - <mxmlc-compile src="${APP_ROOT}" target="ListenersModule" /> - <mxmlc-compile src="${APP_ROOT}" target="PresentModule" /> - <mxmlc-compile src="${APP_ROOT}" target="DeskShareModule" /> - <mxmlc-compile src="${APP_ROOT}" target="DeskshareStandalone" /> - <mxmlc-compile src="${APP_ROOT}" target="PhoneModule" /> - <mxmlc-compile src="${APP_ROOT}" target="VideoconfModule" /> - <mxmlc-compile src="${APP_ROOT}" target="HighlighterModule" /> - <mxmlc-compile src="${APP_ROOT}" target="DynamicInfoModule" /> + <target name="localization" depends="init-ant-contrib"> + <echo message="Parsing ${SRC_DIR}/conf/locales.xml for supported locales"/> + <echo message="Available locales ${AVAILABLE_LOCALES}"/> + <!--foreach list="${locales.locale.code}" target="build-locale" param="supportedlocale" delimiter=","/--> + <foreach list="${AVAILABLE_LOCALES}" target="build-locale" param="supportedlocale" delimiter=","/> + </target> + + <target name="build-locale"> + <echo message="Building ${supportedlocale}"/> + <available file="${LOCALE_DIR}/${supportedlocale}" type="dir" property="locale.dir.present"/> + <if> + <equals arg1="${locale.dir.present}" arg2="true"/> + <then> + <echo message="No need to copy ${LOCALE_DIR}/${supportedlocale}"/> + </then> + <else> + <echo message="Need to copy ${LOCALE_DIR}/${supportedlocale}"/> + <exec dir="${BASE_DIR}" vmlauncher="true" executable="copylocale"> + <arg value="en_US"/> + <arg value="${supportedlocale}"/> + </exec> + </else> + </if> + <compileLocale locale="${supportedlocale}" /> + </target> - <copy todir="${OUTPUT_DIR}/conf" > - <fileset dir="./src/conf" /> - </copy> - - <copy todir="${OUTPUT_DIR}/swfobject/" > - <fileset dir="./src/swfobject/" /> - </copy> + <macrodef name="compileLocale" description="Compiles the Resource package for the given locale"> + <attribute name="locale" default="en_US"/> + <sequential> + <echo message="Building @{locale}"/> + <available file="${LOCALE_DIR}/@{locale}" type="dir" property="locale.dir.present"/> + <if> + <equals arg1="${locale.dir.present}" arg2="true"/> + <then> + <echo message="No need to copy ${LOCALE_DIR}/@{locale}"/> + </then> + <else> + <echo message="Need to copy ${LOCALE_DIR}/@{locale}"/> + <exec dir="${BASE_DIR}" vmlauncher="true" executable="copylocale"> + <arg value="en_US"/> + <arg value="@{locale}"/> + </exec> + </else> + </if> + + <!-- + Create the Flex Home directory for the language in question. + This is necessary to compensate for a bug in pre-3.2 releases of + mxmlc. + + <mkdir dir="${FLEX_HOME}/frameworks/locale/@{locale}"/>--> + + <!-- Invoke MXMLC --> + <mxmlc output="${OUTPUT_DIR}/locale/@{locale}_resources.swf"> + <locale>@{locale}</locale> + <source-path path-element="locale/{locale}"/> + <include-resource-bundles>bbbResources</include-resource-bundles> + <source-path path-element="${FLEX_HOME}/frameworks"/> + </mxmlc> + </sequential> + </macrodef> + + <target name="build-bbb-main" description="Compile BigBlueButton Main"> + <build-module src="${SRC_DIR}" target="${BBB_MAIN}" /> + <echo message="Copying common assets for BBB Main" /> <copy todir="${OUTPUT_DIR}/org/bigbluebutton/common/assets/images" > - <fileset dir="./src/org/bigbluebutton/common/assets/images/" /> - </copy> - + <fileset dir="${BASE_DIR}/src/org/bigbluebutton/common/assets/images/" /> + </copy> + </target> + + <target name="build-chat" description="Compile Chat Module"> + <build-module src="${SRC_DIR}" target="${CHAT}" /> + </target> + + <target name="build-viewers" description="Compile Viewers Module"> + <build-module src="${SRC_DIR}" target="${VIEWERS}" /> + </target> + + <target name="build-listeners" description="Compile Listeners Module"> + <build-module src="${SRC_DIR}" target="${LISTENERS}" /> + + <echo message="Copying common assets for Listeners Module" /> <copy todir="${OUTPUT_DIR}/org/bigbluebutton/modules/listeners/view/assets/images/" > - <fileset dir="./src/org/bigbluebutton/modules/listeners/view/assets/images/" /> - </copy> + <fileset dir="${BASE_DIR}/src/org/bigbluebutton/modules/listeners/view/assets/images/" /> + </copy> + </target> + + <target name="build-present" description="Compile Present Module"> + <build-module src="${SRC_DIR}" target="${PRESENT}" /> + </target> - <copy todir="${OUTPUT_DIR}/org/bigbluebutton/modules/phone/views/assets/images/" > - <fileset dir="./src/org/bigbluebutton/modules/phone/views/assets/images/" /> - </copy> + <target name="build-deskshare-standalone" depends="build-deskshare" description="Compile Deskshare Standalone Module"> + <build-module src="${SRC_DIR}" target="${DESKSHARE_SA}" /> + </target> + + <target name="build-deskshare" description="Compile Deskshare Module"> + <build-module src="${SRC_DIR}" target="${DESKSHARE}" /> + <echo message="Copying deskshare applet for Deskshare Module" /> + <copy file="${RESOURCES_DIR}/bbb-deskshare-applet-0.64.jar" todir="${OUTPUT_DIR}"/> + </target> + + <target name="build-phone" description="Compile Phone Module"> + <build-module src="${SRC_DIR}" target="${PHONE}" /> - <copy file="./${RESOURCES_DIR}/bbb-deskshare-applet-0.64.jar" todir="${OUTPUT_DIR}"/> + <echo message="Copying assets for Phone Module" /> + <copy todir="${OUTPUT_DIR}/org/bigbluebutton/modules/phone/views/assets/images/" > + <fileset dir="${BASE_DIR}/src/org/bigbluebutton/modules/phone/views/assets/images/" /> + </copy> + </target> + + <target name="build-video" description="Compile Video Module"> + <build-module src="${SRC_DIR}" target="${VIDEO}" /> + </target> + + <target name="build-highlighter" description="Compile Highlighter Module"> + <build-module src="${SRC_DIR}" target="${HIGHLIGHTER}" /> + </target> + + <target name="build-dyn" description="Compile Dynamic Info Module"> + <build-module src="${SRC_DIR}" target="${DYN_INFO}" /> + </target> + + <!-- just a grouping of modules to compile --> + <target name="build-main-chat-viewers-listeners-present" + depends="build-bbb-main, build-chat, build-viewers, build-listeners, build-present" + description="Compile main, chat, viewers, listeners, present modules"> + </target> + + <!-- just a grouping of modules to compile --> + <target name="build-deskshare-phone-video-highlighter-dyn" + depends="build-deskshare-standalone, build-phone, build-video, build-highlighter, build-dyn" + description="Compile deskshare, phone, video, highlighter, dynamic info modules"> + </target> + + <macrodef name="build-module"> + <attribute name="target" description="Module to compile" /> + <attribute name="flex" default="${FLEX_HOME}" description="Location of the Flex install." /> + <attribute name="app" default="."/> + <attribute name="src" default="${SRC_DIR}" description="Path to the module to compile" /> + <sequential> + <mxmlc file="@{src}/@{target}.mxml" output="${OUTPUT_DIR}/@{target}.swf" debug="false"> + <load-config filename="@{flex}/frameworks/flex-config.xml" /> + <source-path path-element="@{flex}/frameworks" /> + <compiler.library-path dir="@{flex}/frameworks" append="true"> + <include name="libs" /> + <include name="../bundles/{locale}" /> + </compiler.library-path> + + <compiler.library-path dir="@{app}" append="true"> + <include name="libs" /> + <include name="libs/generated" /> + </compiler.library-path> + + <default-size width="500" height="600" /> + </mxmlc> + </sequential> + </macrodef> - <!--move todir="${OUTPUT_DIR}" > - <fileset dir="${OUTPUT_DIR}/src" /> - </move--> + <target name="compile-bbb" + depends="build-main-chat-viewers-listeners-present, build-deskshare-phone-video-highlighter-dyn, copy-resource-files" + description="Compiling the BBB without copying config.xml"> </target> + <target name="copy-resource-files"> + <copy todir="${OUTPUT_DIR}/conf" > + <fileset dir="${BASE_DIR}/src/conf" /> + </copy> + + <copy todir="${OUTPUT_DIR}/swfobject/" > + <fileset dir="${BASE_DIR}/src/swfobject/" /> + </copy> + <copy file="${RESOURCES_DIR}/BigBlueButton.html" todir="${OUTPUT_DIR}" overwrite="true"/> + <copy file="${RESOURCES_DIR}/DeskshareStandalone.html" todir="${OUTPUT_DIR}" overwrite="true"/> + <copy file="${RESOURCES_DIR}/bbb.gif" todir="${OUTPUT_DIR}" overwrite="true"/> + + </target> + <target name="check-config-xml"> <available file="/var/www/bigbluebutton/client/conf/config.xml" property="config-xml.present"/> </target> @@ -64,7 +220,7 @@ <copy file="/var/www/bigbluebutton/client/conf/config.xml" todir="${OUTPUT_DIR}/conf" /> </target> - <target name="generate-wrapper" depends="compile-bbb"> + <target name="generate-html-wrapper"> <html-wrapper title="BigBlueButton" file="BigBlueButton.html" @@ -73,103 +229,23 @@ bgcolor="grey" application="BBB" swf="BigBlueButton" - version-major="9" + version-major="10" version-minor="0" version-revision="0" history="true" template="express-installation" output="${OUTPUT_DIR}" /> - <copy file="./${RESOURCES_DIR}/BigBlueButton.html" todir="${OUTPUT_DIR}" overwrite="true"/> - <copy file="./${RESOURCES_DIR}/DeskshareStandalone.html" todir="${OUTPUT_DIR}" overwrite="true"/> - <copy file="./${RESOURCES_DIR}/bbb.gif" todir="${OUTPUT_DIR}" overwrite="true"/> </target> <target name="clean"> <delete dir="${OUTPUT_DIR}" /> + <mkdir dir="${OUTPUT_DIR}"/> </target> - <target name="cleanandbuild" depends="clean, generate-wrapper"></target> + <target name="clean-build-bbb" depends="clean, generate-html-wrapper, compile-bbb" description="Build BBB client skipping compiling of locales"/> - <target name="cleanandmake" depends="clean, localization, generate-wrapper"></target> - - <macrodef name="mxmlc-compile"> - <attribute name="target" description="Path to the file being compiled." /> - <attribute name="flex" default="${env.FLEX_HOME}" description="Location of the Flex install." /> - <attribute name="app" default="."/> - <attribute name="src" default="./src" description="" /> - <sequential> - <mxmlc - file="@{src}/@{target}.mxml" - output="${OUTPUT_DIR}/@{target}.swf" - debug="false" - > - <load-config filename="@{flex}/frameworks/flex-config.xml" /> - <source-path path-element="@{flex}/frameworks" /> - <compiler.library-path dir="@{flex}/frameworks" append="true"> - <include name="libs" /> - <include name="../bundles/{locale}" /> - </compiler.library-path> - - <compiler.library-path dir="@{app}" append="true"> - <include name="libs" /> - <include name="libs/generated" /> - </compiler.library-path> - - <default-size width="500" height="600" /> - </mxmlc> - </sequential> - </macrodef> - - <target name="setuplocale" depends="" description="Checking to see if need to copylocale"> - <exec dir="." vmlauncher="true" executable="/bin/bash"> - <arg value="setuplocale.sh"/> - </exec> - </target> - - <target name="localization" depends="setuplocale" description="Builds BigBlueButton localization files"> - <echo>Building Localization .swf's</echo> - <compileLocale locale="az_AZ" /> - <compileLocale locale="de_DE" /> - <compileLocale locale="el_GR" /> - <compileLocale locale="en_US" /> - <compileLocale locale="es_ES" /> - <compileLocale locale="es_LA" /> - <compileLocale locale="fr_FR" /> - <compileLocale locale="hu_HU" /> - <compileLocale locale="it_IT" /> - <compileLocale locale="lt_LT" /> - <compileLocale locale="nb_NO" /> - <compileLocale locale="nl_NL" /> - <compileLocale locale="pl_PL" /> - <compileLocale locale="pt_BR" /> - <compileLocale locale="pt_PT" /> - <compileLocale locale="ro_RO" /> - <compileLocale locale="ru_RU" /> - <compileLocale locale="tr_TR" /> - <compileLocale locale="vi_VN" /> - <compileLocale locale="zh_CN" /> - <compileLocale locale="zh_TW" /> - </target> - - <!-- Compiles Localization Resource Bundle. --> - <macrodef name="compileLocale" description="Compiles the Resource package for the given locale"> - <attribute name="locale" default="en_US"/> - <sequential> - <!-- - Create the Flex Home directory for the language in question. - This is necessary to compensate for a bug in pre-3.2 releases of - mxmlc. - - <mkdir dir="${FLEX_HOME}/frameworks/locale/@{locale}"/>--> - - <!-- Invoke MXMLC --> - <mxmlc output="${OUTPUT_DIR}/locale/@{locale}_resources.swf"> - <locale>@{locale}</locale> - <source-path path-element="locale/{locale}"/> - <include-resource-bundles>bbbResources</include-resource-bundles> - <source-path path-element="${FLEX_HOME}/frameworks"/> - </mxmlc> - </sequential> - </macrodef> + <target name="clean-build-all" depends="clean, generate-html-wrapper, localization, compile-bbb" description="Build BBB client including locales"/> + + <target name="cleanandmake" depends="clean-build-all" description="Build BBB client including locales"/> </project> diff --git a/bigbluebutton-client/build/lib/ant-contrib-0.6.jar b/bigbluebutton-client/build/lib/ant-contrib-0.6.jar new file mode 100644 index 0000000000000000000000000000000000000000..db90b0aae85e0aba2dc79a75bec216ce678b450c Binary files /dev/null and b/bigbluebutton-client/build/lib/ant-contrib-0.6.jar differ diff --git a/bigbluebutton-client/copyright.txt b/bigbluebutton-client/copyright.txt deleted file mode 100644 index c1f56c138c2780e4d9563e8e340c4d70287ad4e1..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/copyright.txt +++ /dev/null @@ -1,17 +0,0 @@ - -Copyright 2006-2010 by respective authors (see below). All rights reserved. - -This library is free software; you can redistribute it and/or modify it under the -terms of the GNU Lesser General Public License as published by the Free Software -Foundation; either version 2.1 of the License, or (at your option) any later -version. - -This library is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this library; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -The Blindside Project diff --git a/bigbluebutton-client/resources/BigBlueButton.html b/bigbluebutton-client/resources/BigBlueButton.html old mode 100644 new mode 100755 index 4800d875ea3d7359d364a19acf27d69ac5c09f0c..01a1278973ef48db7e64cf25385fc77dda2b284d --- a/bigbluebutton-client/resources/BigBlueButton.html +++ b/bigbluebutton-client/resources/BigBlueButton.html @@ -66,7 +66,7 @@ if ( hasProductInstall && !hasRequestedVersion ) { // see. http://stackoverflow.com/questions/313966/mousewheel-not-working-when-published-movie-has-wmodetransparent // ralam (mar 31, 2010) AC_FL_RunContent( - "src", "BigBlueButton", + "src", "BigBlueButton-VERSION", "width", "100%", "height", "100%", "align", "middle", @@ -182,12 +182,12 @@ function getLanguage(){ <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="BigBlueButton" width="100%" height="100%" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"> - <param name="movie" value="BigBlueButton.swf" /> + <param name="movie" value="BigBlueButton-VERSION.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#869ca7" /> <param name="allowScriptAccess" value="sameDomain" /> <param name="allowFullScreen" value="true" /> - <embed src="BigBlueButton.swf" quality="high" bgcolor="#869ca7" + <embed src="BigBlueButton-VERSION.swf" quality="high" bgcolor="#869ca7" width="100%" height="100%" name="BigBlueButton" align="middle" play="true" loop="false" diff --git a/bigbluebutton-client/resources/DeskshareStandalone.html b/bigbluebutton-client/resources/DeskshareStandalone.html old mode 100644 new mode 100755 index b6c4684d1ecc78a3a8c29a6fcedf732f04af16f4..588fca8573ba63ea51eb8f19af61b9212c2eafe3 --- a/bigbluebutton-client/resources/DeskshareStandalone.html +++ b/bigbluebutton-client/resources/DeskshareStandalone.html @@ -66,7 +66,7 @@ if ( hasProductInstall && !hasRequestedVersion ) { // see. http://stackoverflow.com/questions/313966/mousewheel-not-working-when-published-movie-has-wmodetransparent // ralam (mar 31, 2010) AC_FL_RunContent( - "src", "DeskshareStandalone", + "src", "DeskshareStandalone-VERSION", "width", "100%", "height", "100%", "align", "middle", @@ -182,12 +182,12 @@ function getLanguage(){ <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="DeskshareStandalone" width="100%" height="100%" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"> - <param name="movie" value="DeskshareStandalone.swf" /> + <param name="movie" value="DeskshareStandalone-VERSION.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#869ca7" /> <param name="allowScriptAccess" value="sameDomain" /> <param name="allowFullScreen" value="true" /> - <embed src="DeskshareStandalone.swf" quality="high" bgcolor="#869ca7" + <embed src="DeskshareStandalone-VERSION.swf" quality="high" bgcolor="#869ca7" width="100%" height="100%" name="DeskshareStandalone" align="middle" play="true" loop="false" diff --git a/bigbluebutton-client/src/DeskshareStandalone.mxml b/bigbluebutton-client/src/DeskshareStandalone.mxml index 73c7178239e7718a56558e7f577c6956e71636a6..494e3a11d1864f85bb10328d7154882d952f96aa 100755 --- a/bigbluebutton-client/src/DeskshareStandalone.mxml +++ b/bigbluebutton-client/src/DeskshareStandalone.mxml @@ -12,7 +12,6 @@ <mate:Listener type="{CursorEvent.UPDATE_CURSOR_LOC_EVENT}" method="onUpdateCursorEvent" /> <mx:Script> <![CDATA[ - import mx.effects.Move; import mx.controls.Image; import org.bigbluebutton.modules.deskShare.events.CursorEvent; @@ -32,14 +31,6 @@ private var images:Images = new Images(); [Bindable] public var bbbLogo:Class = images.bbb_logo; -// [Embed("org/bigbluebutton/modules/deskShare/assets/images/Cursor.png")] -// private const CursorImage:Class; - -// [Bindable] -// private var cursorImg:DisplayObject = new CursorImage(); - -// private var cursorMove:Move; - private var video:Video; private var ns:NetStream; private var stream:String; @@ -65,9 +56,6 @@ displayWidth = this.parent.width; displayHeight = this.parent.height; -// cursorImg.x = 0; -// cursorImg.y = 0; -// cursorMove = new Move(cursorImg); } private function onAppletStart(event:AppletStartedEvent):void{ @@ -131,13 +119,11 @@ // cursor.visible = true; cursorImg.visible = true; - cursorMove.end(); - cursorMove.xTo = ((event.x/video.videoWidth)) * videoHolder.width; - cursorMove.yTo = ((event.y/video.videoHeight)) * videoHolder.height; - cursorMove.play(); - - cursorImg.x = ((event.x/video.videoWidth)) * videoHolder.width; - cursorImg.y = ((event.x/video.videoWidth)) * videoHolder.width; + + // DO NOT compute the x and y coordinate and assign directly to the cursorImg + // as it results in a flickering and jerky mouse pointer (ralam jun 10, 2010). + cursorImg.x = cursor.x; + cursorImg.y = cursor.y; } @@ -186,7 +172,6 @@ } ]]> </mx:Script> - <mx:Move id="cursorMove" target="{cursorImg}"/> <mx:Image id="cursorImg" visible="false" source="@Embed('org/bigbluebutton/modules/deskShare/assets/images/cursor4.png')"/> <mx:Canvas id="vbox" width="100%" height="100%"/> </mx:Application> diff --git a/bigbluebutton-client/src/conf/.gitignore b/bigbluebutton-client/src/conf/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..7e90cf108542922e8926c2dc54486e23d0ec7032 --- /dev/null +++ b/bigbluebutton-client/src/conf/.gitignore @@ -0,0 +1 @@ +config.xml diff --git a/bigbluebutton-client/src/conf/config.xml b/bigbluebutton-client/src/conf/config.xml.dev old mode 100755 new mode 100644 similarity index 70% rename from bigbluebutton-client/src/conf/config.xml rename to bigbluebutton-client/src/conf/config.xml.dev index 1601107c2d3c062910188e8c1e417e230561e75c..246a5cd9f7f231f67f4e5cb64d2384b6634c383c --- a/bigbluebutton-client/src/conf/config.xml +++ b/bigbluebutton-client/src/conf/config.xml.dev @@ -1,12 +1,12 @@ <?xml version="1.0" ?> <config> <version>dev build</version> - <help url="http://192.168.0.172/help.html"/> - <porttest host="192.168.0.172" application="video"/> + <help url="http://192.168.0.120/help.html"/> + <porttest host="192.168.0.120" application="video"/> <modules> <module name="ChatModule" url="ChatModule.swf" - uri="rtmp://192.168.0.172/bigbluebutton" + uri="rtmp://192.168.0.120/bigbluebutton" loadNextModule="ListenersModule" onUserJoinedEvent="START" onUserLogoutEvent="STOP" @@ -14,55 +14,55 @@ <!--host="http://192.168.0.172/bigbluebutton/conference-session/enter"--> <!--host="conf/join-mock.xml"--> <module name="ViewersModule" url="ViewersModule.swf" - uri="rtmp://192.168.0.172/bigbluebutton" + uri="rtmp://192.168.0.120/bigbluebutton" host="conf/join-mock.xml" onAppInitEvent="LOAD" loadNextModule="ChatModule" onAppStartEvent="START" onUserLogoutEvent="STOP" /> <module name="ListenersModule" url="ListenersModule.swf" - uri="rtmp://192.168.0.172/bigbluebutton" - recordingHost="http://192.168.0.172" + uri="rtmp://192.168.0.120/bigbluebutton" + recordingHost="http://192.168.0.120" loadNextModule="DeskShareModule" onUserJoinedEvent="START" onUserLogoutEvent="STOP" /> - <module name="DeskShareModule" url="DeskShareModule.swf" uri="rtmp://192.168.0.172/deskShare" onUserJoinedEvent="START" onUserLogoutEvent="STOP" loadNextModule="PhoneModule" /> + <module name="DeskShareModule" url="DeskShareModule.swf" uri="rtmp://192.168.0.120/deskShare" onUserJoinedEvent="START" onUserLogoutEvent="STOP" loadNextModule="PhoneModule" /> <module name="PhoneModule" url="PhoneModule.swf" - uri="rtmp://192.168.0.172/sip" + uri="rtmp://192.168.0.120/sip" onUserJoinedEvent="START" onUserLogoutEvent="STOP" loadNextModule="VideoconfModule" /> <module name="VideoconfModule" url="VideoconfModule.swf" - uri="rtmp://192.168.0.172/video" + uri="rtmp://192.168.0.120/video" onUserJoinedEvent="START" onUserLogoutEvent="STOP" - loadNextModule="PresentModule" + loadNextModule="HighlighterModule" /> <module name="HighlighterModule" url="HighlighterModule.swf" - uri="rtmp://192.168.0.172/bigbluebutton" + uri="rtmp://192.168.0.120/bigbluebutton" onUserJoinedEvent="START" onUserLogoutEvent="STOP" + loadNextModule="PresentModule" /> <module name="PresentModule" url="PresentModule.swf" - uri="rtmp://192.168.0.172/bigbluebutton" - host="http://192.168.0.172" + uri="rtmp://192.168.0.120/bigbluebutton" + host="http://192.168.0.120" onUserJoinedEvent="START" onUserLogoutEvent="STOP" - loadNextModule="HighlighterModule" /> <!-- new module in development: <module name="DynamicInfoModule" url="DynamicInfoModule.swf" - uri="rtmp://192.168.0.172/bigbluebutton" - host="http://192.168.0.172" - infoURL="http://192.168.0.172/client/conf/example-info-data.xml?user={userID}&role={role}&meetingID={meetingID}" + uri="rtmp://192.168.0.120/bigbluebutton" + host="http://192.168.0.120" + infoURL="http://192.168.0.120/client/conf/example-info-data.xml?user={userID}&role={role}&meetingID={meetingID}" onUserJoinedEvent="START" onUserLogoutEvent="STOP" /> diff --git a/bigbluebutton-client/src/conf/config.xml.template b/bigbluebutton-client/src/conf/config.xml.template new file mode 100755 index 0000000000000000000000000000000000000000..54a9adafdee3b7240d49cc911ea06e175bdee673 --- /dev/null +++ b/bigbluebutton-client/src/conf/config.xml.template @@ -0,0 +1,71 @@ +<?xml version="1.0" ?> +<config> + <version>VERSION</version> + <help url="http://HOST/help.html"/> + <porttest host="HOST" application="video"/> + <modules> + + <module name="ChatModule" url="ChatModule-VERSION.swf" + uri="rtmp://HOST/bigbluebutton" + loadNextModule="ListenersModule" + onUserJoinedEvent="START" + onUserLogoutEvent="STOP" + /> + + <module name="ViewersModule" url="ViewersModule-VERSION.swf" + uri="rtmp://HOST/bigbluebutton" + host="http://HOST/bigbluebutton/conference-session/enter" + onAppInitEvent="LOAD" loadNextModule="ChatModule" + onAppStartEvent="START" + onUserLogoutEvent="STOP" + /> + <module name="ListenersModule" url="ListenersModule-VERSION.swf" + uri="rtmp://HOST/bigbluebutton" + recordingHost="http://HOST" + loadNextModule="DeskShareModule" + onUserJoinedEvent="START" + onUserLogoutEvent="STOP" + /> + + <module name="DeskShareModule" url="DeskShareModule-VERSION.swf" uri="rtmp://HOST/deskShare" onUserJoinedEvent="START" onUserLogoutEvent="STOP" loadNextModule="PhoneModule" /> + + <module name="PhoneModule" url="PhoneModule-VERSION.swf" + uri="rtmp://HOST/sip" + onUserJoinedEvent="START" + onUserLogoutEvent="STOP" + loadNextModule="VideoconfModule" + /> + + <module name="VideoconfModule" url="VideoconfModule-VERSION.swf" + uri="rtmp://HOST/video" + onUserJoinedEvent="START" + onUserLogoutEvent="STOP" + loadNextModule="HighlighterModule" + /> + + <module name="HighlighterModule" url="HighlighterModule-VERSION.swf" + uri="rtmp://HOST/bigbluebutton" + onUserJoinedEvent="START" + onUserLogoutEvent="STOP" + loadNextModule="PresentModule" + /> + + <module name="PresentModule" url="PresentModule-VERSION.swf" + uri="rtmp://HOST/bigbluebutton" + host="http://HOST" + onUserJoinedEvent="START" + onUserLogoutEvent="STOP" + /> + + <!-- new module in development: + <module name="DynamicInfoModule" url="DynamicInfoModule-VERSION.swf" + uri="rtmp://HOST/bigbluebutton" + host="http://HOST" + infoURL="http://HOST/client/conf/example-info-data.xml?user={userID}&role={role}&meetingID={meetingID}" + onUserJoinedEvent="START" + onUserLogoutEvent="STOP" + /> + --> + + </modules> +</config> diff --git a/bigbluebutton-client/src/conf/locales.xml b/bigbluebutton-client/src/conf/locales.xml new file mode 100644 index 0000000000000000000000000000000000000000..2143a3b1391c9f7a3cf6bd42f8920038993e58fd --- /dev/null +++ b/bigbluebutton-client/src/conf/locales.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" ?> +<locales> + <locale code="az_AZ" name="Azerbaijani"/> + <locale code="de_DE" name="German"/> + <locale code="el_GR" name="Greek"/> + <locale code="en_US" name="English"/> + <locale code="es_ES" name="Spanish"/> + <locale code="es_LA" name="Spanish (Latin American)"/> + <locale code="fr_FR" name="French"/> + <locale code="hu_HU" name="Hungarian"/> + <locale code="it_IT" name="Italian"/> + <locale code="lt_LT" name="Lithuania"/> + <locale code="nb_NO" name="Norwegian"/> + <locale code="nl_NL" name="Netherland"/> + <locale code="pl_PL" name="Polish"/> + <locale code="pt_BR" name="Portuguese (Brazilian)"/> + <locale code="pt_PT" name="Portuguese"/> + <locale code="ro_RO" name="Romanian"/> + <locale code="ru_RU" name="Russian"/> + <locale code="tr_TR" name="Turkish"/> + <locale code="vi_VN" name="Vietnamese"/> + <locale code="zh_CN" name="Chinese (Simplified)"/> + <locale code="zh_TW" name="Chinese (Traditional)"/> +</locales> \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/managers/BigBlueButtonPreloader.as b/bigbluebutton-client/src/org/bigbluebutton/main/managers/BigBlueButtonPreloader.as old mode 100644 new mode 100755 index 5791323cdf28cdf7ca6a048166e396cdf82ce7fe..b814baa1264f7bd31867664b427f634ef4502824 --- a/bigbluebutton-client/src/org/bigbluebutton/main/managers/BigBlueButtonPreloader.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/managers/BigBlueButtonPreloader.as @@ -20,11 +20,11 @@ package org.bigbluebutton.main.managers override public function set preloader(value:Sprite):void{ super.preloader = value; value.addEventListener(RSLEvent.RSL_ERROR, sharedLibraryLoadingFailed); - ResourceUtil.getInstance(); +// ResourceUtil.getInstance(); } private function sharedLibraryLoadingFailed(e:RSLEvent):void{ - ResourceUtil.getInstance().changeLocale([ResourceUtil.DEFAULT_LANGUAGE]); +// ResourceUtil.getInstance().changeLocale([ResourceUtil.DEFAULT_LANGUAGE]); } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/ModuleDescriptor.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/ModuleDescriptor.as old mode 100644 new mode 100755 index ab8f11b34a279960ae5ce06c1498377036671235..b58ba75660d6ccccc27e9aef2fd58f03bf397b6b --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/ModuleDescriptor.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/ModuleDescriptor.as @@ -92,6 +92,7 @@ package org.bigbluebutton.main.model // loader.addEventListener("error", resultHandler); // loader.addEventListener("unload", resultHandler); _loader.url = _attributes.url; + LogUtil.debug("Loading " + _attributes.url); _loader.loadModule(); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopPublishWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopPublishWindow.mxml index 9ed5d303f3fc2e618cd7d9dfa0349439c36384a3..ec69046a195fa201dfe365c15bf8a4ecff96a9f8 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopPublishWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopPublishWindow.mxml @@ -149,10 +149,10 @@ // cursor.visible = true; cursorImg.visible = true; - cursorMove.end(); - cursorMove.xTo=cursor.x; - cursorMove.yTo=cursor.y; - cursorMove.play(); + // DO NOT compute the x and y coordinate and assign directly to the cursorImg + // as it results in a flickering and jerky mouse pointer (ralam jun 10, 2010). + cursorImg.x = cursor.x; + cursorImg.y = cursor.y; } private function onAppletStart(event:AppletStartedEvent):void{ @@ -237,6 +237,5 @@ ]]> </mx:Script> - <mx:Move id="cursorMove" target="{cursorImg}"/> <mx:Image id="cursorImg" visible="false" source="@Embed('../../assets/images/cursor4.png')"/> </MDIWindow> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopViewWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopViewWindow.mxml index ed7e5a68a1b9a9b049a40e99d12fb89ba9c19ccf..7da49462cb505d690036cbcbe400a055b5019804 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopViewWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopViewWindow.mxml @@ -145,10 +145,10 @@ // cursor.visible = true; cursorImg.visible = true; - cursorMove.end(); - cursorMove.xTo=cursor.x; - cursorMove.yTo=cursor.y; - cursorMove.play(); + // DO NOT compute the x and y coordinate and assign directly to the cursorImg + // as it results in a flickering and jerky mouse pointer (ralam jun 10, 2010). + cursorImg.x = cursor.x; + cursorImg.y = cursor.y; } public function startVideo(connection:NetConnection, stream:String, width:Number, height:Number):void{ diff --git a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as old mode 100644 new mode 100755 index 0a660c330581dc5c9723f902f18c115a9c1ab36e..c71c4e55dc9b913212308f79bb90c8080e06be0b --- a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as +++ b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as @@ -23,27 +23,58 @@ package org.bigbluebutton.util.i18n import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import flash.external.ExternalInterface; + import flash.net.URLLoader; + import flash.net.URLRequest; import mx.events.ResourceEvent; import mx.resources.IResourceManager; import mx.resources.ResourceManager; - public class ResourceUtil extends EventDispatcher - { + public class ResourceUtil extends EventDispatcher { private static var instance:ResourceUtil = null; + public static const LOCALES_FILE:String = "conf/locales.xml"; + private var inited:Boolean = false; private static var MSG_RESOURCE:String = 'bbbResources'; public static var DEFAULT_LANGUAGE:String = "en_US"; + private var eventDispatcher:IEventDispatcher; - private var localeChain:Array = ["az_AZ", "de_DE", "el_GR", "en_US", "es_ES", "es_LA", "fr_FR", "hu_HU", "it_IT", "lt_LT", "nb_NO", "nl_NL", "pl_PL", "pt_BR", "pt_PT", "ro_RO", "ru_RU", "tr_TR", "vi_VN", "zh_CN", "zh_TW"]; + private var localeChain:Array = new Array(); private var resourceManager:IResourceManager; - public function ResourceUtil(enforcer:SingletonEnforcer) - { + public function ResourceUtil(enforcer:SingletonEnforcer) { if (enforcer == null) { throw new Error( "You Can Only Have One ResourceUtil" ); } + initialize(); + } + + private function isInited():Boolean { + return inited; + } + + public function initialize():void { + // Add a random string on the query so that we always get an up-to-date config.xml + var date:Date = new Date(); + LogUtil.debug("Loading " + LOCALES_FILE); + var _urlLoader:URLLoader = new URLLoader(); + _urlLoader.addEventListener(Event.COMPLETE, handleComplete); + _urlLoader.load(new URLRequest(LOCALES_FILE + "?a=" + date.time)); + } + + private function handleComplete(e:Event):void{ + parse(new XML(e.target.data)); + } + + public function parse(xml:XML):void{ + var list:XMLList = xml.locale; + LogUtil.debug("--- Supported locales --- \n" + xml.toString() + "\n --- \n"); + var locale:XML; + + for each(locale in list){ + localeChain.push(locale.@code); + } resourceManager = ResourceManager.getInstance(); resourceManager.localeChain = [ExternalInterface.call("getLanguage")]; @@ -51,25 +82,27 @@ package org.bigbluebutton.util.i18n for (var i:Number = 0; i<localeChain.length; i++){ if (resourceManager.localeChain[0] == localeChain[i]) localeAvailable = true; } + if (!localeAvailable){ resourceManager.localeChain = [DEFAULT_LANGUAGE]; changeLocale([DEFAULT_LANGUAGE]); - } else changeLocale(resourceManager.localeChain[0]); + } else changeLocale(resourceManager.localeChain[0]); + } public static function getInstance():ResourceUtil { if (instance == null) { + LogUtil.debug("Setting up supported locales."); instance = new ResourceUtil(new SingletonEnforcer); - } + } return instance; } - public function changeLocale(... chain):void{ - + public function changeLocale(... chain):void{ if(chain != null && chain.length > 0) { var localeURI:String = 'locale/' + chain[0] + '_resources.swf'; - var eventDispatcher:IEventDispatcher = resourceManager.loadResourceModule(localeURI,true); + eventDispatcher = resourceManager.loadResourceModule(localeURI,true); localeChain = [chain[0]]; eventDispatcher.addEventListener(ResourceEvent.COMPLETE, localeChangeComplete); eventDispatcher.addEventListener(ResourceEvent.ERROR, handleResourceNotLoaded);