public CXPCapabilityMessageReceiver(CXPCapabilityMessageSender sender, uint ssrc, PresenterModel model, ClassroomModel classroom, ParticipantModel participant) { this.m_Model = model; this.m_Sender = sender; this.m_RemoteSSRC = ssrc; this.m_Context = new ReceiveContext(model, classroom, participant); this.m_ContextArgs = new object[] { this.m_Context }; this.m_Queue = new MessageProcessingQueue(this); this.m_Assembler = new ChunkAssembler(); this.m_Assembler.Nack += new ChunkAssembler.NackDelegate(this.HandleAssemblerNack); }
public override bool RemoveCapability(ICapability capability) { bool ret = base.RemoveCapability(capability); if (ret) { // Remove the ObjectReceived event handler. // This form is going away, but the Capability may be replayed in which case we'd receive this event into a disposed form! m_Capability.ObjectReceived -= new CapabilityObjectReceivedEventHandler(objectReceived); m_CapabilitySender.Dispose(); m_Capability = null; m_CapabilitySender = null; } return ret; }
/// <summary> /// Handle an event to be raised once after the capability's Send and Play methods have completed. /// </summary> void OnCapabilityPlay() { m_Capability.OnPlay -= new PresenterCapability.OnPlayHandler(OnCapabilityPlay); m_CapabilitySender = new CXPCapabilityMessageSender(m_Model, m_Capability); }
public override void AddCapability(ICapability capability) { base.AddCapability(capability); if (m_Capability == null) { m_Capability = (PresenterCapability)capability; // Hook the ObjectReceived event so we can receive incoming data m_Capability.ObjectReceived += new CapabilityObjectReceivedEventHandler(objectReceived); //Set the role to instructor if we initiated the capability. if (m_Capability.IsSender) { //Set the instructor role InstructorModel instructor = new InstructorModel(Guid.NewGuid()); using (Synchronizer.Lock(this.m_Model.Participant.SyncRoot)) { m_Model.Participant.Role = instructor; } using (Synchronizer.Lock(this.m_Model.ViewerState.SyncRoot)) { this.m_Model.ViewerState.iRole = 2; } //We also need to set up a couple of other things to make the instructor functional: A network association // and an empty presentation. PresentationModel pres = new PresentationModel(Guid.NewGuid(), m_Model.Participant, "Untitled Presentation", true); using (Synchronizer.Lock(m_Model.Network.SyncRoot)) { m_Model.Network.Association = m_Model.Participant; } using (Synchronizer.Lock(instructor.SyncRoot)) { instructor.CurrentPresentation = pres; } } else { //Set student role using (Synchronizer.Lock(this.m_Model.Participant.SyncRoot)) { m_Model.Participant.Role = new StudentModel(Guid.NewGuid()); } using (Synchronizer.Lock(this.m_Model.ViewerState.SyncRoot)) { this.m_Model.ViewerState.iRole = 1; } } //Before we create the CXPCapabilityMessageSender, we want to wait until the Play and Send methods have completed. //Otherwise we can end up trying to send before the capability is ready to accept messages. bool createCapabilitySenderNow = false; lock (m_Capability) { //This section synchronized with the PresenterCapability instance. if (m_Capability.IsPlayingAndSending) { createCapabilitySenderNow = true; } else { m_Capability.OnPlay += new PresenterCapability.OnPlayHandler(OnCapabilityPlay); } } if (createCapabilitySenderNow) { m_CapabilitySender = new CXPCapabilityMessageSender(m_Model, m_Capability); } } }