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