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
}
}