///************************************************************************/
/*  Copyright (C), 2010-2020, [Jeff], 保留所有权利;
/*  模 块 名：;
/*  描    述：;
/*
/*  版    本：[V];	
/*  作    者：[Jeff];
/*  日    期：[];
/*
/*
/*  注    意：;
/*
/*  修改记录：[Jeff];
/*  修改日期：;
/*  修改版本：;
/*  修改内容：;
/************************************************************************/

#ifndef __HOME_GLOBAL__
#define __HOME_GLOBAL__

#pragma once

#include <string>
#include <vector>
using namespace std;

#ifndef _UNICODE
typedef string TString;
#else
typedef wstring TString;
#endif

namespace GLOBAL
{
	typedef struct __ST_SAT_CFG__ 
	{
		// adb超时断线时长;
		DWORD dwAdbTimeout;
		// 脚本路径;
		TCHAR szScriptDir[MAX_PATH];
		// Apk接口地址;
		TCHAR szApkServer[MAX_PATH];
		TCHAR szApkSysCode[MAX_PATH];
		// 用例接口地址;
		TCHAR szCaseServer[MAX_PATH];
		TCHAR szCaseSysCode[MAX_PATH];
		// 任务接口地址;
		TCHAR szTaskServer[MAX_PATH];
		TCHAR szTaskSysCode[MAX_PATH];
		// 结果接口地址;
		TCHAR szResultServer[MAX_PATH];
		TCHAR szResultExcelDir[MAX_PATH];
		// 执行器接口地址;
		TCHAR szExecuteServer[MAX_PATH];
		TCHAR szExecuteSysCode[MAX_PATH];
		// TCP服务端接口;
		DWORD dwTCPSvrPort;
		// 脚本超时值设置;
		DWORD dwScriptTimeout;
		// 这个可以忽略不要;
		typedef struct  __ST_LD__
		{
			TCHAR szDevice[MAX_PATH];
			TCHAR szManu[MAX_PATH];
			TCHAR szHardwareVersion[MAX_PATH];
			TCHAR szModel[MAX_PATH];
		}STLinuxDevice, *pSTLinuxDevice;
		STLinuxDevice stLinuxDevice;
	}STSATConfig, *pSTSATConfig;

	extern STSATConfig g_stSATConfig;
	//////////////////////////////////////////////////////////////////////////
	// 全局变量;
	//////////////////////////////////////////////////////////////////////////
	extern TCHAR g_szIniFile[MAX_PATH];
	extern TCHAR g_szHostName[MAX_PATH];			// 主机计算机名;
	extern TCHAR g_szConnectString[MAX_PATH];		// DB连接串;

	// 服务器信息;
	extern TCHAR g_szDBSource[MAX_PATH];			// 数据库源(服务所在IP或计算机名);
	extern TCHAR g_szDBSourcePort[MAX_PATH];		// 数据库源端口;
	extern DWORD g_dwDBServerPort;					// 数据库源端口;
	extern TCHAR g_szDBAccount[MAX_PATH];			// 数据库登录用户;
	extern TCHAR g_szDBPassWord[MAX_PATH];			// 数据库登录密码;
	extern TCHAR g_szDBName[MAX_PATH];				// 数据库名称;	

	extern TCHAR g_szCurModuleFileName[MAX_PATH];
	extern TCHAR g_szCurModuleDir[MAX_PATH];
	extern TCHAR g_szCurModulePath[MAX_PATH];
	extern TCHAR g_szFna[_MAX_FNAME];
	extern TCHAR g_szExt[_MAX_EXT];

	extern std::string g_strIPAddress;

	//////////////////////////////////////////////////////////////////////////
	// 网卡类型;
	enum NICKIND {
		// pci网卡;
		NIC_PCI,
		// usb网卡;
		NIC_USB,
		// 虚拟网卡;
		NIC_ROOT,
		// 仿真网卡;
		NIC_SWD,
		// 未知类型;
		NIC_UNK
	};

