using System;
namespace Jh.Sockets
{
 /// <summary>
 /// 线程状态信号定义
 /// </summary>
 public enum JhThreadStatus
 {
  Stop,    //停止
  Running,   //正在运行
  Exit    //已退出
 }
 /// <summary>
 /// 线程状态参数
 /// </summary>
 class Parm
 {
  public Parm(object obj):this(JhThreadStatus.Stop,obj)
  {
  }
  public Parm(JhThreadStatus nStatus,object obj)
  {
   Status = nStatus;
   ObjParm = obj;
  }
  JhThreadStatus status;
  object objParm;
  /// <summary>
  /// 上下文对象
  /// </summary>
  public object ObjParm
  {
   get
   {
    return objParm;
   }
   set
   {
    objParm = value;
   }
  }
  /// <summary>
  /// 控制状态
  /// </summary>
  public JhThreadStatus Status
  {
   get
   {
    return status;
   }
   set
   {
    status = value;
   }
  }
 }; 
 /// <summary>
 /// 通讯数据处理接口
 /// </summary>
 public interface  IObserver
 {
  //
  // 数据处理入口
  //
  void Deal(CommData cd);
  //
  // 数据处理重载方法.如果不希望后面的处理者继续处理数据,则返回true,否则返回false;
  //
  bool OnDeal(CommData cd);
  //
  // 附加的自身初始化操作
  //
  bool Init();
  //
  // 提前初始化接口
  //
  bool BeforeInit();
  //
  // 初始化后处理接口
  //
  bool AfterInit();
  //
  // 删除前处理接口
  //
  bool BeforeExit();
  //
  // 下一个观察者
  //
  IObserver Next
  {
   get;
   set;
  }
  //
  // 上一个观察者
  //
  IObserver Prev
  {
   get;
   set;
  }
  //
  // 添加观察者到后面,如果已经存在链表中则不做任何操作
  //
  void Add(IObserver observer);
  //
  // 插入观察者到下一个观察者的前面
  //
  void Insert(IObserver observer);
  //删除观察者
  void Remove(IObserver observer);
  //是否存在链表中
  bool IsExist(IObserver observer);
 }
 /// <summary>
 /// 通讯数据处理类的基类,只能派生
 /// </summary>
 public abstract class  Observer : IObserver
 {
  /// <summary>
  /// 数据处理入口.
  /// </summary>
  /// <param name="client">TcpClient类 实例</param>
  /// <param name="s">内存数据流</param>
  public void Deal(CommData cd)
  {
   cd.Data.Position = 0;
   if (OnDeal(cd) == false) return ;
   if (next != null)
   {
    next.Deal(cd);
   }
   return ;
  }
  /// <summary>
  /// 数据处理重载方法.
  /// </summary>
  /// <param name="client">TcpClient类 实例</param>
  /// <param name="s">内存数据流</param>
  /// <returns>处理结果,如果不希望后面的处理者继续处理数据,则返回false,否则返回true;</returns>
  public virtual bool OnDeal(CommData cd)
  {
   return true;
  }
  //附加的自身初始化操作
  public virtual bool Init()
  {
   return true;
  }
  //提前初始化接口
  public virtual bool BeforeInit()
  {
   return true;
  }
  //初始化后处理接口
  public virtual bool AfterInit()
  {
   return true;
  }
  //删除前处理接口
  public virtual bool BeforeExit()
  {
   return true;
  }
  //下一个观察者
  IObserver next = null;
  public IObserver Next
  {
   get
   {
    return next;
   }
   set
   {
    next = value;
   }
  }
  //上一个观察者
  IObserver prev = null;
  public IObserver Prev
  {
   get
   {
    return prev;
   }