private void displayMessageEventRecursive(UW.ClassroomPresenter.Network.Messages.Message msg) { this.appendText("-----"); string longtype = msg.GetType().ToString(); string shorttype = longtype.Substring(longtype.LastIndexOf(".") + 1); this.appendText("Type: " + shorttype); if (msg is DeckSlideContentMessage) { DeckSlideContentMessage dscm = msg as DeckSlideContentMessage; this.appendText("Content Hash: " + dscm.Content.key.ToString()); this.m_Image = dscm.Content.image; } else if (msg is PresentationEndedMessage) { //Nothing really interesting here... } else if (msg is TableOfContentsEntryMessage) { TableOfContentsEntryMessage tocem = msg as TableOfContentsEntryMessage; string toDisplay = "Path From Root: "; int[] path = tocem.PathFromRoot; for (int i = 0; i < path.Length; i++) { toDisplay += " " + path[i].ToString(); } this.appendText(toDisplay); } else if (msg is TableOfContentsEntryRemovedMessage) { TableOfContentsEntryRemovedMessage tocerm = msg as TableOfContentsEntryRemovedMessage; this.appendText("Entry ID: " + tocerm.TargetId.ToString()); } else if (msg is InstructorMessage) { InstructorMessage im = msg as InstructorMessage; this.appendText("Linked Navigation: " + im.ForcingStudentNavigationLock.ToString()); this.appendText("Student Submissions: " + im.AcceptingStudentSubmissions.ToString()); } else if (msg is StudentMessage) { //Nothing really interesting here... } else if (msg is PublicMessage) { //Nothing really interesting here... } else if (msg is InstructorCurrentPresentationChangedMessage) { InstructorCurrentPresentationChangedMessage icpcm = msg as InstructorCurrentPresentationChangedMessage; this.appendText("Human Name: " + icpcm.HumanName); } else if (msg is InstructorCurrentDeckTraversalChangedMessage) { InstructorCurrentDeckTraversalChangedMessage icdtcm = msg as InstructorCurrentDeckTraversalChangedMessage; this.appendText("Traversal ID: " + icdtcm.TargetId.ToString()); } else if (msg is DeckInformationMessage) { DeckInformationMessage dim = msg as DeckInformationMessage; this.appendText("Disposition: " + dim.Disposition); this.appendText("Human Name: " + dim.HumanName); this.appendText("Deck BG Color: " + dim.DeckBackgroundColor); } else if (msg is SlideDeckTraversalMessage) { SlideDeckTraversalMessage sdtm = msg as SlideDeckTraversalMessage; this.appendText("Traversal ID: " + sdtm.TargetId.ToString()); } else if (msg is DeckTraversalRemovedFromPresentationMessage) { DeckTraversalRemovedFromPresentationMessage dtrfpm = msg as DeckTraversalRemovedFromPresentationMessage; this.appendText("Traversal ID: " + dtrfpm.TargetId.ToString()); } else if (msg is ImageSheetMessage) { ImageSheetMessage ism = msg as ImageSheetMessage; this.appendText("MD5: " + ism.MD5.ToString()); } else if (msg is InkSheetInformationMessage) { InkSheetInformationMessage isim = msg as InkSheetInformationMessage; this.appendText("Disposition: " + isim.Disposition.ToString()); } else if (msg is InkSheetStrokesAddedMessage) { InkSheetStrokesAddedMessage issam = msg as InkSheetStrokesAddedMessage; this.appendText("Disposition: " + issam.Disposition.ToString()); } else if (msg is InkSheetStrokesDeletingMessage) { InkSheetStrokesDeletingMessage issdm = msg as InkSheetStrokesDeletingMessage; this.appendText("Disposition: " + issdm.Disposition.ToString()); } else if (msg is PresentationInformationMessage) { PresentationInformationMessage pim = msg as PresentationInformationMessage; this.appendText("Human Name: " + pim.HumanName); } else if (msg is RealTimeInkSheetMessage) { RealTimeInkSheetMessage rtism = msg as RealTimeInkSheetMessage; this.appendText("Disposition: " + rtism.Disposition.ToString()); } else if (msg is RealTimeInkSheetInformationMessage) { RealTimeInkSheetInformationMessage rtisim = msg as RealTimeInkSheetInformationMessage; this.appendText("Disposition: " + rtisim.Disposition.ToString()); } else if (msg is RealTimeInkSheetDataMessage) { RealTimeInkSheetDataMessage rtisdm = msg as RealTimeInkSheetDataMessage; this.appendText("Stylus ID: " + rtisdm.StylusId.ToString()); this.appendText("# of Packets: " + rtisdm.Packets.Length); } else if (msg is RealTimeInkSheetPacketsMessage) { RealTimeInkSheetPacketsMessage rtispm = msg as RealTimeInkSheetPacketsMessage; this.appendText("Stylus ID: " + rtispm.StylusId.ToString()); this.appendText("# of Packets: " + rtispm.Packets.Length); } else if (msg is RealTimeInkSheetStylusUpMessage) { RealTimeInkSheetStylusUpMessage rtissup = msg as RealTimeInkSheetStylusUpMessage; this.appendText("Stylus ID: " + rtissup.StylusId.ToString()); this.appendText("# of Packets: " + rtissup.Packets.Length); } else if (msg is RealTimeInkSheetStylusDownMessage) { RealTimeInkSheetStylusDownMessage rtissdm = msg as RealTimeInkSheetStylusDownMessage; this.appendText("Stylus ID: " + rtissdm.StylusId.ToString()); this.appendText("# of Packets: " + rtissdm.Packets.Length); } else if (msg is SheetRemovedMessage) { SheetRemovedMessage srm = msg as SheetRemovedMessage; this.appendText("Disposition: " + srm.Disposition.ToString()); } else if (msg is SlideInformationMessage) { SlideInformationMessage sim = msg as SlideInformationMessage; this.appendText("LocalID: " + sim.LocalId.ToString()); this.appendText("Title: " + sim.Title); this.appendText("Zoom: " + sim.Zoom); this.appendText("Slide BG Color: " + sim.SlideBackgroundColor); } else if (msg is SlideDeletedMessage) { SlideDeletedMessage sdm = msg as SlideDeletedMessage; this.appendText("ID: " + sdm.TargetId); } else if (msg is TextSheetMessage) { //Nothing interesting here... } else { //Unknown! } //Do the recursive thing if (msg.Child != null) { this.displayMessageEventRecursive(msg.Child); } }
/// <summary> /// Send the current ink as a student submission slide /// </summary> /// <param name="sender">The object which sent this event, i.e. this class</param> /// <param name="args">The parameters for the property</param> private void HandleSendSubmission(object sender, PropertyEventArgs args) { if (this.m_SendingLock) { return; } using (Synchronizer.Lock(SubmissionStatusModel.GetInstance().SyncRoot)) { SubmissionStatusModel.GetInstance().SubmissionStatus = SubmissionStatusModel.Status.NotReceived; } ///declare variables we will be using UW.ClassroomPresenter.Network.Messages.Message pres, deck, slide, sheet; // Construct the message to send using (this.m_Model.Workspace.Lock()) { // Add the presentation if (this.m_Model.Workspace.CurrentPresentation == null) { return; } ///the presentation message we will be sending pres = new PresentationInformationMessage(this.m_Model.Workspace.CurrentPresentation); pres.Group = Groups.Group.Submissions; //Add the current deck model that corresponds to this slide deck at the remote location if ((~this.m_Model.Workspace.CurrentDeckTraversal) == null) { return; } using (Synchronizer.Lock((~this.m_Model.Workspace.CurrentDeckTraversal).SyncRoot)) { DeckModel dModel = (~this.m_Model.Workspace.CurrentDeckTraversal).Deck; foreach (DeckPairModel match in this.m_Model.Workspace.DeckMatches) { ///check to see if the decks are the same if (match.LocalDeckTraversal.Deck == (~this.m_Model.Workspace.CurrentDeckTraversal).Deck) { dModel = match.RemoteDeckTraversal.Deck; } } ///create the deck message from this matched deck deck = new DeckInformationMessage(dModel); ///make the deck a submission type deck. deck.Group = Groups.Group.Submissions; ///tack this message onto the end. pres.InsertChild(deck); ///add the particular slide we're on the to message. if ((~this.m_Model.Workspace.CurrentDeckTraversal).Current == null) { return; } using (Synchronizer.Lock((~this.m_Model.Workspace.CurrentDeckTraversal).Current.Slide.SyncRoot)) { // Add the Slide Message slide = new StudentSubmissionSlideInformationMessage((~this.m_Model.Workspace.CurrentDeckTraversal).Current.Slide, Guid.NewGuid(), Guid.NewGuid()); slide.Group = Groups.Group.Submissions; deck.InsertChild(slide); // Find the correct user ink layer to send RealTimeInkSheetModel m_Sheet = null; int count = 0; foreach (SheetModel s in (~this.m_Model.Workspace.CurrentDeckTraversal).Current.Slide.AnnotationSheets) { if (s is RealTimeInkSheetModel && (s.Disposition & SheetDisposition.Remote) == 0) { m_Sheet = (RealTimeInkSheetModel)s; count++; } } // DEBUGGING if (count > 1) { Debug.Assert(true, "Bad Count", "Bad"); } // Find the existing ink on the slide Ink extracted; using (Synchronizer.Lock(m_Sheet.Ink.Strokes.SyncRoot)) { // Ensure that each stroke has a Guid which will uniquely identify it on the remote side foreach (Stroke stroke in m_Sheet.Ink.Strokes) { if (!stroke.ExtendedProperties.DoesPropertyExist(InkSheetMessage.StrokeIdExtendedProperty)) { stroke.ExtendedProperties.Add(InkSheetMessage.StrokeIdExtendedProperty, Guid.NewGuid().ToString()); } } // Extract all of the strokes extracted = m_Sheet.Ink.ExtractStrokes(m_Sheet.Ink.Strokes, ExtractFlags.CopyFromOriginal); } // Find the Realtime ink on the slide RealTimeInkSheetModel newSheet = null; using (Synchronizer.Lock(m_Sheet.SyncRoot)) { newSheet = new RealTimeInkSheetModel(Guid.NewGuid(), m_Sheet.Disposition | SheetDisposition.Remote, m_Sheet.Bounds); using (Synchronizer.Lock(newSheet.SyncRoot)) { newSheet.CurrentDrawingAttributes = m_Sheet.CurrentDrawingAttributes; } } // Add a message to *create* the student's RealTimeInkSheetModel on the instructor client (without any ink). sheet = SheetMessage.ForSheet(newSheet, SheetMessage.SheetCollection.AnnotationSheets); sheet.Group = Groups.Group.Submissions; slide.InsertChild(sheet); //Scale the ink if necessary if (ViewerStateModel.NonStandardDpi) { extracted.Strokes.Transform(ViewerStateModel.DpiNormalizationSendMatrix); } // Add a message to copy the ink from the student's RealTimeInkSheetModel to the just-created sheet on the instructor. sheet = new InkSheetStrokesAddedMessage(newSheet, (Guid)slide.TargetId, SheetMessage.SheetCollection.AnnotationSheets, extracted); sheet.Group = Groups.Group.Submissions; slide.InsertChild(sheet); ///Add each text and image sheet into the message as children of the ink sheet if it is public foreach (SheetModel s in (~this.m_Model.Workspace.CurrentDeckTraversal).Current.Slide.AnnotationSheets) { if (s is TextSheetModel && !(s is StatusLabel) && (s.Disposition & SheetDisposition.Remote) == 0) { TextSheetModel text_sheet = (TextSheetModel)s; text_sheet = (TextSheetModel)text_sheet.Clone(); ///some ugly code here due to synchronization bool sheet_is_public; using (Synchronizer.Lock(text_sheet.SyncRoot)) { sheet_is_public = text_sheet.IsPublic; } if (sheet_is_public) { TextSheetMessage t_message = new TextSheetMessage(text_sheet, SheetMessage.SheetCollection.AnnotationSheets); t_message.Group = Groups.Group.Submissions; slide.InsertChild(t_message); } } if (s is ImageSheetModel && !(s is StatusLabel) && (s.Disposition & SheetDisposition.Remote) == 0) { ImageSheetModel image_sheet = (ImageSheetModel)s; image_sheet = (ImageSheetModel)image_sheet.Clone(); ImageSheetMessage i_message = new ImageSheetMessage(image_sheet, SheetMessage.SheetCollection.AnnotationSheets); i_message.Group = Groups.Group.Submissions; slide.InsertChild(i_message); } } //Lock the current sending. this.LockSending(); // Send the message this.m_Sender.Send(pres); } } } }