diff options
Diffstat (limited to '7zip/UI/Common/ArchiveCommandLine.cpp')
-rwxr-xr-x | 7zip/UI/Common/ArchiveCommandLine.cpp | 79 |
1 files changed, 56 insertions, 23 deletions
diff --git a/7zip/UI/Common/ArchiveCommandLine.cpp b/7zip/UI/Common/ArchiveCommandLine.cpp index f41c8811..30531276 100755 --- a/7zip/UI/Common/ArchiveCommandLine.cpp +++ b/7zip/UI/Common/ArchiveCommandLine.cpp @@ -27,7 +27,7 @@ using namespace NCommandLineParser; using namespace NWindows; using namespace NFile; -static const int kNumSwitches = 25; +static const int kNumSwitches = 26; namespace NKey { enum Enum @@ -56,7 +56,8 @@ enum Enum kOverwrite, kEmail, kShowDialog, - kLargePages + kLargePages, + kCharSet }; } @@ -119,7 +120,8 @@ static const CSwitchForm kSwitchForms[kNumSwitches] = { L"AO", NSwitchType::kPostChar, false, 1, 1, kOverwritePostCharSet}, { L"SEML", NSwitchType::kUnLimitedPostString, false, 0}, { L"AD", NSwitchType::kSimple, false }, - { L"SLP", NSwitchType::kUnLimitedPostString, false, 0} + { L"SLP", NSwitchType::kUnLimitedPostString, false, 0}, + { L"SCS", NSwitchType::kUnLimitedPostString, false, 0} }; static const int kNumCommandForms = 7; @@ -234,15 +236,13 @@ static bool AddNameToCensor(NWildcard::CCensor &wildcardCensor, return true; } -static inline UINT GetCurrentCodePage() - { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } +static inline GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } static void AddToCensorFromListFile(NWildcard::CCensor &wildcardCensor, - LPCWSTR fileName, bool include, NRecursedType::EEnum type) + LPCWSTR fileName, bool include, NRecursedType::EEnum type, UINT codePage) { UStringVector names; - if (!ReadNamesFromListFile(GetSystemString(fileName, - GetCurrentCodePage()), names)) + if (!ReadNamesFromListFile(GetSystemString(fileName, GetCurrentCodePage()), names, codePage)) throw kIncorrectListFile; for (int i = 0; i < names.Size(); i++) if (!AddNameToCensor(wildcardCensor, names[i], include, type)) @@ -260,7 +260,7 @@ static void AddToCensorFromNonSwitchesStrings( int startIndex, NWildcard::CCensor &wildcardCensor, const UStringVector &nonSwitchStrings, NRecursedType::EEnum type, - bool thereAreSwitchIncludes) + bool thereAreSwitchIncludes, UINT codePage) { if(nonSwitchStrings.Size() == startIndex && (!thereAreSwitchIncludes)) AddCommandLineWildCardToCensr(wildcardCensor, kUniversalWildcard, true, type); @@ -268,7 +268,7 @@ static void AddToCensorFromNonSwitchesStrings( { const UString &s = nonSwitchStrings[i]; if (s[0] == kFileListID) - AddToCensorFromListFile(wildcardCensor, s.Mid(1), true, type); + AddToCensorFromListFile(wildcardCensor, s.Mid(1), true, type, codePage); else AddCommandLineWildCardToCensr(wildcardCensor, s, true, type); } @@ -341,7 +341,7 @@ static void ParseMapWithPaths(NWildcard::CCensor &wildcardCensor, static void AddSwitchWildCardsToCensor(NWildcard::CCensor &wildcardCensor, const UStringVector &strings, bool include, - NRecursedType::EEnum commonRecursedType) + NRecursedType::EEnum commonRecursedType, UINT codePage) { for(int i = 0; i < strings.Size(); i++) { @@ -366,7 +366,7 @@ static void AddSwitchWildCardsToCensor(NWildcard::CCensor &wildcardCensor, if (name[pos] == kImmediateNameID) AddCommandLineWildCardToCensr(wildcardCensor, tail, include, recursedType); else if (name[pos] == kFileListID) - AddToCensorFromListFile(wildcardCensor, tail, include, recursedType); + AddToCensorFromListFile(wildcardCensor, tail, include, recursedType, codePage); #ifdef _WIN32 else if (name[pos] == kMapNameID) ParseMapWithPaths(wildcardCensor, tail, include, recursedType); @@ -632,8 +632,7 @@ static void SetAddCommandOptions( } } -static void SetMethodOptions(const CParser &parser, - CUpdateOptions &options) +static void SetMethodOptions(const CParser &parser, CObjectVector<CProperty> &properties) { if (parser[NKey::kProperty].ThereIs) { @@ -650,7 +649,7 @@ static void SetMethodOptions(const CParser &parser, property.Name = postString.Left(index); property.Value = postString.Mid(index + 1); } - options.MethodMode.Properties.Add(property); + properties.Add(property); } } } @@ -723,6 +722,21 @@ void CArchiveCommandLineParser::Parse1(const UStringVector &commandStrings, #endif } +struct CCodePagePair +{ + const wchar_t *Name; + UINT CodePage; +}; + +static CCodePagePair g_CodePagePairs[] = +{ + { L"UTF-8", CP_UTF8 }, + { L"WIN", CP_ACP }, + { L"DOS", CP_OEMCP } +}; + +static const int kNumCodePages = sizeof(g_CodePagePairs) / sizeof(g_CodePagePairs[0]); + void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) { const UStringVector &nonSwitchStrings = parser.NonSwitchStrings; @@ -739,16 +753,35 @@ void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) else recursedType = NRecursedType::kNonRecursed; + UINT codePage = CP_UTF8; + if (parser[NKey::kCharSet].ThereIs) + { + UString name = parser[NKey::kCharSet].PostStrings.Front(); + name.MakeUpper(); + int i; + for (i = 0; i < kNumCodePages; i++) + { + const CCodePagePair &pair = g_CodePagePairs[i]; + if (name.Compare(pair.Name) == 0) + { + codePage = pair.CodePage; + break; + } + } + if (i >= kNumCodePages) + throw kUserErrorMessage; + } + bool thereAreSwitchIncludes = false; if (parser[NKey::kInclude].ThereIs) { thereAreSwitchIncludes = true; AddSwitchWildCardsToCensor(options.WildcardCensor, - parser[NKey::kInclude].PostStrings, true, recursedType); + parser[NKey::kInclude].PostStrings, true, recursedType, codePage); } if (parser[NKey::kExclude].ThereIs) AddSwitchWildCardsToCensor(options.WildcardCensor, - parser[NKey::kExclude].PostStrings, false, recursedType); + parser[NKey::kExclude].PostStrings, false, recursedType, codePage); int curCommandIndex = kCommandIndex + 1; bool thereIsArchiveName = !parser[NKey::kNoArName].ThereIs; @@ -761,7 +794,7 @@ void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) AddToCensorFromNonSwitchesStrings( curCommandIndex, options.WildcardCensor, - nonSwitchStrings, recursedType, thereAreSwitchIncludes); + nonSwitchStrings, recursedType, thereAreSwitchIncludes, codePage); options.YesToAll = parser[NKey::kYes].ThereIs; @@ -787,11 +820,11 @@ void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) if (parser[NKey::kArInclude].ThereIs) { AddSwitchWildCardsToCensor(archiveWildcardCensor, - parser[NKey::kArInclude].PostStrings, true, NRecursedType::kNonRecursed); + parser[NKey::kArInclude].PostStrings, true, NRecursedType::kNonRecursed, codePage); } if (parser[NKey::kArExclude].ThereIs) AddSwitchWildCardsToCensor(archiveWildcardCensor, - parser[NKey::kArExclude].PostStrings, false, NRecursedType::kNonRecursed); + parser[NKey::kArExclude].PostStrings, false, NRecursedType::kNonRecursed, codePage); if (thereIsArchiveName) AddCommandLineWildCardToCensr(archiveWildcardCensor, options.ArchiveName, true, NRecursedType::kNonRecursed); @@ -840,6 +873,7 @@ void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) if(isExtractGroupCommand) { + SetMethodOptions(parser, options.ExtractProperties); if (options.StdOutMode && options.IsStdOutTerminal) throw kTerminalOutError; if(parser[NKey::kOutputDir].ThereIs) @@ -882,10 +916,9 @@ void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) updateOptions.ArchivePath.BaseExtension = extension; updateOptions.ArchivePath.VolExtension = typeExtension; updateOptions.ArchivePath.ParseFromPath(options.ArchiveName); - SetAddCommandOptions(options.Command.CommandType, parser, - updateOptions); + SetAddCommandOptions(options.Command.CommandType, parser, updateOptions); - SetMethodOptions(parser, updateOptions); + SetMethodOptions(parser, updateOptions.MethodMode.Properties); options.EnablePercents = !parser[NKey::kDisablePercents].ThereIs; |