mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-08 12:07:03 -06:00
18.06
This commit is contained in:
@@ -236,6 +236,13 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
|
||||
prop = v;
|
||||
break;
|
||||
}
|
||||
|
||||
case kpidReadOnly:
|
||||
{
|
||||
if (!_db.CanUpdate())
|
||||
prop = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
prop.Detach(value);
|
||||
return S_OK;
|
||||
|
||||
@@ -267,6 +267,9 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt
|
||||
db = &_db;
|
||||
#endif
|
||||
|
||||
if (db && !db->CanUpdate())
|
||||
return E_NOTIMPL;
|
||||
|
||||
/*
|
||||
CMyComPtr<IArchiveGetRawProps> getRawProps;
|
||||
updateCallback->QueryInterface(IID_IArchiveGetRawProps, (void **)&getRawProps);
|
||||
|
||||
@@ -1465,21 +1465,24 @@ void CDbEx::FillLinks()
|
||||
}
|
||||
|
||||
if (indexInFolder != 0)
|
||||
{
|
||||
folderIndex++;
|
||||
/*
|
||||
if (indexInFolder != 0)
|
||||
ThrowIncorrect();
|
||||
*/
|
||||
// 18.06
|
||||
ThereIsHeaderError = true;
|
||||
// ThrowIncorrect();
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (folderIndex >= NumFolders)
|
||||
return;
|
||||
FolderStartFileIndex[folderIndex] = i;
|
||||
/*
|
||||
if (NumUnpackStreamsVector[folderIndex] != 0)
|
||||
ThrowIncorrect();;
|
||||
*/
|
||||
{
|
||||
// 18.06
|
||||
ThereIsHeaderError = true;
|
||||
// ThrowIncorrect();
|
||||
}
|
||||
folderIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,6 +257,16 @@ struct CDbEx: public CDatabase
|
||||
PhySize = 0;
|
||||
}
|
||||
|
||||
bool CanUpdate() const
|
||||
{
|
||||
if (ThereIsHeaderError
|
||||
|| UnexpectedEnd
|
||||
|| StartHeaderWasRecovered
|
||||
|| UnsupportedFeatureError)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void FillLinks();
|
||||
|
||||
UInt64 GetFolderStreamPos(CNum folderIndex, unsigned indexInFolder) const
|
||||
|
||||
@@ -124,13 +124,13 @@ static int Parse_EXE(const Byte *buf, size_t size, CFilterMode *filterMode)
|
||||
#define ELF_DATA_2LSB 1
|
||||
#define ELF_DATA_2MSB 2
|
||||
|
||||
static UInt16 Get16(const Byte *p, Bool be) { if (be) return (UInt16)GetBe16(p); return (UInt16)GetUi16(p); }
|
||||
static UInt32 Get32(const Byte *p, Bool be) { if (be) return GetBe32(p); return GetUi32(p); }
|
||||
// static UInt64 Get64(const Byte *p, Bool be) { if (be) return GetBe64(p); return GetUi64(p); }
|
||||
static UInt16 Get16(const Byte *p, BoolInt be) { if (be) return (UInt16)GetBe16(p); return (UInt16)GetUi16(p); }
|
||||
static UInt32 Get32(const Byte *p, BoolInt be) { if (be) return GetBe32(p); return GetUi32(p); }
|
||||
// static UInt64 Get64(const Byte *p, BoolInt be) { if (be) return GetBe64(p); return GetUi64(p); }
|
||||
|
||||
static int Parse_ELF(const Byte *buf, size_t size, CFilterMode *filterMode)
|
||||
{
|
||||
Bool /* is32, */ be;
|
||||
BoolInt /* is32, */ be;
|
||||
UInt32 filterId;
|
||||
|
||||
if (size < 512 || buf[6] != 1) /* ver */
|
||||
@@ -200,7 +200,7 @@ static unsigned Parse_MACH(const Byte *buf, size_t size, CFilterMode *filterMode
|
||||
if (size < 512)
|
||||
return 0;
|
||||
|
||||
Bool /* mode64, */ be;
|
||||
BoolInt /* mode64, */ be;
|
||||
switch (GetUi32(buf))
|
||||
{
|
||||
case MACH_SIG_BE_32: /* mode64 = False; */ be = True; break;
|
||||
@@ -239,7 +239,7 @@ static unsigned Parse_MACH(const Byte *buf, size_t size, CFilterMode *filterMode
|
||||
|
||||
#define RIFF_SIG 0x46464952
|
||||
|
||||
static Bool Parse_WAV(const Byte *buf, size_t size, CFilterMode *filterMode)
|
||||
static BoolInt Parse_WAV(const Byte *buf, size_t size, CFilterMode *filterMode)
|
||||
{
|
||||
UInt32 subChunkSize, pos;
|
||||
if (size < 0x2C)
|
||||
@@ -285,7 +285,7 @@ static Bool Parse_WAV(const Byte *buf, size_t size, CFilterMode *filterMode)
|
||||
return False;
|
||||
}
|
||||
|
||||
static Bool ParseFile(const Byte *buf, size_t size, CFilterMode *filterMode)
|
||||
static BoolInt ParseFile(const Byte *buf, size_t size, CFilterMode *filterMode)
|
||||
{
|
||||
filterMode->Id = 0;
|
||||
filterMode->Delta = 0;
|
||||
@@ -894,7 +894,7 @@ HRESULT CAnalysis::GetFilterGroup(UInt32 index, const CUpdateItem &ui, CFilterMo
|
||||
// RINOK(Callback->SetOperationResult2(index, NUpdate::NOperationResult::kOK));
|
||||
if (result == S_OK)
|
||||
{
|
||||
Bool parseRes = ParseFile(Buffer, size, &filterModeTemp);
|
||||
BoolInt parseRes = ParseFile(Buffer, size, &filterModeTemp);
|
||||
if (parseRes && filterModeTemp.Delta == 0)
|
||||
{
|
||||
filterModeTemp.SetDelta();
|
||||
@@ -1648,6 +1648,9 @@ HRESULT Update(
|
||||
|
||||
for (CNum fi = db->FolderStartFileIndex[i]; indexInFolder < numUnpackStreams; fi++)
|
||||
{
|
||||
if (fi >= db->Files.Size())
|
||||
return E_FAIL;
|
||||
|
||||
const CFileItem &file = db->Files[fi];
|
||||
if (file.HasStream)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user