⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smgpconn.h

📁 SMAL是short message abstract library的缩写,是由风起水流软件工作室(www.zealware.com)开发的一个支持短信网关系统开发的C++底层抽象接口库
💻 H
📖 第 1 页 / 共 2 页
字号:
/**
*	smgpconn.h
*	
*	Short Message Abstractive Library.(SMAL)
*
*	Copyright 2003-2006	北京风起水流软件工作室
*	
*	http://www.zealware.com
*	
*	princetoad@gmail.com
*
*/

#ifndef _SMGP_CONNECTION_H
#define _SMGP_CONNECTION_H

#include <smal.h>
#include <common/util.h>
#include <list>
#include <smgp/smgp_message.h>
#include <common/tcpsocket.h>
#include <smgp/smgpbase.h>
#include <common/threadpool.h>

class SMGPClient;

/// SMGP连接类
/** 实现了一个SMGP连接,用户可以通过一个连接进行消息收发,连接本身具有活动测试,断开自动重连等功能.
*/
//##ModelId=46B5D43A00D1
class SMGPConnection : public CSmgp  
{
public:
/**@name Construction	*/
//@{
	/**构造函数
	 */
	//##ModelId=46B5D43A00DC
	SMGPConnection(
		SMGPClient           & _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 ConnectionType & _conntype,               ///< 连接类型
		const int            & _nActivetestInterval,    ///< 活动测试间隔
		const char           * _localhost = "",	        ///< 本地绑定地址
		const unsigned short & _localport = 0,	        ///< 本地绑定端口
		BOOL                 sync = TRUE		        ///< 是否同步,知道连接结束
		);

	/**初始化变量 
	*/
	//##ModelId=46B5D43A010D
	void Initialize();

	/**打印统计信息
	*/
	//##ModelId=46B5D43A0135
	virtual void DumpStatus();

	/**析构函数
	 */
	//##ModelId=46B5D43A015D
	virtual ~SMGPConnection();
	//@}

/**@name GetFunctions	*/
//@{
	/**得到所属的client 
	*/
	//##ModelId=46B5D43A017B
	SMGPClient & GetClient() const
	{		return client;	}

	/**得到连接标识 
	*/
	//##ModelId=46B5D43A0185
	const char * GetToken() const
	{		return token;		}

	/**得到网关地址 
	*/
	//##ModelId=46B5D43A018F
	const char * GetSmgHost() const
	{		return smghost;		}

	/**得到网关端口 
	*/
	//##ModelId=46B5D43A0199
	int GetSmgPort() const
	{		return (int)smgport;	}

	/**得到登录用户名 
	*/
	//##ModelId=46B5D43A019B
	const char * GetUserName() const
	{		return username;	}

	/**得到登录口令 
	*/
	//##ModelId=46B5D43A01A4
	const char * GetPassword() const
	{		return password;	}

	/**得到连接类型 
	*/
	//##ModelId=46B5D43A01AD
	ConnectionType GetConnectionType() const
	{		return conntype;	}

	/**得到发送的SUBMIT消息数 
	*/
	//##ModelId=46B5D43A01B7
	long GetSubmitCount() const
	{	return submitCount;		}

	/**得到发送成功的SUBMIT消息数 
	*/
	//##ModelId=46B5D43A01C1
	long GetSubmitSucceedCount() const
	{	return submitSucceedCount;		}

	/**得到发送失败的SUBMIT消息数 
	*/
	//##ModelId=46B5D43A01CB
	long GetSubmitFailedCount() const
	{	return submitFailedCount;		}

	/**得到失败的SUBMITResponse消息数 
	*/
	//##ModelId=46B5D43A01D5
	long GetRespFailedCount() const
	{	return respFailedCount;		}

	/**得到成功的SUBMITResponse消息数 
	*/
	//##ModelId=46B5D43A01D7
	long GetRespSucceedCount() const
	{	return respSucceedCount;		}

	/**得到收到的Deliver消息数 
	*/
	//##ModelId=46B5D43A01DF
	long GetDeliverCount() const
	{	return deliverCount;		}

	/**得到收到的StatusReport消息数 
	*/
	//##ModelId=46B5D43A01E9
	long GetStatusReportCount() const
	{	return sreportCount;		}

	/**当前连接是否忙碌 
	*/
	//##ModelId=46B5D43A01F3
	BOOL IsBusy() const
	{	return m_fBusy;		}

	/**设置当前连接忙闲状态 
	*/
	//##ModelId=46B5D43A01F5
	void SetBusy(BOOL status)
	{	m_fBusy = status;	}

	/**连接是否已经启动 
	*/
	//##ModelId=46B5D43A01FD
	BOOL IsOpened()
	{		return m_fLogined/* && m_fStarted*/;	}

