Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelfmz <fenix1905@tut.by>2022-09-04 01:04:08 +0300
committerelfmz <fenix1905@tut.by>2022-09-04 01:04:08 +0300
commite03c2c6953bd116edaf97c749532a5823b20c3da (patch)
tree82962aae61b98905a51ead0054688805bef82acd
parent7dc09d4938cb9ac34387253ce2529caa4411e398 (diff)
fix problems handling filenames of near to 255 characters (fix #1343)
-rw-r--r--WinPort/src/APIFiles.cpp4
-rw-r--r--far2l/src/farwinapi.cpp3
-rw-r--r--far2l/src/plug/wrap.cpp30
-rw-r--r--inside/src/PluginImpl.cpp34
-rw-r--r--inside/src/elf/PluginImplELF.cpp4
-rw-r--r--multiarc/src/ArcPlg.cpp5
-rw-r--r--multiarc/src/MultiArc.hpp6
-rw-r--r--multiarc/src/arcread.cpp138
-rw-r--r--multiarc/src/fmt.hpp36
-rw-r--r--multiarc/src/formats/7z/7z.cpp22
-rw-r--r--multiarc/src/formats/ace/ace.cpp24
-rw-r--r--multiarc/src/formats/all.h24
-rw-r--r--multiarc/src/formats/arc/arc.cpp19
-rw-r--r--multiarc/src/formats/arj/arj.cpp22
-rw-r--r--multiarc/src/formats/cab/cab.cpp17
-rw-r--r--multiarc/src/formats/custom/custom.cpp88
-rw-r--r--multiarc/src/formats/ha/ha.cpp18
-rw-r--r--multiarc/src/formats/libarch/libarch.cpp29
-rw-r--r--multiarc/src/formats/lzh/lzh.cpp26
-rw-r--r--multiarc/src/formats/rar/rar.cpp46
-rw-r--r--multiarc/src/formats/targz/targz.cpp67
-rw-r--r--multiarc/src/formats/zip/zip.cpp93
-rw-r--r--utils/include/utils.h33
23 files changed, 437 insertions, 351 deletions
diff --git a/WinPort/src/APIFiles.cpp b/WinPort/src/APIFiles.cpp
index 65b3aa77..3836b79d 100644
--- a/WinPort/src/APIFiles.cpp
+++ b/WinPort/src/APIFiles.cpp
@@ -766,7 +766,7 @@ extern "C"
}
MB2Wide(name, _tmp.wide_name);
- wcsncpy(wfd->cFileName, _tmp.wide_name.c_str(), MAX_NAME - 1);
+ wcsncpy(wfd->cFileName, _tmp.wide_name.c_str(), MAX_NAME);
const DWORD attrs = wfd->dwFileAttributes;
if ((attrs & FILE_ATTRIBUTE_DIRECTORY) != 0) {
@@ -870,7 +870,7 @@ extern "C"
}
LPCWSTR last_slash = wcsrchr(lpFileName, GOOD_SLASH);
- wcsncpy(lpFindFileData->cFileName, last_slash ? last_slash + 1 : lpFileName, MAX_NAME - 1);
+ wcsncpy(lpFindFileData->cFileName, last_slash ? last_slash + 1 : lpFileName, MAX_NAME);
return (HANDLE)&g_unix_found_file_dummy;
}
diff --git a/far2l/src/farwinapi.cpp b/far2l/src/farwinapi.cpp
index 724698b4..a618a6da 100644
--- a/far2l/src/farwinapi.cpp
+++ b/far2l/src/farwinapi.cpp
@@ -68,7 +68,8 @@ static void TranslateFindFile(const WIN32_FIND_DATA &wfd, FAR_FIND_DATA_EX& Find
FindData.dwUnixMode = wfd.dwUnixMode;
FindData.nHardLinks = wfd.nHardLinks;
FindData.nBlockSize = wfd.nBlockSize;
- FindData.strFileName = wfd.cFileName;
+
+ FindData.strFileName.Copy(wfd.cFileName, wcsnlen(wfd.cFileName, ARRAYSIZE(wfd.cFileName)));
}
FindFile::FindFile(LPCWSTR Object, bool ScanSymLink, DWORD WinPortFindFlags) :
diff --git a/far2l/src/plug/wrap.cpp b/far2l/src/plug/wrap.cpp
index 2d6fa4df..aeee159d 100644
--- a/far2l/src/plug/wrap.cpp
+++ b/far2l/src/plug/wrap.cpp
@@ -42,7 +42,7 @@ static int PZ_to_PWZ(const char *src, wchar_t *dst, int lendst)
}
-const char *FirstSlashA(const char *String)
+static const char *FirstSlashA(const char *String)
{
do
{
@@ -68,7 +68,7 @@ bool FirstSlashA(const char *String,size_t &pos)
return Ret;
}
-const char *LastSlashA(const char *String)
+static const char *LastSlashA(const char *String)
{
const char *Start = String;
@@ -81,7 +81,7 @@ const char *LastSlashA(const char *String)
return IsSlashA(*String)?String:nullptr;
}
-bool LastSlashA(const char *String,size_t &pos)
+static bool LastSlashA(const char *String,size_t &pos)
{
bool Ret=false;
const char *Ptr=LastSlashA(String);
@@ -95,7 +95,7 @@ bool LastSlashA(const char *String,size_t &pos)
return Ret;
}
-void AnsiToUnicodeBin(const char *lpszAnsiString, wchar_t *lpwszUnicodeString, int nLength, UINT CodePage=CP_UTF8)
+static void AnsiToUnicodeBin(const char *lpszAnsiString, wchar_t *lpwszUnicodeString, int nLength, UINT CodePage=CP_UTF8)
{
if (lpszAnsiString && lpwszUnicodeString && nLength)
{
@@ -105,22 +105,26 @@ void AnsiToUnicodeBin(const char *lpszAnsiString, wchar_t *lpwszUnicodeString, i
}
}
-wchar_t *AnsiToUnicodeBin(const char *lpszAnsiString, int nLength, UINT CodePage=CP_UTF8)
+static wchar_t *AnsiToUnicodeBin(const char *lpszAnsiString, int nLength, UINT CodePage=CP_UTF8)
{
wchar_t *lpResult = (wchar_t*)malloc(nLength*sizeof(wchar_t));
AnsiToUnicodeBin(lpszAnsiString,lpResult,nLength,CodePage);
return lpResult;
}
-wchar_t *AnsiToUnicode(const char *lpszAnsiString, UINT CodePage=CP_UTF8)
+static wchar_t *AnsiToUnicode(const char *lpszAnsiString, int nMaxLength = -1, UINT CodePage = CP_UTF8)
{
if (!lpszAnsiString)
return nullptr;
- return AnsiToUnicodeBin(lpszAnsiString,(int)strlen(lpszAnsiString)+1,CodePage);
+ int nLength = (nMaxLength == -1) ? strlen(lpszAnsiString) : (int)strnlen(lpszAnsiString, nMaxLength);
+
+ wchar_t *out = AnsiToUnicodeBin(lpszAnsiString, nLength+1, CodePage);
+ out[nLength] = 0;
+ return out;
}
-char *UnicodeToAnsiBin(const wchar_t *lpwszUnicodeString, int nLength, UINT CodePage=CP_UTF8)
+static char *UnicodeToAnsiBin(const wchar_t *lpwszUnicodeString, int nLength, UINT CodePage=CP_UTF8)
{
/* $ 06.01.2008 TS
! Увеличил размер выделяемой под строку памяти на 1 байт для нормальной
@@ -163,7 +167,7 @@ char *UnicodeToAnsiBin(const wchar_t *lpwszUnicodeString, int nLength, UINT Code
return lpResult;
}
-char *UnicodeToAnsi(const wchar_t *lpwszUnicodeString, UINT CodePage=CP_UTF8)
+static char *UnicodeToAnsi(const wchar_t *lpwszUnicodeString, UINT CodePage=CP_UTF8)
{
if (!lpwszUnicodeString)
return nullptr;
@@ -171,7 +175,7 @@ char *UnicodeToAnsi(const wchar_t *lpwszUnicodeString, UINT CodePage=CP_UTF8)
return UnicodeToAnsiBin(lpwszUnicodeString,StrLength(lpwszUnicodeString)+1,CodePage);
}
-wchar_t **ArrayAnsiToUnicode(char ** lpaszAnsiString, int iCount)
+static wchar_t **ArrayAnsiToUnicode(char ** lpaszAnsiString, int iCount)
{
wchar_t** lpaResult = nullptr;
@@ -193,7 +197,7 @@ wchar_t **ArrayAnsiToUnicode(char ** lpaszAnsiString, int iCount)
return lpaResult;
}
-void FreeArrayUnicode(wchar_t ** lpawszUnicodeString)
+static void FreeArrayUnicode(wchar_t ** lpawszUnicodeString)
{
if (lpawszUnicodeString)
{
@@ -206,7 +210,7 @@ void FreeArrayUnicode(wchar_t ** lpawszUnicodeString)
}
}
-DWORD OldKeyToKey(DWORD dOldKey)
+static DWORD OldKeyToKey(DWORD dOldKey)
{
if (dOldKey&0x100)
{
@@ -416,7 +420,7 @@ void ConvertPanelItemA(const oldfar::PluginPanelItem *PanelItemA, PluginPanelIte
(*PanelItemW)[i].Flags = PanelItemA[i].Flags;
(*PanelItemW)[i].NumberOfLinks = PanelItemA[i].NumberOfLinks;
(*PanelItemW)[i].CRC32 = PanelItemA[i].CRC32;
- (*PanelItemW)[i].FindData.lpwszFileName = AnsiToUnicode(PanelItemA[i].FindData.cFileName);
+ (*PanelItemW)[i].FindData.lpwszFileName = AnsiToUnicode(PanelItemA[i].FindData.cFileName, ARRAYSIZE(PanelItemA[i].FindData.cFileName));
if (PanelItemA[i].Description)
(*PanelItemW)[i].Description = AnsiToUnicode(PanelItemA[i].Description);
diff --git a/inside/src/PluginImpl.cpp b/inside/src/PluginImpl.cpp
index 2c678dd6..7b706c92 100644
--- a/inside/src/PluginImpl.cpp
+++ b/inside/src/PluginImpl.cpp
@@ -1,11 +1,13 @@
#include "Globals.h"
#include "PluginImpl.h"
+#include <utils.h>
bool PluginImpl::AddUnsized(FP_SizeItemList &il, const char *name, DWORD attrs)
{
- PluginPanelItem tmp = {};
- strncpy(tmp.FindData.cFileName, name, sizeof(tmp.FindData.cFileName) - 1 );
+ PluginPanelItem tmp;
+ ZeroFill(tmp); // ensure zeroed padding after tmp.FindData.cFileName
+ strncpy(tmp.FindData.cFileName, name, ARRAYSIZE(tmp.FindData.cFileName));
tmp.FindData.dwFileAttributes = attrs;
tmp.Description = tmp.FindData.cFileName;
return il.Add(&tmp);
@@ -28,7 +30,8 @@ int PluginImpl::GetFindData(PluginPanelItem **pPanelItem, int *pItemsNumber, int
if(!IS_SILENT(OpMode))
{
- PluginPanelItem tmp = {};
+ PluginPanelItem tmp;
+ ZeroFill(tmp); // ensure zeroed padding after tmp.FindData.cFileName
strcpy(tmp.FindData.cFileName, "..");
tmp.FindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
@@ -114,13 +117,14 @@ int PluginImpl::GetFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, int
if (!data_path.empty() && data_path[data_path.size() - 1] != '/') {
data_path+= '/';
}
- data_path+= PanelItem[i].FindData.cFileName;
-
+
+ const size_t name_ofs = data_path.size();
+ StrAppendArray(data_path, PanelItem[i].FindData.cFileName);
uint64_t len = PanelItem[i].FindData.nFileSize;
- bool rv = OnGetFile(PanelItem[i].FindData.cFileName, data_path.c_str(), len);
+ bool rv = OnGetFile(data_path.c_str() + name_ofs, data_path.c_str(), len);
fprintf(stderr, "Inside::GetFiles[%i]: %s '%s'\n",
- i, rv ? "OK" : "ERROR", PanelItem[i].FindData.cFileName);
+ i, rv ? "OK" : "ERROR", data_path.c_str() + name_ofs);
}
return out;
@@ -137,16 +141,18 @@ int PluginImpl::PutFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, int
sdc_getcwd(cd, sizeof(cd) - 1);
std::string data_path;
for (int i = 0; i < ItemsNumber; ++i) {
+ size_t name_ofs = 0;
if (PanelItem[i].FindData.cFileName[0] != '/') {
data_path = cd;
data_path+= '/';
- data_path+= PanelItem[i].FindData.cFileName;
+ name_ofs = data_path.size();
+ StrAppendArray(data_path, PanelItem[i].FindData.cFileName);
} else
- data_path = PanelItem[i].FindData.cFileName;
+ StrAssignArray(data_path, PanelItem[i].FindData.cFileName);
- bool rv = OnPutFile(PanelItem[i].FindData.cFileName, data_path.c_str());
+ bool rv = OnPutFile(data_path.c_str() + name_ofs, data_path.c_str());
fprintf(stderr, "Inside::PutFiles[%i]: %s '%s'\n",
- i, rv ? "OK" : "ERROR", PanelItem[i].FindData.cFileName);
+ i, rv ? "OK" : "ERROR", data_path.c_str() + name_ofs);
if (!rv)
out = FALSE;
@@ -160,10 +166,12 @@ int PluginImpl::DeleteFiles(struct PluginPanelItem *PanelItem, int ItemsNumber,
if (ItemsNumber == 0 )
return FALSE;
+ std::string safe_name;
for (int i = 0; i < ItemsNumber; ++i) {
- bool rv = OnDeleteFile(PanelItem[i].FindData.cFileName);
+ StrAssignArray(safe_name, PanelItem[i].FindData.cFileName);
+ bool rv = OnDeleteFile(safe_name.c_str());
fprintf(stderr, "Inside::DeleteFiles[%i]: %s '%s'\n",
- i, rv ? "OK" : "ERROR", PanelItem[i].FindData.cFileName);
+ i, rv ? "OK" : "ERROR", safe_name.c_str());
}
return TRUE;
diff --git a/inside/src/elf/PluginImplELF.cpp b/inside/src/elf/PluginImplELF.cpp
index 96864e11..7fb3965e 100644
--- a/inside/src/elf/PluginImplELF.cpp
+++ b/inside/src/elf/PluginImplELF.cpp
@@ -2,6 +2,7 @@
#include "PluginImplELF.h"
#include "Dumper.h"
#include "ELFInfo.h"
+#include <utils.h>
#define STR_DISASM "Disassembly"
@@ -11,7 +12,8 @@
static bool AddBinFile(FP_SizeItemList &il, const char *prefix, uint64_t ofs, uint64_t len)
{
- PluginPanelItem tmp = {};
+ PluginPanelItem tmp;
+ ZeroFill(tmp); // ensure zeroed padding after tmp.FindData.cFileName
snprintf(tmp.FindData.cFileName, sizeof(tmp.FindData.cFileName) - 1,
"%s@%llx.bin", prefix, (unsigned long long)ofs);
tmp.FindData.nFileSize = len;
diff --git a/multiarc/src/ArcPlg.cpp b/multiarc/src/ArcPlg.cpp
index 41cb9bc0..c4357f36 100644
--- a/multiarc/src/ArcPlg.cpp
+++ b/multiarc/src/ArcPlg.cpp
@@ -145,11 +145,10 @@ BOOL ArcPlugins::OpenArchive(int PluginNumber, const char *Name,int *Type,bool S
return FALSE;
}
-int ArcPlugins::GetArcItem(int PluginNumber,struct PluginPanelItem *Item,
- struct ArcItemInfo *Info)
+int ArcPlugins::GetArcItem(int PluginNumber, struct ArcItemInfo *Info)
{
if ((DWORD)PluginNumber < PluginsData.size() && PluginsData[PluginNumber].pGetArcItem)
- return PluginsData[PluginNumber].pGetArcItem(Item,Info);
+ return PluginsData[PluginNumber].pGetArcItem(Info);
return FALSE;
}
diff --git a/multiarc/src/MultiArc.hpp b/multiarc/src/MultiArc.hpp
index 40a36f08..f8361572 100644
--- a/multiarc/src/MultiArc.hpp
+++ b/multiarc/src/MultiArc.hpp
@@ -66,7 +66,7 @@ struct ArcItemUserData{
typedef DWORD (WINAPI *PLUGINLOADFORMATMODULE)(const char *ModuleName);
typedef BOOL (WINAPI *PLUGINISARCHIVE)(const char *Name,const unsigned char *Data,int DataSize);
typedef BOOL (WINAPI *PLUGINOPENARCHIVE)(const char *Name,int *Type,bool Silent);
-typedef int (WINAPI *PLUGINGETARCITEM)(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+typedef int (WINAPI *PLUGINGETARCITEM)(struct ArcItemInfo *Info);
typedef BOOL (WINAPI *PLUGINCLOSEARCHIVE)(struct ArcInfo *Info);
typedef BOOL (WINAPI *PLUGINGETFORMATNAME)(int Type,char *FormatName,char *DefaultExt);
typedef BOOL (WINAPI *PLUGINGETDEFAULTCOMMANDS)(int Type,int Command,char *Dest);
@@ -114,7 +114,7 @@ class ArcPlugins
int IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL IsArchive(int ArcPluginNumber, const char *Name,const unsigned char *Data,int DataSize, DWORD* SFXSize);
BOOL OpenArchive(int PluginNumber,const char *Name,int *Type,bool Silent);
- int GetArcItem(int PluginNumber,struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+ int GetArcItem(int PluginNumber,struct ArcItemInfo *Info);
void CloseArchive(int PluginNumber,struct ArcInfo *Info);
BOOL GetFormatName(int PluginNumber,int Type,char *FormatName,char *DefaultExt);
BOOL GetDefaultCommands(int PluginNumber,int Type,int Command,char *Dest);
@@ -130,7 +130,7 @@ class PluginClass
private:
char ArcName[NM];
char CurDir[NM];
- std::vector<PluginPanelItem> ArcData;
+ std::vector<ArcItemInfo> ArcData;
struct stat ArcStat {};
int ArcPluginNumber;
int ArcPluginType;
diff --git a/multiarc/src/arcread.cpp b/multiarc/src/arcread.cpp
index efa1076f..065dfb73 100644
--- a/multiarc/src/arcread.cpp
+++ b/multiarc/src/arcread.cpp
@@ -1,4 +1,5 @@
#include <fcntl.h>
+#include <assert.h>
#include "MultiArc.hpp"
#include "marclng.hpp"
@@ -7,11 +8,10 @@ PluginClass::PluginClass(int ArcPluginNumber)
*ArcName=0;
*CurDir=0;
PluginClass::ArcPluginNumber=ArcPluginNumber;
- memset(&CurArcInfo,0,sizeof(struct ArcInfo));
- memset(&ItemsInfo,0,sizeof(ItemsInfo));
DizPresent=FALSE;
bGOPIFirstCall=true;
*farlang=0;
+ ZeroFill(CurArcInfo);
}
@@ -24,9 +24,6 @@ void PluginClass::FreeArcData()
{
for (auto &I : ArcData)
{
- if (I.Description!=NULL)
- delete[] I.Description;
-
if(I.UserData && (I.Flags & PPIF_USERDATA))
{
struct ArcItemUserData *aud=(struct ArcItemUserData*)I.UserData;
@@ -54,6 +51,14 @@ int PluginClass::PreReadArchive(const char *Name)
return TRUE;
}
+
+static void SanitizeString(std::string &s)
+{
+ while (!s.empty() && !s.back()) {
+ s.pop_back();
+ }
+}
+
int PluginClass::ReadArchive(const char *Name,int OpMode)
{
bGOPIFirstCall=true;
@@ -66,8 +71,8 @@ int PluginClass::ReadArchive(const char *Name,int OpMode)
if (!ArcPlugin->OpenArchive(ArcPluginNumber,Name,&ArcPluginType,(OpMode & OPM_SILENT)!=0))
return FALSE;
- memset(&ItemsInfo,0,sizeof(ItemsInfo));
- memset(&CurArcInfo,0,sizeof(CurArcInfo));
+ ItemsInfo = ArcItemInfo{};
+ ZeroFill(CurArcInfo);
TotalSize=PackedSize=0;
HANDLE hScreen=Info.SaveScreen(0,0,-1,-1);
@@ -85,11 +90,12 @@ int PluginClass::ReadArchive(const char *Name,int OpMode)
break;
}
- struct PluginPanelItem &CurArcData = ArcData.back();
- struct ArcItemInfo CurItemInfo;
- memset(&CurArcData,0,sizeof(CurArcData));
- memset(&CurItemInfo,0,sizeof(CurItemInfo));
- GetItemCode=ArcPlugin->GetArcItem(ArcPluginNumber,&CurArcData,&CurItemInfo);
+ auto &CurItemInfo = ArcData.back();
+ GetItemCode=ArcPlugin->GetArcItem(ArcPluginNumber,&CurItemInfo);
+ SanitizeString(CurItemInfo.PathName);
+ SanitizeString(CurItemInfo.HostOS);
+ SanitizeString(CurItemInfo.Description);
+
if (GetItemCode!=GETARC_SUCCESS)
{
@@ -124,16 +130,16 @@ int PluginClass::ReadArchive(const char *Name,int OpMode)
}
}
- if (*CurItemInfo.Description)
+ if (!CurItemInfo.Description.empty())
{
- CurArcData.Description=new char[strlen(CurItemInfo.Description)+1];
- if (CurArcData.Description)
- strcpy(CurArcData.Description,CurItemInfo.Description);
+// CurArcData.Description=new char[strlen(CurItemInfo.Description)+1];
+// if (CurArcData.Description)
+// strcpy(CurArcData.Description,CurItemInfo.Description);
DizPresent=TRUE;
}
- if (strcmp(ItemsInfo.HostOS,CurItemInfo.HostOS)!=0)
- strcpy(ItemsInfo.HostOS,(*ItemsInfo.HostOS?GetMsg(MSeveralOS):CurItemInfo.HostOS));
+ if (ItemsInfo.HostOS != CurItemInfo.HostOS)
+ ItemsInfo.HostOS = (ItemsInfo.HostOS.empty() ? CurItemInfo.HostOS : GetMsg(MSeveralOS));
if (ItemsInfo.Codepage <= 0)
ItemsInfo.Codepage=CurItemInfo.Codepage;
@@ -143,7 +149,7 @@ int PluginClass::ReadArchive(const char *Name,int OpMode)
ItemsInfo.Encrypted|=CurItemInfo.Encrypted;
if (CurItemInfo.Encrypted)
- CurArcData.Flags|=F_ENCRYPTED;
+ CurItemInfo.Flags|=F_ENCRYPTED;
if (CurItemInfo.DictSize>ItemsInfo.DictSize)
ItemsInfo.DictSize=CurItemInfo.DictSize;
@@ -151,16 +157,16 @@ int PluginClass::ReadArchive(const char *Name,int OpMode)
if (CurItemInfo.UnpVer>ItemsInfo.UnpVer)
ItemsInfo.UnpVer=CurItemInfo.UnpVer;
- CurArcData.NumberOfLinks=1;
+ CurItemInfo.NumberOfLinks=1;
- NormalizePath(CurArcData.FindData.cFileName,CurArcData.FindData.cFileName);
- //fprintf(stderr, "PATH: %s\n", CurArcData.FindData.cFileName);
+ NormalizePath(CurItemInfo.PathName);
+ //fprintf(stderr, "PATH: %s\n", CurItemInfo.PathName.c_str());
struct ArcItemUserData *aud=NULL;
char *Pref=NULL;
- char *NamePtr=CurArcData.FindData.cFileName;
- char *EndPos=NamePtr;
+ const char *NamePtr=CurItemInfo.PathName.c_str();
+ const char *EndPos=NamePtr;
while(*EndPos == '.') EndPos++;
if(*EndPos == '/')
while(*EndPos == '/') EndPos++;
@@ -176,37 +182,38 @@ int PluginClass::ReadArchive(const char *Name,int OpMode)
}
}
- if(CurArcData.UserData || Pref || CurItemInfo.Codepage > 0)
+ if(CurItemInfo.UserData || Pref || CurItemInfo.Codepage > 0)
{
if((aud=(struct ArcItemUserData*)malloc(sizeof(struct ArcItemUserData))) != NULL)
{
- CurArcData.Flags |= PPIF_USERDATA;
+ CurItemInfo.Flags |= PPIF_USERDATA;
aud->SizeStruct=sizeof(struct ArcItemUserData);
aud->Prefix=Pref;
- aud->LinkName=CurArcData.UserData?(char *)CurArcData.UserData:NULL;
+ aud->LinkName=CurItemInfo.UserData?(char *)CurItemInfo.UserData:NULL;
aud->Codepage=CurItemInfo.Codepage;
- CurArcData.UserData=(DWORD_PTR)aud;
+ CurItemInfo.UserData=(DWORD_PTR)aud;
}
else
- CurArcData.UserData=0;
+ CurItemInfo.UserData=0;
}
- if(!CurArcData.UserData && Pref)
+ if(!CurItemInfo.UserData && Pref)
free(Pref);
- if (EndPos!=CurArcData.FindData.cFileName)
- memmove(CurArcData.FindData.cFileName,EndPos,strlen(EndPos)+1);
-
- int Length=strlen(CurArcData.FindData.cFileName);
+ if (EndPos!=NamePtr)
+ {
+ assert(size_t(EndPos - NamePtr) <= CurItemInfo.PathName.size());
+ CurItemInfo.PathName.erase(0, EndPos - NamePtr);
+ }
- if (Length>0 && (CurArcData.FindData.cFileName[Length-1]=='/'))
+ if (!CurItemInfo.PathName.empty() && CurItemInfo.PathName.back() == '/')
{
- CurArcData.FindData.cFileName[Length-1]=0;
- CurArcData.FindData.dwFileAttributes|=FILE_ATTRIBUTE_DIRECTORY;
+ CurItemInfo.PathName.pop_back();
+ CurItemInfo.dwFileAttributes|=FILE_ATTRIBUTE_DIRECTORY;
}
- TotalSize+=CurArcData.FindData.nFileSize;
- PackedSize+=CurArcData.FindData.nPhysicalSize;
+ TotalSize+=CurItemInfo.nFileSize;
+ PackedSize+=CurItemInfo.nPhysicalSize;
}
Info.RestoreScreen(NULL);
@@ -278,6 +285,24 @@ bool PluginClass::EnsureFindDataUpToDate(int OpMode)
return ReadArcOK;
}
+static void ArcItemInfo2PluginPanelItem(const ArcItemInfo &aai, PluginPanelItem &ppi)
+{
+ ZeroFill(ppi);
+ ppi.FindData.ftCreationTime = aai.ftCreationTime;
+ ppi.FindData.ftLastAccessTime = aai.ftLastAccessTime;
+ ppi.FindData.ftLastWriteTime = aai.ftLastWriteTime;
+ ppi.FindData.nPhysicalSize = aai.nPhysicalSize;
+ ppi.FindData.nFileSize = aai.nFileSize;
+ ppi.FindData.dwFileAttributes = aai.dwFileAttributes;
+ ppi.FindData.dwUnixMode = aai.dwUnixMode;
+ strncpy(ppi.FindData.cFileName, aai.PathName.c_str(), ARRAYSIZE(ppi.FindData.cFileName));
+ ppi.UserData = aai.UserData;
+ ppi.Flags = aai.Flags;
+ ppi.NumberOfLinks = aai.NumberOfLinks;
+ ppi.CRC32 = aai.CRC32;
+ ppi.Description = aai.Description.empty() ? nullptr : (char *)aai.Description.c_str();
+}
+
int PluginClass::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int OpMode)
{
if (!EnsureFindDataUpToDate(OpMode))
@@ -289,8 +314,8 @@ int PluginClass::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int
int AlocatedItemsNumber=0;
for (const auto &I : ArcData)
{
- auto CurItem = I;
- const char *Name = I.FindData.cFileName;
+ ArcItemInfo CurItem = I;
+ const char *Name = I.PathName.c_str();
BOOL Append=FALSE;
if (Name[0]==GOOD_SLASH)
@@ -308,26 +333,28 @@ int PluginClass::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int
if (Slash != NULL)
{
NameLen = Slash - StartName;
- CurItem.FindData.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY;
- CurItem.FindData.nFileSize=0;
- CurItem.FindData.nPhysicalSize=0;
+ CurItem.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY;
+ CurItem.nFileSize=0;
+ CurItem.nPhysicalSize=0;
} else
NameLen = strlen(StartName);
- if (NameLen >= sizeof(CurItem.FindData.cFileName))
- NameLen = sizeof(CurItem.FindData.cFileName) - 1;
- memcpy(CurItem.FindData.cFileName,StartName,NameLen);
- CurItem.FindData.cFileName[NameLen] = 0;
+ if (StartName != Name)
+ {
+ assert(size_t(StartName - Name) <= I.PathName.size());
+ CurItem.PathName.erase(0, StartName - Name);
+ }
+ CurItem.PathName.resize(NameLen);
Append=TRUE;
- if (CurItem.FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ if (CurItem.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
for (int J=0; J < *pItemsNumber; J++)
if ((*pPanelItem)[J].FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
- if (strcmp(CurItem.FindData.cFileName,(*pPanelItem)[J].FindData.cFileName)==0)
+ if (StrMatchArray(CurItem.PathName, (*pPanelItem)[J].FindData.cFileName))
{
Append=FALSE;
- (*pPanelItem)[J].FindData.dwFileAttributes |= CurItem.FindData.dwFileAttributes;
+ (*pPanelItem)[J].FindData.dwFileAttributes |= CurItem.dwFileAttributes;
}
}
}
@@ -345,7 +372,8 @@ int PluginClass::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int
*pPanelItem=NewPanelItem;
}
- NewPanelItem[*pItemsNumber]=CurItem;
+ ArcItemInfo2PluginPanelItem(CurItem, NewPanelItem[*pItemsNumber]);
+ //NewPanelItem[*pItemsNumber]=CurItem;
(*pItemsNumber)++;
}
@@ -392,7 +420,7 @@ int PluginClass::SetDirectory(const char *Dir,int OpMode)
for (const auto &I : ArcData)
{
- const char *CurName=I.FindData.cFileName;
+ const char *CurName=I.PathName.c_str();
if (strlen(CurName)>=CurDirLength+NewDirLength && strncmp(CurName+CurDirLength,Dir,NewDirLength)==0)
{
@@ -475,8 +503,8 @@ void PluginClass::GetOpenPluginInfo(struct OpenPluginInfo *Info)
FSF.sprintf(InfoLines[1].Data+strlen(InfoLines[1].Data)," %d.%d",
ItemsInfo.UnpVer/256,ItemsInfo.UnpVer%256);
- if (*ItemsInfo.HostOS)
- FSF.sprintf(InfoLines[1].Data+strlen(InfoLines[1].Data),"/%s",ItemsInfo.HostOS);
+ if (!ItemsInfo.HostOS.empty())
+ FSF.sprintf(InfoLines[1].Data+strlen(InfoLines[1].Data),"/%s",ItemsInfo.HostOS.c_str());
strcpy(InfoLines[2].Text,GetMsg(MInfoArcType));
diff --git a/multiarc/src/fmt.hpp b/multiarc/src/fmt.hpp
index 46a01751..7e7c5c3d 100644
--- a/multiarc/src/fmt.hpp
+++ b/multiarc/src/fmt.hpp
@@ -26,6 +26,8 @@
#endif
#include "../../WinPort/WinCompat.h"
+#include <string>
+#include <utils.h>
enum GETARC_CODE
{
@@ -38,15 +40,29 @@ enum GETARC_CODE
struct ArcItemInfo
{
- char HostOS[32];
- char Description[256];
- int Solid;
- int Comment;
- int Encrypted;
- int DictSize;
- int UnpVer;
- int Chapter;
- int Codepage;
+ int Solid{};
+ int Comment{};
+ int Encrypted{};
+ int DictSize{};
+ int UnpVer{};
+ int Chapter{};
+ int Codepage{};
+
+ FILETIME ftCreationTime{};
+ FILETIME ftLastAccessTime{};
+ FILETIME ftLastWriteTime{};
+ DWORD64 nPhysicalSize{};
+ DWORD64 nFileSize{};
+ DWORD dwFileAttributes{};
+ DWORD dwUnixMode{};
+ DWORD_PTR UserData{};
+ DWORD Flags{};
+ DWORD NumberOfLinks{};
+ DWORD CRC32{};
+
+ std::string PathName;
+ std::string HostOS;
+ std::string Description;
};
enum ARCINFO_FLAGS
@@ -80,7 +96,7 @@ void WINAPI _export SetFarInfo(const struct PluginStartupInfo *Info);
BOOL WINAPI _export IsArchive(const char *Name,const unsigned char *Data,int DataSize);
DWORD WINAPI _export GetSFXPos(void);
BOOL WINAPI _export OpenArchive(const char *Name,int *TypeArc);
-int WINAPI _export GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export CloseArchive(struct ArcInfo *Info);
BOOL WINAPI _export GetFormatName(int TypeArc,char *FormatName,char *DefaultExt);
BOOL WINAPI _export GetDefaultCommands(int TypeArc,int Command,char *Dest);
diff --git a/multiarc/src/formats/7z/7z.cpp b/multiarc/src/formats/7z/7z.cpp
index 650520b8..0f9029fa 100644
--- a/multiarc/src/formats/7z/7z.cpp
+++ b/multiarc/src/formats/7z/7z.cpp
@@ -113,7 +113,7 @@ public:
return _valid;
}
- int Next(struct PluginPanelItem *Item, struct ArcItemInfo *Info)
+ int Next(struct ArcItemInfo *Info)
{
if (!_valid)
return GETARC_READERROR;
@@ -159,15 +159,15 @@ public:
++_index;
attribs&=~ (FILE_ATTRIBUTE_BROKEN | FILE_ATTRIBUTE_EXECUTABLE);
- strncpy(Item->FindData.cFileName, name.c_str(), ARRAYSIZE(Item->FindData.cFileName)-1);
- Item->FindData.dwFileAttributes = attribs;
- Item->FindData.dwUnixMode = is_dir ? 0755 : 0644;
- Item->FindData.nFileSize = file_size;
- Item->FindData.nPhysicalSize = packed_size;
- Item->CRC32 = crc32;
+ Info->PathName = name;
+ Info->dwFileAttributes = attribs;
+ Info->dwUnixMode = is_dir ? 0755 : 0644;
+ Info->nFileSize = file_size;
+ Info->nPhysicalSize = packed_size;
+ Info->CRC32 = crc32;
- Item->FindData.ftLastWriteTime = ftm;
- Item->FindData.ftCreationTime = ftc;
+ Info->ftLastWriteTime = ftm;
+ Info->ftCreationTime = ftc;
Info->Solid = 0;
@@ -211,12 +211,12 @@ BOOL WINAPI _export SEVENZ_OpenArchive(const char *Name,int *Type,bool Silent)
-int WINAPI _export SEVENZ_GetArcItem(struct PluginPanelItem *Item, struct ArcItemInfo *Info)
+int WINAPI _export SEVENZ_GetArcItem(struct ArcItemInfo *Info)
{
if (!s_selected_traverser)
return GETARC_READERROR;
- return s_selected_traverser->Next(Item, Info);
+ return s_selected_traverser->Next(Info);
}
diff --git a/multiarc/src/formats/ace/ace.cpp b/multiarc/src/formats/ace/ace.cpp
index f3f2eb51..efaefee2 100644
--- a/multiarc/src/formats/ace/ace.cpp
+++ b/multiarc/src/formats/ace/ace.cpp
@@ -179,7 +179,7 @@ BOOL WINAPI _export ACE_OpenArchive(const char *Name,int *Type,bool Silent)
-int WINAPI _export ACE_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export ACE_GetArcItem(struct ArcItemInfo *Info)
{
struct ACEHEADERBLOCK
{
@@ -254,19 +254,15 @@ int WINAPI _export ACE_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
FileHeader=(struct ACEHEADERFILE*)TempBuf;
if(FileHeader->HeaderFlags&1)
{
- Item->FindData.dwFileAttributes=FileHeader->FileAttr;
- if(FileHeader->FileNameSize)
- {
- if(FileHeader->FileNameSize >= (WORD)sizeof(Item->FindData.cFileName))
- return(GETARC_BROKEN);
- memcpy(Item->FindData.cFileName,FileHeader->FileName,FileHeader->FileNameSize);
- }
- Item->FindData.cFileName[FileHeader->FileNameSize]=0;
- Item->FindData.nFileSize=FileHeader->UnpSize;
- Item->FindData.nPhysicalSize=FileHeader->PackSize;
+ Info->dwFileAttributes=FileHeader->FileAttr;
+ if(FileHeader->FileNameSize > Block.HeaderSize - (sizeof(ACEHEADERFILE) - 1))
+ return(GETARC_BROKEN);
+ Info->PathName.assign(FileHeader->FileName,FileHeader->FileNameSize);
+ Info->nFileSize=FileHeader->UnpSize;
+ Info->nPhysicalSize=FileHeader->PackSize;
FILETIME lft;
WINPORT(DosDateTimeToFileTime)(FileHeader->FDate,FileHeader->FTime,&lft);
- WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime);
+ WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime);
Info->Solid=FileHeader->HeaderFlags&(1<<15)?1:0;
Info->Encrypted=FileHeader->HeaderFlags&(1<<14)?1:0;
@@ -275,8 +271,8 @@ int WINAPI _export ACE_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
//?????
Info->DictSize=1<<FileHeader->DictSize;
//?????
- strcpy(Info->HostOS,OSID[HostOS].Name);
- Item->CRC32=FileHeader->CRC32;
+ Info->HostOS = OSID[HostOS].Name;
+ Info->CRC32=FileHeader->CRC32;
NextPosition+=FileHeader->PackSize;
break;
diff --git a/multiarc/src/formats/all.h b/multiarc/src/formats/all.h
index b7c646f2..f594355f 100644
--- a/multiarc/src/formats/all.h
+++ b/multiarc/src/formats/all.h
@@ -1,7 +1,7 @@
#pragma once
BOOL WINAPI _export ACE_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL WINAPI _export ACE_OpenArchive(const char *Name,int *Type,bool Silent);
-int WINAPI _export ACE_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export ACE_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export ACE_CloseArchive(struct ArcInfo *Info);
DWORD WINAPI _export ACE_GetSFXPos(void);
BOOL WINAPI _export ACE_GetFormatName(int Type,char *FormatName,char *DefaultExt);
@@ -9,13 +9,13 @@ BOOL WINAPI _export ACE_GetDefaultCommands(int Type,int Command,char *Dest);
BOOL WINAPI _export ARC_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
DWORD WINAPI _export ARC_GetSFXPos(void);
BOOL WINAPI _export ARC_OpenArchive(const char *Name,int *Type,bool Silent);
-int WINAPI _export ARC_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export ARC_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export ARC_CloseArchive(struct ArcInfo *Info);
BOOL WINAPI _export ARC_GetFormatName(int Type,char *FormatName,char *DefaultExt);
BOOL WINAPI _export ARC_GetDefaultCommands(int Type,int Command,char *Dest);
BOOL WINAPI _export ARJ_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL WINAPI _export ARJ_OpenArchive(const char *Name,int *Type,bool Silent);
-int WINAPI _export ARJ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export ARJ_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export ARJ_CloseArchive(struct ArcInfo *Info);
DWORD WINAPI _export ARJ_GetSFXPos(void);
BOOL WINAPI _export ARJ_GetFormatName(int Type,char *FormatName,char *DefaultExt);
@@ -23,7 +23,7 @@ BOOL WINAPI _export ARJ_GetDefaultCommands(int Type,int Command,char *Dest);
void WINAPI _export RAR_SetFarInfo(const struct PluginStartupInfo *Info);
BOOL WINAPI _export RAR_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL WINAPI _export RAR_OpenArchive(const char *Name,int *Type,bool Silent);
-int WINAPI _export RAR_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export RAR_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export RAR_CloseArchive(struct ArcInfo *Info);
DWORD WINAPI _export RAR_GetSFXPos(void);
BOOL WINAPI _export RAR_GetFormatName(int Type,char *FormatName,char *DefaultExt);
@@ -31,13 +31,13 @@ BOOL WINAPI _export RAR_GetDefaultCommands(int Type,int Command,char *Dest);
BOOL WINAPI _export LIBARCH_IsArchive(const char *Name, const unsigned char *Data, int DataSize);
BOOL WINAPI _export LIBARCH_OpenArchive(const char *Name, int *Type, bool Silent);
DWORD WINAPI _export LIBARCH_GetSFXPos(void);
-int WINAPI _export LIBARCH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export LIBARCH_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export LIBARCH_CloseArchive(struct ArcInfo *Info);
BOOL WINAPI _export LIBARCH_GetFormatName(int Type, char *FormatName, char *DefaultExt);
BOOL WINAPI _export LIBARCH_GetDefaultCommands(int Type, int Command, char *Dest);
BOOL WINAPI _export ZIP_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL WINAPI _export ZIP_OpenArchive(const char *Name,int *Type,bool Silent);
-int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export ZIP_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export ZIP_CloseArchive(struct ArcInfo *Info);
DWORD WINAPI _export ZIP_GetSFXPos(void);
BOOL WINAPI _export ZIP_GetFormatName(int Type,char *FormatName,char *DefaultExt);
@@ -45,7 +45,7 @@ BOOL WINAPI _export ZIP_GetDefaultCommands(int Type,int Command,char *Dest);
void WINAPI _export LZH_SetFarInfo(const struct PluginStartupInfo *Info);
BOOL WINAPI _export LZH_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL WINAPI _export LZH_OpenArchive(const char *Name,int *Type,bool Silent);
-int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export LZH_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export LZH_CloseArchive(struct ArcInfo *Info);
DWORD WINAPI _export LZH_GetSFXPos(void);
BOOL WINAPI _export LZH_GetFormatName(int Type,char *FormatName,char *DefaultExt);
@@ -54,7 +54,7 @@ void WINAPI _export TARGZ_SetFarInfo(const struct PluginStartupInfo *Info);
BOOL WINAPI _export TARGZ_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL WINAPI _export TARGZ_OpenArchive(const char *Name,int *Type,bool Silent);
DWORD WINAPI _export TARGZ_GetSFXPos(void);
-int WINAPI _export TARGZ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export TARGZ_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export TARGZ_CloseArchive(struct ArcInfo *Info);
BOOL WINAPI _export TARGZ_GetFormatName(int Type,char *FormatName,char *DefaultExt);
BOOL WINAPI _export TARGZ_GetDefaultCommands(int Type,int Command,char *Dest);
@@ -63,26 +63,26 @@ DWORD WINAPI _export CUSTOM_LoadFormatModule(const char *ModuleName);
BOOL WINAPI _export CUSTOM_IsArchive(const char *FName, const unsigned char *Data, int DataSize);
DWORD WINAPI _export CUSTOM_GetSFXPos(void);
BOOL WINAPI _export CUSTOM_OpenArchive(const char *Name, int *Type, bool Silent);
-int WINAPI _export CUSTOM_GetArcItem(struct PluginPanelItem *Item, struct ArcItemInfo *Info);
+int WINAPI _export CUSTOM_GetArcItem( struct ArcItemInfo *Info);
BOOL WINAPI _export CUSTOM_CloseArchive(struct ArcInfo * Info);
BOOL WINAPI _export CUSTOM_GetFormatName(int Type, char *FormatName, char *DefaultExt);
BOOL WINAPI _export CUSTOM_GetDefaultCommands(int Type, int Command, char *Dest);
BOOL WINAPI _export SEVENZ_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL WINAPI _export SEVENZ_OpenArchive(const char *Name,int *Type,bool Silent);
-int WINAPI _export SEVENZ_GetArcItem(struct PluginPanelItem *Item, struct ArcItemInfo *Info);
+int WINAPI _export SEVENZ_GetArcItem( struct ArcItemInfo *Info);
BOOL WINAPI _export SEVENZ_CloseArchive(struct ArcInfo *Info);
BOOL WINAPI _export SEVENZ_GetFormatName(int Type,char *FormatName,char *DefaultExt);
BOOL WINAPI _export SEVENZ_GetDefaultCommands(int Type,int Command,char *Dest);
void WINAPI _export HA_SetFarInfo(const struct PluginStartupInfo *Info);
BOOL WINAPI _export HA_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL WINAPI _export HA_OpenArchive(const char *Name,int *Type,bool Silent);
-int WINAPI _export HA_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export HA_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export HA_CloseArchive(struct ArcInfo *Info);
BOOL WINAPI _export HA_GetFormatName(int Type,char *FormatName,char *DefaultExt);
BOOL WINAPI _export HA_GetDefaultCommands(int Type,int Command,char *Dest);
BOOL WINAPI _export CAB_IsArchive(const char *Name,const unsigned char *Data,int DataSize);
BOOL WINAPI _export CAB_OpenArchive(const char *Name,int *Type,bool Silent);
-int WINAPI _export CAB_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int WINAPI _export CAB_GetArcItem(struct ArcItemInfo *Info);
BOOL WINAPI _export CAB_CloseArchive(struct ArcInfo *Info);
DWORD WINAPI _export CAB_GetSFXPos(void);
BOOL WINAPI _export CAB_GetFormatName(int Type,char *FormatName,char *DefaultExt);
diff --git a/multiarc/src/formats/arc/arc.cpp b/multiarc/src/formats/arc/arc.cpp
index b081ef29..d1d46dab 100644
--- a/multiarc/src/formats/arc/arc.cpp
+++ b/multiarc/src/formats/arc/arc.cpp
@@ -251,7 +251,7 @@ BOOL WINAPI _export ARC_OpenArchive(const char *Name,int *Type,bool Silent)
}
-int WINAPI _export ARC_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export ARC_GetArcItem(struct ArcItemInfo *Info)
{
ARCHeader Header;
DWORD ReadSize;
@@ -294,23 +294,24 @@ int WINAPI _export ARC_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
if(OffsetComment)
{
+ char Description[32];
WINPORT(SetFilePointer)(ArcHandle,OffsetComment,NULL,FILE_BEGIN);
- WINPORT(ReadFile)(ArcHandle,Info->Description,32,&ReadSize,NULL);
+ if (WINPORT(ReadFile)(ArcHandle,Description,32,&ReadSize,NULL))
+ Info->Description.assign(Description, ReadSize);
OffsetComment+=32;
Info->Comment=1;
}
- strncpy(Item->FindData.cFileName,Header.Name,sizeof(Item->FindData.cFileName)-1);
+ StrAssignArray(Info->PathName, Header.Name);
+ Info->nFileSize=Header.OrigSize;
+ Info->dwFileAttributes=FILE_ATTRIBUTE_ARCHIVE; //??
+ Info->nPhysicalSize=Header.CompSize;
- Item->FindData.nFileSize=Header.OrigSize;
- Item->FindData.dwFileAttributes=FILE_ATTRIBUTE_ARCHIVE; //??
- Item->FindData.nPhysicalSize=Header.CompSize;
-
- Item->CRC32=(DWORD)Header.CRC16;
+ Info->CRC32=(DWORD)Header.CRC16;
FILETIME lft;
WINPORT(DosDateTimeToFileTime)(Header.FileDate,Header.FileTime,&lft);
- WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime);
+ WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime);
int Ver=6*256;
if(Header.Type == 1)
diff --git a/multiarc/src/formats/arj/arj.cpp b/multiarc/src/formats/arj/arj.cpp
index db124d49..c7fb8574 100644
--- a/multiarc/src/formats/arj/arj.cpp
+++ b/multiarc/src/formats/arj/arj.cpp
@@ -227,7 +227,7 @@ BOOL WINAPI _export ARJ_OpenArchive(const char *Name,int *Type,bool Silent)
}
-int WINAPI _export ARJ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export ARJ_GetArcItem(struct ArcItemInfo *Info)
{
struct ARJHd2
{
@@ -312,7 +312,7 @@ int WINAPI _export ARJ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
Name[sizeof(Name)-1]=0;
if (Name[strlen(Name)+1]!=0)
Info->Comment=TRUE;
- strncpy(Item->FindData.cFileName,Name,ARRAYSIZE(Item->FindData.cFileName)-1);
+ Info->PathName = Name;
DWORD PrevPosition=NextPosition;
NextPosition+=8+ArjHeader.HeadSize;
@@ -331,32 +331,32 @@ int WINAPI _export ARJ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
Info->Encrypted=TRUE;
Info->DictSize=32;
- Item->CRC32=ArjHeader.CRC;
+ Info->CRC32=ArjHeader.CRC;
if (ArjHeader.HostOS == 2 || ArjHeader.HostOS == 4)
- Item->FindData.dwUnixMode=ArjHeader.AccessMode & 0777;
+ Info->dwUnixMode=ArjHeader.AccessMode & 0777;
else
- Item->FindData.dwFileAttributes=ArjHeader.AccessMode & 0x3f;
- Item->FindData.nPhysicalSize=ArjHeader.PackSize;
- Item->FindData.nFileSize=ArjHeader.UnpSize;
+ Info->dwFileAttributes=ArjHeader.AccessMode & 0x3f;
+ Info->nPhysicalSize=ArjHeader.PackSize;
+ Info->nFileSize=ArjHeader.UnpSize;
FILETIME lft;
WINPORT(DosDateTimeToFileTime)(HIWORD(ArjHeader.ftime),LOWORD(ArjHeader.ftime),&lft);
- WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime);
+ WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime);
if(ArjHeader.ARJVer >= 0x09 && // ??? 2.62 ???
(sizeof(ArjHeader)-sizeof(DWORD)*5) < ArjHeader.FirstHeadSize) // 5 = (Mark+HeadSize)+Extra1+atime+ctime+FSizeVol
{
WINPORT(DosDateTimeToFileTime)(HIWORD(ArjHeader.atime),LOWORD(ArjHeader.atime),&lft);
- WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastAccessTime);
+ WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastAccessTime);
WINPORT(DosDateTimeToFileTime)(HIWORD(ArjHeader.ctime),LOWORD(ArjHeader.ctime),&lft);
- WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftCreationTime);
+ WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftCreationTime);
}
Info->Chapter=ArjHeader.LastChapter; //???? FirstChapter ????
Info->UnpVer=(ArjHeader.ARJExtrVer/10)*256+(ArjHeader.ARJExtrVer%10);
if (ArjHeader.HostOS<ARRAYSIZE(ArjOS))
- strcpy(Info->HostOS,ArjOS[ArjHeader.HostOS]);
+ Info->HostOS = ArjOS[ArjHeader.HostOS];
return(GETARC_SUCCESS);
}
diff --git a/multiarc/src/formats/cab/cab.cpp b/multiarc/src/formats/cab/cab.cpp
index 7ebb52f9..4528cf33 100644
--- a/multiarc/src/formats/cab/cab.cpp
+++ b/multiarc/src/formats/cab/cab.cpp
@@ -176,7 +176,7 @@ BOOL WINAPI _export CAB_OpenArchive(const char *Name,int *Type,bool Silent)
}
-int WINAPI _export CAB_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export CAB_GetArcItem(struct ArcItemInfo *Info)
{
struct CFFILE FileHeader;
@@ -202,18 +202,19 @@ int WINAPI _export CAB_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
if (EndPos[ 0 ] == '\\' && EndPos[ 1 ] != '\\')
EndPos++;
- strncpy(Item->FindData.cFileName, EndPos, ARRAYSIZE(Item->FindData.cFileName) - 1);
- for (size_t i = 0; (i < ARRAYSIZE(Item->FindData.cFileName) && Item->FindData.cFileName[i]); ++i) {
- if (Item->FindData.cFileName[i] == '\\') Item->FindData.cFileName[i] = '/';
+ Info->PathName.assign(EndPos, strnlen(EndPos, &FileHeader.szName[ARRAYSIZE(FileHeader.szName)] - EndPos));
+
+ for (auto &c : Info->PathName) {
+ if (c == '\\') c = '/';
}
#define _A_ENCRYPTED 8
- Item->FindData.dwFileAttributes = FileHeader.attribs & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_DIRECTORY);
+ Info->dwFileAttributes = FileHeader.attribs & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_DIRECTORY);
Info->Encrypted = FileHeader.attribs & _A_ENCRYPTED;
- Item->FindData.nPhysicalSize=0;
- Item->FindData.nFileSize=FileHeader.cbFile;
+ Info->nPhysicalSize=0;
+ Info->nFileSize=FileHeader.cbFile;
WINPORT(DosDateTimeToFileTime)(FileHeader.date,FileHeader.time,&lft);
- WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime);
+ WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime);
Info->UnpVer=UnpVer;
return(GETARC_SUCCESS);
}
diff --git a/multiarc/src/formats/custom/custom.cpp b/multiarc/src/formats/custom/custom.cpp
index 7e3aee37..2798d86f 100644
--- a/multiarc/src/formats/custom/custom.cpp
+++ b/multiarc/src/formats/custom/custom.cpp
@@ -69,10 +69,10 @@ static void MakeFiletime(SYSTEMTIME st, SYSTEMTIME syst, LPFILETIME pft);
static int StringToInt(const char *str);
static int64_t StringToInt64(const char *str);
static void ParseListingItemRegExp(Match match,
- struct PluginPanelItem *Item, struct ArcItemInfo *Info,
+ struct ArcItemInfo *Info,
SYSTEMTIME &stModification, SYSTEMTIME &stCreation, SYSTEMTIME &stAccess);
static void ParseListingItemPlain(const char *CurFormat, const char *CurStr,
- struct PluginPanelItem *Item, struct ArcItemInfo *Info,
+ struct ArcItemInfo *Info,
SYSTEMTIME &stModification, SYSTEMTIME &stCreation, SYSTEMTIME &stAccess);
///////////////////////////////////////////////////////////////////////////////
@@ -563,7 +563,7 @@ BOOL WINAPI _export CUSTOM_OpenArchive(const char *Name, int *Type, bool Silent)
}
-int WINAPI _export CUSTOM_GetArcItem(struct PluginPanelItem *Item, struct ArcItemInfo *Info)
+int WINAPI _export CUSTOM_GetArcItem( struct ArcItemInfo *Info)
{
char Str[512];
CustomStringList *CurFormatNode = Format;
@@ -636,24 +636,24 @@ int WINAPI _export CUSTOM_GetArcItem(struct PluginPanelItem *Item, struct ArcIte
if(re.compile(CurFormatNode->Str()))
{
if(Match match = re.match(Str))
- ParseListingItemRegExp(match, Item, Info, stModification, stCreation, stAccess);
+ ParseListingItemRegExp(match, Info, stModification, stCreation, stAccess);
}
else
- ParseListingItemPlain(CurFormatNode->Str(), Str, Item, Info, stModification, stCreation, stAccess);
+ ParseListingItemPlain(CurFormatNode->Str(), Str, Info, stModification, stCreation, stAccess);
CurFormatNode = CurFormatNode->Next();
if(!CurFormatNode || !CurFormatNode->Next())
{
- MakeFiletime(stModification, syst, &Item->FindData.ftLastWriteTime);
- MakeFiletime(stCreation, syst, &Item->FindData.ftCreationTime);
- MakeFiletime(stAccess, syst, &Item->FindData.ftLastAccessTime);
+ MakeFiletime(stModification, syst, &Info->ftLastWriteTime);
+ MakeFiletime(stCreation, syst, &Info->ftCreationTime);
+ MakeFiletime(stAccess, syst, &Info->ftLastAccessTime);
- for(int I = strlen(Item->FindData.cFileName) - 1; I >= 0; I--)
+ for(int I = int(Info->PathName.size()) - 1; I >= 0; I--)
{
- int Ch = Item->FindData.cFileName[I];
+ char Ch = Info->PathName[I];
if(Ch == ' ' || Ch == '\t')
- Item->FindData.cFileName[I] = 0;
+ Info->PathName.resize(I);
else
break;
}
@@ -898,28 +898,28 @@ static int StringToIntHex(const char *str)
}
static void ParseListingItemRegExp(Match match,
- struct PluginPanelItem *Item, struct ArcItemInfo *Info,
+ struct ArcItemInfo *Info,
SYSTEMTIME &stModification, SYSTEMTIME &stCreation, SYSTEMTIME &stAccess)
{
if(const char *p = match["name"])
- strncpy(Item->FindData.cFileName, p, sizeof(Item->FindData.cFileName)-1 );
+ Info->PathName = p;
if(const char *p = match["description"])
- strncpy(Info->Description, p, sizeof(Info->Description)-1 );
+ Info->Description = p;
- Item->FindData.nFileSize = StringToInt64(match["size"]);
- Item->FindData.nPhysicalSize = StringToInt64(match["packedSize"]);
+ Info->nFileSize = StringToInt64(match["size"]);
+ Info->nPhysicalSize = StringToInt64(match["packedSize"]);
for(const char *p = match["attr"]; p && *p; ++p)
{
switch(*p)
{
- case 'd': case 'D': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; break;
- case 'h': case 'H': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; break;
- case 'a': case 'A': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE; break;
- case 'r': case 'R': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_READONLY; break;
- case 's': case 'S': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM; break;
- case 'c': case 'C': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; break;
- case 'x': case 'X': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_EXECUTABLE; break;
+ case 'd': case 'D': Info->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; break;
+ case 'h': case 'H': Info->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; break;
+ case 'a': case 'A': Info->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE; break;
+ case 'r': case 'R': Info->dwFileAttributes |= FILE_ATTRIBUTE_READONLY; break;
+ case 's': case 'S': Info->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM; break;
+ case 'c': case 'C': Info->dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; break;
+ case 'x': case 'X': Info->dwFileAttributes |= FILE_ATTRIBUTE_EXECUTABLE; break;
}
}
@@ -975,13 +975,13 @@ static void ParseListingItemRegExp(Match match,
stCreation.wMinute = StringToInt(match["cMin"]);
stCreation.wSecond = StringToInt(match["cSec"]);
- Item->CRC32 = StringToIntHex(match["CRC"]);
+ Info->CRC32 = StringToIntHex(match["CRC"]);
}
static void ParseListingItemPlain(const char *CurFormat, const char *CurStr,
- struct PluginPanelItem *Item, struct ArcItemInfo *Info,
+ struct ArcItemInfo *Info,
SYSTEMTIME &stModification, SYSTEMTIME &stCreation, SYSTEMTIME &stAccess)
{
enum
@@ -1009,25 +1009,25 @@ static void ParseListingItemPlain(const char *CurFormat, const char *CurStr,
CurStr++;
break;
case 'n':
- strncat(Item->FindData.cFileName, CurStr, 1);
+ if (*CurStr) Info->PathName+= *CurStr;
break;
case 'c':
- strncat(Info->Description, CurStr, 1);
+ if (*CurStr) Info->Description+= *CurStr;
break;
case '.':
{
- for(int I = strlen(Item->FindData.cFileName); I >= 0; I--)
- if(isspace(Item->FindData.cFileName[I]))
- Item->FindData.cFileName[I] = 0;
- if(*Item->FindData.cFileName)
- strncat(Item->FindData.cFileName, ".", sizeof(Item->FindData.cFileName) );
+ for(int I = int(Info->PathName.size()) - 1; I >= 0; I--)
+ if(isspace(Info->PathName[I]))
+ Info->PathName.resize(I);
+ if(!Info->PathName.empty())
+ Info->PathName+= '.';
}
break;
case 'z':
if(isdigit(*CurStr))
{
- Item->FindData.nFileSize*= 10;
- Item->FindData.nFileSize+= (*CurStr - '0');
+ Info->nFileSize*= 10;
+ Info->nFileSize+= (*CurStr - '0');
}
else if(OP_INSIDE == OptionalPart)
{
@@ -1038,8 +1038,8 @@ static void ParseListingItemPlain(const char *CurFormat, const char *CurStr,
case 'p':
if(isdigit(*CurStr))
{
- Item->FindData.nPhysicalSize*= 10;
- Item->FindData.nPhysicalSize+= (*CurStr - '0');
+ Info->nPhysicalSize*= 10;
+ Info->nPhysicalSize+= (*CurStr - '0');
}
else if(OP_INSIDE == OptionalPart)
{
@@ -1050,13 +1050,13 @@ static void ParseListingItemPlain(const char *CurFormat, const char *CurStr,
case 'a':
switch (*CurStr)
{
- case 'd': case 'D': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; break;
- case 'h': case 'H': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; break;
- case 'a': case 'A': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE; break;
- case 'r': case 'R': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_READONLY; break;
- case 's': case 'S': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM; break;
- case 'c': case 'C': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; break;
- case 'x': case 'X': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_EXECUTABLE; break;
+ case 'd': case 'D': Info->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; break;
+ case 'h': case 'H': Info->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; break;
+ case 'a': case 'A': Info->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE; break;
+ case 'r': case 'R': Info->dwFileAttributes |= FILE_ATTRIBUTE_READONLY; break;
+ case 's': case 'S': Info->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM; break;
+ case 'c': case 'C': Info->dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; break;
+ case 'x': case 'X': Info->dwFileAttributes |= FILE_ATTRIBUTE_EXECUTABLE; break;
}
break;
// MODIFICATION DATETIME
@@ -1260,7 +1260,7 @@ static void ParseListingItemPlain(const char *CurFormat, const char *CurStr,
if(isxdigit(toupper(*CurStr)))
{
char dig_sub = (*CurStr >= 'a' ? 'a' : (*CurStr >= 'A' ? 'A' : '0'));
- Item->CRC32 = Item->CRC32 * 16 + (*CurStr - dig_sub);
+ Info->CRC32 = Info->CRC32 * 16 + (*CurStr - dig_sub);
}
else if(OP_INSIDE == OptionalPart)
{
diff --git a/multiarc/src/formats/ha/ha.cpp b/multiarc/src/formats/ha/ha.cpp
index bcb17465..2da3adc8 100644
--- a/multiarc/src/formats/ha/ha.cpp
+++ b/multiarc/src/formats/ha/ha.cpp
@@ -77,7 +77,7 @@ BOOL WINAPI _export HA_OpenArchive(const char *Name,int *Type,bool Silent)
}
-int WINAPI _export HA_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export HA_GetArcItem(struct ArcItemInfo *Info)
{
struct HaHeader
{
@@ -97,8 +97,8 @@ int WINAPI _export HA_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo
return(GETARC_READERROR);
if (ReadSize==0)
return(GETARC_EOF);
- char Path[3*NM],Name[NM];
- if (!WINPORT(ReadFile)(ArcHandle,Path,sizeof(Path),&ReadSize,NULL) || ReadSize==0)
+ char Path[3*NM] = {0},Name[NM] = {0};
+ if (!WINPORT(ReadFile)(ArcHandle,Path,NM,&ReadSize,NULL) || ReadSize==0)
return(GETARC_READERROR);
Path[NM-1]=0;
int PathLength=strlen(Path)+1;
@@ -117,12 +117,12 @@ int WINAPI _export HA_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo
for (int I=0;Path[I]!=0;I++)
if ((unsigned char)Path[I]==0xff)
Path[I]='/';
- strncpy(Item->FindData.cFileName,Path,sizeof(Item->FindData.cFileName)-1);
- Item->FindData.dwFileAttributes=(Header.Type & 0xf)==0xe ? FILE_ATTRIBUTE_DIRECTORY:0;
- Item->CRC32=Header.CRC;
- UnixTimeToFileTime(Header.FileTime,&Item->FindData.ftLastWriteTime);
- Item->FindData.nFileSize=Header.UnpSize;
- Item->FindData.nPhysicalSize=Header.PackSize;
+ Info->PathName = Path;
+ Info->dwFileAttributes=(Header.Type & 0xf)==0xe ? FILE_ATTRIBUTE_DIRECTORY:0;
+ Info->CRC32=Header.CRC;
+ UnixTimeToFileTime(Header.FileTime,&Info->ftLastWriteTime);
+ Info->nFileSize=Header.UnpSize;
+ Info->nPhysicalSize=Header.PackSize;
return(GETARC_SUCCESS);
}
diff --git a/multiarc/src/formats/libarch/libarch.cpp b/multiarc/src/formats/libarch/libarch.cpp
index 40881546..93e870cf 100644
--- a/multiarc/src/formats/libarch/libarch.cpp
+++ b/multiarc/src/formats/libarch/libarch.cpp
@@ -234,7 +234,7 @@ DWORD WINAPI _export LIBARCH_GetSFXPos(void)
}
-int WINAPI _export LIBARCH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export LIBARCH_GetArcItem(struct ArcItemInfo *Info)
{
try {
if (!s_arc)
@@ -254,37 +254,38 @@ int WINAPI _export LIBARCH_GetArcItem(struct PluginPanelItem *Item,struct ArcIte
break;
}
}
- strncpy(Item->FindData.cFileName, pathname, sizeof(Item->FindData.cFileName) - 1);
+
+ Info->PathName = pathname;
uint64_t sz = archive_entry_size(entry);
if (sz == 0 && !archive_entry_size_is_set(entry) && s_UnpackedSizeWorkaround != nullptr) {
sz = s_UnpackedSizeWorkaround(s_arc.get());
}
- Item->FindData.nFileSize = sz;
- Item->FindData.nPhysicalSize = sz;
- Item->FindData.dwUnixMode = archive_entry_mode(entry);
- Item->FindData.dwFileAttributes =
- WINPORT(EvaluateAttributesA)(Item->FindData.dwUnixMode, Item->FindData.cFileName);
+ Info->nFileSize = sz;
+ Info->nPhysicalSize = sz;
+ Info->dwUnixMode = archive_entry_mode(entry);
+ Info->dwFileAttributes =
+ WINPORT(EvaluateAttributesA)(Info->dwUnixMode, Info->PathName.c_str());
if (archive_entry_ctime_is_set(entry)) {
- ArcTM(Item->FindData.ftCreationTime, archive_entry_ctime(entry), archive_entry_ctime_nsec(entry));
+ ArcTM(Info->ftCreationTime, archive_entry_ctime(entry), archive_entry_ctime_nsec(entry));
} else if (archive_entry_birthtime_is_set(entry)) {
- ArcTM(Item->FindData.ftCreationTime, archive_entry_birthtime(entry), archive_entry_birthtime_nsec(entry));
+ ArcTM(Info->ftCreationTime, archive_entry_birthtime(entry), archive_entry_birthtime_nsec(entry));
} else if (archive_entry_mtime_is_set(entry)) {
- ArcTM(Item->FindData.ftCreationTime, archive_entry_mtime(entry), archive_entry_mtime_nsec(entry));
+ ArcTM(Info->ftCreationTime, archive_entry_mtime(entry), archive_entry_mtime_nsec(entry));
}
if (archive_entry_mtime_is_set(entry)) {
- ArcTM(Item->FindData.ftLastWriteTime, archive_entry_mtime(entry), archive_entry_mtime_nsec(entry));
+ ArcTM(Info->ftLastWriteTime, archive_entry_mtime(entry), archive_entry_mtime_nsec(entry));
} else {
- Item->FindData.ftLastWriteTime = Item->FindData.ftCreationTime;
+ Info->ftLastWriteTime = Info->ftCreationTime;
}
if (archive_entry_atime_is_set(entry)) {
- ArcTM(Item->FindData.ftLastAccessTime, archive_entry_atime(entry), archive_entry_atime_nsec(entry));
+ ArcTM(Info->ftLastAccessTime, archive_entry_atime(entry), archive_entry_atime_nsec(entry));
} else {
- Item->FindData.ftLastAccessTime = Item->FindData.ftLastWriteTime;
+ Info->ftLastAccessTime = Info->ftLastWriteTime;
}
} catch(std::exception &e) {
diff --git a/multiarc/src/formats/lzh/lzh.cpp b/multiarc/src/formats/lzh/lzh.cpp
index 05295dec..bef1b63c 100644
--- a/multiarc/src/formats/lzh/lzh.cpp
+++ b/multiarc/src/formats/lzh/lzh.cpp
@@ -214,7 +214,7 @@ static void ReadOverflowable(HANDLE Handle, DWORD ChunkSize, void *Buf, DWORD Bu
WINPORT(SetFilePointer)(Handle, ChunkSize - BufSize, NULL, FILE_CURRENT);
}
-int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export LZH_GetArcItem(struct ArcItemInfo *Info)
{
LZH_Header LzhHeader;
@@ -362,8 +362,9 @@ int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
? bytes Comments
2 bytes Next header size
*/
- ReadOverflowable(ArcHandle,NextHeaderSize-3,Info->Description,ARRAYSIZE(Info->Description)-1,&ReadSize);
- Info->Description[ReadSize]=0;
+ char Description[256] = {0};
+ ReadOverflowable(ArcHandle,NextHeaderSize-3,Description,ARRAYSIZE(Description),&ReadSize);
+ Info->Description.assign(Description, ReadSize);
break;
}
@@ -382,7 +383,7 @@ int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
if (FileName[I]=='\xff' || FileName[I]=='\\')
FileName[I]='/';
- Item->CRC32=(DWORD)CRC16;
+ Info->CRC32=(DWORD)CRC16;
// correct NextPosition
DWORD PrevPosition=NextPosition;
@@ -395,27 +396,28 @@ int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
if (PrevPosition>=NextPosition || PathSize>NM)
return(GETARC_BROKEN);
- snprintf(Item->FindData.cFileName, ARRAYSIZE(Item->FindData.cFileName) - 1, "%s%s", PathName, FileName);
+ StrAssignArray(Info->PathName, PathName);
+ StrAppendArray(Info->PathName, FileName);
- Item->FindData.dwFileAttributes=Attr;
+ Info->dwFileAttributes=Attr;
//<????>
if(LzhHeader.l0.Method == '0' || (LzhHeader.l0.Method == '4' && LzhHeader.l0.HeadID[2] == 'z'))
- Item->FindData.nPhysicalSize=LzhHeader.l0.UnpSize;
+ Info->nPhysicalSize=LzhHeader.l0.UnpSize;
else
- Item->FindData.nPhysicalSize=(LzhHeader.l0.Method == 'd')?0:LzhHeader.l0.PackSize;
+ Info->nPhysicalSize=(LzhHeader.l0.Method == 'd')?0:LzhHeader.l0.PackSize;
//</????>
- Item->FindData.nFileSize=LzhHeader.l0.UnpSize;
+ Info->nFileSize=LzhHeader.l0.UnpSize;
FILETIME lft;
if(LzhHeader.l0.FLevel == 2) // level-2, Original file time stamp(UNIX type, seconds since 1970)
{
- UnixTimeToFileTime(MAKELONG(LzhHeader.l0.FTime,LzhHeader.l0.FDate),&Item->FindData.ftLastWriteTime);
+ UnixTimeToFileTime(MAKELONG(LzhHeader.l0.FTime,LzhHeader.l0.FDate),&Info->ftLastWriteTime);
}
else // Original file date/time (Generic time stamp)
{
WINPORT(DosDateTimeToFileTime)(LzhHeader.l0.FDate,LzhHeader.l0.FTime,&lft);
- WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime);
+ WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime);
}
// OS ID - Host OS
@@ -423,7 +425,7 @@ int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
{
if(OSID[I].Type == OsId)
{
- strcpy(Info->HostOS,OSID[I].Name);
+ Info->HostOS = OSID[I].Name;
break;
}
}
diff --git a/multiarc/src/formats/rar/rar.cpp b/multiarc/src/formats/rar/rar.cpp
index 8b4ad5ee..748aeb47 100644
--- a/multiarc/src/formats/rar/rar.cpp
+++ b/multiarc/src/formats/rar/rar.cpp
@@ -68,7 +68,6 @@ static FARAPIMESSAGE FarMessage=NULL;
static FARSTDSPRINTF FarSprintf=NULL;
static bool KeepSilent = false;
-#define UnicodeToOEM(src,dst,lendst) WINPORT(WideCharToMultiByte)(CP_UTF8,0,(src),-1,(dst),(lendst),NULL,FALSE)
#define Min(x,y) (((x)<(y)) ? (x):(y))
@@ -183,7 +182,7 @@ BOOL WINAPI _export RAR_OpenArchive(const char *Name,int *Type,bool Silent)
}
-int WINAPI _export RAR_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export RAR_GetArcItem(struct ArcItemInfo *Info)
{
RHCode = RARReadHeaderEx(hArcData,&HeaderData);
if(RHCode!=0) {
@@ -191,44 +190,43 @@ int WINAPI _export RAR_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
return GETARC_READERROR;//GETARC_BROKEN;
return GETARC_EOF;
}
- UnicodeToOEM(HeaderData.FileNameW,Item->FindData.cFileName,ARRAYSIZE(Item->FindData.cFileName)-1);
- //strcpyn(Item->FindData.cFileName,HeaderData.FileName,sizeof(Item->FindData.cFileName)-1);
-
- Item->FindData.dwFileAttributes = WINPORT(EvaluateAttributes)(HeaderData.FileAttr, HeaderData.FileNameW);
- Item->FindData.dwUnixMode = HeaderData.FileAttr;
+
+ Wide2MB(HeaderData.FileNameW, Info->PathName);
+ Info->dwFileAttributes = WINPORT(EvaluateAttributes)(HeaderData.FileAttr, HeaderData.FileNameW);
+ Info->dwUnixMode = HeaderData.FileAttr;
//HeaderData.FileAttr is unreliable - sometimes its a UNIX mode, sometimes Windows attributes
//so sync with directory attribute in HeaderData.Flags
if (HeaderData.Flags & RHDF_DIRECTORY) {
- Item->FindData.dwFileAttributes|= FILE_ATTRIBUTE_DIRECTORY;
- switch (Item->FindData.dwUnixMode & S_IFMT) {
+ Info->dwFileAttributes|= FILE_ATTRIBUTE_DIRECTORY;
+ switch (Info->dwUnixMode & S_IFMT) {
case S_IFREG: case 0:
- Item->FindData.dwUnixMode&= ~S_IFMT;
- Item->FindData.dwUnixMode|= S_IFDIR;
+ Info->dwUnixMode&= ~S_IFMT;
+ Info->dwUnixMode|= S_IFDIR;
}
} else {
- Item->FindData.dwFileAttributes&= ~FILE_ATTRIBUTE_DIRECTORY;
- switch (Item->FindData.dwUnixMode & S_IFMT) {
+ Info->dwFileAttributes&= ~FILE_ATTRIBUTE_DIRECTORY;
+ switch (Info->dwUnixMode & S_IFMT) {
case S_IFDIR: case 0:
- Item->FindData.dwUnixMode&= ~S_IFMT;
- Item->FindData.dwUnixMode|= S_IFREG;
+ Info->dwUnixMode&= ~S_IFMT;
+ Info->dwUnixMode|= S_IFREG;
}
}
- Item->FindData.nFileSize = HeaderData.UnpSizeHigh;
- Item->FindData.nFileSize<<= 32;
- Item->FindData.nFileSize|= HeaderData.UnpSize;
- Item->FindData.nPhysicalSize = HeaderData.PackSizeHigh;
- Item->FindData.nPhysicalSize<<= 32;
- Item->FindData.nPhysicalSize|= HeaderData.PackSize;
- Item->CRC32=(DWORD)HeaderData.FileCRC;
+ Info->nFileSize = HeaderData.UnpSizeHigh;
+ Info->nFileSize<<= 32;
+ Info->nFileSize|= HeaderData.UnpSize;
+ Info->nPhysicalSize = HeaderData.PackSizeHigh;
+ Info->nPhysicalSize<<= 32;
+ Info->nPhysicalSize|= HeaderData.PackSize;
+ Info->CRC32=(DWORD)HeaderData.FileCRC;
FILETIME lft;
WINPORT(DosDateTimeToFileTime)(HIWORD(HeaderData.FileTime),LOWORD(HeaderData.FileTime),&lft);
- WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime);
+ WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime);
if (HeaderData.HostOS<ARRAYSIZE(RarOS))
- strcpy(Info->HostOS,RarOS[HeaderData.HostOS]);
+ Info->HostOS = RarOS[HeaderData.HostOS];
Info->Solid=Flags & 8;
Info->Comment=HeaderData.Flags & 8;
Info->Encrypted=HeaderData.Flags & 4;
diff --git a/multiarc/src/formats/targz/targz.cpp b/multiarc/src/formats/targz/targz.cpp
index f083c7cc..4ad710ce 100644
--- a/multiarc/src/formats/targz/targz.cpp
+++ b/multiarc/src/formats/targz/targz.cpp
@@ -133,8 +133,8 @@ typedef union {
int IsTarHeader(const unsigned char *Data,int DataSize);
int64_t GetOctal(const char *Str);
-int GetArcItemGZIP(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
-int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info);
+int GetArcItemGZIP(struct ArcItemInfo *Info);
+int GetArcItemTAR(struct ArcItemInfo *Info);
char *AdjustTARFileName(char *FileName);
static int64_t Oct2Size (const char *where0, size_t digs0);
@@ -219,7 +219,7 @@ DWORD WINAPI _export TARGZ_GetSFXPos(void)
return 0;
}
-int WINAPI _export TARGZ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export TARGZ_GetArcItem(struct ArcItemInfo *Info)
{
if (ArcType!=TAR_FORMAT)
{
@@ -228,9 +228,9 @@ int WINAPI _export TARGZ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemI
switch (ArcType)
{
case BZ_FORMAT: case XZ_FORMAT:
- Item->FindData.nFileSize=FileSize.i64;
- Item->FindData.nPhysicalSize=FileSize.i64;
- strncpy(Item->FindData.cFileName,ZipName,ARRAYSIZE(Item->FindData.cFileName)-1);
+ Info->nFileSize=FileSize.i64;
+ Info->nPhysicalSize=FileSize.i64;
+ Info->PathName=ZipName;
*ZipName=0;
return(GETARC_SUCCESS);
@@ -244,7 +244,7 @@ int WINAPI _export TARGZ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemI
return GetArcItemTAR(Item,Info);
}
-int GetArcItemGZIP(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int GetArcItemGZIP(struct ArcItemInfo *Info)
{
DWORD ReadSize;
struct GZHeader
@@ -257,18 +257,18 @@ int GetArcItemGZIP(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
BYTE HostOS;
} Header;
- Item->FindData.cFileName[0] = 0;
+ Info->PathName.clear();
if (!WINPORT(ReadFile)(ArcHandle,&Header,sizeof(Header),&ReadSize,NULL))
return(GETARC_READERROR);
- Item->FindData.nPhysicalSize=FileSize.i64;
+ Info->nPhysicalSize=FileSize.i64;
if (ArcType==Z_FORMAT)
{
- strcpy(Item->FindData.cFileName,ZipName);
+ Info->PathName = ZipName;
*ZipName=0;
- Item->FindData.nFileSize=FileSize.i64;
+ Info->nFileSize=FileSize.i64;
return(GETARC_SUCCESS);
}
@@ -283,41 +283,44 @@ int GetArcItemGZIP(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
WINPORT(SetFilePointer)(ArcHandle,ExtraLength,NULL,FILE_CURRENT);
}
+ char cFileName[NM + 1] = {0};
if (Header.Flags & 8)
- if (!WINPORT(ReadFile)(ArcHandle,Item->FindData.cFileName,sizeof(Item->FindData.cFileName),&ReadSize,NULL))
+ if (!WINPORT(ReadFile)(ArcHandle,cFileName,sizeof(cFileName) - 1,&ReadSize,NULL))
return(GETARC_READERROR);
- if (*Item->FindData.cFileName == 0) {
- strncpy(Item->FindData.cFileName, ZipName, sizeof(Item->FindData.cFileName)-1 );
+ if (cFileName[0] == 0) {
+ Info->PathName = ZipName;
} else { // workaround for tar.gz archives that has original name set but without .tar extension
// since tar archives detection relies on extension, it should be there (#173)
+ Info->PathName = cFileName;
const char *ZipExt = strrchr(ZipName, '.');
if (ZipExt && strcasecmp(ZipExt, ".tar") == 0) {
- const char *OrigExt = strrchr(Item->FindData.cFileName, '.');
+ const char *OrigExt = strrchr(cFileName, '.');
if (!OrigExt || strcasecmp(OrigExt, ZipExt) != 0) {
- strncat(Item->FindData.cFileName, ZipExt, sizeof(Item->FindData.cFileName));
+ Info->PathName+= ZipExt;
}
}
}
*ZipName=0;
- UnixTimeToFileTime(Header.FileTime,&Item->FindData.ftLastWriteTime);
+ UnixTimeToFileTime(Header.FileTime,&Info->ftLastWriteTime);
Info->Comment=(Header.Flags & 16)!=0;
Info->Encrypted=(Header.Flags & 32)!=0;
WINPORT(SetFilePointer)(ArcHandle,-4,NULL,FILE_END);
// reading 32-bit size into 64 bit fine unless host is a big-endian...
- if (!WINPORT(ReadFile)(ArcHandle,&Item->FindData.nFileSize,sizeof(DWORD),&ReadSize,NULL))
+ Info->nFileSize = 0;
+ if (!WINPORT(ReadFile)(ArcHandle,&Info->nFileSize,sizeof(DWORD),&ReadSize,NULL))
return(GETARC_READERROR);
return(GETARC_SUCCESS);
}
-int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int GetArcItemTAR(struct ArcItemInfo *Info)
{
TARHeader TAR_hdr;
DWORD ReadSize;
@@ -369,8 +372,8 @@ int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
np[sizeof(TAR_hdr.header.name)] = '\0';
EndPos = AdjustTARFileName(namebuf);
}
- strncpy(Item->FindData.cFileName, EndPos, sizeof(Item->FindData.cFileName)-1);
- Item->FindData.nFileSize=0;
+ Info->PathName = EndPos;
+ Info->nFileSize=0;
dwUnixMode = (DWORD)GetOctal(TAR_hdr.header.mode);
switch (TAR_hdr.header.typeflag) {
case REGTYPE: case AREGTYPE:
@@ -402,25 +405,25 @@ int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
if ((dwUnixMode & S_IFMT) == S_IFLNK) //TAR_hdr.header.typeflag == SYMTYPE || TAR_hdr.header.typeflag == LNKTYPE
{
- if((Item->UserData=(DWORD_PTR)MA_malloc(strlen(TAR_hdr.header.linkname)+2)) != 0)
+ if((Info->UserData=(DWORD_PTR)MA_malloc(strlen(TAR_hdr.header.linkname)+2)) != 0)
{
EndPos = AdjustTARFileName (TAR_hdr.header.linkname);
if(TAR_hdr.header.typeflag == LNKTYPE)
- *(char*)Item->UserData='/';
- strncpy((char*)Item->UserData+(TAR_hdr.header.typeflag == LNKTYPE?1:0),EndPos,strlen(TAR_hdr.header.linkname)+1);
+ *(char*)Info->UserData='/';
+ strncpy((char*)Info->UserData+(TAR_hdr.header.typeflag == LNKTYPE?1:0),EndPos,strlen(TAR_hdr.header.linkname)+1);
}
}
- Item->FindData.dwFileAttributes=WINPORT(EvaluateAttributesA)(dwUnixMode, Item->FindData.cFileName);
- Item->FindData.dwUnixMode=dwUnixMode;
+ Info->dwFileAttributes=WINPORT(EvaluateAttributesA)(dwUnixMode, Info->PathName.c_str());
+ Info->dwUnixMode=dwUnixMode;
- UnixTimeToFileTime((DWORD)GetOctal(TAR_hdr.header.mtime),&Item->FindData.ftLastWriteTime);
+ UnixTimeToFileTime((DWORD)GetOctal(TAR_hdr.header.mtime),&Info->ftLastWriteTime);
}
DWORD64 TarItemSize = (TAR_hdr.header.typeflag == DIRTYPE) ? 0 : // #348
Oct2Size(TAR_hdr.header.size,sizeof(TAR_hdr.header.size));
- Item->FindData.nFileSize=TarItemSize;
- Item->FindData.nPhysicalSize=TarItemSize;
+ Info->nFileSize=TarItemSize;
+ Info->nPhysicalSize=TarItemSize;
strcpy(Info->HostOS,TarArchiveFormat==POSIX_FORMAT?"POSIX":(TarArchiveFormat==V7_FORMAT?"V7":""));
Info->UnpVer=256+11+(TarArchiveFormat >= POSIX_FORMAT?1:0); //!!!
@@ -443,10 +446,10 @@ int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
// we can't have two LONGNAME records in a row without a file between them
if (LongName != NULL)
return GETARC_BROKEN;
- LongName = (char *)malloc(Item->FindData.nPhysicalSize);
+ LongName = (char *)malloc(Info->nPhysicalSize);
DWORD BytesRead;
- WINPORT(ReadFile)(ArcHandle,LongName,Item->FindData.nPhysicalSize,&BytesRead,NULL);
- if (BytesRead != Item->FindData.nPhysicalSize)
+ WINPORT(ReadFile)(ArcHandle,LongName,Info->nPhysicalSize,&BytesRead,NULL);
+ if (BytesRead != Info->nPhysicalSize)
{
free(LongName);
return GETARC_BROKEN;
diff --git a/multiarc/src/formats/zip/zip.cpp b/multiarc/src/formats/zip/zip.cpp
index 860a3cdb..24ff1b00 100644
--- a/multiarc/src/formats/zip/zip.cpp
+++ b/multiarc/src/formats/zip/zip.cpp
@@ -26,20 +26,15 @@ using namespace oldfar;
# define ZIP_LIBARCHIVE 0
#endif
-static BOOL CPToUTF8( UINT cp, LPCSTR s, LPSTR d, int dlen )
+static void CPToUTF8( UINT cp, std::string &s )
{
- if (!s || !d || dlen<=1 )
- return FALSE;
-
- std::vector<wchar_t> buf((1 + strlen( s )) * 2);
-
- int r = WINPORT(MultiByteToWideChar)( cp, 0, s, -1, &buf[0], buf.size() );
- if (r >= 0) {
- r = WINPORT(WideCharToMultiByte)( CP_UTF8, 0, &buf[0], r, d, dlen - 1, NULL, NULL );
- d[ (r >= 0) ? r : 0 ] = 0;
- } else
- d[0] = 0;
- return TRUE;
+ if (!s.empty()) {
+ std::vector<wchar_t> buf((1 + s.size()) * 2 + 1);
+ int r = WINPORT(MultiByteToWideChar)( cp, 0, s.c_str(), -1, &buf[0], buf.size() - 1 );
+ if (r >= 0) {
+ Wide2MB(&buf[0], s);
+ }
+ }
}
#if defined(__BORLANDC__)
@@ -219,7 +214,7 @@ BOOL WINAPI _export ZIP_OpenArchive(const char *Name,int *Type,bool Silent)
}
-int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info)
+int WINAPI _export ZIP_GetArcItem(struct ArcItemInfo *Info)
{
struct ZipHd1
{
@@ -306,7 +301,7 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
{
bTruncated=true;
NextPosition.QuadPart=SFXSize.QuadPart;
- return(ZIP_GetArcItem(Item,Info));
+ return(ZIP_GetArcItem(Info));
}
}
else
@@ -334,25 +329,22 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
if (ZipHeader.Mark==0x07064b50) //EOCD64Locator
{
NextPosition.QuadPart+= 20;
- return ZIP_GetArcItem(Item,Info);
+ return ZIP_GetArcItem(Info);
}
- DWORD SizeToRead=(ZipHeader.NameLen<ARRAYSIZE(Item->FindData.cFileName)-1) ? ZipHeader.NameLen : ARRAYSIZE(Item->FindData.cFileName)-1;
- if (!WINPORT(ReadFile)(ArcHandle,Item->FindData.cFileName,SizeToRead,&ReadSize,NULL) ||
+ char cFileName[NM + 1] = {0};
+ DWORD SizeToRead=std::min(DWORD(ZipHeader.NameLen), DWORD(ARRAYSIZE(cFileName)-1));
+ if (!WINPORT(ReadFile)(ArcHandle,cFileName,SizeToRead,&ReadSize,NULL) ||
ReadSize!=SizeToRead)
return(GETARC_READERROR);
- Item->FindData.cFileName[ARRAYSIZE(Item->FindData.cFileName)-1]=0;
-
- char *EndPos = Item->FindData.cFileName;
- while( *EndPos ) EndPos++;
-
- Item->FindData.nFileSize=ZipHeader.UnpSize;
- Item->FindData.nPhysicalSize=ZipHeader.PackSize;
- Item->CRC32=ZipHeader.CRC;
+ Info->PathName.assign(cFileName, strnlen(cFileName, ReadSize));
+ Info->nFileSize=ZipHeader.UnpSize;
+ Info->nPhysicalSize=ZipHeader.PackSize;
+ Info->CRC32=ZipHeader.CRC;
FILETIME lft;
WINPORT(DosDateTimeToFileTime)(HIWORD(ZipHeader.ftime),LOWORD(ZipHeader.ftime),&lft);
- WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime);
+ WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime);
if (ZipHeader.Flags & 1)
Info->Encrypted=TRUE;
if (ZipHeader.CommLen > 0)
@@ -362,7 +354,7 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
"Win32","SMS/QDOS","Acorn RISC OS","Win32 VFAT","MVS",
"BeOS","Tandem"};
if (ZipHeader.PackOS<ARRAYSIZE(ZipOS))
- strncpy(Info->HostOS,ZipOS[ZipHeader.PackOS],ARRAYSIZE(Info->HostOS)-1);
+ Info->HostOS = ZipOS[ZipHeader.PackOS];
Info->Codepage = 0;
@@ -371,11 +363,11 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
;
} else if (ZipHeader.PackOS==11 && ZipHeader.PackVer>=20) { // && ZipHeader.PackVer<25
- CPToUTF8(CP_ACP, Item->FindData.cFileName,Item->FindData.cFileName, ARRAYSIZE(Item->FindData.cFileName));
+ CPToUTF8(CP_ACP, Info->PathName);
Info->Codepage = WINPORT(GetACP)();
} else if (ZipHeader.PackOS==11 || ZipHeader.PackOS==0) {
- CPToUTF8(CP_OEMCP, Item->FindData.cFileName, Item->FindData.cFileName, ARRAYSIZE(Item->FindData.cFileName));
+ CPToUTF8(CP_OEMCP, Info->PathName);
Info->Codepage = WINPORT(GetOEMCP)();
}
@@ -383,17 +375,17 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
Info->DictSize=32;
if ((ZipHeader.PackOS==3 || ZipHeader.PackOS==7) && (ZipHeader.Attr&0xffff0000)!=0) {
- Item->FindData.dwUnixMode = ZipHeader.Attr>>16;
- if ((Item->FindData.dwUnixMode & S_IFMT) == 0) {
- Item->FindData.dwUnixMode|= S_IFREG;
+ Info->dwUnixMode = ZipHeader.Attr>>16;
+ if ((Info->dwUnixMode & S_IFMT) == 0) {
+ Info->dwUnixMode|= S_IFREG;
}
- Item->FindData.dwFileAttributes = WINPORT(EvaluateAttributesA)(Item->FindData.dwUnixMode, Item->FindData.cFileName);
+ Info->dwFileAttributes = WINPORT(EvaluateAttributesA)(Info->dwUnixMode, Info->PathName.c_str());
} else {
- Item->FindData.dwUnixMode = 0;
- Item->FindData.dwFileAttributes = ZipHeader.Attr & 0x3f;
+ Info->dwUnixMode = 0;
+ Info->dwFileAttributes = ZipHeader.Attr & 0x3f;
}
- memset(Info->Description, 0, sizeof(Info->Description));
+ Info->Description.clear();
// Search for extra block
ULARGE_INTEGER ExtraFieldEnd;
@@ -451,9 +443,9 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
|| ReadSize!=sizeof(Times) )
return(GETARC_READERROR);
- Item->FindData.ftLastWriteTime = Times.Modification;
- Item->FindData.ftLastAccessTime = Times.Access;
- Item->FindData.ftCreationTime = Times.Creation;
+ Info->ftLastWriteTime = Times.Modification;
+ Info->ftLastAccessTime = Times.Access;
+ Info->ftCreationTime = Times.Creation;
}
}
}
@@ -474,11 +466,11 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
if (BlockHead.Length>=4)
{
- Item->FindData.nFileSize=ZIP64.OriginalSize.QuadPart;
+ Info->nFileSize=ZIP64.OriginalSize.QuadPart;
}
if (BlockHead.Length>=8)
{
- Item->FindData.nPhysicalSize=ZIP64.CompressedSize.QuadPart;
+ Info->nPhysicalSize=ZIP64.CompressedSize.QuadPart;
}
}
else if ((0x7075==BlockHead.Type || 0x6375==BlockHead.Type) // Unicode Path Extra Field || Unicode Comment Extra Field
@@ -491,18 +483,18 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
return(GETARC_READERROR);
if (!WINPORT(ReadFile)(ArcHandle, &strcrc, sizeof(strcrc), &ReadSize, NULL) || ReadSize != sizeof(strcrc) )
return(GETARC_READERROR);
- if (!WINPORT(ReadFile)(ArcHandle, &strbuf[0], strbuf.size()-1, &ReadSize, NULL) || ReadSize != strbuf.size()-1 )
+ if (!WINPORT(ReadFile)(ArcHandle, strbuf.data(), strbuf.size()-1, &ReadSize, NULL) || ReadSize != strbuf.size()-1 )
return(GETARC_READERROR);
if (version!=1)
fprintf(stderr, "ZIP: Unicode Extra Field 0x%x unknown version %u\n", BlockHead.Type, version);
if (0x7075==BlockHead.Type) {
- strncpy(Item->FindData.cFileName, &strbuf[0], ARRAYSIZE(Item->FindData.cFileName) - 1);
+ Info->PathName = strbuf.data();
#if ZIP_LIBARCHIVE // if libarchive not used need to pass non-UTF8 codepage to zip/unzip workarounds
Info->Codepage = 0;
#endif
} else {
- strncpy(Info->Description, &strbuf[0], ARRAYSIZE(Info->Description) - 1);
+ Info->Description = strbuf.data();
}
}
else // Move to extra block end
@@ -516,19 +508,20 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf
if (ZipHeader.CommLen>0)
{
ReadSize = 0;
- if (!Info->Description[0]) //we could already get UTF-8 description
+ if (!Info->Description.empty()) //we could already get UTF-8 description
{
- DWORD SizeToRead = (ZipHeader.CommLen>255) ? 255 : ZipHeader.CommLen;
-
- if (!WINPORT(ReadFile)(ArcHandle, Info->Description, SizeToRead, &ReadSize, NULL)
+ char Description[255];
+ DWORD SizeToRead = std::min(DWORD(ZipHeader.CommLen), DWORD(ARRAYSIZE(Description)));
+ if (!WINPORT(ReadFile)(ArcHandle, Description, SizeToRead, &ReadSize, NULL)
|| ReadSize != SizeToRead ) return(GETARC_READERROR);
+ Info->Description.assign(Description, ReadSize);
}
// Skip comment tail
WINPORT(SetFilePointer)(ArcHandle, ZipHeader.CommLen - ReadSize, NULL, FILE_CURRENT);
}
ULARGE_INTEGER SeekLen;
- SeekLen.QuadPart = bTruncated ? Item->FindData.nPhysicalSize : 0;
+ SeekLen.QuadPart = bTruncated ? Info->nPhysicalSize : 0;
WINPORT(SetFilePointer)(ArcHandle,SeekLen.u.LowPart,(PLONG)&SeekLen.u.HighPart,FILE_CURRENT);
NextPosition.QuadPart=GetFilePosition(ArcHandle);
return(GETARC_SUCCESS);
diff --git a/utils/include/utils.h b/utils/include/utils.h
index 51deb428..7196ce29 100644
--- a/utils/include/utils.h
+++ b/utils/include/utils.h
@@ -21,6 +21,13 @@ template <class C> static size_t tzlen(const C *ptz)
return (etz - ptz);
}
+template <class C> static size_t tnzlen(const C *ptz, size_t n)
+{
+ size_t i;
+ for (i = 0; i < n && ptz[i]; ++i);
+ return i;
+}
+
unsigned long htoul(const char *str, size_t maxlen = (size_t)-1);
unsigned long atoul(const char *str, size_t maxlen = (size_t)-1);
@@ -281,4 +288,30 @@ bool CaseIgnoreEngStrMatch(const char *str1, const char *str2, size_t len);
const char *CaseIgnoreEngStrChr(const char c, const char *str, size_t len);
+template <class POD_T>
+ void ZeroFill(POD_T &pod)
+{
+ memset(&pod, 0, sizeof(pod));
+}
+
+template <class STRING_T, typename ARRAY_T>
+ void StrAssignArray(STRING_T &s, const ARRAY_T &a)
+{
+ s.assign(a, tnzlen(a, ARRAYSIZE(a)));
+}
+
+template <class STRING_T, typename ARRAY_T>
+ void StrAppendArray(STRING_T &s, const ARRAY_T &a)
+{
+ s.append(a, tnzlen(a, ARRAYSIZE(a)));
+}
+
+
+template <class STRING_T, typename ARRAY_T>
+ bool StrMatchArray(STRING_T &s, const ARRAY_T &a)
+{
+ const size_t l = tnzlen(a, ARRAYSIZE(a));
+ return s.size() == l && s.compare(0, std::string::npos, a, l) == 0;
+}
+
#define DBGLINE fprintf(stderr, "%d %d @%s\n", getpid(), __LINE__, __FILE__)