diff options
author | Igor Pavlov <ipavlov@users.sourceforge.net> | 2010-03-15 03:00:00 +0300 |
---|---|---|
committer | Kornel LesiĆski <kornel@geekhood.net> | 2016-05-28 02:16:02 +0300 |
commit | 993daef9cbed7febf494217f07e40e0a26b3bc06 (patch) | |
tree | 41db24cb11222422aa3c4d61b80646344e3efefc /CPP/7zip/Archive/Com/ComIn.cpp | |
parent | db5eb6d638f5a5ec10517ed4a994b849a6cc7d29 (diff) |
9.119.11
Diffstat (limited to 'CPP/7zip/Archive/Com/ComIn.cpp')
-rwxr-xr-x | CPP/7zip/Archive/Com/ComIn.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/CPP/7zip/Archive/Com/ComIn.cpp b/CPP/7zip/Archive/Com/ComIn.cpp index 8f622122..2203ca53 100755 --- a/CPP/7zip/Archive/Com/ComIn.cpp +++ b/CPP/7zip/Archive/Com/ComIn.cpp @@ -174,8 +174,9 @@ bool CompoundMsiNameToFileName(const UString &name, UString &resultName) return true; } -static UString ConvertName(const Byte *p) +static UString ConvertName(const Byte *p, bool &isMsi) { + isMsi = false; UString s; for (int i = 0; i < kNameSizeMax; i += 2) { @@ -186,10 +187,19 @@ static UString ConvertName(const Byte *p) } UString msiName; if (CompoundMsiNameToFileName(s, msiName)) + { + isMsi = true; return msiName; + } return CompoundNameToFileName(s); } +static UString ConvertName(const Byte *p) +{ + bool isMsi; + return ConvertName(p, isMsi); +} + UString CDatabase::GetItemPath(UInt32 index) const { UString s; @@ -207,6 +217,7 @@ UString CDatabase::GetItemPath(UInt32 index) const HRESULT CDatabase::Open(IInStream *inStream) { + MainSubfile = -1; static const UInt32 kHeaderSize = 512; Byte p[kHeaderSize]; RINOK(ReadStream_FALSE(inStream, p, kHeaderSize)); @@ -353,7 +364,26 @@ HRESULT CDatabase::Open(IInStream *inStream) } } - return AddNode(-1, root.SonDid); + RINOK(AddNode(-1, root.SonDid)); + + unsigned numCabs = 0; + for (int i = 0; i < Refs.Size(); i++) + { + const CItem &item = Items[Refs[i].Did]; + if (item.IsDir() || numCabs > 1) + continue; + bool isMsiName; + UString msiName = ConvertName(item.Name, isMsiName); + if (isMsiName && msiName.Right(4).CompareNoCase(L".cab") == 0) + { + numCabs++; + MainSubfile = i; + } + } + if (numCabs > 1) + MainSubfile = -1; + + return S_OK; } }} |