mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-15 04:11:46 -06:00
4.43 beta
This commit is contained in:
committed by
Kornel Lesiński
parent
0ec42ff829
commit
804edc5756
@@ -13,7 +13,7 @@ DEFINE_GUID(CLSID_CTarHandler,
|
||||
0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0xEE, 0x00, 0x00);
|
||||
|
||||
extern "C"
|
||||
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
|
||||
BOOL WINAPI DllMain(HINSTANCE /* hInstance */, DWORD /* dwReason */, LPVOID /* lpReserved */)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ STATPROPSTG kProperties[] =
|
||||
{ NULL, kpidGroup, VT_BSTR},
|
||||
};
|
||||
|
||||
STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
|
||||
STDMETHODIMP CHandler::GetArchiveProperty(PROPID /* propID */, PROPVARIANT *value)
|
||||
{
|
||||
value->vt = VT_EMPTY;
|
||||
return S_OK;
|
||||
@@ -66,14 +66,14 @@ STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32 index,
|
||||
BSTR *name, PROPID *propID, VARTYPE *varType)
|
||||
STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32 /* index */,
|
||||
BSTR * /* name */, PROPID * /* propID */, VARTYPE * /* varType */)
|
||||
{
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
STDMETHODIMP CHandler::Open(IInStream *stream,
|
||||
const UInt64 *maxCheckStartPosition,
|
||||
const UInt64 * /* maxCheckStartPosition */,
|
||||
IArchiveOpenCallback *openArchiveCallback)
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
@@ -93,7 +93,7 @@ STDMETHODIMP CHandler::Open(IInStream *stream,
|
||||
RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL));
|
||||
}
|
||||
|
||||
while(true)
|
||||
for (;;)
|
||||
{
|
||||
CItemEx item;
|
||||
bool filled;
|
||||
@@ -242,7 +242,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,
|
||||
RINOK(_inStream->Seek(item.GetDataPosition(), STREAM_SEEK_SET, NULL));
|
||||
CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
|
||||
CMyComPtr<ISequentialInStream> inStream(streamSpec);
|
||||
streamSpec->Init(_inStream, item.Size);
|
||||
streamSpec->SetStream(_inStream);
|
||||
streamSpec->Init(item.Size);
|
||||
|
||||
CLocalProgress *localProgressSpec = new CLocalProgress;
|
||||
CMyComPtr<ICompressProgressInfo> progress = localProgressSpec;
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace NFileHeader {
|
||||
const char *kCheckSumBlanks = " "; // 8 blanks, no null
|
||||
|
||||
const char *kLongLink = "././@LongLink";
|
||||
const char *kLongLink2 = "@LongLink";
|
||||
|
||||
// The magic field is filled with this if uname and gname are valid.
|
||||
namespace NMagic
|
||||
|
||||
@@ -81,7 +81,8 @@ namespace NFileHeader
|
||||
// The checksum field is filled with this while the checksum is computed.
|
||||
extern const char *kCheckSumBlanks;// = " "; // 8 blanks, no null
|
||||
|
||||
extern const char *kLongLink; // = "././@LongLink";
|
||||
extern const char *kLongLink; // = "././@LongLink";
|
||||
extern const char *kLongLink2; // = "@LongLink";
|
||||
|
||||
// The magic field is filled with this if uname and gname are valid.
|
||||
namespace NMagic
|
||||
|
||||
@@ -27,10 +27,21 @@ HRESULT CInArchive::Open(IInStream *inStream)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static void MyStrNCpy(char *dest, const char *src, int size)
|
||||
{
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
char c = src[i];
|
||||
dest[i] = c;
|
||||
if (c == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static bool OctalToNumber(const char *srcString, int size, UInt64 &res)
|
||||
{
|
||||
char sz[32];
|
||||
strncpy(sz, srcString, size);
|
||||
MyStrNCpy(sz, srcString, size);
|
||||
sz[size] = 0;
|
||||
const char *end;
|
||||
int i;
|
||||
@@ -63,14 +74,14 @@ static void ReadString(const char *s, int size, AString &result)
|
||||
if (size > NFileHeader::kRecordSize)
|
||||
size = NFileHeader::kNameSize;
|
||||
char tempString[NFileHeader::kRecordSize + 1];
|
||||
strncpy(tempString, s, size);
|
||||
MyStrNCpy(tempString, s, size);
|
||||
tempString[size] = '\0';
|
||||
result = tempString;
|
||||
}
|
||||
|
||||
static char GetHex(Byte value)
|
||||
{
|
||||
return (value < 10) ? ('0' + value) : ('A' + (value - 10));
|
||||
return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
|
||||
}
|
||||
|
||||
HRESULT CInArchive::GetNextItemReal(bool &filled, CItemEx &item)
|
||||
@@ -109,8 +120,8 @@ HRESULT CInArchive::GetNextItemReal(bool &filled, CItemEx &item)
|
||||
if (((Byte)c) < 0x20)
|
||||
{
|
||||
item.Name += '[';
|
||||
item.Name += GetHex(((Byte)c) >> 4);
|
||||
item.Name += GetHex(((Byte)c) & 0xF);
|
||||
item.Name += GetHex((Byte)(((Byte)c) >> 4));
|
||||
item.Name += GetHex((Byte)(((Byte)c) & 0xF));
|
||||
item.Name += ']';
|
||||
}
|
||||
else
|
||||
@@ -190,7 +201,8 @@ HRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item)
|
||||
if (item.LinkFlag == 'L')
|
||||
{
|
||||
if (item.Name.Compare(NFileHeader::kLongLink) != 0)
|
||||
return S_FALSE;
|
||||
if (item.Name.Compare(NFileHeader::kLongLink2) != 0)
|
||||
return S_FALSE;
|
||||
UInt64 headerPosition = item.HeaderPosition;
|
||||
|
||||
UInt32 processedSize;
|
||||
|
||||
@@ -33,6 +33,17 @@ static AString MakeOctalString(UInt64 value)
|
||||
return AString(s) + ' ';
|
||||
}
|
||||
|
||||
static void MyStrNCpy(char *dest, const char *src, int size)
|
||||
{
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
char c = src[i];
|
||||
dest[i] = c;
|
||||
if (c == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static bool MakeOctalString8(char *s, UInt32 value)
|
||||
{
|
||||
AString tempString = MakeOctalString(value);
|
||||
@@ -43,7 +54,7 @@ static bool MakeOctalString8(char *s, UInt32 value)
|
||||
int numSpaces = kMaxSize - (tempString.Length() + 1);
|
||||
for(int i = 0; i < numSpaces; i++)
|
||||
s[i] = ' ';
|
||||
strcpy(s + numSpaces, tempString);
|
||||
MyStringCopy(s + numSpaces, (const char *)tempString);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -64,7 +75,7 @@ static bool CopyString(char *dest, const AString &src, int maxSize)
|
||||
{
|
||||
if (src.Length() >= maxSize)
|
||||
return false;
|
||||
strcpy(dest, src);
|
||||
MyStringCopy(dest, (const char *)src);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -81,7 +92,7 @@ HRESULT COutArchive::WriteHeaderReal(const CItem &item)
|
||||
// RETURN_IF_NOT_TRUE(CopyString(header.Name, item.Name, NFileHeader::kNameSize));
|
||||
if (item.Name.Length() > NFileHeader::kNameSize)
|
||||
return E_FAIL;
|
||||
strncpy(cur, item.Name, NFileHeader::kNameSize);
|
||||
MyStrNCpy(cur, item.Name, NFileHeader::kNameSize);
|
||||
cur += NFileHeader::kNameSize;
|
||||
|
||||
RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.Mode));
|
||||
|
||||
@@ -139,13 +139,15 @@ HRESULT UpdateArchive(IInStream *inStream, ISequentialOutStream *outStream,
|
||||
RINOK(outArchive.WriteHeader(item));
|
||||
RINOK(inStream->Seek(existItemInfo.GetDataPosition(),
|
||||
STREAM_SEEK_SET, NULL));
|
||||
streamSpec->Init(inStream, existItemInfo.Size);
|
||||
streamSpec->SetStream(inStream);
|
||||
streamSpec->Init(existItemInfo.Size);
|
||||
}
|
||||
else
|
||||
{
|
||||
RINOK(inStream->Seek(existItemInfo.HeaderPosition,
|
||||
STREAM_SEEK_SET, NULL));
|
||||
streamSpec->Init(inStream, existItemInfo.GetFullSize());
|
||||
streamSpec->SetStream(inStream);
|
||||
streamSpec->Init(existItemInfo.GetFullSize());
|
||||
}
|
||||
RINOK(CopyBlock(inStreamLimited, outStream, compressProgress));
|
||||
RINOK(outArchive.FillDataResidual(existItemInfo.Size));
|
||||
|
||||
Reference in New Issue
Block a user