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

📄 imppconn.h

📁 SMAL是short message abstract library的缩写,是由风起水流软件工作室(www.zealware.com)开发的一个支持短信网关系统开发的C++底层抽象接口库
💻 H
📖 第 1 页 / 共 2 页
字号:
/**
*	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 + -