Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        /// <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);
                    }
                }
            }
        }