	/**连接是否可用 
	*/
	//##ModelId=46B5D43A0207
	BOOL IsReady()
	{		return IsOpened() && !IsBusy();	}

	/**是否可以发送消息 
	*/
	//##ModelId=46B5D43A0208
	BOOL CanMakeSubmit()
	{		return (conntype != e_RecvOnly) && IsReady();	}

	//@}

	/**@name SMGP Command Function */
	//@{

	/**清除连接 */
	//##ModelId=46B5D43A0211
	void Clear();

	/**发送SUBMIT消息 
	*/
	//##ModelId=46B5D43A0225
	inline int Submit(
		smgp_submit & _message
	);

	/**主动发活动测试包 
	*/
	//##ModelId=46B5D43A0243
	inline int ActiveTest();
	//@}

	/**@name Callback functions */
	//@{
	/**登录网关成功时调用 
	*/
	//##ModelId=46B5D43A0257
	virtual void OnLogined();

	/**登录网关失败时调用 
	*/
	//##ModelId=46B5D43A0261
	virtual void OnLoginFailed( int errorCode );

	/**同网关连接断开时调用 
	*/
	//##ModelId=46B5D43A0275
	virtual void OnCleared();

	/**发送SUBMIT消息前调用,如果返回失败,则停止发送SUBMIT消息.
		在这里,只是简单地返回TRUE.
	 */
	//##ModelId=46B5D43A027F
	virtual BOOL OnSubmiting( smgp_submit _message );

	/**发送SUBMIT消息成功时调用 
	*/
	//##ModelId=46B5D43A0293
	virtual void OnSubmited( smgp_submit _message );

	/**发送SUBMIT消息失败时调用 */
	//##ModelId=46B5D43A029D
	virtual void OnSubmitFailed( smgp_submit _message );

	/**收到CONNECT_RESPONSE时调用 
	*/
	//##ModelId=46B5D43A02B1
	virtual void OnReceivedConnectResponse( smgp_connect_resp _message );

	/**收到Terminate消息时调用 
	*/
	//##ModelId=46B5D43A02BB
	virtual void OnReceivedTerminate();

	/**收到SUBMIT_RESPONSE时调用 
	*/
	//##ModelId=46B5D43A02CF
	virtual void OnReceivedSubmitResponse( smgp_submit_deliver_resp _message );

	/**收到Deliver消息时调用 
	*/
	//##ModelId=46B5D43A02D9
	virtual void OnReceivedDeliver( smgp_deliver _message );

	/**收到STATUS_REPORT时调用 
	*/
	//##ModelId=46B5D43A02E3
	virtual void OnReceivedStatusReport( smgp_deliver _message );

	/**收到活动测试消息时调用 
	*/
	//##ModelId=46B5D43A02ED
	virtual void OnReceivedActiveTest();

	/**收到活动测试回复消息时调用 
	*/
	//##ModelId=46B5D43A02F7
	virtual void OnReceivedActiveTestResponse();

	/**输出日志时调用
		格式化输出日志,默认是把内容//TRACE出来
	 */
	//##ModelId=46B5D43A030B
	virtual void OnLogWrite( LPCTSTR pchFmt, ... );
	//@}

	//##ModelId=46B5D43A030F
	BOOL isOK;

protected:

	/**建立网关连接,启动消息接收模块 
	*/
	//##ModelId=46B5D43A0315
	int CreateConnection();

	/**连接网关,登录网关 
	*/
	//##ModelId=46B5D43A031F
	int Connect( BOOL outputdebug = TRUE );

	/**断开连接 
	*/
	//##ModelId=46B5D43A033E
	void Terminate();

	/**接收SMG方面的所有消息 
	*/
	//##ModelId=46B5D43A035C
	inline int RecvSmgMsg(
		smgp_smgtosp * css, 
		unsigned int & nResult
		);

	/**用于接收消息 
	*/
	//##ModelId=46B5D43A0366
	static DWORD WINAPI RecvFunc( LPVOID pParam );

	//##ModelId=46B5D43A037A
	virtual DWORD RecvProc();
	//virtual DWORD RecvProcMO();

protected:
	//##ModelId=46B5D43A03A3
	SMGPClient     & client;					///< 所属client
	//##ModelId=46B5D43A03AC
	char           token[MAX_PATH];					///< 连接ID(YYMMDDhhmmsslll)
	//##ModelId=46B5D43A03B6
	char           localhost[MAX_PATH];			///< 本地绑定地址
	//##ModelId=46B5D43A03B7
	unsigned short localport;			///< 本地绑定端口
	//##ModelId=46B5D43A03C0
	char           smghost[MAX_PATH];				///< 网关地址
	//##ModelId=46B5D43A03CA
	unsigned short smgport;				///< 网关端口
	//##ModelId=46B5D43A03D4
	//unsigned char  smgversion;			///< 网关支持的最高版本号
	//##ModelId=46B5D43A03D5
	char           username[MAX_PATH];				///< 网关登录用户名
	//##ModelId=46B5D43A03DE
	char           password[MAX_PATH];				///< 网关登录口令
	//##ModelId=46B5D43B0001
	ConnectionType conntype;				///< 网关连接类型

