diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionCompletedSysPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionCompletedSysPubMsgHdlr.scala index 2cdac5898bd254039ecdc95d17cc2dbb069c75d5..b7940c0665083596d5d6102d1ca857e4caa4eca3 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionCompletedSysPubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionCompletedSysPubMsgHdlr.scala @@ -4,8 +4,8 @@ import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.bus.MessageBus import org.bigbluebutton.core.domain.MeetingState2x import org.bigbluebutton.core.running.LiveMeeting -import org.bigbluebutton.common2.domain.{ PageVO } -import org.bigbluebutton.core.models.PresentationInPod +import org.bigbluebutton.common2.domain.PageVO +import org.bigbluebutton.core.models.{ PresentationInPod, PresentationPage } trait PresentationConversionCompletedSysPubMsgHdlr { @@ -18,16 +18,19 @@ trait PresentationConversionCompletedSysPubMsgHdlr { val meetingId = liveMeeting.props.meetingProp.intId - val pages = new collection.mutable.HashMap[String, PageVO] + val pages = new collection.mutable.HashMap[String, PresentationPage] msg.body.presentation.pages.foreach { p => - val page = PageVO(p.id, p.num, p.thumbUri, p.swfUri, p.txtUri, p.svgUri, p.current, p.xOffset, p.yOffset, + val urls = Map("swf" -> p.swfUri, "thumb" -> p.thumbUri, "text" -> p.txtUri, "svg" -> p.svgUri, "png" -> "") + + val page = PresentationPage(p.id, p.num, urls, p.current, p.xOffset, p.yOffset, p.widthRatio, p.heightRatio) pages += page.id -> page } val downloadable = msg.body.presentation.downloadable val presentationId = msg.body.presentation.id + val pres = new PresentationInPod(presentationId, msg.body.presentation.name, msg.body.presentation.current, pages.toMap, downloadable) val presVO = PresentationPodsApp.translatePresentationToPresentationVO(pres) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionStartedSysMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionStartedSysMsgHdlr.scala new file mode 100755 index 0000000000000000000000000000000000000000..fbe85c41e6fd9be674f0e5e7c886a77e4bfb092b --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionStartedSysMsgHdlr.scala @@ -0,0 +1,51 @@ +package org.bigbluebutton.core.apps.presentationpod + +import org.bigbluebutton.common2.domain.PresentationPageVO +import org.bigbluebutton.common2.msgs.{ BbbClientMsgHeader, BbbCommonEnvCoreMsg, BbbCoreEnvelope, MessageTypes, PresentationConversionStartedSysMsg, PresentationPageConvertedEventMsg, PresentationPageConvertedEventMsgBody, PresentationPageConvertedSysMsg, Routing } +import org.bigbluebutton.core.bus.MessageBus +import org.bigbluebutton.core.domain.MeetingState2x +import org.bigbluebutton.core.running.LiveMeeting + +trait PresentationConversionStartedSysMsgHdlr { + this: PresentationPodHdlrs => + + def handle(msg: PresentationConversionStartedSysMsg, state: MeetingState2x, + liveMeeting: LiveMeeting, bus: MessageBus): MeetingState2x = { + + def broadcastEvent(msg: PresentationPageConvertedSysMsg): Unit = { + val routing = Routing.addMsgToClientRouting( + MessageTypes.BROADCAST_TO_MEETING, + liveMeeting.props.meetingProp.intId, msg.header.userId + ) + val envelope = BbbCoreEnvelope(PresentationPageConvertedEventMsg.NAME, routing) + val header = BbbClientMsgHeader( + PresentationPageConvertedEventMsg.NAME, + liveMeeting.props.meetingProp.intId, msg.header.userId + ) + + val page = PresentationPageVO( + id = msg.body.page.id, + num = msg.body.page.num, + urls = msg.body.page.urls, + current = msg.body.page.current + ) + + val body = PresentationPageConvertedEventMsgBody( + msg.body.podId, + msg.body.messageKey, + msg.body.code, + msg.body.presentationId, + msg.body.numberOfPages, + msg.body.pagesCompleted, + msg.body.presName, + page + ) + val event = PresentationPageConvertedEventMsg(header, body) + val msgEvent = BbbCommonEnvCoreMsg(envelope, event) + bus.outGW.send(msgEvent) + } + + //broadcastEvent(msg) + state + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPageConvertedSysMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPageConvertedSysMsgHdlr.scala index f53324260ab5a24295d3e5e09b8091a8e1b3d818..0a5350b0cd5fcce400163f29d6cf37ce05d23f96 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPageConvertedSysMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPageConvertedSysMsgHdlr.scala @@ -1,5 +1,6 @@ package org.bigbluebutton.core.apps.presentationpod +import org.bigbluebutton.common2.domain.PresentationPageVO import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.bus.MessageBus import org.bigbluebutton.core.domain.MeetingState2x @@ -22,6 +23,13 @@ trait PresentationPageConvertedSysMsgHdlr { liveMeeting.props.meetingProp.intId, msg.header.userId ) + val page = PresentationPageVO( + id = msg.body.page.id, + num = msg.body.page.num, + urls = msg.body.page.urls, + current = msg.body.page.current + ) + val body = PresentationPageConvertedEventMsgBody( msg.body.podId, msg.body.messageKey, @@ -30,7 +38,7 @@ trait PresentationPageConvertedSysMsgHdlr { msg.body.numberOfPages, msg.body.pagesCompleted, msg.body.presName, - msg.body.page + page ) val event = PresentationPageConvertedEventMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodHdlrs.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodHdlrs.scala index 00c18af24d9659c983e61a773b5c9bdd5646d1b5..2ac6c8e6cd8365c970a8a6ae3414c2c2a1f714a0 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodHdlrs.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodHdlrs.scala @@ -21,7 +21,8 @@ class PresentationPodHdlrs(implicit val context: ActorContext) with ResizeAndMovePagePubMsgHdlr with SyncGetPresentationPodsMsgHdlr with RemovePresentationPodPubMsgHdlr - with PresentationPageConvertedSysMsgHdlr { + with PresentationPageConvertedSysMsgHdlr + with PresentationConversionStartedSysMsgHdlr { val log = Logging(context.system, getClass) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodsApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodsApp.scala index 2440540dbf2f9dc9699e942d51e641083dc236ef..18ef8116dd98593a3616a29ae39fc381d070534e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodsApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodsApp.scala @@ -41,10 +41,28 @@ object PresentationPodsApp { def translatePresentationPodToVO(pod: PresentationPod): PresentationPodVO = { val presentationObjects = pod.presentations - val presentationVOs = presentationObjects.values.map(p => PresentationVO(p.id, p.name, p.current, - p.pages.values.toVector, p.downloadable)).toVector + val presentationVOs = presentationObjects.values.map { p => + val pages = p.pages.values.map { page => + PageVO( + id = page.id, + num = page.num, + thumbUri = page.urls.getOrElse("thumb", ""), + swfUri = page.urls.getOrElse("swf", ""), + txtUri = page.urls.getOrElse("text", ""), + svgUri = page.urls.getOrElse("svg", ""), + current = false, + xOffset = 0, + yOffset = 0, + widthRatio = 100D, + heightRatio = 100D + ) + } + + PresentationVO(p.id, p.name, p.current, + pages.toVector, p.downloadable) + } - PresentationPodVO(pod.id, pod.currentPresenter, presentationVOs) + PresentationPodVO(pod.id, pod.currentPresenter, presentationVOs.toVector) } def findPodsWhereUserIsPresenter(mgr: PresentationPodManager, userId: String): Vector[PresentationPod] = { @@ -57,7 +75,22 @@ object PresentationPodsApp { } def translatePresentationToPresentationVO(pres: PresentationInPod): PresentationVO = { - PresentationVO(pres.id, pres.name, pres.current, pres.pages.values.toVector, pres.downloadable) + val pages = pres.pages.values.map { page => + PageVO( + id = page.id, + num = page.num, + thumbUri = page.urls.getOrElse("thumb", ""), + swfUri = page.urls.getOrElse("swf", ""), + txtUri = page.urls.getOrElse("text", ""), + svgUri = page.urls.getOrElse("svg", ""), + current = false, + xOffset = 0, + yOffset = 0, + widthRatio = 100D, + heightRatio = 100D + ) + } + PresentationVO(pres.id, pres.name, pres.current, pages.toVector, pres.downloadable) } def setCurrentPresentationInPod(state: MeetingState2x, podId: String, nextCurrentPresId: String): Option[PresentationPod] = { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/ResizeAndMovePagePubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/ResizeAndMovePagePubMsgHdlr.scala index eb77c7a1b86bdc50296acdcb155c2224feabb6b8..138e513e003927691e244cecabb7289a600df841 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/ResizeAndMovePagePubMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/ResizeAndMovePagePubMsgHdlr.scala @@ -1,11 +1,11 @@ package org.bigbluebutton.core.apps.presentationpod -import org.bigbluebutton.common2.domain.PageVO import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.core.bus.MessageBus import org.bigbluebutton.core.domain.MeetingState2x import org.bigbluebutton.core.running.LiveMeeting import org.bigbluebutton.core.apps.{ PermissionCheck, RightsManagementTrait } +import org.bigbluebutton.core.models.PresentationPage trait ResizeAndMovePagePubMsgHdlr extends RightsManagementTrait { this: PresentationPodHdlrs => @@ -13,7 +13,7 @@ trait ResizeAndMovePagePubMsgHdlr extends RightsManagementTrait { def handle(msg: ResizeAndMovePagePubMsg, state: MeetingState2x, liveMeeting: LiveMeeting, bus: MessageBus): MeetingState2x = { - def broadcastEvent(msg: ResizeAndMovePagePubMsg, podId: String, page: PageVO): Unit = { + def broadcastEvent(msg: ResizeAndMovePagePubMsg, podId: String, page: PresentationPage): Unit = { val routing = Routing.addMsgToClientRouting( MessageTypes.BROADCAST_TO_MEETING, liveMeeting.props.meetingProp.intId, msg.header.userId diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/PresentationPods.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/PresentationPods.scala index 40ba0b8e779b5ea026956777c79dea1cccfbdf5f..7a32caf5d97020ef67bf3b8300dad73ff15c91fe 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/PresentationPods.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/PresentationPods.scala @@ -18,8 +18,19 @@ object PresentationPodFactory { } } +case class PresentationPage( + id: String, + num: Int, + urls: Map[String, String], + current: Boolean = false, + xOffset: Double = 0, + yOffset: Double = 0, + widthRatio: Double = 100D, + heightRatio: Double = 100D +) + case class PresentationInPod(id: String, name: String, current: Boolean = false, - pages: scala.collection.immutable.Map[String, PageVO], downloadable: Boolean) { + pages: scala.collection.immutable.Map[String, PresentationPage], downloadable: Boolean) { def makePageCurrent(pres: PresentationInPod, pageId: String): Option[PresentationInPod] = { pres.pages.get(pageId) match { @@ -33,7 +44,7 @@ case class PresentationInPod(id: String, name: String, current: Boolean = false, } } - def getCurrentPage(pres: PresentationInPod): Option[PageVO] = { + def getCurrentPage(pres: PresentationInPod): Option[PresentationPage] = { pres.pages.values find (p => p.current) } @@ -129,7 +140,7 @@ case class PresentationPod(id: String, currentPresenter: String, def resizePage(presentationId: String, pageId: String, xOffset: Double, yOffset: Double, widthRatio: Double, - heightRatio: Double): Option[(PresentationPod, PageVO)] = { + heightRatio: Double): Option[(PresentationPod, PresentationPage)] = { // Force coordinate that are out-of-bounds inside valid values // 0.25D is 400% zoom // 100D-checkedWidth is the maximum the page can be moved over diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala index 707217d7c0278f854163b5eb76649e737cd0a33a..7046598489b0479ea5a0975510131bcc3c01b635 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala @@ -439,6 +439,7 @@ class MeetingActor( case m: PresentationUploadTokenReqMsg => state = presentationPodsApp.handle(m, state, liveMeeting, msgBus) case m: ResizeAndMovePagePubMsg => state = presentationPodsApp.handle(m, state, liveMeeting, msgBus) case m: PresentationPageConvertedSysMsg => state = presentationPodsApp.handle(m, state, liveMeeting, msgBus) + case m: PresentationConversionStartedSysMsg => state = presentationPodsApp.handle(m, state, liveMeeting, msgBus) // Caption case m: EditCaptionHistoryPubMsg => captionApp2x.handle(m, liveMeeting, msgBus) diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Presentation.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Presentation.scala index 925c5b2c1ad5cb4c454bbb89793f7d10a419d1a9..a7d55b635928a4ba29129042f333edfad6599676 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Presentation.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Presentation.scala @@ -9,3 +9,21 @@ case class PageVO(id: String, num: Int, thumbUri: String = "", swfUri: String, case class PresentationPodVO(id: String, currentPresenter: String, presentations: Vector[PresentationVO]) + +case class PresentationPageConvertedVO( + id: String, + num: Int, + urls: Map[String, String], + current: Boolean = false +) + +case class PresentationPageVO( + id: String, + num: Int, + urls: Map[String, String], + current: Boolean = false, + xOffset: Double = 0, + yOffset: Double = 0, + widthRatio: Double = 100D, + heightRatio: Double = 100D +) diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala index 65d131066927a3d453ec76814b9cf68cc9b1fe42..addcb1cc5f0c152917402e60cb1f00685130f9b5 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala @@ -1,6 +1,6 @@ package org.bigbluebutton.common2.msgs -import org.bigbluebutton.common2.domain.{ PageVO, PresentationPodVO, PresentationVO } +import org.bigbluebutton.common2.domain.{ PageVO, PresentationPageConvertedVO, PresentationPageVO, PresentationPodVO, PresentationVO } // ------------ client to akka-apps ------------ object CreateNewPresentationPodPubMsg { val NAME = "CreateNewPresentationPodPubMsg" } @@ -104,7 +104,7 @@ case class PresentationPageConvertedSysMsgBody( numberOfPages: Int, pagesCompleted: Int, presName: String, - page: PageVO + page: PresentationPageConvertedVO ) object PresentationConversionStartedSysMsg { val NAME = "PresentationConversionStartedSysMsg" } @@ -117,7 +117,9 @@ case class PresentationConversionStartedSysMsgBody( presentationId: String, current: Boolean, presName: String, - downloadable: Boolean + downloadable: Boolean, + numPages: Int, + authzToken: String ) object PresentationConversionEndedSysMsg { val NAME = "PresentationConversionEndedSysMsg" } @@ -179,7 +181,7 @@ case class PresentationPageConvertedEventMsgBody( numberOfPages: Int, pagesCompleted: Int, presName: String, - page: PageVO + page: PresentationPageVO ) object PresentationConversionCompletedEvtMsg { val NAME = "PresentationConversionCompletedEvtMsg" } diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/DocumentConversionServiceImp.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/DocumentConversionServiceImp.java index 22b489c36a527c311ac278e34cc3c8e8daea7445..355277ea71ad45dab0ecf556e67de4dc68a1f36c 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/DocumentConversionServiceImp.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/DocumentConversionServiceImp.java @@ -41,40 +41,12 @@ public class DocumentConversionServiceImp implements DocumentConversionService { private PdfToSwfSlidesGenerationService pdfToSwfSlidesGenerationService; private ImageToSwfSlidesGenerationService imageToSwfSlidesGenerationService; - private void sendDocConversionStartedProgress(UploadedPresentation pres) { - DocConversionStarted progress = new DocConversionStarted( - pres.getPodId(), - pres.getMeetingId(), - pres.getId(), - pres.getName(), - pres.getAuthzToken(), - pres.isDownloadable(), - pres.isDownloadable()); - gw.sendDocConversionMsg(progress); - } + public void processDocument(UploadedPresentation pres) { SupportedDocumentFilter sdf = new SupportedDocumentFilter(gw); - if (! pres.isConversionStarted()) { - Map<String, Object> logData = new HashMap<String, Object>(); - logData.put("podId", pres.getPodId()); - logData.put("meetingId", pres.getMeetingId()); - logData.put("presId", pres.getId()); - logData.put("filename", pres.getName()); - logData.put("current", pres.isCurrent()); - logData.put("authzToken", pres.getAuthzToken()); - logData.put("logCode", "presentation_conversion_start"); - logData.put("message", "Start presentation conversion."); - - Gson gson = new Gson(); - String logStr = gson.toJson(logData); - log.info(" --analytics-- data={}", logStr); - - pres.startConversion(); - sendDocConversionStartedProgress(pres); - } if (sdf.isSupported(pres)) { String fileType = pres.getFileType(); @@ -95,9 +67,9 @@ public class DocumentConversionServiceImp implements DocumentConversionService { ocsf.sendProgress(pres); } } else if (SupportedFileTypes.isPdfFile(fileType)) { - pdfToSwfSlidesGenerationService.generateSlides(pres); + pdfToSwfSlidesGenerationService.generateSlides(pres); } else if (SupportedFileTypes.isImageFile(fileType)) { - imageToSwfSlidesGenerationService.generateSlides(pres); + imageToSwfSlidesGenerationService.generateSlides(pres); } else { Map<String, Object> logData = new HashMap<String, Object>(); logData = new HashMap<String, Object>(); diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageToSwfSlidesGenerationService.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageToSwfSlidesGenerationService.java index 1c09f571a4ee9aa02c39a8cb6236c27f1ed5834a..b71ddbaaa165cb9a2a4d48e46f89164e6d052987 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageToSwfSlidesGenerationService.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageToSwfSlidesGenerationService.java @@ -20,6 +20,8 @@ package org.bigbluebutton.presentation.imp; import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; @@ -30,6 +32,7 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import com.google.gson.Gson; import org.bigbluebutton.presentation.FileTypeConstants; import org.bigbluebutton.presentation.ImageResizer; import org.bigbluebutton.presentation.ImageToSwfSlide; @@ -39,6 +42,7 @@ import org.bigbluebutton.presentation.SvgImageCreator; import org.bigbluebutton.presentation.TextFileCreator; import org.bigbluebutton.presentation.ThumbnailCreator; import org.bigbluebutton.presentation.UploadedPresentation; +import org.bigbluebutton.presentation.messages.DocConversionStarted; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,10 +71,43 @@ public class ImageToSwfSlidesGenerationService { executor = Executors.newFixedThreadPool(numThreads); completionService = new ExecutorCompletionService<ImageToSwfSlide>(executor); } - + + private void sendDocConversionStartedProgress(UploadedPresentation pres) { + if (! pres.isConversionStarted()) { + Map<String, Object> logData = new HashMap<String, Object>(); + + logData.put("podId", pres.getPodId()); + logData.put("meetingId", pres.getMeetingId()); + logData.put("presId", pres.getId()); + logData.put("filename", pres.getName()); + logData.put("current", pres.isCurrent()); + logData.put("authzToken", pres.getAuthzToken()); + logData.put("logCode", "presentation_conversion_start"); + logData.put("message", "Start presentation conversion."); + + Gson gson = new Gson(); + String logStr = gson.toJson(logData); + log.info(" --analytics-- data={}", logStr); + + pres.startConversion(); + DocConversionStarted progress = new DocConversionStarted( + pres.getPodId(), + pres.getMeetingId(), + pres.getId(), + pres.getName(), + pres.getAuthzToken(), + pres.isDownloadable(), + pres.isDownloadable(), + pres.getNumberOfPages()); + notifier.sendDocConversionProgress(progress); + } + } + public void generateSlides(UploadedPresentation pres) { pres.setNumberOfPages(1); // There should be only one image to convert. + sendDocConversionStartedProgress(pres); + for (int page = 1; page <= pres.getNumberOfPages(); page++) { if (swfSlidesRequired) { if (pres.getNumberOfPages() > 0) { diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfToSwfSlidesGenerationService.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfToSwfSlidesGenerationService.java index 05620e09e915c3ea3603df18ec7dfbdcde446fb4..e7bd70e49bf588c76b2ce85a0be35faf9ee8b2f0 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfToSwfSlidesGenerationService.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfToSwfSlidesGenerationService.java @@ -38,6 +38,7 @@ import java.util.concurrent.TimeoutException; import org.bigbluebutton.presentation.*; import org.bigbluebutton.presentation.ConversionUpdateMessage.MessageBuilder; +import org.bigbluebutton.presentation.messages.DocConversionStarted; import org.bigbluebutton.presentation.messages.DocPageCountExceeded; import org.bigbluebutton.presentation.messages.DocPageCountFailed; import org.bigbluebutton.presentation.messages.PdfConversionInvalid; @@ -72,8 +73,42 @@ public class PdfToSwfSlidesGenerationService { executor = Executors.newFixedThreadPool(numConversionThreads); } + private void sendDocConversionStartedProgress(UploadedPresentation pres) { + if (! pres.isConversionStarted()) { + Map<String, Object> logData = new HashMap<String, Object>(); + + logData.put("podId", pres.getPodId()); + logData.put("meetingId", pres.getMeetingId()); + logData.put("presId", pres.getId()); + logData.put("filename", pres.getName()); + logData.put("current", pres.isCurrent()); + logData.put("authzToken", pres.getAuthzToken()); + logData.put("logCode", "presentation_conversion_start"); + logData.put("message", "Start presentation conversion."); + + Gson gson = new Gson(); + String logStr = gson.toJson(logData); + log.info(" --analytics-- data={}", logStr); + + pres.startConversion(); + DocConversionStarted progress = new DocConversionStarted( + pres.getPodId(), + pres.getMeetingId(), + pres.getId(), + pres.getName(), + pres.getAuthzToken(), + pres.isDownloadable(), + pres.isDownloadable(), + pres.getNumberOfPages()); + notifier.sendDocConversionProgress(progress); + } + } + public void generateSlides(UploadedPresentation pres) { determineNumberOfPages(pres); + + sendDocConversionStartedProgress(pres); + if (pres.getNumberOfPages() > 0) { if (pres.getUploadedFile().length() > bigPdfSize) { try { diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java index 0759a80c5cde342a8cf918bc0f1ddc64950177d4..00206efb1286dbf7de620050efd59fd7dd888847 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java @@ -54,7 +54,7 @@ public class SwfSlidesGenerationProgressNotifier { ConversionMessageConstants.GENERATED_SLIDE_KEY, pres.getNumberOfPages(), slidesCompleted, - pres.getBaseUrl(), + generateBasePresUrl(pres), pageGenerated, (pageGenerated == 1)); messagingService.sendDocConversionMsg(progress); diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/DocConversionStarted.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/DocConversionStarted.java index 728c73e7ba96a8af2c8b9d8f8f8ae3fb924d4628..0abf241cfdad2e7fb6f85a540e8d7e4d20fdc57f 100755 --- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/DocConversionStarted.java +++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/DocConversionStarted.java @@ -8,6 +8,7 @@ public class DocConversionStarted implements IDocConversionMsg { public final String authzToken; public final Boolean downloadable; public final Boolean current; + public final Integer numPages; public DocConversionStarted(String podId, String meetingId, @@ -15,7 +16,8 @@ public class DocConversionStarted implements IDocConversionMsg { String filename, String authzToken, Boolean downloadable, - Boolean current) { + Boolean current, + Integer numPages) { this.podId = podId; this.meetingId = meetingId; this.presId = presId; @@ -23,5 +25,6 @@ public class DocConversionStarted implements IDocConversionMsg { this.authzToken = authzToken; this.downloadable = downloadable; this.current = current; + this.numPages = numPages; } } diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala index e696df3dc4ee27152f62787ae2cf7646d14d22aa..36b1247c762752c3c59536572a3ddeee70262d88 100755 --- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala +++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala @@ -2,7 +2,7 @@ package org.bigbluebutton.api2 import org.bigbluebutton.api.messaging.converters.messages._ import org.bigbluebutton.api2.meeting.RegisterUser -import org.bigbluebutton.common2.domain.{ DefaultProps, PageVO, PresentationVO } +import org.bigbluebutton.common2.domain.{ DefaultProps, PageVO, PresentationPageConvertedVO, PresentationVO } import org.bigbluebutton.common2.msgs._ import org.bigbluebutton.presentation.messages._ @@ -64,18 +64,24 @@ object MsgBuilder { BbbCommonEnvCoreMsg(envelope, req) } - def generatePresentationPage(presId: String, numPages: Int, presBaseUrl: String, page: Int): PageVO = { + def generatePresentationPage(presId: String, numPages: Int, presBaseUrl: String, page: Int): PresentationPageConvertedVO = { val id = presId + "/" + page val current = if (page == 1) true else false - val thumbnail = presBaseUrl + "/thumbnail/" + page - val swfUri = presBaseUrl + "/slide/" + page + val thumbUrl = presBaseUrl + "/thumbnail/" + page + val swfUrl = presBaseUrl + "/slide/" + page - val txtUri = presBaseUrl + "/textfiles/" + page - val svgUri = presBaseUrl + "/svg/" + page + val txtUrl = presBaseUrl + "/textfiles/" + page + val svgUrl = presBaseUrl + "/svg/" + page + val pngUrl = presBaseUrl + "/png/" + page - PageVO(id = id, num = page, thumbUri = thumbnail, swfUri = swfUri, - txtUri = txtUri, svgUri = svgUri, - current = current) + val urls = Map("swf" -> swfUrl, "thumb" -> thumbUrl, "text" -> txtUrl, "svg" -> svgUrl, "png" -> pngUrl) + + PresentationPageConvertedVO( + id = id, + num = page, + urls = urls, + current = current + ) } def buildPresentationPageConvertedSysMsg(msg: DocPageGeneratedProgress): BbbCommonEnvCoreMsg = { @@ -202,7 +208,9 @@ object MsgBuilder { presentationId = msg.presId, current = msg.current, presName = msg.filename, - downloadable = msg.downloadable + downloadable = msg.downloadable, + authzToken = msg.authzToken, + numPages = msg.numPages ) val req = PresentationConversionStartedSysMsg(header, body) BbbCommonEnvCoreMsg(envelope, req)