diff options
Diffstat (limited to '')
-rw-r--r-- | CPP/7zip/Archive/ExtHandler.cpp | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/CPP/7zip/Archive/ExtHandler.cpp b/CPP/7zip/Archive/ExtHandler.cpp index 6c095d9..01e12ed 100644 --- a/CPP/7zip/Archive/ExtHandler.cpp +++ b/CPP/7zip/Archive/ExtHandler.cpp | |||
@@ -343,6 +343,8 @@ struct CHeader | |||
343 | bool UseGdtChecksum() const { return (FeatureRoCompat & RO_COMPAT_GDT_CSUM) != 0; } | 343 | bool UseGdtChecksum() const { return (FeatureRoCompat & RO_COMPAT_GDT_CSUM) != 0; } |
344 | bool UseMetadataChecksum() const { return (FeatureRoCompat & RO_COMPAT_METADATA_CSUM) != 0; } | 344 | bool UseMetadataChecksum() const { return (FeatureRoCompat & RO_COMPAT_METADATA_CSUM) != 0; } |
345 | 345 | ||
346 | UInt64 GetPhySize() const { return NumBlocks << BlockBits; } | ||
347 | |||
346 | bool Parse(const Byte *p); | 348 | bool Parse(const Byte *p); |
347 | }; | 349 | }; |
348 | 350 | ||
@@ -638,7 +640,7 @@ struct CNode | |||
638 | CExtTime MTime; | 640 | CExtTime MTime; |
639 | CExtTime ATime; | 641 | CExtTime ATime; |
640 | CExtTime CTime; | 642 | CExtTime CTime; |
641 | // CExtTime InodeChangeTime; | 643 | CExtTime ChangeTime; |
642 | // CExtTime DTime; | 644 | // CExtTime DTime; |
643 | 645 | ||
644 | UInt64 NumBlocks; | 646 | UInt64 NumBlocks; |
@@ -674,14 +676,14 @@ bool CNode::Parse(const Byte *p, const CHeader &_h) | |||
674 | ATime.Extra = 0; | 676 | ATime.Extra = 0; |
675 | CTime.Extra = 0; | 677 | CTime.Extra = 0; |
676 | CTime.Val = 0; | 678 | CTime.Val = 0; |
677 | // InodeChangeTime.Extra = 0; | 679 | ChangeTime.Extra = 0; |
678 | // DTime.Extra = 0; | 680 | // DTime.Extra = 0; |
679 | 681 | ||
680 | LE_16 (0x00, Mode); | 682 | LE_16 (0x00, Mode); |
681 | LE_16 (0x02, Uid); | 683 | LE_16 (0x02, Uid); |
682 | LE_32 (0x04, FileSize); | 684 | LE_32 (0x04, FileSize); |
683 | LE_32 (0x08, ATime.Val); | 685 | LE_32 (0x08, ATime.Val); |
684 | // LE_32 (0x0C, InodeChangeTime.Val); | 686 | LE_32 (0x0C, ChangeTime.Val); |
685 | LE_32 (0x10, MTime.Val); | 687 | LE_32 (0x10, MTime.Val); |
686 | // LE_32 (0x14, DTime.Val); | 688 | // LE_32 (0x14, DTime.Val); |
687 | LE_16 (0x18, Gid); | 689 | LE_16 (0x18, Gid); |
@@ -742,7 +744,7 @@ bool CNode::Parse(const Byte *p, const CHeader &_h) | |||
742 | { | 744 | { |
743 | // UInt16 checksumUpper; | 745 | // UInt16 checksumUpper; |
744 | // LE_16 (0x82, checksumUpper); | 746 | // LE_16 (0x82, checksumUpper); |
745 | // LE_32 (0x84, InodeChangeTime.Extra); | 747 | LE_32 (0x84, ChangeTime.Extra); |
746 | LE_32 (0x88, MTime.Extra); | 748 | LE_32 (0x88, MTime.Extra); |
747 | LE_32 (0x8C, ATime.Extra); | 749 | LE_32 (0x8C, ATime.Extra); |
748 | LE_32 (0x90, CTime.Val); | 750 | LE_32 (0x90, CTime.Val); |
@@ -1148,7 +1150,7 @@ HRESULT CHandler::Open2(IInStream *inStream) | |||
1148 | } | 1150 | } |
1149 | 1151 | ||
1150 | _isArc = true; | 1152 | _isArc = true; |
1151 | _phySize = _h.NumBlocks << _h.BlockBits; | 1153 | _phySize = _h.GetPhySize(); |
1152 | 1154 | ||
1153 | if (_openCallback) | 1155 | if (_openCallback) |
1154 | { | 1156 | { |
@@ -1744,8 +1746,8 @@ static const UInt32 kProps[] = | |||
1744 | kpidLinks, | 1746 | kpidLinks, |
1745 | kpidSymLink, | 1747 | kpidSymLink, |
1746 | kpidCharacts, | 1748 | kpidCharacts, |
1747 | kpidUser, | 1749 | kpidUserId, |
1748 | kpidGroup | 1750 | kpidGroupId |
1749 | }; | 1751 | }; |
1750 | 1752 | ||
1751 | 1753 | ||
@@ -1792,11 +1794,7 @@ static void StringToProp(bool isUTF, const char *s, unsigned size, NCOM::CPropVa | |||
1792 | static void UnixTimeToProp(UInt32 val, NCOM::CPropVariant &prop) | 1794 | static void UnixTimeToProp(UInt32 val, NCOM::CPropVariant &prop) |
1793 | { | 1795 | { |
1794 | if (val != 0) | 1796 | if (val != 0) |
1795 | { | 1797 | PropVariant_SetFrom_UnixTime(prop, val); |
1796 | FILETIME ft; | ||
1797 | NTime::UnixTimeToFileTime(val, ft); | ||
1798 | prop = ft; | ||
1799 | } | ||
1800 | } | 1798 | } |
1801 | 1799 | ||
1802 | STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) | 1800 | STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) |
@@ -1988,15 +1986,19 @@ static void ExtTimeToProp(const CExtTime &t, NCOM::CPropVariant &prop) | |||
1988 | return; | 1986 | return; |
1989 | 1987 | ||
1990 | FILETIME ft; | 1988 | FILETIME ft; |
1989 | unsigned low100ns = 0; | ||
1991 | // if (t.Extra != 0) | 1990 | // if (t.Extra != 0) |
1992 | { | 1991 | { |
1993 | // 1901-2446 : | 1992 | // 1901-2446 : |
1994 | Int64 v = (Int64)(Int32)t.Val; | 1993 | Int64 v = (Int64)(Int32)t.Val; |
1995 | v += (UInt64)(t.Extra & 3) << 32; // 2 low bits are offset for main timestamp | 1994 | v += (UInt64)(t.Extra & 3) << 32; // 2 low bits are offset for main timestamp |
1996 | UInt64 ft64 = NTime::UnixTime64ToFileTime64(v); | 1995 | UInt64 ft64 = NTime::UnixTime64_To_FileTime64(v); |
1997 | const UInt32 ns = (t.Extra >> 2); | 1996 | const UInt32 ns = (t.Extra >> 2); |
1998 | if (ns < 1000000000) | 1997 | if (ns < 1000000000) |
1998 | { | ||
1999 | ft64 += ns / 100; | 1999 | ft64 += ns / 100; |
2000 | low100ns = (unsigned)(ns % 100); | ||
2001 | } | ||
2000 | ft.dwLowDateTime = (DWORD)ft64; | 2002 | ft.dwLowDateTime = (DWORD)ft64; |
2001 | ft.dwHighDateTime = (DWORD)(ft64 >> 32); | 2003 | ft.dwHighDateTime = (DWORD)(ft64 >> 32); |
2002 | } | 2004 | } |
@@ -2011,7 +2013,7 @@ static void ExtTimeToProp(const CExtTime &t, NCOM::CPropVariant &prop) | |||
2011 | // NTime::UnixTimeToFileTime(t.Val, ft); // for | 2013 | // NTime::UnixTimeToFileTime(t.Val, ft); // for |
2012 | } | 2014 | } |
2013 | */ | 2015 | */ |
2014 | prop = ft; | 2016 | prop.SetAsTimeFrom_FT_Prec_Ns100(ft, k_PropVar_TimePrec_1ns, low100ns); |
2015 | } | 2017 | } |
2016 | 2018 | ||
2017 | 2019 | ||
@@ -2103,10 +2105,9 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val | |||
2103 | case kpidCTime: ExtTimeToProp(node.CTime, prop); break; | 2105 | case kpidCTime: ExtTimeToProp(node.CTime, prop); break; |
2104 | case kpidATime: ExtTimeToProp(node.ATime, prop); break; | 2106 | case kpidATime: ExtTimeToProp(node.ATime, prop); break; |
2105 | // case kpidDTime: ExtTimeToProp(node.DTime, prop); break; | 2107 | // case kpidDTime: ExtTimeToProp(node.DTime, prop); break; |
2106 | // case kpidChangeTime: ExtTimeToProp(node.InodeChangeTime, prop); break; | 2108 | case kpidChangeTime: ExtTimeToProp(node.ChangeTime, prop); break; |
2107 | 2109 | case kpidUserId: prop = (UInt32)node.Uid; break; | |
2108 | case kpidUser: prop = (UInt32)node.Uid; break; | 2110 | case kpidGroupId: prop = (UInt32)node.Gid; break; |
2109 | case kpidGroup: prop = (UInt32)node.Gid; break; | ||
2110 | case kpidLinks: prop = node.NumLinks; break; | 2111 | case kpidLinks: prop = node.NumLinks; break; |
2111 | case kpidINode: prop = (UInt32)item.Node; break; | 2112 | case kpidINode: prop = (UInt32)item.Node; break; |
2112 | case kpidStreamId: if (!isDir) prop = (UInt32)item.Node; break; | 2113 | case kpidStreamId: if (!isDir) prop = (UInt32)item.Node; break; |
@@ -2827,17 +2828,29 @@ STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) | |||
2827 | } | 2828 | } |
2828 | 2829 | ||
2829 | 2830 | ||
2830 | API_FUNC_static_IsArc IsArc_Ext(const Byte *p, size_t size) | 2831 | API_FUNC_IsArc IsArc_Ext_PhySize(const Byte *p, size_t size, UInt64 *phySize); |
2832 | API_FUNC_IsArc IsArc_Ext_PhySize(const Byte *p, size_t size, UInt64 *phySize) | ||
2831 | { | 2833 | { |
2834 | if (phySize) | ||
2835 | *phySize = 0; | ||
2832 | if (size < kHeaderSize) | 2836 | if (size < kHeaderSize) |
2833 | return k_IsArc_Res_NEED_MORE; | 2837 | return k_IsArc_Res_NEED_MORE; |
2834 | CHeader h; | 2838 | CHeader h; |
2835 | if (!h.Parse(p + kHeaderDataOffset)) | 2839 | if (!h.Parse(p + kHeaderDataOffset)) |
2836 | return k_IsArc_Res_NO; | 2840 | return k_IsArc_Res_NO; |
2841 | if (phySize) | ||
2842 | *phySize = h.GetPhySize(); | ||
2837 | return k_IsArc_Res_YES; | 2843 | return k_IsArc_Res_YES; |
2838 | } | 2844 | } |
2845 | |||
2846 | |||
2847 | API_FUNC_IsArc IsArc_Ext(const Byte *p, size_t size); | ||
2848 | API_FUNC_IsArc IsArc_Ext(const Byte *p, size_t size) | ||
2849 | { | ||
2850 | return IsArc_Ext_PhySize(p, size, NULL); | ||
2839 | } | 2851 | } |
2840 | 2852 | ||
2853 | |||
2841 | static const Byte k_Signature[] = { 0x53, 0xEF }; | 2854 | static const Byte k_Signature[] = { 0x53, 0xEF }; |
2842 | 2855 | ||
2843 | REGISTER_ARC_I( | 2856 | REGISTER_ARC_I( |