public void AddUser(Theme theme, User user) { lock (this) { if (_themes.ContainsKey(theme)) { var themeUserContainer = _themes[theme]; if (!themeUserContainer.Contains(user)) { themeUserContainer.AddLast(user); } else { throw new InvalidOperationException("User already exists!"); } } else { throw new InvalidOperationException("Theme doesn't exist!"); } } }
public bool Equals(User otherUser) { if (otherUser != null) return Id == otherUser.Id; return false; }
public User[] LogOn(string themeName, string userName, Uri address) { Console.WriteLine("LogOn Enter"); User self; User[] temp; Theme theme; lock(_container) { if ((self = _container.GetUser(userName)) == null) self = new User(GenerateUniqueId(), userName, address); theme = _container.GetTheme(themeName); self.Callback = OperationContext.Current.GetCallbackChannel<IUserCallback>(); try { _container.AddUser(theme, self); } catch (InvalidOperationException e) { throw new FaultException<InvalidOperationException>(e); } temp = new[] { self }.Concat(_container.GetUsers(theme).Where(u => !self.Equals(u))).ToArray(); } Console.WriteLine("Username {0} got {1} new users.", userName, temp.Length); Thread t = new Thread(() => { LinkedList<User> toRemove = new LinkedList<User>(); foreach(User user in _container.GetUsers(theme)) { try { if (!user.Equals(self)) { if(((ICommunicationObject)user.Callback).State == CommunicationState.Opened) user.Callback.OnUserJoined(self); else toRemove.AddLast(user); } } catch(TimeoutException e) { Console.WriteLine(e.Message); toRemove.AddLast(user); } catch(CommunicationException e) { Console.WriteLine(e.Message); toRemove.AddLast(user); } catch(ObjectDisposedException e) { Console.WriteLine(e.Message); toRemove.AddLast(user); } } foreach (User user in toRemove) { LogOff(theme.Name, user.Id); } }); t.Start(); Console.WriteLine("LogOn Exit"); return temp; }
public void RemoveUser(Theme theme, User user) { lock (this) { _themes[theme].Remove(user); } }