#pragma once

//////////////////////////////////////////////////////////////////////////
	#define    BUFFER_SIZE           450000
	#define    MAXTHREAD_COUNT       16
	#ifdef _DEBUG
		#define    MAX_LOGINUSER         20     //最大支持同时在线的用户数
	#else
#ifdef _UNICODE
		#define    MAX_LOGINUSER         1000     //最大支持同时在线的用户数
#else
		#define    MAX_LOGINUSER         500     //最大支持同时在线的用户数
#endif
		#ifdef SMSCENTER_TZY
			#undef MAX_LOGINUSER
			#define    MAX_LOGINUSER         150     //最大支持同时在线的用户数
		#endif
		#ifdef SMSCENTER_TWO
			#undef MAX_LOGINUSER
			#define    MAX_LOGINUSER         300     //最大支持同时在线的用户数
		#endif
		#ifdef SMSCENTER_NX
			#undef MAX_LOGINUSER
			#define    MAX_LOGINUSER         200     //最大支持同时在线的用户数
		#endif
	#endif

#define    MIN_SQLCONNECT        15       //最小同时连接SQL数据库
#define    MAX_SQLCONNECT        150      //最大同时连接SQL数据库

#define    SQL_TIMEOUT_USE      30*60*1000    //使用状态中的SQL,30分钟超时
#define    SQL_TIMEOUT_DISUSE   15*60*1000    //非使用中的SQL,15分钟超时

//////////////////////////////////////////////////////////////////////////

//
//完成端口完成的事件
//
typedef enum
{
		IOCP_COMPLETE_NULL,
		IOCP_COMPLETE_READ,
		IOCP_COMPLETE_ACCEPT_READ,
		IOCP_COMPLETE_WRITE,
		IOCP_COMPLETE_ACCEPT
}IOCP_COMPLETE_STATE;

//
//自定义枚举数据类型,用来标识套接字IO动作类型
//
typedef enum 
{
		IOCP_NULL, //AcceptEx/accept
        IOCP_ACCEPT, //AcceptEx/accept
		IOCP_READ,   //WSARecv/recv/ReadFile
		IOCP_WRITE,   //WSASend/send/WriteFile
		IOCP_END,
		IOCP_WRITE2,   //WSASend/send/WriteFile
}IOCP_OPERATION, *IOCP_OPERATION_PTR;

//
//自定义结构,即“完成键”(单句柄数据)
//
typedef struct
{
	SOCKET                     socket;
	long                       lRandID;
}IOCP_KEY,*IOCP_KEY_PTR;

//
//标志SOCKET的当前状态
//
enum
{
	SOCKET_STATE_NOT_CONNECT,
	SOCKET_STATE_CONNECT,
	SOCKET_STATE_CONNECT_AND_READ,
	SOCKET_STATE_TIMEOUT
};


//用于接收的IO
typedef struct 
{
	WSAOVERLAPPED				ol;
	SOCKET						socket;
	IOCP_OPERATION				operation;
	volatile int				state;
	long                        lRandID;   //判断状态用
	WSABUF                      wsaBuf;   //共有5个可用的head用于发送
}IOCP_IO_SEND,*IOCP_IO_SEND_PTR;

//
//单IO数据,扩展的WSAOVERLAPPED
//
typedef struct 
{
	WSAOVERLAPPED				ol;
	SOCKET						socket;
	IOCP_OPERATION				operation;
	volatile int				state;
	long                        lRandID;   //判断状态用
	WSABUF						wsaBuf;
	long                        lRecvLen;


	//原来用于ProcessSocket的数据
	TCHAR       m_szIP[32];         //对方的ip
	UINT       m_lPort;            //对方的端口
	UINT       m_lLocalPort;       //本地端口
	SYSTEMTIME m_LoginTime;        //登录时间
	TCHAR       m_szCorpName[96];   //企业名称
	TCHAR       m_szLoginName[32];  //登录名称
	long       m_lLoginCount;      //登录次数
	UCHAR      m_ucUserType;       //用户类型
	long       m_lCorpID;          //企业ID
	long       m_lUserID;          //用户ID
	long       m_lAgentID;         //此企业的代理商ID
	long       m_lYWYAgent;
	long       m_lAgentType;       //代理类型
	ULONG      m_ulPurviewType;    //权限类型
	ULONG      m_ulPurview;        //权限
	long       m_lVer;
	long       m_lAccessGroup;     //允许操作的通讯录组

	BOOL       m_bCheckup;

	BOOL       m_bCompress;        //发送数据时,是否压缩
	DWORD      m_dwSendCount;      //发送计数,用于控制优先级
	DWORD      m_dwLastSend;       //最后发送时间,用于区别是否需要重新计数
	long       m_lFStep;           //敏感字级别
	ULONG      m_lID;
	BOOL       m_bCmpp;            //是否Cmpp协议
	long       m_lSDK;             //SDK类型

	DWORD      dwAcceptTime;         //接收连接的时间
	DWORD      dwEndRecvFrame;       //最后收到帧的时间
	IOCP_KEY_PTR pKey;               //对应的key参数
//	IOCP_IO_SEND IOS;

	char 						buf[BUFFER_SIZE];
}IOCP_IO,*IOCP_IO_PTR;


