diff options
author | Igor Pavlov <ipavlov@users.sourceforge.net> | 2009-02-03 03:00:00 +0300 |
---|---|---|
committer | Kornel LesiĆski <kornel@geekhood.net> | 2016-05-28 02:15:59 +0300 |
commit | 8874e4fbc9faabdcff719b9b2ac8ebad4f282bbe (patch) | |
tree | 4180f817b3d10dc34cde8b7ccc8c589eae4b26d3 /CPP/7zip | |
parent | 1dc92281fa580c11a79fef9fc862a6ce354a76ac (diff) |
4.654.65
Diffstat (limited to 'CPP/7zip')
-rwxr-xr-x | CPP/7zip/Archive/Common/HandlerOut.cpp | 2 | ||||
-rwxr-xr-x | CPP/7zip/Archive/DebHandler.cpp | 2 | ||||
-rwxr-xr-x | CPP/7zip/Archive/MachoHandler.cpp | 8 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Nsis/NsisHandler.cpp | 34 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Nsis/NsisIn.h | 48 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Zip/ZipHandler.h | 2 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Zip/ZipHandlerOut.cpp | 19 | ||||
-rwxr-xr-x | CPP/7zip/Archive/Zip/ZipItem.h | 1 | ||||
-rwxr-xr-x | CPP/7zip/MyVersion.h | 8 | ||||
-rwxr-xr-x | CPP/7zip/UI/Client7z/Client7z.cpp | 19 | ||||
-rwxr-xr-x | CPP/7zip/UI/Common/Update.cpp | 5 | ||||
-rwxr-xr-x | CPP/7zip/UI/Console/ExtractCallbackConsole.cpp | 2 | ||||
-rwxr-xr-x | CPP/7zip/UI/Console/UserInputUtils.cpp | 10 | ||||
-rwxr-xr-x | CPP/7zip/UI/Console/UserInputUtils.h | 2 | ||||
-rwxr-xr-x | CPP/7zip/UI/Explorer/RegistryContextMenu.cpp | 31 | ||||
-rwxr-xr-x | CPP/7zip/UI/FileManager/App.cpp | 2 | ||||
-rwxr-xr-x | CPP/7zip/UI/FileManager/FM.dsp | 28 | ||||
-rwxr-xr-x | CPP/7zip/UI/FileManager/PanelCrc.cpp | 62 | ||||
-rwxr-xr-x | CPP/7zip/UI/FileManager/RegistryAssociations.cpp | 3 | ||||
-rwxr-xr-x | CPP/7zip/UI/FileManager/makefile | 1 | ||||
-rwxr-xr-x | CPP/7zip/UI/GUI/CompressDialog.cpp | 4 |
21 files changed, 179 insertions, 114 deletions
diff --git a/CPP/7zip/Archive/Common/HandlerOut.cpp b/CPP/7zip/Archive/Common/HandlerOut.cpp index 3e817beb..76739e94 100755 --- a/CPP/7zip/Archive/Common/HandlerOut.cpp +++ b/CPP/7zip/Archive/Common/HandlerOut.cpp @@ -586,7 +586,7 @@ HRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &val if (number <= mainDicMethodIndex) mainDicSize = dicSize; } - else if (realName.Left(1).CompareNoCase(L"B") == 0) + else if (realName.Left(1).CompareNoCase(L"C") == 0) { UInt32 blockSize; RINOK(ParsePropDictionaryValue(realName.Mid(1), value, blockSize)); diff --git a/CPP/7zip/Archive/DebHandler.cpp b/CPP/7zip/Archive/DebHandler.cpp index cf0c383f..fc962df3 100755 --- a/CPP/7zip/Archive/DebHandler.cpp +++ b/CPP/7zip/Archive/DebHandler.cpp @@ -198,7 +198,7 @@ HRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item) RINOK(GetNextItemReal(filled, item)); if (!filled) return S_OK; - if (item.Name.CompareNoCase("debian-binary") != 0) + if (item.Name.Compare("debian-binary") != 0) return S_OK; if (item.Size != 4) return S_OK; diff --git a/CPP/7zip/Archive/MachoHandler.cpp b/CPP/7zip/Archive/MachoHandler.cpp index f3ccadf5..76f63a21 100755 --- a/CPP/7zip/Archive/MachoHandler.cpp +++ b/CPP/7zip/Archive/MachoHandler.cpp @@ -308,11 +308,9 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) static AString GetName(const char *name) { - AString res; - char *p = res.GetBuffer(kNameSize); - strncpy(p, name, kNameSize); - p[kNameSize] = 0; - res.ReleaseBuffer(); + char res[kNameSize + 1]; + memcpy(res, name, kNameSize); + res[kNameSize] = 0; return res; } diff --git a/CPP/7zip/Archive/Nsis/NsisHandler.cpp b/CPP/7zip/Archive/Nsis/NsisHandler.cpp index b8945130..f2e3aab6 100755 --- a/CPP/7zip/Archive/Nsis/NsisHandler.cpp +++ b/CPP/7zip/Archive/Nsis/NsisHandler.cpp @@ -2,19 +2,19 @@ #include "StdAfx.h" -#include "NsisHandler.h" +#include "../../../../C/CpuArch.h" -#include "Common/StringConvert.h" +#include "Common/ComTry.h" #include "Common/IntToString.h" #include "Common/NewHandler.h" -#include "Common/ComTry.h" #include "Windows/PropVariant.h" -#include "../Common/ItemNameUtils.h" #include "../../Common/StreamUtils.h" -#include "../../../../C/CpuArch.h" +#include "../Common/ItemNameUtils.h" + +#include "NsisHandler.h" #define Get32(p) GetUi32(p) @@ -228,12 +228,7 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val { case kpidPath: { - UString s; - if (_archive.IsUnicode) - s = item.GetReducedNameU(); - else - s = MultiByteToUnicodeString(item.GetReducedNameA(), CP_ACP); - s = NItemName::WinNameToOSName(s); + UString s = NItemName::WinNameToOSName(item.GetReducedName(_archive.IsUnicode)); if (!s.IsEmpty()) prop = (const wchar_t *)s; break; @@ -320,6 +315,11 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, _inStream, _archive.Method, _archive.FilterFlag, useFilter)); } + CByteBuffer byteBuf; + const UInt32 kBufferLength = 1 << 16; + byteBuf.SetCapacity(kBufferLength); + Byte *buffer = byteBuf; + bool dataError = false; for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize) { @@ -363,9 +363,6 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, bool sizeIsKnown = false; UInt32 fullSize = 0; - const UInt32 kBufferLength = 1 << 11; - Byte buffer[kBufferLength]; - if (_archive.IsSolid) { UInt64 pos = _archive.GetPosOfSolidItem(index); @@ -389,12 +386,13 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, } if (streamPos == pos) { + Byte buffer2[4]; size_t processedSize = 4; - RINOK(_archive.Decoder.Read(buffer, &processedSize)); + RINOK(_archive.Decoder.Read(buffer2, &processedSize)); if (processedSize != 4) return E_FAIL; streamPos += processedSize; - fullSize = Get32(buffer); + fullSize = Get32(buffer2); sizeIsKnown = true; needDecompress = true; } @@ -409,7 +407,9 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(_archive.Decoder.Init( EXTERNAL_CODECS_VARS _inStream, _archive.Method, _archive.FilterFlag, useFilter)); - fullSize = Get32(buffer); + // fullSize = Get32(buffer); // It's bug !!! + // Test it: what is exact fullSize? + fullSize = 0xFFFFFFFF; } else fullSize = item.Size; diff --git a/CPP/7zip/Archive/Nsis/NsisIn.h b/CPP/7zip/Archive/Nsis/NsisIn.h index 4257b687..1fa6b4a6 100755 --- a/CPP/7zip/Archive/Nsis/NsisIn.h +++ b/CPP/7zip/Archive/Nsis/NsisIn.h @@ -3,16 +3,17 @@ #ifndef __ARCHIVE_NSIS_IN_H #define __ARCHIVE_NSIS_IN_H -#include "Common/MyCom.h" -#include "Common/IntToString.h" #include "Common/Buffer.h" +#include "Common/IntToString.h" +#include "Common/MyCom.h" +#include "Common/StringConvert.h" + +#include "../../Common/CreateCoder.h" #include "../../IStream.h" #include "NsisDecode.h" -#include "../../Common/CreateCoder.h" - // #define NSIS_SCRIPT namespace NArchive { @@ -81,32 +82,25 @@ struct CItem return (PrefixA.Length() >= 3 || PrefixU.Length() >= 3); } - AString GetReducedNameA() const - { - AString prefix = PrefixA; - if (prefix.Length() > 0) - if (prefix[prefix.Length() - 1] != '\\') - prefix += '\\'; - AString s2 = prefix + NameA; - const int len = 9; - if (s2.Left(len).CompareNoCase("$INSTDIR\\") == 0) - s2 = s2.Mid(len); - return s2; - } - - UString GetReducedNameU() const + UString GetReducedName(bool unicode) const { - UString prefix = PrefixU; - if (prefix.Length() > 0) - if (prefix[prefix.Length() - 1] != L'\\') - prefix += L'\\'; - UString s2 = prefix + NameU; + UString s; + if (unicode) + s = PrefixU; + else + s = MultiByteToUnicodeString(PrefixA); + if (s.Length() > 0) + if (s[s.Length() - 1] != L'\\') + s += L'\\'; + if (unicode) + s += NameU; + else + s += MultiByteToUnicodeString(NameA); const int len = 9; - if (s2.Left(len).CompareNoCase(L"$INSTDIR\\") == 0) - s2 = s2.Mid(len); - return s2; + if (s.Left(len).CompareNoCase(L"$INSTDIR\\") == 0) + s = s.Mid(len); + return s; } - }; class CInArchive diff --git a/CPP/7zip/Archive/Zip/ZipHandler.h b/CPP/7zip/Archive/Zip/ZipHandler.h index 09179111..1a3a441a 100755 --- a/CPP/7zip/Archive/Zip/ZipHandler.h +++ b/CPP/7zip/Archive/Zip/ZipHandler.h @@ -55,6 +55,7 @@ private: UInt32 m_NumMatchFinderCycles; bool m_NumMatchFinderCyclesDefined; + bool m_ForceAesMode; bool m_IsAesMode; Byte m_AesKeyMode; @@ -78,6 +79,7 @@ private: m_NumFastBytes = m_NumMatchFinderCycles = 0xFFFFFFFF; m_NumMatchFinderCyclesDefined = false; + m_ForceAesMode = false; m_IsAesMode = false; m_AesKeyMode = 3; // aes-256 m_WriteNtfsTimeExtra = false; diff --git a/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp b/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp index fe2c16e7..2f28d5ec 100755 --- a/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp +++ b/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp @@ -98,6 +98,7 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt { COM_TRY_BEGIN2 CObjectVector<CUpdateItem> updateItems; + bool thereAreAesUpdates = false; for (UInt32 i = 0; i < numItems; i++) { CUpdateItem ui; @@ -111,7 +112,11 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt ui.NewData = IntToBool(newData); ui.IndexInArchive = indexInArchive; ui.IndexInClient = i; - // bool existInArchive = (indexInArchive != UInt32(-1)); + bool existInArchive = (indexInArchive != UInt32(-1)); + if (existInArchive && newData) + if (m_Items[indexInArchive].IsAesEncrypted()) + thereAreAesUpdates = true; + if (IntToBool(newProperties)) { UString name; @@ -237,7 +242,6 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt } CMyComPtr<ICryptoGetTextPassword2> getTextPassword; - if (!getTextPassword) { CMyComPtr<IArchiveUpdateCallback> udateCallBack2(callback); udateCallBack2.QueryInterface(IID_ICryptoGetTextPassword2, &getTextPassword); @@ -252,16 +256,17 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt options.PasswordIsDefined = IntToBool(passwordIsDefined); if (options.PasswordIsDefined) { + options.IsAesMode = (m_ForceAesMode ? m_IsAesMode : thereAreAesUpdates); + options.AesKeyMode = m_AesKeyMode; + if (!IsAsciiString((const wchar_t *)password)) return E_INVALIDARG; - if (m_IsAesMode) + if (options.IsAesMode) { if (options.Password.Length() > NCrypto::NWzAes::kPasswordSizeMax) return E_INVALIDARG; } options.Password = UnicodeStringToMultiByte((const wchar_t *)password, CP_OEMCP); - options.IsAesMode = m_IsAesMode; - options.AesKeyMode = m_AesKeyMode; } } else @@ -422,9 +427,13 @@ STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *v else return E_INVALIDARG; m_IsAesMode = true; + m_ForceAesMode = true; } else if (valueString == L"ZIPCRYPTO") + { m_IsAesMode = false; + m_ForceAesMode = true; + } else return E_INVALIDARG; } diff --git a/CPP/7zip/Archive/Zip/ZipItem.h b/CPP/7zip/Archive/Zip/ZipItem.h index c41ba8c8..c0f780f8 100755 --- a/CPP/7zip/Archive/Zip/ZipItem.h +++ b/CPP/7zip/Archive/Zip/ZipItem.h @@ -187,6 +187,7 @@ public: bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kEncrypted) != 0; } bool IsStrongEncrypted() const { return IsEncrypted() && (Flags & NFileHeader::NFlags::kStrongEncrypted) != 0; }; + bool IsAesEncrypted() const { return IsEncrypted() && (IsStrongEncrypted() || CompressionMethod == NFileHeader::NCompressionMethod::kWzAES); }; bool IsLzmaEOS() const { return (Flags & NFileHeader::NFlags::kLzmaEOS) != 0; } diff --git a/CPP/7zip/MyVersion.h b/CPP/7zip/MyVersion.h index 0f06d540..68058ec3 100755 --- a/CPP/7zip/MyVersion.h +++ b/CPP/7zip/MyVersion.h @@ -1,8 +1,8 @@ #define MY_VER_MAJOR 4 -#define MY_VER_MINOR 64 +#define MY_VER_MINOR 65 #define MY_VER_BUILD 0 -#define MY_VERSION "4.64" -#define MY_7ZIP_VERSION "7-Zip 4.64" -#define MY_DATE "2009-01-03" +#define MY_VERSION "4.65" +#define MY_7ZIP_VERSION "7-Zip 4.65" +#define MY_DATE "2009-02-03" #define MY_COPYRIGHT "Copyright (c) 1999-2009 Igor Pavlov" #define MY_VERSION_COPYRIGHT_DATE MY_VERSION " " MY_COPYRIGHT " " MY_DATE diff --git a/CPP/7zip/UI/Client7z/Client7z.cpp b/CPP/7zip/UI/Client7z/Client7z.cpp index 0c447479..a63144a7 100755 --- a/CPP/7zip/UI/Client7z/Client7z.cpp +++ b/CPP/7zip/UI/Client7z/Client7z.cpp @@ -2,23 +2,25 @@ #include "StdAfx.h" +#include "Common/IntToString.h" #include "Common/MyInitGuid.h" #include "Common/StringConvert.h" -#include "Common/IntToString.h" -#include "Windows/PropVariant.h" -#include "Windows/PropVariantConversions.h" #include "Windows/DLL.h" #include "Windows/FileDir.h" -#include "Windows/FileName.h" #include "Windows/FileFind.h" +#include "Windows/FileName.h" +#include "Windows/PropVariant.h" +#include "Windows/PropVariantConversions.h" #include "../../Common/FileStreams.h" + #include "../../Archive/IArchive.h" + #include "../../IPassword.h" #include "../../MyVersion.h" - +// use another CLSIDs, if you want to support other formats (zip, rar, ...). // {23170F69-40C1-278A-1000-000110070000} DEFINE_GUID(CLSID_CFormat7z, 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x07, 0x00, 0x00); @@ -687,8 +689,9 @@ int MY_CDECL main(int argc, char* argv[]) } AString command = argv[1]; + command.MakeLower(); UString archiveName = GetUnicodeString(argv[2], CP_OEMCP); - if (command.CompareNoCase("a") == 0) + if (command.Compare("a") == 0) { // create archive command if (argc < 4) @@ -764,9 +767,9 @@ int MY_CDECL main(int argc, char* argv[]) } bool listCommand; - if (command.CompareNoCase("l") == 0) + if (command.Compare("l") == 0) listCommand = true; - else if (command.CompareNoCase("x") == 0) + else if (command.Compare("x") == 0) listCommand = false; else { diff --git a/CPP/7zip/UI/Common/Update.cpp b/CPP/7zip/UI/Common/Update.cpp index 1f88a6f0..d8fee28b 100755 --- a/CPP/7zip/UI/Common/Update.cpp +++ b/CPP/7zip/UI/Common/Update.cpp @@ -531,8 +531,11 @@ HRESULT EnumerateInArchiveItems(const NWildcard::CCensor &censor, CArcItem ai; RINOK(GetArchiveItemPath(archive, i, ai.Name)); + // check it: defaultItemName !!! + if (ai.Name.IsEmpty()) + ai.Name = defaultItemName; RINOK(IsArchiveItemFolder(archive, i, ai.IsDir)); - ai.Censored = censor.CheckPath(ai.Name.IsEmpty() ? defaultItemName : ai.Name, !ai.IsDir); + ai.Censored = censor.CheckPath(ai.Name, !ai.IsDir); RINOK(GetArchiveItemFileTime(archive, i, archiveFileInfo.MTime, ai.MTime)); { diff --git a/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp b/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp index e36b29ee..af65739c 100755 --- a/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp +++ b/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp @@ -77,7 +77,7 @@ STDMETHODIMP CExtractCallbackConsole::AskOverwrite( case NUserAnswerMode::kNoAll: *answer = NOverwriteAnswer::kNoToAll; break; case NUserAnswerMode::kYesAll: *answer = NOverwriteAnswer::kYesToAll; break; case NUserAnswerMode::kYes: *answer = NOverwriteAnswer::kYes; break; - case NUserAnswerMode::kAutoRename: *answer = NOverwriteAnswer::kAutoRename; break; + case NUserAnswerMode::kAutoRenameAll: *answer = NOverwriteAnswer::kAutoRename; break; default: return E_FAIL; } return S_OK; diff --git a/CPP/7zip/UI/Console/UserInputUtils.cpp b/CPP/7zip/UI/Console/UserInputUtils.cpp index 8a202c2c..b85cd594 100755 --- a/CPP/7zip/UI/Console/UserInputUtils.cpp +++ b/CPP/7zip/UI/Console/UserInputUtils.cpp @@ -11,16 +11,14 @@ static const char kYes = 'Y'; static const char kNo = 'N'; static const char kYesAll = 'A'; static const char kNoAll = 'S'; -static const char kAutoRename = 'U'; +static const char kAutoRenameAll = 'U'; static const char kQuit = 'Q'; static const char *kFirstQuestionMessage = "?\n"; static const char *kHelpQuestionMessage = - "(Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename / (Q)uit? "; + "(Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit? "; // return true if pressed Quite; -// in: anAll -// out: anAll, anYes; NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream) { @@ -41,8 +39,8 @@ NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream) return NUserAnswerMode::kYesAll; case kNoAll: return NUserAnswerMode::kNoAll; - case kAutoRename: - return NUserAnswerMode::kAutoRename; + case kAutoRenameAll: + return NUserAnswerMode::kAutoRenameAll; case kQuit: return NUserAnswerMode::kQuit; } diff --git a/CPP/7zip/UI/Console/UserInputUtils.h b/CPP/7zip/UI/Console/UserInputUtils.h index 408e93e6..8b5232b3 100755 --- a/CPP/7zip/UI/Console/UserInputUtils.h +++ b/CPP/7zip/UI/Console/UserInputUtils.h @@ -13,7 +13,7 @@ enum EEnum kNo, kYesAll, kNoAll, - kAutoRename, + kAutoRenameAll, kQuit }; } diff --git a/CPP/7zip/UI/Explorer/RegistryContextMenu.cpp b/CPP/7zip/UI/Explorer/RegistryContextMenu.cpp index ee0078b7..e8e53bb3 100755 --- a/CPP/7zip/UI/Explorer/RegistryContextMenu.cpp +++ b/CPP/7zip/UI/Explorer/RegistryContextMenu.cpp @@ -35,38 +35,27 @@ static CSysString GetFullContextMenuKeyName(const CSysString &keyName) static CSysString GetFullDragDropMenuKeyName(const CSysString &keyName) { return (keyName + kDragDropMenuKeyName); } -static bool CheckContextMenuHandlerCommon(const CSysString &keyName) +static bool CheckHandlerCommon(const CSysString &keyName) { NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); CKey key; - if (key.Open(HKEY_CLASSES_ROOT, GetFullContextMenuKeyName(keyName), KEY_READ) - != ERROR_SUCCESS) + if (key.Open(HKEY_CLASSES_ROOT, keyName, KEY_READ) != ERROR_SUCCESS) return false; CSysString value; if (key.QueryValue(NULL, value) != ERROR_SUCCESS) return false; - return (value.CompareNoCase(kExtensionCLSID) == 0); -} - -static bool CheckDragDropMenuHandlerCommon(const CSysString &keyName) -{ - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey key; - if (key.Open(HKEY_CLASSES_ROOT, GetFullDragDropMenuKeyName(keyName), KEY_READ) != ERROR_SUCCESS) - return false; - CSysString value; - if (key.QueryValue(NULL, value) != ERROR_SUCCESS) - return false; - return (value.CompareNoCase(kExtensionCLSID) == 0); + value.MakeUpper(); + return (value.Compare(kExtensionCLSID) == 0); } bool CheckContextMenuHandler() { - return CheckContextMenuHandlerCommon(kRootKeyNameForFile) && - // CheckContextMenuHandlerCommon(kRootKeyNameForFolder) && - CheckContextMenuHandlerCommon(kRootKeyNameForDirectory) && - CheckDragDropMenuHandlerCommon(kRootKeyNameForDirectory) && - CheckDragDropMenuHandlerCommon(kRootKeyNameForDrive); + return + // CheckHandlerCommon(GetFullContextMenuKeyName(kRootKeyNameForFolder)) && + CheckHandlerCommon(GetFullContextMenuKeyName(kRootKeyNameForDirectory)) && + CheckHandlerCommon(GetFullContextMenuKeyName(kRootKeyNameForFile)) && + CheckHandlerCommon(GetFullDragDropMenuKeyName(kRootKeyNameForDirectory)) && + CheckHandlerCommon(GetFullDragDropMenuKeyName(kRootKeyNameForDrive)); } static void DeleteContextMenuHandlerCommon(const CSysString &keyName) diff --git a/CPP/7zip/UI/FileManager/App.cpp b/CPP/7zip/UI/FileManager/App.cpp index 11c76458..f4f0bde7 100755 --- a/CPP/7zip/UI/FileManager/App.cpp +++ b/CPP/7zip/UI/FileManager/App.cpp @@ -151,7 +151,7 @@ static void CreateToolbar( imageList.Create( LargeButtons ? 48: 24, LargeButtons ? 36: 24, - ILC_MASK, 0, 0); + ILC_MASK | ILC_COLOR32, 0, 0); toolBar.SetImageList(0, imageList); } diff --git a/CPP/7zip/UI/FileManager/FM.dsp b/CPP/7zip/UI/FileManager/FM.dsp index d13e0a1f..6727b085 100755 --- a/CPP/7zip/UI/FileManager/FM.dsp +++ b/CPP/7zip/UI/FileManager/FM.dsp @@ -657,6 +657,34 @@ SOURCE=..\..\..\..\C\Alloc.h # End Source File # Begin Source File +SOURCE=..\..\..\..\C\Sha256.c + +!IF "$(CFG)" == "FM - Win32 Release" + +# ADD CPP /O2 +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "FM - Win32 Debug" + +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "FM - Win32 ReleaseU" + +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "FM - Win32 DebugU" + +# SUBTRACT CPP /YX /Yc /Yu + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Sha256.h +# End Source File +# Begin Source File + SOURCE=..\..\..\..\C\Sort.c # SUBTRACT CPP /YX /Yc /Yu # End Source File diff --git a/CPP/7zip/UI/FileManager/PanelCrc.cpp b/CPP/7zip/UI/FileManager/PanelCrc.cpp index d6dbd069..61a84050 100755 --- a/CPP/7zip/UI/FileManager/PanelCrc.cpp +++ b/CPP/7zip/UI/FileManager/PanelCrc.cpp @@ -2,30 +2,31 @@ #include "StdAfx.h" -#include "resource.h" - extern "C" { #include "../../../../C/Alloc.h" #include "../../../../C/7zCrc.h" + #include "../../../../C/Sha256.h" } #include "Common/IntToString.h" #include "Common/StringConvert.h" -#include "Windows/FileIO.h" +#include "Windows/Error.h" #include "Windows/FileFind.h" +#include "Windows/FileIO.h" #include "Windows/FileName.h" #include "Windows/Thread.h" -#include "Windows/Error.h" -#include "ProgressDialog2.h" #include "OverwriteDialogRes.h" +#include "ProgressDialog2.h" #include "App.h" #include "FormatUtils.h" #include "LangUtils.h" +#include "resource.h" + using namespace NWindows; using namespace NFile; using namespace NName; @@ -125,10 +126,12 @@ struct CThreadCrc CDirEnumerator DirEnumerator; + UInt64 NumFilesScan; UInt64 NumFiles; UInt64 NumFolders; UInt64 DataSize; UInt32 DataCrcSum; + Byte Sha256Sum[SHA256_DIGEST_SIZE]; UInt32 DataNameCrcSum; HRESULT Result; @@ -139,7 +142,8 @@ struct CThreadCrc void Process2() { - DataSize = NumFolders = NumFiles = DataCrcSum = DataNameCrcSum = 0; + DataSize = NumFolders = NumFiles = NumFilesScan = DataCrcSum = DataNameCrcSum = 0; + memset(Sha256Sum, 0, SHA256_DIGEST_SIZE); ProgressDialog->WaitCreating(); CMyBuffer bufferObject; @@ -172,14 +176,17 @@ struct CThreadCrc if (!filled) break; if (!fileInfo.IsDir()) + { totalSize += fileInfo.Size; + NumFilesScan++; + } ProgressDialog->ProgressSynch.SetCurrentFileName(scanningStr + resPath); ProgressDialog->ProgressSynch.SetProgress(totalSize, 0); Result = ProgressDialog->ProgressSynch.SetPosAndCheckPaused(0); if (Result != S_OK) return; } - + ProgressDialog->ProgressSynch.SetNumFilesTotal(NumFilesScan); ProgressDialog->ProgressSynch.SetProgress(totalSize, 0); DirEnumerator.Init(); @@ -199,6 +206,9 @@ struct CThreadCrc break; UInt32 crc = CRC_INIT_VAL; + CSha256 sha256; + Sha256_Init(&sha256); + if (fileInfo.IsDir()) NumFolders++; else @@ -211,8 +221,9 @@ struct CThreadCrc ErrorPath = resPath; return; } - NumFiles++; ProgressDialog->ProgressSynch.SetCurrentFileName(resPath); + ProgressDialog->ProgressSynch.SetNumFilesCur(NumFiles); + NumFiles++; for (;;) { UInt32 processedSize; @@ -226,12 +237,17 @@ struct CThreadCrc if (processedSize == 0) break; crc = CrcUpdate(crc, buffer, processedSize); + if (NumFilesScan == 1) + Sha256_Update(&sha256, buffer, processedSize); + DataSize += processedSize; Result = ProgressDialog->ProgressSynch.SetPosAndCheckPaused(DataSize); if (Result != S_OK) return; } DataCrcSum += CRC_GET_DIGEST(crc); + if (NumFilesScan == 1) + Sha256_Final(&sha256, Sha256Sum); } for (int i = 0; i < resPath.Length(); i++) { @@ -259,13 +275,22 @@ struct CThreadCrc } }; -static void ConvertUInt32ToHex(UInt32 value, wchar_t *s) +static void ConvertByteToHex(unsigned value, wchar_t *s) { - for (int i = 0; i < 8; i++) + for (int i = 0; i < 2; i++) { - int t = value & 0xF; + unsigned t = value & 0xF; value >>= 4; - s[7 - i] = (wchar_t)((t < 10) ? (L'0' + t) : (L'A' + (t - 10))); + s[1 - i] = (wchar_t)((t < 10) ? (L'0' + t) : (L'A' + (t - 10))); + } +} + +static void ConvertUInt32ToHex(UInt32 value, wchar_t *s) +{ + for (int i = 6; i >= 0; i -= 2) + { + ConvertByteToHex(value & 0xFF, s + i); + value >>= 8; } s[8] = L'\0'; } @@ -360,6 +385,19 @@ void CApp::CalculateCrc() s += L" "; ConvertUInt32ToHex(combiner.DataNameCrcSum, sz); s += sz; + s += L"\n"; + + if (combiner.NumFiles == 1 && combiner.NumFilesScan == 1) + { + s += L"SHA-256: "; + for (int i = 0; i < SHA256_DIGEST_SIZE; i++) + { + wchar_t s2[4]; + ConvertByteToHex(combiner.Sha256Sum[i], s2); + s2[2] = 0; + s += s2; + } + } } srcPanel.MessageBoxInfo(s, LangString(IDS_CHECKSUM_INFORMATION, 0x03020720)); } diff --git a/CPP/7zip/UI/FileManager/RegistryAssociations.cpp b/CPP/7zip/UI/FileManager/RegistryAssociations.cpp index 93340c3f..8c6e6ae8 100755 --- a/CPP/7zip/UI/FileManager/RegistryAssociations.cpp +++ b/CPP/7zip/UI/FileManager/RegistryAssociations.cpp @@ -126,7 +126,8 @@ static bool CheckShellExtensionInfo2(const CSysString &extension, UString &iconP if (extKey.QueryValue(NULL, programNameValue) != ERROR_SUCCESS) return false; CSysString extProgramKeyName = GetExtProgramKeyName(extension); - if (programNameValue.CompareNoCase(extProgramKeyName) != 0) + UString programNameValueU = GetUnicodeString(programNameValue); + if (programNameValueU.CompareNoCase(GetUnicodeString(extProgramKeyName)) != 0) return false; CKey iconKey; if (extKey.Open(HKEY_CLASSES_ROOT, extProgramKeyName + CSysString(TEXT(CHAR_PATH_SEPARATOR)) + kDefaultIconKeyName, KEY_READ) != ERROR_SUCCESS) diff --git a/CPP/7zip/UI/FileManager/makefile b/CPP/7zip/UI/FileManager/makefile index bc1d2662..86bdd85f 100755 --- a/CPP/7zip/UI/FileManager/makefile +++ b/CPP/7zip/UI/FileManager/makefile @@ -149,6 +149,7 @@ AGENT_OBJS = \ C_OBJS = \ $O\Alloc.obj \ + $O\Sha256.obj \ $O\Sort.obj \ $O\Threads.obj \ diff --git a/CPP/7zip/UI/GUI/CompressDialog.cpp b/CPP/7zip/UI/GUI/CompressDialog.cpp index 69587f3a..64ee31d8 100755 --- a/CPP/7zip/UI/GUI/CompressDialog.cpp +++ b/CPP/7zip/UI/GUI/CompressDialog.cpp @@ -73,7 +73,7 @@ using namespace NFile; using namespace NName; using namespace NDirectory; -static const int kHistorySize = 8; +static const int kHistorySize = 20; static LPCWSTR kExeExt = L".exe"; static LPCWSTR k7zFormat = L"7z"; @@ -1315,7 +1315,7 @@ UInt64 CCompressDialog::GetMemoryUsage(UInt32 dictionary, UInt64 &decompressMemo UInt64 size1 = (UInt64)hs * 4; size1 += (UInt64)dictionary * 11 / 2; if (level >= 5) - size1 += dictionary * 4; + size1 += (UInt64)dictionary * 4; size1 += (2 << 20); UInt32 numThreads1 = 1; |