blob: f39c2f5d2ad639472af8998330c442a1e636a570 [file] [log] [blame]
// Archive/IsoItem.h
#ifndef __ARCHIVE_ISO_ITEM_H
#define __ARCHIVE_ISO_ITEM_H
#include "Common/Types.h"
#include "Common/MyString.h"
#include "Common/Buffer.h"
#include "Windows/Time.h"
#include "IsoHeader.h"
namespace NArchive {
namespace NIso {
struct CRecordingDateTime
{
Byte Year;
Byte Month;
Byte Day;
Byte Hour;
Byte Minute;
Byte Second;
signed char GmtOffset; // min intervals from -48 (West) to +52 (East) recorded.
bool GetFileTime(FILETIME &ft) const
{
UInt64 value;
bool res = NWindows::NTime::GetSecondsSince1601(Year + 1900, Month, Day, Hour, Minute, Second, value);
if (res)
{
value -= (UInt64)((Int64)GmtOffset * 15 * 60);
value *= 10000000;
}
ft.dwLowDateTime = (DWORD)value;
ft.dwHighDateTime = (DWORD)(value >> 32);
return res;
}
};
struct CDirRecord
{
Byte ExtendedAttributeRecordLen;
UInt32 ExtentLocation;
UInt32 DataLength;
CRecordingDateTime DateTime;
Byte FileFlags;
Byte FileUnitSize;
Byte InterleaveGapSize;
UInt16 VolSequenceNumber;
CByteBuffer FileId;
CByteBuffer SystemUse;
bool IsDir() const { return (FileFlags & NFileFlags::kDirectory) != 0; }
bool IsSystemItem() const
{
if (FileId.GetCapacity() != 1)
return false;
Byte b = *(const Byte *)FileId;
return (b == 0 || b == 1);
}
const Byte* FindSuspName(int skipSize, int &lenRes) const
{
lenRes = 0;
const Byte *p = (const Byte *)SystemUse + skipSize;
int length = (int)(SystemUse.GetCapacity() - skipSize);
while (length >= 5)
{
int len = p[2];
if (p[0] == 'N' && p[1] == 'M' && p[3] == 1)
{
lenRes = len - 5;
return p + 5;
}
p += len;
length -= len;
}
return 0;
}
int GetLengthCur(bool checkSusp, int skipSize) const
{
if (checkSusp)
{
int len;
const Byte *res = FindSuspName(skipSize, len);
if (res != 0)
return len;
}
return (int)FileId.GetCapacity();
}
const Byte* GetNameCur(bool checkSusp, int skipSize) const
{
if (checkSusp)
{
int len;
const Byte *res = FindSuspName(skipSize, len);
if (res != 0)
return res;
}
return (const Byte *)FileId;
}
bool CheckSusp(const Byte *p, int &startPos) const
{
if (p[0] == 'S' &&
p[1] == 'P' &&
p[2] == 0x7 &&
p[3] == 0x1 &&
p[4] == 0xBE &&
p[5] == 0xEF)
{
startPos = p[6];
return true;
}
return false;
}
bool CheckSusp(int &startPos) const
{
const Byte *p = (const Byte *)SystemUse;
int length = (int)SystemUse.GetCapacity();
const int kMinLen = 7;
if (length < kMinLen)
return false;
if (CheckSusp(p, startPos))
return true;
const int kOffset2 = 14;
if (length < kOffset2 + kMinLen)
return false;
return CheckSusp(p + kOffset2, startPos);
}
};
}}
#endif