diff options
Diffstat (limited to 'CPP/7zip/UI/Common')
-rwxr-xr-x | CPP/7zip/UI/Common/ArchiveExtractCallback.h | 2 | ||||
-rwxr-xr-x | CPP/7zip/UI/Common/DirItem.h | 13 | ||||
-rwxr-xr-x | CPP/7zip/UI/Common/LoadCodecs.cpp | 10 | ||||
-rwxr-xr-x | CPP/7zip/UI/Common/LoadCodecs.h | 8 | ||||
-rwxr-xr-x | CPP/7zip/UI/Common/OpenArchive.cpp | 25 | ||||
-rwxr-xr-x | CPP/7zip/UI/Common/SetProperties.cpp | 18 | ||||
-rwxr-xr-x | CPP/7zip/UI/Common/Update.cpp | 51 | ||||
-rwxr-xr-x | CPP/7zip/UI/Common/UpdatePair.cpp | 24 |
8 files changed, 95 insertions, 56 deletions
diff --git a/CPP/7zip/UI/Common/ArchiveExtractCallback.h b/CPP/7zip/UI/Common/ArchiveExtractCallback.h index fd30d64d..756dfb08 100755 --- a/CPP/7zip/UI/Common/ArchiveExtractCallback.h +++ b/CPP/7zip/UI/Common/ArchiveExtractCallback.h @@ -95,7 +95,7 @@ private: public: CArchiveExtractCallback(): WriteModified(true), - WriteCreated(false), + WriteCreated(true), WriteAccessed(false), _multiArchives(false) { diff --git a/CPP/7zip/UI/Common/DirItem.h b/CPP/7zip/UI/Common/DirItem.h index 89bd4cd3..d2f2ab43 100755 --- a/CPP/7zip/UI/Common/DirItem.h +++ b/CPP/7zip/UI/Common/DirItem.h @@ -5,30 +5,31 @@ #include "Common/MyString.h" #include "Common/Types.h" +#include "../../Archive/IArchive.h" struct CDirItem { - UInt32 Attributes; FILETIME CreationTime; FILETIME LastAccessTime; FILETIME LastWriteTime; UInt64 Size; UString Name; UString FullPath; + UInt32 Attributes; bool IsDirectory() const { return (Attributes & FILE_ATTRIBUTE_DIRECTORY) != 0 ; } }; struct CArchiveItem { - bool IsDirectory; - // DWORD Attributes; - // NWindows::NCOM::CPropVariant LastWriteTime; FILETIME LastWriteTime; - bool SizeIsDefined; UInt64 Size; UString Name; + bool IsDirectory; + bool SizeIsDefined; bool Censored; - int IndexInServer; + UInt32 IndexInServer; + int FileTimeType; + CArchiveItem(): IsDirectory(false), SizeIsDefined(false), Censored(false), FileTimeType(-1) {} }; #endif diff --git a/CPP/7zip/UI/Common/LoadCodecs.cpp b/CPP/7zip/UI/Common/LoadCodecs.cpp index 087340a1..52b2ebe8 100755 --- a/CPP/7zip/UI/Common/LoadCodecs.cpp +++ b/CPP/7zip/UI/Common/LoadCodecs.cpp @@ -482,10 +482,10 @@ int CCodecs::FindFormatForArchiveType(const UString &arcType) const extern unsigned int g_NumCodecs; STDAPI CreateCoder2(bool encode, UInt32 index, const GUID *iid, void **outObject); STDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value); -// STDAPI GetNumberOfMethods(UINT32 *numCodecs); +// STDAPI GetNumberOfMethods(UInt32 *numCodecs); #endif -STDMETHODIMP CCodecs::GetNumberOfMethods(UINT32 *numMethods) +STDMETHODIMP CCodecs::GetNumberOfMethods(UInt32 *numMethods) { *numMethods = #ifdef EXPORT_CODECS @@ -495,7 +495,7 @@ STDMETHODIMP CCodecs::GetNumberOfMethods(UINT32 *numMethods) return S_OK; } -STDMETHODIMP CCodecs::GetProperty(UINT32 index, PROPID propID, PROPVARIANT *value) +STDMETHODIMP CCodecs::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { #ifdef EXPORT_CODECS if (index < g_NumCodecs) @@ -525,7 +525,7 @@ STDMETHODIMP CCodecs::GetProperty(UINT32 index, PROPID propID, PROPVARIANT *valu return Libs[ci.LibIndex].GetMethodProperty(ci.CodecIndex, propID, value); } -STDMETHODIMP CCodecs::CreateDecoder(UINT32 index, const GUID *iid, void **coder) +STDMETHODIMP CCodecs::CreateDecoder(UInt32 index, const GUID *iid, void **coder) { #ifdef EXPORT_CODECS if (index < g_NumCodecs) @@ -541,7 +541,7 @@ STDMETHODIMP CCodecs::CreateDecoder(UINT32 index, const GUID *iid, void **coder) return S_OK; } -STDMETHODIMP CCodecs::CreateEncoder(UINT32 index, const GUID *iid, void **coder) +STDMETHODIMP CCodecs::CreateEncoder(UInt32 index, const GUID *iid, void **coder) { #ifdef EXPORT_CODECS if (index < g_NumCodecs) diff --git a/CPP/7zip/UI/Common/LoadCodecs.h b/CPP/7zip/UI/Common/LoadCodecs.h index 231680b5..dadcf7c2 100755 --- a/CPP/7zip/UI/Common/LoadCodecs.h +++ b/CPP/7zip/UI/Common/LoadCodecs.h @@ -154,10 +154,10 @@ public: MY_UNKNOWN_IMP #ifdef EXTERNAL_CODECS - STDMETHOD(GetNumberOfMethods)(UINT32 *numMethods); - STDMETHOD(GetProperty)(UINT32 index, PROPID propID, PROPVARIANT *value); - STDMETHOD(CreateDecoder)(UINT32 index, const GUID *interfaceID, void **coder); - STDMETHOD(CreateEncoder)(UINT32 index, const GUID *interfaceID, void **coder); + STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods); + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); + STDMETHOD(CreateDecoder)(UInt32 index, const GUID *interfaceID, void **coder); + STDMETHOD(CreateEncoder)(UInt32 index, const GUID *interfaceID, void **coder); #endif int GetCodecLibIndex(UInt32 index); diff --git a/CPP/7zip/UI/Common/OpenArchive.cpp b/CPP/7zip/UI/Common/OpenArchive.cpp index 2874f6a7..4bd93455 100755 --- a/CPP/7zip/UI/Common/OpenArchive.cpp +++ b/CPP/7zip/UI/Common/OpenArchive.cpp @@ -37,7 +37,18 @@ HRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, const UString &def { RINOK(GetArchiveItemPath(archive, index, result)); if (result.IsEmpty()) + { result = defaultName; + NCOM::CPropVariant prop; + RINOK(archive->GetProperty(index, kpidExtension, &prop)); + if (prop.vt == VT_BSTR) + { + result += L'.'; + result += prop.bstrVal; + } + else if (prop.vt != VT_EMPTY) + return E_FAIL; + } return S_OK; } @@ -129,12 +140,12 @@ HRESULT OpenArchive( { CIntVector orderIndices2; CByteBuffer byteBuffer; - const UInt32 kBufferSize = (200 << 10); + const size_t kBufferSize = (200 << 10); byteBuffer.SetCapacity(kBufferSize); Byte *buffer = byteBuffer; RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); - UInt32 processedSize; - RINOK(ReadStream(inStream, buffer, kBufferSize, &processedSize)); + size_t processedSize = kBufferSize; + RINOK(ReadStream(inStream, buffer, &processedSize)); for (UInt32 pos = 0; pos < processedSize; pos++) { for (int i = 0; i < orderIndices.Size(); i++) @@ -159,16 +170,16 @@ HRESULT OpenArchive( else if (extension == L"000" || extension == L"001") { CByteBuffer byteBuffer; - const UInt32 kBufferSize = (1 << 10); + const size_t kBufferSize = (1 << 10); byteBuffer.SetCapacity(kBufferSize); Byte *buffer = byteBuffer; RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); - UInt32 processedSize; - RINOK(ReadStream(inStream, buffer, kBufferSize, &processedSize)); + size_t processedSize = kBufferSize; + RINOK(ReadStream(inStream, buffer, &processedSize)); if (processedSize >= 16) { Byte kRarHeader[] = {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}; - if (TestSignature(buffer, kRarHeader, 7) && buffer[9] == 0x73 && (buffer[10] && 1) != 0) + if (TestSignature(buffer, kRarHeader, 7) && buffer[9] == 0x73 && (buffer[10] & 1) != 0) { for (int i = 0; i < orderIndices.Size(); i++) { diff --git a/CPP/7zip/UI/Common/SetProperties.cpp b/CPP/7zip/UI/Common/SetProperties.cpp index b1434ace..201e95b5 100755 --- a/CPP/7zip/UI/Common/SetProperties.cpp +++ b/CPP/7zip/UI/Common/SetProperties.cpp @@ -44,9 +44,23 @@ HRESULT SetProperties(IUnknown *unknown, const CObjectVector<CProperty> &propert { const CProperty &property = properties[i]; NCOM::CPropVariant propVariant; - if (!property.Value.IsEmpty()) + UString name = property.Name; + if (property.Value.IsEmpty()) + { + if (!name.IsEmpty()) + { + wchar_t c = name[name.Length() - 1]; + if (c == L'-') + propVariant = false; + else if (c == L'+') + propVariant = true; + if (propVariant.vt != VT_EMPTY) + name = name.Left(name.Length() - 1); + } + } + else ParseNumberString(property.Value, propVariant); - realNames.Add(property.Name); + realNames.Add(name); values[i] = propVariant; } CRecordVector<const wchar_t *> names; diff --git a/CPP/7zip/UI/Common/Update.cpp b/CPP/7zip/UI/Common/Update.cpp index ec5ebc80..8e879246 100755 --- a/CPP/7zip/UI/Common/Update.cpp +++ b/CPP/7zip/UI/Common/Update.cpp @@ -2,10 +2,6 @@ #include "StdAfx.h" -#ifdef _WIN32 -#include <mapi.h> -#endif - #include "Update.h" #include "Common/IntToString.h" @@ -338,9 +334,9 @@ static HRESULT Compress( switch(value) { case NFileTimeType::kWindows: - case NFileTimeType::kDOS: case NFileTimeType::kUnix: - fileTimeType = NFileTimeType::EEnum(value); + case NFileTimeType::kDOS: + fileTimeType = (NFileTimeType::EEnum)value; break; default: return E_FAIL; @@ -516,11 +512,31 @@ HRESULT EnumerateInArchiveItems(const NWildcard::CCensor &censor, RINOK(GetArchiveItemFileTime(archive, i, archiveFileInfo.LastWriteTime, ai.LastWriteTime)); - CPropVariant propertySize; - RINOK(archive->GetProperty(i, kpidSize, &propertySize)); - ai.SizeIsDefined = (propertySize.vt != VT_EMPTY); - if (ai.SizeIsDefined) - ai.Size = ConvertPropVariantToUInt64(propertySize); + { + CPropVariant prop; + RINOK(archive->GetProperty(i, kpidSize, &prop)); + ai.SizeIsDefined = (prop.vt != VT_EMPTY); + if (ai.SizeIsDefined) + ai.Size = ConvertPropVariantToUInt64(prop); + } + + { + CPropVariant prop; + RINOK(archive->GetProperty(i, kpidTimeType, &prop)); + if (prop.vt == VT_UI4) + { + ai.FileTimeType = (int)(NFileTimeType::EEnum)prop.ulVal; + switch(ai.FileTimeType) + { + case NFileTimeType::kWindows: + case NFileTimeType::kUnix: + case NFileTimeType::kDOS: + break; + default: + return E_FAIL; + } + } + } ai.IndexInServer = i; archiveItems.Add(ai); @@ -593,6 +609,17 @@ struct CEnumDirItemUpdateCallback: public IEnumDirItemCallback HRESULT CheckBreak() { return Callback->CheckBreak(); } }; +#ifdef _WIN32 +typedef ULONG (FAR PASCAL MY_MAPISENDDOCUMENTS)( + ULONG_PTR ulUIParam, + LPSTR lpszDelimChar, + LPSTR lpszFilePaths, + LPSTR lpszFileNames, + ULONG ulReserved +); +typedef MY_MAPISENDDOCUMENTS FAR *MY_LPMAPISENDDOCUMENTS; +#endif + HRESULT UpdateArchive( CCodecs *codecs, const NWildcard::CCensor &censor, @@ -814,7 +841,7 @@ HRESULT UpdateArchive( errorInfo.Message = L"can not load Mapi32.dll"; return E_FAIL; } - LPMAPISENDDOCUMENTS fnSend = (LPMAPISENDDOCUMENTS) + MY_LPMAPISENDDOCUMENTS fnSend = (MY_LPMAPISENDDOCUMENTS) mapiLib.GetProcAddress("MAPISendDocuments"); if (fnSend == 0) { diff --git a/CPP/7zip/UI/Common/UpdatePair.cpp b/CPP/7zip/UI/Common/UpdatePair.cpp index b4fb2a15..2ee0f167 100755 --- a/CPP/7zip/UI/Common/UpdatePair.cpp +++ b/CPP/7zip/UI/Common/UpdatePair.cpp @@ -14,8 +14,7 @@ using namespace NWindows; using namespace NTime; -static int MyCompareTime(NFileTimeType::EEnum fileTimeType, - const FILETIME &time1, const FILETIME &time2) +static int MyCompareTime(NFileTimeType::EEnum fileTimeType, const FILETIME &time1, const FILETIME &time2) { switch(fileTimeType) { @@ -24,16 +23,8 @@ static int MyCompareTime(NFileTimeType::EEnum fileTimeType, case NFileTimeType::kUnix: { UInt32 unixTime1, unixTime2; - if (!FileTimeToUnixTime(time1, unixTime1)) - { - unixTime1 = 0; - // throw 4191614; - } - if (!FileTimeToUnixTime(time2, unixTime2)) - { - unixTime2 = 0; - // throw 4191615; - } + FileTimeToUnixTime(time1, unixTime1); + FileTimeToUnixTime(time2, unixTime2); return MyCompare(unixTime1, unixTime2); } case NFileTimeType::kDOS: @@ -41,12 +32,6 @@ static int MyCompareTime(NFileTimeType::EEnum fileTimeType, UInt32 dosTime1, dosTime2; FileTimeToDosTime(time1, dosTime1); FileTimeToDosTime(time2, dosTime2); - /* - if (!FileTimeToDosTime(time1, dosTime1)) - throw 4191616; - if (!FileTimeToDosTime(time2, dosTime2)) - throw 4191617; - */ return MyCompare(dosTime1, dosTime2); } } @@ -125,7 +110,8 @@ void GetUpdatePairInfoList( throw 1082022;; // TTString(kNotCensoredCollisionMessaged + dirItem.Name); pair.DirItemIndex = dirItemIndex2; pair.ArchiveItemIndex = archiveItemIndex2; - switch (MyCompareTime(fileTimeType, dirItem.LastWriteTime, archiveItem.LastWriteTime)) + switch (MyCompareTime(archiveItem.FileTimeType != - 1 ? + (NFileTimeType::EEnum)archiveItem.FileTimeType : fileTimeType, dirItem.LastWriteTime, archiveItem.LastWriteTime)) { case -1: pair.State = NUpdateArchive::NPairState::kNewInArchive; |