Files
mir_server/server/SessionServer/AMClient_tx.h

146 lines
4.1 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/************************************************************************/
/*
/* AM(Amount Manager)金额管理系统客户端类
/*
/* 提供查询用户余额以及对用户进行扣费的操作接口。
/*
/************************************************************************/
class CSSManager;
class CAMClient :
public CCustomClientSocket
{
public:
typedef CCustomClientSocket Inherited;
//定义AM操作类型
enum eAMOPType
{
amQueryAmount = 1, //查询余额
amConsume = 2, //扣费
amPaySucceed =3, //充值成功了
};
//定义AM操作数据
typedef struct AMOPData
{
int opType; //操作类型
unsigned int nUserId; //用户ID
INT nServerId; //服务器ID
INT nResult; //负数表示失败或发生错误否则表示操作结果查询余额则表示余额扣费时为0表示成功-1表示余额不足
INT64 lOPPtr; //操作对象(客户端穿透服务器的数据)
}AMOPDATA, *PAMOPDATA;
typedef struct tagTASKMsg
{
INT nServerId;//服务器Id
unsigned int nUserId; //UserID 账号id
INT nCmd;
INT nContractid; //任务id
INT nStep;
INT nResult; //返回值
INT64 lOPPtr;//操作对象(客户端穿透服务器的数据)
}TASKMSG, *PTASKMSG;
public:
CAMClient();
~CAMClient();
static char * GetOpCode(int nOp)
{
switch(nOp)
{
case amQueryAmount:
return "Query Yb";
break;
case amConsume:
return "Draw Yb";
break;
case amPaySucceed:
return "Pay Ok";
break;
default:
return "Error op";
}
}
/*
* Comments: AM操作结果队列
* Param wylib::container::CBaseList<AMOPDATA> & list:
* @Return INT_PTR: list中保存了多少个操作结果
* @REMARKS: list后会清空类本身内部的操作结果
*/
INT_PTR GetAMOPResults(wylib::container::CBaseList<AMOPDATA> &list);
INT_PTR GetTaskOPResults(wylib::container::CBaseList<TASKMSG> &list);
/*
* Comments:
* Param INT_PTR nUserId: ID
* Param INT_PTR nServerId: ID
* Param INT64 lOPPtr: 穿
* @Return VOID:
*/
VOID PostQueryAmount(unsigned int nUserId, INT_PTR nServerId, INT64 lOPPtr);
/*
* Comments:
* Param INT_PTR nUserId: ID
* Param INT_PTR nServerId: ID
* Param INT_PTR nAmount:
* Param LPCSTR sCharName:
* Param INT64 lOPPtr:id
* Param BYTE nLevel:
* @Return VOID:
*/
VOID PostConsume(unsigned int nUserId, INT_PTR nServerId, INT_PTR nAmount, LPCSTR sCharName, INT64 lOPPtr, BYTE nLevel);
//发送集市任务等信息给am
VOID PostAmTaskData(tagTASKMsg &data);
public:
//获取产品名称
LPCSTR GetProductName();
//设置产品名称
VOID SetProductName(LPCSTR sProductName);
//获取SPID
LPCSTR GetSPID();
//设置SPID
VOID SetSPID(LPCSTR sSPID);
protected:
//处理接受到的服务器数据包
VOID ProcessRecvBuffers(PDATABUFFER pDataBuffer);
//连接到服务器成功后发送注册客户端的消息
VOID SendRegisteClient();
//当长时间没有通信后发送保持连接的消息
VOID SendKeepAlive();
private:
//处理单个通信数据包
VOID ProcessRecvPacket(CDataPacketReader &packet);
//重载申请数据包的函数,在包头写入数据包起始标志
//CDataPacket& allocSendPacket();
CDataPacket& allocProtoPacket(int nCmd);
//重载提交数据包的函数,在包尾写入数据包起始标志
VOID flushProtoPacket(CDataPacket& packet);
VOID OnDispatchRecvPacket(int nCmd, CDataPacketReader &inPacket) ;
private:
//CHAR m_RecvForCompilerError[1024];//VC2010 编译器BUG编译后会使得此类的成员地址与父类成员相交因此此处腾出1K字节避开此BUG
CHAR m_sProductName[32]; //产品名称
CHAR m_sProviderId[32]; //SPID
wylib::container::CQueueList<AMOPDATA> m_OPResultList;//操作结果队列
wylib::container::CQueueList<TASKMSG> m_OPRTaskList;//操作结果队列
CCSLock m_OPResultLock; //操作结果队列锁
CCSLock m_OPTaskLock; //操作结果队列锁
};