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:
Diffstat (limited to 'CPP/7zip/UI/Common')
-rwxr-xr-xCPP/7zip/UI/Common/ArchiveExtractCallback.h2
-rwxr-xr-xCPP/7zip/UI/Common/DirItem.h13
-rwxr-xr-xCPP/7zip/UI/Common/LoadCodecs.cpp10
-rwxr-xr-xCPP/7zip/UI/Common/LoadCodecs.h8
-rwxr-xr-xCPP/7zip/UI/Common/OpenArchive.cpp25
-rwxr-xr-xCPP/7zip/UI/Common/SetProperties.cpp18
-rwxr-xr-xCPP/7zip/UI/Common/Update.cpp51
-rwxr-xr-xCPP/7zip/UI/Common/UpdatePair.cpp24
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;