using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Perforce.P4
{
	/// 
	/// The tagged output of a command.
	/// 
	public class TaggedObject : Dictionary
	{
		/// 
		/// Basic constrictor
		/// 
		public TaggedObject() : base() { }
		/// 
		/// Copy constructor
		/// 
		/// Source object
		public TaggedObject(TaggedObject obj) : base(obj) { }
	};
	/// 
	/// A list of tagged objects.
	/// 
	public class TaggedObjectList : List 
    {
        public TaggedObjectList() : base() { }
        public TaggedObjectList(int capcity) : base(capcity) { }
        public static explicit operator TaggedObjectList(SimpleList l)
        {
            if (l.Head == null)
            {
                return null;
            }
            TaggedObjectList value = new TaggedObjectList(l.Count);
            SimpleListItem curItem = l.Head;
            while (curItem != null)
            {
                value.Add(curItem.Item);
                curItem = curItem.Next;
            }
            return value;
        }
    };
	///// 
	///// List of info messages.
	///// 
	//public class InfoList : List
	//{
	//    /// 
	//    /// Cast to a String[].
	//    /// 
	//    /// 
	//    /// 
	//    public static implicit operator String[](InfoList l)
	//    {
	//        String[] r = new String[l.Count];
	//        int idx = 0;
	//        foreach (InfoLine i in l)
	//            r[idx++] = i.ToString();
	//        return r;
	//    }
	//    /// 
	//    /// Cast to a String. Messages are separated by \r\n
	//    /// 
	//    /// 
	//    /// 
	//    public static implicit operator String(InfoList l)
	//    {
	//        StringBuilder r = new StringBuilder(l.Count * 80);
	//        foreach (InfoLine i in l)
	//        {
	//            r.Append(i.ToString());
	//            r.Append("/r/n");
	//        }
	//        return r.ToString();
	//    }
	//}
	///// 
	///// A single line of output from an 'info' message.
	///// 
	//public class InfoLine
	//{
	//    /// 
	//    /// The level of the message (0-9)
	//    /// 
	//    public int Level;
	//    /// 
	//    /// The level of the message (0-9)
	//    /// 
	//    public uint CommandId;
	//    /// 
	//    /// The message
	//    /// 
	//    public String Info;
	//    /// 
	//    /// Create a new InfoLine
	//    /// 
	//    /// Level of the message
	//    /// Message text.
	//    public InfoLine(uint cmdId, int nLevel, String nInfo)
	//    {
	//        CommandId = cmdId;
	//        Level = nLevel;
	//        Info = nInfo;
	//    }
	//    /// 
	//    /// Convert the info to text
	//    /// 
	//    /// String representation
	//    public override string ToString()
	//    {
	//        String levelDots = String.Empty;
	//        for (int idx = 0; idx < Level; idx++)
	//            levelDots += ".";
	//        return String.Format("{0}{1}", levelDots, Info);
	//    }
	//}
	/// 
	/// Base class for objects returned by a command as 'tagged' data.
	/// 
	/// 
	/// Contains a Hashtable of the field values for the object.
	/// Derived object can provide properties to directly access
	/// their standard attributes.
	/// 
	public class TaggedInfoItem : TaggedObject
	{
		private String name;
		/// 
		/// String that that is the field that identifies this object
		/// 
		public String Name
		{
			get { return name; }
		}
		/// 
		/// The raw data returned from the server
		/// 
		public TaggedObject ItemData
		{
			get { return (TaggedObject)this; }
		}
		/// 
		/// Default constructer
		/// 
		public TaggedInfoItem()
		{
			name = String.Empty;
		}
	}
}