• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 7zItem.h
2 
3 #ifndef ZIP7_INC_7Z_ITEM_H
4 #define ZIP7_INC_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 
30 struct CBond
31 {
32   UInt32 PackIndex;
33   UInt32 UnpackIndex;
34 };
35 
36 
37 struct CFolder
38 {
39   Z7_CLASS_NO_COPY(CFolder)
40 public:
41   CObjArray2<CCoderInfo> Coders;
42   CObjArray2<CBond> Bonds;
43   CObjArray2<UInt32> PackStreams;
44 
CFolderCFolder45   CFolder() {}
46 
IsDecodingSupportedCFolder47   bool IsDecodingSupported() const { return Coders.Size() <= 32; }
48 
Find_in_PackStreamsCFolder49   int Find_in_PackStreams(UInt32 packStream) const
50   {
51     FOR_VECTOR(i, PackStreams)
52       if (PackStreams[i] == packStream)
53         return (int)i;
54     return -1;
55   }
56 
FindBond_for_PackStreamCFolder57   int FindBond_for_PackStream(UInt32 packStream) const
58   {
59     FOR_VECTOR(i, Bonds)
60       if (Bonds[i].PackIndex == packStream)
61         return (int)i;
62     return -1;
63   }
64 
65   /*
66   int FindBond_for_UnpackStream(UInt32 unpackStream) const
67   {
68     FOR_VECTOR(i, Bonds)
69       if (Bonds[i].UnpackIndex == unpackStream)
70         return i;
71     return -1;
72   }
73 
74   int FindOutCoder() const
75   {
76     for (int i = (int)Coders.Size() - 1; i >= 0; i--)
77       if (FindBond_for_UnpackStream(i) < 0)
78         return i;
79     return -1;
80   }
81   */
82 
IsEncryptedCFolder83   bool IsEncrypted() const
84   {
85     FOR_VECTOR(i, Coders)
86       if (Coders[i].MethodID == k_AES)
87         return true;
88     return false;
89   }
90 };
91 
92 
93 struct CUInt32DefVector
94 {
95   CBoolVector Defs;
96   CRecordVector<UInt32> Vals;
97 
ClearAndSetSizeCUInt32DefVector98   void ClearAndSetSize(unsigned newSize)
99   {
100     Defs.ClearAndSetSize(newSize);
101     Vals.ClearAndSetSize(newSize);
102   }
103 
ClearCUInt32DefVector104   void Clear()
105   {
106     Defs.Clear();
107     Vals.Clear();
108   }
109 
ReserveDownCUInt32DefVector110   void ReserveDown()
111   {
112     Defs.ReserveDown();
113     Vals.ReserveDown();
114   }
115 
GetItemCUInt32DefVector116   bool GetItem(unsigned index, UInt32 &value) const
117   {
118     if (index < Defs.Size() && Defs[index])
119     {
120       value = Vals[index];
121       return true;
122     }
123     value = 0;
124     return false;
125   }
126 
ValidAndDefinedCUInt32DefVector127   bool ValidAndDefined(unsigned i) const { return i < Defs.Size() && Defs[i]; }
128 
CheckSizeCUInt32DefVector129   bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; }
130 
131   void SetItem(unsigned index, bool defined, UInt32 value);
if_NonEmpty_FillResedue_with_falseCUInt32DefVector132   void if_NonEmpty_FillResedue_with_false(unsigned numItems)
133   {
134     if (Defs.Size() != 0 && Defs.Size() < numItems)
135       SetItem(numItems - 1, false, 0);
136   }
137 };
138 
139 
140 struct CUInt64DefVector
141 {
142   CBoolVector Defs;
143   CRecordVector<UInt64> Vals;
144 
ClearCUInt64DefVector145   void Clear()
146   {
147     Defs.Clear();
148     Vals.Clear();
149   }
150 
ReserveDownCUInt64DefVector151   void ReserveDown()
152   {
153     Defs.ReserveDown();
154     Vals.ReserveDown();
155   }
156 
GetItemCUInt64DefVector157   bool GetItem(unsigned index, UInt64 &value) const
158   {
159     if (index < Defs.Size() && Defs[index])
160     {
161       value = Vals[index];
162       return true;
163     }
164     value = 0;
165     return false;
166   }
167 
CheckSizeCUInt64DefVector168   bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; }
169 
170   void SetItem(unsigned index, bool defined, UInt64 value);
171 };
172 
173 
174 struct CFileItem
175 {
176   UInt64 Size;
177   UInt32 Crc;
178   /*
179   int Parent;
180   bool IsAltStream;
181   */
182   bool HasStream; // Test it !!! it means that there is
183                   // stream in some folder. It can be empty stream
184   bool IsDir;
185   bool CrcDefined;
186 
187   /*
188   void Clear()
189   {
190     HasStream = true;
191     IsDir = false;
192     CrcDefined = false;
193   }
194 
195   CFileItem():
196     // Parent(-1),
197     // IsAltStream(false),
198     HasStream(true),
199     IsDir(false),
200     CrcDefined(false),
201       {}
202   */
203 };
204 
205 }}
206 
207 #endif
208