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

模拟服务器

开发平台:

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