📄 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"
/*
【 手机与callgle之间的短信通信协议 】
1、手机发短信给callgle
1.1 短信脚本:
1.1.1 #!##<SMSType>#[GroupName1,2,3 ...]#<SMS Content>
! : 表示发送结果需要回应
<SMSType> : 短信类型。公告、公众、公益
以上表示短信类型的代码可以由客户端程序界面修改。
[GroupName1] : 第一个群组名,指定接收的群组,如果不指定,就是发送给公司所有人。客户端可以锁定某些手机号码
具有这种“发给所有人”的权限,如果不锁定即所有手机都可以发送。
[GroupName2] : 第二个群组名
<SMS Content> : 短信内容本身
1.1.2 #!#<Recver1,Recver2,Recver3 ...>#<SMS Content>
! : 表示发送结果需要回应
<Recver1> : 第一个接收者PM帐号
<Recver2> : 第二个接收者名字或PM帐号
<SMS Content> : 短信内容本身
1.1.3 %<OptCommand>,<CtrlCode>%<None SMS>
<OptCommand> : 操作指令 0 - 无效; 1 - 续用(续租); 2 - 注入新安全码; 3 - 删除安全码; 4 - 停用; 5 - 恢复;
6 - 设置 Callgle 系统的基本数据;
<CtrlCmd> : 控制代码
<None SMS> : 不需要输入任何短信内容,输入也不起作用
1.1.4 <SMS Content>
<SMS Content> : 短信内容本身
这种短信未指定短信类型和接收者,如果发送者是callgle用户,即公司自己人,那么该短信会作为公开信息送给
公司所有人,否则,将送给某一指定用户,默认是系统管理员,可以在客户端修改这一配置。
1.1.5 #? 或者 #help
获取系统帮助
1.2 举例:
1.3.3 #101#同仁们:今天上海展销很成功
私聊短信,发送给PM帐号为101的用户,内容是“同仁们:今天上海展销很成功”。
1.2.2 ##1968#通知:明天下午全公司开作战会议
公告信息,发送给公司所有人,此时不需要指定接收者,指定了也不起作用,内容是“通知:明天
下午全公司开作战会议”
1.2.3 现在天气真热,大家要做好防暑准备
“现在天气真热,大家要做好防暑准备”这条短信会被送给系统管理员或者某一指定的短信管理员
1.2.4 #!##公告#开发部#昨天下午,谁最后一个离开公司,请告诉我一声
发给"开发部"的公告信息, 内容为"昨天下午,谁最后一个离开公司,请告诉我一声"。Callgle系统收到后会回应结果短信给发送者
1.2.5 %2384232*329#9232*934#24#%
通过手机给callgle发送续用码
2、callgle发短信给手机
没有特殊的规定,只要指定接收者,便可将要发送的短信文字发送出去,超过140个字符的会自动被分作多条短信来发送。
只是每条有空余17个位置的短信末尾会加上一句话“sent by \"callgle\"”
3、callgle自主发送短信
在以下几种情况,callgle会自主发送手机短信
3.1 当用户不在线,有来电时,如该用户有“不在线时可以收到短信通知”的短信权限,那么callgle会自主地将该来话信息
发送给他的手机。
3.2 当用户不在线,有文字传讯信息或公告信息时,如该用户有“不在线时可以收到短信通知”的短信权限,那么callgle会自主
地将该来话信息发送给他的手机。
3.3 当有人发送寻求帮助的信息时,callgle也会自主发送包含帮助信息的文字给求助者。
4、用户短信权限定义
每个用户都有一个短信权限,分别为:
4.1 允许发送短信
4.2 允许接收短信
4.2 不在线时可以收到短信通知
*/
#ifndef _2Lines
// 收到短消息时回调这个函数来处理
typedef LRESULT (*FUNC_ReceivedSMS) ( SM_PARAM *pSMRecv, WPARAM wParam, LPARAM lParam );
// 发送短消息完成时回调这个函数来处理
typedef LRESULT (*FUNC_SendSMSEnd) ( ENUM_ERROR_TYPE eResult, WPARAM wParam, LPARAM lParam );
// 两次选择电话本的时间间隔 (秒),否则选择将失败
#define SELECT_PHONEBOOK_INTVERVAL 2
// 最大短信队列数
#define MAX_SMSQUEUE_NUM 3000
// 初始化接口的时间间隔 ( 秒 )
#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 );
class DLL_INTERNAL CMobileControl : public CHwMobile
{
public:
HANDLE m_EvtThreadCanRun; // 如果该事件被置位表示线程可以运行了
t_MobileParameter* m_pMobileParameter;
DWORD* m_pdwSentSMSCount;
CHwMysql_PMData* m_pHwMysql_PMData;
CHwMysql_PMMsg* m_pHwMysql_PMMsg;
CHwMysql_PMFullPN* m_pHwMysql_PMFullPN;
BOOL SMSModuleEnable ( 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 dwPMAccount_Sender;
FUNC_SendSMSEnd Proc_SendSMSEnd; // 发送完成时通过该回调函数来通知请求者
WPARAM wParam;
LPARAM lParam;
ENUM_MOBILESMSTYPE eMobileSMSType;
} t_SMS_SendQueue;
typedef CArray<t_SMS_SendQueue,t_SMS_SendQueue&> t_Ary_SMS_SendQueue;
CMobileControl(LOG_FUNC ExternLog);
virtual ~CMobileControl();
inline void SetParameter ( FUNC_ReceivedSMS Proc_ReceivedSMS, WPARAM wParam, LPARAM lParam )
{
m_Proc_ReceivedSMS = Proc_ReceivedSMS;
m_wParam = wParam;
m_lParam = lParam;
}
BOOL ThreadProc_Mobile();
int Runing();
ENUM_ERROR_TYPE CMobileControl::SendSMS (
ENUM_MOBILESMSTYPE eMobileSMSType,
LPCTSTR lpszReceiverMobileNO,
LPCTSTR lpszSMSContent_Byte,
WCHAR *wzSMSContent_Wide=NULL,
DWORD dwPMAccount_Sender=INVALID_PMACCOUNT,
FUNC_SendSMSEnd Proc_SendSMSEnd=NULL,
WPARAM wParam=NULL,
LPARAM lParam=NULL
);
ENUM_ERROR_TYPE CMobileControl::SendOnePartSMS (
ENUM_MOBILESMSTYPE eMobileSMSType,
LPCTSTR lpszReceiverMobileNO,
BOOL bInternationalMobileNO,
LPCTSTR lpszSMSContent_Byte,
WCHAR *wzSMSContent_Wide=NULL,
DWORD dwPMAccount_Sender=INVALID_PMACCOUNT,
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_PMAccount_Recver,
OUT char *szSMSContent,
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:
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 ();
CString StandardSMSContent ( LPCTSTR lpszSMSContent );
BOOL SendOneSMSQueue ( t_SMS_SendQueue &SMS_SendQueue );
int HandleSMSCtrlCode (
IN LPCTSTR lpszSMSContent,
OUT CStringArray **ppStrAry_PMAccount_Recver,
OUT char *szSMSContent,
int nSMSContentSize
);
int CompareNOHead ( LPCTSTR lpszPhoneNO, LPCTSTR lpszPhoneNOHead, BOOL bSikpZeroBeforeCompare );
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_PMAccount_Recver,
OUT char *szSMSContent,
int nSMSContentSize,
ENUM_MOBILESMSTYPE &eMobileSMSType
);
BOOL ParseRecverAndContent (
char *pHandlePos,
OUT CStringArray **ppStrAry_Recver,
OUT char *szSMSContent,
int nSMSContentSize
);
int HandleSMSMultiRecver (
IN LPCTSTR lpszSMSContent,
IN LPCTSTR lpszSenderMobileNO,
OUT CStringArray **ppStrAry_GroupName_Recver,
OUT char *szSMSContent,
int nSMSContentSize
);
int HandleSMSSingleRecver (
IN LPCTSTR lpszSMSContent,
IN LPCTSTR lpszSenderMobileNO,
OUT CStringArray **ppStrAry_PMAccount_Recver,
OUT char *szSMSContent,
int nSMSContentSize
);
BOOL InitMobileControl ();
BOOL InitMobileModule ( int &nComNO );
BOOL InitMobileOneCOM ( int nComNO );
BOOL IsSameSMSType ( CString &csSMSType, CString csSMSType_Bulletin );
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;
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 + -