protected override object SetUpMember(int index, object member) { using(Synchronizer.Lock(this.m_Service)) { using(this.m_Bucket.Lock()) { DeckTraversalModel traversal = ((DeckTraversalModel) member); if((traversal.Deck.Disposition & DeckDisposition.Remote) != 0) { // A remote deck, perform deck matching // TODO: DeckMatching Should Occur Here // CURRENT IMPLEMENTATION ASSUMES THERE WAS NO MATCH // NOTE: All DeckTraversals need to ability to be linked since with // deckmatching any deck can become associated with a remote deck. DeckTraversalModel matchedDeckTraversal = null; // Perform the DeckMatching (NOTE: Does Nothing Right Now) matchedDeckTraversal = DeckMatcherService.MatchDeck( traversal ); if( matchedDeckTraversal == null ) { // No Matched Deck Found // TODO: Evaluate whether it's a good idea to copy the existing traversal's Id. matchedDeckTraversal = new LinkedDeckTraversalModel(this.m_Service.m_EventQueue, traversal.Id, this.m_Service.m_Model, traversal); // Create the DeckMatch this.m_Bucket.DeckMatches.Add( new DeckPairModel( matchedDeckTraversal, traversal ) ); } else { // Create the DeckMatch this.m_Bucket.DeckMatches.Add( new DeckPairModel( matchedDeckTraversal, traversal ) ); // NOTE: Don't have to add to the workspace because it's already there. // NOTE: But should we remove and replace with a LinkedDeckTraversalModel?? } traversal = matchedDeckTraversal; } else { // Not a remote deck, just add to the workspace this.m_Bucket.DeckTraversals.Add(traversal); } return traversal; } } }
private void HandleCurrentDeckTraversalChanged(object sender, PropertyEventArgs args_) { using (Synchronizer.Lock(this)) { DeckTraversalModel current; if (this.m_Instructor == null) { current = null; } else { using (Synchronizer.Lock(this.m_Instructor.SyncRoot)) { current = this.m_Instructor.CurrentDeckTraversal; } } using (this.m_Model.Workspace.Lock()) { if (current != null) { // Check the workspace to see if there exists a linkedDeckTraversal for this ID foreach (DeckTraversalModel model in this.m_Model.Workspace.DeckTraversals) { if (model.Id == current.Id) { current = model; break; } } } } // TODO: Only set the current deck traversal if navigation is unlinked. bool isInstructor = false; using (Synchronizer.Lock(this.m_Model.Participant.SyncRoot)) { if (this.m_Model.Participant.Role is InstructorModel) { isInstructor = true; } } DeckTraversalModel dtm = null; if ((current is LinkedDeckTraversalModel) || (isInstructor) || (current == null)) { dtm = current; } else { dtm = new LinkedDeckTraversalModel(this.m_EventQueue, current.Id, this.m_Model, current); } using (this.m_Model.Workspace.Lock()) { this.m_Model.Workspace.CurrentDeckTraversal.Value = dtm; } } }