1 // 7zItem.h
2 
3 #ifndef __7Z_ITEM_H
4 #define __7Z_ITEM_H
5 
6 #include "../../../Common/MyBuffer.h"
7 #include "../../../Common/MyString.h"
8 
9 #include "../../Common/MethodId.h"
10 
11 #include "7zHeader.h"
12 
13 namespace NArchive {
14 namespace N7z {
15 
16 typedef UInt32 CNum;
17 const CNum kNumMax     = 0x7FFFFFFF;
18 const CNum kNumNoIndex = 0xFFFFFFFF;
19 
20 struct CCoderInfo
21 {
22   CMethodId MethodID;
23   CByteBuffer Props;
24   UInt32 NumStreams;
25 
IsSimpleCoderCCoderInfo26   bool IsSimpleCoder() const { return NumStreams == 1; }
27 };
28 
29 struct CBond
30 {
31   UInt32 PackIndex;
32   UInt32 UnpackIndex;
33 };
34 
35 struct CFolder
36 {
37   CLASS_NO_COPY(CFolder)
38 public:
39   CObjArray2<CCoderInfo> Coders;
40   CObjArray2<CBond> Bonds;
41   CObjArray2<UInt32> PackStreams;
42 
CFolderCFolder43   CFolder() {}
44 
IsDecodingSupportedCFolder45   bool IsDecodingSupported() const { return Coders.Size() <= 32; }
46 
Find_in_PackStreamsCFolder47   int Find_in_PackStreams(UInt32 packStream) const
48   {
49     FOR_VECTOR(i, PackStreams)
50       if (PackStreams[i] == packStream)
51         return i;
52     return -1;
53   }
54 
FindBond_for_PackStreamCFolder55   int FindBond_for_PackStream(UInt32 packStream) const
56   {
57     FOR_VECTOR(i, Bonds)
58       if (Bonds[i].PackIndex == packStream)
59         return i;
60     return -1;
61   }
62 
63   /*
64   int FindBond_for_UnpackStream(UInt32 unpackStream) const
65   {
66     FOR_VECTOR(i, Bonds)
67       if (Bonds[i].UnpackIndex == unpackStream)
68         return i;
69     return -1;
70   }
71 
72   int FindOutCoder() const
73   {
74     for (int i = (int)Coders.Size() - 1; i >= 0; i--)
75       if (FindBond_for_UnpackStream(i) < 0)
76         return i;
77     return -1;
78   }
79   */
80 
IsEncryptedCFolder81   bool IsEncrypted() const
82   {
83     FOR_VECTOR(i, Coders)
84       if (Coders[i].MethodID == k_AES)
85         return true;
86     return false;
87   }
88 };
89 
90 struct CUInt32DefVector
91 {
92   CBoolVector Defs;
93   CRecordVector<UInt32> Vals;
94 
ClearAndSetSizeCUInt32DefVector95   void ClearAndSetSize(unsigned newSize)
96   {
97     Defs.ClearAndSetSize(newSize);
98     Vals.ClearAndSetSize(newSize);
99   }
100 
ClearCUInt32DefVector101   void Clear()
102   {
103     Defs.Clear();
104     Vals.Clear();
105   }
106 
ReserveDownCUInt32DefVector107   void ReserveDown()
108   {
109     Defs.ReserveDown();
110     Vals.ReserveDown();
111   }
112 
ValidAndDefinedCUInt32DefVector113   bool ValidAndDefined(unsigned i) const { return i < Defs.Size() && Defs[i]; }
114 };
115 
116 struct CUInt64DefVector
117 {
118   CBoolVector Defs;
119   CRecordVector<UInt64> Vals;
120 
ClearCUInt64DefVector121   void Clear()
122   {
123     Defs.Clear();
124     Vals.Clear();
125   }
126 
ReserveDownCUInt64DefVector127   void ReserveDown()
128   {
129     Defs.ReserveDown();
130     Vals.ReserveDown();
131   }
132 
GetItemCUInt64DefVector133   bool GetItem(unsigned index, UInt64 &value) const
134   {
135     if (index < Defs.Size() && Defs[index])
136     {
137       value = Vals[index];
138       return true;
139     }
140     value = 0;
141     return false;
142   }
143 
144   void SetItem(unsigned index, bool defined, UInt64 value);
145 
CheckSizeCUInt64DefVector146   bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; }
147 };
148 
149 struct CFileItem
150 {
151   UInt64 Size;
152   UInt32 Attrib;
153   UInt32 Crc;
154   /*
155   int Parent;
156   bool IsAltStream;
157   */
158   bool HasStream; // Test it !!! it means that there is
159                   // stream in some folder. It can be empty stream
160   bool IsDir;
161   bool CrcDefined;
162   bool AttribDefined;
163 
CFileItemCFileItem164   CFileItem():
165     /*
166     Parent(-1),
167     IsAltStream(false),
168     */
169     HasStream(true),
170     IsDir(false),
171     CrcDefined(false),
172     AttribDefined(false)
173       {}
SetAttribCFileItem174   void SetAttrib(UInt32 attrib)
175   {
176     AttribDefined = true;
177     Attrib = attrib;
178   }
179 };
180 
181 }}
182 
183 #endif
184