/// <summary>
        /// CP3 messages can have a Predecessor and a Child, each a message in its own right.
        /// Here we recurse through the message graph, processing
        /// the parts in order.
        /// </summary>
        /// <param name="m"></param>
        /// <param name="outList"></param>
        /// <returns></returns>
        private void ProcessMessageGraph(UW.ClassroomPresenter.Network.Messages.Message m, List <object> outList)
        {
            if (m.Predecessor != null)
            {
                ProcessMessageGraph(m.Predecessor, outList);
            }

            Debug.WriteLine("Processing message: " + m.GetType().ToString());
            object o = ProcessMessage(m);

            if (o != null)
            {
                if (o is List <object> )
                {
                    List <object> lo = (List <object>)o;
                    foreach (object oo in lo)
                    {
                        outList.Add(oo);
                    }
                }
                else
                {
                    outList.Add(o);
                }
            }

            Debug.Indent();

            if (m.Child != null)
            {
                ProcessMessageGraph(m.Child, outList);
            }

            Debug.Unindent();
        }
 private void ProcessCP3Message(CP3.Network.Messages.Message m)
 {
     if (m is CP3.Network.Messages.Presentation.DeckInformationMessage)
     {
         CP3.Network.Messages.Presentation.DeckInformationMessage dim = (CP3.Network.Messages.Presentation.DeckInformationMessage)m;
         if ((dim.Disposition == UW.ClassroomPresenter.Model.Presentation.DeckDisposition.Whiteboard) ||
             (dim.Disposition == UW.ClassroomPresenter.Model.Presentation.DeckDisposition.StudentSubmission) ||
             (dim.Disposition == UW.ClassroomPresenter.Model.Presentation.DeckDisposition.QuickPoll))
         {
             return;
         }
         if (!decks.ContainsKey(dim.TargetId))
         {
             Deck thisDeck = new Deck(dim);
             decks.Add(dim.TargetId, thisDeck);
             if (this.OnDeckFound != null)
             {
                 OnDeckFound(thisDeck);
             }
         }
     }
     else if (m is CP3.Network.Messages.Network.InstructorCurrentDeckTraversalChangedMessage)
     {
         CP3.Network.Messages.Network.InstructorCurrentDeckTraversalChangedMessage im = (CP3.Network.Messages.Network.InstructorCurrentDeckTraversalChangedMessage)m;
         if (((im.Dispositon & UW.ClassroomPresenter.Model.Presentation.DeckDisposition.Whiteboard) == 0) &&
             (!this.unnamedDecks.ContainsKey(im.DeckId)))
         {
             // This case captures all the decks, including cases where the deck is opened before
             // the start of archiving, and there are no slide transitions within the deck, but
             // one slide is shown.  These need to be manually matched since we don't know the deck name.
             // At the end of processing we merge these into the main decks collection.
             this.unnamedDecks.Add(im.DeckId, new Deck(im.DeckId));
         }
     }
 }
        /// <summary>
        /// if the chunk identifies the role, return the numeric value.  Also look for the human name of the presenter.
        /// 1:instructor;2:shared display;3:student;other vaules:unknown.
        /// </summary>
        /// <param name="chunk"></param>
        /// <param name="presenterName"></param>
        /// <returns></returns>
        public static int AnalyzeChunk(UW.ClassroomPresenter.Network.Chunking.Chunk chunk, out string presenterName)
        {
            presenterName = "";

            if (chunk.NumberOfChunksInMessage == 1)
            {
                MemoryStream    ms        = new MemoryStream(chunk.Data);
                BinaryFormatter formatter = new BinaryFormatter();
                object          decoded   = null;
                try {
                    decoded = formatter.Deserialize(ms);
                }
                catch (Exception e)
                { // Most likely a new or unknown message type
                    Debug.WriteLine(e.ToString());
                }
                if (decoded is CP3.Network.Messages.Message)
                {
                    CP3.Network.Messages.Message m = (CP3.Network.Messages.Message)decoded;
                    if (m is CP3Msgs.PresentationInformationMessage)
                    {
                        CP3Msgs.PresentationInformationMessage pim = (CP3Msgs.PresentationInformationMessage)m;
                        return(1);
                    }
                    else if (m is CP3.Network.Messages.Network.ParticipantGroupAddedMessage)
                    {
                        CP3.Network.Messages.Network.ParticipantGroupAddedMessage gim = (CP3.Network.Messages.Network.ParticipantGroupAddedMessage)m;
                        if (gim.Singleton)
                        {
                            presenterName = gim.FriendlyName;
                        }
                        return(0);
                    }
                    else if (m is UW.ClassroomPresenter.Network.Messages.Network.InstructorMessage)
                    {
                        Debug.WriteLine(m.ToString());
                        return(1);
                    }
                    else if (m is UW.ClassroomPresenter.Network.Messages.Network.StudentMessage)
                    {
                        Debug.WriteLine(m.ToString());
                        return(3);
                    }
                    else if (m is UW.ClassroomPresenter.Network.Messages.Network.PublicMessage)
                    {
                        Debug.WriteLine(m.ToString());
                        return(2);
                    }
                }
            }

            return(0);
        }
        private void ProcessCP3MessageGraph(UW.ClassroomPresenter.Network.Messages.Message m)
        {
            if (m.Predecessor != null)
            {
                ProcessCP3MessageGraph(m.Predecessor);
            }

            ProcessCP3Message(m);

            if (m.Child != null)
            {
                ProcessCP3MessageGraph(m.Child);
            }
        }
