home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Multimedia / AVStoDVD / AVStoDVD_280_Install.exe / AVSMeter / source / utility.h < prev    next >
C/C++ Source or Header  |  2014-10-16  |  11KB  |  429 lines

  1. // This program is free software; you can redistribute it and/or modify
  2. // it under the terms of the GNU General Public License as published by
  3. // the Free Software Foundation; either version 2 of the License, or
  4. // (at your option) any later version.
  5.  
  6. #ifndef _UTILS_H
  7. #define _UTILS_H
  8.  
  9. #include "stdafx.h"
  10. #include "VerInfo.h"
  11.  
  12. #define FG_BLACK    0
  13. #define FG_RED            FOREGROUND_RED
  14. #define FG_GREEN        FOREGROUND_GREEN
  15. #define FG_BLUE            FOREGROUND_BLUE
  16. #define FG_YELLOW        FOREGROUND_RED | FOREGROUND_GREEN
  17. #define FG_MAGENTA    FOREGROUND_RED | FOREGROUND_BLUE
  18. #define FG_CYAN            FOREGROUND_GREEN | FOREGROUND_BLUE
  19. #define FG_HRED            FOREGROUND_RED | FOREGROUND_INTENSITY
  20. #define FG_HGREEN        FOREGROUND_GREEN | FOREGROUND_INTENSITY
  21. #define FG_HBLUE        FOREGROUND_BLUE | FOREGROUND_INTENSITY
  22. #define FG_HYELLOW    FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY
  23. #define FG_HMAGENTA    FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY
  24. #define FG_HCYAN        FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY
  25. #define FG_DARKGREY    FOREGROUND_INTENSITY
  26. #define FG_GREY            FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED
  27. #define FG_WHITE        FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY
  28.  
  29. #define BG_BLACK    0
  30. #define BG_RED            BACKGROUND_RED
  31. #define BG_GREEN        BACKGROUND_GREEN
  32. #define BG_BLUE            BACKGROUND_BLUE
  33. #define BG_YELLOW        BACKGROUND_RED | BACKGROUND_GREEN
  34. #define BG_MAGENTA    BACKGROUND_RED | BACKGROUND_BLUE
  35. #define BG_CYAN            BACKGROUND_GREEN | BACKGROUND_BLUE
  36. #define BG_HRED            BACKGROUND_RED | BACKGROUND_INTENSITY
  37. #define BG_HGREEN        BACKGROUND_GREEN | BACKGROUND_INTENSITY
  38. #define BG_HBLUE        BACKGROUND_BLUE | BACKGROUND_INTENSITY
  39. #define BG_HYELLOW    BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY
  40. #define BG_HMAGENTA    BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY
  41. #define BG_HCYAN        BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY
  42. #define BG_DARKGREY    BACKGROUND_INTENSITY
  43. #define BG_GREY            BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_RED
  44. #define BG_WHITE        BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY
  45.  
  46.  
  47. using namespace std;
  48.  
  49. class CUtils
  50. {
  51. public:
  52.     CUtils();
  53.     virtual      ~CUtils();
  54.     BOOL         FileExists(string s_file);
  55.     string       OSErrorMessage();
  56.     void         CursorUp(int iLines);
  57.     unsigned int GetConsoleWidth();
  58.     void SetRGB(WORD wAttributes, BOOL bSet);
  59.     void ResetRGB(BOOL bSet);
  60.     BOOL GetProductVersion(string &s_version);
  61.     BOOL GetResourceInfo(string s_file);
  62.  
  63.     struct ResourceInfo
  64.     {
  65.         string sLanguage;
  66.         string sFixedFileVersion;
  67.         string sFixedProductVersion;
  68.         string sComments;         // VI_STR_COMMENTS
  69.         string sCompanyName;      // VI_STR_COMPANYNAME
  70.         string sFileDescription;  // VI_STR_FILEDESCRIPTION
  71.         string sFileVersion;      // VI_STR_FILEVERSION
  72.         string sInternalName;     // VI_STR_INTERNALNAME
  73.         string sLegalCopyright;   // VI_STR_LEGALCOPYRIGHT
  74.         string sLegalTrademarks;  // VI_STR_LEGALTRADEMARKS
  75.         string sOriginalFilename; // VI_STR_ORIGINALFILENAME
  76.         string sPrivateBuild;     // VI_STR_PRIVATEBUILD
  77.         string sProductName;      // VI_STR_PRODUCTNAME
  78.         string sProductVersion;   // VI_STR_PRODUCTVERSION
  79.         string sSpecialBuild;     // VI_STR_SPECIALBUILD
  80.     } resinfo;
  81.  
  82.     //string functions
  83.     void   StrTrimLeft(string &s_string);
  84.     void   StrTrimRight(string &s_string);
  85.     void   StrTrim(string &s_string);
  86.     void   StrToUC(string &s_string);
  87.     void   StrToLC(string &s_string);
  88.     string StrFormat(const char *fmt, ...);
  89.     string StrPad(string s_line, unsigned int ui_consolewidth);
  90.     string StrFormatFPS(double d_fps);
  91.     BOOL   IsNumeric(string s_string);
  92.  
  93. private:
  94.     HANDLE hConsole;
  95.     WORD   wSaveAttributes;
  96. };
  97.  
  98. CUtils::CUtils()
  99. {
  100.     hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE);
  101.  
  102.     //save attributes
  103.     CONSOLE_SCREEN_BUFFER_INFO csbi; 
  104.     GetConsoleScreenBufferInfo(hConsole, &csbi); 
  105.     wSaveAttributes = csbi.wAttributes;
  106. }
  107.  
  108. CUtils::~CUtils()
  109. {
  110.     //retrieve saved attributes
  111.     SetConsoleTextAttribute(hConsole, wSaveAttributes);
  112. }
  113.  
  114.  
  115. void CUtils::CursorUp(int iLines)
  116. {
  117.     COORD pos;
  118.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  119.     ::GetConsoleScreenBufferInfo(hConsole, &csbi);
  120.     pos.Y = (short)(csbi.dwCursorPosition.Y - iLines);
  121.     pos.X = 0;
  122.     ::SetConsoleCursorPosition(hConsole, pos);
  123.  
  124.     return;
  125. }
  126.  
  127.  
  128. unsigned int CUtils::GetConsoleWidth()
  129. {
  130.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  131.     ::GetConsoleScreenBufferInfo(hConsole, &csbi); 
  132.  
  133.     return (unsigned int)csbi.dwSize.X;
  134. }
  135.  
  136.  
  137. void CUtils::SetRGB(WORD wAttributes, BOOL bSet)
  138. {
  139.     if (bSet)
  140.         SetConsoleTextAttribute(hConsole, wAttributes);
  141.  
  142.     return;
  143. }
  144.  
  145.  
  146. void CUtils::ResetRGB(BOOL bSet)
  147. {
  148.     if (bSet)
  149.         SetConsoleTextAttribute(hConsole, wSaveAttributes);
  150.  
  151.     return;
  152. }
  153.  
  154.  
  155. BOOL CUtils::FileExists(string s_file)
  156. {
  157.     DWORD dwAttrib;
  158.     dwAttrib = ::GetFileAttributes(s_file.c_str());
  159.     if (dwAttrib == 0xFFFFFFFF)
  160.         return FALSE;
  161.  
  162.     if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)
  163.         return FALSE;    
  164.  
  165.     return TRUE;
  166. }
  167.  
  168.  
  169. void CUtils::StrTrimLeft(string &s_string)
  170. {
  171.     s_string.erase(0, s_string.find_first_not_of(" \t\n\r"));
  172.  
  173.     return;
  174. }
  175.  
  176.  
  177. void CUtils::StrTrimRight(string &s_string)
  178. {
  179.     s_string.erase(s_string.find_last_not_of(" \t\n\r") + 1);
  180.  
  181.     return;
  182. }
  183.  
  184.  
  185. void CUtils::StrTrim(string &s_string)
  186. {
  187.     s_string.erase(s_string.find_last_not_of(" \t\n\r") + 1);
  188.     s_string.erase(0, s_string.find_first_not_of(" \t\n\r"));
  189.  
  190.     return;
  191. }
  192.  
  193.  
  194. void CUtils::StrToUC(string &s_string)
  195. {
  196.     for (unsigned int i = 0; i < s_string.length(); i++)
  197.         s_string[i] = toupper(s_string[i]);
  198.  
  199.     return;
  200. }
  201.  
  202.  
  203. void CUtils::StrToLC(string &s_string)
  204. {
  205.     for (unsigned int i = 0; i < s_string.length(); i++)
  206.         s_string[i] = tolower(s_string[i]);
  207.  
  208.     return;
  209. }
  210.  
  211.  
  212. string CUtils::StrFormat(const char *fmt, ...)
  213. {
  214.     if (!fmt)    return "";
  215.  
  216.     #define MAX_LEN 2048
  217.     va_list args;
  218.     va_start(args, fmt);
  219.     unsigned int length = 256;
  220.     char *buffer = NULL;
  221.     int result = -1;
  222.  
  223.     while (result == -1)
  224.     {
  225.         if (buffer)
  226.             delete [] buffer;
  227.  
  228.         buffer = new char [length];
  229.         memset(buffer, ' ', sizeof(buffer));
  230.         result = _vsnprintf(buffer, length, fmt, args);
  231.         length *= 2;
  232.         if (length > MAX_LEN)
  233.         {
  234.             delete [] buffer;
  235.             va_end(args);
  236.             return "";
  237.         }
  238.     }
  239.  
  240.     string str(buffer);
  241.     delete [] buffer;
  242.     va_end(args);
  243.  
  244.     return str;
  245. }
  246.  
  247.  
  248. string CUtils::StrPad(string s_line, unsigned int ui_consolewidth)
  249. {
  250.     int iPadLen = (int)ui_consolewidth - (int)s_line.length();
  251.  
  252.     if ((iPadLen <= 0) || (iPadLen > 1000))
  253.         return s_line;
  254.  
  255.     string s_padding((iPadLen - 1), ' ');
  256.  
  257.     return (s_line + s_padding);
  258. }
  259.  
  260.  
  261. string CUtils::StrFormatFPS(double d_fps)
  262. {
  263.     string sRet = "";
  264.  
  265.     if (d_fps < 9.999)
  266.         sRet = StrFormat("%.3f", d_fps);
  267.     else if (d_fps < 99.99)
  268.         sRet = StrFormat("%.2f", d_fps);
  269.     else if (d_fps < 999.9)
  270.         sRet = StrFormat("%.1f", d_fps);
  271.     else
  272.         sRet = StrFormat("%u", (unsigned int)(d_fps + 0.5));
  273.  
  274.     return sRet;
  275. }
  276.  
  277.  
  278. BOOL CUtils::GetProductVersion(string &s_version)
  279. {
  280.     BOOL bRet = FALSE;
  281.     char szFilename[MAX_PATH + 1] = {0};
  282.  
  283.     if (GetModuleFileName(NULL, szFilename, MAX_PATH) == 0)
  284.         return bRet;
  285.  
  286.     DWORD dummy;
  287.     DWORD dwSize = GetFileVersionInfoSize(szFilename, &dummy);
  288.     if (dwSize == 0)
  289.         return bRet;
  290.  
  291.     void* pVersion = malloc(dwSize);
  292.     if (pVersion == NULL)
  293.         return bRet;
  294.  
  295.     if (!GetFileVersionInfo(szFilename, NULL, dwSize, pVersion))
  296.     {
  297.         free(pVersion);
  298.         return bRet;
  299.     }
  300.  
  301.     LPVOID pvProductVersion = NULL;
  302.     unsigned int iProductVersionLen = 0;
  303.  
  304.     if (!VerQueryValue(pVersion, "\\StringFileInfo\\080904b0\\ProductVersion", &pvProductVersion, &iProductVersionLen))
  305.         return bRet;
  306.  
  307.     s_version = (char*)pvProductVersion;
  308.     bRet = TRUE;
  309.  
  310.     return bRet;
  311. }
  312.  
  313.  
  314. BOOL CUtils::GetResourceInfo(string s_file)
  315. {
  316.     resinfo.sLanguage = "";
  317.     resinfo.sFixedFileVersion = "";
  318.     resinfo.sFixedProductVersion = "";
  319.     resinfo.sComments = "";
  320.     resinfo.sCompanyName = "";
  321.     resinfo.sFileDescription = "";
  322.     resinfo.sFileVersion = "";
  323.     resinfo.sInternalName = "";
  324.     resinfo.sLegalCopyright = "";
  325.     resinfo.sLegalTrademarks = "";
  326.     resinfo.sOriginalFilename = "";
  327.     resinfo.sPrivateBuild = "";
  328.     resinfo.sProductName = "";
  329.     resinfo.sProductVersion = "";
  330.     resinfo.sSpecialBuild = "";
  331.  
  332.     CFileVersionInfo fvi;
  333.  
  334.     if (fvi.Open(s_file.c_str()))
  335.     {
  336.         if (fvi.GetTransCount() > 0)
  337.         {
  338.             char szLID[56] = {0};
  339.             //LPCTSTR lpszTmp = NULL;
  340.             fvi.GetLIDName(fvi.GetLIDByIndex(0), szLID, 56);
  341.             //fvi.GetCPName(fvi.GetCPByIndex(0), &lpszTmp);
  342.             resinfo.sLanguage = StrFormat("%s", szLID);
  343.         }
  344.         else
  345.         {
  346.             fvi.Close();
  347.             return FALSE;
  348.         }
  349.  
  350.         char szVer[1024] = {0};
  351.         resinfo.sFixedFileVersion = StrFormat("%d.%d.%d.%d", fvi.GetFileVersionMajor(), fvi.GetFileVersionMinor(), fvi.GetFileVersionBuild(), fvi.GetFileVersionQFE());
  352.         resinfo.sFixedProductVersion = StrFormat("%d.%d.%d.%d", fvi.GetProductVersionMajor(), fvi.GetProductVersionMinor(), fvi.GetProductVersionBuild(), fvi.GetProductVersionQFE());
  353.  
  354.         if (fvi.QueryStringValue(VI_STR_COMMENTS, szVer, 1024))
  355.             resinfo.sComments = StrFormat("%s", szVer);
  356.         if (fvi.QueryStringValue(VI_STR_COMPANYNAME, szVer, 1024))
  357.             resinfo.sCompanyName = StrFormat("%s", szVer);
  358.         if (fvi.QueryStringValue(VI_STR_FILEDESCRIPTION, szVer, 1024))
  359.             resinfo.sFileDescription = StrFormat("%s", szVer);
  360.         if (fvi.QueryStringValue(VI_STR_FILEVERSION, szVer, 1024))
  361.             resinfo.sFileVersion = StrFormat("%s", szVer);
  362.         if (fvi.QueryStringValue(VI_STR_INTERNALNAME, szVer, 1024))
  363.             resinfo.sInternalName = StrFormat("%s", szVer);
  364.         if (fvi.QueryStringValue(VI_STR_LEGALCOPYRIGHT, szVer, 1024))
  365.             resinfo.sLegalCopyright = StrFormat("%s", szVer);
  366.         if (fvi.QueryStringValue(VI_STR_LEGALTRADEMARKS, szVer, 1024))
  367.             resinfo.sLegalTrademarks = StrFormat("%s", szVer);
  368.         if (fvi.QueryStringValue(VI_STR_ORIGINALFILENAME, szVer, 1024))
  369.             resinfo.sOriginalFilename = StrFormat("%s", szVer);
  370.         if (fvi.QueryStringValue(VI_STR_PRIVATEBUILD, szVer, 1024))
  371.             resinfo.sPrivateBuild = StrFormat("%s", szVer);
  372.         if (fvi.QueryStringValue(VI_STR_PRODUCTNAME, szVer, 1024))
  373.             resinfo.sProductName = StrFormat("%s", szVer);
  374.         if (fvi.QueryStringValue(VI_STR_PRODUCTVERSION, szVer, 1024))
  375.             resinfo.sProductVersion = StrFormat("%s", szVer);
  376.         if (fvi.QueryStringValue(VI_STR_SPECIALBUILD, szVer, 1024))
  377.             resinfo.sSpecialBuild = StrFormat("%s", szVer);
  378.  
  379.         fvi.Close();
  380.  
  381.         return TRUE;
  382.     }
  383.  
  384.     return FALSE; //no version resource
  385. }
  386.  
  387.  
  388. string CUtils::OSErrorMessage()
  389. {
  390.     LPVOID lpf;
  391.     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),    (LPTSTR)&lpf, 0,    NULL);
  392.     
  393.     return (LPCTSTR)lpf;
  394. }
  395.  
  396.  
  397. BOOL CUtils::IsNumeric(string s_string)
  398. {
  399.     if (s_string == "")
  400.         return FALSE;
  401.  
  402.     for (unsigned int ipos = 0; ipos < s_string.length(); ipos++)
  403.     {
  404.         switch (s_string[ipos])
  405.         {
  406.             case '0':
  407.             case '1':
  408.             case '2':
  409.             case '3':
  410.             case '4':
  411.             case '5':
  412.             case '6':
  413.             case '7':
  414.             case '8':
  415.             case '9':
  416.             case '-':
  417.                 continue;
  418.             default:
  419.                 return FALSE;
  420.         }
  421.     }
  422.  
  423.     return TRUE;
  424. }
  425.  
  426.  
  427. #endif //_UTILS_H
  428.  
  429.