annotate src/win32/7zip/7z/CPP/7zip/Archive/Lzh/LzhItem.h @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
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