www.pudn.com > SMS.rar > MobileControl.h


// MobileControl.h: interface for the CMobileControl class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_MOBILECONTROL_H__EEC1B542_F4AC_4CF1_9E7E_8B6423BDB690__INCLUDED_) 
#define AFX_MOBILECONTROL_H__EEC1B542_F4AC_4CF1_9E7E_8B6423BDB690__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
#include "HwMobile.h" 
 
#ifndef _SMS_DISABLE 
// 收到短消息时回调这个函数来处理 
typedef LRESULT (*FUNC_ReceivedSMS) ( SM_PARAM *pSMRecv, WPARAM wParam, LPARAM lParam ); 
// 发送短消息完成时回调这个函数来处理 
typedef LRESULT (*FUNC_SendSMSEnd) ( ENUM_ERROR_TYPE eResult, SM_PARAM *psm, WPARAM wParam, LPARAM lParam ); 
 
// 两次选择电话本的时间间隔 (秒),否则选择将失败 
#define SELECT_PHONEBOOK_INTVERVAL	2 
// 最大短信队列数 
#define MAX_SMSQUEUE_NUM	99999 
// 初始化接口的时间间隔 ( 秒 ) 
#ifdef _DEBUG 
#define INITIALIZE_INTERFACE_INTERVAL	1 
#else 
#define INITIALIZE_INTERFACE_INTERVAL	3 
#endif 
// 完全相同的短信发送必须间隔的时长(秒) 
#define SAME_SMS_INTERVAL_TIMELONG		60 
 
typedef LRESULT (*FUNC_HandleMobileStatusChange) ( ENUM_ERROR_TYPE eMobileStatus_Old, ENUM_ERROR_TYPE eMobileStatus_New ); 
 
// 手机模块参数 
typedef struct _mobile_parameter 
{ 
	// ================ 以下是手机模块参数 ========================================= 
	BOOL bRecvSMSEnable;							// 允许接收短信 
	BOOL bSendSMSEnable;							// 允许发送短信 
	BOOL bAllowEchoSMS;								// 允许回应短信传递结果 
	TCHAR szSMSC[PHONENO_LENGTH];					// 短信中心号码 
	DWORD dwSMSWaiter_SMSSenderID;					// 短信服务者的ID号,当收到没有脚本的短信时由该用户处理 
	DWORD dwSMSCountPerSIM;							// 每张SIM卡发送多少条短信 
	BOOL bSMSSoundPrompt;							// 手机收发短信时是否提示声音 
	BOOL bSpecifyClusterMessengerMobileNO;			// 限制能群发文字传讯的手机号 
	TCHAR szLocalCountryCode[8];					// 本地国家代码 
	TCHAR szLocalAreaCode[8];						// 本地地区代码 
 
} t_MobileParameter; 
 
// 
// 手机号码字头 
// 
#define SMS_MobileNO_Format_CountryCode		0x00000001 
#define SMS_MobileNO_Format_AreaCode		0x00000002 
typedef struct _mobileNO_head 
{ 
	TCHAR szCountryCode[8];				// 国家代码 
	TCHAR szAreaCode[8];				// 地区代码 
	TCHAR szMobileNoHead[8];			// 手机字头 
	TCHAR szPrepositiveNO[8];			// 前置号码 
	DWORD dwMobileNOFormat;				// 字头格式 
	TCHAR szDesc[32];					// 描述 
} t_MobileNOHead; 
typedef CArray t_Ary_MobileNOHead; 
 
// 无效的 SMSSenderID ,有些函数需要传入SMSSenderID,但有时调用该函数时又不能提供SMSSenderID时,就可以使用这个无效的 SMSSenderID 了 
#define INVALID_SMSSenderID					0 
 
