/*************************************************************
/* Copyright (C), 2014-2020, lyfz. Co., Ltd.
/* 文件名:		Client2SrvType.h
/* 作者:		Jeff.w			 
/* 创建日期:	2014-08-07
/* 版本号:		V1.0
/* 描述:		核心层底,客户端与服务端通信协议包定义
/* 其它:  
/* 主要类模块: 
/* 历史修改记录: 
/*		作者           时间              版本           描述
/*	    Jeff.w         14/08/07          1.0	      创建这个模块
***************************************************************/
#ifndef CLIENT2SRVTYPE_HEADER
#define CLIENT2SRVTYPE_HEADER
#pragma once

//#include "Stdafx.h"
//#include "Global.h"
extern unsigned int VerifyIntegrityPacket(IN void *pIntegrityPacket,IN unsigned int nPacketSize);
#include "Def.h"
#include "Const.h"
// 完整的数据包：协议头 + 协议体（数据）+ 协议尾;
// 注意：尽量使数据包小,使数量吞吐量更大、运行速度更快;

// 公共命令类类型;:common comand type
// 主命令类型1: C2L:consumer terminal to lyfz service;
// 主命令类型2: C2C:consumer client to consumer service;
enum
{
	//----------------------------:common comand.type:  1~999----------------------------------------------------
	CMD_HEART							= 1,		// 心跳包;
	CMD_TOCHAT							= 2,		// 文字聊天;
	CMD_FILEINFO_TRANSFER				= 3,		// 文件传输-文件信息;
	CMD_FILECONT_TRANSFER				= 4,		// 文件传输-文件内容;
	CMD_UPDATA							= 5,		// 有升级信息（用户终端每次登录时,请求检测是否有新版本可升级的信息）;
	CMD_DATABASEINFO					= 6,		// 向请求端返回数据库信息;
	CMD_OHTER_INFO						= 999,		// 其他信息;
	
	
	//------------------------C2L:consumer terminal to lyfz.service: 1000~1999------------------------------------
	C2LCMD_REQ_LOGIN					= 1000,		// 用户终端请求登录利亚方舟服务端（外网ip+登录信息）;
	//C2LCMD_GET_DOG_DATA					= 1001,		// 利亚方舟获取用户终端机器加密狗数据信息;
	C2LCMD_DOGINFO						= 1001,		// 用户终端向利亚方舟发送加密狗信息;
	C2LCMD_GET_VAR						= 1002,		// 请求用户终端的版本号;
	C2LCMD_DEAL_ILLEGAL					= 1003,		// 处理盗版、过期用户：停止用户终端工作、启用定时关机、程序文件自动删除等等操作命令;
	C2LCMD_DEAL_SMS						= 1004,		// 利亚方舟服务端处理用户终端的短信发送工作;
	C2LCMD_GET_DBINFO					= 1005,		// 利亚方舟服务端获取用户终端电脑数据库信息;
	
	// .预留，若SQL数据库引擎未启用TCP/IP作为远程连接方式,需定义读写表的具体命令;（Jeff.100%的不建议使用这种方式获取数据，占用太多带宽和资源）
	// .若要使用SQL,则只允许SQL的updata、insert、delete、drop……等命令,不允许使用select来返回查询到数据;

	C2LCMD_OTHER_INFO					= 1999,     // 读其它信息;

	//------------------------C2C:consumer client to consumer service: 2000~2999--------------------------------
	C2CCMD_REQ_LOGIN					= 2000,     // 客户端请求登录服务器;
	C2CCMD_REQ_LOGOUT					= 2001,		// 客户端注销;
	C2CCMD_REQ_DOG_DATA					= 2002,     // 读软件狗数据;
	C2CCMD_AUTO_UPDATA					= 2003,		// 服务端向所有客户发送自动数据更新命令;
	C2CCMD_REQ_SERVER_VAR				= 2004,		// 请求服务端的版本号;
	C2CCMD_GET_DBINFO					= 2005,		// 利亚方舟服务端获取用户终端电脑数据库信息;
	C2CCMD_ORD_PHOTO_BAK				= 2006,		// 客户端端向备份程序发送订单相片重新备份命令(导片与备份存在写备份无法锁定现象,need to Notify);

	// .预留，若SQL数据库引擎未启用TCP/IP作为远程连接方式,需定义读写表的具体命令;（Jeff.100%的不建议使用这种方式获取数据，占用太多带宽和资源）
	// .若要使用SQL,则只允许SQL的updata、insert、delete、drop……等命令,不允许使用select来返回查询到数据;

	C2CCMD_OTHER_INFO					= 2999,     // 读其它信息;
};

// 请在此处更改需要设置的包头和包尾标识符;
const int PBOF = 0x7e;
const int PEOF = 0x0e;

// 协议头-勿更改;
typedef struct __STPROTOCOLHEADER__
{
	unsigned char bof;		// 协议头标识;
	//unsigned int  nDataLen;	// 有效数据长度,包含头;
	unsigned int  nCmd;		// 具体的命令;
	unsigned int  nCmdType;	// 命令类型;
	unsigned int  nDataLen;	// 有效数据长度,包含头;*/
	unsigned int  nVerify;	// 预留校验码;

	__STPROTOCOLHEADER__(){bof = PBOF;}

}STProtocolheader,*pSTProtocolheader;

// 协议尾-勿更改;
typedef struct __STPROTOCOLTAIL__
{
	unsigned char eof;		// 协议尾标识;
	__STPROTOCOLTAIL__(){eof = PEOF;}
}STProtocoltail,*pSTProtocoltail;

