diff options
Diffstat (limited to 'CPP/7zip/UI/Console/Main.cpp')
-rwxr-xr-x | CPP/7zip/UI/Console/Main.cpp | 79 |
1 files changed, 56 insertions, 23 deletions
diff --git a/CPP/7zip/UI/Console/Main.cpp b/CPP/7zip/UI/Console/Main.cpp index 265d2212..87d48e95 100755 --- a/CPP/7zip/UI/Console/Main.cpp +++ b/CPP/7zip/UI/Console/Main.cpp @@ -40,8 +40,8 @@ #include "../../MyVersion.h" #if defined( _WIN32) && defined( _7ZIP_LARGE_PAGES) -extern "C" -{ +extern "C" +{ #include "../../../../C/Alloc.h" } #endif @@ -64,7 +64,7 @@ static const char *kCopyrightString = "\n7-Zip" " " MY_VERSION_COPYRIGHT_DATE "\n"; -static const char *kHelpString = +static const char *kHelpString = "\nUsage: 7z" #ifdef _NO_CRYPTO "r" @@ -96,7 +96,9 @@ static const char *kHelpString = " -i[r[-|0]]{@listfile|!wildcard}: Include filenames\n" " -m{Parameters}: set compression Method\n" " -o{Directory}: set Output directory\n" + #ifndef _NO_CRYPTO " -p{Password}: set Password\n" + #endif " -r[-|0]: Recurse subdirectories\n" " -scs{UTF-8 | WIN | DOS}: set charset for list files\n" " -sfx[{name}]: Create SFX archive\n" @@ -117,6 +119,7 @@ static const char *kHelpString = static const char *kEverythingIsOk = "Everything is Ok"; static const char *kUserErrorMessage = "Incorrect command line"; // NExitCode::kUserError +static const char *kNoFormats = "7-Zip cannot find the code that works with archives."; static const wchar_t *kDefaultSfxModule = L"7zCon.sfx"; @@ -148,7 +151,7 @@ static void ShowCopyrightAndHelp(CStdOutStream &s, bool needHelp) { s << kCopyrightString; // s << "# CPUs: " << (UInt64)NWindows::NSystem::GetNumberOfProcessors() << "\n"; - if (needHelp) + if (needHelp) s << kHelpString; } @@ -175,18 +178,20 @@ static inline char GetHex(Byte value) return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10))); } +const char *kUnsupportedArcTypeMessage = "Unsupported archive type"; + int Main2( - #ifndef _WIN32 + #ifndef _WIN32 int numArguments, const char *arguments[] #endif ) { - #ifdef _WIN32 + #ifdef _WIN32 SetFileApisToOEM(); #endif UStringVector commandStrings; - #ifdef _WIN32 + #ifdef _WIN32 NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings); #else GetArguments(numArguments, arguments, commandStrings); @@ -240,6 +245,17 @@ int Main2( throw CSystemException(result); bool isExtractGroupCommand = options.Command.IsFromExtractGroup(); + + if (codecs->Formats.Size() == 0 && + (isExtractGroupCommand || + options.Command.CommandType == NCommandType::kList || + options.Command.IsFromUpdateGroup())) + throw kNoFormats; + + CIntVector formatIndices; + if (!codecs->FindFormatForArchiveType(options.ArcType, formatIndices)) + throw kUnsupportedArcTypeMessage; + if (options.Command.CommandType == NCommandType::kInfo) { stdStream << endl << "Formats:" << endl; @@ -373,14 +389,21 @@ int Main2( CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs; ecs->OutStream = &stdStream; + + #ifndef _NO_CRYPTO ecs->PasswordIsDefined = options.PasswordEnabled; ecs->Password = options.Password; + #endif + ecs->Init(); COpenCallbackConsole openCallback; openCallback.OutStream = &stdStream; + + #ifndef _NO_CRYPTO openCallback.PasswordIsDefined = options.PasswordEnabled; openCallback.Password = options.Password; + #endif CExtractOptions eo; eo.StdOutMode = options.StdOutMode; @@ -396,9 +419,10 @@ int Main2( CDecompressStat stat; HRESULT result = DecompressArchives( codecs, - options.ArchivePathsSorted, + formatIndices, + options.ArchivePathsSorted, options.ArchivePathsFullSorted, - options.WildcardCensor.Pairs.Front().Head, + options.WildcardCensor.Pairs.Front().Head, eo, &openCallback, ecs, errorMessage, stat); if (!errorMessage.IsEmpty()) { @@ -430,7 +454,7 @@ int Main2( stdStream << "Folders: " << stat.NumFolders << endl; if (stat.NumFiles != 1 || stat.NumFolders != 0) stdStream << "Files: " << stat.NumFiles << endl; - stdStream + stdStream << "Size: " << stat.UnpackSize << endl << "Compressed: " << stat.PackSize << endl; } @@ -439,13 +463,17 @@ int Main2( UInt64 numErrors = 0; HRESULT result = ListArchives( codecs, - options.ArchivePathsSorted, + formatIndices, + options.ArchivePathsSorted, options.ArchivePathsFullSorted, - options.WildcardCensor.Pairs.Front().Head, - options.EnableHeaders, + options.WildcardCensor.Pairs.Front().Head, + options.EnableHeaders, options.TechMode, - options.PasswordEnabled, - options.Password, numErrors); + #ifndef _NO_CRYPTO + options.PasswordEnabled, + options.Password, + #endif + numErrors); if (numErrors > 0) { g_StdOut << endl << "Errors: " << numErrors; @@ -463,28 +491,33 @@ int Main2( if (uo.SfxMode && uo.SfxModule.IsEmpty()) uo.SfxModule = kDefaultSfxModule; - bool passwordIsDefined = - options.PasswordEnabled && !options.Password.IsEmpty(); - COpenCallbackConsole openCallback; openCallback.OutStream = &stdStream; + + #ifndef _NO_CRYPTO + bool passwordIsDefined = + options.PasswordEnabled && !options.Password.IsEmpty(); openCallback.PasswordIsDefined = passwordIsDefined; openCallback.Password = options.Password; + #endif CUpdateCallbackConsole callback; callback.EnablePercents = options.EnablePercents; + + #ifndef _NO_CRYPTO callback.PasswordIsDefined = passwordIsDefined; callback.AskPassword = options.PasswordEnabled && options.Password.IsEmpty(); callback.Password = options.Password; + #endif callback.StdOutMode = uo.StdOutMode; callback.Init(&stdStream); CUpdateErrorInfo errorInfo; - if (!uo.Init(codecs, options.ArchiveName, options.ArcType)) - throw "Unsupported archive type"; - HRESULT result = UpdateArchive(codecs, - options.WildcardCensor, uo, + if (!uo.Init(codecs, formatIndices, options.ArchiveName)) + throw kUnsupportedArcTypeMessage; + HRESULT result = UpdateArchive(codecs, + options.WildcardCensor, uo, errorInfo, &openCallback, &callback); int exitCode = NExitCode::kSuccess; @@ -557,7 +590,7 @@ int Main2( } return exitCode; } - else + else PrintHelpAndExit(stdStream); return 0; } |