mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-09 20:07:04 -06:00
17.00
This commit is contained in:
@@ -81,20 +81,19 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
|
||||
|
||||
case kpidCodePage:
|
||||
{
|
||||
char sz[16];
|
||||
const char *name = NULL;
|
||||
switch (_openCodePage)
|
||||
{
|
||||
case CP_OEMCP: name = "OEM"; break;
|
||||
case CP_UTF8: name = "UTF-8"; break;
|
||||
case CP_UTF8: name = "UTF-8"; break;
|
||||
}
|
||||
if (name != NULL)
|
||||
prop = name;
|
||||
else
|
||||
if (!name)
|
||||
{
|
||||
char sz[16];
|
||||
ConvertUInt32ToString(_openCodePage, sz);
|
||||
prop = sz;
|
||||
};
|
||||
name = sz;
|
||||
}
|
||||
prop = name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -316,7 +315,7 @@ void CHandler::TarStringToUnicode(const AString &s, NWindows::NCOM::CPropVariant
|
||||
else
|
||||
MultiByteToUnicodeString2(dest, s, _curCodePage);
|
||||
if (toOs)
|
||||
NItemName::ConvertToOSName2(dest);
|
||||
NItemName::ReplaceToOsSlashes_Remove_TailSlash(dest);
|
||||
prop = dest;
|
||||
}
|
||||
|
||||
@@ -353,7 +352,7 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
|
||||
prop = ft;
|
||||
}
|
||||
break;
|
||||
case kpidPosixAttrib: prop = item->Mode; break;
|
||||
case kpidPosixAttrib: prop = item->Get_Combined_Mode(); break;
|
||||
case kpidUser: TarStringToUnicode(item->User, prop); break;
|
||||
case kpidGroup: TarStringToUnicode(item->Group, prop); break;
|
||||
case kpidSymLink: if (item->LinkFlag == NFileHeader::NLinkFlag::kSymLink && !item->LinkName.IsEmpty()) TarStringToUnicode(item->LinkName, prop); break;
|
||||
|
||||
@@ -35,7 +35,7 @@ HRESULT GetPropString(IArchiveUpdateCallback *callback, UInt32 index, PROPID pro
|
||||
{
|
||||
UString s = prop.bstrVal;
|
||||
if (convertSlash)
|
||||
s = NItemName::MakeLegalName(s);
|
||||
NItemName::ReplaceSlashes_OsToUnix(s);
|
||||
|
||||
if (codePage == CP_UTF8)
|
||||
{
|
||||
@@ -123,6 +123,8 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt
|
||||
return E_INVALIDARG;
|
||||
else
|
||||
ui.Mode = prop.ulVal;
|
||||
// FIXME : we can clear high file type bits to be more compatible with tars created by GNU TAR.
|
||||
// ui.Mode &= ~(UInt32)MY_LIN_S_IFMT;
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -8,15 +8,15 @@ namespace NArchive {
|
||||
namespace NTar {
|
||||
namespace NFileHeader {
|
||||
|
||||
const char *kLongLink = "././@LongLink";
|
||||
const char *kLongLink2 = "@LongLink";
|
||||
const char * const kLongLink = "././@LongLink";
|
||||
const char * const kLongLink2 = "@LongLink";
|
||||
|
||||
// The magic field is filled with this if uname and gname are valid.
|
||||
namespace NMagic
|
||||
{
|
||||
// const char *kUsTar = "ustar"; // 5 chars
|
||||
// const char *kGNUTar = "GNUtar "; // 7 chars and a null
|
||||
// const char *kEmpty = "\0\0\0\0\0\0\0\0";
|
||||
// const char * const kUsTar = "ustar"; // 5 chars
|
||||
// const char * const kGNUTar = "GNUtar "; // 7 chars and a null
|
||||
// const char * const kEmpty = "\0\0\0\0\0\0\0\0";
|
||||
const char kUsTar_00[8] = { 'u', 's', 't', 'a', 'r', 0, '0', '0' } ;
|
||||
}
|
||||
|
||||
|
||||
@@ -67,15 +67,15 @@ namespace NFileHeader
|
||||
the last file name. */
|
||||
}
|
||||
|
||||
extern const char *kLongLink; // = "././@LongLink";
|
||||
extern const char *kLongLink2; // = "@LongLink";
|
||||
extern const char * const kLongLink; // = "././@LongLink";
|
||||
extern const char * const kLongLink2; // = "@LongLink";
|
||||
|
||||
namespace NMagic
|
||||
{
|
||||
// extern const char *kUsTar; // = "ustar"; // 5 chars
|
||||
// extern const char *kGNUTar; // = "GNUtar "; // 7 chars and a null
|
||||
// extern const char *kEmpty; // = "\0\0\0\0\0\0\0\0"
|
||||
extern const char kUsTar_00[];
|
||||
// extern const char * const kUsTar; // = "ustar"; // 5 chars
|
||||
// extern const char * const kGNUTar; // = "GNUtar "; // 7 chars and a null
|
||||
// extern const char * const kEmpty; // = "\0\0\0\0\0\0\0\0"
|
||||
extern const char kUsTar_00[8];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -91,6 +91,16 @@ static bool ParseInt64(const char *p, Int64 &val)
|
||||
return res;
|
||||
}
|
||||
|
||||
static bool ParseInt64_MTime(const char *p, Int64 &val)
|
||||
{
|
||||
// rare case tar contains spaces instead of MTime
|
||||
for (unsigned i = 0; i < 12; i++)
|
||||
if (p[i] != ' ')
|
||||
return ParseInt64(p, val);
|
||||
val = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool ParseSize(const char *p, UInt64 &val)
|
||||
{
|
||||
if (GetBe32(p) == (UInt32)1 << 31)
|
||||
@@ -124,7 +134,7 @@ API_FUNC_IsArc IsArc_Tar(const Byte *p2, size_t size)
|
||||
Int64 time;
|
||||
UInt32 checkSum;
|
||||
CHECK(ParseSize(p, packSize)); p += 12;
|
||||
CHECK(ParseInt64(p, time)); p += 12;
|
||||
CHECK(ParseInt64_MTime(p, time)); p += 12;
|
||||
CHECK(OctalToNumber32(p, 8, checkSum));
|
||||
return k_IsArc_Res_YES;
|
||||
}
|
||||
@@ -192,7 +202,7 @@ static HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemE
|
||||
RIF(ParseSize(p, item.PackSize));
|
||||
item.Size = item.PackSize;
|
||||
p += 12;
|
||||
RIF(ParseInt64(p, item.MTime)); p += 12;
|
||||
RIF(ParseInt64_MTime(p, item.MTime)); p += 12;
|
||||
|
||||
UInt32 checkSum;
|
||||
RIF(OctalToNumber32(p, 8, checkSum));
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#ifndef __ARCHIVE_TAR_ITEM_H
|
||||
#define __ARCHIVE_TAR_ITEM_H
|
||||
|
||||
#include "../../../Common/MyLinux.h"
|
||||
|
||||
#include "../Common/ItemNameUtils.h"
|
||||
|
||||
#include "TarHeader.h"
|
||||
@@ -56,6 +58,32 @@ struct CItem
|
||||
return false;
|
||||
}
|
||||
|
||||
UInt32 Get_Combined_Mode() const
|
||||
{
|
||||
return (Mode & ~(UInt32)MY_LIN_S_IFMT) | Get_FileTypeMode_from_LinkFlag();
|
||||
}
|
||||
|
||||
UInt32 Get_FileTypeMode_from_LinkFlag() const
|
||||
{
|
||||
switch (LinkFlag)
|
||||
{
|
||||
/*
|
||||
case NFileHeader::NLinkFlag::kDirectory:
|
||||
case NFileHeader::NLinkFlag::kDumpDir:
|
||||
return MY_LIN_S_IFDIR;
|
||||
*/
|
||||
case NFileHeader::NLinkFlag::kSymLink: return MY_LIN_S_IFLNK;
|
||||
case NFileHeader::NLinkFlag::kBlock: return MY_LIN_S_IFBLK;
|
||||
case NFileHeader::NLinkFlag::kCharacter: return MY_LIN_S_IFCHR;
|
||||
case NFileHeader::NLinkFlag::kFIFO: return MY_LIN_S_IFIFO;
|
||||
// case return MY_LIN_S_IFSOCK;
|
||||
}
|
||||
|
||||
if (IsDir())
|
||||
return MY_LIN_S_IFDIR;
|
||||
return MY_LIN_S_IFREG;
|
||||
}
|
||||
|
||||
bool IsDir() const
|
||||
{
|
||||
switch (LinkFlag)
|
||||
|
||||
Reference in New Issue
Block a user