xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Iso/IsoItem.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Archive/IsoItem.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_ISO_ITEM_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_ISO_ITEM_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/CpuArch.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyString.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/TimeUtils.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "IsoHeader.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
16*f6dc9357SAndroid Build Coastguard Worker namespace NIso {
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker struct CRecordingDateTime
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker   Byte Year;
21*f6dc9357SAndroid Build Coastguard Worker   Byte Month;
22*f6dc9357SAndroid Build Coastguard Worker   Byte Day;
23*f6dc9357SAndroid Build Coastguard Worker   Byte Hour;
24*f6dc9357SAndroid Build Coastguard Worker   Byte Minute;
25*f6dc9357SAndroid Build Coastguard Worker   Byte Second;
26*f6dc9357SAndroid Build Coastguard Worker   signed char GmtOffset; // min intervals from -48 (West) to +52 (East) recorded.
27*f6dc9357SAndroid Build Coastguard Worker 
GetFileTimeCRecordingDateTime28*f6dc9357SAndroid Build Coastguard Worker   bool GetFileTime(NWindows::NCOM::CPropVariant &prop) const
29*f6dc9357SAndroid Build Coastguard Worker   {
30*f6dc9357SAndroid Build Coastguard Worker     UInt64 v;
31*f6dc9357SAndroid Build Coastguard Worker     const bool res = NWindows::NTime::GetSecondsSince1601(Year + 1900, Month, Day, Hour, Minute, Second, v);
32*f6dc9357SAndroid Build Coastguard Worker     if (res)
33*f6dc9357SAndroid Build Coastguard Worker     {
34*f6dc9357SAndroid Build Coastguard Worker       v = (UInt64)((Int64)v - (Int64)((Int32)GmtOffset * 15 * 60));
35*f6dc9357SAndroid Build Coastguard Worker       v *= 10000000;
36*f6dc9357SAndroid Build Coastguard Worker       prop.SetAsTimeFrom_Ft64_Prec(v, k_PropVar_TimePrec_Base);
37*f6dc9357SAndroid Build Coastguard Worker     }
38*f6dc9357SAndroid Build Coastguard Worker     return res;
39*f6dc9357SAndroid Build Coastguard Worker   }
40*f6dc9357SAndroid Build Coastguard Worker };
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker enum EPx
43*f6dc9357SAndroid Build Coastguard Worker {
44*f6dc9357SAndroid Build Coastguard Worker   k_Px_Mode,
45*f6dc9357SAndroid Build Coastguard Worker   k_Px_Links,
46*f6dc9357SAndroid Build Coastguard Worker   k_Px_User,
47*f6dc9357SAndroid Build Coastguard Worker   k_Px_Group,
48*f6dc9357SAndroid Build Coastguard Worker   k_Px_SerialNumber
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker   // k_Px_Num
51*f6dc9357SAndroid Build Coastguard Worker };
52*f6dc9357SAndroid Build Coastguard Worker 
53*f6dc9357SAndroid Build Coastguard Worker /*
54*f6dc9357SAndroid Build Coastguard Worker enum ETf
55*f6dc9357SAndroid Build Coastguard Worker {
56*f6dc9357SAndroid Build Coastguard Worker   k_Tf_CTime,
57*f6dc9357SAndroid Build Coastguard Worker   k_Tf_MTime,
58*f6dc9357SAndroid Build Coastguard Worker   k_Tf_ATime,
59*f6dc9357SAndroid Build Coastguard Worker   k_Tf_Attrib,
60*f6dc9357SAndroid Build Coastguard Worker   k_Tf_Backup,
61*f6dc9357SAndroid Build Coastguard Worker   k_Tf_Expiration,
62*f6dc9357SAndroid Build Coastguard Worker   k_Tf_Effective
63*f6dc9357SAndroid Build Coastguard Worker 
64*f6dc9357SAndroid Build Coastguard Worker   // k_Tf_Num
65*f6dc9357SAndroid Build Coastguard Worker };
66*f6dc9357SAndroid Build Coastguard Worker */
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker struct CDirRecord
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker   UInt32 ExtentLocation;
71*f6dc9357SAndroid Build Coastguard Worker   UInt32 Size;
72*f6dc9357SAndroid Build Coastguard Worker   CRecordingDateTime DateTime;
73*f6dc9357SAndroid Build Coastguard Worker   Byte FileFlags;
74*f6dc9357SAndroid Build Coastguard Worker   Byte FileUnitSize;
75*f6dc9357SAndroid Build Coastguard Worker   Byte InterleaveGapSize;
76*f6dc9357SAndroid Build Coastguard Worker   Byte ExtendedAttributeRecordLen;
77*f6dc9357SAndroid Build Coastguard Worker   UInt16 VolSequenceNumber;
78*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer FileId;
79*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer SystemUse;
80*f6dc9357SAndroid Build Coastguard Worker 
AreMultiPartEqualWithCDirRecord81*f6dc9357SAndroid Build Coastguard Worker   bool AreMultiPartEqualWith(const CDirRecord &a) const
82*f6dc9357SAndroid Build Coastguard Worker   {
83*f6dc9357SAndroid Build Coastguard Worker     return FileId == a.FileId
84*f6dc9357SAndroid Build Coastguard Worker         && (FileFlags & (~NFileFlags::kNonFinalExtent)) ==
85*f6dc9357SAndroid Build Coastguard Worker         (a.FileFlags & (~NFileFlags::kNonFinalExtent));
86*f6dc9357SAndroid Build Coastguard Worker   }
87*f6dc9357SAndroid Build Coastguard Worker 
IsDirCDirRecord88*f6dc9357SAndroid Build Coastguard Worker   bool IsDir() const { return (FileFlags & NFileFlags::kDirectory) != 0; }
IsNonFinalExtentCDirRecord89*f6dc9357SAndroid Build Coastguard Worker   bool IsNonFinalExtent() const { return (FileFlags & NFileFlags::kNonFinalExtent) != 0; }
90*f6dc9357SAndroid Build Coastguard Worker 
IsSystemItemCDirRecord91*f6dc9357SAndroid Build Coastguard Worker   bool IsSystemItem() const
92*f6dc9357SAndroid Build Coastguard Worker   {
93*f6dc9357SAndroid Build Coastguard Worker     if (FileId.Size() != 1)
94*f6dc9357SAndroid Build Coastguard Worker       return false;
95*f6dc9357SAndroid Build Coastguard Worker     Byte b = *(const Byte *)FileId;
96*f6dc9357SAndroid Build Coastguard Worker     return (b == 0 || b == 1);
97*f6dc9357SAndroid Build Coastguard Worker   }
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker 
FindSuspRecordCDirRecord100*f6dc9357SAndroid Build Coastguard Worker   const Byte* FindSuspRecord(unsigned skipSize, Byte id0, Byte id1, unsigned &lenRes) const
101*f6dc9357SAndroid Build Coastguard Worker   {
102*f6dc9357SAndroid Build Coastguard Worker     lenRes = 0;
103*f6dc9357SAndroid Build Coastguard Worker     if (SystemUse.Size() < skipSize)
104*f6dc9357SAndroid Build Coastguard Worker       return NULL;
105*f6dc9357SAndroid Build Coastguard Worker     const Byte *p = (const Byte *)SystemUse + skipSize;
106*f6dc9357SAndroid Build Coastguard Worker     unsigned rem = (unsigned)(SystemUse.Size() - skipSize);
107*f6dc9357SAndroid Build Coastguard Worker     while (rem >= 5)
108*f6dc9357SAndroid Build Coastguard Worker     {
109*f6dc9357SAndroid Build Coastguard Worker       unsigned len = p[2];
110*f6dc9357SAndroid Build Coastguard Worker       if (len < 3 || len > rem)
111*f6dc9357SAndroid Build Coastguard Worker         return NULL;
112*f6dc9357SAndroid Build Coastguard Worker       if (p[0] == id0 && p[1] == id1 && p[3] == 1)
113*f6dc9357SAndroid Build Coastguard Worker       {
114*f6dc9357SAndroid Build Coastguard Worker         if (len < 4)
115*f6dc9357SAndroid Build Coastguard Worker           return NULL; // Check it
116*f6dc9357SAndroid Build Coastguard Worker         lenRes = len - 4;
117*f6dc9357SAndroid Build Coastguard Worker         return p + 4;
118*f6dc9357SAndroid Build Coastguard Worker       }
119*f6dc9357SAndroid Build Coastguard Worker       p += len;
120*f6dc9357SAndroid Build Coastguard Worker       rem -= len;
121*f6dc9357SAndroid Build Coastguard Worker     }
122*f6dc9357SAndroid Build Coastguard Worker     return NULL;
123*f6dc9357SAndroid Build Coastguard Worker   }
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker 
GetNameCurCDirRecord126*f6dc9357SAndroid Build Coastguard Worker   const Byte* GetNameCur(bool checkSusp, unsigned skipSize, unsigned &nameLenRes) const
127*f6dc9357SAndroid Build Coastguard Worker   {
128*f6dc9357SAndroid Build Coastguard Worker     const Byte *res = NULL;
129*f6dc9357SAndroid Build Coastguard Worker     unsigned len = 0;
130*f6dc9357SAndroid Build Coastguard Worker     if (checkSusp)
131*f6dc9357SAndroid Build Coastguard Worker       res = FindSuspRecord(skipSize, 'N', 'M', len);
132*f6dc9357SAndroid Build Coastguard Worker     if (!res || len < 1)
133*f6dc9357SAndroid Build Coastguard Worker     {
134*f6dc9357SAndroid Build Coastguard Worker       res = (const Byte *)FileId;
135*f6dc9357SAndroid Build Coastguard Worker       len = (unsigned)FileId.Size();
136*f6dc9357SAndroid Build Coastguard Worker     }
137*f6dc9357SAndroid Build Coastguard Worker     else
138*f6dc9357SAndroid Build Coastguard Worker     {
139*f6dc9357SAndroid Build Coastguard Worker       res++;
140*f6dc9357SAndroid Build Coastguard Worker       len--;
141*f6dc9357SAndroid Build Coastguard Worker     }
142*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
143*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < len; i++)
144*f6dc9357SAndroid Build Coastguard Worker       if (res[i] == 0)
145*f6dc9357SAndroid Build Coastguard Worker         break;
146*f6dc9357SAndroid Build Coastguard Worker     nameLenRes = i;
147*f6dc9357SAndroid Build Coastguard Worker     return res;
148*f6dc9357SAndroid Build Coastguard Worker   }
149*f6dc9357SAndroid Build Coastguard Worker 
150*f6dc9357SAndroid Build Coastguard Worker 
GetSymLinkCDirRecord151*f6dc9357SAndroid Build Coastguard Worker   bool GetSymLink(unsigned skipSize, AString &link) const
152*f6dc9357SAndroid Build Coastguard Worker   {
153*f6dc9357SAndroid Build Coastguard Worker     link.Empty();
154*f6dc9357SAndroid Build Coastguard Worker     const Byte *p = NULL;
155*f6dc9357SAndroid Build Coastguard Worker     unsigned len = 0;
156*f6dc9357SAndroid Build Coastguard Worker     p = FindSuspRecord(skipSize, 'S', 'L', len);
157*f6dc9357SAndroid Build Coastguard Worker     if (!p || len < 1)
158*f6dc9357SAndroid Build Coastguard Worker       return false;
159*f6dc9357SAndroid Build Coastguard Worker 
160*f6dc9357SAndroid Build Coastguard Worker     if (*p != 0)
161*f6dc9357SAndroid Build Coastguard Worker       return false;
162*f6dc9357SAndroid Build Coastguard Worker 
163*f6dc9357SAndroid Build Coastguard Worker     p++;
164*f6dc9357SAndroid Build Coastguard Worker     len--;
165*f6dc9357SAndroid Build Coastguard Worker 
166*f6dc9357SAndroid Build Coastguard Worker     while (len != 0)
167*f6dc9357SAndroid Build Coastguard Worker     {
168*f6dc9357SAndroid Build Coastguard Worker       if (len < 2)
169*f6dc9357SAndroid Build Coastguard Worker         return false;
170*f6dc9357SAndroid Build Coastguard Worker       unsigned flags = p[0];
171*f6dc9357SAndroid Build Coastguard Worker       unsigned cl = p[1];
172*f6dc9357SAndroid Build Coastguard Worker       p += 2;
173*f6dc9357SAndroid Build Coastguard Worker       len -= 2;
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker       if (cl > len)
176*f6dc9357SAndroid Build Coastguard Worker         return false;
177*f6dc9357SAndroid Build Coastguard Worker 
178*f6dc9357SAndroid Build Coastguard Worker       bool needSlash = false;
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker            if (flags & (1 << 1)) link += "./";
181*f6dc9357SAndroid Build Coastguard Worker       else if (flags & (1 << 2)) link += "../";
182*f6dc9357SAndroid Build Coastguard Worker       else if (flags & (1 << 3)) link.Add_Slash();
183*f6dc9357SAndroid Build Coastguard Worker       else
184*f6dc9357SAndroid Build Coastguard Worker         needSlash = true;
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker       for (unsigned i = 0; i < cl; i++)
187*f6dc9357SAndroid Build Coastguard Worker       {
188*f6dc9357SAndroid Build Coastguard Worker         const Byte c = p[i];
189*f6dc9357SAndroid Build Coastguard Worker         if (c == 0)
190*f6dc9357SAndroid Build Coastguard Worker         {
191*f6dc9357SAndroid Build Coastguard Worker           break;
192*f6dc9357SAndroid Build Coastguard Worker           // return false;
193*f6dc9357SAndroid Build Coastguard Worker         }
194*f6dc9357SAndroid Build Coastguard Worker         link += (char)c;
195*f6dc9357SAndroid Build Coastguard Worker       }
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker       p += cl;
198*f6dc9357SAndroid Build Coastguard Worker       len -= cl;
199*f6dc9357SAndroid Build Coastguard Worker 
200*f6dc9357SAndroid Build Coastguard Worker       if (len == 0)
201*f6dc9357SAndroid Build Coastguard Worker         break;
202*f6dc9357SAndroid Build Coastguard Worker 
203*f6dc9357SAndroid Build Coastguard Worker       if (needSlash)
204*f6dc9357SAndroid Build Coastguard Worker         link.Add_Slash();
205*f6dc9357SAndroid Build Coastguard Worker     }
206*f6dc9357SAndroid Build Coastguard Worker 
207*f6dc9357SAndroid Build Coastguard Worker     return true;
208*f6dc9357SAndroid Build Coastguard Worker   }
209*f6dc9357SAndroid Build Coastguard Worker 
GetLe32Be32CDirRecord210*f6dc9357SAndroid Build Coastguard Worker   static bool GetLe32Be32(const Byte *p, UInt32 &dest)
211*f6dc9357SAndroid Build Coastguard Worker   {
212*f6dc9357SAndroid Build Coastguard Worker     UInt32 v1 = GetUi32(p);
213*f6dc9357SAndroid Build Coastguard Worker     UInt32 v2 = GetBe32(p + 4);
214*f6dc9357SAndroid Build Coastguard Worker     if (v1 == v2)
215*f6dc9357SAndroid Build Coastguard Worker     {
216*f6dc9357SAndroid Build Coastguard Worker       dest = v1;
217*f6dc9357SAndroid Build Coastguard Worker       return true;
218*f6dc9357SAndroid Build Coastguard Worker     }
219*f6dc9357SAndroid Build Coastguard Worker     return false;
220*f6dc9357SAndroid Build Coastguard Worker   }
221*f6dc9357SAndroid Build Coastguard Worker 
222*f6dc9357SAndroid Build Coastguard Worker 
GetPxCDirRecord223*f6dc9357SAndroid Build Coastguard Worker   bool GetPx(unsigned skipSize, unsigned pxType, UInt32 &val) const
224*f6dc9357SAndroid Build Coastguard Worker   {
225*f6dc9357SAndroid Build Coastguard Worker     val = 0;
226*f6dc9357SAndroid Build Coastguard Worker     const Byte *p = NULL;
227*f6dc9357SAndroid Build Coastguard Worker     unsigned len = 0;
228*f6dc9357SAndroid Build Coastguard Worker     p = FindSuspRecord(skipSize, 'P', 'X', len);
229*f6dc9357SAndroid Build Coastguard Worker     if (!p)
230*f6dc9357SAndroid Build Coastguard Worker       return false;
231*f6dc9357SAndroid Build Coastguard Worker     // px.Clear();
232*f6dc9357SAndroid Build Coastguard Worker     if (len < (pxType + 1) * 8)
233*f6dc9357SAndroid Build Coastguard Worker       return false;
234*f6dc9357SAndroid Build Coastguard Worker 
235*f6dc9357SAndroid Build Coastguard Worker     return GetLe32Be32(p + pxType * 8, val);
236*f6dc9357SAndroid Build Coastguard Worker   }
237*f6dc9357SAndroid Build Coastguard Worker 
238*f6dc9357SAndroid Build Coastguard Worker   /*
239*f6dc9357SAndroid Build Coastguard Worker   bool GetTf(int skipSize, unsigned pxType, CRecordingDateTime &t) const
240*f6dc9357SAndroid Build Coastguard Worker   {
241*f6dc9357SAndroid Build Coastguard Worker     const Byte *p = NULL;
242*f6dc9357SAndroid Build Coastguard Worker     unsigned len = 0;
243*f6dc9357SAndroid Build Coastguard Worker     p = FindSuspRecord(skipSize, 'T', 'F', len);
244*f6dc9357SAndroid Build Coastguard Worker     if (!p)
245*f6dc9357SAndroid Build Coastguard Worker       return false;
246*f6dc9357SAndroid Build Coastguard Worker     if (len < 1)
247*f6dc9357SAndroid Build Coastguard Worker       return false;
248*f6dc9357SAndroid Build Coastguard Worker     Byte flags = *p++;
249*f6dc9357SAndroid Build Coastguard Worker     len--;
250*f6dc9357SAndroid Build Coastguard Worker 
251*f6dc9357SAndroid Build Coastguard Worker     unsigned step = 7;
252*f6dc9357SAndroid Build Coastguard Worker     if (flags & 0x80)
253*f6dc9357SAndroid Build Coastguard Worker     {
254*f6dc9357SAndroid Build Coastguard Worker       step = 17;
255*f6dc9357SAndroid Build Coastguard Worker       return false;
256*f6dc9357SAndroid Build Coastguard Worker     }
257*f6dc9357SAndroid Build Coastguard Worker 
258*f6dc9357SAndroid Build Coastguard Worker     if ((flags & (1 << pxType)) == 0)
259*f6dc9357SAndroid Build Coastguard Worker       return false;
260*f6dc9357SAndroid Build Coastguard Worker 
261*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < pxType; i++)
262*f6dc9357SAndroid Build Coastguard Worker     {
263*f6dc9357SAndroid Build Coastguard Worker       if (len < step)
264*f6dc9357SAndroid Build Coastguard Worker         return false;
265*f6dc9357SAndroid Build Coastguard Worker       if (flags & (1 << i))
266*f6dc9357SAndroid Build Coastguard Worker       {
267*f6dc9357SAndroid Build Coastguard Worker         p += step;
268*f6dc9357SAndroid Build Coastguard Worker         len -= step;
269*f6dc9357SAndroid Build Coastguard Worker       }
270*f6dc9357SAndroid Build Coastguard Worker     }
271*f6dc9357SAndroid Build Coastguard Worker 
272*f6dc9357SAndroid Build Coastguard Worker     if (len < step)
273*f6dc9357SAndroid Build Coastguard Worker       return false;
274*f6dc9357SAndroid Build Coastguard Worker 
275*f6dc9357SAndroid Build Coastguard Worker     t.Year = p[0];
276*f6dc9357SAndroid Build Coastguard Worker     t.Month = p[1];
277*f6dc9357SAndroid Build Coastguard Worker     t.Day = p[2];
278*f6dc9357SAndroid Build Coastguard Worker     t.Hour = p[3];
279*f6dc9357SAndroid Build Coastguard Worker     t.Minute = p[4];
280*f6dc9357SAndroid Build Coastguard Worker     t.Second = p[5];
281*f6dc9357SAndroid Build Coastguard Worker     t.GmtOffset = (signed char)p[6];
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker     return true;
284*f6dc9357SAndroid Build Coastguard Worker   }
285*f6dc9357SAndroid Build Coastguard Worker   */
286*f6dc9357SAndroid Build Coastguard Worker 
CheckSuspCDirRecord287*f6dc9357SAndroid Build Coastguard Worker   bool CheckSusp(const Byte *p, unsigned &startPos) const
288*f6dc9357SAndroid Build Coastguard Worker   {
289*f6dc9357SAndroid Build Coastguard Worker     if (p[0] == 'S' &&
290*f6dc9357SAndroid Build Coastguard Worker         p[1] == 'P' &&
291*f6dc9357SAndroid Build Coastguard Worker         p[2] == 0x7 &&
292*f6dc9357SAndroid Build Coastguard Worker         p[3] == 0x1 &&
293*f6dc9357SAndroid Build Coastguard Worker         p[4] == 0xBE &&
294*f6dc9357SAndroid Build Coastguard Worker         p[5] == 0xEF)
295*f6dc9357SAndroid Build Coastguard Worker     {
296*f6dc9357SAndroid Build Coastguard Worker       startPos = p[6];
297*f6dc9357SAndroid Build Coastguard Worker       return true;
298*f6dc9357SAndroid Build Coastguard Worker     }
299*f6dc9357SAndroid Build Coastguard Worker     return false;
300*f6dc9357SAndroid Build Coastguard Worker   }
301*f6dc9357SAndroid Build Coastguard Worker 
CheckSuspCDirRecord302*f6dc9357SAndroid Build Coastguard Worker   bool CheckSusp(unsigned &startPos) const
303*f6dc9357SAndroid Build Coastguard Worker   {
304*f6dc9357SAndroid Build Coastguard Worker     const Byte *p = (const Byte *)SystemUse;
305*f6dc9357SAndroid Build Coastguard Worker     const size_t len = SystemUse.Size();
306*f6dc9357SAndroid Build Coastguard Worker     const unsigned kMinLen = 7;
307*f6dc9357SAndroid Build Coastguard Worker     if (len < kMinLen)
308*f6dc9357SAndroid Build Coastguard Worker       return false;
309*f6dc9357SAndroid Build Coastguard Worker     if (CheckSusp(p, startPos))
310*f6dc9357SAndroid Build Coastguard Worker       return true;
311*f6dc9357SAndroid Build Coastguard Worker     const unsigned kOffset2 = 14;
312*f6dc9357SAndroid Build Coastguard Worker     if (len < kOffset2 + kMinLen)
313*f6dc9357SAndroid Build Coastguard Worker       return false;
314*f6dc9357SAndroid Build Coastguard Worker     return CheckSusp(p + kOffset2, startPos);
315*f6dc9357SAndroid Build Coastguard Worker   }
316*f6dc9357SAndroid Build Coastguard Worker };
317*f6dc9357SAndroid Build Coastguard Worker 
318*f6dc9357SAndroid Build Coastguard Worker }}
319*f6dc9357SAndroid Build Coastguard Worker 
320*f6dc9357SAndroid Build Coastguard Worker #endif
321