// 
// 手机短信类型 
// 
typedef enum _enum_MOBILESMSTYPE 
{ 
	ENUM_MOBILESMSTYPE_Invalid,					// 无效的状态 
	ENUM_MOBILESMSTYPE_Personal,				// 个人的短信 
	ENUM_MOBILESMSTYPE_ClusterAD,				// 群发的广告 
	ENUM_MOBILESMSTYPE_SysAutoSent,				// 系统自动发送的短信 
	ENUM_MOBILESMSTYPE_IncomingAD,				// 来电广告 
	ENUM_MOBILESMSTYPE_CtrlCmd,					// Callgle 控制码 
	ENUM_MOBILESMSTYPE_BirthdayBless,			// 生日祝福 
	ENUM_MOBILESMSTYPE_NUM, 
} ENUM_MOBILESMSTYPE; 
#define MOBILESMSTYPE_IS_VALID(e) ( (e) >= ENUM_MOBILESMSTYPE_Free && (e) < ENUM_MOBILESMSTYPE_NUM ) 
 
// 消息对方的类型 
typedef enum _enum_MsgPeerType 
{ 
	ENUM_MsgPeerType_Unknown, 
	ENUM_MsgPeerType_CallgleClient, 
	ENUM_MsgPeerType_Mobile, 
	ENUM_MsgPeerType_NUM, 
} ENUM_MsgPeerType; 
#define MsgPeerType_IS_VALID(e) ( (e) > ENUM_MsgPeerType_Unknown && (e) < ENUM_MsgPeerType_NUM ) 
 
class DLL_INTERNAL CMobileControl : public CHwMobile 
{ 
public: 
	int UnregisterGSMModule(); 
	BOOL m_bMustRegistered; 
	int RegisterGSMModule(); 
	BOOL GSMModuleIsRegistered (); 
	HANDLE m_EvtThreadCanRun;				// 如果该事件被置位表示线程可以运行了 
	DWORD* m_pdwSentSMSCount; 
	BOOL SMSEnable ( BOOL bEnable ); 
	// 运行状态 
	typedef enum _enum_run_state 
	{ 
		ENUM_RunState_Start,				// 开始 
		ENUM_RunState_Init,					// 初始化 
		ENUM_RunState_Runing,				// 正在运行 
		ENUM_RunState_NUM, 
	} ENUM_RunState; 
 
	static LPCTSTR GetObjectName(); 
	// 待发送的短信队列 
	typedef struct _sms_send_queue 
	{ 
		SM_PARAM sm;						// 要发送的短信 
		DWORD dwSMSSenderID_Sender; 
		FUNC_SendSMSEnd Proc_SendSMSEnd;	// 发送完成时通过该回调函数来通知请求者 
		WPARAM wParam; 
		LPARAM lParam; 
		ENUM_MOBILESMSTYPE eMobileSMSType; 
		ULONGLONG ullData; 
	} t_SMS_SendQueue; 
	typedef CArray t_Ary_SMS_SendQueue; 
 
