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 const UInt64 k_AES = 0x06F10701;
17 
18 typedef UInt32 CNum;
19 const CNum kNumMax     = 0x7FFFFFFF;
20 const CNum kNumNoIndex = 0xFFFFFFFF;
21 
22 struct CCoderInfo
23 {
24   CMethodId MethodID;
25   CByteBuffer Props;
26   CNum NumInStreams;
27   CNum NumOutStreams;
28 
IsSimpleCoderCCoderInfo29   bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); }
30 };
31 
32 struct CBindPair
33 {
34   CNum InIndex;
35   CNum OutIndex;
36 };
37 
38 struct CFolder
39 {
40   CObjArray2<CCoderInfo> Coders;
41   CObjArray2<CBindPair> BindPairs;
42   CObjArray2<CNum> PackStreams;
43 
GetNumOutStreamsCFolder44   CNum GetNumOutStreams() const
45   {
46     CNum result = 0;
47     FOR_VECTOR(i, Coders)
48       result += Coders[i].NumOutStreams;
49     return result;
50   }
51 
FindBindPairForInStreamCFolder52   int FindBindPairForInStream(CNum inStreamIndex) const
53   {
54     FOR_VECTOR(i, BindPairs)
55       if (BindPairs[i].InIndex == inStreamIndex)
56         return i;
57     return -1;
58   }
FindBindPairForOutStreamCFolder59   int FindBindPairForOutStream(CNum outStreamIndex) const
60   {
61     FOR_VECTOR(i, BindPairs)
62       if (BindPairs[i].OutIndex == outStreamIndex)
63         return i;
64     return -1;
65   }
FindPackStreamArrayIndexCFolder66   int FindPackStreamArrayIndex(CNum inStreamIndex) const
67   {
68     FOR_VECTOR(i, PackStreams)
69       if (PackStreams[i] == inStreamIndex)
70         return i;
71     return -1;
72   }
73 
GetIndexOfMainOutStreamCFolder74   int GetIndexOfMainOutStream() const
75   {
76     for (int i = (int)GetNumOutStreams() - 1; i >= 0; i--)
77       if (FindBindPairForOutStream(i) < 0)
78         return i;
79     throw 1;
80   }
81 
IsEncryptedCFolder82   bool IsEncrypted() const
83   {
84     for (int i = Coders.Size() - 1; i >= 0; i--)
85       if (Coders[i].MethodID == k_AES)
86         return true;
87     return false;
88   }
89 
90   bool CheckStructure(unsigned numUnpackSizes) const;
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 
ValidAndDefinedCUInt32DefVector116   bool ValidAndDefined(unsigned i) const { return i < Defs.Size() && Defs[i]; }
117 };
118 
119 struct CUInt64DefVector
120 {
121   CBoolVector Defs;
122   CRecordVector<UInt64> Vals;
123 
ClearCUInt64DefVector124   void Clear()
125   {
126     Defs.Clear();
127     Vals.Clear();
128   }
129 
ReserveDownCUInt64DefVector130   void ReserveDown()
131   {
132     Defs.ReserveDown();
133     Vals.ReserveDown();
134   }
135 
GetItemCUInt64DefVector136   bool GetItem(unsigned index, UInt64 &value) const
137   {
138     if (index < Defs.Size() && Defs[index])
139     {
140       value = Vals[index];
141       return true;
142     }
143     value = 0;
144     return false;
145   }
146 
147   void SetItem(unsigned index, bool defined, UInt64 value);
148 
CheckSizeCUInt64DefVector149   bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; }
150 };
151 
152 struct CFileItem
153 {
154   UInt64 Size;
155   UInt32 Attrib;
156   UInt32 Crc;
157   /*
158   int Parent;
159   bool IsAltStream;
160   */
161   bool HasStream; // Test it !!! it means that there is
162                   // stream in some folder. It can be empty stream
163   bool IsDir;
164   bool CrcDefined;
165   bool AttribDefined;
166 
CFileItemCFileItem167   CFileItem():
168     /*
169     Parent(-1),
170     IsAltStream(false),
171     */
172     HasStream(true),
173     IsDir(false),
174     CrcDefined(false),
175     AttribDefined(false)
176       {}
SetAttribCFileItem177   void SetAttrib(UInt32 attrib)
178   {
179     AttribDefined = true;
180     Attrib = attrib;
181   }
182 };
183 
184 }}
185 
186 #endif
187