diff --git a/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js b/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js index 664722133a20c2b1417a71885781d5544dc497f8..705fdfa35a69f2c8ee10ce8f4c53527d5e009bd5 100755 --- a/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js +++ b/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js @@ -12,6 +12,38 @@ return swfobject.getObjectById("BigBlueButton"); } + /** + * Get info if user is sharing webcam. + */ + BBB.amISharingWebcam = function(callback) { + var swfObj = getSwfObj(); + if (swfObj) { + if (arguments.length == 0) { + swfObj.amISharingCameraRequestAsync(); + } else { + if (typeof callback === 'function') { + callback(swfObj.amISharingCameraRequestSync()); + } + } + } + } + + /** + * Get my user info. + */ + BBB.isUserSharingWebcam = function(userID, callback) { + var swfObj = getSwfObj(); + if (swfObj) { + if (arguments.length == 1) { + swfObj.isUserPublishingCamRequestAsync(userID); + } else { + if (arguments.length == 2 && typeof callback === 'function') { + callback(swfObj.isUserPublishingCamRequestSync(userID)); + } + } + } + } + BBB.switchPresenter = function(newPresenterUserID) { var swfObj = getSwfObj(); if (swfObj) { diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as b/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as index 1f58411492c524c69d76bed18fa31be8da617031..0806631337d4c8df5168fe32777d51cc1d00f047 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as @@ -41,5 +41,7 @@ package org.bigbluebutton.core public static const USER_LOCKED_VOICE:String = 'UserLockedVoiceEvent'; public static const START_PRIVATE_CHAT:String = "StartPrivateChatEvent"; public static const GET_MY_USER_INFO_REP:String = "GetMyUserInfoResponse"; + public static const IS_USER_PUBLISHING_CAM_RESP:String = "IsUserPublishingCamResponse"; + } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as b/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as index 69467363b0177e5d33645f4f34dbed7b2ab0406d..6e488fbeafb1d9ee8b7daf589e145b7ab0ab2498 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as @@ -33,7 +33,7 @@ package org.bigbluebutton.core public static function getWebcamStream(userID:String):String { var u:BBBUser = getUser(userID); - if (u != null) { + if (u != null && u.hasStream) { return u.streamName; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/events/IsUserPublishingCamRequest.as b/bigbluebutton-client/src/org/bigbluebutton/core/events/IsUserPublishingCamRequest.as new file mode 100755 index 0000000000000000000000000000000000000000..f73dfd0902b32e27e0dcebd8c58dce5c2c74ee8a --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/core/events/IsUserPublishingCamRequest.as @@ -0,0 +1,16 @@ +package org.bigbluebutton.core.events +{ + import flash.events.Event; + + public class IsUserPublishingCamRequest extends Event + { + public static const IS_USER_PUBLISHING_CAM_REQ:String = "is user publishing webcam request event"; + + public var userID:String; + + public function IsUserPublishingCamRequest(bubbles:Boolean=true, cancelable:Boolean=false) + { + super(IS_USER_PUBLISHING_CAM_REQ, bubbles, cancelable); + } + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/vo/CameraSettingsVO.as b/bigbluebutton-client/src/org/bigbluebutton/core/vo/CameraSettingsVO.as index 0afa3d1a73a038b1fe10161850c873736f6ab4fc..9365640bac50438dc80c83e1d365ff6dbab7dd4b 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/vo/CameraSettingsVO.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/vo/CameraSettingsVO.as @@ -2,9 +2,9 @@ package org.bigbluebutton.core.vo { public class CameraSettingsVO { - public var camIndex:int; - public var camWidth:int; - public var camHeight:int; + public var camIndex:int = 0; + public var camWidth:int = 0; + public var camHeight:int = 0; public var isPublishing:Boolean = false; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as index 8b599bf7102bfc4ff785302a00e4875f720da924..6e455965feb442eb9446a0586a2a57f7afa8e1ee 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as @@ -13,6 +13,7 @@ package org.bigbluebutton.main.api import org.bigbluebutton.core.events.AmISharingWebcamQueryEvent; import org.bigbluebutton.core.events.CoreEvent; import org.bigbluebutton.core.events.GetMyUserInfoRequestEvent; + import org.bigbluebutton.core.events.IsUserPublishingCamRequest; import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.core.vo.CameraSettingsVO; import org.bigbluebutton.main.events.BBBEvent; @@ -39,7 +40,9 @@ package org.bigbluebutton.main.api ExternalInterface.addCallback("getMyUserID", handleGetMyUserID); ExternalInterface.addCallback("getExternalMeetingID", handleGetExternalMeetingID); ExternalInterface.addCallback("joinVoiceRequest", handleJoinVoiceRequest); - ExternalInterface.addCallback("leaveVoiceRequest", handleLeaveVoiceRequest); + ExternalInterface.addCallback("leaveVoiceRequest", handleLeaveVoiceRequest); + ExternalInterface.addCallback("isUserPublishingCamRequestSync", handleIsUserPublishingCamRequestSync); + ExternalInterface.addCallback("isUserPublishingCamRequestAsync", handleIsUserPublishingCamRequestAsync); ExternalInterface.addCallback("getMyRoleRequestSync", handleGetMyRoleRequestSync); ExternalInterface.addCallback("getMyRoleRequestAsync", handleGetMyRoleRequestAsynch); ExternalInterface.addCallback("amIPresenterRequestSync", handleAmIPresenterRequestSync); @@ -59,6 +62,31 @@ package org.bigbluebutton.main.api } } + private function handleIsUserPublishingCamRequestAsync(userID:String):void { + var event:IsUserPublishingCamRequest = new IsUserPublishingCamRequest(); + event.userID = UsersUtil.externalUserIDToInternalUserID(userID); + if (event.userID != null) { + _dispatcher.dispatchEvent(event); + } else { + LogUtil.warn("Cannot find user with external userID [" + userID + "] to query is sharing webcam or not."); + } + } + + private function handleIsUserPublishingCamRequestSync(userID:String):Object { + var obj:Object = new Object(); + var isUserPublishing:Boolean = false; + + var streamName:String = UsersUtil.getWebcamStream(UsersUtil.externalUserIDToInternalUserID(userID)); + if (streamName != null) { + isUserPublishing = true; + } + + obj.isUserPublishing = isUserPublishing; + obj.streamName = streamName; + + return obj; + } + private function handleGetMyUserInfoAsynch():void { _dispatcher.dispatchEvent(new GetMyUserInfoRequestEvent()); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as index 0e08ff857f0b9bf8a051579953b656af96bc2e77..134f7a28b2f8a6bdc8ae7eb97d9396199e19986c 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as @@ -10,6 +10,7 @@ package org.bigbluebutton.main.api import org.bigbluebutton.core.events.AmISharingWebcamQueryEvent; import org.bigbluebutton.core.events.CoreEvent; import org.bigbluebutton.core.events.GetMyUserInfoRequestEvent; + import org.bigbluebutton.core.events.IsUserPublishingCamRequest; import org.bigbluebutton.core.events.SwitchedLayoutEvent; import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.core.vo.CameraSettingsVO; @@ -26,6 +27,26 @@ package org.bigbluebutton.main.api public class ExternalApiCalls { + public function handleIsUserPublishingCamRequest(event:IsUserPublishingCamRequest):void { + var payload:Object = new Object(); + var isUserPublishing:Boolean = false; + + var streamName:String = UsersUtil.getWebcamStream(event.userID); + if (streamName != null) { + isUserPublishing = true; + } + + payload.eventName = EventConstants.IS_USER_PUBLISHING_CAM_RESP; + payload.userID = UsersUtil.internalUserIDToExternalUserID(event.userID); + payload.isUserPublishing = isUserPublishing; + + var vidConf:VideoConfOptions = new VideoConfOptions(); + payload.uri = vidConf.uri + "/" + UsersUtil.getInternalMeetingID(); + + payload.streamName = streamName; + broadcastEvent(payload); + } + public function handleGetMyUserInfoRequest(event:GetMyUserInfoRequestEvent):void { var payload:Object = new Object(); payload.eventName = EventConstants.GET_MY_USER_INFO_REP; @@ -85,6 +106,7 @@ package org.bigbluebutton.main.api public function handleAmISharingCamQueryEvent(event:AmISharingWebcamQueryEvent):void { var camSettings:CameraSettingsVO = UsersUtil.amIPublishing(); + var vidConf:VideoConfOptions = new VideoConfOptions(); var payload:Object = new Object(); payload.eventName = EventConstants.AM_I_SHARING_CAM_RESP; @@ -92,6 +114,10 @@ package org.bigbluebutton.main.api payload.camIndex = camSettings.camIndex; payload.camWidth = camSettings.camWidth; payload.camHeight = camSettings.camHeight; + payload.camKeyFrameInterval = vidConf.camKeyFrameInterval; + payload.camModeFps = vidConf.camModeFps; + payload.camQualityBandwidth = vidConf.camQualityBandwidth; + payload.camQualityPicture = vidConf.camQualityPicture; broadcastEvent(payload); } @@ -110,12 +136,12 @@ package org.bigbluebutton.main.api payload.eventName = EventConstants.SWITCHED_PRESENTER; payload.amIPresenter = event.amIPresenter; payload.role = event.amIPresenter ? Role.PRESENTER : Role.VIEWER; - payload.newPresenterUserID = event.newPresenterUserID; + payload.newPresenterUserID = UsersUtil.internalUserIDToExternalUserID(event.newPresenterUserID); broadcastEvent(payload); payload.eventName = EventConstants.NEW_ROLE; payload.amIPresenter = event.amIPresenter; - payload.newPresenterUserID = event.newPresenterUserID; + payload.newPresenterUserID = UsersUtil.internalUserIDToExternalUserID(event.newPresenterUserID); payload.role = event.amIPresenter ? Role.PRESENTER : Role.VIEWER; broadcastEvent(payload); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml index a311230e4f39aa0c41f6a2c049260ab1b86e9c60..45f6a10e09f15719ae5af4735b8b00a0a8bcc164 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml @@ -27,6 +27,7 @@ import org.bigbluebutton.core.events.AmIPresenterQueryEvent; import org.bigbluebutton.core.events.AmISharingWebcamQueryEvent; import org.bigbluebutton.core.events.GetMyUserInfoRequestEvent; + import org.bigbluebutton.core.events.IsUserPublishingCamRequest; import org.bigbluebutton.core.events.SwitchedLayoutEvent; import org.bigbluebutton.main.api.ExternalApiCalls; import org.bigbluebutton.main.events.BBBEvent; @@ -43,6 +44,10 @@ --> + <EventHandlers type="{IsUserPublishingCamRequest.IS_USER_PUBLISHING_CAM_REQ}" > + <MethodInvoker generator="{ExternalApiCalls}" method="handleIsUserPublishingCamRequest" arguments="{event}"/> + </EventHandlers> + <EventHandlers type="{StreamStartedEvent.STREAM_STARTED}" > <MethodInvoker generator="{ExternalApiCalls}" method="handleStreamStartedEvent" arguments="{event}"/> </EventHandlers> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as index 67ea880461d859f0a5049b3224c910e193b8e02b..80686b50d06ed5da61de9b2d4787033170a5de7f 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as @@ -30,7 +30,7 @@ package org.bigbluebutton.main.model.users { public var internalMeetingID:String; public var avatarURL:String; - private var _myCamSettings:CameraSettingsVO; + private var _myCamSettings:CameraSettingsVO = new CameraSettingsVO(); [Bindable] private var me:BBBUser = null; [Bindable] public var users:ArrayCollection = null;