	CMobileControl(); 
	virtual ~CMobileControl(); 
	inline void SetParameter ( t_MobileParameter *pMobileParameter, FUNC_ReceivedSMS Proc_ReceivedSMS, WPARAM wParam, LPARAM lParam, LPCTSTR lpszSMSHead, LPCTSTR lpszSMSTail ) 
	{ 
		m_pMobileParameter = pMobileParameter; 
		m_Proc_ReceivedSMS = Proc_ReceivedSMS; 
		m_wParam = wParam; 
		m_lParam = lParam; 
		if ( lpszSMSHead ) m_csSMSHead = lpszSMSHead; 
		if ( lpszSMSTail ) m_csSMSTail = lpszSMSTail; 
	} 
	BOOL ThreadProc_Mobile(); 
	int Runing(); 
	ENUM_ERROR_TYPE CMobileControl::SendSMS ( 
		ENUM_MOBILESMSTYPE eMobileSMSType, 
		LPCTSTR lpszReceiverMobileNO, 
		char* szSMSContent_Byte, 
		DWORD dwSMSSenderID_Sender=INVALID_SMSSenderID, 
		FUNC_SendSMSEnd Proc_SendSMSEnd=NULL, 
		WPARAM wParam=NULL, 
		LPARAM lParam=NULL 
	); 
	ENUM_ERROR_TYPE CMobileControl::SendOnePartSMS ( 
		ENUM_MOBILESMSTYPE eMobileSMSType, 
		LPCTSTR lpszReceiverMobileNO, 
		BOOL bInternationalMobileNO, 
		char *szSMSContent_Byte, 
		DWORD dwSMSSenderID_Sender=INVALID_SMSSenderID, 
		FUNC_SendSMSEnd Proc_SendSMSEnd=NULL, 
		WPARAM wParam=NULL, 
		LPARAM lParam=NULL 
	); 
	BOOL Init ( 
		BOOL bRunAsServer,			// 是否当作服务器运行 
		BOOL bRecvSMSEnable,		// 是否允许自动收取手机短信 
		HANDLE hEvt_TerminateSys, 
		int nComNO, 
		int nBaudRate 
	); 
	t_Ary_PhoneBook* ReadPhoneBook (); 
	int ParseSMSRecved (  
		IN LPCTSTR lpszSMSContent, 
		IN LPCTSTR lpszSenderMobileNO, 
		OUT CStringArray **ppStrAry_GroupName_Recver, 
		OUT CStringArray **ppStrAry_SMSSenderID_Recver, 
		OUT TCHAR *tchSMSContent, 
		int nSMSContentSize, 
		BOOL &bRequireEchoSMS, 
		LPCTSTR lpszSendTime 
	); 
	void ClearSendQueue (); 
	ENUM_ERROR_TYPE GetMobileStatus (); 
	FUNC_HandleMobileStatusChange m_Proc_HandleMobileStatusChange; 
	WPARAM m_paraHandleMobileStatusChange; 
	int IsMobileNO ( LPCTSTR lpszPhoneNO, t_MobileNOHead *pMobileNOHead=NULL, CString *pShortMobileNO=NULL ); 
	t_Ary_MobileNOHead m_Ary_MobileNOHead; 
	void ConfigParameter ( t_Ary_MobileNOHead *pAry_MobileNOHead ); 
	ENUM_ERROR_TYPE StandardMobileNO ( CString &csMobileNO, BOOL *pbInternationalMobileNO=NULL, CString *pSimplifyMobileNO=NULL ); 
 
private: 
	BOOL GetLocalCodeHead ( CString &csLocalCountryCode, CString &csLocalAreaCode ); 
	void GetRegisterPhoneBookInfo ( CStringArray &StrAry_PhoneNO, CStringArray &StrAry_Name ); 
	CString m_csMultiSplitSMSHead; 
	LRESULT ChangeMobileStatus( ENUM_ERROR_TYPE eMobileStatus_New ); 
	int m_InitializeInterfaceInterval; 
	CString m_csPartString; 
	ENUM_RunState m_eRunState; 
	BOOL m_bRecvSMSEnable; 
	BOOL m_bRunAsServer; 
	BOOL ReadExistSMSInMobile (); 
	BOOL SendSMSQueue (); 
	BOOL ReadNewSMS (); 
	BOOL SendOneSMSQueue ( t_SMS_SendQueue &SMS_SendQueue ); 
	BOOL AppTextToSMSContent ( SM_PARAM &sm, LPCTSTR lpszAppText, int &nFreeCharNum, BOOL bAddToHead ); 
	int HandleSMSCtrlCode (  
		IN LPCTSTR lpszSMSContent, 
		OUT CStringArray **ppStrAry_SMSSenderID_Recver, 
		OUT TCHAR *tchSMSContent, 
		int nSMSContentSize 
	); 
	int CompareNOHead ( LPCTSTR lpszPhoneNO, LPCTSTR lpszPhoneNOHead, BOOL bIgnoreHeadZero_PhoneNO, BOOL bIgnoreHeadZero_PhoneNOHead ); 
	LPCTSTR CheckHeadStr ( LPCTSTR lpszStr, LPCTSTR lpszHead1, LPCTSTR lpszHead2, LPCTSTR lpszHead3 ); 
	int HandleSMSCommon (  
		IN LPCTSTR lpszSMSContent, 
		IN LPCTSTR lpszSenderMobileNO, 
		OUT CStringArray **ppStrAry_GroupName_Recver, 
		OUT CStringArray **ppStrAry_SMSSenderID_Recver, 
		OUT TCHAR *tchSMSContent, 
		int nSMSContentSize, 
		ENUM_MOBILESMSTYPE &eMobileSMSType 
	); 
	BOOL ParseRecverAndContent ( 
		TCHAR *pHandlePos, 
		OUT CStringArray **ppStrAry_Recver, 
		OUT TCHAR *tchSMSContent, 
		int nSMSContentSize 
	); 
	int HandleSMSMultiRecver ( 
		IN LPCTSTR lpszSMSContent, 
		IN LPCTSTR lpszSenderMobileNO, 
		OUT CStringArray **ppStrAry_GroupName_Recver, 
		OUT TCHAR *tchSMSContent, 
		int nSMSContentSize 
	); 
	int HandleSMSSingleRecver ( 
		IN LPCTSTR lpszSMSContent, 
		IN LPCTSTR lpszSenderMobileNO, 
		OUT CStringArray **ppStrAry_SMSSenderID_Recver, 
		OUT TCHAR *tchSMSContent, 
		int nSMSContentSize 
	); 
	BOOL InitMobileControl (); 
	BOOL InitMobileModule ( int &nComNO ); 
	BOOL InitMobileOneCOM ( int nComNO ); 
	CString SimplifyMobileNO ( LPCTSTR lpszMobileNO ); 
	ENUM_ERROR_TYPE InfillSMParam (  
		OUT SM_PARAM &SmParam, 
		IN CString csReceiverMobileNO 
	); 
	ENUM_ERROR_TYPE StandardMobileNOHead ( CString &csMobileNOHead ); 
	int FindFromMobileNOHeadAry ( 
		LPCTSTR lpszPhoneNO, 
		CString &csCountryCode, 
		CString &csAreaCode 
	); 
 
