#include "StdAfx.h" #include "ShopMain.h" #include "JobInvoker.h" #include "CashShop.h" CShopMain::CShopMain(void) :m_ListVersion(NULL) { } void CShopMain::ErrorHandler( DWORD lastError, char* desc ) { BILLING_LOG(WZPUBLIC::LEVEL_ERROR, "%s (%u)", desc, lastError); } CShopMain::~CShopMain(void) { _releaseinstance(WZPUBLIC::WinService); _releaseinstance(CShopJobQueue); _releaseinstance(WZPUBLIC::CLog); if(m_ListVersion) { delete m_ListVersion; m_ListVersion=NULL; } } void CShopMain::CreateLog(bool bLogMode) { char szModuleName[MAX_PATH]; ::GetModuleFileName( NULL, szModuleName, MAX_PATH ); *(strrchr( szModuleName, '\\' ) ) = 0; strcat(szModuleName, "\\Logs"); if(INVALID_FILE_ATTRIBUTES == GetFileAttributes(szModuleName)) { CreateDirectory(szModuleName, NULL); } strcat(szModuleName, "\\Shop.log"); USES_CONVERSION; wchar_t* szFilepath = A2W(szModuleName); WZPUBLIC::LOG_LEVEL level; switch(m_clsConfig.getLogType()) { case 1: level = WZPUBLIC::LEVEL_ERROR; break; case 2: level = WZPUBLIC::LEVEL_WARN; break; case 3: level = WZPUBLIC::LEVEL_INFO; break; default: level = WZPUBLIC::LEVEL_OFF; break; } _instance(WZPUBLIC::CLog)->CreateLog(szFilepath, bLogMode); _instance(WZPUBLIC::CLog)->SetLevel(level); } void CShopMain::ConSoleMsgRoop() { char sBuf[MAX_PATH]; while(true) { gets(sBuf); if(0 == _stricmp(sBuf, "q") || 0 == _stricmp(sBuf, "quit")) { break; } } } bool CShopMain::OnServiceStart() { BILLING_LOG(WZPUBLIC::LEVEL_ALL, "商城服务开启-版本[%s] %s %", VERSION_SUNSHOP, __DATE__, __TIME__ ); return _instance(CShopMain)->ServerStart(); } void CShopMain::OnServiceStop() { BILLING_LOG(WZPUBLIC::LEVEL_INFO, "商城服务关闭"); _instance(CShopMain)->ServerStop(); } bool CShopMain::ServerStart() { if(!m_clsConfig.LoadFile()) { BILLING_LOG(WZPUBLIC::LEVEL_ERROR, "配置文件不存在"); return false; } m_clsConfig.SetData(); CreateLog(true); BILLING_LOG(WZPUBLIC::LEVEL_ALL, "商城服务开启-版本[%s] %s %s", VERSION_SUNSHOP, __DATE__, __TIME__ ); _instance(CProtocolInvoker)->SetProtocalCommand(); for(DWORD i = 0 ; i < m_clsConfig.getDBThreadCnt() ; i++) { CJobInvoker* jobinvoker = new CJobInvoker; jobinvoker->SetJobCommand(m_clsConfig); m_dbpool.AddJobThread(jobinvoker); } BILLING_LOG(WZPUBLIC::LEVEL_INFO, "已创建商城线程(%d)", m_clsConfig.getDBThreadCnt()); if(!WBANetwork::Initialize(0, CShopMain::ErrorHandler)) { BILLING_LOG(WZPUBLIC::LEVEL_ERROR, "网络初始化失败"); return false; } if(!m_Network.Create((WORD)m_clsConfig.getMaxSessionCount(), &m_SessionMgr, (WORD)m_clsConfig.getIOThreadCount(), 0)) { BILLING_LOG(WZPUBLIC::LEVEL_ERROR, "网络创建失败"); return false; } if(!m_Network.OpenAcceptor(m_clsConfig.getIPAddress(), (u_short)m_clsConfig.getPortNum())) { BILLING_LOG(WZPUBLIC::LEVEL_ERROR, "网络监听失败"); return false; } if(!_instance(ConvenienceStore::CashShop)->BuildShopList(GetConfig())) { BILLING_LOG(WZPUBLIC::LEVEL_ERROR, "脚本加载失败"); return false; } ConSoleMsgRoop(); return true; } void CShopMain::ServerStop() { m_dbpool.AllStopJobThread(); m_Network.CloseAcceptor(); m_Network.Destroy(); }