1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00
Files
winscp/source/core/FileInfo.cpp
Martin Prikryl b13e2e7c2b #pragma package(smart_init) is not useful out of packages
Source commit: 7635ac3b532214f27ea2b6fe6aa80398c857cfcd
2025-08-23 01:06:48 +02:00

137 lines
4.5 KiB
C++

//---------------------------------------------------------------------------
#include <CorePCH.h>
#pragma hdrstop
#include "FileInfo.h"
#include "FileBuffer.h"
//---------------------------------------------------------------------------
// Return pointer to file version info block
void * __fastcall CreateFileInfo(UnicodeString FileName)
{
unsigned long Handle;
unsigned int Size;
char * Result = NULL;
// Get file version info block size
Size = GetFileVersionInfoSize(FileName.c_str(), &Handle);
// If size is valid
if (Size > 0)
{
Result = new char[Size];
// Get file version info block
if (!GetFileVersionInfo(FileName.c_str(), Handle, Size, Result))
{
delete[] Result;
Result = NULL;
}
}
return Result;
}
//---------------------------------------------------------------------------
// Free file version info block memory
void __fastcall FreeFileInfo(void * FileInfo)
{
delete[] static_cast<char *>(FileInfo);
}
//---------------------------------------------------------------------------
typedef TTranslation TTranslations[65536];
typedef TTranslation *PTranslations;
//---------------------------------------------------------------------------
// Return pointer to fixed file version info
PVSFixedFileInfo __fastcall GetFixedFileInfo(void * FileInfo)
{
UINT Len;
PVSFixedFileInfo Result;
if (!VerQueryValue(FileInfo, L"\\", (void**)&Result, &Len))
{
throw Exception(L"Fixed file info not available");
}
return Result;
}
//---------------------------------------------------------------------------
// Return number of available file version info translations
unsigned __fastcall GetTranslationCount(void * FileInfo)
{
PTranslations P;
UINT Len;
if (!VerQueryValue(FileInfo, L"\\VarFileInfo\\Translation", (void**)&P, &Len))
{
throw Exception(L"File info translations not available");
}
return Len / 4;
}
//---------------------------------------------------------------------------
// Return i-th translation in the file version info translation list
TTranslation __fastcall GetTranslation(void * FileInfo, unsigned i)
{
PTranslations P;
UINT Len;
if (!VerQueryValue(FileInfo, L"\\VarFileInfo\\Translation", (void**)&P, &Len))
{
throw Exception(L"File info translations not available");
}
if (i * sizeof(TTranslation) >= Len)
{
throw Exception(L"Specified translation not available");
}
return P[i];
}
//---------------------------------------------------------------------------
// Return the value of the specified file version info string using the
// specified translation
UnicodeString __fastcall GetFileInfoString(void * FileInfo,
TTranslation Translation, UnicodeString StringName, bool AllowEmpty)
{
UnicodeString Result;
wchar_t * P;
UINT Len;
UnicodeString SubBlock =
UnicodeString(L"\\StringFileInfo\\") + IntToHex(Translation.Language, 4) + IntToHex(Translation.CharSet, 4) + L"\\" + StringName;
if (!VerQueryValue(FileInfo, SubBlock.c_str(), (void**)&P, &Len))
{
if (!AllowEmpty)
{
throw Exception("Specified file info string not available");
}
}
else
{
Result = UnicodeString(P, Len);
PackStr(Result);
}
return Result;
}
//---------------------------------------------------------------------------
int __fastcall CalculateCompoundVersion(int MajorVer, int MinorVer, int Release)
{
int CompoundVer = 10000 * (Release + 100 * (MinorVer + 100 * MajorVer));
return CompoundVer;
}
//---------------------------------------------------------------------------
int ZeroBuildNumber(int CompoundVersion)
{
return (CompoundVersion / 10000 * 10000);
}
//---------------------------------------------------------------------------
int __fastcall StrToCompoundVersion(UnicodeString S)
{
int MajorVer = Min(StrToInt(CutToChar(S, L'.', false)), 99);
int MinorVer = Min(StrToInt(CutToChar(S, L'.', false)), 99);
int Release = S.IsEmpty() ? 0 : Min(StrToInt(CutToChar(S, L'.', false)), 99);
return CalculateCompoundVersion(MajorVer, MinorVer, Release);
}
//---------------------------------------------------------------------------
int __fastcall CompareVersion(UnicodeString V1, UnicodeString V2)
{
int Result = 0;
while ((Result == 0) && (!V1.IsEmpty() || !V2.IsEmpty()))
{
int C1 = StrToIntDef(CutToChar(V1, L'.', false), 0);
int C2 = StrToIntDef(CutToChar(V2, L'.', false), 0);
Result = CompareValue(C1, C2);
}
return Result;
}