// ----------------------------------------------------------------------------------------------
// -------------------------------------以下为全为协议体-----------------------------------------;

typedef struct __STHEARTBEATBODY__
{
	STProtocolheader	tPHeader;
	TCHAR				cflaghbeat;
	__STHEARTBEATBODY__(){
		tPHeader.nCmd = CMD_HEART;
		tPHeader.nCmdType = 0;
		cflaghbeat = 9;
		tPHeader.nDataLen = sizeof(__STHEARTBEATBODY__);
	}

	inline void GetVerify()	{
		tPHeader.nVerify = VerifyIntegrityPacket(this,tPHeader.nDataLen);
	}
}STHeartbeatbody,*pSTHeartbeatbody;

// 示例,文件信息：
typedef struct __STFILEINFOBODY__
{
	STProtocolheader	tPHeader;
	// 需要添加的实际数据;
	unsigned __int64	nFileLength;				// 文件长度;
	TCHAR				szFileName[MAX_PATH];		// 长文件名;
	TCHAR				szFileExt[MAX_PATH];		// 文件扩展名;
	//DATE				fCreateDate;				// 文件创建日期;
	//DATE				fModifyDate;				// 文件创建日期;
	__int64				tCreateDate;				// 文件创建日期;
	__int64				tModifyDate;				// 文件创建日期;
	//unsigned char       attribute;				// 文件属性;
	//STProtocoltail		tPTail;

	__STFILEINFOBODY__()	{
		tPHeader.nCmd = CMD_FILEINFO_TRANSFER;
		tPHeader.nCmdType = 0;
		tPHeader.nDataLen = sizeof(__STFILEINFOBODY__);
	}

	inline void GetVerify()	{
		tPHeader.nVerify = VerifyIntegrityPacket(this,tPHeader.nDataLen);
	}
}STFileInfobody,*pSTFileInfobody;

// 文件内容;
typedef struct __STFILECONTEXTBODY__
{
	STProtocolheader	tPHeader;
	int					nFileContextLen;
	unsigned char		szFileContext[MAX_FILETRANSFERLENGTH];
	//STProtocoltail		tPTail;
	__STFILECONTEXTBODY__()	{
		tPHeader.nCmd = CMD_FILECONT_TRANSFER;
		tPHeader.nCmdType = 0;
		tPHeader.nDataLen = sizeof(__STFILECONTEXTBODY__);
	}

	inline void GetVerify()	{
		tPHeader.nVerify = VerifyIntegrityPacket(this,tPHeader.nDataLen);
	}
}STFileContextbody,*pSTFileContextbody;


// 文字聊天;
typedef struct __STCHATBODY__
{
	STProtocolheader	tPHeader;
	TCHAR				szChat[MAX_CHATLENGTH];
	//STProtocoltail		tPTail;
	__STCHATBODY__()	{
		tPHeader.nCmd = CMD_TOCHAT;
		tPHeader.nCmdType = 0;
		tPHeader.nDataLen = sizeof(__STCHATBODY__);
	}

	inline void GetVerify(){
		tPHeader.nVerify = VerifyIntegrityPacket(this,tPHeader.nDataLen);
	}
}STChatbody,*pSTChatbody;


// 加密狗信息;
typedef struct __STDOGINFOBODY__
{
	STProtocolheader	tPHeader;
	// dog info;
	// ........

	__STDOGINFOBODY__()	{
		tPHeader.nCmd = C2LCMD_DOGINFO;
		tPHeader.nCmdType = 0;
		tPHeader.nDataLen = sizeof(__STDOGINFOBODY__);
	}

	inline void GetVerify()	{
		tPHeader.nVerify = VerifyIntegrityPacket(this,tPHeader.nDataLen);
	}
}STDogInfobody,*pSTDogInfobody;

// 登录账户信息;
typedef struct __STACCOUNTINFOBODY__
{
	STProtocolheader	tPHeader;
	TCHAR	szAccount[MAX_PATH];
	TCHAR	szPassword[MAX_PATH];

	__STACCOUNTINFOBODY__()	{
		tPHeader.nCmd = C2CCMD_REQ_LOGIN;
		tPHeader.nCmdType = 0;
		tPHeader.nDataLen = sizeof(__STACCOUNTINFOBODY__);
	}

	inline void GetVerify()	{
		tPHeader.nVerify = VerifyIntegrityPacket(this,tPHeader.nDataLen);
	}
}STAccountInfobody,*pSTAccountInfobody;

// 返回的数据库信息;
// 数据库与服务端可不在同一机子;
// 备份模块则是单独的一个后台服务程序;
typedef struct __STDATABASEINFOBODY__
{
	STProtocolheader	tPHeader;
	TCHAR	szDatabaseServer[MAX_PATH];		// 服务器地址;
	TCHAR	szDatabaseTCPPort[MAX_PATH];	// 服务器TCP端口;
	TCHAR	szDatabaseAccount[MAX_PATH];	// 数据库登录账户;
	TCHAR	szDatabasePassword[MAX_PATH];	// 数据库账户密码;
	TCHAR	szDatabaseName[MAX_PATH];		// 数据库名称;

	__STDATABASEINFOBODY__(){
		tPHeader.nCmd = CMD_DATABASEINFO;
		tPHeader.nCmdType = 0;
		tPHeader.nDataLen = sizeof(__STDATABASEINFOBODY__);
	}

	inline void GetVerify()	{
		tPHeader.nVerify = VerifyIntegrityPacket(this,tPHeader.nDataLen);
	}
}STDatabaseInfobody,*pSTDatabaseInfobody;

#endif