Beispiel #5
0
 public RecvLogMessage(long time, UW.ClassroomPresenter.Network.Messages.Message msg) : base(time)
 {
     this.message = msg;
 }
Beispiel #6
0
 public SendLogMessage(long time, UW.ClassroomPresenter.Network.Messages.Message msg, MessagePriority prior) : base(time)
 {
     this.message  = msg;
     this.priority = prior;
 }
Beispiel #7
0
 public void LogMessageRecv(UW.ClassroomPresenter.Network.Messages.Message message)
 {
     using (Synchronizer.Lock(this.SyncRoot)) {
         this.LogMessages.Add(new RecvLogMessage(AccurateTiming.Now, message));
     }
 }
Beispiel #8
0
 public void LogMessageSend(UW.ClassroomPresenter.Network.Messages.Message message, MessagePriority priority)
 {
     using (Synchronizer.Lock(this.SyncRoot)) {
         this.LogMessages.Add(new SendLogMessage(AccurateTiming.Now, message, priority));
     }
 }
 public SendLogMessage( long time, UW.ClassroomPresenter.Network.Messages.Message msg, MessagePriority prior )
     : base(time)
 {
     this.message = msg;
     this.priority = prior;
 }
 public RecvLogMessage( long time, UW.ClassroomPresenter.Network.Messages.Message msg )
     : base(time)
 {
     this.message = msg;
 }
        /// <summary>
        /// Interpret a subset of CP3 message types
        /// May return null, a single RTObject, or a List<object> containing multiple RTObjects
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        private object ProcessMessage(UW.ClassroomPresenter.Network.Messages.Message m)
        {
            if (m is CP3Msgs.InkSheetStrokesAddedMessage)
            {
                return(m_Cache.AddInkSheetStrokesAdded((CP3Msgs.InkSheetStrokesAddedMessage)m));
            }
            else if (m is CP3Msgs.TableOfContentsEntryMessage)
            {
                return(m_Cache.AddTableOfContentsEntry((CP3Msgs.TableOfContentsEntryMessage)m));
            }
            else if (m is CP3Msgs.InkSheetStrokesDeletingMessage)
            {
                return(m_Cache.AddInkSheetStrokesDeleting((CP3Msgs.InkSheetStrokesDeletingMessage)m));
            }
            else if (m is CP3Msgs.SlideDeckTraversalMessage)
            {
                return(m_Cache.AddSlideDeckTraversal((CP3Msgs.SlideDeckTraversalMessage)m));
            }
            else if (m is CP3.Network.Messages.Network.InstructorCurrentDeckTraversalChangedMessage)
            {
                return(m_Cache.AddInstructorCurrentDeckTraversalChanged((CP3.Network.Messages.Network.InstructorCurrentDeckTraversalChangedMessage)m));
            }
            else if (m is CP3Msgs.RealTimeInkSheetInformationMessage)
            {
                m_Cache.AddRealTimeInkSheetInformation((CP3Msgs.RealTimeInkSheetInformationMessage)m);
            }
            else if (m is CP3Msgs.RealTimeInkSheetPacketsMessage)
            {
                return(m_Cache.AddRealTimeInkSheetPackets((CP3Msgs.RealTimeInkSheetPacketsMessage)m));
            }
            else if (m is CP3Msgs.RealTimeInkSheetStylusDownMessage)
            {
                m_Cache.AddRealTimeInkSheetStylusDown((CP3Msgs.RealTimeInkSheetStylusDownMessage)m);
            }
            else if (m is CP3Msgs.RealTimeInkSheetStylusUpMessage)
            {
                return(m_Cache.AddRealTimeInkSheetStylusUp((CP3Msgs.RealTimeInkSheetStylusUpMessage)m));
            }
            else if (m is CP3Msgs.SlideInformationMessage)
            {
                return(m_Cache.UpdateSlideInformation((CP3Msgs.SlideInformationMessage)m));
            }
            else if (m is CP3Msgs.DeckInformationMessage)
            {
                return(m_Cache.UpdateDeckInformation((CP3Msgs.DeckInformationMessage)m));
            }
            else if (m is CP3Msgs.TextSheetMessage)
            {
                return(m_Cache.AddTextSheet((CP3Msgs.TextSheetMessage)m));
            }
            else if (m is CP3Msgs.SheetRemovedMessage)
            {
                return(m_Cache.AddSheetRemoved((CP3Msgs.SheetRemovedMessage)m));
            }
            else if (m is CP3Msgs.PresentationMessage)
            {
                return(m_Cache.UpdatePresentaton((CP3Msgs.PresentationMessage)m));
            }
            else if (m is CP3Msgs.QuickPollSheetMessage)
            {
                //When a new quickpoll is started we get this with parents: QuickPollInformationMessage, Slide..,Deck..,Presentation..
                //The SheetMessage base class has dimensions, but they appear to all be zeros.
                return(m_Cache.AddQuickPollSheet((CP3Msgs.QuickPollSheetMessage)m));
            }
            else if (m is CP3Msgs.QuickPollResultInformationMessage)
            {
                //When there is a vote we get this with parents: QuickPollInformationMessage, Presentation..
                //Contains a owner ID and a result string such as "C" or "Yes".
                //Presumably the owner ID is the id of the client, so this is how we would know if a client changed his vote.
                return(m_Cache.AddQuickResultInformation((CP3Msgs.QuickPollResultInformationMessage)m));
            }
            else if (m is CP3Msgs.ImageSheetMessage)
            {
                CP3Msgs.ImageSheetMessage ism = (CP3Msgs.ImageSheetMessage)m;
                if (ism.SheetCollectionSelector ==
                    UW.ClassroomPresenter.Network.Messages.Presentation.SheetMessage.SheetCollection.AnnotationSheets)
                {
                    //Annotation sheets are the ones added on-the-fly.
                    return(m_Cache.AddImageAnnotation(ism));
                }
                else
                {
                    //Content sheets: These are found in slide broadcasts.
                }
            }
            else if (m is CP3Msgs.QuickPollInformationMessage)
            {
                //We see one of these with a PresentationInformationMessage parent at various times.  It also appears in
                //the heirarchy along with some other messages.  It's not clear if we need to pay attention to this
                //because we have the QuickPollInformationMessage in the heirarchy with QuickPollSheetMessage.
                //Debug.WriteLine("QuickPollInformationMessage");
            }
            else if (m is CP3Msgs.QuickPollResultRemovedMessage)
            {
                //Appears to be unused?
                //Debug.WriteLine("QuickPollResultRemovedMessage");
            }
            else if (m is CP3Msgs.XPSPageSheetMessage)
            {
                //Debug.WriteLine("XPSPageSheetMessage");
            }

            return(null);
        }