	HANDLE m_hThread_Mobile; 
	// 短消息接收处理时的回调函数和参数 
	FUNC_ReceivedSMS m_Proc_ReceivedSMS; 
	WPARAM m_wParam; 
	LPARAM m_lParam; 
 
	// 短消息发送队列 
	t_Ary_SMS_SendQueue m_Ary_SMS_SendQueue; 
	CCriticalSection m_CSFor_SMSSendQueue; 
	HANDLE m_hEvt_SMSSendQueue; 
 
	ENUM_ERROR_TYPE m_eMobileStatus;			// 手机状态,如果是禁用了手机模块,这个状态值一直是“禁用”,直到被控制码启用以后才会改变 
	ENUM_ERROR_TYPE m_eMobileStatus_Real;		// 手机的真实状态,不管是禁用还是启用,手机当前的状态就保存到此了 
	CCriticalSection m_CSFor_MobileStatus; 
 
	HANDLE m_hEvt_TerminateSys; 
	int m_nComNO_UserDefine; 
	t_MobileParameter* m_pMobileParameter; 
	CString m_csSMSHead;						// 短信头,如果有空余位置,这个字符串会添加到短信的开头位置 
	CString m_csSMSTail;						// 短信尾,如果有空余位置,这个字符串会添加到短信的结尾位置 
 
protected: 
	virtual BOOL HandleRecvSMS(SM_PARAM *pSMRecv); 
	virtual int HandleCOMRW ( int nRet ); 
	void StandardShortMobileNO ( IN OUT CString &csShortMobileNO, IN LPCTSTR lpszMobileNOHead ); 
}; 
 
#endif 
 
#endif // !defined(AFX_MOBILECONTROL_H__EEC1B542_F4AC_4CF1_9E7E_8B6423BDB690__INCLUDED_)