	typedef struct __MAC_ADDRESS__
	{
		INT nNICKind;
		TCHAR szNICKind[16];
		TCHAR szMacAddress[MAX_PATH];
		TCHAR szDevicePath[MAX_PATH];
	} MacAddress, * pMacAddress;

	extern std::string g_strMacs;
	extern std::vector<MacAddress> g_vtMac;
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	// 全局函数;
	// 判断公历是否有效;
	extern BOOL IsValidDate(IN LPCTSTR lpDate);
	// 判断农历是否有效;
	extern BOOL IsValidLunanrDate(IN LPCTSTR lpDate);
	// 获取配置文件函数;
	extern int GetIniInfo(IN const TCHAR *szPath = NULL, const TCHAR *szIniName = NULL);

	// 获取网卡地址;
	INT GetMacAddress();
	//////////////////////////////////////////////////////////////////////////
	// 字符串系列全局函数;
	extern BOOL CompareNoCase(IN TString& str1, IN TString& str2);
	extern BOOL IsStringExist(IN CString& str, IN CStringArray &tagAry);
	extern BOOL IsStringExist(IN TString& str, IN vector<TString> &tagVt);
	extern BOOL IsStringExistNoCase(IN CString& str, IN CStringArray &tagAry);
	extern BOOL IsStringExistNoCase(IN CONST TString& str, IN CStringArray &tagAry);
	extern BOOL IsStringExistNoCase(IN CONST TString& str, IN vector<TString> &tagVt);
	extern TString lowercase(IN const TString &Str);
	extern TString uppercase(IN const TString &Str);
	extern int match(IN CONST TString &sExt, IN CONST TString &sFile);
	extern TString getfilename(IN CONST TString &file);
	extern CString getfilename(IN CONST CString &file);

	//////////////////////////////////////////////////////////////////////////
	// 进程相关函数;
	extern BOOL FindAppProcessID(IN CString path, OUT DWORD &dwProcessID);
	extern DWORD FindProcess(IN CString strProName);
	extern DWORD FindProcessCount(IN LPCTSTR lpExeName);
	extern int FindAndCloseProcess(IN CString strProName);

	// 文件函数;
	extern  BOOL GetDiskSpaceInfo(IN LPCTSTR lpRootPathName,IN OUT double &dTotalNum, IN OUT double &dFreeNum);

	extern BOOL GetFileVersion( IN HMODULE hModule, IN DWORD (&dwArray)[4]);
	extern BOOL GetFileVersionEx( IN LPCTSTR lpFileName, IN DWORD (&dwArray)[4] );
	extern BOOL GetProductVersion( IN HMODULE hModule, IN DWORD (&dwArray)[4]);
	extern BOOL GetProductVersionEx( IN LPCTSTR lpFileName, IN DWORD (&dwArray)[4] );

	// 获取文件夹的修改时间;
	extern BOOL GetDirLastWriteTime(IN LPCTSTR lpDirName, OUT LPTSTR lpszString, IN CONST DWORD& dwSize);
	// 设置文件夹的修改时间;
	extern BOOL SetDirLastWriteTime();
	// 获取指定文件句柄的修改时间;
	extern BOOL GetLastWriteTime(IN HANDLE hFile, OUT LPTSTR lpszString, IN CONST DWORD& dwSize);
	// 设置指定文件夹的修改时间;
	extern BOOL SetFileLastWirteTime(IN LPCTSTR lpDirName, IN SYSTEMTIME &st);
	// 删除指定的目录所有文件;
	extern void DeleteDirectory(CString strDir);
	//
	extern void GetHostName();
	// 创建目录;
	bool MKDIR(LPCTSTR dir);
	void WriteTextLog(const TCHAR* format, ...);
	// 写脚本日志;
	void WritePythonLog(LPCTSTR file, const TCHAR* msg);
	// 获取本机IP地址;
	std::string GetLocalAddress(int nType = MIB_IF_TYPE_ETHERNET);
	// 替换指定字符串;
	std::string Replace(std::string strSrc, std::string strNew, std::string strOld);
};

#endif