	//##ModelId=46B5D43B000B
	TCPSocket      m_socket;				///< TCPSOCKET类
	//##ModelId=46B5D43B000F
	BOOL           m_fStop;				///< 停止标志.
	//##ModelId=46B5D43B0014
	BOOL           m_fLogined;			///< 是否成功登录
	//##ModelId=46B5D43B001E
	BOOL           m_fStarted;			///< 是否成功启动
	//##ModelId=46B5D43B001F
	BOOL           m_fBusy;				///< 是否正在发送消息

	//##ModelId=46B5D43B0028
	int            m_RetryInterval;///< 重试时间间隔(ms)
	//##ModelId=46B5D43B0029
	BOOL           m_fAutoResp;		///< 是否自动回复
	//##ModelId=46B5D43B0033
	MyCriticalSection m_socketCS;		///< socket句柄锁
	//##ModelId=46B5D43B003C
	HANDLE         m_hRecvThread;	///< 接收线程句柄.

	//##ModelId=46B5D43B0046
	char           connectTime[MAX_PATH];		///< 成功连接网关的时间
	//##ModelId=46B5D43B0047
	char           loginTime[MAX_PATH];			///< 成功登录时间
	//##ModelId=46B5D43B0050
	char           disconnectTime[MAX_PATH];	///< 断开时间

	//##ModelId=46B5D43B0051
	long           submitCount;		///< 提交的SUBMIT消息数
	//##ModelId=46B5D43B005A
	long           submitSucceedCount;	///< SUBMIT发送成功消息数
	//##ModelId=46B5D43B0064
	long           submitFailedCount;///< SUBMIT发送失败消息数
	//##ModelId=46B5D43B0065
	long           respSucceedCount;///< 收到的submitresponse消息数
	//##ModelId=46B5D43B006E
	long           respFailedCount;///< 收到的submitresponse消息数
	//##ModelId=46B5D43B0078
	long           deliverCount;		///< 收到的Deliver消息数
	//##ModelId=46B5D43B0082
	long           sreportCount;		///< 状态报告数
};

typedef std::list<SMGPConnection*> aList;

//
//用于处理消息和事件的线程池
//
//##ModelId=46B5D43B00F0
class CJobSmgp : public IJobDesc {
public:
	//##ModelId=46B5D43B00F2
	CJobSmgp(SMGPClient	& _client, SMGPConnection	& _connection, JobType _type);

	//##ModelId=46B5D43B00FC
	CJobSmgp(SMGPClient	& _client, SMGPConnection	& _connection, JobType _type, smgp_submit_deliver_resp _message);

	//##ModelId=46B5D43B010E
	CJobSmgp(SMGPClient	& _client, SMGPConnection	& _connection, JobType _type, smgp_deliver _message);

	//##ModelId=46B5D43B0118
	CJobSmgp(SMGPClient	& _client, SMGPConnection	& _connection, JobType _type, smgp_submit _message, int nResult = 0);

	//##ModelId=46B5D43B0122
	~CJobSmgp();

	//##ModelId=46B5D43B012C
	void	OnSendSubmit();
	//##ModelId=46B5D43B0136
	void	OnSubmitSucceed();
	//##ModelId=46B5D43B0137
	void	OnDeliver();
	//##ModelId=46B5D43B0140
	void	OnStatusReport();
	//##ModelId=46B5D43B014A
	void	OnActiveTestResponse();
	//##ModelId=46B5D43B0154
	void	OnActiveTest();
	//##ModelId=46B5D43B0155
	void	OnCancelResponse();
	//##ModelId=46B5D43B015E
	void	OnTerminate();
	//##ModelId=46B5D43B0168
	void	OnConnectResponse();
	//##ModelId=46B5D43B0169
	void	OnSubmitFailed();
	//##ModelId=46B5D43B017C
	void	OnSubmitResponse();
	//##ModelId=46B5D43B017D
	void	OnSubmiting();
	//##ModelId=46B5D43B0191
	JobType						type;

protected:
	//##ModelId=46B5D43B0196
	SMGPClient				& client;
	//##ModelId=46B5D43B019B
	SMGPConnection		& connection;
	//##ModelId=46B5D43B01A5
	smgp_submit				submitMsg;
	//##ModelId=46B5D43B01AF
	smgp_deliver			deliverMsg;
	//##ModelId=46B5D43B01B9
	smgp_connect_resp	connectRespMsg;
	//##ModelId=46B5D43B01C3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -