736 lines
19 KiB
C++
736 lines
19 KiB
C++
/*******************************************************************************
|
|
*
|
|
* 模 块 名:DBService 文件名:ServiceInit.c
|
|
* 相关文件:ServiceInit.h
|
|
* z提交日期:2012.2.1 作 者:Alex
|
|
* 版 本:0.1
|
|
* 模块描述:
|
|
* 相当于事务处理模块的构造和析构模块
|
|
* ServiceInit();
|
|
* ServiceDeInit();
|
|
* 修改记录:
|
|
* 日 期 版本 修改人 修改内容
|
|
*
|
|
*
|
|
*******************************************************************************/
|
|
#ifdef _WIN32
|
|
|
|
#define _SERVICEINIT_CPP
|
|
#include "IOCmpltThread.h"
|
|
//#include <windows.h>
|
|
#include <process.h>
|
|
#include <stdio.h>
|
|
#include <tchar.h>
|
|
#include <direct.h>
|
|
|
|
#include "DbService.h"
|
|
#include "MessageThread.h"
|
|
#include "ServiceInit.h"
|
|
#include "debug.h"
|
|
#include "DataBuffers.h"
|
|
#include "ResponseManager.h"
|
|
#include "DBInterface.h"
|
|
//#define CTYPE_GBK 936
|
|
//#define CTYPE_UTF8 65001
|
|
|
|
CUDPMessageReceiveThread * g_pMessageReceiveThread = NULL;
|
|
CIOCmpltThread * g_pIOCmpltThread = NULL;
|
|
CDataBufferManager* g_pDataBuffers = NULL;
|
|
CResponseManager* g_pResponses = NULL;
|
|
int g_aStyleRecomList[MAX_STYLE_NUM+1];
|
|
TQNAITEM g_lstCommonQnA[200];
|
|
TNOTICEITEM g_lstPublicNotice[MAX_NOTICE_NUM];
|
|
int g_nCommonQnANum = 0, g_nPublicNoticeNum = 0;
|
|
|
|
HINSTANCE g_hDBAccessDll = NULL,
|
|
g_hParamDll = NULL;
|
|
|
|
extern MHTHREADLIST g_lstMessageHandleThreads;
|
|
|
|
TCLIENTVERSION* g_pVersionClient = NULL;
|
|
TTESTVERSION* g_pVersionClientTest = NULL;
|
|
|
|
int g_nClientTypeNum = 0,
|
|
g_nClientTestNum = 0;
|
|
HANDLE g_hEvClientCheck = NULL;
|
|
char g_strStyleFileDir[256] = "";
|
|
char g_strWebFileDir[256] = "";
|
|
char g_strMusicFileDir[256] = "";
|
|
char g_strMusicLocation[8] = "";
|
|
char g_strServiceDir[256] = "";
|
|
//UINT g_locale_ctype = 0;
|
|
/*
|
|
void UpdateStyleInfo()
|
|
{
|
|
typedef int (*CM_GetStyleTracksInfo)( int len, BYTE data[], char tracks[4][8][16][3] );
|
|
|
|
//加载ComposeModule
|
|
HINSTANCE hStyleDll = LoadLibrary( "StyleUpdate.dll" );
|
|
if( hStyleDll==NULL ){
|
|
DWORD dwRet = GetLastError();
|
|
|
|
DebugPrint( "载入风格模块失败, 程序终止! errcode=%d", dwRet );
|
|
|
|
return;
|
|
}
|
|
|
|
CM_GetStyleTracksInfo f_CM_GetStyleTracksInfo = (CM_GetStyleTracksInfo)GetProcAddress( hStyleDll, "CM_GetStyleTracksInfo" );
|
|
|
|
if( !( f_CM_GetStyleTracksInfo ) ){
|
|
|
|
DebugPrint( "获取风格模块访问函数失败, 程序终止!\n" );
|
|
|
|
return;
|
|
}
|
|
|
|
char strFileName[256];
|
|
char buf[20];
|
|
|
|
int id = 1;
|
|
while( true ){
|
|
//打开原风格文件
|
|
strcpy( strFileName, g_strStyleFileDir );
|
|
UINT nDir = ((UINT)id-1) >> 13;
|
|
sprintf( buf, "%08X\\", nDir );
|
|
strcat( strFileName, buf );
|
|
|
|
sprintf( buf, "%08X.YSF", id );
|
|
strcat( strFileName, buf );
|
|
|
|
FILE *fp = fopen( strFileName, "r+b" );
|
|
|
|
if( !fp ){
|
|
int err = GetLastError();
|
|
DebugPrint( "修改完毕,或文件读取错误err=%d\n", err );
|
|
|
|
return;
|
|
}
|
|
else{
|
|
//读取原风格信息
|
|
fseek( fp, 0, SEEK_END );
|
|
int len = ftell( fp );
|
|
|
|
int nDataSize = len - sizeof(TSTYLEINFO0);
|
|
BYTE * pData = new BYTE[nDataSize];
|
|
|
|
TMAKESTYLEINFO infoNew;
|
|
TSTYLEINFO0 infoOld;
|
|
|
|
fseek( fp, 0, SEEK_SET );
|
|
fread( &infoOld, 1, sizeof(TSTYLEINFO0), fp );
|
|
fread( pData, 1, nDataSize, fp );
|
|
|
|
//读取轨道信息
|
|
char tracks[4][8][16][3];
|
|
int size = sizeof( tracks );
|
|
memset( tracks, -1, size );
|
|
|
|
int err = f_CM_GetStyleTracksInfo( nDataSize, pData, tracks );
|
|
if( 0==err ){
|
|
//修改info
|
|
// infoNew.idStyle = id;
|
|
|
|
memcpy( infoNew.detail.type, infoOld.detail.type, sizeof(infoOld.detail.type) );
|
|
memcpy( infoNew.detail.chordRecom, infoOld.detail.chordRecom, sizeof(infoOld.detail.chordRecom) );
|
|
memcpy( infoNew.detail.aIntroBars, infoOld.detail.aIntroBars, sizeof(infoOld.detail.aIntroBars) );
|
|
memcpy( infoNew.detail.aEndingBars, infoOld.detail.aEndingBars, sizeof(infoOld.detail.aEndingBars) );
|
|
|
|
for( int s=0; s<4; s++ ){
|
|
for( int i=0; i<8; i++ ){
|
|
for( int j=0; j<16; j++ ){
|
|
infoNew.detail.tracks[s][i][j].no = tracks[s][i][j][0];
|
|
infoNew.detail.tracks[s][i][j].prog = tracks[s][i][j][1];
|
|
infoNew.detail.tracks[s][i][j].vol = tracks[s][i][j][2];
|
|
}
|
|
}
|
|
}
|
|
|
|
err = f_DB_UpdateStyle( id, &infoNew );
|
|
if( 0==err ){
|
|
fseek( fp, 0, SEEK_SET );
|
|
fwrite( &infoNew, 1, sizeof(TSTYLEINFO), fp );
|
|
fwrite( pData, 1, nDataSize, fp );
|
|
|
|
// DebugPrint( "Style %d updating OK\n", infoNew.idStyle );
|
|
}
|
|
}
|
|
|
|
if( err!=0 ){
|
|
DebugPrint( "Style %d updating failed! err=%d\n", id, err );
|
|
}
|
|
|
|
delete[] pData;
|
|
fclose( fp );
|
|
}
|
|
|
|
id++;
|
|
}
|
|
}
|
|
*/
|
|
|
|
void ModifyStyleDesc()
|
|
{
|
|
char strFileName[256];
|
|
char buf[20];
|
|
// int ids[3] = {404,418,422};
|
|
// char desc[3][120] = { "模仿周杰伦《东风破》的简单中国风,竖琴可换琵琶或古筝,鼓换电鼓",
|
|
// "模仿王菲《闷》的摇滚风格,还原前间奏,乐器协调性是美中不足",
|
|
// "麒麟谱,四不像,伪中国风。《红妆》编曲的收获,感谢花枝。" };
|
|
|
|
for( UINT i=g_iChkStyle; ; i++ ){
|
|
char strFileName[256];
|
|
char buf[20];
|
|
|
|
strcpy( strFileName, g_strStyleFileDir );
|
|
|
|
UINT nDir = (i-1) >> 13;
|
|
sprintf( buf, "%08X\\", nDir );
|
|
strcat( strFileName, buf );
|
|
|
|
sprintf( buf, "%08X.YSI", i );
|
|
strcat( strFileName, buf );
|
|
|
|
FILE *fp = fopen( strFileName, "r+b" );
|
|
|
|
if( !fp ){
|
|
int err = GetLastError();
|
|
DebugPrint( "打开风格%d失败,err=%d\n", i, err );
|
|
return;
|
|
}
|
|
else{
|
|
short len = 0;
|
|
|
|
fread( &len, 1, sizeof(short), fp );
|
|
|
|
if( len>0 ){
|
|
char* pData = new char[len];
|
|
fread( pData, 1, len, fp );
|
|
|
|
TSTYLEDETAIL detail;
|
|
int ret = StyleTrans2Detail( detail, len, (char*)pData );
|
|
if( ret<0 ){
|
|
DebugPrint( "Style %d size error\n", i );
|
|
}
|
|
else{
|
|
if( ret>0 ){
|
|
DebugPrint( "Trunc style %d %s\n", i, ret==1 ? "Author"
|
|
: ret==2 ? "AtyleName"
|
|
: "Description" );
|
|
|
|
// string ansiName;
|
|
//
|
|
// UTF8ToGBK( detail.strDescription, ansiName );
|
|
// GBKToUTF8( desc[i], ansiName);
|
|
// strcpy( detail.strDescription, ansiName.c_str() );
|
|
|
|
int size;
|
|
ret = StyleDetail2Trans( detail, size, pData );
|
|
if( ret>0 )
|
|
DebugPrint( "Trunc style %d %s\n", i, ret==1 ? "Author"
|
|
: ret==2 ? "AtyleName"
|
|
: "Description" );
|
|
|
|
len = size;
|
|
fseek( fp, 0, SEEK_SET );
|
|
fwrite( &len, 1, sizeof(short), fp );
|
|
fwrite( pData, 1, len, fp );
|
|
}
|
|
}
|
|
}
|
|
|
|
fclose( fp );
|
|
}
|
|
}
|
|
}
|
|
|
|
void CreateLog()
|
|
{
|
|
SYSTEMTIME st;
|
|
GetLocalTime(&st);
|
|
char szBufPath[MAX_PATH] = "";
|
|
|
|
sprintf( szBufPath, "%slog\\", g_strServiceDir );
|
|
|
|
if( _chdir(szBufPath) == -1)
|
|
{
|
|
_mkdir(szBufPath);
|
|
}
|
|
|
|
sprintf( szBufPath, "%s%04d-%02d-%02d.log", szBufPath, st.wYear, st.wMonth, st.wDay);
|
|
|
|
DebugModuleClose();
|
|
|
|
int iDebug = g_eDebug>0 ? g_eDebug : 1;
|
|
|
|
DebugModuleInitialize( 0xFFFF, (EDPrintDest)iDebug, szBufPath );
|
|
}
|
|
|
|
void GetStyleRecomList()
|
|
{
|
|
int tempList[MAX_STYLE_NUM+1];
|
|
memset( tempList, 0, sizeof(int)*(MAX_STYLE_NUM+1) );
|
|
int num = MAX_STYLE_NUM;
|
|
int ret = f_DB_GetRecomStyleIDs( &num, tempList );
|
|
|
|
if( ret==0 ){
|
|
tempList[MAX_STYLE_NUM] = num;
|
|
memcpy( g_aStyleRecomList, tempList, sizeof(int)*(MAX_STYLE_NUM+1) );
|
|
|
|
DebugPrint( "Recommand style num : %d\n", num );
|
|
}
|
|
else{
|
|
DebugPrint( "DB_GetRecomStyleIDs return %d\n", ret );
|
|
}
|
|
}
|
|
|
|
void GetCommonQnAList()
|
|
{
|
|
int dtUpdate = 0;
|
|
for( int i=0; i<g_nCommonQnANum; i++ ){
|
|
if( dtUpdate<g_lstCommonQnA[i].dtUpdate ){
|
|
dtUpdate = g_lstCommonQnA[i].dtUpdate;
|
|
}
|
|
}
|
|
|
|
g_nCommonQnANum = f_DB_GetCommonQnA( dtUpdate, g_nCommonQnANum, g_lstCommonQnA );
|
|
|
|
DebugPrint( "Common QnA num : %d\n", g_nCommonQnANum );
|
|
}
|
|
|
|
void GetPublicNoticeList()
|
|
{
|
|
g_nPublicNoticeNum = f_DB_GetNotice( MAX_NOTICE_NUM, g_lstPublicNotice, 0 );
|
|
|
|
DebugPrint( "Public notice num : %d\n", g_nPublicNoticeNum );
|
|
}
|
|
|
|
#define INI_FILE_NAME "DBService.ini"
|
|
#define STR_TESTVERSION_SECTION "TEST_VERSIONS"
|
|
#define STR_TESTVERSION "VERSIONS_STRING"
|
|
FILETIME g_ftIniModify;
|
|
|
|
void ReadConfigParams()
|
|
{
|
|
char szBufPath[MAX_PATH] = "";
|
|
sprintf( szBufPath, "%s%s", g_strServiceDir, INI_FILE_NAME );
|
|
|
|
HANDLE hFile = CreateFile( szBufPath, GENERIC_READ, FILE_SHARE_READ, NULL,
|
|
OPEN_EXISTING, 0, NULL);
|
|
|
|
if( hFile == INVALID_HANDLE_VALUE ){
|
|
DebugPrint( "No ini file\n" );
|
|
return;
|
|
}
|
|
|
|
int ret = -1;
|
|
FILETIME ftWrite;
|
|
ret = GetFileTime(hFile, NULL, NULL, &ftWrite);
|
|
|
|
CloseHandle( hFile );
|
|
|
|
if( !ret ){
|
|
DebugPrint( "Get ini file time error: %d\n", GetLastError());
|
|
return;
|
|
}
|
|
|
|
if( ftWrite.dwLowDateTime!=g_ftIniModify.dwLowDateTime
|
|
|| ftWrite.dwHighDateTime!=g_ftIniModify.dwHighDateTime ){
|
|
if( WAIT_OBJECT_0!=WaitForSingleObject( g_hEvClientCheck, INFINITE ) )
|
|
return;
|
|
|
|
//printf( "retrive config.\n" );
|
|
TTESTVERSION aVersion[10];
|
|
int num = 0;
|
|
char szBuf[32] = "";
|
|
|
|
ret = GetPrivateProfileString( STR_TESTVERSION_SECTION, STR_TESTVERSION, "", szBuf, 32, szBufPath );
|
|
|
|
if( ret>0 ){
|
|
char *tokenPtr=strtok( szBuf, "|" );
|
|
for( ; tokenPtr!=NULL; num++ ){
|
|
int iInner, iMaj, iMin, iMod, iBuil;
|
|
sscanf( tokenPtr, "%d,%d.%d.%d", &iInner, &iMaj, &iMin, &iMod );//, &iBuil );
|
|
|
|
aVersion[num].iClientType = iInner;
|
|
aVersion[num].version.majorVersion = iMaj;
|
|
aVersion[num].version.minorVersion = iMin;
|
|
aVersion[num].version.modifyVersion = iMod;
|
|
// aVersion[num].version.buildVersion = iBuil;
|
|
|
|
tokenPtr = strtok( NULL, "|" );
|
|
}
|
|
}
|
|
|
|
if( g_nClientTestNum>0 && g_nClientTestNum!=num ){
|
|
delete[] g_pVersionClientTest;
|
|
g_pVersionClientTest = NULL;
|
|
}
|
|
|
|
g_nClientTestNum = num;
|
|
|
|
if( num>0 ){
|
|
if( !g_pVersionClientTest ){
|
|
g_pVersionClientTest = new TTESTVERSION[num];
|
|
}
|
|
|
|
for( int i=0; i<num; i++ ){
|
|
TTESTVERSION* pVersion = &(g_pVersionClientTest[i]);
|
|
memcpy( pVersion, &aVersion[i], sizeof(TTESTVERSION) );
|
|
|
|
DebugPrint( "测试版本:%d.%d.%d\n软件内部编号:%d\n",
|
|
pVersion->version.majorVersion, pVersion->version.minorVersion,
|
|
pVersion->version.modifyVersion, //pVersion->version.buildVersion, //不设置构建版本
|
|
pVersion->iClientType );
|
|
}
|
|
}
|
|
else{
|
|
DebugPrint( "No test version.\n" );
|
|
}
|
|
|
|
SetEvent( g_hEvClientCheck );
|
|
|
|
g_ftIniModify.dwLowDateTime = ftWrite.dwLowDateTime;
|
|
g_ftIniModify.dwHighDateTime = ftWrite.dwHighDateTime;
|
|
}
|
|
else{
|
|
DebugPrint( "No config update.\n" );
|
|
}
|
|
}
|
|
|
|
void GetClientUpdateVersion()
|
|
{
|
|
if( WAIT_OBJECT_0!=WaitForSingleObject( g_hEvClientCheck, INFINITE ) ){
|
|
return;
|
|
}
|
|
|
|
int nOldTypeNum = g_nClientTypeNum;
|
|
g_nClientTypeNum = f_DB_GetClientTypeNumber();
|
|
|
|
if( nOldTypeNum>0 && g_nClientTypeNum!=nOldTypeNum ){
|
|
delete[] g_pVersionClient;
|
|
g_pVersionClient = NULL;
|
|
}
|
|
|
|
if( g_nClientTypeNum>0 ){
|
|
if( !g_pVersionClient ){
|
|
g_pVersionClient = new TCLIENTVERSION[g_nClientTypeNum];
|
|
}
|
|
|
|
if( f_DB_GetClientVersion( g_pVersionClient, g_nClientTypeNum )>=0 ){
|
|
for( int i=0; i<g_nClientTypeNum; i++ ){
|
|
TCLIENTVERSION* pVersion = &(g_pVersionClient[i]);
|
|
|
|
string ansiDescribe;
|
|
UTF8ToGBK( pVersion->swInfo.strDescribe, ansiDescribe );
|
|
|
|
DebugPrint( "软件内部编号:%d\n最新客户端版本:%d.%d.%d.%04d\n 发布时间:%d-%d-%d\n 文件大小:%dK\n 文件描述:%s\n",
|
|
pVersion->iClientType,
|
|
pVersion->swInfo.version.majorVersion, pVersion->swInfo.version.minorVersion,
|
|
pVersion->swInfo.version.modifyVersion, pVersion->swInfo.version.buildVersion,
|
|
pVersion->swInfo.tIssueDate>>16, (pVersion->swInfo.tIssueDate&0xFF00)>>8, (pVersion->swInfo.tIssueDate&0xFF),
|
|
pVersion->swInfo.nFileSize, ansiDescribe.c_str() );
|
|
|
|
}
|
|
}
|
|
else{
|
|
DebugPrint( "获取最新客户端版本信息失败!\n" );
|
|
}
|
|
}
|
|
else if( g_nClientTypeNum<0 ){
|
|
DebugPrint( "获取最新客户端类型数失败!\n" );
|
|
}
|
|
|
|
SetEvent( g_hEvClientCheck );
|
|
}
|
|
|
|
void OnTimerFunc( void *dummy )
|
|
{
|
|
CreateLog();
|
|
// GetClientUpdateVersion();
|
|
GetStyleRecomList();
|
|
GetCommonQnAList();
|
|
// GetPublicNoticeList();
|
|
|
|
DebugPrint( "OnTimerFunc exit.\n" );
|
|
}
|
|
|
|
bool ServiceInit()
|
|
{
|
|
g_hEvServiceThread = CreateEvent(
|
|
NULL, // no security attributes
|
|
TRUE, // manual reset event
|
|
FALSE, // not-signalled
|
|
NULL); // no name
|
|
|
|
g_hEvClientCheck = CreateEvent(
|
|
NULL, // no security attributes
|
|
FALSE, // auto reset event
|
|
TRUE, // signalled
|
|
NULL); // no name
|
|
|
|
if( !(g_hEvServiceThread && g_hEvClientCheck )){
|
|
return false;
|
|
}
|
|
WORD wVersionRequested;
|
|
WSADATA wsaData;
|
|
int err;
|
|
/*
|
|
//获取本地编码格式
|
|
char* locname = setlocale(LC_CTYPE, "");
|
|
char* code = strchr( locname, '.' );
|
|
//DebugPrint( "locale code: %s\n", code);
|
|
if( !strcmp(code, ".936") || !strcmp(code, ".GBK") ){
|
|
g_locale_ctype = CTYPE_GBK;
|
|
}
|
|
*/
|
|
wVersionRequested = MAKEWORD( 2, 2 );
|
|
|
|
err = WSAStartup( wVersionRequested, &wsaData );
|
|
if ( err != 0 ) {
|
|
// Tell the user that we could not find a usable
|
|
// WinSock DLL.
|
|
_tprintf(TEXT("CreateService failed - can't startup wsock.\n"));
|
|
|
|
if( g_hEvServiceThread ){
|
|
CloseHandle( g_hEvServiceThread );
|
|
g_hEvServiceThread = NULL;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//设置debug参数
|
|
HKEY hRootKey;
|
|
DWORD nFlag=1, dwLength=4;
|
|
|
|
if( ERROR_SUCCESS==RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\YHD\\ComposerService",
|
|
0, KEY_ALL_ACCESS, &hRootKey ) ){
|
|
if( RegQueryValueEx(hRootKey,"DebugFlag",NULL,NULL,(BYTE*)&nFlag,&dwLength)!=ERROR_SUCCESS ){
|
|
RegSetValueEx(hRootKey,"DebugFlag",0,REG_DWORD,(BYTE*)&nFlag,4 );
|
|
}
|
|
RegCloseKey( hRootKey );
|
|
}
|
|
|
|
char chTemp[2560];
|
|
GetModuleFileName( NULL, chTemp, 256 );
|
|
*(strrchr(chTemp, '\\')+1) = '\0';
|
|
strcpy( g_strServiceDir, chTemp );
|
|
//DebugModuleInitialize( 0xFFFF, (EDPrintDest)g_eDebug, NULL );
|
|
CreateLog();
|
|
//DebugPrint("DebugModuleInitialize success!\n");
|
|
|
|
//载入数据库访问模块
|
|
if( !LoadDB() ){
|
|
return FALSE;
|
|
}
|
|
|
|
// int ret = f_DB_InitDatabases("localhost", "root", "168soft.xyz");
|
|
|
|
f_DB_GetPath( g_strStyleFileDir, g_strWebFileDir, g_strMusicFileDir );
|
|
DebugPrint( "Style_dir: %s\nWeb_dir: %s\nMusic_dir: %s\n", g_strStyleFileDir, g_strWebFileDir, g_strMusicFileDir );
|
|
if( strlen(g_strMusicFileDir)>0 ){
|
|
char* pos = strstr( g_strMusicFileDir, "File" )+4;
|
|
if( pos[0]!='/' && pos[0]!='\\' ){
|
|
int num;
|
|
sscanf( pos, "%d", &num );
|
|
sprintf( g_strMusicLocation, "%d", num );
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
//修改风格信息专用
|
|
//#ifdef _UPDATE
|
|
if( g_iChkStyle>0 ){
|
|
// UpdateStyleInfo();
|
|
ModifyStyleDesc();
|
|
return FALSE;
|
|
}
|
|
//#endif
|
|
/////////////////////////////////////////////////////////////
|
|
|
|
GetClientUpdateVersion();
|
|
memset( g_aStyleRecomList, 0, sizeof(int)*(MAX_STYLE_NUM+1) );
|
|
GetStyleRecomList();
|
|
|
|
g_ftIniModify.dwLowDateTime = 0;
|
|
g_ftIniModify.dwHighDateTime = 0;
|
|
ReadConfigParams();
|
|
|
|
GetCommonQnAList();
|
|
GetPublicNoticeList();
|
|
|
|
//创建数据接收
|
|
g_pDataBuffers = new CDataBufferManager;
|
|
|
|
//创建消息响应管理
|
|
g_pResponses = new CResponseManager;
|
|
|
|
//生成消息接收线程
|
|
CUDPSocket * pSocket = new CUDPSocket( 12071 );
|
|
|
|
if( pSocket && pSocket->IsOpen() ){
|
|
g_pMessageReceiveThread = new CUDPMessageReceiveThread( 3000, pSocket );
|
|
g_pMessageReceiveThread->Resume();
|
|
}
|
|
|
|
//生成消息处理线程池
|
|
for( int i=0; i<20; i++ ){
|
|
pSocket = new CUDPSocket();
|
|
if( pSocket && pSocket->IsOpen() ){
|
|
CMessageHandleThread* pThread = new CMessageHandleThread( 3000, pSocket );
|
|
g_lstMessageHandleThreads.push_back( pThread );
|
|
}
|
|
}
|
|
|
|
//生成IOComplete线程
|
|
g_pIOCmpltThread = new CIOCmpltThread(3000);
|
|
g_pIOCmpltThread->Resume();
|
|
|
|
_tprintf(TEXT("Composer Service is running...\n"));
|
|
|
|
return true;
|
|
}
|
|
|
|
void ServiceDeInit()
|
|
{
|
|
_tprintf(TEXT("Composer Service is stopping...\n"));
|
|
|
|
if( g_hEvClientCheck ){
|
|
CloseHandle( g_hEvClientCheck );
|
|
}
|
|
|
|
if( g_pVersionClient ){
|
|
delete[] g_pVersionClient;
|
|
g_pVersionClient = NULL;
|
|
}
|
|
|
|
if( g_pMessageReceiveThread ){
|
|
g_pMessageReceiveThread->Terminate();
|
|
delete g_pMessageReceiveThread;
|
|
g_pMessageReceiveThread = NULL;
|
|
}
|
|
|
|
MHTHREADLIST::iterator iMT = g_lstMessageHandleThreads.begin();
|
|
while( iMT!=g_lstMessageHandleThreads.end() ){
|
|
(*iMT)->Terminate();
|
|
delete (*iMT);
|
|
|
|
iMT = g_lstMessageHandleThreads.erase( iMT );
|
|
}
|
|
|
|
if( g_pIOCmpltThread ){
|
|
g_pIOCmpltThread->Terminate();
|
|
delete g_pIOCmpltThread;
|
|
g_pIOCmpltThread = NULL;
|
|
}
|
|
|
|
FreeDB();
|
|
|
|
if( g_pDataBuffers ){
|
|
delete g_pDataBuffers;
|
|
g_pDataBuffers = NULL;
|
|
}
|
|
|
|
if( g_pResponses ){
|
|
delete g_pResponses;
|
|
g_pResponses = NULL;
|
|
}
|
|
|
|
DebugModuleClose();
|
|
|
|
WSACleanup( );
|
|
|
|
DebugPrint( "System unloaded!" );
|
|
|
|
if( g_hEvServiceThread ){
|
|
SetEvent( g_hEvServiceThread );
|
|
}
|
|
|
|
_tprintf(TEXT("Composer Service stopped.\n"));
|
|
}
|
|
/*
|
|
#ifndef _DEBUG
|
|
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 设置入口地址
|
|
#endif
|
|
*/
|
|
DWORD WINAPI DBMain(void* pParam)
|
|
{
|
|
MSG msg;
|
|
|
|
if( !ServiceInit() ){
|
|
// return 1;
|
|
}
|
|
|
|
SYSTEMTIME st;
|
|
GetLocalTime(&st);
|
|
|
|
DWORD timeCount = st.wHour * 60 * 60 + st.wMinute * 60 + st.wSecond;
|
|
// timeCount = 0; //test
|
|
|
|
UINT uTimer = SetTimer( NULL, 0, 1000, NULL );
|
|
|
|
while( GetMessage(&msg, NULL, 0, 0) && msg.message!=WM_CLOSE ){
|
|
if( msg.message==WM_TIMER && msg.wParam==uTimer ){
|
|
if( g_pIOCmpltThread ){
|
|
g_pIOCmpltThread->OnTimer();
|
|
}
|
|
|
|
if( g_pDataBuffers ){
|
|
g_pDataBuffers->OnTimer();
|
|
}
|
|
|
|
if( g_pResponses ){
|
|
g_pResponses->OnTimer();
|
|
}
|
|
|
|
if( ++timeCount>=86400 ){ //00:00:00
|
|
// if( ++timeCount>=600 ){ //test 10 minutes
|
|
// timeCount = 0; //test
|
|
GetLocalTime(&st);
|
|
timeCount = st.wHour * 60 * 60 + st.wMinute * 60 + st.wSecond;
|
|
|
|
if( st.wHour==0 ){
|
|
// _beginthread( OnTimerFunc, 0, NULL );
|
|
CreateThread( 0, 0, (LPTHREAD_START_ROUTINE)OnTimerFunc, 0, 0, 0 );
|
|
}
|
|
}
|
|
|
|
if( ( timeCount & 0x1FF )==0 ){ //512s~9m
|
|
f_DB_CleanVipLog();
|
|
}
|
|
|
|
if( ( timeCount & 0xFFF )==0 ){ //4095s~68m~1h 获取测试版本信息
|
|
ReadConfigParams();
|
|
}
|
|
|
|
if( ( timeCount & 0x1FFF )==0 ){ //8191s~136m~2h 获取发布版本信息
|
|
GetClientUpdateVersion();
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
try{
|
|
TranslateMessage (&msg);
|
|
DispatchMessage (&msg);
|
|
}catch (...){
|
|
_tprintf(TEXT("!!!!!!Unexpected exception in WMain()!!!!!!\n"));
|
|
}
|
|
}
|
|
|
|
KillTimer( NULL, uTimer );
|
|
|
|
IF_DEBUG_SYSMANAGER(DebugPrint("%X:In %s Line %d WMain ExitThread!\n",
|
|
TRACE_NUMBER(e_Trace_SysManager,e_Trace_Normal),
|
|
__FILE__,__LINE__))
|
|
|
|
ServiceDeInit();
|
|
|
|
_tprintf(TEXT("WMain() ExitThread!\n"));
|
|
|
|
|
|
ExitThread(0);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif |