📄 imppconn.h
字号:
/**
* imppconn.h
*
* Short Message Abstractive Library.(SMAL)
*
* Copyright 2003-2006 北京风起水流软件工作室
*
* http://www.zealware.com
*
* princetoad@gmail.com
*
*/
#ifndef _IMPP_CONNECTION_H
#define _IMPP_CONNECTION_H
#include <smal.h>
#include <common/util.h>
#include <list>
#include <impp/impp_message.h>
#include <common/tcpsocket.h>
#include <impp/imppbase.h>
#include <common/threadpool.h>
class CImppServer;
class IMPPClient;
///////////////////////////////////////////////////////////////////////////////
//
//##ModelId=46B5D43000AE
class IMPPConnection : public CImpp
{
public:
/**@name Construction */
//@{
/**构造函数
*/
//##ModelId=46B5D43000C2
IMPPConnection(
IMPPClient & _client, ///< connection所属的client
const char * _token, ///< connection的标识
const char * _smghost, ///< 网关地址
const unsigned short & _smgport, ///< 网关端口
const unsigned char & _smgversion, ///< 网关版本号
const char * _username, ///< 登录用户名
const char * _password, ///< 登录口令
const int & _nActivetestInterval, ///< 活动测试间隔
BOOL sync = TRUE ///< 是否同步,直到连接建立
);
/**打印统计信息
*/
//##ModelId=46B5D430011C
virtual void DumpStatus();
/**析构函数
*/
//##ModelId=46B5D430016C
virtual ~IMPPConnection();
//@}
/**@name GetFunctions */
//@{
/**得到连接所属的client
*/
//##ModelId=46B5D43001BD
IMPPClient & GetClient() const
{ return client; }
/**得到连接标识
*/
//##ModelId=46B5D43001DC
const char * GetToken() const
{ return token; }
/**得到网关地址
*/
//##ModelId=46B5D430020D
const char * GetSmgHost() const
{ return smghost; }
/**得到网关端口
*/
//##ModelId=46B5D4300221
int GetSmgPort() const
{ return (int)smgport; }
/**得到登录用户名
*/
//##ModelId=46B5D430022B
const char * GetUserName() const
{ return username; }
/**得到登录口令
*/
//##ModelId=46B5D4300235
const char * GetPassword() const
{ return password; }
/**得到发送的SUBMIT消息数
*/
//##ModelId=46B5D4300237
long GetSubmitCount() const
{ return submitCount; }
/**得到发送成功的SUBMIT消息数
*/
//##ModelId=46B5D430023F
long GetSubmitSucceedCount() const
{ return submitSucceedCount; }
/**得到发送失败的SUBMIT消息数
*/
//##ModelId=46B5D4300249
long GetSubmitFailedCount() const
{ return submitFailedCount; }
/**得到失败的SUBMITResponse消息数
*/
//##ModelId=46B5D4300253
long GetRespFailedCount() const
{ return respFailedCount; }
/**得到成功的SUBMITResponse消息数
*/
//##ModelId=46B5D430025D
long GetRespSucceedCount() const
{ return respSucceedCount; }
/**得到收到的Deliver消息数
*/
//##ModelId=46B5D4300267
long GetDeliverCount() const
{ return deliverCount; }
/**得到收到的StatusReport消息数
*/
//##ModelId=46B5D4300271
long GetStatusReportCount() const
{ return sreportCount; }
/**当前连接是否忙碌
*/
//##ModelId=46B5D430027B
BOOL IsBusy() const
{ return m_fBusy; }
/**设置当前连接忙闲状态
*/
//##ModelId=46B5D4300285
void SetBusy(BOOL status)
{ m_fBusy = status; }
/**连接是否已经启动
*/
//##ModelId=46B5D430028F
BOOL IsOpened()
{ return m_fLogined && m_fStarted; }
/**连接是否可用
*/
//##ModelId=46B5D4300299
BOOL IsReady()
{ return IsOpened() && !IsBusy(); }
/**是否可以发送消息
*/
//##ModelId=46B5D430029A
BOOL CanMakeSubmit()
{ return IsReady(); }
//{ return (conntype > e_RecvOnly) && IsReady(); }
//@}
/**@name IMPP Command Function */
//@{
/**发送SUBMIT消息
*/
//##ModelId=46B5D43002A3
inline int Submit(
impp_submit & _message
);
/**主动发活动测试包
*/
//##ModelId=46B5D43002CB
inline int ActiveTest();
//@}
/**@name Callback functions */
//@{
/**登录网关成功时调用
*/
//##ModelId=46B5D43002F3
virtual void OnLogined();
/**登录网关失败时调用
*/
//##ModelId=46B5D4300311
virtual void OnLoginFailed(int errorCode);
/**同网关连接断开时调用
*/
//##ModelId=46B5D4300325
virtual void OnCleared();
/**发送SUBMIT消息前调用,如果返回失败,则停止发送SUBMIT消息.
在这里,只是简单地返回TRUE.
*/
//##ModelId=46B5D4300343
virtual BOOL OnSubmiting(impp_submit _message);
/**发送SUBMIT消息成功时调用
*/
//##ModelId=46B5D4300361
virtual void OnSubmited(impp_submit _message);
/**发送SUBMIT消息失败时调用
*/
//##ModelId=46B5D4300375
virtual void OnSubmitFailed(impp_submit _message);
/**收到CONNECT_RESPONSE时调用
*/
//##ModelId=46B5D4300393
virtual void OnReceivedConnectResponse(impp_connect_resp _message);
/**收到Terminate消息时调用
*/
//##ModelId=46B5D43003B1
virtual void OnReceivedTerminate();
/**收到SUBMIT_RESPONSE时调用
*/
//##ModelId=46B5D43003C5
virtual void OnReceivedSubmitResponse(impp_submit_deliver_resp _message);
/**收到Deliver消息时调用
*/
//##ModelId=46B5D43003D9
virtual void OnReceivedDeliver(impp_deliver _message);
/**收到STATUS_REPORT时调用
*/
//##ModelId=46B5D431000F
virtual void OnReceivedStatusReport(impp_deliver _message);
/**收到活动测试消息时调用
*/
//##ModelId=46B5D4310023
virtual void OnReceivedActiveTest();
/**收到活动测试回复消息时调用
*/
//##ModelId=46B5D4310037
virtual void OnReceivedActiveTestResponse();
/**输出日志时调用
格式化输出日志,默认是把内容//TRACE出来
*/
//##ModelId=46B5D431004C
virtual void OnLogWrite(LPCTSTR pchFmt, ...);
//@}
//##ModelId=46B5D4310059
BOOL isOK;
/**清除连接
*/
//##ModelId=46B5D4310060
void Clear();
protected:
/**初始化变量
*/
//##ModelId=46B5D431007E
void Initialize();
/**建立网关连接
*/
//##ModelId=46B5D43100A6
int CreateConnection();
/**连接并尝试登录网关
*/
//##ModelId=46B5D43100C4
int Connect();
/**断开连接
*/
//##ModelId=46B5D43100F6
void Terminate();
/**接收SMG方面的所有消息
*/
//##ModelId=46B5D431011E
inline int RecvSmgMsg(
impp_smgtosp * css,
unsigned long & nResult
);
///**接收CP方面的所有消息
//*/
//inline int RecvCPMsg(
// impp_sptosmg * css,
// unsigned long & nResult
// );
/**用于接收消息
*/
//##ModelId=46B5D4310146
static DWORD WINAPI RecvFunc(LPVOID pParam);
//##ModelId=46B5D4310164
virtual DWORD RecvProc();
//static DWORD WINAPI RecvCPFunc(LPVOID pParam);
//virtual DWORD RecvCPProc();
private:
//protected:
//##ModelId=46B5D4310183
IMPPClient & client; ///< 所属client
//##ModelId=46B5D431018C
char token[MAX_PATH]; ///< 连接ID(YYMMDDhhmmsslll)
//##ModelId=46B5D4310196
char smghost[MAX_PATH]; ///< 网关地址
//##ModelId=46B5D4310197
unsigned short smgport; ///< 网关端口
//##ModelId=46B5D43101A0
unsigned char smgversion; ///< 网关支持的最高版本号
//##ModelId=46B5D43101AA
char username[MAX_PATH]; ///< 网关登录用户名
//##ModelId=46B5D43101AB
char password[MAX_PATH]; ///< 网关登录口令
//##ModelId=46B5D43101B5
TCPSocket m_socket; ///< TCPSOCKET类
//##ModelId=46B5D43101BE
BOOL m_fStop; ///< 停止标志.
//##ModelId=46B5D43101C8
BOOL m_fLogined; ///< 是否成功登录
//##ModelId=46B5D43101C9
BOOL m_fStarted; ///< 是否成功启动
//##ModelId=46B5D43101D2
BOOL m_fBusy; ///< 是否正在发送消息
//##ModelId=46B5D43101DC
int m_RetryInterval;///< 重试时间间隔(ms)
//##ModelId=46B5D43101DD
BOOL m_fAutoResp; ///< 是否自动回复
//##ModelId=46B5D43101E7
MyCriticalSection m_socketCS; ///< socket句柄锁
//##ModelId=46B5D43101F0
HANDLE m_hRecvThread; ///< 接收线程句柄.
//##ModelId=46B5D43101F1
char connectTime[MAX_PATH]; ///< 成功连接网关的时间
//##ModelId=46B5D43101FA
char loginTime[MAX_PATH]; ///< 成功登录时间
//##ModelId=46B5D4310204
char disconnectTime[MAX_PATH]; ///< 断开时间
//##ModelId=46B5D4310205
long submitCount; ///< 提交的SUBMIT消息数
//##ModelId=46B5D4310218
long submitSucceedCount; ///< SUBMIT发送成功消息数
//##ModelId=46B5D4310219
long submitFailedCount;///< SUBMIT发送失败消息数
//##ModelId=46B5D4310222
long respSucceedCount;///< 收到的submitresponse消息数
//##ModelId=46B5D431022C
long respFailedCount;///< 收到的submitresponse消息数
//##ModelId=46B5D431022D
long deliverCount; ///< 收到的Deliver消息数
//##ModelId=46B5D4310236
long sreportCount; ///< 状态报告数
};
///////////////////////////////////////////////////////////////////////////////
//
//##ModelId=46B5D431029A
class CJobImppClient : public IJobDesc {
public:
//##ModelId=46B5D43102A5
CJobImppClient(IMPPClient & _client, IMPPConnection & _connection, JobType _type);
//##ModelId=46B5D43102B8
CJobImppClient(IMPPClient & _client, IMPPConnection & _connection, JobType _type, impp_submit_deliver_resp _message);
//##ModelId=46B5D43102D6
CJobImppClient(IMPPClient & _client, IMPPConnection & _connection, JobType _type, impp_deliver _message);
//##ModelId=46B5D43102EA
CJobImppClient(IMPPClient & _client, IMPPConnection & _connection, JobType _type, impp_submit _message, int nResult = 0);
//##ModelId=46B5D43102FE
~CJobImppClient();
//##ModelId=46B5D4310313
void OnSendSubmit();
//##ModelId=46B5D4310327
void OnSubmitSucceed();
//##ModelId=46B5D431033B
void OnDeliver();
//##ModelId=46B5D4310345
void OnStatusReport();
//##ModelId=46B5D4310359
void OnActiveTestResponse();
//##ModelId=46B5D431036D
void OnActiveTest();
//##ModelId=46B5D4310381
void OnTerminate();
//##ModelId=46B5D4310395
void OnConnectResponse();
//##ModelId=46B5D43103A9
void OnSubmitFailed();
//##ModelId=46B5D43103B3
void OnSubmitResponse();
//##ModelId=46B5D43103C7
void OnSubmiting();
//##ModelId=46B5D43103DC
JobType type;
protected:
//##ModelId=46B5D43103E6
IMPPClient & client;
//##ModelId=46B5D4320008
IMPPConnection & connection;
//##ModelId=46B5D4320011
impp_submit submitMsg;
//##ModelId=46B5D4320016
impp_deliver deliverMsg;
//##ModelId=46B5D432001C
impp_connect_resp connectRespMsg;
//##ModelId=46B5D4320026
impp_submit_deliver_resp submitRespMsg;
//##ModelId=46B5D432002F
int nResult;
};
//##ModelId=46B5D4320043
class CWorkerImppClient : public IWorker {
//##ModelId=46B5D4320045
virtual void ProcessJob( IJobDesc* pJobDesc );
};
///////////////////////////////////////////////////////////////////////////////
//
//##ModelId=46B5D4320061
typedef std::list<IMPPConnection*> aIMPPList;
//##ModelId=46B5D4320129
class IMPPClient
{
public:
/**@name Construction */
//@{
//##ModelId=46B5D4320133
IMPPClient();
//##ModelId=46B5D432013D
virtual ~IMPPClient();
//@}
/**@name GetFunctions */
//@{
/**得到提交的SUBMIT消息数
*/
//##ModelId=46B5D4320151
long GetSubmitCount() const
{ return submitCountTotal; }
/**得到发送成功的SUBMIT消息数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -