// 7zItem.h | |
#ifndef __7Z_ITEM_H | |
#define __7Z_ITEM_H | |
#include "../../../Common/MyBuffer.h" | |
#include "../../../Common/MyString.h" | |
#include "../../Common/MethodId.h" | |
#include "7zHeader.h" | |
namespace NArchive { | |
namespace N7z { | |
const UInt64 k_AES = 0x06F10701; | |
typedef UInt32 CNum; | |
const CNum kNumMax = 0x7FFFFFFF; | |
const CNum kNumNoIndex = 0xFFFFFFFF; | |
struct CCoderInfo | |
{ | |
CMethodId MethodID; | |
CByteBuffer Props; | |
CNum NumInStreams; | |
CNum NumOutStreams; | |
bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); } | |
}; | |
struct CBindPair | |
{ | |
CNum InIndex; | |
CNum OutIndex; | |
}; | |
struct CFolder | |
{ | |
CObjArray2<CCoderInfo> Coders; | |
CObjArray2<CBindPair> BindPairs; | |
CObjArray2<CNum> PackStreams; | |
CNum GetNumOutStreams() const | |
{ | |
CNum result = 0; | |
FOR_VECTOR(i, Coders) | |
result += Coders[i].NumOutStreams; | |
return result; | |
} | |
int FindBindPairForInStream(CNum inStreamIndex) const | |
{ | |
FOR_VECTOR(i, BindPairs) | |
if (BindPairs[i].InIndex == inStreamIndex) | |
return i; | |
return -1; | |
} | |
int FindBindPairForOutStream(CNum outStreamIndex) const | |
{ | |
FOR_VECTOR(i, BindPairs) | |
if (BindPairs[i].OutIndex == outStreamIndex) | |
return i; | |
return -1; | |
} | |
int FindPackStreamArrayIndex(CNum inStreamIndex) const | |
{ | |
FOR_VECTOR(i, PackStreams) | |
if (PackStreams[i] == inStreamIndex) | |
return i; | |
return -1; | |
} | |
int GetIndexOfMainOutStream() const | |
{ | |
for (int i = (int)GetNumOutStreams() - 1; i >= 0; i--) | |
if (FindBindPairForOutStream(i) < 0) | |
return i; | |
throw 1; | |
} | |
bool IsEncrypted() const | |
{ | |
for (int i = Coders.Size() - 1; i >= 0; i--) | |
if (Coders[i].MethodID == k_AES) | |
return true; | |
return false; | |
} | |
bool CheckStructure(unsigned numUnpackSizes) const; | |
}; | |
struct CUInt32DefVector | |
{ | |
CBoolVector Defs; | |
CRecordVector<UInt32> Vals; | |
void ClearAndSetSize(unsigned newSize) | |
{ | |
Defs.ClearAndSetSize(newSize); | |
Vals.ClearAndSetSize(newSize); | |
} | |
void Clear() | |
{ | |
Defs.Clear(); | |
Vals.Clear(); | |
} | |
void ReserveDown() | |
{ | |
Defs.ReserveDown(); | |
Vals.ReserveDown(); | |
} | |
bool ValidAndDefined(unsigned i) const { return i < Defs.Size() && Defs[i]; } | |
}; | |
struct CUInt64DefVector | |
{ | |
CBoolVector Defs; | |
CRecordVector<UInt64> Vals; | |
void Clear() | |
{ | |
Defs.Clear(); | |
Vals.Clear(); | |
} | |
void ReserveDown() | |
{ | |
Defs.ReserveDown(); | |
Vals.ReserveDown(); | |
} | |
bool GetItem(unsigned index, UInt64 &value) const | |
{ | |
if (index < Defs.Size() && Defs[index]) | |
{ | |
value = Vals[index]; | |
return true; | |
} | |
value = 0; | |
return false; | |
} | |
void SetItem(unsigned index, bool defined, UInt64 value); | |
bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; } | |
}; | |
struct CFileItem | |
{ | |
UInt64 Size; | |
UInt32 Attrib; | |
UInt32 Crc; | |
/* | |
int Parent; | |
bool IsAltStream; | |
*/ | |
bool HasStream; // Test it !!! it means that there is | |
// stream in some folder. It can be empty stream | |
bool IsDir; | |
bool CrcDefined; | |
bool AttribDefined; | |
CFileItem(): | |
/* | |
Parent(-1), | |
IsAltStream(false), | |
*/ | |
HasStream(true), | |
IsDir(false), | |
CrcDefined(false), | |
AttribDefined(false) | |
{} | |
void SetAttrib(UInt32 attrib) | |
{ | |
AttribDefined = true; | |
Attrib = attrib; | |
} | |
}; | |
}} | |
#endif |