diff --git a/bigbluebutton-apps/src/main/scala/org/bigbluebutton/core/CollectorActor.scala b/bigbluebutton-apps/src/main/scala/org/bigbluebutton/core/CollectorActor.scala index 92bb4595ef2a04190d5044d1dd0e9b7031e32acb..ee7637444d66549b713619e6aed9889a8769b6c8 100755 --- a/bigbluebutton-apps/src/main/scala/org/bigbluebutton/core/CollectorActor.scala +++ b/bigbluebutton-apps/src/main/scala/org/bigbluebutton/core/CollectorActor.scala @@ -4,6 +4,13 @@ import scala.actors.Actor import scala.actors.Actor._ import org.bigbluebutton.core.api._ import com.google.gson.Gson +import scala.collection.mutable.HashMap +import collection.JavaConverters._ +import scala.collection.JavaConversions._ +import java.util.ArrayList +import org.bigbluebutton.core.apps.poll.PollVO +import org.bigbluebutton.core.apps.presentation.Page +import org.bigbluebutton.core.apps.presentation.Presentation class CollectorActor(dispatcher: IDispatcher) extends Actor { @@ -174,7 +181,35 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { } } } - + + private def buildUserHashMap(user: UserVO):java.util.HashMap[String, Object] = { + val vu = user.voiceUser + val vuser = new java.util.HashMap[String, Object]() + vuser.put(Constants.USER_ID, vu.userId) + vuser.put(Constants.WEB_USER_ID, vu.webUserId) + vuser.put(Constants.CALLER_ID_NAME, vu.callerName) + vuser.put(Constants.CALLER_ID_NUM, vu.callerNum) + vuser.put(Constants.JOINED, vu.joined:java.lang.Boolean) + vuser.put(Constants.LOCKED, vu.locked:java.lang.Boolean) + vuser.put(Constants.MUTED, vu.muted:java.lang.Boolean) + vuser.put(Constants.TALKING, vu.talking:java.lang.Boolean) + + val wuser = new java.util.HashMap[String, Object]() + wuser.put(Constants.USER_ID, user.userID) + wuser.put(Constants.EXT_USER_ID, user.externUserID) + wuser.put(Constants.NAME, user.name) + wuser.put(Constants.ROLE, user.role.toString()) + wuser.put(Constants.RAISE_HAND, user.raiseHand:java.lang.Boolean) + wuser.put(Constants.PRESENTER, user.presenter:java.lang.Boolean) + wuser.put(Constants.HAS_STREAM, user.hasStream:java.lang.Boolean) + wuser.put(Constants.LOCKED, user.locked:java.lang.Boolean) + wuser.put(Constants.WEBCAM_STREAM, user.webcamStream) + wuser.put(Constants.PHONE_USER, user.phoneUser:java.lang.Boolean) + wuser.put(Constants.VOICE_USER, vuser) + + wuser + } + private def buildJson(header: java.util.HashMap[String, Any], payload: java.util.HashMap[String, Any]): String = { @@ -1522,7 +1557,7 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { private def handleUserLeft(msg: UserLeft) { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.USER, msg.user.toString()) + payload.put(Constants.USER, buildUserHashMap(msg.user)) payload.put(Constants.RECORDED, msg.recorded) val header = new java.util.HashMap[String, Any]() @@ -1536,7 +1571,9 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { private def handlePresenterAssigned(msg: PresenterAssigned) { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.PRESENTER, msg.presenter) + payload.put(Constants.NEW_PRESENTER_ID, msg.presenter.presenterID); + payload.put(Constants.NEW_PRESENTER_NAME, msg.presenter.presenterName); + payload.put(Constants.ASSIGNED_BY, msg.presenter.assignedBy); payload.put(Constants.RECORDED, msg.recorded) val header = new java.util.HashMap[String, Any]() @@ -1564,28 +1601,13 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val usersMap = new java.util.HashMap[String, Any]() - - for(index <- 0 until msg.users.size) { - val item = msg.users(index) - val tempMap = new java.util.HashMap[String, Any]() - tempMap.put(Constants.USER_ID, item.userID) - tempMap.put(Constants.EXT_USER_ID, item.externUserID) - tempMap.put(Constants.NAME, item.name) - tempMap.put(Constants.ROLE, item.role.toString()) - tempMap.put(Constants.RAISE_HAND , item.raiseHand) - tempMap.put(Constants.PRESENTER, item.presenter) - tempMap.put(Constants.HAS_STREAM, item.hasStream) - tempMap.put(Constants.LOCKED, item.locked) - tempMap.put(Constants.WEBCAM_STREAM, item.webcamStream) - tempMap.put(Constants.PHONE_USER, item.phoneUser) - tempMap.put(Constants.VOICE_USER, item.voiceUser.toString()) - tempMap.put(Constants.PERMISSIONS, item.permissions.toString()) - usersMap.put(index.toString(), tempMap) - } - payload.put(Constants.USERS, usersMap) + val users = new ArrayList[java.util.HashMap[String, Object]]; + msg.users.foreach(uvo => { + users.add(buildUserHashMap(uvo)) + }) + + payload.put(Constants.USERS, users) val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.GET_USERS_REPLY) @@ -1614,7 +1636,7 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.RECORDED, msg.recorded) - payload.put(Constants.USER, msg.user.toString()) + payload.put(Constants.USER, buildUserHashMap(msg.user)) val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.USER_JOINED) @@ -1838,16 +1860,14 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.RECORDED, msg.recorded) payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val historyMap = new java.util.HashMap[String, Any]() - for(i<- 0 until msg.history.size) { - var tempMap = new java.util.HashMap[String, String]() - - for ((key, value) <- msg.history(i)) tempMap.put(key, value) - - historyMap.put(i.toString() , tempMap) - } - payload.put(Constants.CHAT_HISTORY, historyMap) + + val collection = new ArrayList[java.util.Map[String, String]](); + + msg.history.foreach(p => { + collection.add(mapAsJavaMap(p)) + }) + + payload.put(Constants.CHAT_HISTORY, collection) val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.GET_CHAT_HISTORY_REPLY) @@ -1862,13 +1882,7 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.RECORDED, msg.recorded) payload.put(Constants.REQUESTER_ID, msg.requesterID) - - val messageMap = new java.util.HashMap[String, String]() - for ((key, value) <- msg.message) { - messageMap.put(key, value) - } - - payload.put(Constants.MESSAGE, messageMap) + payload.put(Constants.MESSAGE, mapAsJavaMap(msg.message)) val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.SEND_PUBLIC_CHAT_MESSAGE) @@ -1884,12 +1898,7 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { payload.put(Constants.RECORDED, msg.recorded) payload.put(Constants.REQUESTER_ID, msg.requesterID) - val messageMap = new java.util.HashMap[String, String]() - for ((key, value) <- msg.message) { - messageMap.put(key, value) - } - - payload.put(Constants.MESSAGE, messageMap) + payload.put(Constants.MESSAGE, mapAsJavaMap(msg.message)) val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.SEND_PRIVATE_CHAT_MESSAGE) @@ -1987,7 +1996,13 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.RECORDED, msg.recorded) payload.put(Constants.REQUESTER_ID, msg.requesterID) - payload.put(Constants.POLLS, msg.polls.toString()) //#to do not tested + + val collection = new ArrayList[PollVO](); + msg.polls.foreach(p => { + collection.add(p) + }) + + payload.put(Constants.POLLS, collection) val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.GET_POLLS_REPLY) @@ -2163,6 +2178,39 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { payload.put(Constants.PRESENTATION_INFO, msg.info) payload.put(Constants.REQUESTER_ID, msg.requesterID) + val info = msg.info + + // Create a map for our current presenter + val presenter = new java.util.HashMap[String, String]() + presenter.put(Constants.USER_ID, info.presenter.userId) + presenter.put(Constants.NAME, info.presenter.name) + presenter.put(Constants.ASSIGNED_BY, info.presenter.assignedBy) + + payload.put(Constants.PRESENTER, presenter) + + // Create an array for our presentations + val presentations = new ArrayList[java.util.HashMap[String, Object]] + info.presentations.foreach { pres => + val presentation = new java.util.HashMap[String, Object](); + presentation.put(Constants.ID, pres.id) + presentation.put(Constants.NAME, pres.name) + presentation.put(Constants.CURRENT, pres.current:java.lang.Boolean) + + // Get the pages for a presentation + val pages = new ArrayList[Page]() + pres.pages.values foreach {p => + pages.add(p) + } + // store the pages in the presentation + presentation.put(Constants.PAGES, pages) + + // add this presentation into our presentations list + presentations.add(presentation); + } + + // add the presentation to our map to complete our json + payload.put(Constants.PRESENTATIONS, presentations) + val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.GET_PRESENTATION_INFO_REPLY) header.put(Constants.TIMESTAMP, System.nanoTime()) @@ -2212,8 +2260,22 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.PRESENTATION_ID, msg.presentation) - + + val presentation = new java.util.HashMap[String, Object](); + presentation.put(Constants.ID, msg.presentation.id) + presentation.put(Constants.NAME, msg.presentation.name) + presentation.put(Constants.CURRENT, msg.presentation.current:java.lang.Boolean) + + // Get the pages for a presentation + val pages = new ArrayList[Page]() + msg.presentation.pages.values foreach {p => + pages.add(p) + } + // store the pages in the presentation + presentation.put(Constants.PAGES, pages) + + payload.put(Constants.PRESENTATION, presentation); + val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.PRESENTATION_SHARED) header.put(Constants.TIMESTAMP, System.nanoTime()) @@ -2305,8 +2367,22 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { payload.put(Constants.MEETING_ID, msg.meetingID) payload.put(Constants.MESSAGE_KEY, msg.messageKey) payload.put(Constants.CODE, msg.code) - payload.put(Constants.PRESENTATION_ID, msg.presentation) + val presentation = new java.util.HashMap[String, Object](); + presentation.put(Constants.ID, msg.presentation.id) + presentation.put(Constants.NAME, msg.presentation.name) + presentation.put(Constants.CURRENT, msg.presentation.current:java.lang.Boolean) + + val pages = new ArrayList[Page]() + + msg.presentation.pages.values foreach {p => + pages.add(p) + } + + presentation.put(Constants.PAGES, pages) + + payload.put(Constants.PRESENTATION, presentation); + val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.PRESENTATION_CONVERSION_DONE) header.put(Constants.TIMESTAMP, System.nanoTime()) @@ -2318,7 +2394,20 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { private def handlePresentationChanged(msg: PresentationChanged) { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.PRESENTATION_ID, msg.presentation) + val presentation = new java.util.HashMap[String, Object](); + presentation.put(Constants.ID, msg.presentation.id) + presentation.put(Constants.NAME, msg.presentation.name) + presentation.put(Constants.CURRENT, msg.presentation.current:java.lang.Boolean) + + val pages = new ArrayList[Page]() + + msg.presentation.pages.values foreach {p => + pages.add(p) + } + + presentation.put(Constants.PAGES, pages) + + payload.put(Constants.PRESENTATION, presentation); val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.PRESENTATION_CHANGED) @@ -2331,7 +2420,21 @@ class CollectorActor(dispatcher: IDispatcher) extends Actor { private def handleGetPresentationStatusReply(msg: GetPresentationStatusReply) { val payload = new java.util.HashMap[String, Any]() payload.put(Constants.MEETING_ID, msg.meetingID) - payload.put(Constants.PRESENTATIONS, msg.presentations.toString()) //#todo not tested + val presentation = new java.util.HashMap[String, Object](); + + presentation.put(Constants.ID, msg.current.id) + presentation.put(Constants.NAME, msg.current.name) + presentation.put(Constants.CURRENT, msg.current.current:java.lang.Boolean) + + val pages = new ArrayList[Page]() + + msg.current.pages.values foreach {p => + pages.add(p) + } + + presentation.put(Constants.PAGES, pages) + + payload.put(Constants.PRESENTATION, presentation); val header = new java.util.HashMap[String, Any]() header.put(Constants.NAME, MessageNames.GET_PRESENTATION_STATUS_REPLY) diff --git a/bigbluebutton-apps/src/main/scala/org/bigbluebutton/core/api/Constants.scala b/bigbluebutton-apps/src/main/scala/org/bigbluebutton/core/api/Constants.scala index 41691ecfe1c2f3c0f68d82ad4dd86ab7529e6f13..861b68d21e37558e13aa3785e04eb1cb6df2553c 100755 --- a/bigbluebutton-apps/src/main/scala/org/bigbluebutton/core/api/Constants.scala +++ b/bigbluebutton-apps/src/main/scala/org/bigbluebutton/core/api/Constants.scala @@ -76,4 +76,11 @@ object Constants { val SHAPES = "shapes" val SHAPE = "shape" val SHAPE_ID = "shape_id" + val PRESENTATION = "presentation" + val ID = "id" + val CURRENT = "current" + val PAGES = "pages" + val WEB_USER_ID = "web_user_id" + val JOINED = "joined" + } \ No newline at end of file diff --git a/doc/message.md b/doc/message.md new file mode 100755 index 0000000000000000000000000000000000000000..76d4174acc997613562069202bb6eb405f6bfee2 --- /dev/null +++ b/doc/message.md @@ -0,0 +1,81 @@ +''' +{ + "payload": { + "page": { + "id": "d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/1", + "num": 1, + "thumbUri": "http://192.168.153.146/bigbluebutton/presentation/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/thumbnail/1", + "swfUri": "http://192.168.153.146/bigbluebutton/presentation/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/slide/1", + "txtUri": "http://192.168.153.146/bigbluebutton/presentation/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/textfiles/slide-1.txt", + "pngUri": "http://192.168.153.146/bigbluebutton/presentation/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/thumbnail/1", + "current": true, + "xOffset": 0, + "yOffset": 0, + "widthRatio": 100, + "heightRatio": 100 + }, + "meeting_id": "183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394" + }, + "header": { + "timestamp": 1193659906855316, + "name": "presentation_page_resized_message" + } +} +''' + +''' +{ + "payload": { + "y_offset": 0, + "meeting_id": "183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394", + "height_ratio": 100, + "width_ratio": 100, + "x_offset": 0 + }, + "header": { + "timestamp": 1193659905217557, + "name": "resize_and_move_slide_request" + } +} +''' + +''' +{ + "payload": { + "whiteboard_id": "ed1c16ba8e432dfa7e73c6a82f215f1d6f933cae-1397936347045/1", + "meeting_id": "183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394", + "requester_id": "rg74zt7x78oe" + }, + "header": { + "timestamp": 1193659846315623, + "name": "get_whiteboard_shapes_request" + } +} +''' + +''' +{ + "payload": { + "page": { + "id": "d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/1", + "num": 1, + "thumbUri": "http://192.168.153.146/bigbluebutton/presentation/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/thumbnail/1", + "swfUri": "http://192.168.153.146/bigbluebutton/presentation/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/slide/1", + "txtUri": "http://192.168.153.146/bigbluebutton/presentation/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/textfiles/slide-1.txt", + "pngUri": "http://192.168.153.146/bigbluebutton/presentation/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394/d3927c03bc03fb285c8f5baee2befc3b1119b81d-1397936398791/thumbnail/1", + "current": true, + "xOffset": 0, + "yOffset": 0, + "widthRatio": 100, + "heightRatio": 100 + }, + "meeting_id": "183f0bf3a0982a127bdb8161e0c44eb696b3e75c-1397936286394" + }, + "header": { + "timestamp": 1193659773108701, + "name": "presentation_page_resized_message" + } +} +''' + +