/*
* Copyright (C) 2007 Eskil Bylund
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
using System;
using System.Collections.Generic;
namespace DCSharp{
/// <summary>
/// A class representing a unique user.
/// </summary>
/// <remarks>
/// This class represents a single unique user, identified by a cid.
///
/// The same user can be online on multiple hubs. The identity on each
/// hub should be added to the user. When the user has no identities, it's
/// considered to be offline.
/// </remark>
public class User
{
private static Dictionary<Uid, WeakReference> users = new Dictionary<Uid,
WeakReference>();
public event EventHandler OnlineChanged;
private List<Identity> identities;
private User(Uid uid, string nick)
{
if (nick == null)
{
throw new ArgumentNullException("nick");
}
this.uid = uid;
this.nick = nick;
identities = new List<Identity>();
}
#region Properties
/// <summary>
/// Gets the Uid of the user.
/// </summary>
/// <value>The Uid of the user.</value>
public Uid Uid
{
get { return uid; }
//set { uid = value; }
}
private Uid uid;
/// <summary>
/// Gets the nickname of the user.
/// </summary>
/// <value>The nickname of the user.</value>
public string Nick
{
get { return nick; }
//set { nick = value; }
}
private string nick;
/// <summary>
/// Gets whether or not the user is online.
/// </summary>
/// <value>Whether or not the user is online.</value>
public bool IsOnline
{
get { return online; }
private set
{
online = value;
OnOnlineChanged();
}
}
private bool online;
#endregion
#region Methods
/// <summary>
/// Creates or returns the user with the specified Cid and nickname.
/// </summary>
/// <param name="cid">The Cid of the user.</param>
/// <param name="nick">The nickname of the user.</param>
/// <returns>The user with the specified Cid.</returns>
public static User Create(Uid uid, string name)
{
lock (users)
{
User user;
WeakReference reference;
if (users.TryGetValue(uid, out reference))
{
user = (User)reference.Target;
if (user != null)
{
return user;
}
}
user = new User(uid, name);
users[uid] = new WeakReference(user);
return user;
}
}
/// <summary>
/// Adds an identity for the user on a specific hub.
/// </summary>
/// <param name="identity">The identity to add.</param>
public void AddIdentity(Identity identity)
{
if (identity == null)
{
throw new ArgumentNullException("identity");
}
lock (identities)
{
identities.Add(identity);
if (identities.Count == 1)
{
IsOnline = true;
}
}
}
/// <summary>
/// Removes an identity from the user.
/// </summary>
/// <param name="identity">The identity to remove.</param>
public void RemoveIdentity(Identity identity)
{
if (identity == null)
{
throw new ArgumentNullException("identity");
}
lock (identities)
{
identities.Remove(identity);
if (identities.Count == 0)
{
IsOnline = false;
}
}
}
/// <summary>
/// Checks if an identity has been added to a user.
/// </summary>
/// <param name="identity">The identity to check.</param>
/// <returns>True if the identity belongs to the user; otherwise, false.</returns>
public bool ContainsIdentity(Identity identity)
{
lock (identities)
{
return identities.Contains(identity);
}
}
public override bool Equals(object a)
{
return this == a;
}
public override int GetHashCode()
{
return uid.GetHashCode() << 1;
}
public override string ToString()
{
return String.Format("{0} ({1})", nick, uid);
}
/// <summary>
/// Emits the OnlineChaged event.
/// </summary>
protected void OnOnlineChanged()
{
if (OnlineChanged != null)
{
OnlineChanged(this, EventArgs.Empty);
}
}
#endregion
}
}
|