using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FObjBase { public interface IFObj: IDisposable { FObjSys CurrObjSys { get; } /// /// OBJID /// 作为对外的接口,ID必须明确定义好,应该在构造函数时,作为参数传入; /// 对应只用于代理,ID按顺序排序,顺便。。。 /// UInt32 ID { get; set; } /// /// 通知连接成功,失败 /// /// 远端对应的连接代理, 里面有IP, 连接的状态 void ConnectNotify(IFConn from); /// /// 自己解析远端的数据; /// 当ProcessEx返回 非0, 系统解析数据,对应调用GetValue,SetValue,CallFunction,PushInfo /// 建议都返回 非0 /// /// 远端对应的连接代理 /// 远端的OBJID /// 交易码 /// 信息码 /// 信息内容 /// 返回数据 /// 0:成功;非0:不支持 int ProcessEx(IFConn from, UInt32 srcid, UInt32 magic, UInt16 info_no, byte[] infodata, out byte[] retdata); #region Server->Client /// /// 作为客户端, 服务器回复GetValue /// /// 与服务器的连接代理 /// 服务器的OBJID /// 成员ID /// 成员数据 void PushGetValue(IFConn from, UInt32 srcid, UInt16 memid, byte[] infodata); /// /// 作为客户端, 服务器回复CallFunction /// /// 与服务器的连接代理 /// 服务器的OBJID /// 交易号 /// 功能ID /// 回复的数据 /// 以前客户端调用CallFunction时,放入的函数指针 /// 以前客户端调用CallFunction时,放入的object void PushCallFunction(IFConn from, UInt32 srcid, UInt32 magic, UInt16 funcid, byte[] retdata,object AsyncDelegate, object AsyncState); /// /// 远端消息推送到本地 /// /// 远端对应的连接代理 /// 远端的OBJID /// 消息ID /// 消息数据 void PushInfo(IFConn from, UInt32 srcid, UInt16 infoid, byte[] infodata); /// /// 作为客户端, 服务器回复CallFunction, 回复数据为大包,显示进度 /// /// /// /// /// /// /// /// void PushCallFunctionBigSizeStatus(IFConn from, UInt32 srcid, UInt32 magic, UInt16 funcid, int total_size, int download_size, object AsyncState); #endregion #region Client->Server /// /// 远端获取本地成员数据 /// /// 远端对应的连接代理 /// 远端的OBJID /// 成员ID /// 成员数据 void GetValue(IFConn from,UInt32 srcid,UInt16 memid,out byte[] infodata); /// /// 远端设置本地成员数据 /// /// 远端对应的连接代理 /// 远端的OBJID /// 成员ID /// 成员数据 void SetValue(IFConn from,UInt32 srcid,UInt16 memid,byte[] infodata); /// /// 远端执行本地函数, 如果有数据返回,需要自己 SendMessageEx /// /// 远端对应的连接代理 /// 远端的OBJID /// 交易号 /// 函数ID /// 参数 void CallFunction(IFConn from, UInt32 srcid, UInt32 magic, UInt16 funcid, byte[] infodata); #endregion } /// /// obj 会自动加入到 objsys中,ID也会自动按顺序分配,也可以手动修改,但都应该在构造函数完成 /// public class FObj : IFObj { public FObj() { ID = 0; CurrObjSys.ObjAdd(this); } public FObj(int objsys_idx) { ID = 0; this.objsys_idx = objsys_idx; CurrObjSys.ObjAdd(this); } #region IFObj 成员 private int objsys_idx=0; public FObjSys CurrObjSys { get { return FObjSys.Currents[objsys_idx]; } } public virtual uint ID { get; set; } /// /// 连接通知事件 /// /// public virtual void ConnectNotify(IFConn from) { } public virtual int ProcessEx(IFConn from, uint srcid, uint magic, ushort info_no, byte[] infodata, out byte[] retdata) { retdata = null; return -1; } #region Server->Client /// /// 作为客户端 接收服务器 GetValue 回复 /// /// /// /// /// public virtual void PushGetValue(IFConn from, uint srcid, ushort memid, byte[] infodata) { } /// /// 作为客户端 接收服务器 CallFunction 回复 /// /// /// /// /// /// /// /// public virtual void PushCallFunction(IFConn from, uint srcid, UInt32 magic, ushort funcid, byte[] retdata, object AsyncDelegate, object AsyncState) { } /// /// 作为客户端 接收服务器 PushInfo 推送事件 /// /// /// /// /// public virtual void PushInfo(IFConn from, uint srcid, ushort infoid, byte[] infodata) { } /// /// 作为客户端, 服务器回复CallFunction, 回复数据为大包,显示进度 /// /// /// /// /// /// /// /// public virtual void PushCallFunctionBigSizeStatus(IFConn from, UInt32 srcid, UInt32 magic, UInt16 funcid, int total_size, int download_size, object AsyncState) { } #endregion #region Client->Server /// /// 作为服务器, 接收从客户端发送过来的 GetValue 请求 /// /// /// /// /// public virtual void GetValue(IFConn from, uint srcid, ushort memid, out byte[] infodata) { infodata = null; } /// /// 作为服务器, 接收从客户端发送过来的 SetValue 请求 /// /// /// /// /// public virtual void SetValue(IFConn from, uint srcid, ushort memid, byte[] infodata) { } /// /// 作为服务器, 接收从客户端发送过来的 CallFunction 请求 /// /// /// /// /// /// public virtual void CallFunction(IFConn from, uint srcid, UInt32 magic, ushort funcid, byte[] infodata) { } #endregion #endregion #region IDisposable 成员 public virtual void Dispose() { CurrObjSys.ObjRemove(this); } #endregion } }