typedef struct 
{
	BOOL            bUse;
	long            lRandID;
	CAdoConnection  adoConnection;
	DWORD           dwBeginUse;
	DWORD           dwEndUse;
	long            lFuncID;
	long            lUserID;
}IOCP_SQL,*IOCP_SQL_PTR;



//CMPP 协议参数与结构定义

#define      CMPP_CONNECT	         0x00000001  //请求连接
#define      CMPP_CONNECT_RESP	     0x80000001  //请求连接应答
#define      CMPP_TERMINATE	         0x00000002  //终止连接
#define      CMPP_TERMINATE_RESP	 0x80000002  //终止连接应答
#define      CMPP_SUBMIT             0x00000004  //提交短信
#define      CMPP_SUBMIT_RESP        0x80000004  //提交短信应答
#define      CMPP_DELIVER            0x00000005  //短信下发
#define      CMPP_DELIVER_RESP       0x80000005  //下发短信应答
#define      CMPP_QUERY              0x00000006  //发送短信状态查询
#define      CMPP_QUERY_RESP         0x80000006  //发送短信状态查询应答
#define      CMPP_CANCEL             0x00000007  //删除短信
#define      CMPP_CANCEL_RESP        0x80000007  //删除短信应答
#define      CMPP_ACTIVE_TEST        0x00000008  //激活测试
#define      CMPP_ACTIVE_TEST_RESP   0x80000008  //激活测试应答
#define      CMPP_FWD                0x00000009  //消息前转
#define      CMPP_FWD_RESP           0x80000009  //消息前转应答
#define      CMPP_MT_ROUTE           0x00000010  //MT路由请求
#define      CMPP_MT_ROUTE_RESP      0x80000010  //MT路由请求应答
#define      CMPP_MO_ROUTE           0x00000011  //MO路由请求
#define      CMPP_MO_ROUTE_RESP      0x80000011  //MO路由请求应答
#define      CMPP_GET_ROUTE          0x00000012  //获取路由请求
#define      CMPP_GET_ROUTE_RESP     0x80000012  //获取路由请求应答
#define      CMPP_MT_ROUTE_UPDATE    0x00000013  //MT路由更新
#define      CMPP_MT_ROUTE_UPDATE_RESP       0x80000013  //MT路由更新应答
#define      CMPP_MO_ROUTE_UPDATE            0x00000014  //MO路由更新
#define      CMPP_MO_ROUTE_UPDATE_RESP       0x80000014  //MO路由更新应答
#define      CMPP_PUSH_MT_ROUTE_UPDATE       0x00000015  //MT路由更新
#define      CMPP_PUSH_MT_ROUTE_UPDATE_RESP  0x80000015  //MT路由更新应答
#define      CMPP_PUSH_MO_ROUTE_UPDATE       0x00000016  //MO路由更新
#define      CMPP_PUSH_MO_ROUTE_UPDATE_RESP  0x80000016  //MO路由更新应答

#pragma pack( push )
#pragma pack( 1 )

typedef struct _Cmpp_Head
{
	ULONG       Total_Length;
	ULONG       Command_Id;
	ULONG       Sequence_Id;
}Cmpp_Head;

typedef struct _Cmpp_Connect
{
	char       Source_Addr[6];
	UCHAR      AuthenticatorSource[16];
	UCHAR      Version;
	ULONG      Timestamp;
}Cmpp_Connect;
typedef struct _Cmpp_Connect_Resp
{
	UCHAR      Status;
	UCHAR      AuthenticatorSource[16];
	UCHAR      Version;
}Cmpp_Connect_Resp;

