Viewing file: version.cpp (4.32 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// FileZilla Server - a Windows ftp server
// Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h"
#include "version.h"
CStdString GetVersionString()
{
//Fill the version info
TCHAR fullpath[MAX_PATH + 10];
GetModuleFileName(0, fullpath, MAX_PATH + 10);
TCHAR *str = new TCHAR[_tcslen(fullpath) + 1];
_tcscpy(str, fullpath);
DWORD tmp = 0;
DWORD len = GetFileVersionInfoSize(str, &tmp);
LPVOID pBlock = new char[len];
GetFileVersionInfo(str, 0, len, pBlock);
LPVOID ptr;
UINT ptrlen;
CStdString ProductName;
//Retreive the product name
TCHAR SubBlock[50];
// Structure used to store enumerated languages and code pages.
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
UINT cbTranslate;
// Read the list of languages and code pages.
if (VerQueryValue(pBlock,
_T("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate))
{
// Read the file description for each language and code page.
_stprintf( SubBlock,
_T("\\StringFileInfo\\%04x%04x\\ProductName"),
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);
// Retrieve file description for language and code page "0".
if (VerQueryValue(pBlock,
SubBlock,
&ptr,
&ptrlen))
{
ProductName = (TCHAR*)ptr;
}
}
CStdString version;
//Format the versionstring
if (VerQueryValue(pBlock, _T("\\"), &ptr, &ptrlen))
{
VS_FIXEDFILEINFO *fi = (VS_FIXEDFILEINFO*)ptr;
if (fi->dwFileVersionMS >> 16)
{
//v1.00+
if (fi->dwFileVersionLS & 0xFFFF)
{ //test releases
if (fi->dwFileVersionLS >> 16)
{
TCHAR ch = 'a';
ch += static_cast<TCHAR>(fi->dwFileVersionLS >> 16) - 1;
version.Format(_T("%s version %d.%d%c test release %d)"), (LPCTSTR)ProductName, fi->dwFileVersionMS >> 16, fi->dwFileVersionMS & 0xFFFF, ch, fi->dwFileVersionLS & 0xFFFF);
}
else
version.Format(_T("%s version %d.%d test release %d"), (LPCTSTR)ProductName, fi->dwFileVersionMS >> 16, fi->dwFileVersionMS & 0xFFFF, fi->dwFileVersionLS & 0xFFFF);
}
else
{ //final versions
if (fi->dwFileVersionLS >> 16)
{
TCHAR ch = 'a';
ch += static_cast<TCHAR>(fi->dwFileVersionLS >> 16) - 1;
version.Format(_T("%s version %d.%d%c final"), (LPCTSTR)ProductName, fi->dwFileVersionMS >> 16, fi->dwFileVersionMS & 0xFFFF, ch);
}
else
version.Format(_T("%s version %d.%d final"), (LPCTSTR)ProductName, fi->dwFileVersionMS >> 16, fi->dwFileVersionMS & 0xFFFF);
}
}
else
{
//beta versions
if ((fi->dwFileVersionLS & 0xFFFF) / 100)
if ((fi->dwFileVersionLS & 0xFFFF) % 100)
//test release
version.Format(_T("%s version 0.%d.%d%c beta test release %d"), (LPCTSTR)ProductName, fi->dwFileVersionMS & 0xFFFF, fi->dwFileVersionLS >> 16, (fi->dwFileVersionLS & 0xFFFF) / 100 + 'a' - 1, (fi->dwFileVersionLS & 0xFFFF) % 100);
else
//final version
version.Format(_T("%s version 0.%d.%d%c beta"), (LPCTSTR)ProductName, fi->dwFileVersionMS & 0xFFFF, fi->dwFileVersionLS>>16, (fi->dwFileVersionLS & 0xFFFF) / 100 + 'a' - 1);
else
if (fi->dwFileVersionLS&0xFFFF)
//test release
version.Format(_T("%s version 0.%d.%d beta test release %d"), (LPCTSTR)ProductName, fi->dwFileVersionMS & 0xFFFF, fi->dwFileVersionLS >> 16, fi->dwFileVersionLS & 0xFFFF);
else
//final version
version.Format(_T("%s version 0.%d.%d beta"), (LPCTSTR)ProductName, fi->dwFileVersionMS&0xFFFF, fi->dwFileVersionLS >> 16);
}
}
delete [] str;
delete [] pBlock;
return version;
}
|