Пример #1
0
 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!");
         }
     }
 }
Пример #2
0
 public bool Equals(User otherUser)
 {
     if (otherUser != null)
         return Id == otherUser.Id;
     return false;
 }
Пример #3
0
        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;
        }
Пример #4
0
 public void RemoveUser(Theme theme, User user)
 {
     lock (this)
     {
         _themes[theme].Remove(user);
     }
 }