typedef struct _Cmpp_Active_Test_Resp
{
	UCHAR      Reserved;
}Cmpp_Active_Test_Resp;

typedef struct _Cmpp_Terminate_Resp
{
}Cmpp_Terminate_Resp;

typedef struct _Cmpp_Submit
{
	LONGLONG Msg_ID;
	UCHAR    Pk_total;
	UCHAR    Pk_number;
	UCHAR    Registered_Delivery;
	UCHAR    Msg_level;
	UCHAR    Service_Id[10];
	UCHAR    Fee_UserType;
	UCHAR    Fee_terminal_Id[21];
	UCHAR    TP_pId;
	UCHAR    TP_udhi;
	UCHAR    Msg_Fmt;
	UCHAR    Msg_src[6];
	UCHAR    FeeType[2];
	UCHAR    FeeCode[6];
	UCHAR    ValId_Time[17];
	UCHAR    At_Time[17];
	UCHAR    Src_Id[21];
	UCHAR    DestUsr_tl;
	UCHAR    Dest_terminal_Id[21];
	UCHAR    Msg_Length;
}Cmpp_Submit;
typedef struct _Cmpp_Submit_Resp
{
	LONGLONG Msg_ID;
	UCHAR    Result;
}Cmpp_Submit_Resp;
typedef struct _Send_List
{
	ULONG       lSendID;         //数据库中记录的SendID
	ULONG       lSeq;            //发送cmpp里的序号
	ULONG       lCmppSeq;        //使用cmpp转接的源序号
	ULONG       lSendTime;       //最后一次发送时间
    ULONG       lReSendCount;    //重复发送了多少次
	UCHAR       Msg[512];        //信息内容
	Cmpp_Submit Submit;
}Send_List;
typedef struct _SmsReport
{
	long        lSmsReportID;
	CString     strMsgID;
	long        lReportStatus;
	CString     strRecvStatus;
	long        lSendFCS;
	CString     strMobile;
	long        lTDMsgType;
	SYSTEMTIME  tReportTime;
}SmsReport;

typedef struct _SmsReport_Corp
{
	long        lReportStatus;
	long        lTDMsgType;
	long        lSendRet;
	long        lCorpID;
	long        lUserID;
	long        lKF;
	TCHAR		szRecvStatus[32];
}SmsReport_Corp;

typedef struct _FXSend_MT
{
	long SendID;
	long CorpID;
	long UserID;
	CString GroupID;
	long Status;
	CString MsgID;
	long SendRet;
	long SendFCS;
	long ReSendCount;
	CString Sender;
	CString SendNum;
	CString Recver;
	CString RecvNum;
	long RecvNumType;
	CString Msg;
	long MsgType;
	COleDateTime SubTime;
	COleDateTime Timer;
	long Priority;
	long StatusReport;
	COleDateTime OvrTime;
	COleDateTime SendTime;
	COleDateTime RecvTime;
	CString RecvStatus;
	long KF;
	CString IP;
	CString SM_ID;
	CString TRANS_CODE;
	CString ORGAN_CODE;
	COleDateTime tAddThisTime;
}FXSend_MT;

//发送返回状态
typedef struct _Send_Resp
{
	ULONG       lSendID;         //数据库中记录的SendID
	ULONG       lResult;         //返回状态
    ULONG       lReSendCount;    //重复发送了多少次
	LONGLONG    lMsgID;          //发送成功时有此返回
}Send_Resp;

typedef struct _Cmpp_Deliver
{
	LONGLONG Msg_ID;
	UCHAR    Dest_Id[21];
	UCHAR    Service_Id[10];
	UCHAR    TP_pid;
	UCHAR    TP_udhi;
	UCHAR    Msg_Fmt;
	UCHAR    Src_terminal_Id[21];
	UCHAR    Registered_Delivery;
	UCHAR    Msg_Length;
}Cmpp_Deliver;
typedef struct _Cmpp_Status
{
	LONGLONG Msg_ID;
	UCHAR    Stat[7];
	UCHAR    Submit_time[10];
	UCHAR    Done_time[10];
	UCHAR    Dest_terminal_Id[21];
	ULONG    SMSC_sequence;
}Cmpp_Status;
typedef struct _Cmpp_Deliver_Resp
{
	LONGLONG Msg_ID;
	UCHAR    Result;
}Cmpp_Deliver_Resp;
#pragma pack( pop )