rlm@1
|
1 // Archive/LzhItem.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __ARCHIVE_LZH_ITEM_H
|
rlm@1
|
4 #define __ARCHIVE_LZH_ITEM_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "Common/Types.h"
|
rlm@1
|
7 #include "Common/MyString.h"
|
rlm@1
|
8 #include "Common/Buffer.h"
|
rlm@1
|
9 #include "LzhHeader.h"
|
rlm@1
|
10
|
rlm@1
|
11 namespace NArchive {
|
rlm@1
|
12 namespace NLzh {
|
rlm@1
|
13
|
rlm@1
|
14 struct CExtension
|
rlm@1
|
15 {
|
rlm@1
|
16 Byte Type;
|
rlm@1
|
17 CByteBuffer Data;
|
rlm@1
|
18 AString GetString() const
|
rlm@1
|
19 {
|
rlm@1
|
20 AString s;
|
rlm@1
|
21 for (size_t i = 0; i < Data.GetCapacity(); i++)
|
rlm@1
|
22 {
|
rlm@1
|
23 char c = (char)Data[i];
|
rlm@1
|
24 if (c == 0)
|
rlm@1
|
25 break;
|
rlm@1
|
26 s += c;
|
rlm@1
|
27 }
|
rlm@1
|
28 return s;
|
rlm@1
|
29 }
|
rlm@1
|
30 };
|
rlm@1
|
31
|
rlm@1
|
32 struct CItem
|
rlm@1
|
33 {
|
rlm@1
|
34 public:
|
rlm@1
|
35 AString Name;
|
rlm@1
|
36 Byte Method[kMethodIdSize];
|
rlm@1
|
37 UInt32 PackSize;
|
rlm@1
|
38 UInt32 Size;
|
rlm@1
|
39 UInt32 ModifiedTime;
|
rlm@1
|
40 Byte Attributes;
|
rlm@1
|
41 Byte Level;
|
rlm@1
|
42 UInt16 CRC;
|
rlm@1
|
43 Byte OsId;
|
rlm@1
|
44 CObjectVector<CExtension> Extensions;
|
rlm@1
|
45
|
rlm@1
|
46 bool IsValidMethod() const { return (Method[0] == '-' && Method[1] == 'l' && Method[4] == '-'); }
|
rlm@1
|
47 bool IsLhMethod() const {return (IsValidMethod() && Method[2] == 'h'); }
|
rlm@1
|
48 bool IsDir() const {return (IsLhMethod() && Method[3] == 'd'); }
|
rlm@1
|
49
|
rlm@1
|
50 bool IsCopyMethod() const
|
rlm@1
|
51 {
|
rlm@1
|
52 return (IsLhMethod() && Method[3] == '0') ||
|
rlm@1
|
53 (IsValidMethod() && Method[2] == 'z' && Method[3] == '4');
|
rlm@1
|
54 }
|
rlm@1
|
55
|
rlm@1
|
56 bool IsLh1GroupMethod() const
|
rlm@1
|
57 {
|
rlm@1
|
58 if (!IsLhMethod())
|
rlm@1
|
59 return false;
|
rlm@1
|
60 switch(Method[3])
|
rlm@1
|
61 {
|
rlm@1
|
62 case '1':
|
rlm@1
|
63 return true;
|
rlm@1
|
64 }
|
rlm@1
|
65 return false;
|
rlm@1
|
66 }
|
rlm@1
|
67
|
rlm@1
|
68 bool IsLh4GroupMethod() const
|
rlm@1
|
69 {
|
rlm@1
|
70 if (!IsLhMethod())
|
rlm@1
|
71 return false;
|
rlm@1
|
72 switch(Method[3])
|
rlm@1
|
73 {
|
rlm@1
|
74 case '4':
|
rlm@1
|
75 case '5':
|
rlm@1
|
76 case '6':
|
rlm@1
|
77 case '7':
|
rlm@1
|
78 return true;
|
rlm@1
|
79 }
|
rlm@1
|
80 return false;
|
rlm@1
|
81 }
|
rlm@1
|
82
|
rlm@1
|
83 int GetNumDictBits() const
|
rlm@1
|
84 {
|
rlm@1
|
85 if (!IsLhMethod())
|
rlm@1
|
86 return 0;
|
rlm@1
|
87 switch(Method[3])
|
rlm@1
|
88 {
|
rlm@1
|
89 case '1':
|
rlm@1
|
90 return 12;
|
rlm@1
|
91 case '2':
|
rlm@1
|
92 return 13;
|
rlm@1
|
93 case '3':
|
rlm@1
|
94 return 13;
|
rlm@1
|
95 case '4':
|
rlm@1
|
96 return 12;
|
rlm@1
|
97 case '5':
|
rlm@1
|
98 return 13;
|
rlm@1
|
99 case '6':
|
rlm@1
|
100 return 15;
|
rlm@1
|
101 case '7':
|
rlm@1
|
102 return 16;
|
rlm@1
|
103 }
|
rlm@1
|
104 return 0;
|
rlm@1
|
105 }
|
rlm@1
|
106
|
rlm@1
|
107 int FindExt(Byte type) const
|
rlm@1
|
108 {
|
rlm@1
|
109 for (int i = 0; i < Extensions.Size(); i++)
|
rlm@1
|
110 if (Extensions[i].Type == type)
|
rlm@1
|
111 return i;
|
rlm@1
|
112 return -1;
|
rlm@1
|
113 }
|
rlm@1
|
114 bool GetUnixTime(UInt32 &value) const
|
rlm@1
|
115 {
|
rlm@1
|
116 int index = FindExt(kExtIdUnixTime);
|
rlm@1
|
117 if (index < 0)
|
rlm@1
|
118 {
|
rlm@1
|
119 if (Level == 2)
|
rlm@1
|
120 {
|
rlm@1
|
121 value = ModifiedTime;
|
rlm@1
|
122 return true;
|
rlm@1
|
123 }
|
rlm@1
|
124 return false;
|
rlm@1
|
125 }
|
rlm@1
|
126 const Byte *data = (const Byte *)(Extensions[index].Data);
|
rlm@1
|
127 value = data[0] |
|
rlm@1
|
128 ((UInt32)data[1] << 8) |
|
rlm@1
|
129 ((UInt32)data[2] << 16) |
|
rlm@1
|
130 ((UInt32)data[3] << 24);
|
rlm@1
|
131 return true;
|
rlm@1
|
132 }
|
rlm@1
|
133
|
rlm@1
|
134 AString GetDirName() const
|
rlm@1
|
135 {
|
rlm@1
|
136 int index = FindExt(kExtIdDirName);
|
rlm@1
|
137 if (index < 0)
|
rlm@1
|
138 return AString();
|
rlm@1
|
139 return Extensions[index].GetString();
|
rlm@1
|
140 }
|
rlm@1
|
141
|
rlm@1
|
142 AString GetFileName() const
|
rlm@1
|
143 {
|
rlm@1
|
144 int index = FindExt(kExtIdFileName);
|
rlm@1
|
145 if (index < 0)
|
rlm@1
|
146 return Name;
|
rlm@1
|
147 return Extensions[index].GetString();
|
rlm@1
|
148 }
|
rlm@1
|
149
|
rlm@1
|
150 AString GetName() const
|
rlm@1
|
151 {
|
rlm@1
|
152 AString dirName = GetDirName();
|
rlm@1
|
153 dirName.Replace((char)(unsigned char)0xFF, '\\');
|
rlm@1
|
154 if (!dirName.IsEmpty())
|
rlm@1
|
155 {
|
rlm@1
|
156 char c = dirName[dirName.Length() - 1];
|
rlm@1
|
157 if (c != '\\')
|
rlm@1
|
158 dirName += '\\';
|
rlm@1
|
159 }
|
rlm@1
|
160 return dirName + GetFileName();
|
rlm@1
|
161 }
|
rlm@1
|
162 };
|
rlm@1
|
163
|
rlm@1
|
164 class CItemEx: public CItem
|
rlm@1
|
165 {
|
rlm@1
|
166 public:
|
rlm@1
|
167 UInt64 DataPosition;
|
rlm@1
|
168 };
|
rlm@1
|
169
|
rlm@1
|
170 }}
|
rlm@1
|
171
|
rlm@1
|
172 #endif
|