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

📄 mobilecontrol.h

📁 基于vc++6.0的收发手机短信、读写手机电话本的平台
💻 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_MobileNOHead,t_MobileNOHead&> 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_SMS_SendQueue,t_SMS_SendQueue&> 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_)

⌨️ 快捷键说明

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