Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Pavlov <ipavlov@users.sourceforge.net>2010-03-15 03:00:00 +0300
committerKornel LesiƄski <kornel@geekhood.net>2016-05-28 02:16:02 +0300
commit993daef9cbed7febf494217f07e40e0a26b3bc06 (patch)
tree41db24cb11222422aa3c4d61b80646344e3efefc /CPP/7zip/Archive/Com/ComIn.cpp
parentdb5eb6d638f5a5ec10517ed4a994b849a6cc7d29 (diff)
9.119.11
Diffstat (limited to 'CPP/7zip/Archive/Com/ComIn.cpp')
-rwxr-xr-xCPP/7zip/Archive/Com/ComIn.cpp34
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;
}
}}