Utils.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:9k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "Utils.h"
  2. #include "Exception.h"
  3. #include "CriticalSection.h"
  4. #include <memory>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <conio.h>
  8. #ifdef _UNICODE
  9. typedef std::wfstream _tfstream;
  10. #else
  11. typedef std::fstream _tfstream;
  12. #endif
  13. #include "Lmcons.h"     // define UNLEN
  14. #define NONE_PRINTF_TRACE
  15. /*
  16.  * Using directives
  17.  */
  18. using std::auto_ptr;
  19. using std::endl;
  20. /*
  21.  * namespace OnlineGameLib::Win32
  22.  */
  23. namespace OnlineGameLib {
  24. namespace Win32 {
  25. CCriticalSection s_criticalSection;
  26. static _tfstream s_debugOut;
  27. static std::string s_logFileName = "\NWS.log";
  28. void SetLogFileName( const _tstring &name )
  29. {
  30.    USES_CONVERSION;
  31.    if ( s_debugOut.is_open() )
  32.    {
  33.       s_debugOut.close();
  34.    }
  35.    s_logFileName = T2A( const_cast<PTSTR>( name.c_str() ) );
  36. }
  37. void Output( const _tstring &message )
  38. {
  39. #ifdef NONE_PRINTF_TRACE
  40. return;
  41. #endif
  42. #ifdef _DEBUG
  43. CCriticalSection::Owner lock( s_criticalSection );
  44. #ifdef _UNICODE
  45. std::wcout << ToString( GetCurrentThreadId() ) << _T(": ") << message << endl;
  46. #else
  47. std::cout << ToString( GetCurrentThreadId() ) << _T(": ") << message << endl;
  48. #endif
  49. const _tstring msg = ToString( GetCurrentThreadId() ) + _T(": ") + message + _T("n");
  50. cprintf( msg.c_str() );
  51. //  OutputDebugString( msg.c_str() );
  52. #ifdef TRACE2FILE
  53. if ( !s_debugOut.is_open() )
  54. {
  55. s_debugOut.open( s_logFileName.c_str(), std::ios_base::out | std::ios_base::app );
  56. s_debugOut << _T( "************ OnlineGame newest log *************" ) << endl;
  57. }
  58. s_debugOut <<  ToString( GetCurrentThreadId() ) << _T(": ") << message << endl;
  59. #endif // TRACE2FILE
  60. #else
  61. /*
  62.  * symbol 'message' not referenced
  63.  */   
  64. #endif //_DEBUG
  65. }
  66. void OutPutInfo( const _tstring &message )
  67. {
  68. #ifdef NONE_PRINTF_TRACE
  69. return;
  70. #endif
  71. CCriticalSection::Owner lock( s_criticalSection );
  72. #ifdef _UNICODE
  73.    std::wcout << ToString( GetCurrentThreadId() ) << _T(": ") << message << endl;
  74. #else
  75.    std::cout << ToString( GetCurrentThreadId() ) << _T(": ") << message << endl;
  76. #endif
  77.    const _tstring msg = ToString( GetCurrentThreadId() ) + _T(": ") + message + _T("n");
  78.    OutputDebugString( msg.c_str() );
  79. }
  80. void Trace2File( const _tstring &message )
  81. {
  82. #ifdef NONE_PRINTF_TRACE
  83. return;
  84. #endif
  85. if ( !s_debugOut.is_open() )
  86. {
  87. s_debugOut.open( s_logFileName.c_str(), std::ios_base::out | std::ios_base::app );
  88. s_debugOut << _T( "************ OnlineGame newest log *************" ) << endl;
  89. }
  90. s_debugOut <<  ToString( GetCurrentThreadId() ) << _T(": ") << message << endl;
  91. }
  92. _tstring GetLastErrorMessage( DWORD last_error )
  93. {
  94. static TCHAR errmsg[520];
  95. static size_t len = strlen( "[0x]" ) + sizeof( DWORD );
  96. sprintf( errmsg, "[0x%X]", last_error );
  97. errmsg[len] = '';
  98. if ( !FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, 
  99.   0,
  100.   last_error,
  101.   0,
  102.   &errmsg[len], 
  103.   511,
  104.   NULL) )
  105. {
  106. /*
  107.  * if we fail, call ourself to find out why and return that error
  108.  */
  109. return ( GetLastErrorMessage( GetLastError() ) );  
  110. }
  111.   
  112. return errmsg;
  113. }
  114. _tstring HexToString( const BYTE *pBuffer,  size_t iBytes )
  115. {
  116.    _tstring result;
  117.      
  118.    for ( size_t i = 0; i < iBytes; i++ )
  119.    {
  120.       BYTE c ;
  121.       BYTE b = pBuffer[i] >> 4;
  122.          
  123.       if ( 9 >= b )
  124.       {
  125.          c = b + '0';
  126.       }
  127.       else
  128.       {
  129.          c = (b - 10) + 'A';
  130.       }
  131.       result += (TCHAR)c;
  132.       b = pBuffer[i] & 0x0f;
  133.       if ( 9 >= b )
  134.       {
  135.          c = b + '0';
  136.       }
  137.       else
  138.       {
  139.          c = (b - 10) + 'A';
  140.       }
  141.       result += (TCHAR)c;
  142.    }
  143.    return result;
  144. }
  145. void StringToHex( const _tstring &ts, BYTE *pBuffer, size_t nBytes )
  146. {
  147. USES_CONVERSION;
  148. const std::string s = T2A( const_cast<PTSTR>(ts.c_str()) );
  149. for ( size_t i = 0; i < nBytes; i++ )
  150. {
  151. const size_t stringOffset = i * 2;
  152. BYTE val = 0;
  153. const BYTE b = s[stringOffset];
  154. if ( isdigit( b ) ) 
  155. {
  156. val = (BYTE)( (b - '0') * 16 ); 
  157. }
  158. else 
  159. {
  160. val = (BYTE)( ( ( toupper(b) - 'A' ) + 10 ) * 16 ); 
  161. }
  162. const BYTE b1 = s[stringOffset + 1];
  163. if ( isdigit( b1 ) ) 
  164. {
  165. val += b1 - '0' ; 
  166. }
  167. else 
  168. {
  169. val += (BYTE)( ( toupper(b1) - 'A' ) + 10 ); 
  170. }
  171. pBuffer[i] = val;
  172. }
  173. }
  174. _tstring GetCurrentDirectory()
  175. {
  176.    DWORD size = ::GetCurrentDirectory( 0, 0 );
  177.    auto_ptr<TCHAR> spBuf(new TCHAR[size]);
  178.    if ( 0 == ::GetCurrentDirectory( size, spBuf.get() ) )
  179.    {
  180.       throw CException( _T("GetCurrentDirectory()"), _T("Failed to get current directory") );
  181.    }
  182.    return _tstring( spBuf.get() );
  183. }
  184. _tstring GetDateStamp()
  185. {
  186.    SYSTEMTIME systime;
  187.    GetSystemTime(&systime);
  188.    static TCHAR buffer[7];
  189.    _stprintf( buffer, _T("%02d%02d%02d"),
  190.                      systime.wDay,
  191.                      systime.wMonth,
  192.                      ( 1900 + systime.wYear) % 100 );
  193.    return buffer;
  194. }
  195. _tstring GetTimeStamp()
  196. {
  197.    SYSTEMTIME systime;
  198.    GetLocalTime(&systime);
  199.    static TCHAR buffer[9];
  200.    _stprintf( buffer, _T("%02d:%02d:%02d"),
  201.                      systime.wHour,
  202.                      systime.wMinute,
  203.                      systime.wSecond );
  204.    return buffer;
  205. }
  206. _tstring ToHex( BYTE c )
  207. {
  208.    TCHAR hex[3];
  209.    const int val = c;
  210. _stprintf( hex, _T("%02X"), val );
  211.    return hex;
  212. }
  213. _tstring DumpData( const BYTE * const pData, size_t dataLength, size_t lineLength /* = 0 */ )
  214. {
  215. #ifdef NONE_PRINTF_TRACE
  216. return ( _tstring )( "" );
  217. #endif
  218. const size_t bytesPerLine = lineLength != 0 ? (lineLength - 1) / 3 : 0;
  219. _tstring result;
  220. _tstring hexDisplay;
  221. _tstring display;
  222. size_t i = 0;
  223. while ( i < dataLength )
  224. {
  225.       const BYTE c = pData[i++];
  226.       hexDisplay += ToHex(c) + _T(" ");
  227.       if ( isprint( c ) )
  228.       {
  229.          display += (TCHAR)c;
  230.       }
  231.       else
  232.   {
  233.   display += _T('.');
  234.   }
  235.       if ( ( bytesPerLine && ( i % bytesPerLine == 0 && i != 0 ) ) || i == dataLength )
  236.       {
  237.          result += hexDisplay + _T(" - ") + display + _T("n");
  238.          hexDisplay = _T("");
  239.          display = _T("");
  240.       }
  241. }
  242. return result;
  243. }
  244. _tstring GetComputerName()
  245. {
  246. static bool gotName = false;
  247. static _tstring name = _T("UNAVAILABLE!");
  248. if ( !gotName )
  249. {
  250. TCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1] ;
  251. DWORD computerNameLen = MAX_COMPUTERNAME_LENGTH ;
  252. if ( ::GetComputerName( computerName, &computerNameLen ) )
  253. {
  254. name = computerName;
  255. }
  256. gotName = true;
  257. }
  258. return name;
  259. }
  260. _tstring GetModuleFileName( HINSTANCE hModule /* = 0 */ )
  261. {
  262.    static bool gotName = false;
  263.    static _tstring name = _T("UNAVAILABLE!");
  264.    if ( !gotName )
  265.    {
  266.       TCHAR moduleFileName[MAX_PATH + 1] ;
  267.   DWORD moduleFileNameLen = MAX_PATH ;
  268.       if ( ::GetModuleFileName( hModule, moduleFileName, moduleFileNameLen ) )
  269.       {
  270.          name = moduleFileName;
  271.       }
  272.       gotName = true;
  273.    }
  274.    return name;
  275. }
  276. _tstring GetUserName()
  277. {
  278.    static bool gotName = false;
  279.    static _tstring name = _T("UNAVAILABLE!");
  280.    if ( !gotName )
  281.    {
  282.       TCHAR userName[UNLEN + 1] ;
  283.   DWORD userNameLen = UNLEN;
  284.       if ( ::GetUserName( userName, &userNameLen ) )
  285.       {
  286.   name = userName;
  287.       }
  288.       gotName = true;
  289.    }
  290.    return name;
  291. }
  292. _tstring StripLeading( const _tstring &source, const char toStrip )
  293. {
  294.    const TCHAR *pSrc = source.c_str();
  295.    while ( pSrc && *pSrc == toStrip )
  296.    {
  297.    ++pSrc;
  298.    }
  299.    return pSrc;
  300. }
  301. _tstring StripTrailing( const _tstring &source, const char toStrip )
  302. {
  303.    size_t i = source.length();
  304.    const _TCHAR *pSrc = source.c_str() + i;
  305.    
  306.    --pSrc;
  307.    while ( i && *pSrc == toStrip )
  308.    {
  309.       --pSrc;
  310.       --i;
  311.    }
  312.    
  313.    return source.substr( 0, i );
  314. }
  315. #pragma comment( lib, "Version.lib" )
  316. _tstring GetFileVersion()
  317. {
  318.    _tstring version;
  319.    const _tstring moduleFileName = GetModuleFileName( NULL );
  320.    LPTSTR pModuleFileName = const_cast<LPTSTR>( moduleFileName.c_str() );
  321.    DWORD zero = 0;
  322.    DWORD verSize = ::GetFileVersionInfoSize( pModuleFileName, &zero );
  323.    
  324.    if ( verSize != 0 )
  325.    {
  326.    auto_ptr<BYTE> spBuffer( new BYTE[verSize] );
  327.    
  328.    if ( ::GetFileVersionInfo( pModuleFileName, 0, verSize, spBuffer.get() ) )
  329.    {
  330.    LPTSTR pVersion = 0;
  331.    UINT verLen = 0;
  332.    
  333.    if ( ::VerQueryValue(spBuffer.get(), 
  334. const_cast<LPTSTR>(_T("\StringFileInfo\080904b0\ProductVersion")), 
  335. (void**)&pVersion, 
  336. &verLen) )
  337.    {
  338.    version = pVersion;
  339.    }
  340.    }
  341.    }
  342.    return version;
  343. }
  344. } // End of namespace OnlineGameLib
  345. } // End of namespace Win32