aboutsummaryrefslogtreecommitdiff
path: root/CPP/7zip/Archive/ExtHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--CPP/7zip/Archive/ExtHandler.cpp51
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
1792static void UnixTimeToProp(UInt32 val, NCOM::CPropVariant &prop) 1794static 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
1802STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) 1800STDMETHODIMP 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
2830API_FUNC_static_IsArc IsArc_Ext(const Byte *p, size_t size) 2831API_FUNC_IsArc IsArc_Ext_PhySize(const Byte *p, size_t size, UInt64 *phySize);
2832API_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
2847API_FUNC_IsArc IsArc_Ext(const Byte *p, size_t size);
2848API_FUNC_IsArc IsArc_Ext(const Byte *p, size_t size)
2849{
2850 return IsArc_Ext_PhySize(p, size, NULL);
2839} 2851}
2840 2852
2853
2841static const Byte k_Signature[] = { 0x53, 0xEF }; 2854static const Byte k_Signature[] = { 0x53, 0xEF };
2842 2855
2843REGISTER_ARC_I( 2856REGISTER_ARC_I(