📄 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_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 + -