diff options
author | Igor Pavlov <ipavlov@users.sourceforge.net> | 2009-08-17 04:00:00 +0400 |
---|---|---|
committer | Kornel LesiĆski <kornel@geekhood.net> | 2016-05-28 02:16:00 +0300 |
commit | c99f3ebdd639c2adb03d8b44001b10af18516504 (patch) | |
tree | 92aaf34e5edbd7287c3f55037190da75ab0a8000 | |
parent | 829409452d85cd6dd9dfc9151f109d6e13a2bb1c (diff) |
9.06 beta
445 files changed, 15137 insertions, 8024 deletions
@@ -0,0 +1,201 @@ +/* 7z.h -- 7z interface +2009-08-17 : Igor Pavlov : Public domain */ + +#ifndef __7Z_H +#define __7Z_H + +#include "7zBuf.h" + +EXTERN_C_BEGIN + +#define k7zStartHeaderSize 0x20 +#define k7zSignatureSize 6 +extern Byte k7zSignature[k7zSignatureSize]; +#define k7zMajorVersion 0 + +enum EIdEnum +{ + k7zIdEnd, + k7zIdHeader, + k7zIdArchiveProperties, + k7zIdAdditionalStreamsInfo, + k7zIdMainStreamsInfo, + k7zIdFilesInfo, + k7zIdPackInfo, + k7zIdUnpackInfo, + k7zIdSubStreamsInfo, + k7zIdSize, + k7zIdCRC, + k7zIdFolder, + k7zIdCodersUnpackSize, + k7zIdNumUnpackStream, + k7zIdEmptyStream, + k7zIdEmptyFile, + k7zIdAnti, + k7zIdName, + k7zIdCTime, + k7zIdATime, + k7zIdMTime, + k7zIdWinAttributes, + k7zIdComment, + k7zIdEncodedHeader, + k7zIdStartPos, + k7zIdDummy +}; + +typedef struct +{ + UInt32 NumInStreams; + UInt32 NumOutStreams; + UInt64 MethodID; + CBuf Props; +} CSzCoderInfo; + +void SzCoderInfo_Init(CSzCoderInfo *p); +void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc); + +typedef struct +{ + UInt32 InIndex; + UInt32 OutIndex; +} CSzBindPair; + +typedef struct +{ + CSzCoderInfo *Coders; + CSzBindPair *BindPairs; + UInt32 *PackStreams; + UInt64 *UnpackSizes; + UInt32 NumCoders; + UInt32 NumBindPairs; + UInt32 NumPackStreams; + int UnpackCRCDefined; + UInt32 UnpackCRC; + + UInt32 NumUnpackStreams; +} CSzFolder; + +void SzFolder_Init(CSzFolder *p); +UInt64 SzFolder_GetUnpackSize(CSzFolder *p); +int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex); +UInt32 SzFolder_GetNumOutStreams(CSzFolder *p); +UInt64 SzFolder_GetUnpackSize(CSzFolder *p); + +SRes SzFolder_Decode(const CSzFolder *folder, const UInt64 *packSizes, + ILookInStream *stream, UInt64 startPos, + Byte *outBuffer, size_t outSize, ISzAlloc *allocMain); + +typedef struct +{ + UInt32 Low; + UInt32 High; +} CNtfsFileTime; + +typedef struct +{ + CNtfsFileTime MTime; + UInt64 Size; + UInt32 Crc; + Byte HasStream; + Byte IsDir; + Byte IsAnti; + Byte CrcDefined; + Byte MTimeDefined; +} CSzFileItem; + +void SzFile_Init(CSzFileItem *p); + +typedef struct +{ + UInt64 *PackSizes; + Byte *PackCRCsDefined; + UInt32 *PackCRCs; + CSzFolder *Folders; + CSzFileItem *Files; + UInt32 NumPackStreams; + UInt32 NumFolders; + UInt32 NumFiles; +} CSzAr; + +void SzAr_Init(CSzAr *p); +void SzAr_Free(CSzAr *p, ISzAlloc *alloc); + + +/* + SzExtract extracts file from archive + + *outBuffer must be 0 before first call for each new archive. + + Extracting cache: + If you need to decompress more than one file, you can send + these values from previous call: + *blockIndex, + *outBuffer, + *outBufferSize + You can consider "*outBuffer" as cache of solid block. If your archive is solid, + it will increase decompression speed. + + If you use external function, you can declare these 3 cache variables + (blockIndex, outBuffer, outBufferSize) as static in that external function. + + Free *outBuffer and set *outBuffer to 0, if you want to flush cache. +*/ + +typedef struct +{ + CSzAr db; + + UInt64 startPosAfterHeader; + UInt64 dataPos; + + UInt32 *FolderStartPackStreamIndex; + UInt64 *PackStreamStartPositions; + UInt32 *FolderStartFileIndex; + UInt32 *FileIndexToFolderIndexMap; + + size_t *FileNameOffsets; /* in 2-byte steps */ + CBuf FileNames; /* UTF-16-LE */ +} CSzArEx; + +void SzArEx_Init(CSzArEx *p); +void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc); +UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); +int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); + +/* +if dest == NULL, the return value specifies the required size of the buffer, + in 16-bit characters, including the null-terminating character. +if dest != NULL, the return value specifies the number of 16-bit characters that + are written to the dest, including the null-terminating character. */ + +size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); + +SRes SzArEx_Extract( + const CSzArEx *db, + ILookInStream *inStream, + UInt32 fileIndex, /* index of file */ + UInt32 *blockIndex, /* index of solid block */ + Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ + size_t *outBufferSize, /* buffer size for output buffer */ + size_t *offset, /* offset of stream for required file in *outBuffer */ + size_t *outSizeProcessed, /* size of file in *outBuffer */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + + +/* +SzArEx_Open Errors: +SZ_ERROR_NO_ARCHIVE +SZ_ERROR_ARCHIVE +SZ_ERROR_UNSUPPORTED +SZ_ERROR_MEM +SZ_ERROR_CRC +SZ_ERROR_INPUT_EOF +SZ_ERROR_FAIL +*/ + +SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp); + +EXTERN_C_END + +#endif diff --git a/C/Archive/7z/7zDecode.c b/C/7zDec.c index 0d310a48..b2b1a731 100755 --- a/C/Archive/7z/7zDecode.c +++ b/C/7zDec.c @@ -1,14 +1,14 @@ -/* 7zDecode.c -- Decoding from 7z folder -2009-05-03 : Igor Pavlov : Public domain */ +/* 7zDec.c -- Decoding from 7z folder +2009-08-16 : Igor Pavlov : Public domain */ #include <string.h> -#include "../../Bcj2.h" -#include "../../Bra.h" -#include "../../LzmaDec.h" -#include "../../Lzma2Dec.h" +#include "7z.h" -#include "7zDecode.h" +#include "Bcj2.h" +#include "Bra.h" +#include "LzmaDec.h" +#include "Lzma2Dec.h" #define k_Copy 0 #define k_LZMA2 0x21 @@ -137,7 +137,7 @@ static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer #define IS_NO_BCJ(c) (c.MethodID != k_BCJ || c.NumInStreams != 1 || c.NumOutStreams != 1) #define IS_NO_BCJ2(c) (c.MethodID != k_BCJ2 || c.NumInStreams != 4 || c.NumOutStreams != 1) -SRes CheckSupportedFolder(const CSzFolder *f) +static SRes CheckSupportedFolder(const CSzFolder *f) { if (f->NumCoders < 1 || f->NumCoders > 4) return SZ_ERROR_UNSUPPORTED; @@ -179,7 +179,7 @@ SRes CheckSupportedFolder(const CSzFolder *f) return SZ_ERROR_UNSUPPORTED; } -UInt64 GetSum(const UInt64 *values, UInt32 index) +static UInt64 GetSum(const UInt64 *values, UInt32 index) { UInt64 sum = 0; UInt32 i; @@ -188,7 +188,7 @@ UInt64 GetSum(const UInt64 *values, UInt32 index) return sum; } -SRes SzDecode2(const UInt64 *packSizes, const CSzFolder *folder, +static SRes SzFolder_Decode2(const CSzFolder *folder, const UInt64 *packSizes, ILookInStream *inStream, UInt64 startPos, Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain, Byte *tempBuf[]) @@ -296,13 +296,13 @@ SRes SzDecode2(const UInt64 *packSizes, const CSzFolder *folder, return SZ_OK; } -SRes SzDecode(const UInt64 *packSizes, const CSzFolder *folder, +SRes SzFolder_Decode(const CSzFolder *folder, const UInt64 *packSizes, ILookInStream *inStream, UInt64 startPos, Byte *outBuffer, size_t outSize, ISzAlloc *allocMain) { Byte *tempBuf[3] = { 0, 0, 0}; int i; - SRes res = SzDecode2(packSizes, folder, inStream, startPos, + SRes res = SzFolder_Decode2(folder, packSizes, inStream, startPos, outBuffer, (SizeT)outSize, allocMain, tempBuf); for (i = 0; i < 3; i++) IAlloc_Free(allocMain, tempBuf[i]); @@ -1,5 +1,5 @@ /* 7zFile.c -- File IO -2008-11-22 : Igor Pavlov : Public domain */ +2009-08-16 : Igor Pavlov : Public domain */ #include "7zFile.h" @@ -52,6 +52,20 @@ static WRes File_Open(CSzFile *p, const char *name, int writeMode) WRes InFile_Open(CSzFile *p, const char *name) { return File_Open(p, name, 0); } WRes OutFile_Open(CSzFile *p, const char *name) { return File_Open(p, name, 1); } +#ifdef USE_WINDOWS_FILE +static WRes File_OpenW(CSzFile *p, const WCHAR *name, int writeMode) +{ + p->handle = CreateFileW(name, + writeMode ? GENERIC_WRITE : GENERIC_READ, + FILE_SHARE_READ, NULL, + writeMode ? CREATE_ALWAYS : OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + return (p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError(); +} +WRes InFile_OpenW(CSzFile *p, const WCHAR *name) { return File_OpenW(p, name, 0); } +WRes OutFile_OpenW(CSzFile *p, const WCHAR *name) { return File_OpenW(p, name, 1); } +#endif + WRes File_Close(CSzFile *p) { #ifdef USE_WINDOWS_FILE @@ -1,5 +1,5 @@ /* 7zFile.h -- File IO -2009-02-07 : Igor Pavlov : Public domain */ +2009-08-16 : Igor Pavlov : Public domain */ #ifndef __7Z_FILE_H #define __7Z_FILE_H @@ -16,10 +16,7 @@ #include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif - +EXTERN_C_BEGIN /* ---------- File ---------- */ @@ -35,6 +32,10 @@ typedef struct void File_Construct(CSzFile *p); WRes InFile_Open(CSzFile *p, const char *name); WRes OutFile_Open(CSzFile *p, const char *name); +#ifdef USE_WINDOWS_FILE +WRes InFile_OpenW(CSzFile *p, const WCHAR *name); +WRes OutFile_OpenW(CSzFile *p, const WCHAR *name); +#endif WRes File_Close(CSzFile *p); /* reads max(*size, remain file's size) bytes */ @@ -75,8 +76,6 @@ typedef struct void FileOutStream_CreateVTable(CFileOutStream *p); -#ifdef __cplusplus -} -#endif +EXTERN_C_END #endif diff --git a/C/Archive/7z/7zIn.c b/C/7zIn.c index f6143f83..e687fbf2 100755 --- a/C/Archive/7z/7zIn.c +++ b/C/7zIn.c @@ -1,17 +1,134 @@ /* 7zIn.c -- 7z Input functions -2008-12-31 : Igor Pavlov : Public domain */ +2009-08-17 : Igor Pavlov : Public domain */ -#include "../../7zCrc.h" -#include "../../CpuArch.h" +#include <string.h> -#include "7zDecode.h" -#include "7zIn.h" +#include "7z.h" +#include "7zCrc.h" +#include "CpuArch.h" + +Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; #define RINOM(x) { if ((x) == 0) return SZ_ERROR_MEM; } #define NUM_FOLDER_CODERS_MAX 32 #define NUM_CODER_STREAMS_MAX 32 +void SzCoderInfo_Init(CSzCoderInfo *p) +{ + Buf_Init(&p->Props); +} + +void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc) +{ + Buf_Free(&p->Props, alloc); + SzCoderInfo_Init(p); +} + +void SzFolder_Init(CSzFolder *p) +{ + p->Coders = 0; + p->BindPairs = 0; + p->PackStreams = 0; + p->UnpackSizes = 0; + p->NumCoders = 0; + p->NumBindPairs = 0; + p->NumPackStreams = 0; + p->UnpackCRCDefined = 0; + p->UnpackCRC = 0; + p->NumUnpackStreams = 0; +} + +void SzFolder_Free(CSzFolder *p, ISzAlloc *alloc) +{ + UInt32 i; + if (p->Coders) + for (i = 0; i < p->NumCoders; i++) + SzCoderInfo_Free(&p->Coders[i], alloc); + IAlloc_Free(alloc, p->Coders); + IAlloc_Free(alloc, p->BindPairs); + IAlloc_Free(alloc, p->PackStreams); + IAlloc_Free(alloc, p->UnpackSizes); + SzFolder_Init(p); +} + +UInt32 SzFolder_GetNumOutStreams(CSzFolder *p) +{ + UInt32 result = 0; + UInt32 i; + for (i = 0; i < p->NumCoders; i++) + result += p->Coders[i].NumOutStreams; + return result; +} + +int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex) +{ + UInt32 i; + for (i = 0; i < p->NumBindPairs; i++) + if (p->BindPairs[i].InIndex == inStreamIndex) + return i; + return -1; +} + + +int SzFolder_FindBindPairForOutStream(CSzFolder *p, UInt32 outStreamIndex) +{ + UInt32 i; + for (i = 0; i < p->NumBindPairs; i++) + if (p->BindPairs[i].OutIndex == outStreamIndex) + return i; + return -1; +} + +UInt64 SzFolder_GetUnpackSize(CSzFolder *p) +{ + int i = (int)SzFolder_GetNumOutStreams(p); + if (i == 0) + return 0; + for (i--; i >= 0; i--) + if (SzFolder_FindBindPairForOutStream(p, i) < 0) + return p->UnpackSizes[i]; + /* throw 1; */ + return 0; +} + +void SzFile_Init(CSzFileItem *p) +{ + p->HasStream = 1; + p->IsDir = 0; + p->IsAnti = 0; + p->CrcDefined = 0; + p->MTimeDefined = 0; +} + +void SzAr_Init(CSzAr *p) +{ + p->PackSizes = 0; + p->PackCRCsDefined = 0; + p->PackCRCs = 0; + p->Folders = 0; + p->Files = 0; + p->NumPackStreams = 0; + p->NumFolders = 0; + p->NumFiles = 0; +} + +void SzAr_Free(CSzAr *p, ISzAlloc *alloc) +{ + UInt32 i; + if (p->Folders) + for (i = 0; i < p->NumFolders; i++) + SzFolder_Free(&p->Folders[i], alloc); + + IAlloc_Free(alloc, p->PackSizes); + IAlloc_Free(alloc, p->PackCRCsDefined); + IAlloc_Free(alloc, p->PackCRCs); + IAlloc_Free(alloc, p->Folders); + IAlloc_Free(alloc, p->Files); + SzAr_Init(p); +} + + void SzArEx_Init(CSzArEx *p) { SzAr_Init(&p->db); @@ -19,6 +136,8 @@ void SzArEx_Init(CSzArEx *p) p->PackStreamStartPositions = 0; p->FolderStartFileIndex = 0; p->FileIndexToFolderIndexMap = 0; + p->FileNameOffsets = 0; + Buf_Init(&p->FileNames); } void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc) @@ -27,6 +146,10 @@ void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc) IAlloc_Free(alloc, p->PackStreamStartPositions); IAlloc_Free(alloc, p->FolderStartFileIndex); IAlloc_Free(alloc, p->FileIndexToFolderIndexMap); + + IAlloc_Free(alloc, p->FileNameOffsets); + Buf_Free(&p->FileNames, alloc); + SzAr_Free(&p->db, alloc); SzArEx_Init(p); } @@ -488,11 +611,11 @@ static SRes SzGetNextFolderItem(CSzData *sd, CSzFolder *folder, ISzAlloc *alloc) return SZ_ERROR_UNSUPPORTED; folder->NumBindPairs = numBindPairs = numOutStreams - 1; - MY_ALLOC(CBindPair, folder->BindPairs, (size_t)numBindPairs, alloc); + MY_ALLOC(CSzBindPair, folder->BindPairs, (size_t)numBindPairs, alloc); for (i = 0; i < numBindPairs; i++) { - CBindPair *bp = folder->BindPairs + i; + CSzBindPair *bp = folder->BindPairs + i; RINOK(SzReadNumber32(sd, &bp->InIndex)); RINOK(SzReadNumber32(sd, &bp->OutIndex)); } @@ -780,81 +903,38 @@ static SRes SzReadStreamsInfo( } } -Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; +size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest) +{ + size_t len = p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex]; + if (dest != 0) + { + size_t i; + const Byte *src = p->FileNames.data + (p->FileNameOffsets[fileIndex] * 2); + for (i = 0; i < len; i++) + dest[i] = GetUi16(src + i * 2); + } + return len; +} -static SRes SzReadFileNames(CSzData *sd, UInt32 numFiles, CSzFileItem *files, ISzAlloc *alloc) +static SRes SzReadFileNames(const Byte *p, size_t size, UInt32 numFiles, size_t *sizes) { UInt32 i; + size_t pos = 0; for (i = 0; i < numFiles; i++) { - UInt32 len = 0; - UInt32 pos = 0; - CSzFileItem *file = files + i; - while (pos + 2 <= sd->Size) + sizes[i] = pos; + for (;;) { - int numAdds; - UInt32 value = (UInt32)(sd->Data[pos] | (((UInt32)sd->Data[pos + 1]) << 8)); - pos += 2; - len++; - if (value == 0) + if (pos >= size) + return SZ_ERROR_ARCHIVE; + if (p[pos * 2] == 0 && p[pos * 2 + 1] == 0) break; - if (value < 0x80) - continue; - if (value >= 0xD800 && value < 0xE000) - { - UInt32 c2; - if (value >= 0xDC00) - return SZ_ERROR_ARCHIVE; - if (pos + 2 > sd->Size) - return SZ_ERROR_ARCHIVE; - c2 = (UInt32)(sd->Data[pos] | (((UInt32)sd->Data[pos + 1]) << 8)); - pos += 2; - if (c2 < 0xDC00 || c2 >= 0xE000) - return SZ_ERROR_ARCHIVE; - value = ((value - 0xD800) << 10) | (c2 - 0xDC00); - } - for (numAdds = 1; numAdds < 5; numAdds++) - if (value < (((UInt32)1) << (numAdds * 5 + 6))) - break; - len += numAdds; - } - - MY_ALLOC(char, file->Name, (size_t)len, alloc); - - len = 0; - while (2 <= sd->Size) - { - int numAdds; - UInt32 value = (UInt32)(sd->Data[0] | (((UInt32)sd->Data[1]) << 8)); - SzSkeepDataSize(sd, 2); - if (value < 0x80) - { - file->Name[len++] = (char)value; - if (value == 0) - break; - continue; - } - if (value >= 0xD800 && value < 0xE000) - { - UInt32 c2 = (UInt32)(sd->Data[0] | (((UInt32)sd->Data[1]) << 8)); - SzSkeepDataSize(sd, 2); - value = ((value - 0xD800) << 10) | (c2 - 0xDC00); - } - for (numAdds = 1; numAdds < 5; numAdds++) - if (value < (((UInt32)1) << (numAdds * 5 + 6))) - break; - file->Name[len++] = (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds))); - do - { - numAdds--; - file->Name[len++] = (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F)); - } - while (numAdds > 0); - - len += numAdds; + pos++; } + pos++; } - return SZ_OK; + sizes[i] = pos; + return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; } static SRes SzReadHeader2( @@ -920,7 +1000,8 @@ static SRes SzReadHeader2( if (type == k7zIdEnd) break; RINOK(SzReadNumber(sd, &size)); - + if (size > sd->Size) + return SZ_ERROR_ARCHIVE; if ((UInt64)(int)type != type) { RINOK(SzSkeepDataSize(sd, size)); @@ -930,8 +1011,16 @@ static SRes SzReadHeader2( { case k7zIdName: { + size_t namesSize; RINOK(SzReadSwitch(sd)); - RINOK(SzReadFileNames(sd, numFiles, files, allocMain)) + namesSize = (size_t)size - 1; + if ((namesSize & 1) != 0) + return SZ_ERROR_ARCHIVE; + if (!Buf_Create(&p->FileNames, namesSize, allocMain)) + return SZ_ERROR_MEM; + MY_ALLOC(size_t, p->FileNameOffsets, numFiles + 1, allocMain); + memcpy(p->FileNames.data, sd->Data, namesSize); + RINOK(SzReadFileNames(sd->Data, namesSize >> 1, numFiles, p->FileNameOffsets)) break; } case k7zIdEmptyStream: @@ -988,8 +1077,8 @@ static SRes SzReadHeader2( { file->IsDir = 0; file->Size = (*unpackSizes)[sizeIndex]; - file->FileCRC = (*digests)[sizeIndex]; - file->FileCRCDefined = (Byte)(*digestsDefined)[sizeIndex]; + file->Crc = (*digests)[sizeIndex]; + file->CrcDefined = (Byte)(*digestsDefined)[sizeIndex]; sizeIndex++; } else @@ -1000,7 +1089,8 @@ static SRes SzReadHeader2( file->IsDir = (Byte)((*emptyFileVector)[emptyFileIndex] ? 0 : 1); emptyFileIndex++; file->Size = 0; - file->FileCRCDefined = 0; + file->Crc = 0; + file->CrcDefined = 0; } } } @@ -1066,7 +1156,7 @@ static SRes SzReadAndDecodePackedStreams2( if (!Buf_Create(outBuffer, (size_t)unpackSize, allocTemp)) return SZ_ERROR_MEM; - res = SzDecode(p->PackSizes, folder, + res = SzFolder_Decode(folder, p->PackSizes, inStream, dataStartPos, outBuffer->data, (size_t)unpackSize, allocTemp); RINOK(res); @@ -1202,3 +1292,85 @@ SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAl SzArEx_Free(p, allocMain); return res; } + +SRes SzArEx_Extract( + const CSzArEx *p, + ILookInStream *inStream, + UInt32 fileIndex, + UInt32 *blockIndex, + Byte **outBuffer, + size_t *outBufferSize, + size_t *offset, + size_t *outSizeProcessed, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt32 folderIndex = p->FileIndexToFolderIndexMap[fileIndex]; + SRes res = SZ_OK; + *offset = 0; + *outSizeProcessed = 0; + if (folderIndex == (UInt32)-1) + { + IAlloc_Free(allocMain, *outBuffer); + *blockIndex = folderIndex; + *outBuffer = 0; + *outBufferSize = 0; + return SZ_OK; + } + + if (*outBuffer == 0 || *blockIndex != folderIndex) + { + CSzFolder *folder = p->db.Folders + folderIndex; + UInt64 unpackSizeSpec = SzFolder_GetUnpackSize(folder); + size_t unpackSize = (size_t)unpackSizeSpec; + UInt64 startOffset = SzArEx_GetFolderStreamPos(p, folderIndex, 0); + + if (unpackSize != unpackSizeSpec) + return SZ_ERROR_MEM; + *blockIndex = folderIndex; + IAlloc_Free(allocMain, *outBuffer); + *outBuffer = 0; + + RINOK(LookInStream_SeekTo(inStream, startOffset)); + + if (res == SZ_OK) + { + *outBufferSize = unpackSize; + if (unpackSize != 0) + { + *outBuffer = (Byte *)IAlloc_Alloc(allocMain, unpackSize); + if (*outBuffer == 0) + res = SZ_ERROR_MEM; + } + if (res == SZ_OK) + { + res = SzFolder_Decode(folder, + p->db.PackSizes + p->FolderStartPackStreamIndex[folderIndex], + inStream, startOffset, + *outBuffer, unpackSize, allocTemp); + if (res == SZ_OK) + { + if (folder->UnpackCRCDefined) + { + if (CrcCalc(*outBuffer, unpackSize) != folder->UnpackCRC) + res = SZ_ERROR_CRC; + } + } + } + } + } + if (res == SZ_OK) + { + UInt32 i; + CSzFileItem *fileItem = p->db.Files + fileIndex; + *offset = 0; + for (i = p->FolderStartFileIndex[folderIndex]; i < fileIndex; i++) + *offset += (UInt32)p->db.Files[i].Size; + *outSizeProcessed = (size_t)fileItem->Size; + if (*offset + *outSizeProcessed > *outBufferSize) + return SZ_ERROR_FAIL; + if (fileItem->CrcDefined && CrcCalc(*outBuffer + *offset, *outSizeProcessed) != fileItem->Crc) + res = SZ_ERROR_CRC; + } + return res; +} diff --git a/C/7zVersion.h b/C/7zVersion.h index 2804bc47..d26e721f 100755 --- a/C/7zVersion.h +++ b/C/7zVersion.h @@ -1,7 +1,7 @@ #define MY_VER_MAJOR 9 -#define MY_VER_MINOR 04 +#define MY_VER_MINOR 06 #define MY_VER_BUILD 0 -#define MY_VERSION "9.04 beta" -#define MY_DATE "2009-05-30" +#define MY_VERSION "9.06 beta" +#define MY_DATE "2009-08-17" #define MY_COPYRIGHT ": Igor Pavlov : Public domain" #define MY_VERSION_COPYRIGHT_DATE MY_VERSION " " MY_COPYRIGHT " : " MY_DATE @@ -1,7 +1,5 @@ /* Aes.c -- AES encryption / decryption -2008-08-05 -Igor Pavlov -Public domain */ +2009-06-10 : Igor Pavlov : Public domain */ #include "Aes.h" #include "CpuArch.h" @@ -49,7 +47,7 @@ void AesGenTables(void) { UInt32 a1 = Sbox[i]; UInt32 a2 = xtime(a1); - UInt32 a3 = xtime(a1) ^ a1; + UInt32 a3 = a2 ^ a1; T[ i] = Ui32(a2, a1, a1, a3); T[0x100 + i] = Ui32(a3, a2, a1, a1); T[0x200 + i] = Ui32(a1, a3, a2, a1); @@ -115,7 +113,7 @@ void Aes_SetKeyEncode(CAes *p, const Byte *key, unsigned keySize) w = p->rkey; for (i = 0; i < keySize; i++, key += 4) - w[i] = Ui32(key[0], key[1], key[2], key[3]); + w[i] = GetUi32(key); for (; i < wSize; i++) { diff --git a/C/Archive/7z/7zDecode.h b/C/Archive/7z/7zDecode.h deleted file mode 100755 index 0d77970d..00000000 --- a/C/Archive/7z/7zDecode.h +++ /dev/null @@ -1,21 +0,0 @@ -/* 7zDecode.h -- Decoding from 7z folder -2009-02-07 : Igor Pavlov : Public domain */ - -#ifndef __7Z_DECODE_H -#define __7Z_DECODE_H - -#include "7zItem.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SRes SzDecode(const UInt64 *packSizes, const CSzFolder *folder, - ILookInStream *stream, UInt64 startPos, - Byte *outBuffer, size_t outSize, ISzAlloc *allocMain); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/C/Archive/7z/7zExtract.c b/C/Archive/7z/7zExtract.c deleted file mode 100755 index ff79802b..00000000 --- a/C/Archive/7z/7zExtract.c +++ /dev/null @@ -1,93 +0,0 @@ -/* 7zExtract.c -- Extracting from 7z archive -2008-11-23 : Igor Pavlov : Public domain */ - -#include "../../7zCrc.h" -#include "7zDecode.h" -#include "7zExtract.h" - -SRes SzAr_Extract( - const CSzArEx *p, - ILookInStream *inStream, - UInt32 fileIndex, - UInt32 *blockIndex, - Byte **outBuffer, - size_t *outBufferSize, - size_t *offset, - size_t *outSizeProcessed, - ISzAlloc *allocMain, - ISzAlloc *allocTemp) -{ - UInt32 folderIndex = p->FileIndexToFolderIndexMap[fileIndex]; - SRes res = SZ_OK; - *offset = 0; - *outSizeProcessed = 0; - if (folderIndex == (UInt32)-1) - { - IAlloc_Free(allocMain, *outBuffer); - *blockIndex = folderIndex; - *outBuffer = 0; - *outBufferSize = 0; - return SZ_OK; - } - - if (*outBuffer == 0 || *blockIndex != folderIndex) - { - CSzFolder *folder = p->db.Folders + folderIndex; - UInt64 unpackSizeSpec = SzFolder_GetUnpackSize(folder); - size_t unpackSize = (size_t)unpackSizeSpec; - UInt64 startOffset = SzArEx_GetFolderStreamPos(p, folderIndex, 0); - - if (unpackSize != unpackSizeSpec) - return SZ_ERROR_MEM; - *blockIndex = folderIndex; - IAlloc_Free(allocMain, *outBuffer); - *outBuffer = 0; - - RINOK(LookInStream_SeekTo(inStream, startOffset)); - - if (res == SZ_OK) - { - *outBufferSize = unpackSize; - if (unpackSize != 0) - { - *outBuffer = (Byte *)IAlloc_Alloc(allocMain, unpackSize); - if (*outBuffer == 0) - res = SZ_ERROR_MEM; - } - if (res == SZ_OK) - { - res = SzDecode(p->db.PackSizes + - p->FolderStartPackStreamIndex[folderIndex], folder, - inStream, startOffset, - *outBuffer, unpackSize, allocTemp); - if (res == SZ_OK) - { - if (folder->UnpackCRCDefined) - { - if (CrcCalc(*outBuffer, unpackSize) != folder->UnpackCRC) - res = SZ_ERROR_CRC; - } - } - } - } - } - if (res == SZ_OK) - { - UInt32 i; - CSzFileItem *fileItem = p->db.Files + fileIndex; - *offset = 0; - for (i = p->FolderStartFileIndex[folderIndex]; i < fileIndex; i++) - *offset += (UInt32)p->db.Files[i].Size; - *outSizeProcessed = (size_t)fileItem->Size; - if (*offset + *outSizeProcessed > *outBufferSize) - return SZ_ERROR_FAIL; - { - if (fileItem->FileCRCDefined) - { - if (CrcCalc(*outBuffer + *offset, *outSizeProcessed) != fileItem->FileCRC) - res = SZ_ERROR_CRC; - } - } - } - return res; -} diff --git a/C/Archive/7z/7zExtract.h b/C/Archive/7z/7zExtract.h deleted file mode 100755 index 6f46bfa6..00000000 --- a/C/Archive/7z/7zExtract.h +++ /dev/null @@ -1,49 +0,0 @@ -/* 7zExtract.h -- Extracting from 7z archive -2009-02-07 : Igor Pavlov : Public domain */ - -#ifndef __7Z_EXTRACT_H -#define __7Z_EXTRACT_H - -#include "7zIn.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - SzExtract extracts file from archive - - *outBuffer must be 0 before first call for each new archive. - - Extracting cache: - If you need to decompress more than one file, you can send - these values from previous call: - *blockIndex, - *outBuffer, - *outBufferSize - You can consider "*outBuffer" as cache of solid block. If your archive is solid, - it will increase decompression speed. - - If you use external function, you can declare these 3 cache variables - (blockIndex, outBuffer, outBufferSize) as static in that external function. - - Free *outBuffer and set *outBuffer to 0, if you want to flush cache. -*/ - -SRes SzAr_Extract( - const CSzArEx *db, - ILookInStream *inStream, - UInt32 fileIndex, /* index of file */ - UInt32 *blockIndex, /* index of solid block */ - Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ - size_t *outBufferSize, /* buffer size for output buffer */ - size_t *offset, /* offset of stream for required file in *outBuffer */ - size_t *outSizeProcessed, /* size of file in *outBuffer */ - ISzAlloc *allocMain, - ISzAlloc *allocTemp); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/C/Archive/7z/7zHeader.c b/C/Archive/7z/7zHeader.c deleted file mode 100755 index e48faa48..00000000 --- a/C/Archive/7z/7zHeader.c +++ /dev/null @@ -1,6 +0,0 @@ -/* 7zHeader.c -- 7z Headers -2008-10-04 : Igor Pavlov : Public domain */ - -#include "7zHeader.h" - -Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; diff --git a/C/Archive/7z/7zHeader.h b/C/Archive/7z/7zHeader.h deleted file mode 100755 index bc117d2e..00000000 --- a/C/Archive/7z/7zHeader.h +++ /dev/null @@ -1,65 +0,0 @@ -/* 7zHeader.h -- 7z Headers -2009-02-07 : Igor Pavlov : Public domain */ - -#ifndef __7Z_HEADER_H -#define __7Z_HEADER_H - -#include "../../Types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define k7zSignatureSize 6 -extern Byte k7zSignature[k7zSignatureSize]; - -#define k7zMajorVersion 0 - -#define k7zStartHeaderSize 0x20 - -enum EIdEnum -{ - k7zIdEnd, - - k7zIdHeader, - - k7zIdArchiveProperties, - - k7zIdAdditionalStreamsInfo, - k7zIdMainStreamsInfo, - k7zIdFilesInfo, - - k7zIdPackInfo, - k7zIdUnpackInfo, - k7zIdSubStreamsInfo, - - k7zIdSize, - k7zIdCRC, - - k7zIdFolder, - - k7zIdCodersUnpackSize, - k7zIdNumUnpackStream, - - k7zIdEmptyStream, - k7zIdEmptyFile, - k7zIdAnti, - - k7zIdName, - k7zIdCTime, - k7zIdATime, - k7zIdMTime, - k7zIdWinAttributes, - k7zIdComment, - - k7zIdEncodedHeader, - - k7zIdStartPos, - k7zIdDummy -}; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/C/Archive/7z/7zIn.h b/C/Archive/7z/7zIn.h deleted file mode 100755 index 50db4d38..00000000 --- a/C/Archive/7z/7zIn.h +++ /dev/null @@ -1,49 +0,0 @@ -/* 7zIn.h -- 7z Input -2009-02-07 : Igor Pavlov : Public domain */ - -#ifndef __7Z_IN_H -#define __7Z_IN_H - -#include "7zHeader.h" -#include "7zItem.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct -{ - CSzAr db; - - UInt64 startPosAfterHeader; - UInt64 dataPos; - - UInt32 *FolderStartPackStreamIndex; - UInt64 *PackStreamStartPositions; - UInt32 *FolderStartFileIndex; - UInt32 *FileIndexToFolderIndexMap; -} CSzArEx; - -void SzArEx_Init(CSzArEx *p); -void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc); -UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); -int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); - -/* -Errors: -SZ_ERROR_NO_ARCHIVE -SZ_ERROR_ARCHIVE -SZ_ERROR_UNSUPPORTED -SZ_ERROR_MEM -SZ_ERROR_CRC -SZ_ERROR_INPUT_EOF -SZ_ERROR_FAIL -*/ - -SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/C/Archive/7z/7zItem.c b/C/Archive/7z/7zItem.c deleted file mode 100755 index db44571e..00000000 --- a/C/Archive/7z/7zItem.c +++ /dev/null @@ -1,127 +0,0 @@ -/* 7zItem.c -- 7z Items -2008-10-04 : Igor Pavlov : Public domain */ - -#include "7zItem.h" - -void SzCoderInfo_Init(CSzCoderInfo *p) -{ - Buf_Init(&p->Props); -} - -void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc) -{ - Buf_Free(&p->Props, alloc); - SzCoderInfo_Init(p); -} - -void SzFolder_Init(CSzFolder *p) -{ - p->Coders = 0; - p->BindPairs = 0; - p->PackStreams = 0; - p->UnpackSizes = 0; - p->NumCoders = 0; - p->NumBindPairs = 0; - p->NumPackStreams = 0; - p->UnpackCRCDefined = 0; - p->UnpackCRC = 0; - p->NumUnpackStreams = 0; -} - -void SzFolder_Free(CSzFolder *p, ISzAlloc *alloc) -{ - UInt32 i; - if (p->Coders) - for (i = 0; i < p->NumCoders; i++) - SzCoderInfo_Free(&p->Coders[i], alloc); - IAlloc_Free(alloc, p->Coders); - IAlloc_Free(alloc, p->BindPairs); - IAlloc_Free(alloc, p->PackStreams); - IAlloc_Free(alloc, p->UnpackSizes); - SzFolder_Init(p); -} - -UInt32 SzFolder_GetNumOutStreams(CSzFolder *p) -{ - UInt32 result = 0; - UInt32 i; - for (i = 0; i < p->NumCoders; i++) - result += p->Coders[i].NumOutStreams; - return result; -} - -int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex) -{ - UInt32 i; - for (i = 0; i < p->NumBindPairs; i++) - if (p->BindPairs[i].InIndex == inStreamIndex) - return i; - return -1; -} - - -int SzFolder_FindBindPairForOutStream(CSzFolder *p, UInt32 outStreamIndex) -{ - UInt32 i; - for (i = 0; i < p->NumBindPairs; i++) - if (p->BindPairs[i].OutIndex == outStreamIndex) - return i; - return -1; -} - -UInt64 SzFolder_GetUnpackSize(CSzFolder *p) -{ - int i = (int)SzFolder_GetNumOutStreams(p); - if (i == 0) - return 0; - for (i--; i >= 0; i--) - if (SzFolder_FindBindPairForOutStream(p, i) < 0) - return p->UnpackSizes[i]; - /* throw 1; */ - return 0; -} - -void SzFile_Init(CSzFileItem *p) -{ - p->HasStream = 1; - p->IsDir = 0; - p->IsAnti = 0; - p->FileCRCDefined = 0; - p->MTimeDefined = 0; - p->Name = 0; -} - -static void SzFile_Free(CSzFileItem *p, ISzAlloc *alloc) -{ - IAlloc_Free(alloc, p->Name); - SzFile_Init(p); -} - -void SzAr_Init(CSzAr *p) -{ - p->PackSizes = 0; - p->PackCRCsDefined = 0; - p->PackCRCs = 0; - p->Folders = 0; - p->Files = 0; - p->NumPackStreams = 0; - p->NumFolders = 0; - p->NumFiles = 0; -} - -void SzAr_Free(CSzAr *p, ISzAlloc *alloc) -{ - UInt32 i; - if (p->Folders) - for (i = 0; i < p->NumFolders; i++) - SzFolder_Free(&p->Folders[i], alloc); - if (p->Files) - for (i = 0; i < p->NumFiles; i++) - SzFile_Free(&p->Files[i], alloc); - IAlloc_Free(alloc, p->PackSizes); - IAlloc_Free(alloc, p->PackCRCsDefined); - IAlloc_Free(alloc, p->PackCRCs); - IAlloc_Free(alloc, p->Folders); - IAlloc_Free(alloc, p->Files); - SzAr_Init(p); -} diff --git a/C/Archive/7z/7zItem.h b/C/Archive/7z/7zItem.h deleted file mode 100755 index ce7288c2..00000000 --- a/C/Archive/7z/7zItem.h +++ /dev/null @@ -1,92 +0,0 @@ -/* 7zItem.h -- 7z Items -2009-02-07 : Igor Pavlov : Public domain */ - -#ifndef __7Z_ITEM_H -#define __7Z_ITEM_H - -#include "../../7zBuf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct -{ - UInt32 NumInStreams; - UInt32 NumOutStreams; - UInt64 MethodID; - CBuf Props; -} CSzCoderInfo; - -void SzCoderInfo_Init(CSzCoderInfo *p); -void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc); - -typedef struct -{ - UInt32 InIndex; - UInt32 OutIndex; -} CBindPair; - -typedef struct -{ - CSzCoderInfo *Coders; - CBindPair *BindPairs; - UInt32 *PackStreams; - UInt64 *UnpackSizes; - UInt32 NumCoders; - UInt32 NumBindPairs; - UInt32 NumPackStreams; - int UnpackCRCDefined; - UInt32 UnpackCRC; - - UInt32 NumUnpackStreams; -} CSzFolder; - -void SzFolder_Init(CSzFolder *p); -UInt64 SzFolder_GetUnpackSize(CSzFolder *p); -int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex); -UInt32 SzFolder_GetNumOutStreams(CSzFolder *p); -UInt64 SzFolder_GetUnpackSize(CSzFolder *p); - -typedef struct -{ - UInt32 Low; - UInt32 High; -} CNtfsFileTime; - -typedef struct -{ - CNtfsFileTime MTime; - UInt64 Size; - char *Name; - UInt32 FileCRC; - - Byte HasStream; - Byte IsDir; - Byte IsAnti; - Byte FileCRCDefined; - Byte MTimeDefined; -} CSzFileItem; - -void SzFile_Init(CSzFileItem *p); - -typedef struct -{ - UInt64 *PackSizes; - Byte *PackCRCsDefined; - UInt32 *PackCRCs; - CSzFolder *Folders; - CSzFileItem *Files; - UInt32 NumPackStreams; - UInt32 NumFolders; - UInt32 NumFiles; -} CSzAr; - -void SzAr_Init(CSzAr *p); -void SzAr_Free(CSzAr *p, ISzAlloc *alloc); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/C/CpuArch.h b/C/CpuArch.h index 10ec02b3..13f53dd9 100755 --- a/C/CpuArch.h +++ b/C/CpuArch.h @@ -1,5 +1,5 @@ /* CpuArch.h -2009-03-22 : Igor Pavlov : Public domain */ +2009-08-11 : Igor Pavlov : Public domain */ #ifndef __CPU_ARCH_H #define __CPU_ARCH_H @@ -16,7 +16,19 @@ if LITTLE_ENDIAN_UNALIGN is not defined, it means that we don't know about these properties of platform. */ -#if defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || defined(__i386__) || defined(__x86_64__) +#if defined(_M_X64) || defined(_M_AMD64) || defined(__x86_64__) +#define MY_CPU_AMD64 +#endif + +#if defined(MY_CPU_AMD64) || defined(_M_IA64) +#define MY_CPU_64BIT +#endif + +#if defined(_M_IX86) || defined(__i386__) || defined(MY_CPU_AMD64) +#define MY_CPU_X86_OR_AMD64 +#endif + +#if defined(MY_CPU_X86_OR_AMD64) #define LITTLE_ENDIAN_UNALIGN #endif diff --git a/C/LzmaUtil/Lzma86Enc.h b/C/Lzma86.h index 355bf343..6acbd888 100755 --- a/C/LzmaUtil/Lzma86Enc.h +++ b/C/Lzma86.h @@ -1,14 +1,15 @@ -/* Lzma86Enc.h -- LZMA + x86 (BCJ) Filter Encoder -2009-02-07 : Igor Pavlov : Public domain */ +/* Lzma86.h -- LZMA + x86 (BCJ) Filter +2009-08-14 : Igor Pavlov : Public domain */ -#ifndef __LZMA86_ENC_H -#define __LZMA86_ENC_H +#ifndef __LZMA86_H +#define __LZMA86_H -#include "../Types.h" +#include "Types.h" -#ifdef __cplusplus -extern "C" { -#endif +EXTERN_C_BEGIN + +#define LZMA86_SIZE_OFFSET (1 + 5) +#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8) /* It's an example for LZMA + x86 Filter use. @@ -16,8 +17,8 @@ You can use .lzma86 extension, if you write that stream to file. .lzma86 header adds one additional byte to standard .lzma header. .lzma86 header (14 bytes): Offset Size Description - 0 1 = 0 - no filter, - = 1 - x86 filter + 0 1 = 0 - no filter, pure LZMA + = 1 - x86 filter + LZMA 1 1 lc, lp and pb in encoded form 2 4 dictSize (little endian) 6 8 uncompressed size (little endian) @@ -27,7 +28,6 @@ Lzma86_Encode ------------- level - compression level: 0 <= level <= 9, the default value for "level" is 5. - dictSize - The dictionary size in bytes. The maximum value is 128 MB = (1 << 27) bytes for 32-bit version 1 GB = (1 << 30) bytes for 64-bit version @@ -71,8 +71,41 @@ enum ESzFilterMode SRes Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, int level, UInt32 dictSize, int filterMode); -#ifdef __cplusplus -} -#endif + +/* +Lzma86_GetUnpackSize: + In: + src - input data + srcLen - input data size + Out: + unpackSize - size of uncompressed stream + Return code: + SZ_OK - OK + SZ_ERROR_INPUT_EOF - Error in headers +*/ + +SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize); + +/* +Lzma86_Decode: + In: + dest - output data + destLen - output data size + src - input data + srcLen - input data size + Out: + destLen - processed output size + srcLen - processed input size + Return code: + SZ_OK - OK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - unsupported file + SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer +*/ + +SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen); + +EXTERN_C_END #endif diff --git a/C/LzmaUtil/Lzma86Dec.c b/C/Lzma86Dec.c index b801dd1c..fe772609 100755 --- a/C/LzmaUtil/Lzma86Dec.c +++ b/C/Lzma86Dec.c @@ -1,20 +1,14 @@ /* Lzma86Dec.c -- LZMA + x86 (BCJ) Filter Decoder -2008-04-07 -Igor Pavlov -Public domain */ +2009-08-14 : Igor Pavlov : Public domain */ -#include "Lzma86Dec.h" +#include "Lzma86.h" -#include "../Alloc.h" -#include "../Bra.h" -#include "../LzmaDec.h" - -#define LZMA86_SIZE_OFFSET (1 + LZMA_PROPS_SIZE) -#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8) +#include "Alloc.h" +#include "Bra.h" +#include "LzmaDec.h" static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); } static void SzFree(void *p, void *address) { p = p; MyFree(address); } -static ISzAlloc g_Alloc = { SzAlloc, SzFree }; SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize) { @@ -29,6 +23,7 @@ SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize) SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen) { + ISzAlloc g_Alloc = { SzAlloc, SzFree }; SRes res; int useFilter; SizeT inSizePure; diff --git a/C/LzmaUtil/Lzma86Enc.c b/C/Lzma86Enc.c index efc81ea3..2ea4ac2d 100755 --- a/C/LzmaUtil/Lzma86Enc.c +++ b/C/Lzma86Enc.c @@ -1,28 +1,23 @@ /* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder -2008-08-05 -Igor Pavlov -Public domain */ +2009-08-14 : Igor Pavlov : Public domain */ #include <string.h> -#include "Lzma86Enc.h" +#include "Lzma86.h" -#include "../Alloc.h" -#include "../Bra.h" -#include "../LzmaEnc.h" +#include "Alloc.h" +#include "Bra.h" +#include "LzmaEnc.h" #define SZE_OUT_OVERFLOW SZE_DATA_ERROR static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); } static void SzFree(void *p, void *address) { p = p; MyFree(address); } -static ISzAlloc g_Alloc = { SzAlloc, SzFree }; - -#define LZMA86_SIZE_OFFSET (1 + LZMA_PROPS_SIZE) -#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8) int Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, int level, UInt32 dictSize, int filterMode) { + ISzAlloc g_Alloc = { SzAlloc, SzFree }; size_t outSize2 = *destLen; Byte *filteredStream; Bool useFilter; diff --git a/C/LzmaUtil/Lzma86Dec.h b/C/LzmaUtil/Lzma86Dec.h deleted file mode 100755 index 138ce1ff..00000000 --- a/C/LzmaUtil/Lzma86Dec.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Lzma86Dec.h -- LZMA + x86 (BCJ) Filter Decoder -2009-02-07 : Igor Pavlov : Public domain */ - -#ifndef __LZMA86_DEC_H -#define __LZMA86_DEC_H - -#include "../Types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* -Lzma86_GetUnpackSize: - In: - src - input data - srcLen - input data size - Out: - unpackSize - size of uncompressed stream - Return code: - SZ_OK - OK - SZ_ERROR_INPUT_EOF - Error in headers -*/ - -SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize); - -/* -Lzma86_Decode: - In: - dest - output data - destLen - output data size - src - input data - srcLen - input data size - Out: - destLen - processed output size - srcLen - processed input size - Return code: - SZ_OK - OK - SZ_ERROR_DATA - Data error - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_UNSUPPORTED - unsupported file - SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer -*/ - -SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/C/LzmaUtil/makefile.gcc b/C/LzmaUtil/makefile.gcc deleted file mode 100755 index 9fcdeadb..00000000 --- a/C/LzmaUtil/makefile.gcc +++ /dev/null @@ -1,44 +0,0 @@ -PROG = lzma -CXX = g++ -LIB = -RM = rm -f -CFLAGS = -c -O2 -Wall - -OBJS = \ - LzmaUtil.o \ - Alloc.o \ - LzFind.o \ - LzmaDec.o \ - LzmaEnc.o \ - 7zFile.o \ - 7zStream.o \ - - -all: $(PROG) - -$(PROG): $(OBJS) - $(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB) $(LIB2) - -LzmaUtil.o: LzmaUtil.c - $(CXX) $(CFLAGS) LzmaUtil.c - -Alloc.o: ../Alloc.c - $(CXX) $(CFLAGS) ../Alloc.c - -LzFind.o: ../LzFind.c - $(CXX) $(CFLAGS) ../LzFind.c - -LzmaDec.o: ../LzmaDec.c - $(CXX) $(CFLAGS) ../LzmaDec.c - -LzmaEnc.o: ../LzmaEnc.c - $(CXX) $(CFLAGS) ../LzmaEnc.c - -7zFile.o: ../7zFile.c - $(CXX) $(CFLAGS) ../7zFile.c - -7zStream.o: ../7zStream.c - $(CXX) $(CFLAGS) ../7zStream.c - -clean: - -$(RM) $(PROG) $(OBJS) diff --git a/C/Threads.c b/C/Threads.c index 562b3484..212032aa 100755 --- a/C/Threads.c +++ b/C/Threads.c @@ -1,7 +1,9 @@ /* Threads.c -- multithreading library -2009-03-27 : Igor Pavlov : Public domain */ +2009-07-20 : Igor Pavlov : Public domain */ +#ifndef _WIN32_WCE #include <process.h> +#endif #include "Threads.h" @@ -29,8 +31,11 @@ WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param) { unsigned threadId; /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */ *p = - /* CreateThread(0, 0, startAddress, param, 0, &threadId); */ + #ifdef UNDER_CE + CreateThread(0, 0, func, param, 0, &threadId); + #else (HANDLE)_beginthreadex(NULL, 0, func, param, 0, &threadId); + #endif /* maybe we must use errno here, but probably GetLastError() is also OK. */ return HandleToWRes(*p); } @@ -1,5 +1,5 @@ /* Types.h -- Basic types -2009-02-07 : Igor Pavlov : Public domain */ +2009-08-14 : Igor Pavlov : Public domain */ #ifndef __7Z_TYPES_H #define __7Z_TYPES_H @@ -10,10 +10,18 @@ #include <windows.h> #endif +#ifndef EXTERN_C_BEGIN #ifdef __cplusplus -extern "C" { +#define EXTERN_C_BEGIN extern "C" { +#define EXTERN_C_END } +#else +#define EXTERN_C_BEGIN +#define EXTERN_C_END +#endif #endif +EXTERN_C_BEGIN + #define SZ_OK 0 #define SZ_ERROR_DATA 1 @@ -209,8 +217,6 @@ typedef struct #define IAlloc_Alloc(p, size) (p)->Alloc((p), size) #define IAlloc_Free(p, a) (p)->Free((p), a) -#ifdef __cplusplus -} -#endif +EXTERN_C_END #endif diff --git a/C/Archive/7z/7z.dsp b/C/Util/7z/7z.dsp index 6d6b8d93..491f3c94 100755 --- a/C/Archive/7z/7z.dsp +++ b/C/Util/7z/7z.dsp @@ -42,7 +42,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FAs /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FAs /YX /FD /c # ADD BASE RSC /l 0x419 /d "NDEBUG" # ADD RSC /l 0x419 /d "NDEBUG" BSC32=bscmake.exe @@ -67,7 +67,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W4 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_SZ_ALLOC_DEBUG2" /D "_SZ_NO_INT_64_A" /YX /FD /GZ /c +# ADD CPP /nologo /W4 /Gm /GX /ZI /Od /D "_DEBUG" /D "_SZ_ALLOC_DEBUG2" /D "_SZ_NO_INT_64_A" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /YX /FD /GZ /c # ADD BASE RSC /l 0x419 /d "_DEBUG" # ADD RSC /l 0x419 /d "_DEBUG" BSC32=bscmake.exe @@ -132,6 +132,10 @@ SOURCE=..\..\Bra86.c # End Source File # Begin Source File +SOURCE=..\..\CpuArch.h +# End Source File +# Begin Source File + SOURCE=..\..\Lzma2Dec.c # End Source File # Begin Source File @@ -153,51 +157,23 @@ SOURCE=..\..\Types.h # End Group # Begin Source File -SOURCE=.\7zAlloc.c -# End Source File -# Begin Source File - -SOURCE=.\7zAlloc.h -# End Source File -# Begin Source File - -SOURCE=.\7zDecode.c -# End Source File -# Begin Source File - -SOURCE=.\7zDecode.h +SOURCE=..\..\7z.h # End Source File # Begin Source File -SOURCE=.\7zExtract.c -# End Source File -# Begin Source File - -SOURCE=.\7zExtract.h -# End Source File -# Begin Source File - -SOURCE=.\7zHeader.c -# End Source File -# Begin Source File - -SOURCE=.\7zHeader.h -# End Source File -# Begin Source File - -SOURCE=.\7zIn.c +SOURCE=.\7zAlloc.c # End Source File # Begin Source File -SOURCE=.\7zIn.h +SOURCE=.\7zAlloc.h # End Source File # Begin Source File -SOURCE=.\7zItem.c +SOURCE=..\..\7zDec.c # End Source File # Begin Source File -SOURCE=.\7zItem.h +SOURCE=..\..\7zIn.c # End Source File # Begin Source File diff --git a/C/Archive/7z/7z.dsw b/C/Util/7z/7z.dsw index 848d13cb..848d13cb 100755 --- a/C/Archive/7z/7z.dsw +++ b/C/Util/7z/7z.dsw diff --git a/C/Archive/7z/7zAlloc.c b/C/Util/7z/7zAlloc.c index 4bfaf42a..4bfaf42a 100755 --- a/C/Archive/7z/7zAlloc.c +++ b/C/Util/7z/7zAlloc.c diff --git a/C/Archive/7z/7zAlloc.h b/C/Util/7z/7zAlloc.h index a5e88e47..a5e88e47 100755 --- a/C/Archive/7z/7zAlloc.h +++ b/C/Util/7z/7zAlloc.h diff --git a/C/Archive/7z/7zMain.c b/C/Util/7z/7zMain.c index ae65125f..585449e3 100755 --- a/C/Archive/7z/7zMain.c +++ b/C/Util/7z/7zMain.c @@ -1,17 +1,16 @@ /* 7zMain.c - Test application for 7z Decoder -2009-04-04 : Igor Pavlov : Public domain */ +2009-08-17 : Igor Pavlov : Public domain */ #include <stdlib.h> #include <stdio.h> #include <string.h> +#include "../../7z.h" #include "../../7zCrc.h" #include "../../7zFile.h" #include "../../7zVersion.h" #include "7zAlloc.h" -#include "7zExtract.h" -#include "7zIn.h" #ifndef USE_WINDOWS_FILE /* for mkdir */ @@ -29,20 +28,162 @@ #define CHAR_PATH_SEPARATOR '/' #endif -static WRes MyCreateDir(const char *name) +static ISzAlloc g_Alloc = { SzAlloc, SzFree }; + +static int Buf_EnsureSize(CBuf *dest, size_t size) +{ + if (dest->size >= size) + return 1; + Buf_Free(dest, &g_Alloc); + return Buf_Create(dest, size, &g_Alloc); +} + +#ifndef _WIN32 + +static Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +static Bool Utf16_To_Utf8(Byte *dest, size_t *destLen, const UInt16 *src, size_t srcLen) +{ + size_t destPos = 0, srcPos = 0; + for (;;) + { + unsigned numAdds; + UInt32 value; + if (srcPos == srcLen) + { + *destLen = destPos; + return True; + } + value = src[srcPos++]; + if (value < 0x80) + { + if (dest) + dest[destPos] = (char)value; + destPos++; + continue; + } + if (value >= 0xD800 && value < 0xE000) + { + UInt32 c2; + if (value >= 0xDC00 || srcPos == srcLen) + break; + c2 = src[srcPos++]; + if (c2 < 0xDC00 || c2 >= 0xE000) + break; + value = ((value - 0xD800) << 10) | (c2 - 0xDC00); + } + for (numAdds = 1; numAdds < 5; numAdds++) + if (value < (((UInt32)1) << (numAdds * 5 + 6))) + break; + if (dest) + dest[destPos] = (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds))); + destPos++; + do + { + numAdds--; + if (dest) + dest[destPos] = (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F)); + destPos++; + } + while (numAdds != 0); + } + *destLen = destPos; + return False; +} + +static SRes Utf16_To_Utf8Buf(CBuf *dest, const UInt16 *src, size_t srcLen) +{ + size_t destLen = 0; + Bool res; + Utf16_To_Utf8(NULL, &destLen, src, srcLen); + destLen += 1; + if (!Buf_EnsureSize(dest, destLen)) + return SZ_ERROR_MEM; + res = Utf16_To_Utf8(dest->data, &destLen, src, srcLen); + dest->data[destLen] = 0; + return res ? SZ_OK : SZ_ERROR_FAIL; +} +#endif + +static WRes Utf16_To_Char(CBuf *buf, const UInt16 *s, int fileMode) +{ + int len = 0; + for (len = 0; s[len] != '\0'; len++); + + #ifdef _WIN32 + { + int size = len * 3 + 100; + if (!Buf_EnsureSize(buf, size)) + return SZ_ERROR_MEM; + { + char defaultChar = '_'; + BOOL defUsed; + int numChars = WideCharToMultiByte(fileMode ? (AreFileApisANSI() ? CP_ACP : CP_OEMCP) : CP_OEMCP, + 0, s, len, (char *)buf->data, size, &defaultChar, &defUsed); + if (numChars == 0 || numChars >= size) + return SZ_ERROR_FAIL; + buf->data[numChars] = 0; + return SZ_OK; + } + } + #else + fileMode = fileMode; + return Utf16_To_Utf8Buf(buf, s, len); + #endif +} + +static WRes MyCreateDir(const UInt16 *name) { #ifdef USE_WINDOWS_FILE - return CreateDirectoryA(name, NULL) ? 0 : GetLastError(); + + return CreateDirectoryW(name, NULL) ? 0 : GetLastError(); + #else + + CBuf buf; + WRes res; + Buf_Init(&buf); + RINOK(Utf16_To_Char(&buf, name, 1)); + + res = #ifdef _WIN32 - return _mkdir(name) + _mkdir((const char *)buf.data) #else - return mkdir(name, 0777) + mkdir((const char *)buf.data, 0777) #endif == 0 ? 0 : errno; + Buf_Free(&buf, &g_Alloc); + return res; + + #endif +} + +static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name) +{ + #ifdef USE_WINDOWS_FILE + return OutFile_OpenW(p, name); + #else + CBuf buf; + WRes res; + Buf_Init(&buf); + RINOK(Utf16_To_Char(&buf, name, 1)); + res = OutFile_Open(p, (const char *)buf.data); + Buf_Free(&buf, &g_Alloc); + return res; #endif } +static void PrintString(const UInt16 *s) +{ + CBuf buf; + Buf_Init(&buf); + if (Utf16_To_Char(&buf, s, 0) == 0) + { + printf("%s", buf.data); + Buf_Free(&buf, &g_Alloc); + } +} + static void ConvertNumberToString(UInt64 value, char *s) { @@ -128,7 +269,7 @@ int MY_CDECL main(int numargs, char *args[]) SRes res; ISzAlloc allocImp; ISzAlloc allocTempImp; - char *temp = NULL; + UInt16 *temp = NULL; size_t tempSize = 0; printf("\n7z ANSI-C Decoder " MY_VERSION_COPYRIGHT_DATE "\n\n"); @@ -149,25 +290,24 @@ int MY_CDECL main(int numargs, char *args[]) return 1; } + allocImp.Alloc = SzAlloc; + allocImp.Free = SzFree; + + allocTempImp.Alloc = SzAllocTemp; + allocTempImp.Free = SzFreeTemp; + if (InFile_Open(&archiveStream.file, args[2])) { PrintError("can not open input file"); return 1; } - FileInStream_CreateVTable(&archiveStream); LookToRead_CreateVTable(&lookStream, False); lookStream.realStream = &archiveStream.s; LookToRead_Init(&lookStream); - allocImp.Alloc = SzAlloc; - allocImp.Free = SzFree; - - allocTempImp.Alloc = SzAllocTemp; - allocTempImp.Free = SzFreeTemp; - CrcGenerateTable(); SzArEx_Init(&db); @@ -180,27 +320,13 @@ int MY_CDECL main(int numargs, char *args[]) else if (strcmp(command, "t") == 0) testCommand = 1; else if (strcmp(command, "e") == 0) extractCommand = 1; else if (strcmp(command, "x") == 0) { extractCommand = 1; fullPaths = 1; } - - if (listCommand) + else { - UInt32 i; - for (i = 0; i < db.db.NumFiles; i++) - { - const CSzFileItem *f = db.db.Files + i; - char s[32], t[32]; - ConvertNumberToString(f->Size, s); - if (f->MTimeDefined) - ConvertFileTimeToString(&f->MTime, t); - else - strcpy(t, " "); - - printf("%s %10s %s", t, s, f->Name); - if (f->IsDir) - printf("/"); - printf("\n"); - } + PrintError("incorrect command"); + res = SZ_ERROR_FAIL; } - else if (testCommand || extractCommand) + + if (res == SZ_OK) { UInt32 i; @@ -214,20 +340,52 @@ int MY_CDECL main(int numargs, char *args[]) for (i = 0; i < db.db.NumFiles; i++) { - size_t offset; - size_t outSizeProcessed; + size_t offset = 0; + size_t outSizeProcessed = 0; const CSzFileItem *f = db.db.Files + i; - if (f->IsDir && !fullPaths) + size_t len; + if (listCommand == 0 && f->IsDir && !fullPaths) + continue; + len = SzArEx_GetFileNameUtf16(&db, i, NULL); + + if (len > tempSize) + { + SzFree(NULL, temp); + tempSize = len; + temp = (UInt16 *)SzAlloc(NULL, tempSize * sizeof(temp[0])); + if (temp == 0) + { + res = SZ_ERROR_MEM; + break; + } + } + + SzArEx_GetFileNameUtf16(&db, i, temp); + if (listCommand) + { + char s[32], t[32]; + ConvertNumberToString(f->Size, s); + if (f->MTimeDefined) + ConvertFileTimeToString(&f->MTime, t); + else + strcpy(t, " "); + + printf("%s %10s ", t, s); + PrintString(temp); + if (f->IsDir) + printf("/"); + printf("\n"); continue; + } printf(testCommand ? - "Testing ": - "Extracting"); - printf(" %s", f->Name); + "Testing ": + "Extracting "); + PrintString(temp); if (f->IsDir) printf("/"); else { - res = SzAr_Extract(&db, &lookStream.s, i, + res = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize, &offset, &outSizeProcessed, &allocImp, &allocTempImp); @@ -238,32 +396,20 @@ int MY_CDECL main(int numargs, char *args[]) { CSzFile outFile; size_t processedSize; - size_t j, nameLen = strlen(f->Name); - const char *destPath; - if (nameLen + 1 > tempSize) - { - SzFree(NULL, temp); - tempSize = nameLen + 1; - temp = (char *)SzAlloc(NULL, tempSize); - if (temp == 0) - { - res = SZ_ERROR_MEM; - break; - } - } - destPath = temp; - strcpy(temp, f->Name); - for (j = 0; j < nameLen; j++) - if (temp[j] == '/') + size_t j; + UInt16 *name = (UInt16 *)temp; + const UInt16 *destPath = (const UInt16 *)name; + for (j = 0; name[j] != 0; j++) + if (name[j] == '/') { if (fullPaths) { - temp[j] = 0; - MyCreateDir(temp); - temp[j] = CHAR_PATH_SEPARATOR; + name[j] = 0; + MyCreateDir(name); + name[j] = CHAR_PATH_SEPARATOR; } else - destPath = temp + j + 1; + destPath = name + j + 1; } if (f->IsDir) @@ -272,15 +418,14 @@ int MY_CDECL main(int numargs, char *args[]) printf("\n"); continue; } - else if (OutFile_Open(&outFile, destPath)) + else if (OutFile_OpenUtf16(&outFile, destPath)) { PrintError("can not open output file"); res = SZ_ERROR_FAIL; break; } processedSize = outSizeProcessed; - if (File_Write(&outFile, outBuffer + offset, &processedSize) != 0 || - processedSize != outSizeProcessed) + if (File_Write(&outFile, outBuffer + offset, &processedSize) != 0 || processedSize != outSizeProcessed) { PrintError("can not write output file"); res = SZ_ERROR_FAIL; @@ -297,11 +442,6 @@ int MY_CDECL main(int numargs, char *args[]) } IAlloc_Free(&allocImp, outBuffer); } - else - { - PrintError("incorrect command"); - res = SZ_ERROR_FAIL; - } } SzArEx_Free(&db, &allocImp); SzFree(NULL, temp); diff --git a/C/Archive/7z/makefile b/C/Util/7z/makefile index cf06c860..fc814dc9 100755 --- a/C/Archive/7z/makefile +++ b/C/Util/7z/makefile @@ -6,20 +6,17 @@ C_OBJS = \ $O\7zBuf.obj \ $O\7zBuf2.obj \ $O\7zCrc.obj \ - $O\LzmaDec.obj \ - $O\Lzma2Dec.obj \ - $O\Bra86.obj \ - $O\Bcj2.obj \ $O\7zFile.obj \ + $O\7zDec.obj \ + $O\7zIn.obj \ $O\7zStream.obj \ + $O\Bcj2.obj \ + $O\Bra86.obj \ + $O\Lzma2Dec.obj \ + $O\LzmaDec.obj \ 7Z_OBJS = \ $O\7zAlloc.obj \ - $O\7zDecode.obj \ - $O\7zExtract.obj \ - $O\7zHeader.obj \ - $O\7zIn.obj \ - $O\7zItem.obj \ $O\7zMain.obj \ OBJS = \ diff --git a/C/Archive/7z/makefile.gcc b/C/Util/7z/makefile.gcc index 29d2aa02..25c0e69b 100755 --- a/C/Archive/7z/makefile.gcc +++ b/C/Util/7z/makefile.gcc @@ -4,7 +4,7 @@ LIB = RM = rm -f CFLAGS = -c -O2 -Wall -OBJS = 7zAlloc.o 7zBuf.o 7zBuf2.o 7zCrc.o 7zDecode.o 7zExtract.o 7zHeader.o 7zIn.o 7zItem.o 7zMain.o LzmaDec.o Lzma2Dec.o Bra86.o Bcj2.o 7zFile.o 7zStream.o +OBJS = 7zAlloc.o 7zBuf.o 7zBuf2.o 7zCrc.o 7zDec.o 7zIn.o 7zMain.o LzmaDec.o Lzma2Dec.o Bra86.o Bcj2.o 7zFile.o 7zStream.o all: $(PROG) @@ -23,20 +23,11 @@ $(PROG): $(OBJS) 7zCrc.o: ../../7zCrc.c $(CXX) $(CFLAGS) ../../7zCrc.c -7zDecode.o: 7zDecode.c - $(CXX) $(CFLAGS) 7zDecode.c +7zDec.o: ../../7zDec.c + $(CXX) $(CFLAGS) ../../7zDec.c -7zExtract.o: 7zExtract.c - $(CXX) $(CFLAGS) 7zExtract.c - -7zHeader.o: 7zHeader.c - $(CXX) $(CFLAGS) 7zHeader.c - -7zIn.o: 7zIn.c - $(CXX) $(CFLAGS) 7zIn.c - -7zItem.o: 7zItem.c - $(CXX) $(CFLAGS) 7zItem.c +7zIn.o: ../../7zIn.c + $(CXX) $(CFLAGS) ../../7zIn.c 7zMain.o: 7zMain.c $(CXX) $(CFLAGS) 7zMain.c diff --git a/C/LzmaUtil/LzmaUtil.c b/C/Util/Lzma/LzmaUtil.c index 016d7b04..0d0e3ee7 100755 --- a/C/LzmaUtil/LzmaUtil.c +++ b/C/Util/Lzma/LzmaUtil.c @@ -1,5 +1,5 @@ /* LzmaUtil.c -- Test application for LZMA compression -2008-11-23 : Igor Pavlov : Public domain */ +2009-08-14 : Igor Pavlov : Public domain */ #define _CRT_SECURE_NO_WARNINGS @@ -7,11 +7,11 @@ #include <stdlib.h> #include <string.h> -#include "../Alloc.h" -#include "../7zFile.h" -#include "../7zVersion.h" -#include "../LzmaDec.h" -#include "../LzmaEnc.h" +#include "../../Alloc.h" +#include "../../7zFile.h" +#include "../../7zVersion.h" +#include "../../LzmaDec.h" +#include "../../LzmaEnc.h" const char *kCantReadMessage = "Can not read input file"; const char *kCantWriteMessage = "Can not write output file"; diff --git a/C/LzmaUtil/LzmaUtil.dsp b/C/Util/Lzma/LzmaUtil.dsp index faac2e6e..d10af8b4 100755 --- a/C/LzmaUtil/LzmaUtil.dsp +++ b/C/Util/Lzma/LzmaUtil.dsp @@ -51,7 +51,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\util\lzmac.exe" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\util\7lzma.exe" !ELSEIF "$(CFG)" == "LzmaUtil - Win32 Debug" @@ -76,7 +76,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\util\lzmac.exe" /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\util\7lzma.exe" /pdbtype:sept !ENDIF @@ -86,67 +86,67 @@ LINK32=link.exe # Name "LzmaUtil - Win32 Debug" # Begin Source File -SOURCE=..\7zFile.c +SOURCE=..\..\7zFile.c # End Source File # Begin Source File -SOURCE=..\7zFile.h +SOURCE=..\..\7zFile.h # End Source File # Begin Source File -SOURCE=..\7zStream.c +SOURCE=..\..\7zStream.c # End Source File # Begin Source File -SOURCE=..\7zVersion.h +SOURCE=..\..\7zVersion.h # End Source File # Begin Source File -SOURCE=..\Alloc.c +SOURCE=..\..\Alloc.c # End Source File # Begin Source File -SOURCE=..\Alloc.h +SOURCE=..\..\Alloc.h # End Source File # Begin Source File -SOURCE=..\CpuArch.h +SOURCE=..\..\CpuArch.h # End Source File # Begin Source File -SOURCE=..\LzFind.c +SOURCE=..\..\LzFind.c # End Source File # Begin Source File -SOURCE=..\LzFind.h +SOURCE=..\..\LzFind.h # End Source File # Begin Source File -SOURCE=..\LzFindMt.c +SOURCE=..\..\LzFindMt.c # End Source File # Begin Source File -SOURCE=..\LzFindMt.h +SOURCE=..\..\LzFindMt.h # End Source File # Begin Source File -SOURCE=..\LzHash.h +SOURCE=..\..\LzHash.h # End Source File # Begin Source File -SOURCE=..\LzmaDec.c +SOURCE=..\..\LzmaDec.c # End Source File # Begin Source File -SOURCE=..\LzmaDec.h +SOURCE=..\..\LzmaDec.h # End Source File # Begin Source File -SOURCE=..\LzmaEnc.c +SOURCE=..\..\LzmaEnc.c # End Source File # Begin Source File -SOURCE=..\LzmaEnc.h +SOURCE=..\..\LzmaEnc.h # End Source File # Begin Source File @@ -154,15 +154,15 @@ SOURCE=.\LzmaUtil.c # End Source File # Begin Source File -SOURCE=..\Threads.c +SOURCE=..\..\Threads.c # End Source File # Begin Source File -SOURCE=..\Threads.h +SOURCE=..\..\Threads.h # End Source File # Begin Source File -SOURCE=..\Types.h +SOURCE=..\..\Types.h # End Source File # End Target # End Project diff --git a/C/LzmaUtil/LzmaUtil.dsw b/C/Util/Lzma/LzmaUtil.dsw index c52eaf6d..c52eaf6d 100755 --- a/C/LzmaUtil/LzmaUtil.dsw +++ b/C/Util/Lzma/LzmaUtil.dsw diff --git a/C/LzmaUtil/makefile b/C/Util/Lzma/makefile index fbb98b84..bd55f826 100755 --- a/C/LzmaUtil/makefile +++ b/C/Util/Lzma/makefile @@ -21,9 +21,9 @@ OBJS = \ $(LIB_OBJS) \ $(C_OBJS) \ -!include "../../CPP/Build.mak" +!include "../../../CPP/Build.mak" $(LIB_OBJS): $(*B).c $(COMPL_O2) -$(C_OBJS): ../$(*B).c +$(C_OBJS): ../../$(*B).c $(COMPL_O2) diff --git a/C/Util/Lzma/makefile.gcc b/C/Util/Lzma/makefile.gcc new file mode 100755 index 00000000..9b0c5b7f --- /dev/null +++ b/C/Util/Lzma/makefile.gcc @@ -0,0 +1,44 @@ +PROG = lzma +CXX = g++ +LIB = +RM = rm -f +CFLAGS = -c -O2 -Wall + +OBJS = \ + LzmaUtil.o \ + Alloc.o \ + LzFind.o \ + LzmaDec.o \ + LzmaEnc.o \ + 7zFile.o \ + 7zStream.o \ + + +all: $(PROG) + +$(PROG): $(OBJS) + $(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB) $(LIB2) + +LzmaUtil.o: LzmaUtil.c + $(CXX) $(CFLAGS) LzmaUtil.c + +Alloc.o: ../../Alloc.c + $(CXX) $(CFLAGS) ../../Alloc.c + +LzFind.o: ../../LzFind.c + $(CXX) $(CFLAGS) ../../LzFind.c + +LzmaDec.o: ../../LzmaDec.c + $(CXX) $(CFLAGS) ../../LzmaDec.c + +LzmaEnc.o: ../../LzmaEnc.c + $(CXX) $(CFLAGS) ../../LzmaEnc.c + +7zFile.o: ../../7zFile.c + $(CXX) $(CFLAGS) ../../7zFile.c + +7zStream.o: ../../7zStream.c + $(CXX) $(CFLAGS) ../../7zStream.c + +clean: + -$(RM) $(PROG) $(OBJS) diff --git a/C/LzmaLib/LzmaLib.def b/C/Util/LzmaLib/LzmaLib.def index 8bc6add9..8bc6add9 100755 --- a/C/LzmaLib/LzmaLib.def +++ b/C/Util/LzmaLib/LzmaLib.def diff --git a/C/LzmaLib/LzmaLib.dsp b/C/Util/LzmaLib/LzmaLib.dsp index 3ba6d254..163f6cd8 100755 --- a/C/LzmaLib/LzmaLib.dsp +++ b/C/Util/LzmaLib/LzmaLib.dsp @@ -104,59 +104,59 @@ SOURCE=.\LzmaLibExports.c # End Group # Begin Source File -SOURCE=..\Alloc.c +SOURCE=..\..\Alloc.c # End Source File # Begin Source File -SOURCE=..\Alloc.h +SOURCE=..\..\Alloc.h # End Source File # Begin Source File -SOURCE=..\IStream.h +SOURCE=..\..\IStream.h # End Source File # Begin Source File -SOURCE=..\LzFind.c +SOURCE=..\..\LzFind.c # End Source File # Begin Source File -SOURCE=..\LzFind.h +SOURCE=..\..\LzFind.h # End Source File # Begin Source File -SOURCE=..\LzFindMt.c +SOURCE=..\..\LzFindMt.c # End Source File # Begin Source File -SOURCE=..\LzFindMt.h +SOURCE=..\..\LzFindMt.h # End Source File # Begin Source File -SOURCE=..\LzHash.h +SOURCE=..\..\LzHash.h # End Source File # Begin Source File -SOURCE=..\LzmaDec.c +SOURCE=..\..\LzmaDec.c # End Source File # Begin Source File -SOURCE=..\LzmaDec.h +SOURCE=..\..\LzmaDec.h # End Source File # Begin Source File -SOURCE=..\LzmaEnc.c +SOURCE=..\..\LzmaEnc.c # End Source File # Begin Source File -SOURCE=..\LzmaEnc.h +SOURCE=..\..\LzmaEnc.h # End Source File # Begin Source File -SOURCE=..\LzmaLib.c +SOURCE=..\..\LzmaLib.c # End Source File # Begin Source File -SOURCE=..\LzmaLib.h +SOURCE=..\..\LzmaLib.h # End Source File # Begin Source File @@ -164,15 +164,15 @@ SOURCE=.\resource.rc # End Source File # Begin Source File -SOURCE=..\Threads.c +SOURCE=..\..\Threads.c # End Source File # Begin Source File -SOURCE=..\Threads.h +SOURCE=..\..\Threads.h # End Source File # Begin Source File -SOURCE=..\Types.h +SOURCE=..\..\Types.h # End Source File # End Target # End Project diff --git a/C/LzmaLib/LzmaLib.dsw b/C/Util/LzmaLib/LzmaLib.dsw index 6faf3336..6faf3336 100755 --- a/C/LzmaLib/LzmaLib.dsw +++ b/C/Util/LzmaLib/LzmaLib.dsw diff --git a/C/LzmaLib/LzmaLibExports.c b/C/Util/LzmaLib/LzmaLibExports.c index 845545db..845545db 100755 --- a/C/LzmaLib/LzmaLibExports.c +++ b/C/Util/LzmaLib/LzmaLibExports.c diff --git a/C/LzmaLib/makefile b/C/Util/LzmaLib/makefile index 1e6b40cc..038bc15c 100755 --- a/C/LzmaLib/makefile +++ b/C/Util/LzmaLib/makefile @@ -7,8 +7,6 @@ DEF_FILE = LzmaLib.def CFLAGS = $(CFLAGS) \ -DCOMPRESS_MF_MT \ -LIBS = $(LIBS) oleaut32.lib - LIB_OBJS = \ $O\LzmaLibExports.obj \ @@ -26,12 +24,12 @@ OBJS = \ $(C_OBJS) \ $O\resource.res -!include "../../CPP/Build.mak" +!include "../../../CPP/Build.mak" $(SLIBPATH): $O $(OBJS) lib -out:$(SLIBPATH) $(OBJS) $(LIBS) $(LIB_OBJS): $(*B).c $(COMPL_O2) -$(C_OBJS): ../$(*B).c +$(C_OBJS): ../../$(*B).c $(COMPL_O2) diff --git a/C/LzmaLib/resource.rc b/C/Util/LzmaLib/resource.rc index 1e489161..864b5287 100755 --- a/C/LzmaLib/resource.rc +++ b/C/Util/LzmaLib/resource.rc @@ -1,4 +1,4 @@ -#include "../../CPP/7zip/MyVersionInfo.rc" +#include "../../../CPP/7zip/MyVersionInfo.rc" MY_VERSION_INFO_DLL("LZMA library", "LZMA") @@ -1,5 +1,5 @@ /* XzDec.c -- Xz Decode -2009-05-29 : Igor Pavlov : Public domain */ +2009-06-08 : Igor Pavlov : Public domain */ /* #define XZ_DUMP */ @@ -291,9 +291,10 @@ static void Lzma2State_Init(void *pp) } static SRes Lzma2State_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - int srcWasFinished, ELzmaFinishMode finishMode, int *wasFinished) + int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished) { ELzmaStatus status; + /* ELzmaFinishMode fm = (finishMode == LZMA_FINISH_ANY) ? LZMA_FINISH_ANY : LZMA_FINISH_END; */ SRes res = Lzma2Dec_DecodeToBuf((CLzma2Dec *)pp, dest, destLen, src, srcLen, finishMode, &status); srcWasFinished = srcWasFinished; *wasFinished = (status == LZMA_STATUS_FINISHED_WITH_MARK); @@ -373,7 +374,7 @@ SRes MixCoder_SetFromMethod(CMixCoder *p, int coderIndex, UInt64 methodId) SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, int srcWasFinished, - ELzmaFinishMode finishMode, ECoderStatus *status) + ECoderFinishMode finishMode, ECoderStatus *status) { SizeT destLenOrig = *destLen; SizeT srcLenOrig = *srcLen; @@ -1,5 +1,5 @@ /* XzEnc.c -- Xz Encode -2009-05-26 : Igor Pavlov : Public domain */ +2009-06-04 : Igor Pavlov : Public domain */ #include <stdlib.h> #include <string.h> @@ -442,7 +442,7 @@ static SRes Xz_Compress(CXzStream *xz, { UInt64 packPos = seqSizeOutStream.processed; - HRESULT res = Lzma2Enc_Encode(lzmaf->lzma2, &seqSizeOutStream.p, + SRes res = Lzma2Enc_Encode(lzmaf->lzma2, &seqSizeOutStream.p, #ifdef USE_SUBBLOCK useSubblock ? &lzmaf->sb.p: #endif @@ -1,10 +1,11 @@ /* XzIn.c - Xz input -2009-04-15 : Igor Pavlov : Public domain */ +2009-06-19 : Igor Pavlov : Public domain */ -#include "Xz.h" +#include <string.h> #include "7zCrc.h" #include "CpuArch.h" +#include "Xz.h" SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream) { diff --git a/CPP/7zip/Archive/7z/7zEncode.cpp b/CPP/7zip/Archive/7z/7zEncode.cpp index c97f893b..86753acd 100755 --- a/CPP/7zip/Archive/7z/7zEncode.cpp +++ b/CPP/7zip/Archive/7z/7zEncode.cpp @@ -164,8 +164,7 @@ HRESULT CEncoder::Encode( } for (i = 1; i < _bindInfo.OutStreams.Size(); i++) { - CSequentialOutTempBufferImp *tempBufferSpec = - new CSequentialOutTempBufferImp; + CSequentialOutTempBufferImp *tempBufferSpec = new CSequentialOutTempBufferImp; CMyComPtr<ISequentialOutStream> tempBuffer = tempBufferSpec; tempBufferSpec->Init(&inOutTempBuffers[i - 1]); tempBuffers.Add(tempBuffer); @@ -260,9 +259,7 @@ HRESULT CEncoder::Encode( for (i = 1; i < _bindInfo.OutStreams.Size(); i++) { CInOutTempBuffer &inOutTempBuffer = inOutTempBuffers[i - 1]; - inOutTempBuffer.FlushWrite(); - inOutTempBuffer.InitReading(); - inOutTempBuffer.WriteToStream(outStream); + RINOK(inOutTempBuffer.WriteToStream(outStream)); packSizes.Add(inOutTempBuffer.GetDataSize()); } diff --git a/CPP/7zip/Archive/7z/7zExtract.cpp b/CPP/7zip/Archive/7z/7zExtract.cpp index 06e9ef97..1b0f9ea1 100755 --- a/CPP/7zip/Archive/7z/7zExtract.cpp +++ b/CPP/7zip/Archive/7z/7zExtract.cpp @@ -44,7 +44,7 @@ struct CExtractFolderInfo }; }; -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, Int32 testModeSpec, IArchiveExtractCallback *extractCallbackSpec) { COM_TRY_BEGIN @@ -52,7 +52,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec; UInt64 importantTotalUnpacked = 0; - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = #ifdef _7Z_VOL @@ -244,25 +244,25 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (result == S_FALSE) { - RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError)); + RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kDataError)); continue; } if (result == E_NOTIMPL) { - RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kUnSupportedMethod)); continue; } if (result != S_OK) return result; if (folderOutStream->WasWritingFinished() != S_OK) { - RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError)); + RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kDataError)); continue; } } catch(...) { - RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError)); + RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kDataError)); continue; } } diff --git a/CPP/7zip/Archive/7z/7zFolderOutStream.cpp b/CPP/7zip/Archive/7z/7zFolderOutStream.cpp index 75505863..c5dbfa6d 100755 --- a/CPP/7zip/Archive/7z/7zFolderOutStream.cpp +++ b/CPP/7zip/Archive/7z/7zFolderOutStream.cpp @@ -37,9 +37,9 @@ HRESULT CFolderOutStream::Init( HRESULT CFolderOutStream::OpenFile() { Int32 askMode = ((*_extractStatuses)[_currentIndex]) ? (_testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract): - NArchive::NExtract::NAskMode::kSkip; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract) : + NExtract::NAskMode::kSkip; CMyComPtr<ISequentialOutStream> realOutStream; UInt32 index = _startIndex + _currentIndex; RINOK(_extractCallback->GetStream(_ref2Offset + index, &realOutStream, askMode)); @@ -48,9 +48,9 @@ HRESULT CFolderOutStream::OpenFile() _fileIsOpen = true; const CFileItem &fi = _db->Files[index]; _rem = fi.Size; - if (askMode == NArchive::NExtract::NAskMode::kExtract && !realOutStream && + if (askMode == NExtract::NAskMode::kExtract && !realOutStream && !_db->IsItemAnti(index) && !fi.IsDir) - askMode = NArchive::NExtract::NAskMode::kSkip; + askMode = NExtract::NAskMode::kSkip; return _extractCallback->PrepareOperation(askMode); } @@ -67,8 +67,8 @@ HRESULT CFolderOutStream::CloseFileAndSetResult() const CFileItem &fi = _db->Files[_startIndex + _currentIndex]; return CloseFileAndSetResult( (fi.IsDir || !fi.CrcDefined || !_checkCrc || fi.Crc == _crcStreamSpec->GetCRC()) ? - NArchive::NExtract::NOperationResult::kOK : - NArchive::NExtract::NOperationResult::kCRCError); + NExtract::NOperationResult::kOK : + NExtract::NOperationResult::kCRCError); } HRESULT CFolderOutStream::ProcessEmptyFiles() diff --git a/CPP/7zip/Archive/7z/7zHandler.cpp b/CPP/7zip/Archive/7z/7zHandler.cpp index 6f0cf6b2..136d0c5f 100755 --- a/CPP/7zip/Archive/7z/7zHandler.cpp +++ b/CPP/7zip/Archive/7z/7zHandler.cpp @@ -300,11 +300,11 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *va else if (coder.MethodID == k_PPMD && coder.Props.GetCapacity() == 5) { Byte order = *(const Byte *)coder.Props; - methodsString += L'o'; - methodsString += ConvertUInt32ToString(order); - methodsString += L":mem"; + propsString = L'o'; + propsString += ConvertUInt32ToString(order); + propsString += L":mem"; UInt32 dicSize = GetUi32((const Byte *)coder.Props + 1); - propsString = GetStringForSizeValue(dicSize); + propsString += GetStringForSizeValue(dicSize); } else if (coder.MethodID == k_AES && coder.Props.GetCapacity() >= 1) { diff --git a/CPP/7zip/Archive/7z/7zHandlerOut.cpp b/CPP/7zip/Archive/7z/7zHandlerOut.cpp index e2c250ab..813510c8 100755 --- a/CPP/7zip/Archive/7z/7zHandlerOut.cpp +++ b/CPP/7zip/Archive/7z/7zHandlerOut.cpp @@ -27,7 +27,13 @@ static const wchar_t *kDefaultMethodName = kLZMAMethodName; static const UInt32 kLzmaAlgorithmX5 = 1; static const wchar_t *kLzmaMatchFinderForHeaders = L"BT2"; -static const UInt32 kDictionaryForHeaders = 1 << 20; +static const UInt32 kDictionaryForHeaders = + #ifdef UNDER_CE + 1 << 18 + #else + 1 << 20 + #endif +; static const UInt32 kNumFastBytesForHeaders = 273; static const UInt32 kAlgorithmForHeaders = kLzmaAlgorithmX5; diff --git a/CPP/7zip/Archive/7z/7zHeader.cpp b/CPP/7zip/Archive/7z/7zHeader.cpp index f232a23e..5b5f2fb3 100755 --- a/CPP/7zip/Archive/7z/7zHeader.cpp +++ b/CPP/7zip/Archive/7z/7zHeader.cpp @@ -1,4 +1,4 @@ -// 7z/Header.cpp +// 7zHeader.cpp #include "StdAfx.h" #include "7zHeader.h" @@ -6,22 +6,9 @@ namespace NArchive { namespace N7z { -Byte kSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C}; +Byte kSignature[kSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; #ifdef _7Z_VOL -Byte kFinishSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C + 1}; +Byte kFinishSignature[kSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C + 1}; #endif -class SignatureInitializer -{ -public: - SignatureInitializer() - { - kSignature[0]--; - #ifdef _7Z_VOL - kFinishSignature[0]--; - #endif - }; -} g_SignatureInitializer; - }} - diff --git a/CPP/7zip/Archive/7z/7zOut.cpp b/CPP/7zip/Archive/7z/7zOut.cpp index e897680e..8d241d74 100755 --- a/CPP/7zip/Archive/7z/7zOut.cpp +++ b/CPP/7zip/Archive/7z/7zOut.cpp @@ -541,16 +541,16 @@ void COutArchive::WriteUInt64DefVector(const CUInt64DefVector &v, Byte type) HRESULT COutArchive::EncodeStream( DECL_EXTERNAL_CODECS_LOC_VARS - CEncoder &encoder, const Byte *data, size_t dataSize, + CEncoder &encoder, const CByteBuffer &data, CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders) { - CSequentialInStreamImp *streamSpec = new CSequentialInStreamImp; + CBufInStream *streamSpec = new CBufInStream; CMyComPtr<ISequentialInStream> stream = streamSpec; - streamSpec->Init(data, dataSize); + streamSpec->Init(data, data.GetCapacity()); CFolder folderItem; folderItem.UnpackCRCDefined = true; - folderItem.UnpackCRC = CrcCalc(data, dataSize); - UInt64 dataSize64 = dataSize; + folderItem.UnpackCRC = CrcCalc(data, data.GetCapacity()); + UInt64 dataSize64 = data.GetCapacity(); RINOK(encoder.Encode( EXTERNAL_CODECS_LOC_VARS stream, NULL, &dataSize64, folderItem, SeqStream, packSizes, NULL)) @@ -558,16 +558,6 @@ HRESULT COutArchive::EncodeStream( return S_OK; } -HRESULT COutArchive::EncodeStream( - DECL_EXTERNAL_CODECS_LOC_VARS - CEncoder &encoder, const CByteBuffer &data, - CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders) -{ - return EncodeStream( - EXTERNAL_CODECS_LOC_VARS - encoder, data, data.GetCapacity(), packSizes, folders); -} - void COutArchive::WriteHeader( const CArchiveDatabase &db, const CHeaderOptions &headerOptions, @@ -804,8 +794,8 @@ HRESULT COutArchive::WriteDatabase( CObjectVector<CFolder> folders; RINOK(EncodeStream( EXTERNAL_CODECS_LOC_VARS - encoder, (const Byte *)buf, - _countSize, packSizes, folders)); + encoder, buf, + packSizes, folders)); _writeToStream = true; diff --git a/CPP/7zip/Archive/7z/7zOut.h b/CPP/7zip/Archive/7z/7zOut.h index 9d8ef308..7b1b528e 100755 --- a/CPP/7zip/Archive/7z/7zOut.h +++ b/CPP/7zip/Archive/7z/7zOut.h @@ -100,10 +100,6 @@ class COutArchive HRESULT EncodeStream( DECL_EXTERNAL_CODECS_LOC_VARS - CEncoder &encoder, const Byte *data, size_t dataSize, - CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders); - HRESULT EncodeStream( - DECL_EXTERNAL_CODECS_LOC_VARS CEncoder &encoder, const CByteBuffer &data, CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders); void WriteHeader( diff --git a/CPP/7zip/Archive/7z/7zRegister.cpp b/CPP/7zip/Archive/7z/7zRegister.cpp index e18c4d74..af59b644 100755 --- a/CPP/7zip/Archive/7z/7zRegister.cpp +++ b/CPP/7zip/Archive/7z/7zRegister.cpp @@ -5,14 +5,14 @@ #include "../../Common/RegisterArc.h" #include "7zHandler.h" -static IInArchive *CreateArc() { return new NArchive::N7z::CHandler; } +static IInArchive *CreateArc() { return new NArchive::N7z::CHandler; } #ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::N7z::CHandler; } +static IOutArchive *CreateArcOut() { return new NArchive::N7z::CHandler; } #else #define CreateArcOut 0 #endif static CArcInfo g_ArcInfo = - { L"7z", L"7z", 0, 7, {'7' + 1 , 'z', 0xBC, 0xAF, 0x27, 0x1C}, 6, false, CreateArc, CreateArcOut }; + { L"7z", L"7z", 0, 7, {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}, 6, false, CreateArc, CreateArcOut }; REGISTER_ARC_DEC_SIG(7z) diff --git a/CPP/7zip/Archive/7z/7zUpdate.cpp b/CPP/7zip/Archive/7z/7zUpdate.cpp index 9506e8f7..d1082808 100755 --- a/CPP/7zip/Archive/7z/7zUpdate.cpp +++ b/CPP/7zip/Archive/7z/7zUpdate.cpp @@ -2,6 +2,8 @@ #include "StdAfx.h" +#include "../../../../C/CpuArch.h" + #include "../../Common/LimitedStreams.h" #include "../../Common/ProgressUtils.h" @@ -32,6 +34,10 @@ static const UInt32 kDictionaryForBCJ2_LZMA = 1 << 20; static const UInt32 kAlgorithmForBCJ2_LZMA = 1; static const UInt32 kNumFastBytesForBCJ2_LZMA = 64; +#ifdef MY_CPU_X86_OR_AMD64 +#define USE_86_FILTER +#endif + static HRESULT WriteRange(IInStream *inStream, ISequentialOutStream *outStream, UInt64 position, UInt64 size, ICompressProgressInfo *progress) { @@ -122,7 +128,7 @@ static int CompareFiles(const CFileItem &f1, const CFileItem &f2) } */ -const struct CFolderRepack +struct CFolderRepack { int FolderIndex; int Group; @@ -334,7 +340,9 @@ static bool IsExeExt(const UString &ext) return false; } -static void GetMethodFull(UInt64 methodID, UInt32 numInStreams, CMethodFull &methodResult) +#ifdef USE_86_FILTER + +static inline void GetMethodFull(UInt64 methodID, UInt32 numInStreams, CMethodFull &methodResult) { methodResult.Id = methodID; methodResult.NumInStreams = numInStreams; @@ -409,6 +417,8 @@ static void MakeExeMethod(const CCompressionMethodMode &method, } } +#endif + static void FromUpdateItemToFileItem(const CUpdateItem &ui, CFileItem &file, CFileItem2 &file2) { @@ -665,7 +675,9 @@ STDMETHODIMP CCryptoGetTextPassword::CryptoGetTextPassword(BSTR *password) static const int kNumGroupsMax = 4; +#ifdef USE_86_FILTER static bool Is86Group(int group) { return (group & 1) != 0; } +#endif static bool IsEncryptedGroup(int group) { return (group & 2) != 0; } static int GetGroupIndex(bool encrypted, int bcjFiltered) { return (encrypted ? 2 : 0) + (bcjFiltered ? 1 : 0); } @@ -865,9 +877,11 @@ HRESULT Update( const CSolidGroup &group = groups[groupIndex]; CCompressionMethodMode method; + #ifdef USE_86_FILTER if (Is86Group(groupIndex)) MakeExeMethod(*options.Method, options.MaxFilter, method); else + #endif method = *options.Method; if (IsEncryptedGroup(groupIndex)) diff --git a/CPP/7zip/Archive/7z/makefile b/CPP/7zip/Archive/7z/makefile index 4489f290..baedf862 100755 --- a/CPP/7zip/Archive/7z/makefile +++ b/CPP/7zip/Archive/7z/makefile @@ -4,8 +4,6 @@ CFLAGS = $(CFLAGS) -I ../../../ \ -DCOMPRESS_MT \ -DEXTERNAL_CODECS \ -LIBS = $(LIBS) oleaut32.lib user32.lib - AR_OBJS = \ $O\ArchiveExports.obj \ $O\DllExports.obj \ diff --git a/CPP/7zip/Archive/ArchiveExports.cpp b/CPP/7zip/Archive/ArchiveExports.cpp index f7bc9c69..5dcf9806 100755 --- a/CPP/7zip/Archive/ArchiveExports.cpp +++ b/CPP/7zip/Archive/ArchiveExports.cpp @@ -10,11 +10,17 @@ static const unsigned int kNumArcsMax = 48; static unsigned int g_NumArcs = 0; +static unsigned int g_DefaultArcIndex = 0; static const CArcInfo *g_Arcs[kNumArcsMax]; void RegisterArc(const CArcInfo *arcInfo) { if (g_NumArcs < kNumArcsMax) + { + const wchar_t *p = arcInfo->Name; + if (p[0] == '7' && p[1] == 'z' && p[2] == 0) + g_DefaultArcIndex = g_NumArcs; g_Arcs[g_NumArcs++] = arcInfo; + } } DEFINE_GUID(CLSID_CArchiveHandler, @@ -117,7 +123,7 @@ STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value) { - return GetHandlerProperty2(0, propID, value); + return GetHandlerProperty2(g_DefaultArcIndex, propID, value); } STDAPI GetNumberOfFormats(UINT32 *numFormats) diff --git a/CPP/7zip/Archive/ArjHandler.cpp b/CPP/7zip/Archive/ArjHandler.cpp index 66ad1677..0620ae84 100755 --- a/CPP/7zip/Archive/ArjHandler.cpp +++ b/CPP/7zip/Archive/ArjHandler.cpp @@ -652,13 +652,12 @@ STDMETHODIMP CHandler::Close() return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 testModeSpec, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (testModeSpec != 0); UInt64 totalUnpacked = 0, totalPacked = 0; - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _items.Size(); if (numItems == 0) @@ -714,7 +713,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, continue; } - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); @@ -789,7 +788,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, COM_TRY_END } -static IInArchive *CreateArc() { return new CHandler; } +static IInArchive *CreateArc() { return new CHandler; } static CArcInfo g_ArcInfo = { L"Arj", L"arj", 0, 4, { 0x60, 0xEA }, 2, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/Bz2Handler.cpp b/CPP/7zip/Archive/Bz2Handler.cpp index 9b2c4048..5d2620ba 100755 --- a/CPP/7zip/Archive/Bz2Handler.cpp +++ b/CPP/7zip/Archive/Bz2Handler.cpp @@ -154,28 +154,23 @@ STDMETHODIMP CHandler::Close() return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool allFilesMode = (numItems == (UInt32)-1); - if (!allFilesMode) - { - if (numItems == 0) - return S_OK; - if (numItems != 1 || indices[0] != 0) - return E_INVALIDARG; - } + if (numItems == 0) + return S_OK; + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) + return E_INVALIDARG; - bool testMode = (_aTestMode != 0); if (_stream) extractCallback->SetTotal(_packSize); UInt64 currentTotalPacked = 0; RINOK(extractCallback->SetCompleted(¤tTotalPacked)); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); if (!testMode && !realOutStream) return S_OK; @@ -421,7 +416,7 @@ static IOutArchive *CreateArcOut() { return new CHandler; } #endif static CArcInfo g_ArcInfo = - { L"BZip2", L"bz2 bzip2 tbz2 tbz", L"* * .tar .tar", 2, { 'B', 'Z', 'h' }, 3, true, CreateArc, CreateArcOut }; + { L"bzip2", L"bz2 bzip2 tbz2 tbz", L"* * .tar .tar", 2, { 'B', 'Z', 'h' }, 3, true, CreateArc, CreateArcOut }; REGISTER_ARC(BZip2) diff --git a/CPP/7zip/Archive/Cab/CabHandler.cpp b/CPP/7zip/Archive/Cab/CabHandler.cpp index ad015aaf..480a9a8a 100755 --- a/CPP/7zip/Archive/Cab/CabHandler.cpp +++ b/CPP/7zip/Archive/Cab/CabHandler.cpp @@ -2,6 +2,7 @@ #include "StdAfx.h" +#include "Common/Buffer.h" #include "Common/ComTry.h" #include "Common/Defs.h" #include "Common/IntToString.h" @@ -12,6 +13,7 @@ #include "Windows/Time.h" #include "../../Common/ProgressUtils.h" +#include "../../Common/StreamUtils.h" #include "../../Compress/CopyCoder.h" #include "../../Compress/DeflateDecoder.h" @@ -30,6 +32,8 @@ namespace NCab { // #define _CAB_DETAILS +static const UInt32 kMaxTempBufSize = 1 << 20; + #ifdef _CAB_DETAILS enum { @@ -279,7 +283,7 @@ STDMETHODIMP CHandler::Open(IInStream *inStream, { const CInArchiveInfo &ai = m_Database.Volumes.Front().ArchiveInfo; if (ai.IsTherePrev()) - otherArchive = &ai.PreviousArchive; + otherArchive = &ai.PrevArc; else prevChecked = true; } @@ -287,7 +291,7 @@ STDMETHODIMP CHandler::Open(IInStream *inStream, { const CInArchiveInfo &ai = m_Database.Volumes.Back().ArchiveInfo; if (ai.IsThereNext()) - otherArchive = &ai.NextArchive; + otherArchive = &ai.NextArc; } if (!otherArchive) break; @@ -328,7 +332,7 @@ STDMETHODIMP CHandler::Close() return S_OK; } -class CCabFolderOutStream: +class CFolderOutStream: public ISequentialOutStream, public CMyUnknownImp { @@ -339,6 +343,12 @@ public: private: const CMvDatabaseEx *m_Database; const CRecordVector<bool> *m_ExtractStatuses; + + CByteBuffer TempBuf; + bool TempBufMode; + bool IsSupported; + UInt32 m_BufStartFolderOffset; + int m_StartIndex; int m_CurrentIndex; CMyComPtr<IArchiveExtractCallback> m_ExtractCallback; @@ -348,11 +358,12 @@ private: bool m_IsOk; bool m_FileIsOpen; - UInt64 m_RemainFileSize; + UInt32 m_RemainFileSize; UInt64 m_FolderSize; UInt64 m_PosInFolder; HRESULT OpenFile(); + HRESULT CloseFile(); HRESULT Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK); public: HRESULT WriteEmptyFiles(); @@ -371,7 +382,7 @@ public: UInt64 GetPosInFolder() const { return m_PosInFolder; } }; -void CCabFolderOutStream::Init( +void CFolderOutStream::Init( const CMvDatabaseEx *database, const CRecordVector<bool> *extractStatuses, int startIndex, @@ -391,25 +402,66 @@ void CCabFolderOutStream::Init( m_PosInFolder = 0; m_FileIsOpen = false; m_IsOk = true; + TempBufMode = false; +} + +HRESULT CFolderOutStream::CloseFile() +{ + m_RealOutStream.Release(); + HRESULT res = m_ExtractCallback->SetOperationResult(m_IsOk ? + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError); + m_FileIsOpen = false; + return res; } -HRESULT CCabFolderOutStream::OpenFile() +HRESULT CFolderOutStream::OpenFile() { Int32 askMode = (*m_ExtractStatuses)[m_CurrentIndex] ? (m_TestMode ? NExtract::NAskMode::kTest : NExtract::NAskMode::kExtract) : NExtract::NAskMode::kSkip; + + if (!TempBufMode) + { + const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex]; + const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; + int curIndex = m_CurrentIndex + 1; + for (; curIndex < m_ExtractStatuses->Size(); curIndex++) + if ((*m_ExtractStatuses)[curIndex]) + { + const CMvItem &mvItem2 = m_Database->Items[m_StartIndex + curIndex]; + const CItem &item2 = m_Database->Volumes[mvItem2.VolumeIndex].Items[mvItem2.ItemIndex]; + if (item.Offset != item2.Offset || + item.Size != item2.Size || + item.Size == 0) + break; + } + if (curIndex > m_CurrentIndex + 1) + { + size_t oldCapacity = TempBuf.GetCapacity(); + IsSupported = (item.Size <= kMaxTempBufSize); + if (item.Size > oldCapacity && IsSupported) + { + TempBuf.SetCapacity(0); + TempBuf.SetCapacity(item.Size); + } + TempBufMode = true; + m_BufStartFolderOffset = item.Offset; + } + } + RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode)); if (!m_RealOutStream && !m_TestMode) - askMode = NArchive::NExtract::NAskMode::kSkip; + askMode = NExtract::NAskMode::kSkip; return m_ExtractCallback->PrepareOperation(askMode); } -HRESULT CCabFolderOutStream::WriteEmptyFiles() +HRESULT CFolderOutStream::WriteEmptyFiles() { if (m_FileIsOpen) return S_OK; - for(;m_CurrentIndex < m_ExtractStatuses->Size(); m_CurrentIndex++) + for (; m_CurrentIndex < m_ExtractStatuses->Size(); m_CurrentIndex++) { const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex]; const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; @@ -419,22 +471,23 @@ HRESULT CCabFolderOutStream::WriteEmptyFiles() HRESULT result = OpenFile(); m_RealOutStream.Release(); RINOK(result); - RINOK(m_ExtractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); } return S_OK; } // This is Write function -HRESULT CCabFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK) +HRESULT CFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK) { + COM_TRY_BEGIN UInt32 realProcessed = 0; if (processedSize != NULL) *processedSize = 0; - while(size != 0) + while (size != 0) { if (m_FileIsOpen) { - UInt32 numBytesToWrite = (UInt32)MyMin(m_RemainFileSize, (UInt64)(size)); + UInt32 numBytesToWrite = MyMin(m_RemainFileSize, size); HRESULT res = S_OK; if (numBytesToWrite > 0) { @@ -446,6 +499,8 @@ HRESULT CCabFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *proce res = m_RealOutStream->Write((const Byte *)data, numBytesToWrite, &processedSizeLocal); numBytesToWrite = processedSizeLocal; } + if (TempBufMode && IsSupported) + memcpy(TempBuf + (m_PosInFolder - m_BufStartFolderOffset), data, numBytesToWrite); } realProcessed += numBytesToWrite; if (processedSize != NULL) @@ -459,11 +514,37 @@ HRESULT CCabFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *proce if (m_RemainFileSize == 0) { m_RealOutStream.Release(); - RINOK(m_ExtractCallback->SetOperationResult( - m_IsOk ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); - m_FileIsOpen = false; + RINOK(CloseFile()); + + if (TempBufMode) + { + while (m_CurrentIndex < m_ExtractStatuses->Size()) + { + const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex]; + const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; + if (item.Offset != m_BufStartFolderOffset) + break; + HRESULT result = OpenFile(); + m_FileIsOpen = true; + m_CurrentIndex++; + m_IsOk = true; + if (result == S_OK && m_RealOutStream && IsSupported) + result = WriteStream(m_RealOutStream, TempBuf, item.Size); + + if (IsSupported) + { + RINOK(CloseFile()); + RINOK(result); + } + else + { + m_RealOutStream.Release(); + RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); + m_FileIsOpen = false; + } + } + TempBufMode = false; + } } if (realProcessed > 0) break; // with this break this function works as Write-Part @@ -483,7 +564,7 @@ HRESULT CCabFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *proce return E_FAIL; if (fileOffset > m_PosInFolder) { - UInt32 numBytesToWrite = (UInt32)MyMin((UInt64)fileOffset - m_PosInFolder, UInt64(size)); + UInt32 numBytesToWrite = MyMin(fileOffset - (UInt32)m_PosInFolder, size); realProcessed += numBytesToWrite; if (processedSize != NULL) *processedSize = realProcessed; @@ -501,14 +582,15 @@ HRESULT CCabFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *proce } } return WriteEmptyFiles(); + COM_TRY_END } -STDMETHODIMP CCabFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +STDMETHODIMP CFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) { return Write2(data, size, processedSize, true); } -HRESULT CCabFolderOutStream::FlushCorrupted() +HRESULT CFolderOutStream::FlushCorrupted() { const UInt32 kBufferSize = (1 << 10); Byte buffer[kBufferSize]; @@ -525,7 +607,7 @@ HRESULT CCabFolderOutStream::FlushCorrupted() } } -HRESULT CCabFolderOutStream::Unsupported() +HRESULT CFolderOutStream::Unsupported() { while(m_CurrentIndex < m_ExtractStatuses->Size()) { @@ -533,23 +615,23 @@ HRESULT CCabFolderOutStream::Unsupported() if (result != S_FALSE && result != S_OK) return result; m_RealOutStream.Release(); - RINOK(m_ExtractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); m_CurrentIndex++; } return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testModeSpec, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool allFilesMode = (numItems == (UInt32)(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = m_Database.Items.Size(); if(numItems == 0) return S_OK; - bool testMode = (_aTestMode != 0); + bool testMode = (testModeSpec != 0); UInt64 totalUnPacked = 0; UInt32 i; @@ -610,14 +692,14 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, i++; if (item.IsDir()) { - Int32 askMode= testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + Int32 askMode = testMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; CMyComPtr<ISequentialOutStream> realOutStream; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); RINOK(extractCallback->PrepareOperation(askMode)); realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } int folderIndex = m_Database.GetFolderIndex(&mvItem); @@ -625,13 +707,13 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, { // If we need previous archive Int32 askMode= testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; CMyComPtr<ISequentialOutStream> realOutStream; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); RINOK(extractCallback->PrepareOperation(askMode)); realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kDataError)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kDataError)); continue; } int startIndex2 = m_Database.FolderStartFileIndex[folderIndex]; @@ -664,7 +746,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, lps->InSize = totalPacked; RINOK(lps->SetCur()); - CCabFolderOutStream *cabFolderOutStream = new CCabFolderOutStream; + CFolderOutStream *cabFolderOutStream = new CFolderOutStream; CMyComPtr<ISequentialOutStream> outStream(cabFolderOutStream); const CFolder &folder = db.Folders[item.GetFolderIndex(db.Folders.Size())]; diff --git a/CPP/7zip/Archive/Cab/CabHeader.cpp b/CPP/7zip/Archive/Cab/CabHeader.cpp index d1f71df3..0cba1b0b 100755 --- a/CPP/7zip/Archive/Cab/CabHeader.cpp +++ b/CPP/7zip/Archive/Cab/CabHeader.cpp @@ -1,15 +1,15 @@ -// Archive/Cab/Header.h +// CabHeader.cpp #include "StdAfx.h" #include "CabHeader.h" -namespace NArchive{ -namespace NCab{ -namespace NHeader{ +namespace NArchive { +namespace NCab { +namespace NHeader { -Byte kMarker[kMarkerSize] = {'M' + 1, 'S', 'C', 'F', 0, 0, 0, 0 }; +Byte kMarker[kMarkerSize] = {'M', 'S', 'C', 'F', 0, 0, 0, 0 }; -struct SignatureInitializer { SignatureInitializer() { kMarker[0]--; }; } g_SignatureInitializer; +// struct CSignatureInitializer { CSignatureInitializer() { kMarker[0]--; }; } g_SignatureInitializer; }}} diff --git a/CPP/7zip/Archive/Cab/CabIn.cpp b/CPP/7zip/Archive/Cab/CabIn.cpp index afc0faed..c0bffa2d 100755 --- a/CPP/7zip/Archive/Cab/CabIn.cpp +++ b/CPP/7zip/Archive/Cab/CabIn.cpp @@ -2,14 +2,14 @@ #include "StdAfx.h" -#include "CabIn.h" - #include "../Common/FindSignature.h" +#include "CabIn.h" + namespace NArchive { namespace NCab { -Byte CInArchive::ReadByte() +Byte CInArchive::Read8() { Byte b; if (!inBuffer.ReadByte(b)) @@ -17,23 +17,23 @@ Byte CInArchive::ReadByte() return b; } -UInt16 CInArchive::ReadUInt16() +UInt16 CInArchive::Read16() { UInt16 value = 0; for (int i = 0; i < 2; i++) { - Byte b = ReadByte(); + Byte b = Read8(); value |= (UInt16(b) << (8 * i)); } return value; } -UInt32 CInArchive::ReadUInt32() +UInt32 CInArchive::Read32() { UInt32 value = 0; for (int i = 0; i < 4; i++) { - Byte b = ReadByte(); + Byte b = Read8(); value |= (UInt32(b) << (8 * i)); } return value; @@ -44,7 +44,7 @@ AString CInArchive::SafeReadName() AString name; for (;;) { - Byte b = ReadByte(); + Byte b = Read8(); if (b == 0) return name; name += (char)b; @@ -57,61 +57,60 @@ void CInArchive::ReadOtherArchive(COtherArchive &oa) oa.DiskName = SafeReadName(); } -void CInArchive::Skip(size_t size) +void CInArchive::Skip(UInt32 size) { while (size-- != 0) - ReadByte(); + Read8(); } -HRESULT CInArchive::Open2(IInStream *stream, - const UInt64 *searchHeaderSizeLimit, - CDatabase &database) +HRESULT CInArchive::Open(const UInt64 *searchHeaderSizeLimit, CDatabaseEx &db) { - database.Clear(); - RINOK(stream->Seek(0, STREAM_SEEK_SET, &database.StartPosition)); + IInStream *stream = db.Stream; + db.Clear(); + RINOK(stream->Seek(0, STREAM_SEEK_SET, &db.StartPosition)); RINOK(FindSignatureInStream(stream, NHeader::kMarker, NHeader::kMarkerSize, - searchHeaderSizeLimit, database.StartPosition)); + searchHeaderSizeLimit, db.StartPosition)); - RINOK(stream->Seek(database.StartPosition + NHeader::kMarkerSize, STREAM_SEEK_SET, NULL)); + RINOK(stream->Seek(db.StartPosition + NHeader::kMarkerSize, STREAM_SEEK_SET, NULL)); if (!inBuffer.Create(1 << 17)) return E_OUTOFMEMORY; inBuffer.SetStream(stream); inBuffer.Init(); - CInArchiveInfo &ai = database.ArchiveInfo; + CInArchiveInfo &ai = db.ArchiveInfo; - ai.Size = ReadUInt32(); - if (ReadUInt32() != 0) + ai.Size = Read32(); + if (Read32() != 0) return S_FALSE; - ai.FileHeadersOffset = ReadUInt32(); - if (ReadUInt32() != 0) + ai.FileHeadersOffset = Read32(); + if (Read32() != 0) return S_FALSE; - ai.VersionMinor = ReadByte(); - ai.VersionMajor = ReadByte(); - ai.NumFolders = ReadUInt16(); - ai.NumFiles = ReadUInt16(); - ai.Flags = ReadUInt16(); + ai.VersionMinor = Read8(); + ai.VersionMajor = Read8(); + ai.NumFolders = Read16(); + ai.NumFiles = Read16(); + ai.Flags = Read16(); if (ai.Flags > 7) return S_FALSE; - ai.SetID = ReadUInt16(); - ai.CabinetNumber = ReadUInt16(); + ai.SetID = Read16(); + ai.CabinetNumber = Read16(); if (ai.ReserveBlockPresent()) { - ai.PerCabinetAreaSize = ReadUInt16(); - ai.PerFolderAreaSize = ReadByte(); - ai.PerDataBlockAreaSize = ReadByte(); + ai.PerCabinetAreaSize = Read16(); + ai.PerFolderAreaSize = Read8(); + ai.PerDataBlockAreaSize = Read8(); Skip(ai.PerCabinetAreaSize); } { if (ai.IsTherePrev()) - ReadOtherArchive(ai.PreviousArchive); + ReadOtherArchive(ai.PrevArc); if (ai.IsThereNext()) - ReadOtherArchive(ai.NextArchive); + ReadOtherArchive(ai.NextArc); } int i; @@ -119,54 +118,40 @@ HRESULT CInArchive::Open2(IInStream *stream, { CFolder folder; - folder.DataStart = ReadUInt32(); - folder.NumDataBlocks = ReadUInt16(); - folder.CompressionTypeMajor = ReadByte(); - folder.CompressionTypeMinor = ReadByte(); + folder.DataStart = Read32(); + folder.NumDataBlocks = Read16(); + folder.CompressionTypeMajor = Read8(); + folder.CompressionTypeMinor = Read8(); Skip(ai.PerFolderAreaSize); - database.Folders.Add(folder); + db.Folders.Add(folder); } - RINOK(stream->Seek(database.StartPosition + ai.FileHeadersOffset, STREAM_SEEK_SET, NULL)); + RINOK(stream->Seek(db.StartPosition + ai.FileHeadersOffset, STREAM_SEEK_SET, NULL)); inBuffer.SetStream(stream); inBuffer.Init(); for (i = 0; i < ai.NumFiles; i++) { CItem item; - item.Size = ReadUInt32(); - item.Offset = ReadUInt32(); - item.FolderIndex = ReadUInt16(); - UInt16 pureDate = ReadUInt16(); - UInt16 pureTime = ReadUInt16(); + item.Size = Read32(); + item.Offset = Read32(); + item.FolderIndex = Read16(); + UInt16 pureDate = Read16(); + UInt16 pureTime = Read16(); item.Time = ((UInt32(pureDate) << 16)) | pureTime; - item.Attributes = ReadUInt16(); + item.Attributes = Read16(); item.Name = SafeReadName(); - int folderIndex = item.GetFolderIndex(database.Folders.Size()); - if (folderIndex >= database.Folders.Size()) + int folderIndex = item.GetFolderIndex(db.Folders.Size()); + if (folderIndex >= db.Folders.Size()) return S_FALSE; - database.Items.Add(item); + db.Items.Add(item); } return S_OK; } #define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; } -HRESULT CInArchive::Open( - const UInt64 *searchHeaderSizeLimit, - CDatabaseEx &database) -{ - return Open2(database.Stream, searchHeaderSizeLimit, database); -} - - -static int CompareMvItems2(const CMvItem *p1, const CMvItem *p2) -{ - RINOZ(MyCompare(p1->VolumeIndex, p2->VolumeIndex)); - return MyCompare(p1->ItemIndex, p2->ItemIndex); -} - static int CompareMvItems(const CMvItem *p1, const CMvItem *p2, void *param) { const CMvDatabaseEx &mvDb = *(const CMvDatabaseEx *)param; @@ -185,7 +170,8 @@ static int CompareMvItems(const CMvItem *p1, const CMvItem *p2, void *param) RINOZ(MyCompare(f1, f2)); RINOZ(MyCompare(item1.Offset, item2.Offset)); RINOZ(MyCompare(item1.Size, item2.Size)); - return CompareMvItems2(p1, p2); + RINOZ(MyCompare(p1->VolumeIndex, p2->VolumeIndex)); + return MyCompare(p1->ItemIndex, p2->ItemIndex); } bool CMvDatabaseEx::AreItemsEqual(int i1, int i2) @@ -236,8 +222,7 @@ void CMvDatabaseEx::FillSortAndShrink() for (i = 0; i < Items.Size(); i++) { - const CMvItem &mvItem = Items[i]; - int folderIndex = GetFolderIndex(&mvItem); + int folderIndex = GetFolderIndex(&Items[i]); if (folderIndex >= FolderStartFileIndex.Size()) FolderStartFileIndex.Add(i); } @@ -260,7 +245,8 @@ bool CMvDatabaseEx::Check() return false; } } - UInt64 maxPos = 0; + UInt32 beginPos = 0; + UInt64 endPos = 0; int prevFolder = -2; for (int i = 0; i < Items.Size(); i++) { @@ -273,16 +259,12 @@ bool CMvDatabaseEx::Check() continue; int folderIndex = GetFolderIndex(&mvItem); if (folderIndex != prevFolder) - { prevFolder = folderIndex; - maxPos = 0; - continue; - } - if (item.Offset < maxPos) - return false; - maxPos = item.GetEndOffset(); - if (maxPos < item.Offset) + else if (item.Offset < endPos && + (item.Offset != beginPos || item.GetEndOffset() != endPos)) return false; + beginPos = item.Offset; + endPos = item.GetEndOffset(); } return true; } diff --git a/CPP/7zip/Archive/Cab/CabIn.h b/CPP/7zip/Archive/Cab/CabIn.h index c9cfcbdd..1e9b188b 100755 --- a/CPP/7zip/Archive/Cab/CabIn.h +++ b/CPP/7zip/Archive/Cab/CabIn.h @@ -50,8 +50,8 @@ struct CArchiveInfo Byte GetDataBlockReserveSize() const { return (Byte)(ReserveBlockPresent() ? PerDataBlockAreaSize : 0); } - COtherArchive PreviousArchive; - COtherArchive NextArchive; + COtherArchive PrevArc; + COtherArchive NextArc; CArchiveInfo() { @@ -63,7 +63,7 @@ struct CArchiveInfo PerCabinetAreaSize = 0; PerFolderAreaSize = 0; PerDataBlockAreaSize = 0; - } + } }; struct CInArchiveInfo: public CArchiveInfo @@ -73,13 +73,13 @@ struct CInArchiveInfo: public CArchiveInfo }; -class CDatabase +struct CDatabase { -public: UInt64 StartPosition; CInArchiveInfo ArchiveInfo; CObjectVector<CFolder> Folders; CObjectVector<CItem> Items; + void Clear() { ArchiveInfo.Clear(); @@ -104,9 +104,8 @@ public: UInt32 GetFileSize(int index) const { return Items[index].Size; } }; -class CDatabaseEx: public CDatabase +struct CDatabaseEx: public CDatabase { -public: CMyComPtr<IInStream> Stream; }; @@ -124,6 +123,7 @@ public: CRecordVector<CMvItem> Items; CRecordVector<int> StartFolderOfVol; CRecordVector<int> FolderStartFileIndex; + int GetFolderIndex(const CMvItem *mvi) const { const CDatabaseEx &db = Volumes[mvi->VolumeIndex]; @@ -145,20 +145,15 @@ class CInArchive { CInBuffer inBuffer; - Byte ReadByte(); - UInt16 ReadUInt16(); - UInt32 ReadUInt32(); + Byte Read8(); + UInt16 Read16(); + UInt32 Read32(); AString SafeReadName(); - void Skip(size_t size); + void Skip(UInt32 size); void ReadOtherArchive(COtherArchive &oa); - HRESULT Open2(IInStream *inStream, - const UInt64 *searchHeaderSizeLimit, - CDatabase &database); public: - HRESULT Open( - const UInt64 *searchHeaderSizeLimit, - CDatabaseEx &database); + HRESULT Open(const UInt64 *searchHeaderSizeLimit, CDatabaseEx &db); }; }} diff --git a/CPP/7zip/Archive/Cab/CabRegister.cpp b/CPP/7zip/Archive/Cab/CabRegister.cpp index 0ce8a87f..15fe4099 100755 --- a/CPP/7zip/Archive/Cab/CabRegister.cpp +++ b/CPP/7zip/Archive/Cab/CabRegister.cpp @@ -5,7 +5,7 @@ #include "../../Common/RegisterArc.h" #include "CabHandler.h" -static IInArchive *CreateArc() { return new NArchive::NCab::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NCab::CHandler; } static CArcInfo g_ArcInfo = { L"Cab", L"cab", 0, 8, { 0x4D, 0x53, 0x43, 0x46 }, 4, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/Chm/ChmHandler.cpp b/CPP/7zip/Archive/Chm/ChmHandler.cpp index 03bff821..a9e334b0 100755 --- a/CPP/7zip/Archive/Chm/ChmHandler.cpp +++ b/CPP/7zip/Archive/Chm/ChmHandler.cpp @@ -275,7 +275,7 @@ HRESULT CChmFolderOutStream::OpenFile() m_RealOutStream.Release(); RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode)); if (!m_RealOutStream && !m_TestMode) - askMode = NArchive::NExtract::NAskMode::kSkip; + askMode = NExtract::NAskMode::kSkip; return m_ExtractCallback->PrepareOperation(askMode); } @@ -291,7 +291,7 @@ HRESULT CChmFolderOutStream::WriteEmptyFiles() HRESULT result = OpenFile(); m_RealOutStream.Release(); RINOK(result); - RINOK(m_ExtractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); } return S_OK; } @@ -334,8 +334,8 @@ HRESULT CChmFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *proce m_RealOutStream.Release(); RINOK(m_ExtractCallback->SetOperationResult( m_IsOk ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); m_FileIsOpen = false; } if (realProcessed > 0) @@ -398,11 +398,11 @@ HRESULT CChmFolderOutStream::FlushCorrupted(UInt64 maxSize) } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testModeSpec, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = m_Database.NewFormat ? 1: @@ -411,7 +411,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, m_Database.Indices.Size()); if (numItems == 0) return S_OK; - bool testMode = (_aTestMode != 0); + bool testMode = (testModeSpec != 0); UInt64 currentTotalSize = 0; @@ -447,8 +447,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode= testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); @@ -456,32 +456,32 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, { if (index != 0) return E_FAIL; - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; if (!testMode) { UInt32 size = m_Database.NewFormatString.Length(); RINOK(WriteStream(realOutStream, (const char *)m_Database.NewFormatString, size)); } - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } const CItem &item = m_Database.Items[index]; currentItemSize = item.Size; - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); if (item.Section != 0) { - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); continue; } if (testMode) { - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } @@ -491,8 +491,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress)); realOutStream.Release(); RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); } return S_OK; } @@ -543,15 +543,15 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, const CItem &item = m_Database.Items[entryIndex]; UInt64 sectionIndex = item.Section; Int32 askMode= testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; if (item.IsDir()) { CMyComPtr<ISequentialOutStream> realOutStream; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); RINOK(extractCallback->PrepareOperation(askMode)); realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } @@ -562,17 +562,17 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, { CMyComPtr<ISequentialOutStream> realOutStream; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); - Int32 opRes = NArchive::NExtract::NOperationResult::kOK; + Int32 opRes = NExtract::NOperationResult::kOK; if (!testMode && item.Size != 0) { RINOK(m_Stream->Seek(m_Database.ContentOffset + item.Offset, STREAM_SEEK_SET, NULL)); streamSpec->Init(item.Size); RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress)); if (copyCoderSpec->TotalSize != item.Size) - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; } realOutStream.Release(); RINOK(extractCallback->SetOperationResult(opRes)); @@ -586,10 +586,10 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, { CMyComPtr<ISequentialOutStream> realOutStream; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - if(!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); continue; } @@ -603,7 +603,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, chmFolderOutStream->Init(&m_Database, extractCallback, testMode); - if(lzxDecoderSpec == NULL) + if (lzxDecoderSpec == NULL) { lzxDecoderSpec = new NCompress::NLzx::CDecoder; lzxDecoder = lzxDecoderSpec; diff --git a/CPP/7zip/Archive/Chm/ChmRegister.cpp b/CPP/7zip/Archive/Chm/ChmRegister.cpp index abebe6c6..e5f38afa 100755 --- a/CPP/7zip/Archive/Chm/ChmRegister.cpp +++ b/CPP/7zip/Archive/Chm/ChmRegister.cpp @@ -5,7 +5,7 @@ #include "../../Common/RegisterArc.h" #include "ChmHandler.h" -static IInArchive *CreateArc() { return new NArchive::NChm::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NChm::CHandler; } static CArcInfo g_ArcInfo = { L"Chm", L"chm chi chq chw hxs hxi hxr hxq hxw lit", 0, 0xE9, { 'I', 'T', 'S', 'F' }, 4, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/Com/ComHandler.cpp b/CPP/7zip/Archive/Com/ComHandler.cpp index 287f6156..39fce0ae 100755 --- a/CPP/7zip/Archive/Com/ComHandler.cpp +++ b/CPP/7zip/Archive/Com/ComHandler.cpp @@ -95,12 +95,11 @@ STDMETHODIMP CHandler::Close() return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _db.Refs.Size(); if (numItems == 0) @@ -135,30 +134,30 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, CMyComPtr<ISequentialOutStream> outStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; RINOK(extractCallback->GetStream(index, &outStream, askMode)); if (item.IsDir()) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } totalPackSize += _db.GetItemPackSize(item.Size); totalSize += item.Size; - if (!testMode && (!outStream)) + if (!testMode && !outStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); - Int32 res = NArchive::NExtract::NOperationResult::kDataError; + Int32 res = NExtract::NOperationResult::kDataError; CMyComPtr<ISequentialInStream> inStream; HRESULT hres = GetStream(index, &inStream); if (hres == S_FALSE) - res = NArchive::NExtract::NOperationResult::kDataError; + res = NExtract::NOperationResult::kDataError; else if (hres == E_NOTIMPL) - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + res = NExtract::NOperationResult::kUnSupportedMethod; else { RINOK(hres); @@ -166,7 +165,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, { RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); if (copyCoderSpec->TotalSize == item.Size) - res = NArchive::NExtract::NOperationResult::kOK; + res = NExtract::NOperationResult::kOK; } } outStream.Release(); diff --git a/CPP/7zip/Archive/Com/ComRegister.cpp b/CPP/7zip/Archive/Com/ComRegister.cpp index c744b04f..6712b890 100755 --- a/CPP/7zip/Archive/Com/ComRegister.cpp +++ b/CPP/7zip/Archive/Com/ComRegister.cpp @@ -5,9 +5,9 @@ #include "../../Common/RegisterArc.h" #include "ComHandler.h" -static IInArchive *CreateArc() { return new NArchive::NCom::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NCom::CHandler; } static CArcInfo g_ArcInfo = - { L"Compound", L"msi doc xls ppt", 0, 0xE5, { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 }, 8, false, CreateArc, 0 }; + { L"Compound", L"msi msp doc xls ppt", 0, 0xE5, { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 }, 8, false, CreateArc, 0 }; REGISTER_ARC(Com) diff --git a/CPP/7zip/Archive/Common/ItemNameUtils.cpp b/CPP/7zip/Archive/Common/ItemNameUtils.cpp index 6dfaf980..71996a63 100755 --- a/CPP/7zip/Archive/Common/ItemNameUtils.cpp +++ b/CPP/7zip/Archive/Common/ItemNameUtils.cpp @@ -39,7 +39,7 @@ bool HasTailSlash(const AString &name, UINT codePage) if (name.IsEmpty()) return false; LPCSTR prev = - #ifdef _WIN32 + #if defined(_WIN32) && !defined(UNDER_CE) CharPrevExA((WORD)codePage, name, &name[name.Length()], 0); #else (LPCSTR)(name) + (name.Length() - 1); diff --git a/CPP/7zip/Archive/CpioHandler.cpp b/CPP/7zip/Archive/CpioHandler.cpp index e5a32936..2e64d1cd 100755 --- a/CPP/7zip/Archive/CpioHandler.cpp +++ b/CPP/7zip/Archive/CpioHandler.cpp @@ -71,7 +71,7 @@ namespace NFileHeader char ChkSum[8]; // 0 for "new" portable format; for CRC format the sum of all the bytes in the file bool CheckMagic() const { return memcmp(Magic, NMagic::kMagic1, 6) == 0 || - memcmp(Magic, NMagic::kMagic2, 6) == 0; }; + memcmp(Magic, NMagic::kMagic2, 6) == 0; }; }; */ @@ -540,12 +540,11 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val COM_TRY_END } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _items.Size(); if (numItems == 0) @@ -575,8 +574,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> outStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; const CItemEx &item = _items[index]; RINOK(extractCallback->GetStream(index, &outStream, askMode)); @@ -584,7 +583,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (item.IsDir()) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } if (!testMode && !outStream) @@ -592,7 +591,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(extractCallback->PrepareOperation(askMode)); if (testMode) { - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } RINOK(_stream->Seek(item.GetDataPosition(), STREAM_SEEK_SET, NULL)); @@ -600,8 +599,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); outStream.Release(); RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); } return S_OK; COM_TRY_END @@ -615,7 +614,7 @@ STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) COM_TRY_END } -static IInArchive *CreateArc() { return new NArchive::NCpio::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NCpio::CHandler; } static CArcInfo g_ArcInfo = { L"Cpio", L"cpio", 0, 0xED, { 0 }, 0, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/DebHandler.cpp b/CPP/7zip/Archive/DebHandler.cpp index 0381e0fd..9f083269 100755 --- a/CPP/7zip/Archive/DebHandler.cpp +++ b/CPP/7zip/Archive/DebHandler.cpp @@ -236,7 +236,7 @@ STDMETHODIMP CHandler::Open(IInStream *stream, COM_TRY_BEGIN { CInArchive archive; - if(archive.Open(stream) != S_OK) + if (archive.Open(stream) != S_OK) return S_FALSE; _items.Clear(); @@ -314,12 +314,11 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val COM_TRY_END } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _items.Size(); if (numItems == 0) @@ -349,19 +348,19 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; const CItem &item = _items[index]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); currentTotalSize += item.Size; - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); if (testMode) { - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } RINOK(_stream->Seek(item.GetDataPos(), STREAM_SEEK_SET, NULL)); @@ -369,8 +368,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress)); realOutStream.Release(); RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); } return S_OK; COM_TRY_END @@ -384,7 +383,7 @@ STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) COM_TRY_END } -static IInArchive *CreateArc() { return new NArchive::NDeb::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NDeb::CHandler; } static CArcInfo g_ArcInfo = { L"Deb", L"deb", 0, 0xEC, { '!', '<', 'a', 'r', 'c', 'h', '>', '\n' }, 8, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/DeflateProps.cpp b/CPP/7zip/Archive/DeflateProps.cpp new file mode 100755 index 00000000..8498e056 --- /dev/null +++ b/CPP/7zip/Archive/DeflateProps.cpp @@ -0,0 +1,118 @@ +// DeflateProps.cpp + +#include "StdAfx.h" + +#include "Windows/PropVariant.h" + +#include "Common/ParseProperties.h" + +#include "DeflateProps.h" + +namespace NArchive { + +static const UInt32 kAlgo1 = 0; +static const UInt32 kAlgo5 = 1; + +static const UInt32 kPasses1 = 1; +static const UInt32 kPasses7 = 3; +static const UInt32 kPasses9 = 10; + +static const UInt32 kFb1 = 32; +static const UInt32 kFb7 = 64; +static const UInt32 kFb9 = 128; + +void CDeflateProps::Normalize() +{ + UInt32 level = Level; + if (level == 0xFFFFFFFF) + level = 5; + + if (Algo == 0xFFFFFFFF) + Algo = (level >= 5 ? + kAlgo5 : + kAlgo1); + + if (NumPasses == 0xFFFFFFFF) + NumPasses = + (level >= 9 ? kPasses9 : + (level >= 7 ? kPasses7 : + kPasses1)); + if (Fb == 0xFFFFFFFF) + Fb = + (level >= 9 ? kFb9 : + (level >= 7 ? kFb7 : + kFb1)); +} + +HRESULT CDeflateProps::SetCoderProperties(ICompressSetCoderProperties *setCoderProperties) +{ + Normalize(); + + NWindows::NCOM::CPropVariant props[] = + { + Algo, + NumPasses, + Fb, + Mc + }; + PROPID propIDs[] = + { + NCoderPropID::kAlgorithm, + NCoderPropID::kNumPasses, + NCoderPropID::kNumFastBytes, + NCoderPropID::kMatchFinderCycles + }; + int numProps = sizeof(propIDs) / sizeof(propIDs[0]); + if (!McDefined) + numProps--; + return setCoderProperties->SetCoderProperties(propIDs, props, numProps); +} + +HRESULT CDeflateProps::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps) +{ + Init(); + for (int i = 0; i < numProps; i++) + { + UString name = names[i]; + name.MakeUpper(); + if (name.IsEmpty()) + return E_INVALIDARG; + const PROPVARIANT &prop = values[i]; + if (name[0] == L'X') + { + UInt32 a = 9; + RINOK(ParsePropValue(name.Mid(1), prop, a)); + Level = a; + } + else if (name.Left(1) == L"A") + { + UInt32 a = kAlgo5; + RINOK(ParsePropValue(name.Mid(1), prop, a)); + Algo = a; + } + else if (name.Left(4) == L"PASS") + { + UInt32 a = kPasses9; + RINOK(ParsePropValue(name.Mid(4), prop, a)); + NumPasses = a; + } + else if (name.Left(2) == L"FB") + { + UInt32 a = kFb9; + RINOK(ParsePropValue(name.Mid(2), prop, a)); + Fb = a; + } + else if (name.Left(2) == L"MC") + { + UInt32 a = 0xFFFFFFFF; + RINOK(ParsePropValue(name.Mid(2), prop, a)); + Mc = a; + McDefined = true; + } + else + return E_INVALIDARG; + } + return S_OK; +} + +} diff --git a/CPP/7zip/Archive/DeflateProps.h b/CPP/7zip/Archive/DeflateProps.h new file mode 100755 index 00000000..e05a9d4a --- /dev/null +++ b/CPP/7zip/Archive/DeflateProps.h @@ -0,0 +1,35 @@ +// DeflateProps.h + +#ifndef __DEFLATE_PROPS_H +#define __DEFLATE_PROPS_H + +#include "../ICoder.h" + +namespace NArchive { + +class CDeflateProps +{ + UInt32 Level; + UInt32 NumPasses; + UInt32 Fb; + UInt32 Algo; + UInt32 Mc; + bool McDefined; + + void Init() + { + Level = NumPasses = Fb = Algo = Mc = 0xFFFFFFFF; + McDefined = false; + } + void Normalize(); +public: + CDeflateProps() { Init(); } + bool IsMaximum() const { return Algo > 0; } + + HRESULT SetCoderProperties(ICompressSetCoderProperties *setCoderProperties); + HRESULT SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps); +}; + +} + +#endif diff --git a/CPP/7zip/Archive/DllExports.cpp b/CPP/7zip/Archive/DllExports.cpp index ccad2126..6c72dea7 100755 --- a/CPP/7zip/Archive/DllExports.cpp +++ b/CPP/7zip/Archive/DllExports.cpp @@ -5,6 +5,8 @@ #include "../../Common/MyInitGuid.h" #include "../../Common/ComTry.h" #include "../../Common/Types.h" + +#include "../../Windows/NtCheck.h" #include "../../Windows/PropVariant.h" #include "IArchive.h" @@ -12,17 +14,8 @@ #include "../IPassword.h" HINSTANCE g_hInstance; -#ifndef _UNICODE -bool g_IsNT = false; -static bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} -#endif + +#define NT_CHECK_FAIL_ACTION return FALSE; extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) @@ -30,9 +23,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) if (dwReason == DLL_PROCESS_ATTACH) { g_hInstance = hInstance; - #ifndef _UNICODE - g_IsNT = IsItWindowsNT(); - #endif + NT_CHECK; } return TRUE; } diff --git a/CPP/7zip/Archive/DllExports2.cpp b/CPP/7zip/Archive/DllExports2.cpp index fd8bff28..ad14ff06 100755 --- a/CPP/7zip/Archive/DllExports2.cpp +++ b/CPP/7zip/Archive/DllExports2.cpp @@ -3,43 +3,38 @@ #include "StdAfx.h" #include "../../Common/MyInitGuid.h" -#include "../../Common/ComTry.h" -#include "../../Common/Types.h" -#include "../../Windows/PropVariant.h" + #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) #include "../../../C/Alloc.h" #endif -#include "IArchive.h" +#include "../../Common/ComTry.h" + +#include "../../Windows/NtCheck.h" +#include "../../Windows/PropVariant.h" + #include "../ICoder.h" #include "../IPassword.h" +#include "IArchive.h" + HINSTANCE g_hInstance; -#ifndef _UNICODE -#ifdef _WIN32 -bool g_IsNT = false; -static bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} -#endif -#endif + +#define NT_CHECK_FAIL_ACTION return FALSE; extern "C" -BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +BOOL WINAPI DllMain( + #ifdef UNDER_CE + HANDLE + #else + HINSTANCE + #endif + hInstance, DWORD dwReason, LPVOID /*lpReserved*/) { if (dwReason == DLL_PROCESS_ATTACH) { - g_hInstance = hInstance; - #ifndef _UNICODE - #ifdef _WIN32 - g_IsNT = IsItWindowsNT(); - #endif - #endif + g_hInstance = (HINSTANCE)hInstance; + NT_CHECK; } return TRUE; } diff --git a/CPP/7zip/Archive/DmgHandler.cpp b/CPP/7zip/Archive/DmgHandler.cpp index dd1e95ec..e63542be 100755 --- a/CPP/7zip/Archive/DmgHandler.cpp +++ b/CPP/7zip/Archive/DmgHandler.cpp @@ -573,12 +573,11 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val COM_TRY_END } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _files.Size(); if (numItems == 0) @@ -635,14 +634,14 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; // const CItemEx &item = _files[index]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); @@ -652,7 +651,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, realOutStream.Release(); - Int32 opRes = NArchive::NExtract::NOperationResult::kOK; + Int32 opRes = NExtract::NOperationResult::kOK; #ifdef DMG_SHOW_RAW if (index > _fileIndices.Size()) { @@ -688,7 +687,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, packPos += block.PackSize; if (block.UnpPos != unpPos) { - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; break; } @@ -705,13 +704,13 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, case METHOD_ZERO_2: realMethod = false; if (block.PackSize != 0) - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + opRes = NExtract::NOperationResult::kUnSupportedMethod; break; case METHOD_COPY: if (block.UnpSize != block.PackSize) { - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + opRes = NExtract::NOperationResult::kUnSupportedMethod; break; } res = copyCoder->Code(inStream, outStream, NULL, NULL, progress); @@ -730,26 +729,26 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, res = bzip2Coder->Code(inStream, outStream, NULL, NULL, progress); if (res == S_OK) if (streamSpec->GetSize() != block.PackSize) - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; break; } default: - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + opRes = NExtract::NOperationResult::kUnSupportedMethod; break; } if (res != S_OK) { if (res != S_FALSE) return res; - if (opRes == NArchive::NExtract::NOperationResult::kOK) - opRes = NArchive::NExtract::NOperationResult::kDataError; + if (opRes == NExtract::NOperationResult::kOK) + opRes = NExtract::NOperationResult::kDataError; } unpPos += block.UnpSize; if (!outStreamSpec->IsFinishedOK()) { - if (realMethod && opRes == NArchive::NExtract::NOperationResult::kOK) - opRes = NArchive::NExtract::NOperationResult::kDataError; + if (realMethod && opRes == NExtract::NOperationResult::kOK) + opRes = NExtract::NOperationResult::kDataError; while (outStreamSpec->GetRem() != 0) { diff --git a/CPP/7zip/Archive/ElfHandler.cpp b/CPP/7zip/Archive/ElfHandler.cpp index 66b18e7a..6f5a6776 100755 --- a/CPP/7zip/Archive/ElfHandler.cpp +++ b/CPP/7zip/Archive/ElfHandler.cpp @@ -466,12 +466,11 @@ STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _sections.Size(); if (numItems == 0) @@ -501,8 +500,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, lps->InSize = lps->OutSize = currentTotalSize; RINOK(lps->SetCur()); Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; UInt32 index = allFilesMode ? i : indices[i]; const CSegment &item = _sections[index]; currentItemSize = item.PSize; @@ -518,8 +517,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); outStream.Release(); RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == currentItemSize ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); } return S_OK; COM_TRY_END diff --git a/CPP/7zip/Archive/FatHandler.cpp b/CPP/7zip/Archive/FatHandler.cpp index f07d4ccb..6d7b249c 100755 --- a/CPP/7zip/Archive/FatHandler.cpp +++ b/CPP/7zip/Archive/FatHandler.cpp @@ -456,8 +456,11 @@ HRESULT CDatabase::ReadDir(Int32 parent, UInt32 cluster, int level) const Byte *p = ByteBuf + pos; if (p[0] == 0) { + /* + // FreeDOS formats FAT partition with cluster chain longer than required. if (clusterMode && !Header.IsEoc(cluster)) return S_FALSE; + */ break; } if (p[0] == 0xE5) @@ -883,12 +886,11 @@ STDMETHODIMP CHandler::Close() return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = Items.Size(); if (numItems == 0) @@ -923,8 +925,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; const CItem &item = Items[index]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); @@ -932,14 +934,14 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (item.IsDir()) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } totalPackSize += Header.GetFilePackSize(item.Size); totalSize += item.Size; - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); @@ -947,7 +949,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, realOutStream.Release(); outStreamSpec->Init(); - int res = NArchive::NExtract::NOperationResult::kDataError; + int res = NExtract::NOperationResult::kDataError; CMyComPtr<ISequentialInStream> inStream; HRESULT hres = GetStream(index, &inStream); if (hres != S_FALSE) @@ -957,7 +959,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, { RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); if (copyCoderSpec->TotalSize == item.Size) - res = NArchive::NExtract::NOperationResult::kOK; + res = NExtract::NOperationResult::kOK; } } outStreamSpec->ReleaseStream(); @@ -973,7 +975,7 @@ STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) return S_OK; } -static IInArchive *CreateArc() { return new CHandler; } +static IInArchive *CreateArc() { return new CHandler; } static CArcInfo g_ArcInfo = { L"FAT", L"fat img", 0, 0xDA, { 0x55, 0xAA }, 2, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/FlvHandler.cpp b/CPP/7zip/Archive/FlvHandler.cpp new file mode 100755 index 00000000..a22c29e3 --- /dev/null +++ b/CPP/7zip/Archive/FlvHandler.cpp @@ -0,0 +1,544 @@ +// FlvHandler.cpp + +#include "StdAfx.h" + +#include "../../../C/CpuArch.h" + +#include "Common/Buffer.h" +#include "Common/ComTry.h" +// #include "Common/Defs.h" +#include "Common/MyString.h" + +#include "Windows/PropVariant.h" + +#include "../Common/ProgressUtils.h" +#include "../Common/RegisterArc.h" +#include "../Common/StreamObjects.h" +#include "../Common/StreamUtils.h" + +#define GetBe24(p) ( \ + ((UInt32)((const Byte *)(p))[0] << 16) | \ + ((UInt32)((const Byte *)(p))[1] << 8) | \ + ((const Byte *)(p))[2] ) + +#define Get16(p) GetBe16(p) +#define Get24(p) GetBe24(p) +#define Get32(p) GetBe32(p) + +namespace NArchive { +namespace NFlv { + +static const UInt32 kFileSizeMax = (UInt32)1 << 30; +static const int kNumChunksMax = (UInt32)1 << 23; + +const UInt32 kTagHeaderSize = 11; + +static const Byte kFlag_Video = 1; +static const Byte kFlag_Audio = 4; + +static const Byte kType_Audio = 8; +static const Byte kType_Video = 9; +static const Byte kType_Meta = 18; +static const int kNumTypes = 19; + +struct CItem +{ + UInt32 Offset; + UInt32 Size; + // UInt32 Time; + Byte Type; +}; + +struct CItem2 +{ + Byte Type; + Byte SubType; + Byte Props; + bool SameSubTypes; + int NumChunks; + size_t Size; + + CReferenceBuf *BufSpec; + CMyComPtr<IUnknown> RefBuf; + + bool IsAudio() const { return Type == kType_Audio; } +}; + +class CHandler: + public IInArchive, + public IInArchiveGetStream, + public CMyUnknownImp +{ + int _isRaw; + CMyComPtr<IInStream> _stream; + CObjectVector<CItem2> _items2; + // CByteBuffer _metadata; + HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback); + AString GetComment(); +public: + MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream) + INTERFACE_IInArchive(;) + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream); +}; + +STATPROPSTG kProps[] = +{ + { NULL, kpidSize, VT_UI8}, + { NULL, kpidNumBlocks, VT_UI4}, + { NULL, kpidComment, VT_BSTR} +}; + +/* +STATPROPSTG kArcProps[] = +{ + { NULL, kpidComment, VT_BSTR} +}; +*/ + +IMP_IInArchive_Props +IMP_IInArchive_ArcProps_NO + +static const char *g_AudioTypes[16] = +{ + "pcm", + "adpcm", + "mp3", + "pcm_le", + "nellymoser16", + "nellymoser8", + "nellymoser", + "g711a", + "g711m", + "audio9", + "aac", + "speex", + "audio12", + "audio13", + "mp3", + "audio15" +}; + +static const char *g_VideoTypes[16] = +{ + "video0", + "jpeg", + "h263", + "screen", + "vp6", + "vp6alpha", + "screen2", + "avc", + "video8", + "video9", + "video10", + "video11", + "video12", + "video13", + "video14", + "video15" +}; + +static const char *g_Rates[4] = +{ + "5.5 kHz", + "11 kHz", + "22 kHz", + "44 kHz" +}; + +static void MyStrCat(char *d, const char *s) +{ + MyStringCopy(d + MyStringLen(d), s); +} + +STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) +{ + NWindows::NCOM::CPropVariant prop; + const CItem2 &item = _items2[index]; + switch(propID) + { + case kpidExtension: + prop = _isRaw ? + (item.IsAudio() ? g_AudioTypes[item.SubType] : g_VideoTypes[item.SubType]) : + (item.IsAudio() ? "audio.flv" : "video.flv"); + break; + case kpidSize: + case kpidPackSize: + prop = (UInt64)item.Size; + break; + case kpidNumBlocks: prop = (UInt32)item.NumChunks; break; + case kpidComment: + { + char sz[64]; + MyStringCopy(sz, (item.IsAudio() ? g_AudioTypes[item.SubType] : g_VideoTypes[item.SubType]) ); + if (item.IsAudio()) + { + MyStrCat(sz, " "); + MyStrCat(sz, g_Rates[(item.Props >> 2) & 3]); + MyStrCat(sz, (item.Props & 2) ? " 16-bit" : " 8-bit"); + MyStrCat(sz, (item.Props & 1) ? " stereo" : " mono"); + } + prop = sz; + break; + } + } + prop.Detach(value); + return S_OK; +} + +/* +AString CHandler::GetComment() +{ + const Byte *p = _metadata; + size_t size = _metadata.GetCapacity(); + AString res; + if (size > 0) + { + p++; + size--; + for (;;) + { + if (size < 2) + break; + int len = Get16(p); + p += 2; + size -= 2; + if (len == 0 || (size_t)len > size) + break; + { + AString temp; + char *sz = temp.GetBuffer(len); + memcpy(sz, p, len); + sz[len] = 0; + temp.ReleaseBuffer(); + if (!res.IsEmpty()) + res += '\n'; + res += temp; + } + p += len; + size -= len; + if (size < 1) + break; + Byte type = *p++; + size--; + bool ok = false; + switch(type) + { + case 0: + { + if (size < 8) + break; + ok = true; + Byte reverse[8]; + for (int i = 0; i < 8; i++) + { + bool little_endian = 1; + if (little_endian) + reverse[i] = p[7 - i]; + else + reverse[i] = p[i]; + } + double d = *(double *)reverse; + char temp[32]; + sprintf(temp, " = %.3f", d); + res += temp; + p += 8; + size -= 8; + break; + } + case 8: + { + if (size < 4) + break; + ok = true; + // UInt32 numItems = Get32(p); + p += 4; + size -= 4; + break; + } + } + if (!ok) + break; + } + } + return res; +} + +STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) +{ + COM_TRY_BEGIN + NWindows::NCOM::CPropVariant prop; + switch(propID) + { + case kpidComment: prop = GetComment(); break; + } + prop.Detach(value); + return S_OK; + COM_TRY_END +} +*/ + +HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback) +{ + CRecordVector<CItem> items; + + const UInt32 kHeaderSize = 13; + Byte header[kHeaderSize]; + RINOK(ReadStream_FALSE(stream, header, kHeaderSize)); + if (header[0] != 'F' || + header[1] != 'L' || + header[2] != 'V' || + header[3] != 1 || + (header[4] & 0xFA) != 0) + return S_FALSE; + UInt32 offset = Get32(header + 5); + if (offset != 9 || Get32(header + 9) != 0) + return S_FALSE; + offset += 4; + + CByteBuffer inBuf; + size_t fileSize; + { + UInt64 fileSize64; + RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize64)); + if (fileSize64 > kFileSizeMax) + return S_FALSE; + + if (callback) + RINOK(callback->SetTotal(NULL, &fileSize64)) + + RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL)); + fileSize = (size_t)fileSize64; + inBuf.SetCapacity(fileSize); + for (size_t pos = 0; pos < fileSize;) + { + UInt64 offset64 = pos; + if (callback) + RINOK(callback->SetCompleted(NULL, &offset64)) + size_t rem = MyMin(fileSize - pos, (size_t)(1 << 20)); + RINOK(ReadStream_FALSE(stream, inBuf + pos, rem)); + pos += rem; + } + } + + int lasts[kNumTypes]; + int i; + for (i = 0; i < kNumTypes; i++) + lasts[i] = -1; + + while (offset < fileSize) + { + CItem item; + item.Offset = offset; + const Byte *buf = inBuf + offset; + offset += kTagHeaderSize; + if (offset > fileSize) + return S_FALSE; + + item.Type = buf[0]; + UInt32 size = Get24(buf + 1); + if (size < 1) + return S_FALSE; + // item.Time = Get24(buf + 4); + // item.Time |= (UInt32)buf[7] << 24; + if (Get24(buf + 8) != 0) // streamID + return S_FALSE; + + UInt32 curSize = kTagHeaderSize + size + 4; + item.Size = curSize; + + offset += curSize - kTagHeaderSize; + if (offset > fileSize) + return S_FALSE; + + if (Get32(buf + kTagHeaderSize + size) != kTagHeaderSize + size) + return S_FALSE; + + // printf("\noffset = %6X type = %2d time = %6d size = %6d", (UInt32)offset, item.Type, item.Time, item.Size); + + if (item.Type == kType_Meta) + { + // _metadata = item.Buf; + } + else + { + if (item.Type != kType_Audio && item.Type != kType_Video) + return S_FALSE; + if (items.Size() >= kNumChunksMax) + return S_FALSE; + Byte firstByte = buf[kTagHeaderSize]; + Byte subType, props; + if (item.Type == kType_Audio) + { + subType = firstByte >> 4; + props = firstByte & 0xF; + } + else + { + subType = firstByte & 0xF; + props = firstByte >> 4; + } + int last = lasts[item.Type]; + if (last < 0) + { + CItem2 item2; + item2.RefBuf = item2.BufSpec = new CReferenceBuf; + item2.Size = curSize; + item2.Type = item.Type; + item2.SubType = subType; + item2.Props = props; + item2.NumChunks = 1; + item2.SameSubTypes = true; + lasts[item.Type] = _items2.Add(item2); + } + else + { + CItem2 &item2 = _items2[last]; + if (subType != item2.SubType) + item2.SameSubTypes = false; + item2.Size += curSize; + item2.NumChunks++; + } + items.Add(item); + } + } + + _isRaw = (_items2.Size() == 1); + for (i = 0; i < _items2.Size(); i++) + { + CItem2 &item2 = _items2[i]; + CByteBuffer &itemBuf = item2.BufSpec->Buf; + if (_isRaw) + { + if (!item2.SameSubTypes) + return S_FALSE; + itemBuf.SetCapacity((size_t)item2.Size - (kTagHeaderSize + 4 + 1) * item2.NumChunks); + item2.Size = 0; + } + else + { + itemBuf.SetCapacity(kHeaderSize + (size_t)item2.Size); + memcpy(itemBuf, header, kHeaderSize); + itemBuf[4] = item2.IsAudio() ? kFlag_Audio : kFlag_Video; + item2.Size = kHeaderSize; + } + } + + for (i = 0; i < items.Size(); i++) + { + const CItem &item = items[i]; + CItem2 &item2 = _items2[lasts[item.Type]]; + size_t size = item.Size; + const Byte *src = inBuf + item.Offset; + if (_isRaw) + { + src += kTagHeaderSize + 1; + size -= (kTagHeaderSize + 4 + 1); + } + memcpy(item2.BufSpec->Buf + item2.Size, src, size); + item2.Size += size; + } + return S_OK; +} + +STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback) +{ + COM_TRY_BEGIN + Close(); + HRESULT res; + try + { + res = Open2(inStream, callback); + if (res == S_OK) + _stream = inStream; + } + catch(...) { res = S_FALSE; } + if (res != S_OK) + { + Close(); + return S_FALSE; + } + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CHandler::Close() +{ + _stream.Release(); + _items2.Clear(); + // _metadata.SetCapacity(0); + return S_OK; +} + +STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) +{ + *numItems = _items2.Size(); + return S_OK; +} + +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) +{ + COM_TRY_BEGIN + bool allFilesMode = (numItems == (UInt32)-1); + if (allFilesMode) + numItems = _items2.Size(); + if (numItems == 0) + return S_OK; + UInt64 totalSize = 0; + UInt32 i; + for (i = 0; i < numItems; i++) + totalSize += _items2[allFilesMode ? i : indices[i]].Size; + extractCallback->SetTotal(totalSize); + + totalSize = 0; + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr<ICompressProgressInfo> progress = lps; + lps->Init(extractCallback, false); + + for (i = 0; i < numItems; i++) + { + lps->InSize = lps->OutSize = totalSize; + RINOK(lps->SetCur()); + CMyComPtr<ISequentialOutStream> outStream; + Int32 askMode = testMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; + UInt32 index = allFilesMode ? i : indices[i]; + const CItem2 &item = _items2[index]; + RINOK(extractCallback->GetStream(index, &outStream, askMode)); + totalSize += item.Size; + if (!testMode && !outStream) + continue; + RINOK(extractCallback->PrepareOperation(askMode)); + if (outStream) + { + RINOK(WriteStream(outStream, item.BufSpec->Buf, item.BufSpec->Buf.GetCapacity())); + } + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); + } + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) +{ + COM_TRY_BEGIN + *stream = 0; + CBufInStream *streamSpec = new CBufInStream; + CMyComPtr<ISequentialInStream> streamTemp = streamSpec; + streamSpec->Init(_items2[index].BufSpec); + *stream = streamTemp.Detach(); + return S_OK; + COM_TRY_END +} + +static IInArchive *CreateArc() { return new CHandler; } + +static CArcInfo g_ArcInfo = + { L"FLV", L"flv", 0, 0xD6, { 'F', 'L', 'V' }, 3, false, CreateArc, 0 }; + +REGISTER_ARC(Flv) + +}} diff --git a/CPP/7zip/Archive/GzHandler.cpp b/CPP/7zip/Archive/GzHandler.cpp index 8f91003f..7b73bddc 100755 --- a/CPP/7zip/Archive/GzHandler.cpp +++ b/CPP/7zip/Archive/GzHandler.cpp @@ -20,7 +20,8 @@ #include "Common/InStreamWithCRC.h" #include "Common/OutStreamWithCRC.h" -#include "Common/ParseProperties.h" + +#include "DeflateProps.h" #define Get32(p) GetUi32(p) @@ -288,54 +289,6 @@ HRESULT CItem::WriteFooter(ISequentialOutStream *stream) return WriteStream(stream, buf, 8); } -static const UInt32 kAlgoX1 = 0; -static const UInt32 kAlgoX5 = 1; - -static const UInt32 kNumPassesX1 = 1; -static const UInt32 kNumPassesX7 = 3; -static const UInt32 kNumPassesX9 = 10; - -static const UInt32 kNumFastBytesX1 = 32; -static const UInt32 kNumFastBytesX7 = 64; -static const UInt32 kNumFastBytesX9 = 128; - -struct CCompressMode -{ - UInt32 NumPasses; - UInt32 NumFastBytes; - UInt32 Algo; - UInt32 Mc; - bool McDefined; - - bool IsMaximum() const { return Algo > 0; } - - void Init() - { - NumPasses = NumFastBytes = Mc = Algo = 0xFFFFFFFF; - McDefined = false; - } - - void Normalize(UInt32 level) - { - if (level == 0xFFFFFFFF) - level = 5; - if (NumPasses == 0xFFFFFFFF) - NumPasses = - (level >= 9 ? kNumPassesX9 : - (level >= 7 ? kNumPassesX7 : - kNumPassesX1)); - if (NumFastBytes == 0xFFFFFFFF) - NumFastBytes = - (level >= 9 ? kNumFastBytesX9 : - (level >= 7 ? kNumFastBytesX7 : - kNumFastBytesX1)); - if (Algo == 0xFFFFFFFF) - Algo = (level >= 5 ? - kAlgoX5 : - kAlgoX1); - } -}; - class CHandler: public IInArchive, public IArchiveOpenSeq, @@ -352,14 +305,7 @@ class CHandler: CMyComPtr<ICompressCoder> _decoder; NCompress::NDeflate::NDecoder::CCOMCoder *_decoderSpec; - CCompressMode _method; - UInt32 _level; - - void InitMethodProperties() - { - _level = 0xFFFFFFFF; - _method.Init(); - } + CDeflateProps _method; public: MY_UNKNOWN_IMP4(IInArchive, IArchiveOpenSeq, IOutArchive, ISetProperties) @@ -370,7 +316,6 @@ public: CHandler() { - InitMethodProperties(); _decoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder; _decoder = _decoderSpec; } @@ -496,28 +441,23 @@ STDMETHODIMP CHandler::Close() return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool allFilesMode = (numItems == (UInt32)-1); - if (!allFilesMode) - { - if (numItems == 0) - return S_OK; - if (numItems != 1 || indices[0] != 0) - return E_INVALIDARG; - } + if (numItems == 0) + return S_OK; + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) + return E_INVALIDARG; - bool testMode = (_aTestMode != 0); if (_stream) extractCallback->SetTotal(_packSize); UInt64 currentTotalPacked = 0; RINOK(extractCallback->SetCompleted(¤tTotalPacked)); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); if (!testMode && !realOutStream) return S_OK; @@ -557,8 +497,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (result != S_FALSE) return result; opRes = firstItem ? - NArchive::NExtract::NOperationResult::kDataError : - NArchive::NExtract::NOperationResult::kOK; + NExtract::NOperationResult::kDataError : + NExtract::NOperationResult::kOK; break; } } @@ -572,20 +512,20 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, { if (result != S_FALSE) return result; - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; break; } _decoderSpec->AlignToByte(); if (item.ReadFooter1(_decoderSpec) != S_OK) { - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; break; } if (item.Crc != outStreamSpec->GetCRC() || item.Size32 != (UInt32)(outStreamSpec->GetSize() - startOffset)) { - opRes = NArchive::NExtract::NOperationResult::kCRCError; + opRes = NExtract::NOperationResult::kCRCError; break; } } @@ -605,7 +545,7 @@ static HRESULT UpdateArchive( ISequentialOutStream *outStream, UInt64 unpackSize, const CItem &newItem, - const CCompressMode &compressionMode, + CDeflateProps &deflateProps, IArchiveUpdateCallback *updateCallback) { UInt64 complexity = 0; @@ -627,7 +567,7 @@ static HRESULT UpdateArchive( CItem item = newItem; item.Method = NHeader::NCompressionMethod::kDeflate; - item.ExtraFlags = compressionMode.IsMaximum() ? + item.ExtraFlags = deflateProps.IsMaximum() ? NHeader::NExtraFlags::kMaximum : NHeader::NExtraFlags::kFastest; @@ -637,26 +577,7 @@ static HRESULT UpdateArchive( NCompress::NDeflate::NEncoder::CCOMCoder *deflateEncoderSpec = new NCompress::NDeflate::NEncoder::CCOMCoder; CMyComPtr<ICompressCoder> deflateEncoder = deflateEncoderSpec; - { - NWindows::NCOM::CPropVariant props[] = - { - compressionMode.Algo, - compressionMode.NumPasses, - compressionMode.NumFastBytes, - compressionMode.Mc - }; - PROPID propIDs[] = - { - NCoderPropID::kAlgorithm, - NCoderPropID::kNumPasses, - NCoderPropID::kNumFastBytes, - NCoderPropID::kMatchFinderCycles - }; - int numProps = sizeof(propIDs) / sizeof(propIDs[0]); - if (!compressionMode.McDefined) - numProps--; - RINOK(deflateEncoderSpec->SetCoderProperties(propIDs, props, numProps)); - } + RINOK(deflateProps.SetCoderProperties(deflateEncoderSpec)); RINOK(deflateEncoder->Code(crcStream, outStream, NULL, NULL, progress)); item.Crc = inStreamSpec->GetCRC(); @@ -738,7 +659,6 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt size = prop.uhVal.QuadPart; } - _method.Normalize(_level); return UpdateArchive(outStream, size, newItem, _method, updateCallback); } @@ -760,49 +680,7 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps) { - InitMethodProperties(); - for (int i = 0; i < numProps; i++) - { - UString name = names[i]; - name.MakeUpper(); - if (name.IsEmpty()) - return E_INVALIDARG; - const PROPVARIANT &prop = values[i]; - if (name[0] == L'X') - { - UInt32 level = 9; - RINOK(ParsePropValue(name.Mid(1), prop, level)); - _level = level; - } - else if (name.Left(4) == L"PASS") - { - UInt32 num = kNumPassesX9; - RINOK(ParsePropValue(name.Mid(4), prop, num)); - _method.NumPasses = num; - } - else if (name.Left(2) == L"FB") - { - UInt32 num = kNumFastBytesX9; - RINOK(ParsePropValue(name.Mid(2), prop, num)); - _method.NumFastBytes = num; - } - else if (name.Left(2) == L"MC") - { - UInt32 num = 0xFFFFFFFF; - RINOK(ParsePropValue(name.Mid(2), prop, num)); - _method.Mc = num; - _method.McDefined = true; - } - else if (name.Left(1) == L"A") - { - UInt32 num = kAlgoX5; - RINOK(ParsePropValue(name.Mid(1), prop, num)); - _method.Algo = num; - } - else - return E_INVALIDARG; - } - return S_OK; + return _method.SetProperties(names, values, numProps); } static IInArchive *CreateArc() { return new CHandler; } @@ -813,7 +691,7 @@ static IOutArchive *CreateArcOut() { return new CHandler; } #endif static CArcInfo g_ArcInfo = - { L"GZip", L"gz gzip tgz tpz", L"* * .tar .tar", 0xEF, { 0x1F, 0x8B, 8 }, 3, true, CreateArc, CreateArcOut }; + { L"gzip", L"gz gzip tgz tpz", L"* * .tar .tar", 0xEF, { 0x1F, 0x8B, 8 }, 3, true, CreateArc, CreateArcOut }; REGISTER_ARC(GZip) diff --git a/CPP/7zip/Archive/Hfs/HfsHandler.cpp b/CPP/7zip/Archive/Hfs/HfsHandler.cpp index ade53877..f226458d 100755 --- a/CPP/7zip/Archive/Hfs/HfsHandler.cpp +++ b/CPP/7zip/Archive/Hfs/HfsHandler.cpp @@ -137,12 +137,11 @@ STDMETHODIMP CHandler::Close() return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _db.Items.Size(); if (numItems == 0) @@ -174,27 +173,27 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); if (item.IsDir()) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); UInt64 pos = 0; - int res = NArchive::NExtract::NOperationResult::kOK; + int res = NExtract::NOperationResult::kOK; int i; for (i = 0; i < item.Extents.Size(); i++) { if (item.Size == pos) break; - if (res != NArchive::NExtract::NOperationResult::kOK) + if (res != NExtract::NOperationResult::kOK) break; const CExtent &e = item.Extents[i]; RINOK(_stream->Seek((UInt64)e.Pos << _db.Header.BlockSizeLog, STREAM_SEEK_SET, NULL)); @@ -207,7 +206,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (rem == 0) { if (extentSize >= (UInt64)((UInt32)1 << _db.Header.BlockSizeLog)) - res = NArchive::NExtract::NOperationResult::kDataError; + res = NExtract::NOperationResult::kDataError; break; } UInt32 curSize = kBufSize; @@ -227,7 +226,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, } } if (i != item.Extents.Size() || item.Size != pos) - res = NArchive::NExtract::NOperationResult::kDataError; + res = NExtract::NOperationResult::kDataError; realOutStream.Release(); RINOK(extractCallback->SetOperationResult(res)); } diff --git a/CPP/7zip/Archive/Hfs/HfsRegister.cpp b/CPP/7zip/Archive/Hfs/HfsRegister.cpp index 2d706900..51c3c2b1 100755 --- a/CPP/7zip/Archive/Hfs/HfsRegister.cpp +++ b/CPP/7zip/Archive/Hfs/HfsRegister.cpp @@ -5,7 +5,7 @@ #include "../../Common/RegisterArc.h" #include "HfsHandler.h" -static IInArchive *CreateArc() { return new NArchive::NHfs::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NHfs::CHandler; } static CArcInfo g_ArcInfo = { L"HFS", L"hfs", 0, 0xE3, { 'H', '+', 0, 4 }, 4, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/Icons/split.ico b/CPP/7zip/Archive/Icons/split.ico Binary files differindex 5cb93e84..79cb089b 100755 --- a/CPP/7zip/Archive/Icons/split.ico +++ b/CPP/7zip/Archive/Icons/split.ico diff --git a/CPP/7zip/Archive/Iso/IsoHandler.cpp b/CPP/7zip/Archive/Iso/IsoHandler.cpp index ed8da189..9c20fec3 100755 --- a/CPP/7zip/Archive/Iso/IsoHandler.cpp +++ b/CPP/7zip/Archive/Iso/IsoHandler.cpp @@ -152,12 +152,11 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val COM_TRY_END } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _archive.Refs.Size(); if (numItems == 0) @@ -203,8 +202,9 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); currentItemSize = 0; CMyComPtr<ISequentialOutStream> realOutStream; - Int32 askMode; - askMode = testMode ? NArchive::NExtract::NAskMode::kTest : NArchive::NExtract::NAskMode::kExtract; + Int32 askMode = testMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; UInt32 index = allFilesMode ? i : indices[i]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); @@ -217,7 +217,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (item.IsDir()) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } currentItemSize = item.DataLength; @@ -231,7 +231,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, blockIndex = be.LoadRBA; } - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); outStreamSpec->SetStream(realOutStream); @@ -242,8 +242,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); outStreamSpec->ReleaseStream(); RINOK(extractCallback->SetOperationResult(outStreamSpec->IsFinishedOK() ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); } return S_OK; COM_TRY_END diff --git a/CPP/7zip/Archive/Iso/IsoRegister.cpp b/CPP/7zip/Archive/Iso/IsoRegister.cpp index b43caba3..39f91198 100755 --- a/CPP/7zip/Archive/Iso/IsoRegister.cpp +++ b/CPP/7zip/Archive/Iso/IsoRegister.cpp @@ -5,7 +5,7 @@ #include "../../Common/RegisterArc.h" #include "IsoHandler.h" -static IInArchive *CreateArc() { return new NArchive::NIso::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NIso::CHandler; } static CArcInfo g_ArcInfo = { L"Iso", L"iso", 0, 0xE7, { 'C', 'D', '0', '0', '1', 0x1 }, 7, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/LzhHandler.cpp b/CPP/7zip/Archive/LzhHandler.cpp index 19a9516a..b9d953b9 100755 --- a/CPP/7zip/Archive/LzhHandler.cpp +++ b/CPP/7zip/Archive/LzhHandler.cpp @@ -168,13 +168,11 @@ struct CItem AString GetName() const { AString dirName = GetDirName(); - dirName.Replace((char)(unsigned char)0xFF, '\\'); - if (!dirName.IsEmpty()) - { - char c = dirName[dirName.Length() - 1]; - if (c != '\\') - dirName += '\\'; - } + const char kDirSeparator = '\\'; + // check kDirSeparator in Linux + dirName.Replace((char)(unsigned char)0xFF, kDirSeparator); + if (!dirName.IsEmpty() && dirName.Back() != kDirSeparator) + dirName += kDirSeparator; return dirName + GetFileName(); } }; @@ -469,7 +467,7 @@ STDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *pro { UInt32 realProcessedSize; HRESULT result; - if(!_stream) + if (!_stream) { realProcessedSize = size; result = S_OK; @@ -477,7 +475,7 @@ STDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *pro else result = _stream->Write(data, size, &realProcessedSize); _crc.Update(data, realProcessedSize); - if(processedSize != NULL) + if (processedSize != NULL) *processedSize = realProcessedSize; return result; } @@ -630,24 +628,19 @@ STDMETHODIMP CHandler::Close() return S_OK; } - - -////////////////////////////////////// -// CHandler::DecompressItems - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, Int32 testModeSpec, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN bool testMode = (testModeSpec != 0); UInt64 totalUnPacked = 0, totalPacked = 0; - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _items.Size(); - if(numItems == 0) + if (numItems == 0) return S_OK; UInt32 i; - for(i = 0; i < numItems; i++) + for (i = 0; i < numItems; i++) { const CItemEx &item = _items[allFilesMode ? i : indices[i]]; totalUnPacked += item.Size; @@ -674,7 +667,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, CMyComPtr<ISequentialInStream> inStream(streamSpec); streamSpec->SetStream(_stream); - for(i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked, + for (i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked, currentTotalPacked += currentItemPacked) { currentItemUnPacked = 0; @@ -702,7 +695,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, continue; } - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); @@ -773,7 +766,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, COM_TRY_END } -static IInArchive *CreateArc() { return new CHandler; } +static IInArchive *CreateArc() { return new CHandler; } static CArcInfo g_ArcInfo = { L"Lzh", L"lzh lha", 0, 6, { '-', 'l' }, 2, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/LzmaHandler.cpp b/CPP/7zip/Archive/LzmaHandler.cpp index 5dd0aac7..d9851501 100755 --- a/CPP/7zip/Archive/LzmaHandler.cpp +++ b/CPP/7zip/Archive/LzmaHandler.cpp @@ -319,28 +319,23 @@ STDMETHODIMP CHandler::Close() } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool allFilesMode = (numItems == (UInt32)-1); - if (!allFilesMode) - { - if (numItems == 0) - return S_OK; - if (numItems != 1 || indices[0] != 0) - return E_INVALIDARG; - } + if (numItems == 0) + return S_OK; + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) + return E_INVALIDARG; - bool testMode = (_aTestMode != 0); if (_stream) extractCallback->SetTotal(_packSize); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); if (!testMode && !realOutStream) return S_OK; @@ -368,7 +363,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, _lzma86, _seqStream); RINOK(result); - Int32 opRes = NArchive::NExtract::NOperationResult::kOK; + Int32 opRes = NExtract::NOperationResult::kOK; bool firstItem = true; for (;;) @@ -395,12 +390,12 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, result = decoder.Code(st, outStream, progress); if (result == E_NOTIMPL) { - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + opRes = NExtract::NOperationResult::kUnSupportedMethod; break; } if (result == S_FALSE) { - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; break; } RINOK(result); diff --git a/CPP/7zip/Archive/MachoHandler.cpp b/CPP/7zip/Archive/MachoHandler.cpp index 342a8e76..8d313b54 100755 --- a/CPP/7zip/Archive/MachoHandler.cpp +++ b/CPP/7zip/Archive/MachoHandler.cpp @@ -399,12 +399,11 @@ STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _sections.Size(); if (numItems == 0) @@ -434,8 +433,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, lps->InSize = lps->OutSize = currentTotalSize; RINOK(lps->SetCur()); Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; UInt32 index = allFilesMode ? i : indices[i]; const CSection &item = _sections[index]; currentItemSize = item.GetPackSize(); @@ -451,8 +450,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); outStream.Release(); RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == currentItemSize ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); } return S_OK; COM_TRY_END diff --git a/CPP/7zip/Archive/MbrHandler.cpp b/CPP/7zip/Archive/MbrHandler.cpp index 47b18f15..e2aa067f 100755 --- a/CPP/7zip/Archive/MbrHandler.cpp +++ b/CPP/7zip/Archive/MbrHandler.cpp @@ -431,12 +431,11 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val COM_TRY_END } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _items.Size(); if (numItems == 0) @@ -467,14 +466,14 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> outStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; const CItem &item = _items[index]; const CPartition &part = item.Part; RINOK(extractCallback->GetStream(index, &outStream, askMode)); totalSize += item.Size; - if (!testMode && (!outStream)) + if (!testMode && !outStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); @@ -483,8 +482,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); outStream.Release(); RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == item.Size ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); } return S_OK; COM_TRY_END @@ -498,7 +497,7 @@ STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) COM_TRY_END } -static IInArchive *CreateArc() { return new CHandler; } +static IInArchive *CreateArc() { return new CHandler; } static CArcInfo g_ArcInfo = { L"MBR", L"mbr", 0, 0xDB, { 1, 1, 0 }, 3, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/MslzHandler.cpp b/CPP/7zip/Archive/MslzHandler.cpp new file mode 100755 index 00000000..67495e76 --- /dev/null +++ b/CPP/7zip/Archive/MslzHandler.cpp @@ -0,0 +1,257 @@ +// MslzHandler.cpp + +#include "StdAfx.h" + +#include "../../../C/CpuArch.h" + +#include "Common/ComTry.h" +#include "Common/MyString.h" + +#include "Windows/PropVariant.h" + +#include "../Common/InBuffer.h" +#include "../Common/ProgressUtils.h" +#include "../Common/RegisterArc.h" +#include "../Common/StreamUtils.h" + +#include "Common/DummyOutStream.h" + +namespace NArchive { +namespace NMslz { + +class CHandler: + public IInArchive, + public CMyUnknownImp +{ + CMyComPtr<IInStream> _stream; + UInt32 _size; + UInt64 _packSize; + UString _name; +public: + MY_UNKNOWN_IMP1(IInArchive) + INTERFACE_IInArchive(;) +}; + +STATPROPSTG kProps[] = +{ + { NULL, kpidPath, VT_BSTR}, + { NULL, kpidSize, VT_UI8}, + { NULL, kpidPackSize, VT_UI8}, +}; + +IMP_IInArchive_Props +IMP_IInArchive_ArcProps_NO + +STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) +{ + *numItems = 1; + return S_OK; +} + +STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value) +{ + COM_TRY_BEGIN + NWindows::NCOM::CPropVariant prop; + switch(propID) + { + case kpidPath: if (!_name.IsEmpty()) prop = _name; break; + case kpidSize: prop = _size; break; + case kpidPackSize: prop = _packSize; break; + } + prop.Detach(value); + return S_OK; + COM_TRY_END +} + +static const unsigned kSignatureSize = 9; +static const unsigned kHeaderSize = kSignatureSize + 1 + 4; +#define MSLZ_SIGNATURE { 0x53, 0x5A, 0x44, 0x44, 0x88, 0xF0, 0x27, 0x33, 0x41 } +// old signature: 53 5A 20 88 F0 27 33 +static const Byte signature[kSignatureSize] = MSLZ_SIGNATURE; + +static const wchar_t *g_Exts[] = +{ + L"dll", + L"exe", + L"kmd", + L"sys" +}; + +STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 * /* maxCheckStartPosition */, + IArchiveOpenCallback *callback) +{ + COM_TRY_BEGIN + { + Close(); + Byte buffer[kHeaderSize]; + RINOK(ReadStream_FALSE(stream, buffer, kHeaderSize)); + if (memcmp(buffer, signature, kSignatureSize) != 0) + return S_FALSE; + _size = GetUi32(buffer + 10); + if (_size > 0xFFFFFFE0) + return S_FALSE; + RINOK(stream->Seek(0, STREAM_SEEK_END, &_packSize)); + + if (callback) + { + CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback; + callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback); + if (openVolumeCallback) + { + NWindows::NCOM::CPropVariant prop; + if (openVolumeCallback->GetProperty(kpidName, &prop) == S_OK && prop.vt == VT_BSTR) + { + UString baseName = prop.bstrVal; + if (!baseName.IsEmpty() && baseName.Back() == L'_') + { + baseName.DeleteBack(); + Byte replaceByte = buffer[kSignatureSize]; + if (replaceByte == 0) + { + for (int i = 0; i < sizeof(g_Exts) / sizeof(g_Exts[0]); i++) + { + UString s = g_Exts[i]; + int len = s.Length(); + Byte b = (Byte)s.Back(); + s.DeleteBack(); + if (baseName.Length() >= len && + baseName[baseName.Length() - len] == '.' && + s.CompareNoCase(baseName.Right(len - 1)) == 0) + { + replaceByte = b; + break; + } + } + } + if (replaceByte >= 0x20 && replaceByte < 0x80) + _name = baseName + (wchar_t)replaceByte; + } + } + } + } + _stream = stream; + } + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CHandler::Close() +{ + _stream.Release(); + _name.Empty(); + return S_OK; +} + +// MslzDec is modified LZSS algorithm of Haruhiko Okumura: +// maxLen = 18; Okumura +// maxLen = 16; MS + +#define PROGRESS_AND_WRITE \ + if ((dest & kMask) == 0) { RINOK(WriteStream(outStream, buf, kBufSize)); \ + if ((dest & ((1 << 20) - 1)) == 0) \ + { UInt64 inSize = inStream.GetProcessedSize(); UInt64 outSize = dest; \ + RINOK(progress->SetRatioInfo(&inSize, &outSize)); }} + +static HRESULT MslzDec(CInBuffer &inStream, ISequentialOutStream *outStream, UInt32 unpackSize, ICompressProgressInfo *progress) +{ + const unsigned kBufSize = (1 << 12); + const unsigned kMask = kBufSize - 1; + Byte buf[kBufSize]; + UInt32 dest = 0; + memset(buf, ' ', kBufSize); + while (dest < unpackSize) + { + Byte b; + if (!inStream.ReadByte(b)) + return S_FALSE; + for (unsigned mask = (unsigned)b | 0x100; mask > 1 && dest < unpackSize; mask >>= 1) + { + if (!inStream.ReadByte(b)) + return S_FALSE; + if (mask & 1) + { + buf[dest++ & kMask] = b; + PROGRESS_AND_WRITE + } + else + { + Byte b1; + if (!inStream.ReadByte(b1)) + return S_FALSE; + const unsigned kMaxLen = 16; // 18 in Okumura's code. + unsigned src = (((((unsigned)b1 & 0xF0) << 4) | b) + kMaxLen) & kMask; + unsigned len = (b1 & 0xF) + 3; + if (len > kMaxLen || dest + len > unpackSize) + return S_FALSE; + do + { + buf[dest++ & kMask] = buf[src++ & kMask]; + PROGRESS_AND_WRITE + } + while (--len != 0); + } + } + } + return WriteStream(outStream, buf, dest & kMask); +} + +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) +{ + COM_TRY_BEGIN + if (numItems == 0) + return S_OK; + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) + return E_INVALIDARG; + + extractCallback->SetTotal(_size); + + CMyComPtr<ISequentialOutStream> realOutStream; + Int32 askMode = testMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; + RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); + if (!testMode && !realOutStream) + return S_OK; + + extractCallback->PrepareOperation(askMode); + + CDummyOutStream *outStreamSpec = new CDummyOutStream; + CMyComPtr<ISequentialOutStream> outStream(outStreamSpec); + outStreamSpec->SetStream(realOutStream); + outStreamSpec->Init(); + realOutStream.Release(); + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr<ICompressProgressInfo> progress = lps; + lps->Init(extractCallback, false); + + RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL)); + CInBuffer s; + if (!s.Create(1 << 20)) + return E_OUTOFMEMORY; + s.SetStream(_stream); + s.Init(); + Byte buffer[kHeaderSize]; + Int32 opRes = NExtract::NOperationResult::kDataError; + if (s.ReadBytes(buffer, kHeaderSize) == kHeaderSize) + { + HRESULT result = MslzDec(s, outStream, _size, progress); + if (result == S_OK) + opRes = NExtract::NOperationResult::kOK; + else if (result != S_FALSE) + return result; + } + outStream.Release(); + return extractCallback->SetOperationResult(opRes); + COM_TRY_END +} + +static IInArchive *CreateArc() { return new CHandler; } + +static CArcInfo g_ArcInfo = + { L"MsLZ", L"", 0, 0xD5, MSLZ_SIGNATURE, kSignatureSize, false, CreateArc, 0 }; + +REGISTER_ARC(Mslz) + +}} diff --git a/CPP/7zip/Archive/MubHandler.cpp b/CPP/7zip/Archive/MubHandler.cpp index f099aad2..da4df24c 100755 --- a/CPP/7zip/Archive/MubHandler.cpp +++ b/CPP/7zip/Archive/MubHandler.cpp @@ -187,12 +187,11 @@ STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _numItems; if (numItems == 0) @@ -222,19 +221,19 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; UInt32 index = allFilesMode ? i : indices[i]; const CItem &item = _items[index]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); currentTotalSize += item.Size; - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); if (testMode) { - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } RINOK(_stream->Seek(_startPos + item.Offset, STREAM_SEEK_SET, NULL)); @@ -242,8 +241,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress)); realOutStream.Release(); RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); } return S_OK; COM_TRY_END diff --git a/CPP/7zip/Archive/Nsis/NsisHandler.cpp b/CPP/7zip/Archive/Nsis/NsisHandler.cpp index f2e3aab6..9a5daadf 100755 --- a/CPP/7zip/Archive/Nsis/NsisHandler.cpp +++ b/CPP/7zip/Archive/Nsis/NsisHandler.cpp @@ -263,12 +263,11 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val COM_TRY_END } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) GetNumberOfItems(&numItems); if(numItems == 0) @@ -326,8 +325,9 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, currentItemSize = 0; RINOK(extractCallback->SetCompleted(¤tTotalSize)); CMyComPtr<ISequentialOutStream> realOutStream; - Int32 askMode; - askMode = testMode ? NArchive::NExtract::NAskMode::kTest : NArchive::NExtract::NAskMode::kExtract; + Int32 askMode = testMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; UInt32 index = allFilesMode ? i : indices[i]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); @@ -336,7 +336,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (index >= (UInt32)_archive.Items.Size()) { currentItemSize = _archive.Script.Length(); - if(!testMode && (!realOutStream)) + if(!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); if (!testMode) @@ -352,7 +352,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, else GetCompressedSize(index, currentItemSize); - if(!testMode && (!realOutStream)) + if(!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); @@ -477,8 +477,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, } realOutStream.Release(); RINOK(extractCallback->SetOperationResult(dataError ? - NArchive::NExtract::NOperationResult::kDataError : - NArchive::NExtract::NOperationResult::kOK)); + NExtract::NOperationResult::kDataError : + NExtract::NOperationResult::kOK)); } return S_OK; COM_TRY_END diff --git a/CPP/7zip/Archive/Nsis/NsisIn.cpp b/CPP/7zip/Archive/Nsis/NsisIn.cpp index 9e7e89bb..06cc38eb 100755 --- a/CPP/7zip/Archive/Nsis/NsisIn.cpp +++ b/CPP/7zip/Archive/Nsis/NsisIn.cpp @@ -1,30 +1,21 @@ -// Archive/NsisIn.cpp +// NsisIn.cpp #include "StdAfx.h" -// #include <stdio.h> - -#include "NsisIn.h" -#include "NsisDecode.h" +#include "../../../../C/CpuArch.h" -#include "Windows/Defs.h" +#include "Common/IntToString.h" #include "../../Common/StreamUtils.h" -#include "Common/StringConvert.h" -#include "Common/IntToString.h" - -#include "../../../../C/CpuArch.h" +#include "NsisIn.h" #define Get32(p) GetUi32(p) namespace NArchive { namespace NNsis { -Byte kSignature[kSignatureSize] = { 0xEF + 1, 0xBE, 0xAD, 0xDE, -0x4E, 0x75, 0x6C, 0x6C, 0x73, 0x6F, 0x66, 0x74, 0x49, 0x6E, 0x73, 0x74}; - -struct CSignatureInit { CSignatureInit() { kSignature[0]--; } } g_SignatureInit; +Byte kSignature[kSignatureSize] = NSIS_SIGNATURE; #ifdef NSIS_SCRIPT static const char *kCrLf = "\x0D\x0A"; diff --git a/CPP/7zip/Archive/Nsis/NsisIn.h b/CPP/7zip/Archive/Nsis/NsisIn.h index 1fa6b4a6..3fc08440 100755 --- a/CPP/7zip/Archive/Nsis/NsisIn.h +++ b/CPP/7zip/Archive/Nsis/NsisIn.h @@ -1,17 +1,12 @@ -// Archive/NsisIn.h +// NsisIn.h #ifndef __ARCHIVE_NSIS_IN_H #define __ARCHIVE_NSIS_IN_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" // #define NSIS_SCRIPT @@ -20,6 +15,8 @@ namespace NArchive { namespace NNsis { const int kSignatureSize = 16; +#define NSIS_SIGNATURE { 0xEF, 0xBE, 0xAD, 0xDE, 0x4E, 0x75, 0x6C, 0x6C, 0x73, 0x6F, 0x66, 0x74, 0x49, 0x6E, 0x73, 0x74} + extern Byte kSignature[kSignatureSize]; const UInt32 kFlagsMask = 0xF; diff --git a/CPP/7zip/Archive/Nsis/NsisRegister.cpp b/CPP/7zip/Archive/Nsis/NsisRegister.cpp index 7e6f7acb..41dedb0d 100755 --- a/CPP/7zip/Archive/Nsis/NsisRegister.cpp +++ b/CPP/7zip/Archive/Nsis/NsisRegister.cpp @@ -5,10 +5,9 @@ #include "../../Common/RegisterArc.h" #include "NsisHandler.h" -static IInArchive *CreateArc() { return new NArchive::NNsis::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NNsis::CHandler; } static CArcInfo g_ArcInfo = - { L"Nsis", 0, 0, 0x9, { 0xEF, 0xBE, 0xAD, 0xDE, -0x4E, 0x75, 0x6C, 0x6C, 0x73, 0x6F, 0x66, 0x74, 0x49, 0x6E, 0x73, 0x74}, 16, false, CreateArc, 0 }; + { L"Nsis", L"", 0, 0x9, NSIS_SIGNATURE, NArchive::NNsis::kSignatureSize, false, CreateArc, 0 }; REGISTER_ARC(Nsis) diff --git a/CPP/7zip/Archive/NtfsHandler.cpp b/CPP/7zip/Archive/NtfsHandler.cpp index 37847a24..f88dd012 100755 --- a/CPP/7zip/Archive/NtfsHandler.cpp +++ b/CPP/7zip/Archive/NtfsHandler.cpp @@ -124,7 +124,11 @@ bool CHeader::Parse(const Byte *p) // DriveNumber = p[0x24]; if (p[0x25] != 0) // CurrentHead return false; - if (p[0x26] != 0x80) // ExtendedBootSig + /* + NTFS-HDD: p[0x26] = 0x80 + NTFS-FLASH: p[0x26] = 0 + */ + if (p[0x26] != 0x80 && p[0x26] != 0) // ExtendedBootSig return false; if (p[0x27] != 0) // reserved return false; @@ -916,6 +920,9 @@ struct CDataRef int Num; }; +static const UInt32 kMagic_FILE = 0x454c4946; +static const UInt32 kMagic_BAAD = 0x44414142; + struct CMftRec { UInt32 Magic; @@ -934,7 +941,6 @@ struct CMftRec CSiAttr SiAttr; - void MoveAttrsFrom(CMftRec &src) { DataAttrs += src.DataAttrs; @@ -954,6 +960,8 @@ struct CMftRec bool Parse(Byte *p, int sectorSizeLog, UInt32 numSectors, UInt32 recNumber, CObjectVector<CAttr> *attrs); bool IsEmpty() const { return (Magic <= 2); } + bool IsFILE() const { return (Magic == kMagic_FILE); } + bool IsBAAD() const { return (Magic == kMagic_BAAD); } bool InUse() const { return (Flags & 1) != 0; } bool IsDir() const { return (Flags & 2) != 0; } @@ -1032,10 +1040,8 @@ bool CMftRec::Parse(Byte *p, int sectorSizeLog, UInt32 numSectors, UInt32 recNum CObjectVector<CAttr> *attrs) { G32(p, Magic); - if (IsEmpty()) - return true; - if (Magic != 0x454c4946) - return false; + if (!IsFILE()) + return IsEmpty() || IsBAAD(); UInt32 usaOffset; UInt32 numUsaItems; @@ -1246,7 +1252,7 @@ HRESULT CDatabase::Open() numSectorsInRec = 1 << (recSizeLog - Header.SectorSizeLog); if (!mftRec.Parse(ByteBuf, Header.SectorSizeLog, numSectorsInRec, NULL, 0)) return S_FALSE; - if (mftRec.IsEmpty()) + if (!mftRec.IsFILE()) return S_FALSE; mftRec.ParseDataNames(); if (mftRec.DataRefs.IsEmpty()) @@ -1331,7 +1337,7 @@ HRESULT CDatabase::Open() for (i = 0; i < Recs.Size(); i++) { CMftRec &rec = Recs[i]; - if (rec.IsEmpty() || !rec.BaseMftRef.IsBaseItself()) + if (!rec.IsFILE() || !rec.BaseMftRef.IsBaseItself()) continue; int numNames = 0; // printf("\n%4d: ", i); @@ -1610,12 +1616,11 @@ STDMETHODIMP CHandler::Close() return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = Items.Size(); if (numItems == 0) @@ -1655,8 +1660,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); @@ -1664,11 +1669,11 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (item.IsDir()) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); @@ -1679,12 +1684,12 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, const CMftRec &rec = Recs[item.RecIndex]; const CAttr &data = rec.DataAttrs[rec.DataRefs[item.DataIndex].Start]; - int res = NArchive::NExtract::NOperationResult::kDataError; + int res = NExtract::NOperationResult::kDataError; { CMyComPtr<IInStream> inStream; HRESULT hres = rec.GetStream(InStream, item.DataIndex, Header.ClusterSizeLog, Header.NumClusters, &inStream); if (hres == S_FALSE) - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + res = NExtract::NOperationResult::kUnSupportedMethod; else { RINOK(hres); @@ -1696,7 +1701,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(hres); } if (/* copyCoderSpec->TotalSize == item.GetSize() && */ hres == S_OK) - res = NArchive::NExtract::NOperationResult::kOK; + res = NExtract::NOperationResult::kOK; } } } @@ -1715,7 +1720,7 @@ STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) return S_OK; } -static IInArchive *CreateArc() { return new CHandler; } +static IInArchive *CreateArc() { return new CHandler; } static CArcInfo g_ArcInfo = { L"NTFS", L"ntfs img", 0, 0xD9, { 'N', 'T', 'F', 'S', ' ', ' ', ' ', ' ', 0 }, 9, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/PeHandler.cpp b/CPP/7zip/Archive/PeHandler.cpp index a1304ae4..fd900a58 100755 --- a/CPP/7zip/Archive/PeHandler.cpp +++ b/CPP/7zip/Archive/PeHandler.cpp @@ -4,9 +4,10 @@ #include "../../../C/CpuArch.h" -#include "Common/Buffer.h" +#include "Common/DynamicBuffer.h" #include "Common/ComTry.h" #include "Common/IntToString.h" +#include "Common/StringConvert.h" #include "Windows/PropVariantUtils.h" #include "Windows/Time.h" @@ -14,6 +15,7 @@ #include "../Common/LimitedStreams.h" #include "../Common/ProgressUtils.h" #include "../Common/RegisterArc.h" +#include "../Common/StreamObjects.h" #include "../Common/StreamUtils.h" #include "../Compress/CopyCoder.h" @@ -168,6 +170,14 @@ struct COptHeader bool Is64Bit() const { return Magic == PE_OptHeader_Magic_64; } bool Parse(const Byte *p, UInt32 size); + + int GetNumFileAlignBits() const + { + for (int i = 9; i <= 16; i++) + if (((UInt32)1 << i) == FileAlign) + return i; + return -1; + } }; bool COptHeader::Parse(const Byte *p, UInt32 size) @@ -262,8 +272,8 @@ struct CSection void Parse(const Byte *p); }; -static bool operator <(const CSection &a1, const CSection &a2) { return (a1.Pa < a2.Pa); } -static bool operator ==(const CSection &a1, const CSection &a2) { return (a1.Pa == a2.Pa); } +static bool operator <(const CSection &a1, const CSection &a2) { return (a1.Pa < a2.Pa) || ((a1.Pa == a2.Pa) && (a1.PSize < a2.PSize)) ; } +static bool operator ==(const CSection &a1, const CSection &a2) { return (a1.Pa == a2.Pa) && (a1.PSize == a2.PSize); } static AString GetName(const Byte *name) { @@ -378,23 +388,182 @@ static const CUInt32PCharPair g_SubSystems[] = { 14, "XBOX" } }; +static const wchar_t *g_ResTypes[] = +{ + NULL, + L"CURSOR", + L"BITMAP", + L"ICON", + L"MENU", + L"DIALOG", + L"STRING", + L"FONTDIR", + L"FONT", + L"ACCELERATOR", + L"RCDATA", + L"MESSAGETABLE", + L"GROUP_CURSOR", + NULL, + L"GROUP_ICON", + NULL, + L"VERSION", + L"DLGINCLUDE", + NULL, + L"PLUGPLAY", + L"VXD", + L"ANICURSOR", + L"ANIICON", + L"HTML", + L"MANIFEST" +}; + +const UInt32 kFlag = (UInt32)1 << 31; +const UInt32 kMask = ~kFlag; + +struct CTableItem +{ + UInt32 Offset; + UInt32 ID; +}; + + +const UInt32 kBmpHeaderSize = 14; +const UInt32 kIconHeaderSize = 22; + +struct CResItem +{ + UInt32 Type; + UInt32 ID; + UInt32 Lang; + + UInt32 Size; + UInt32 Offset; + + UInt32 HeaderSize; + Byte Header[kIconHeaderSize]; // it must be enough for max size header. + bool Enabled; + + bool IsNameEqual(const CResItem &item) const { return Lang == item.Lang; } + UInt32 GetSize() const { return Size + HeaderSize; } + bool IsBmp() const { return Type == 2; } + bool IsIcon() const { return Type == 3; } + bool IsString() const { return Type == 6; } +}; + +struct CStringItem +{ + UInt32 Lang; + UInt32 Size; + CByteDynamicBuffer Buf; + + void AddChar(Byte c); + void AddWChar(UInt16 c); +}; + +void CStringItem::AddChar(Byte c) +{ + Buf.EnsureCapacity(Size + 2); + Buf[Size++] = c; + Buf[Size++] = 0; +} + +void CStringItem::AddWChar(UInt16 c) +{ + if (c == '\n') + { + AddChar('\\'); + c = 'n'; + } + Buf.EnsureCapacity(Size + 2); + SetUi16(Buf + Size, c); + Size += 2; +} + +struct CMixItem +{ + int SectionIndex; + int ResourceIndex; + int StringIndex; + + bool IsSectionItem() const { return ResourceIndex < 0 && StringIndex < 0; }; +}; + +struct CUsedBitmap +{ + CByteBuffer Buf; +public: + void Alloc(size_t size) + { + size = (size + 7) / 8; + Buf.SetCapacity(size); + memset(Buf, 0, size); + } + void Free() + { + Buf.SetCapacity(0); + } + bool SetRange(size_t from, int size) + { + for (int i = 0; i < size; i++) + { + size_t pos = (from + i) >> 3; + Byte mask = (Byte)(1 << ((from + i) & 7)); + Byte b = Buf[pos]; + if ((b & mask) != 0) + return false; + Buf[pos] = b | mask; + } + return true; + } +}; + + class CHandler: public IInArchive, + public IInArchiveGetStream, public CMyUnknownImp { - CMyComPtr<IInStream> _inStream; + CMyComPtr<IInStream> _stream; CObjectVector<CSection> _sections; UInt32 _peOffset; CHeader _header; COptHeader _optHeader; UInt32 _totalSize; UInt32 _totalSizeLimited; + + CRecordVector<CResItem> _items; + CObjectVector<CStringItem> _strings; + + CByteBuffer _buf; + bool _oneLang; + UString _resourceFileName; + CUsedBitmap _usedRes; + bool _parseResources; + + CRecordVector<CMixItem> _mixItems; + HRESULT LoadDebugSections(IInStream *stream, bool &thereIsSection); - HRESULT Open2(IInStream *stream); + HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback); bool Parse(const Byte *buf, UInt32 size); + + void AddResNameToString(UString &s, UInt32 id) const; + UString GetLangPrefix(UInt32 lang); + HRESULT ReadString(UInt32 offset, UString &dest) const; + HRESULT ReadTable(UInt32 offset, CRecordVector<CTableItem> &items); + bool ParseStringRes(UInt32 id, UInt32 lang, const Byte *src, UInt32 size); + HRESULT OpenResources(int sectIndex, IInStream *stream, IArchiveOpenCallback *callback); + void CloseResources(); + + + bool CheckItem(const CSection §, const CResItem &item, size_t offset) const + { + return item.Offset >= sect.Va && offset <= _buf.GetCapacity() && _buf.GetCapacity() - offset >= item.Size; + } + public: - MY_UNKNOWN_IMP1(IInArchive) + MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream) INTERFACE_IInArchive(;) + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream); }; bool CHandler::Parse(const Byte *buf, UInt32 size) @@ -524,25 +693,25 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) break; } - case kpidOsVer: VerToProp(_optHeader.OsVer, prop); break; - case kpidImageVer: VerToProp(_optHeader.ImageVer, prop); break; - case kpidSubsysVer: VerToProp(_optHeader.SubsysVer, prop); break; - case kpidCodeSize: prop = _optHeader.CodeSize; break; - case kpidInitDataSize: prop = _optHeader.InitDataSize; break; - case kpidUnInitDataSize: prop = _optHeader.UninitDataSize; break; - case kpidImageSize: prop = _optHeader.ImageSize; break; - case kpidPhySize: prop = _totalSize; break; - case kpidHeadersSize: prop = _optHeader.HeadersSize; break; - case kpidChecksum: prop = _optHeader.CheckSum; break; + case kpidOsVer: VerToProp(_optHeader.OsVer, prop); break; + case kpidImageVer: VerToProp(_optHeader.ImageVer, prop); break; + case kpidSubsysVer: VerToProp(_optHeader.SubsysVer, prop); break; + case kpidCodeSize: prop = _optHeader.CodeSize; break; + case kpidInitDataSize: prop = _optHeader.InitDataSize; break; + case kpidUnInitDataSize: prop = _optHeader.UninitDataSize; break; + case kpidImageSize: prop = _optHeader.ImageSize; break; + case kpidPhySize: prop = _totalSize; break; + case kpidHeadersSize: prop = _optHeader.HeadersSize; break; + case kpidChecksum: prop = _optHeader.CheckSum; break; - case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _header.Machine, prop); break; - case kpidBit64: if (_optHeader.Is64Bit()) prop = true; break; - case kpidSubSystem: PAIR_TO_PROP(g_SubSystems, _optHeader.SubSystem, prop); break; + case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _header.Machine, prop); break; + case kpidBit64: if (_optHeader.Is64Bit()) prop = true; break; + case kpidSubSystem: PAIR_TO_PROP(g_SubSystems, _optHeader.SubSystem, prop); break; case kpidMTime: - case kpidCTime: TimeToProp(_header.Time, prop); break; - case kpidCharacts: FLAGS_TO_PROP(g_HeaderCharacts, _header.Flags, prop); break; - case kpidDllCharacts: FLAGS_TO_PROP(g_DllCharacts, _optHeader.DllCharacts, prop); break; + case kpidCTime: TimeToProp(_header.Time, prop); break; + case kpidCharacts: FLAGS_TO_PROP(g_HeaderCharacts, _header.Flags, prop); break; + case kpidDllCharacts: FLAGS_TO_PROP(g_DllCharacts, _optHeader.DllCharacts, prop); break; case kpidStackReserve: prop = _optHeader.StackReserve; break; case kpidStackCommit: prop = _optHeader.StackCommit; break; case kpidHeapReserve: prop = _optHeader.HeapReserve; break; @@ -553,22 +722,105 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) COM_TRY_END } +void CHandler::AddResNameToString(UString &s, UInt32 id) const +{ + if ((id & kFlag) != 0) + { + UString name; + if (ReadString(id & kMask, name) == S_OK) + { + if (name.IsEmpty()) + s += L"[]"; + else + { + if (name.Length() > 1 && name[0] == '"' && name.Back() == '"') + name = name.Mid(1, name.Length() - 2); + s += name; + } + return; + } + } + wchar_t sz[32]; + ConvertUInt32ToString(id, sz); + s += sz; +} + +UString CHandler::GetLangPrefix(UInt32 lang) +{ + UString s = _resourceFileName; + s += WCHAR_PATH_SEPARATOR; + if (!_oneLang) + { + AddResNameToString(s, lang); + s += WCHAR_PATH_SEPARATOR; + } + return s; +} + STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { COM_TRY_BEGIN NCOM::CPropVariant prop; - const CSection &item = _sections[index]; - switch(propID) + const CMixItem &mixItem = _mixItems[index]; + if (mixItem.StringIndex >= 0) { - case kpidPath: StringToProp(item.Name, prop); break; - case kpidSize: prop = (UInt64)item.VSize; break; - case kpidPackSize: prop = (UInt64)item.GetPackSize(); break; - case kpidOffset: prop = item.Pa; break; - case kpidVa: if (item.IsRealSect) prop = item.Va; break; - case kpidMTime: - case kpidCTime: - TimeToProp(item.IsDebug ? item.Time : _header.Time, prop); break; - case kpidCharacts: if (item.IsRealSect) FLAGS_TO_PROP(g_SectFlags, item.Flags, prop); break; + const CStringItem &item = _strings[mixItem.StringIndex]; + switch(propID) + { + case kpidPath: prop = GetLangPrefix(item.Lang) + L"string.txt"; break; + case kpidSize: + case kpidPackSize: + prop = (UInt64)item.Size; break; + } + } + else if (mixItem.ResourceIndex < 0) + { + const CSection &item = _sections[mixItem.SectionIndex]; + switch(propID) + { + case kpidPath: StringToProp(item.Name, prop); break; + case kpidSize: prop = (UInt64)item.VSize; break; + case kpidPackSize: prop = (UInt64)item.GetPackSize(); break; + case kpidOffset: prop = item.Pa; break; + case kpidVa: if (item.IsRealSect) prop = item.Va; break; + case kpidMTime: + case kpidCTime: + TimeToProp(item.IsDebug ? item.Time : _header.Time, prop); break; + case kpidCharacts: if (item.IsRealSect) FLAGS_TO_PROP(g_SectFlags, item.Flags, prop); break; + } + } + else + { + const CResItem &item = _items[mixItem.ResourceIndex]; + switch(propID) + { + case kpidPath: + { + UString s = GetLangPrefix(item.Lang); + { + const wchar_t *p = NULL; + if (item.Type < sizeof(g_ResTypes) / sizeof(g_ResTypes[0])) + p = g_ResTypes[item.Type]; + if (p != 0) + s += p; + else + AddResNameToString(s, item.Type); + } + s += WCHAR_PATH_SEPARATOR; + AddResNameToString(s, item.ID); + if (item.HeaderSize != 0) + { + if (item.IsBmp()) + s += L".bmp"; + else if (item.IsIcon()) + s += L".ico"; + } + prop = s; + break; + } + case kpidSize: prop = (UInt64)item.GetSize(); break; + case kpidPackSize: prop = (UInt64)item.Size; break; + } } prop.Detach(value); return S_OK; @@ -640,7 +892,372 @@ HRESULT CHandler::LoadDebugSections(IInStream *stream, bool &thereIsSection) return S_OK; } -HRESULT CHandler::Open2(IInStream *stream) +HRESULT CHandler::ReadString(UInt32 offset, UString &dest) const +{ + if ((offset & 1) != 0 || offset >= _buf.GetCapacity()) + return S_FALSE; + size_t rem = _buf.GetCapacity() - offset; + if (rem < 2) + return S_FALSE; + unsigned length = Get16(_buf + offset); + if ((rem - 2) / 2 < length) + return S_FALSE; + dest.Empty(); + offset += 2; + for (unsigned i = 0; i < length; i++) + dest += (wchar_t)Get16(_buf + offset + i * 2); + return S_OK; +} + +HRESULT CHandler::ReadTable(UInt32 offset, CRecordVector<CTableItem> &items) +{ + if ((offset & 3) != 0 || offset >= _buf.GetCapacity()) + return S_FALSE; + size_t rem = _buf.GetCapacity() - offset; + if (rem < 16) + return S_FALSE; + items.Clear(); + unsigned numNameItems = Get16(_buf + offset + 12); + unsigned numIdItems = Get16(_buf + offset + 14); + unsigned numItems = numNameItems + numIdItems; + if ((rem - 16) / 8 < numItems) + return S_FALSE; + if (!_usedRes.SetRange(offset, 16 + numItems * 8)) + return S_FALSE; + offset += 16; + _oneLang = true; + unsigned i; + for (i = 0; i < numItems; i++) + { + CTableItem item; + const Byte *buf = _buf + offset; + offset += 8; + item.ID = Get32(buf + 0); + if (((item.ID & kFlag) != 0) != (i < numNameItems)) + return S_FALSE; + item.Offset = Get32(buf + 4); + items.Add(item); + } + return S_OK; +} + +static const UInt32 kFileSizeMax = (UInt32)1 << 30; +static const int kNumResItemsMax = (UInt32)1 << 23; +static const int kNumStringLangsMax = 128; + +// BITMAPINFOHEADER +struct CBitmapInfoHeader +{ + // UInt32 HeaderSize; + UInt32 XSize; + Int32 YSize; + UInt16 Planes; + UInt16 BitCount; + UInt32 Compression; + UInt32 SizeImage; + + bool Parse(const Byte *p, size_t size); +}; + +static const UInt32 kBitmapInfoHeader_Size = 0x28; + +bool CBitmapInfoHeader::Parse(const Byte *p, size_t size) +{ + if (size < kBitmapInfoHeader_Size || Get32(p) != kBitmapInfoHeader_Size) + return false; + XSize = Get32(p + 4); + YSize = (Int32)Get32(p + 8); + Planes = Get16(p + 12); + BitCount = Get16(p + 14); + Compression = Get32(p + 16); + SizeImage = Get32(p + 20); + return true; +}; + +static UInt32 GetImageSize(UInt32 xSize, UInt32 ySize, UInt32 bitCount) +{ + return ((xSize * bitCount + 7) / 8 + 3) / 4 * 4 * ySize; +} + +static UInt32 SetBitmapHeader(Byte *dest, const Byte *src, UInt32 size) +{ + CBitmapInfoHeader h; + if (!h.Parse(src, size)) + return 0; + if (h.YSize < 0) + h.YSize = -h.YSize; + if (h.XSize > (1 << 26) || h.YSize > (1 << 26) || h.Planes != 1 || h.BitCount > 32 || + h.Compression != 0) // BI_RGB + return 0; + if (h.SizeImage == 0) + h.SizeImage = GetImageSize(h.XSize, h.YSize, h.BitCount); + UInt32 totalSize = kBmpHeaderSize + size; + UInt32 offBits = totalSize - h.SizeImage; + // BITMAPFILEHEADER + SetUi16(dest, 0x4D42); + SetUi32(dest + 2, totalSize); + SetUi32(dest + 6, 0); + SetUi32(dest + 10, offBits); + return kBmpHeaderSize; +} + +static UInt32 SetIconHeader(Byte *dest, const Byte *src, UInt32 size) +{ + CBitmapInfoHeader h; + if (!h.Parse(src, size)) + return 0; + if (h.YSize < 0) + h.YSize = -h.YSize; + if (h.XSize > (1 << 26) || h.YSize > (1 << 26) || h.Planes != 1 || + h.Compression != 0) // BI_RGB + return 0; + + UInt32 numBitCount = h.BitCount; + if (numBitCount != 1 && + numBitCount != 4 && + numBitCount != 8 && + numBitCount != 24 && + numBitCount != 32) + return 0; + + if ((h.YSize & 1) != 0) + return 0; + h.YSize /= 2; + if (h.XSize > 0x100 || h.YSize > 0x100) + return 0; + + UInt32 imageSize; + // imageSize is not correct if AND mask array contains zeros + // in this case it is equal image1Size + + // UInt32 imageSize = h.SizeImage; + // if (imageSize == 0) + // { + UInt32 image1Size = GetImageSize(h.XSize, h.YSize, h.BitCount); + UInt32 image2Size = GetImageSize(h.XSize, h.YSize, 1); + imageSize = image1Size + image2Size; + // } + UInt32 numColors = 0; + if (numBitCount < 16) + numColors = 1 << numBitCount; + + SetUi16(dest, 0); // Reserved + SetUi16(dest + 2, 1); // RES_ICON + SetUi16(dest + 4, 1); // ResCount + + dest[6] = (Byte)h.XSize; // Width + dest[7] = (Byte)h.YSize; // Height + dest[8] = (Byte)numColors; // ColorCount + dest[9] = 0; // Reserved + + SetUi32(dest + 10, 0); // Reserved1 / Reserved2 + + UInt32 numQuadsBytes = numColors * 4; + UInt32 BytesInRes = kBitmapInfoHeader_Size + numQuadsBytes + imageSize; + SetUi32(dest + 14, BytesInRes); + SetUi32(dest + 18, kIconHeaderSize); + + /* + Description = DWORDToString(xSize) + + kDelimiterChar + DWORDToString(ySize) + + kDelimiterChar + DWORDToString(numBitCount); + */ + return kIconHeaderSize; +} + +bool CHandler::ParseStringRes(UInt32 id, UInt32 lang, const Byte *src, UInt32 size) +{ + if ((size & 1) != 0) + return false; + + int i; + for (i = 0; i < _strings.Size(); i++) + if (_strings[i].Lang == lang) + break; + if (i == _strings.Size()) + { + if (_strings.Size() >= kNumStringLangsMax) + return false; + CStringItem item; + item.Size = 0; + item.Lang = lang; + i = _strings.Add(item); + } + + CStringItem &item = _strings[i]; + id = (id - 1) << 4; + UInt32 pos = 0; + for (i = 0; i < 16; i++) + { + if (size - pos < 2) + return false; + UInt32 len = Get16(src + pos); + pos += 2; + if (len != 0) + { + if (size - pos < len * 2) + return false; + char temp[32]; + ConvertUInt32ToString(id + i, temp); + size_t tempLen = strlen(temp); + size_t j; + for (j = 0; j < tempLen; j++) + item.AddChar(temp[j]); + item.AddChar('\t'); + for (j = 0; j < len; j++, pos += 2) + item.AddWChar(Get16(src + pos)); + item.AddChar(0x0D); + item.AddChar(0x0A); + } + } + return (size == pos); +} + +HRESULT CHandler::OpenResources(int sectionIndex, IInStream *stream, IArchiveOpenCallback *callback) +{ + const CSection § = _sections[sectionIndex]; + size_t fileSize = sect.PSize; // Maybe we need sect.VSize here !!! + if (fileSize > kFileSizeMax) + return S_FALSE; + { + UInt64 fileSize64 = fileSize; + if (callback) + RINOK(callback->SetTotal(NULL, &fileSize64)); + RINOK(stream->Seek(sect.Pa, STREAM_SEEK_SET, NULL)); + _buf.SetCapacity(fileSize); + for (size_t pos = 0; pos < fileSize;) + { + UInt64 offset64 = pos; + if (callback) + RINOK(callback->SetCompleted(NULL, &offset64)) + size_t rem = MyMin(fileSize - pos, (size_t)(1 << 20)); + RINOK(ReadStream_FALSE(stream, _buf + pos, rem)); + pos += rem; + } + } + + _usedRes.Alloc(fileSize); + CRecordVector<CTableItem> specItems; + RINOK(ReadTable(0, specItems)); + + _oneLang = true; + bool stringsOk = true; + size_t maxOffset = 0; + for (int i = 0; i < specItems.Size(); i++) + { + const CTableItem &item1 = specItems[i]; + if ((item1.Offset & kFlag) == 0) + return S_FALSE; + + CRecordVector<CTableItem> specItems2; + RINOK(ReadTable(item1.Offset & kMask, specItems2)); + + for (int j = 0; j < specItems2.Size(); j++) + { + const CTableItem &item2 = specItems2[j]; + if ((item2.Offset & kFlag) == 0) + return S_FALSE; + + CRecordVector<CTableItem> specItems3; + RINOK(ReadTable(item2.Offset & kMask, specItems3)); + + CResItem item; + item.Type = item1.ID; + item.ID = item2.ID; + + for (int k = 0; k < specItems3.Size(); k++) + { + if (_items.Size() >= kNumResItemsMax) + return S_FALSE; + const CTableItem &item3 = specItems3[k]; + if ((item3.Offset & kFlag) != 0) + return S_FALSE; + if (item3.Offset >= _buf.GetCapacity() || _buf.GetCapacity() - item3.Offset < 16) + return S_FALSE; + const Byte *buf = _buf + item3.Offset; + item.Lang = item3.ID; + item.Offset = Get32(buf + 0); + item.Size = Get32(buf + 4); + // UInt32 codePage = Get32(buf + 8); + if (Get32(buf + 12) != 0) + return S_FALSE; + if (!_items.IsEmpty() && _oneLang && !item.IsNameEqual(_items.Back())) + _oneLang = false; + + item.HeaderSize = 0; + + size_t offset = item.Offset - sect.Va; + if (offset > maxOffset) + maxOffset = offset; + if (offset + item.Size > maxOffset) + maxOffset = offset + item.Size; + + if (CheckItem(sect, item, offset)) + { + const Byte *data = _buf + offset; + if (item.IsBmp()) + item.HeaderSize = SetBitmapHeader(item.Header, data, item.Size); + else if (item.IsIcon()) + item.HeaderSize = SetIconHeader(item.Header, data, item.Size); + else if (item.IsString()) + { + if (stringsOk) + stringsOk = ParseStringRes(item.ID, item.Lang, data, item.Size); + } + } + + item.Enabled = true; + _items.Add(item); + } + } + } + + if (stringsOk && !_strings.IsEmpty()) + { + int i; + for (i = 0; i < _items.Size(); i++) + { + CResItem &item = _items[i]; + if (item.IsString()) + item.Enabled = false; + } + for (i = 0; i < _strings.Size(); i++) + { + if (_strings[i].Size == 0) + continue; + CMixItem mixItem; + mixItem.ResourceIndex = -1; + mixItem.StringIndex = i; + mixItem.SectionIndex = sectionIndex; + _mixItems.Add(mixItem); + } + } + + _usedRes.Free(); + + int numBits = _optHeader.GetNumFileAlignBits(); + if (numBits >= 0) + { + UInt32 mask = (1 << numBits) - 1; + size_t end = ((maxOffset + mask) & ~mask); + if (end < sect.VSize) + { + CSection sect2; + sect2.Flags = 0; + sect2.Pa = sect.Pa + (UInt32)maxOffset; + sect2.Va = sect.Va + (UInt32)maxOffset; + sect2.PSize = sect.VSize - (UInt32)maxOffset; + sect2.VSize = sect2.PSize; + sect2.Name = ".rsrc_1"; + sect2.Time = 0; + _sections.Add(sect2); + } + } + + return S_OK; +} + +HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback) { const UInt32 kBufSize = 1 << 18; const UInt32 kSigSize = 2; @@ -732,7 +1349,8 @@ HRESULT CHandler::Open2(IInStream *stream) sections.Sort(); UInt32 limit = (1 << 12); int num = 0; - for (int i = 0; i < sections.Size(); i++) + int numSections = sections.Size(); + for (int i = 0; i < numSections; i++) { const CSection &s = sections[i]; if (s.Pa > limit) @@ -740,20 +1358,72 @@ HRESULT CHandler::Open2(IInStream *stream) CSection s2; s2.Pa = s2.Va = limit; s2.PSize = s2.VSize = s.Pa - limit; - char sz[32]; - ConvertUInt64ToString(++num, sz); - s2.Name = "[data-"; - s2.Name += sz; - s2.Name += "]"; + s2.Name = '['; + s2.Name += GetDecString(num++); + s2.Name += ']'; _sections.Add(s2); + limit = s.Pa; } UInt32 next = s.Pa + s.PSize; - if (next < limit) + if (next < s.Pa) break; - limit = next; + if (next >= limit) + limit = next; } } + _parseResources = true; + + for (int i = 0; i < _sections.Size(); i++) + { + const CSection § = _sections[i]; + CMixItem mixItem; + mixItem.SectionIndex = i; + if (_parseResources && sect.Name == ".rsrc" && _items.IsEmpty()) + { + HRESULT res = OpenResources(i, stream, callback); + if (res == S_OK) + { + _resourceFileName = GetUnicodeString(sect.Name); + for (int j = 0; j < _items.Size(); j++) + if (_items[j].Enabled) + { + mixItem.ResourceIndex = j; + mixItem.StringIndex = -1; + _mixItems.Add(mixItem); + } + if (sect.PSize > sect.VSize) + { + int numBits = _optHeader.GetNumFileAlignBits(); + if (numBits >= 0) + { + UInt32 mask = (1 << numBits) - 1; + UInt32 end = ((sect.VSize + mask) & ~mask); + + if (sect.PSize > end) + { + CSection sect2; + sect2.Flags = 0; + sect2.Pa = sect.Pa + end; + sect2.Va = sect.Va + end; + sect2.PSize = sect.PSize - end; + sect2.VSize = sect2.PSize; + sect2.Name = ".rsrc_2"; + sect2.Time = 0; + _sections.Add(sect2); + } + } + } + continue; + } + if (res != S_FALSE) + return res; + CloseResources(); + } + mixItem.StringIndex = -1; + mixItem.ResourceIndex = -1; + _mixItems.Add(mixItem); + } return S_OK; } @@ -766,8 +1436,8 @@ HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 excludePos Byte *buf = buffer; UInt32 sum = 0; - UInt32 pos; - for(pos = 0;;) + UInt32 pos = 0; + for (;;) { UInt32 rem = size - pos; if (rem > kBufSize) @@ -806,46 +1476,60 @@ HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 excludePos return S_OK; } -STDMETHODIMP CHandler::Open(IInStream *inStream, - const UInt64 * /* maxCheckStartPosition */, - IArchiveOpenCallback * /* openArchiveCallback */) +STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback) { COM_TRY_BEGIN Close(); - RINOK(Open2(inStream)); - _inStream = inStream; + RINOK(Open2(inStream, callback)); + _stream = inStream; return S_OK; COM_TRY_END } +void CHandler::CloseResources() +{ + _usedRes.Free(); + _items.Clear(); + _strings.Clear(); + _buf.SetCapacity(0); +} + STDMETHODIMP CHandler::Close() { - _inStream.Release(); + _stream.Release(); _sections.Clear(); - + _mixItems.Clear(); + CloseResources(); return S_OK; } STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) { - *numItems = _sections.Size(); + *numItems = _mixItems.Size(); return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) - numItems = _sections.Size(); + numItems = _mixItems.Size(); if (numItems == 0) return S_OK; UInt64 totalSize = 0; UInt32 i; for (i = 0; i < numItems; i++) - totalSize += _sections[allFilesMode ? i : indices[i]].GetPackSize(); + { + const CMixItem &mixItem = _mixItems[allFilesMode ? i : indices[i]]; + if (mixItem.StringIndex >= 0) + totalSize += _strings[mixItem.StringIndex].Size; + else if (mixItem.ResourceIndex < 0) + totalSize += _sections[mixItem.SectionIndex].GetPackSize(); + else + totalSize += _items[mixItem.ResourceIndex].GetSize(); + } extractCallback->SetTotal(totalSize); UInt64 currentTotalSize = 0; @@ -859,53 +1543,127 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, lps->Init(extractCallback, false); bool checkSumOK = true; - if (_optHeader.CheckSum != 0 && (int)numItems == _sections.Size()) + if (_optHeader.CheckSum != 0 && (int)numItems == _mixItems.Size()) { UInt32 checkSum = 0; - RINOK(_inStream->Seek(0, STREAM_SEEK_SET, NULL)); - CalcCheckSum(_inStream, _totalSizeLimited, _peOffset + kHeaderSize + 64, checkSum); + RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL)); + CalcCheckSum(_stream, _totalSizeLimited, _peOffset + kHeaderSize + 64, checkSum); checkSumOK = (checkSum == _optHeader.CheckSum); } CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream; CMyComPtr<ISequentialInStream> inStream(streamSpec); - streamSpec->SetStream(_inStream); + streamSpec->SetStream(_stream); for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize) { lps->InSize = lps->OutSize = currentTotalSize; RINOK(lps->SetCur()); Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; UInt32 index = allFilesMode ? i : indices[i]; - const CSection &item = _sections[index]; - currentItemSize = item.GetPackSize(); CMyComPtr<ISequentialOutStream> outStream; RINOK(extractCallback->GetStream(index, &outStream, askMode)); - if (!testMode && !outStream) - continue; + const CMixItem &mixItem = _mixItems[index]; + + const CSection § = _sections[mixItem.SectionIndex]; + bool isOk = true; + if (mixItem.StringIndex >= 0) + { + const CStringItem &item = _strings[mixItem.StringIndex]; + currentItemSize = item.Size; + if (!testMode && !outStream) + continue; + + RINOK(extractCallback->PrepareOperation(askMode)); + if (outStream) + RINOK(WriteStream(outStream, item.Buf, item.Size)); + } + else if (mixItem.ResourceIndex < 0) + { + currentItemSize = sect.GetPackSize(); + if (!testMode && !outStream) + continue; - RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(_inStream->Seek(item.Pa, STREAM_SEEK_SET, NULL)); - streamSpec->Init(currentItemSize); - RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); + RINOK(extractCallback->PrepareOperation(askMode)); + RINOK(_stream->Seek(sect.Pa, STREAM_SEEK_SET, NULL)); + streamSpec->Init(currentItemSize); + RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); + isOk = (copyCoderSpec->TotalSize == currentItemSize); + } + else + { + const CResItem &item = _items[mixItem.ResourceIndex]; + currentItemSize = item.GetSize(); + if (!testMode && !outStream) + continue; + + RINOK(extractCallback->PrepareOperation(askMode)); + size_t offset = item.Offset - sect.Va; + if (!CheckItem(sect, item, offset)) + isOk = false; + else if (outStream) + { + if (item.HeaderSize != 0) + RINOK(WriteStream(outStream, item.Header, item.HeaderSize)); + RINOK(WriteStream(outStream, _buf + offset, item.Size)); + } + } + outStream.Release(); - RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == currentItemSize) ? + RINOK(extractCallback->SetOperationResult(isOk ? checkSumOK ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kCRCError: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kCRCError: + NExtract::NOperationResult::kDataError)); } return S_OK; COM_TRY_END } +STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) +{ + COM_TRY_BEGIN + *stream = 0; + + const CMixItem &mixItem = _mixItems[index]; + const CSection § = _sections[mixItem.SectionIndex]; + if (mixItem.IsSectionItem()) + return CreateLimitedInStream(_stream, sect.Pa, sect.PSize, stream); + + CBufInStream *inStreamSpec = new CBufInStream; + CMyComPtr<ISequentialInStream> streamTemp = inStreamSpec; + CReferenceBuf *referenceBuf = new CReferenceBuf; + CMyComPtr<IUnknown> ref = referenceBuf; + if (mixItem.StringIndex >= 0) + { + const CStringItem &item = _strings[mixItem.StringIndex]; + referenceBuf->Buf.SetCapacity(item.Size); + memcpy(referenceBuf->Buf, item.Buf, item.Size); + } + else + { + const CResItem &item = _items[mixItem.ResourceIndex]; + size_t offset = item.Offset - sect.Va; + if (!CheckItem(sect, item, offset)) + return S_FALSE; + referenceBuf->Buf.SetCapacity(item.HeaderSize + item.Size); + memcpy(referenceBuf->Buf, item.Header, item.HeaderSize); + memcpy(referenceBuf->Buf + item.HeaderSize, _buf + offset, item.Size); + } + inStreamSpec->Init(referenceBuf); + + *stream = streamTemp.Detach(); + return S_OK; + COM_TRY_END +} + static IInArchive *CreateArc() { return new CHandler; } static CArcInfo g_ArcInfo = - { L"PE", L"", 0, 0xDD, { 0 }, 0, false, CreateArc, 0 }; + { L"PE", L"exe dll sys", 0, 0xDD, { 'P', 'E', 0, 0 }, 4, false, CreateArc, 0 }; REGISTER_ARC(Pe) diff --git a/CPP/7zip/Archive/Rar/RarHandler.cpp b/CPP/7zip/Archive/Rar/RarHandler.cpp index 93c19265..b5decec8 100755 --- a/CPP/7zip/Archive/Rar/RarHandler.cpp +++ b/CPP/7zip/Archive/Rar/RarHandler.cpp @@ -350,7 +350,7 @@ HRESULT CHandler::Open2(IInStream *stream, if (!openVolumeCallback) break; - if(_archives.Size() == 1) + if (_archives.Size() == 1) { if (!_archiveInfo.IsVolume()) break; @@ -395,9 +395,14 @@ HRESULT CHandler::Open2(IInStream *stream, CItemEx item; for (;;) { - HRESULT result = archive.GetNextItem(item, getTextPassword); + bool decryptionError; + HRESULT result = archive.GetNextItem(item, getTextPassword, decryptionError); if (result == S_FALSE) + { + if (decryptionError && _items.IsEmpty()) + return S_FALSE; break; + } RINOK(result); if (item.IgnoreItem()) continue; @@ -470,27 +475,25 @@ struct CMethodItem }; -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *_anExtractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN CMyComPtr<ICryptoGetTextPassword> getTextPassword; - bool testMode = (_aTestMode != 0); - CMyComPtr<IArchiveExtractCallback> extractCallback = _anExtractCallback; UInt64 censoredTotalUnPacked = 0, // censoredTotalPacked = 0, importantTotalUnPacked = 0; // importantTotalPacked = 0; - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _refItems.Size(); - if(numItems == 0) + if (numItems == 0) return S_OK; int lastIndex = 0; CRecordVector<int> importantIndexes; CRecordVector<bool> extractStatuses; - for(UInt32 t = 0; t < numItems; t++) + for (UInt32 t = 0; t < numItems; t++) { int index = allFilesMode ? t : indices[t]; const CRefItem &refItem = _refItems[index]; @@ -498,11 +501,11 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, censoredTotalUnPacked += item.Size; // censoredTotalPacked += item.PackSize; int j; - for(j = lastIndex; j <= index; j++) - // if(!_items[_refItems[j].ItemIndex].IsSolid()) - if(!IsSolid(j)) + for (j = lastIndex; j <= index; j++) + // if (!_items[_refItems[j].ItemIndex].IsSolid()) + if (!IsSolid(j)) lastIndex = j; - for(j = lastIndex; j <= index; j++) + for (j = lastIndex; j <= index; j++) { const CRefItem &refItem = _refItems[j]; const CItemEx &item = _items[refItem.ItemIndex]; @@ -543,7 +546,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, lps->Init(extractCallback, false); bool solidStart = true; - for(int i = 0; i < importantIndexes.Size(); i++, + for (int i = 0; i < importantIndexes.Size(); i++, currentImportantTotalUnPacked += currentUnPackSize, currentImportantTotalPacked += currentPackSize) { @@ -553,12 +556,12 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode; - if(extractStatuses[i]) + if (extractStatuses[i]) askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; else - askMode = NArchive::NExtract::NAskMode::kSkip; + askMode = NExtract::NAskMode::kSkip; UInt32 index = importantIndexes[i]; @@ -569,22 +572,22 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, currentPackSize = GetPackSize(index); - if(item.IgnoreItem()) + if (item.IgnoreItem()) continue; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); if (!IsSolid(index)) solidStart = true; - if(item.IsDir()) + if (item.IsDir()) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } bool mustBeProcessedAnywhere = false; - if(i < importantIndexes.Size() - 1) + if (i < importantIndexes.Size() - 1) { // const CRefItem &nextRefItem = _refItems[importantIndexes[i + 1]]; // const CItemEx &nextItemInfo = _items[nextRefItem.ItemIndex]; @@ -596,7 +599,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, continue; if (!realOutStream && !testMode) - askMode = NArchive::NExtract::NAskMode::kSkip; + askMode = NExtract::NAskMode::kSkip; RINOK(extractCallback->PrepareOperation(askMode)); @@ -664,15 +667,14 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, else { outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); continue; } RINOK(filterStreamSpec->Filter.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword)); if (!getTextPassword) - extractCallback.QueryInterface(IID_ICryptoGetTextPassword, - &getTextPassword); + extractCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getTextPassword); if (getTextPassword) { CMyComBSTR password; @@ -729,7 +731,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (item.UnPackVersion >= 29) { outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); continue; } */ @@ -758,7 +760,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (mi.Coder == 0) { outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); continue; } @@ -785,7 +787,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, } default: outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); continue; } HRESULT result = commonCoder->Code(inStream, outStream, &packSize, &item.Size, progress); @@ -794,7 +796,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (result == S_FALSE) { outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kDataError)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kDataError)); continue; } if (result != S_OK) @@ -808,8 +810,9 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1]; bool crcOK = outStreamSpec->GetCRC() == lastItem.FileCRC; outStream.Release(); - RINOK(extractCallback->SetOperationResult(crcOK ? NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kCRCError)); + RINOK(extractCallback->SetOperationResult(crcOK ? + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kCRCError)); } /* else @@ -824,8 +827,9 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, break; } } - RINOK(extractCallback->SetOperationResult(crcOK ? NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kCRCError)); + RINOK(extractCallback->SetOperationResult(crcOK ? + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kCRCError)); } */ } diff --git a/CPP/7zip/Archive/Rar/RarIn.cpp b/CPP/7zip/Archive/Rar/RarIn.cpp index 4810649b..5ea12c2d 100755 --- a/CPP/7zip/Archive/Rar/RarIn.cpp +++ b/CPP/7zip/Archive/Rar/RarIn.cpp @@ -372,8 +372,9 @@ void CInArchive::AddToSeekValue(UInt64 addValue) m_Position += addValue; } -HRESULT CInArchive::GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword) +HRESULT CInArchive::GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword, bool &decryptionError) { + decryptionError = false; if (m_SeekOnArchiveComment) SkipArchiveComment(); for (;;) @@ -469,8 +470,11 @@ HRESULT CInArchive::GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPa AddToSeekValue(item.PackSize); // m_Position points to next header; return S_OK; } - if (m_CryptoMode && m_BlockHeader.HeadSize > (1 << 12)) - return E_FAIL; // it's for bad passwords + if (m_CryptoMode && m_BlockHeader.HeadSize > (1 << 10)) + { + decryptionError = true; + return S_FALSE; + } if ((m_BlockHeader.Flags & NHeader::NBlock::kLongBlock) != 0) { m_FileHeaderData.EnsureCapacity(7 + 4); @@ -480,7 +484,10 @@ HRESULT CInArchive::GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPa UInt32 dataSize = ReadUInt32(); AddToSeekValue(dataSize); if (m_CryptoMode && dataSize > (1 << 27)) - return E_FAIL; // it's for bad passwords + { + decryptionError = true; + return S_FALSE; + } m_CryptoPos = m_BlockHeader.HeadSize; } else diff --git a/CPP/7zip/Archive/Rar/RarIn.h b/CPP/7zip/Archive/Rar/RarIn.h index ff97a109..3d446977 100755 --- a/CPP/7zip/Archive/Rar/RarIn.h +++ b/CPP/7zip/Archive/Rar/RarIn.h @@ -111,7 +111,7 @@ protected: public: HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit); void Close(); - HRESULT GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword); + HRESULT GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword, bool &decryptionError); void SkipArchiveComment(); diff --git a/CPP/7zip/Archive/Rar/RarRegister.cpp b/CPP/7zip/Archive/Rar/RarRegister.cpp index a79fd026..2bcf569e 100755 --- a/CPP/7zip/Archive/Rar/RarRegister.cpp +++ b/CPP/7zip/Archive/Rar/RarRegister.cpp @@ -5,7 +5,7 @@ #include "../../Common/RegisterArc.h" #include "RarHandler.h" -static IInArchive *CreateArc() { return new NArchive::NRar::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NRar::CHandler; } static CArcInfo g_ArcInfo = { L"Rar", L"rar r00", 0, 3, {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}, 7, false, CreateArc, 0, }; diff --git a/CPP/7zip/Archive/RpmHandler.cpp b/CPP/7zip/Archive/RpmHandler.cpp index 13b67390..f533e78f 100755 --- a/CPP/7zip/Archive/RpmHandler.cpp +++ b/CPP/7zip/Archive/RpmHandler.cpp @@ -71,7 +71,7 @@ struct CSigHeaderSig bool MagicCheck() { return Magic[0] == 0x8e && Magic[1] == 0xad && Magic[2] == 0xe8 && Magic[3] == 0x01; }; UInt32 GetLostHeaderLen() - { return IndexLen * kEntryInfoSize + DataLen; }; + { return IndexLen * kEntryInfoSize + DataLen; }; }; static HRESULT RedSigHeaderSig(IInStream *inStream, CSigHeaderSig &h) @@ -243,30 +243,25 @@ STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIAN return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - if (numItems == UInt32(-1)) - numItems = 1; if (numItems == 0) return S_OK; - if (numItems != 1 || indices[0] != 0) + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) return E_INVALIDARG; - bool testMode = (_aTestMode != 0); - RINOK(extractCallback->SetTotal(_size)); CMyComPtr<ISequentialOutStream> outStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; RINOK(extractCallback->GetStream(0, &outStream, askMode)); if (!testMode && !outStream) return S_OK; RINOK(extractCallback->PrepareOperation(askMode)); - CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder; CLocalProgress *lps = new CLocalProgress; @@ -276,7 +271,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(_stream->Seek(_pos, STREAM_SEEK_SET, NULL)); RINOK(copyCoder->Code(_stream, outStream, NULL, NULL, progress)); outStream.Release(); - return extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK); + return extractCallback->SetOperationResult(NExtract::NOperationResult::kOK); COM_TRY_END } @@ -287,7 +282,7 @@ STDMETHODIMP CHandler::GetStream(UInt32 /* index */, ISequentialInStream **strea COM_TRY_END } -static IInArchive *CreateArc() { return new NArchive::NRpm::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NRpm::CHandler; } static CArcInfo g_ArcInfo = { L"Rpm", L"rpm", 0, 0xEB, { 0xED, 0xAB, 0xEE, 0xDB}, 4, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/SplitHandler.cpp b/CPP/7zip/Archive/SplitHandler.cpp index 892e12af..e3129c6a 100755 --- a/CPP/7zip/Archive/SplitHandler.cpp +++ b/CPP/7zip/Archive/SplitHandler.cpp @@ -294,24 +294,21 @@ STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIAN return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - if (numItems == UInt32(-1)) - numItems = 1; if (numItems == 0) return S_OK; - if (numItems != 1 || indices[0] != 0) + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) return E_INVALIDARG; - bool testMode = (_aTestMode != 0); UInt64 currentTotalSize = 0; RINOK(extractCallback->SetTotal(_totalSize)); CMyComPtr<ISequentialOutStream> outStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; RINOK(extractCallback->GetStream(0, &outStream, askMode)); if (!testMode && !outStream) return S_OK; @@ -334,7 +331,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, currentTotalSize += copyCoderSpec->TotalSize; } outStream.Release(); - return extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK); + return extractCallback->SetOperationResult(NExtract::NOperationResult::kOK); COM_TRY_END } @@ -360,7 +357,7 @@ STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) COM_TRY_END } -static IInArchive *CreateArc() { return new CHandler; } +static IInArchive *CreateArc() { return new CHandler; } static CArcInfo g_ArcInfo = { L"Split", L"001", 0, 0xEA, { 0 }, 0, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/SwfHandler.cpp b/CPP/7zip/Archive/SwfHandler.cpp new file mode 100755 index 00000000..dfc0326d --- /dev/null +++ b/CPP/7zip/Archive/SwfHandler.cpp @@ -0,0 +1,706 @@ +// SwfHandler.cpp + +#include "StdAfx.h" + +#include "../../../C/CpuArch.h" + +#include "Common/Buffer.h" +#include "Common/ComTry.h" +#include "Common/IntToString.h" +#include "Common/MyString.h" + +#include "Windows/PropVariant.h" + +#include "../Common/InBuffer.h" +#include "../Common/ProgressUtils.h" +#include "../Common/RegisterArc.h" +#include "../Common/StreamUtils.h" + +#include "../Compress/CopyCoder.h" +#include "../Compress/ZlibDecoder.h" +#include "../Compress/ZlibEncoder.h" + +#include "Common/DummyOutStream.h" + +#include "DeflateProps.h" + +using namespace NWindows; + +namespace NArchive { +namespace NSwfc { + +static const UInt32 kHeaderSize = 8; + +static const Byte SWF_UNCOMPRESSED = 'F'; +static const Byte SWF_COMPRESSED = 'C'; +static const Byte SWF_MIN_COMPRESSED_VER = 6; + +struct CItem +{ + Byte Buf[kHeaderSize]; + + UInt32 GetSize() const { return GetUi32(Buf + 4); } + bool IsSwf(Byte c) const { return (Buf[0] == c && Buf[1] == 'W' && Buf[2] == 'S' && Buf[3] < 32); } + bool IsUncompressed() const { return IsSwf(SWF_UNCOMPRESSED); } + bool IsCompressed() const { return IsSwf(SWF_COMPRESSED); } + + void MakeUncompressed() { Buf[0] = SWF_UNCOMPRESSED; } + void MakeCompressed() + { + Buf[0] = SWF_COMPRESSED; + if (Buf[3] < SWF_MIN_COMPRESSED_VER) + Buf[3] = SWF_MIN_COMPRESSED_VER; + } + + HRESULT ReadHeader(ISequentialInStream *stream) { return ReadStream_FALSE(stream, Buf, kHeaderSize); } + HRESULT WriteHeader(ISequentialOutStream *stream) { return WriteStream(stream, Buf, kHeaderSize); } +}; + +class CHandler: + public IInArchive, + public IArchiveOpenSeq, + public IOutArchive, + public ISetProperties, + public CMyUnknownImp +{ + CItem _item; + UInt64 _packSize; + bool _packSizeDefined; + CMyComPtr<ISequentialInStream> _seqStream; + CMyComPtr<IInStream> _stream; + + CDeflateProps _method; + +public: + MY_UNKNOWN_IMP4(IInArchive, IArchiveOpenSeq, IOutArchive, ISetProperties) + INTERFACE_IInArchive(;) + INTERFACE_IOutArchive(;) + STDMETHOD(OpenSeq)(ISequentialInStream *stream); + STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProps); +}; + +STATPROPSTG kProps[] = +{ + { NULL, kpidSize, VT_UI8}, + { NULL, kpidPackSize, VT_UI8} +}; + +IMP_IInArchive_Props +IMP_IInArchive_ArcProps_NO_Table + +STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) +{ + NCOM::CPropVariant prop; + switch(propID) + { + case kpidPhySize: if (_packSizeDefined) prop = _packSize; break; + } + prop.Detach(value); + return S_OK; +} + +STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) +{ + *numItems = 1; + return S_OK; +} + +STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value) +{ + NWindows::NCOM::CPropVariant prop; + switch(propID) + { + case kpidSize: prop = (UInt64)_item.GetSize(); break; + case kpidPackSize: if (_packSizeDefined) prop = _packSize; break; + } + prop.Detach(value); + return S_OK; +} + +STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *) +{ + RINOK(OpenSeq(stream)); + _stream = stream; + return S_OK; +} + +STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream) +{ + Close(); + HRESULT res = _item.ReadHeader(stream); + if (res == S_OK) + if (_item.IsCompressed()) + _seqStream = stream; + else + res = S_FALSE; + return res; +} + +STDMETHODIMP CHandler::Close() +{ + _packSizeDefined = false; + _seqStream.Release(); + _stream.Release(); + return S_OK; +} + +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) +{ + COM_TRY_BEGIN + if (numItems == 0) + return S_OK; + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) + return E_INVALIDARG; + + extractCallback->SetTotal(_item.GetSize()); + CMyComPtr<ISequentialOutStream> realOutStream; + Int32 askMode = testMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; + RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); + if (!testMode && !realOutStream) + return S_OK; + + extractCallback->PrepareOperation(askMode); + + NCompress::NZlib::CDecoder *_decoderSpec = new NCompress::NZlib::CDecoder; + CMyComPtr<ICompressCoder> _decoder = _decoderSpec; + + CDummyOutStream *outStreamSpec = new CDummyOutStream; + CMyComPtr<ISequentialOutStream> outStream(outStreamSpec); + outStreamSpec->SetStream(realOutStream); + outStreamSpec->Init(); + realOutStream.Release(); + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr<ICompressProgressInfo> progress = lps; + lps->Init(extractCallback, false); + + lps->InSize = kHeaderSize; + lps->OutSize = outStreamSpec->GetSize(); + RINOK(lps->SetCur()); + + CItem item = _item; + item.MakeUncompressed(); + RINOK(item.WriteHeader(outStream)); + if (_stream) + RINOK(_stream->Seek(kHeaderSize, STREAM_SEEK_SET, NULL)); + HRESULT result = _decoderSpec->Code(_seqStream, outStream, NULL, NULL, progress); + Int32 opRes = NExtract::NOperationResult::kDataError; + if (result == S_OK) + { + if (_item.GetSize() == outStreamSpec->GetSize()) + { + _packSizeDefined = true; + _packSize = _decoderSpec->GetInputProcessedSize() + kHeaderSize; + opRes = NExtract::NOperationResult::kOK; + } + } + else if (result != S_FALSE) + return result; + + outStream.Release(); + return extractCallback->SetOperationResult(opRes); + COM_TRY_END +} + +static HRESULT UpdateArchive(ISequentialOutStream *outStream, + UInt64 size, CDeflateProps &deflateProps, + IArchiveUpdateCallback *updateCallback) +{ + UInt64 complexity = 0; + RINOK(updateCallback->SetTotal(size)); + RINOK(updateCallback->SetCompleted(&complexity)); + + CMyComPtr<ISequentialInStream> fileInStream; + RINOK(updateCallback->GetStream(0, &fileInStream)); + + CItem item; + HRESULT res = item.ReadHeader(fileInStream); + if (res == S_FALSE) + return E_INVALIDARG; + RINOK(res); + if (!item.IsUncompressed() || size != item.GetSize()) + return E_INVALIDARG; + + item.MakeCompressed(); + item.WriteHeader(outStream); + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr<ICompressProgressInfo> progress = lps; + lps->Init(updateCallback, true); + + NCompress::NZlib::CEncoder *encoderSpec = new NCompress::NZlib::CEncoder; + CMyComPtr<ICompressCoder> encoder = encoderSpec; + encoderSpec->Create(); + RINOK(deflateProps.SetCoderProperties(encoderSpec->DeflateEncoderSpec)); + RINOK(encoder->Code(fileInStream, outStream, NULL, NULL, progress)); + if (encoderSpec->GetInputProcessedSize() + kHeaderSize != size) + return E_INVALIDARG; + return updateCallback->SetOperationResult(NUpdate::NOperationResult::kOK); +} + +STDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType) +{ + *timeType = NFileTimeType::kUnix; + return S_OK; +} + +STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems, + IArchiveUpdateCallback *updateCallback) +{ + if (numItems != 1) + return E_INVALIDARG; + + Int32 newData, newProps; + UInt32 indexInArchive; + if (!updateCallback) + return E_FAIL; + RINOK(updateCallback->GetUpdateItemInfo(0, &newData, &newProps, &indexInArchive)); + + if (IntToBool(newProps)) + { + { + NCOM::CPropVariant prop; + RINOK(updateCallback->GetProperty(0, kpidIsDir, &prop)); + if (prop.vt == VT_BOOL) + { + if (prop.boolVal != VARIANT_FALSE) + return E_INVALIDARG; + } + else if (prop.vt != VT_EMPTY) + return E_INVALIDARG; + } + } + + if (IntToBool(newData)) + { + UInt64 size; + { + NCOM::CPropVariant prop; + RINOK(updateCallback->GetProperty(0, kpidSize, &prop)); + if (prop.vt != VT_UI8) + return E_INVALIDARG; + size = prop.uhVal.QuadPart; + } + return UpdateArchive(outStream, size, _method, updateCallback); + } + + if (indexInArchive != 0) + return E_INVALIDARG; + + if (!_seqStream) + return E_NOTIMPL; + + if (_stream) + { + RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL)); + } + else + _item.WriteHeader(outStream); + return NCompress::CopyStream(_seqStream, outStream, NULL); +} + +STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps) +{ + return _method.SetProperties(names, values, numProps); +} + +static IInArchive *CreateArc() { return new CHandler; } +#ifndef EXTRACT_ONLY +static IOutArchive *CreateArcOut() { return new CHandler; } +#else +#define CreateArcOut 0 +#endif + +static CArcInfo g_ArcInfo = + { L"SWFc", L"swf", L"~.swf", 0xD8, { 'C', 'W', 'S' }, 3, true, CreateArc, CreateArcOut }; + +REGISTER_ARC(Swfc) + +} + +namespace NSwf { + +static const UInt32 kFileSizeMax = (UInt32)1 << 30; +static const int kNumTagsMax = (UInt32)1 << 23; + +struct CTag +{ + UInt32 Type; + CByteBuffer Buf; +}; + +class CHandler: + public IInArchive, + public IArchiveOpenSeq, + public CMyUnknownImp +{ + CObjectVector<CTag> _tags; + NSwfc::CItem _item; + UInt64 _packSize; + + HRESULT OpenSeq3(ISequentialInStream *stream, IArchiveOpenCallback *callback); + HRESULT OpenSeq2(ISequentialInStream *stream, IArchiveOpenCallback *callback); +public: + MY_UNKNOWN_IMP2(IInArchive, IArchiveOpenSeq) + INTERFACE_IInArchive(;) + + STDMETHOD(OpenSeq)(ISequentialInStream *stream); +}; + +STATPROPSTG kProps[] = +{ + { NULL, kpidPath, VT_BSTR}, + { NULL, kpidSize, VT_UI8}, + { NULL, kpidComment, VT_BSTR} +}; + +IMP_IInArchive_Props +IMP_IInArchive_ArcProps_NO_Table + +STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) +{ + NCOM::CPropVariant prop; + switch(propID) + { + case kpidPhySize: prop = _packSize; break; + } + prop.Detach(value); + return S_OK; +} + + +STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) +{ + *numItems = _tags.Size(); + return S_OK; +} + +static const char *g_TagDesc[92] = +{ + "End", + "ShowFrame", + "DefineShape", + NULL, + "PlaceObject", + "RemoveObject", + "DefineBits", + "DefineButton", + "JPEGTables", + "SetBackgroundColor", + "DefineFont", + "DefineText", + "DoAction", + "DefineFontInfo", + "DefineSound", + "StartSound", + NULL, + "DefineButtonSound", + "SoundStreamHead", + "SoundStreamBlock", + "DefineBitsLossless", + "DefineBitsJPEG2", + "DefineShape2", + "DefineButtonCxform", + "Protect", + NULL, + "PlaceObject2", + NULL, + "RemoveObject2", + NULL, + NULL, + NULL, + "DefineShape3", + "DefineText2", + "DefineButton2", + "DefineBitsJPEG3", + "DefineBitsLossless2", + "DefineEditText", + NULL, + "DefineSprite", + NULL, + "41", + NULL, + "FrameLabel", + NULL, + "SoundStreamHead2", + "DefineMorphShape", + NULL, + "DefineFont2", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "ExportAssets", + "ImportAssets", + "EnableDebugger", + "DoInitAction", + "DefineVideoStream", + "VideoFrame", + "DefineFontInfo2", + NULL, + "EnableDebugger2", + "ScriptLimits", + "SetTabIndex", + NULL, + NULL, + "FileAttributes", + "PlaceObject3", + "ImportAssets2", + NULL, + "DefineFontAlignZones", + "CSMTextSettings", + "DefineFont3", + "SymbolClass", + "Metadata", + "DefineScalingGrid", + NULL, + NULL, + NULL, + "DoABC", + "DefineShape4", + "DefineMorphShape2", + NULL, + "DefineSceneAndFrameLabelData", + "DefineBinaryData", + "DefineFontName", + "StartSound2", + "DefineBitsJPEG4", + "DefineFont4" +}; + +STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) +{ + NWindows::NCOM::CPropVariant prop; + const CTag &tag = _tags[index]; + switch(propID) + { + case kpidPath: + { + char s[32]; + ConvertUInt32ToString(index, s); + size_t i = strlen(s); + s[i++] = '.'; + ConvertUInt32ToString(tag.Type, s + i); + prop = s; + break; + } + case kpidSize: + case kpidPackSize: + prop = (UInt64)tag.Buf.GetCapacity(); break; + case kpidComment: + if (tag.Type < sizeof(g_TagDesc) / sizeof(g_TagDesc[0])) + { + const char *s = g_TagDesc[tag.Type]; + if (s != NULL) + prop = s; + } + break; + } + prop.Detach(value); + return S_OK; +} + +STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback) +{ + return OpenSeq2(stream, callback); +} + +static UInt16 Read16(CInBuffer &stream) +{ + UInt16 res = 0; + for (int i = 0; i < 2; i++) + { + Byte b; + if (!stream.ReadByte(b)) + throw 1; + res |= (UInt16)b << (i * 8); + } + return res; +} + +static UInt32 Read32(CInBuffer &stream) +{ + UInt32 res = 0; + for (int i = 0; i < 4; i++) + { + Byte b; + if (!stream.ReadByte(b)) + throw 1; + res |= (UInt32)b << (i * 8); + } + return res; +} + +struct CBitReader +{ + CInBuffer *stream; + unsigned NumBits; + Byte Val; + + CBitReader(): NumBits(0), Val(0) {} + + UInt32 ReadBits(unsigned numBits); +}; + +UInt32 CBitReader::ReadBits(unsigned numBits) +{ + UInt32 res = 0; + while (numBits > 0) + { + if (NumBits == 0) + { + Val = stream->ReadByte(); + NumBits = 8; + } + if (numBits <= NumBits) + { + res <<= numBits; + NumBits -= numBits; + res |= (Val >> NumBits); + Val &= (1 << NumBits) - 1; + break; + } + else + { + res <<= NumBits; + res |= Val; + numBits -= NumBits; + NumBits = 0; + } + } + return res; +} + +HRESULT CHandler::OpenSeq3(ISequentialInStream *stream, IArchiveOpenCallback *callback) +{ + RINOK(_item.ReadHeader(stream)) + if (!_item.IsUncompressed()) + return S_FALSE; + + CInBuffer s; + if (!s.Create(1 << 20)) + return E_OUTOFMEMORY; + s.SetStream(stream); + s.Init(); + { + CBitReader br; + br.stream = &s; + unsigned numBits = br.ReadBits(5); + /* UInt32 xMin = */ br.ReadBits(numBits); + /* UInt32 xMax = */ br.ReadBits(numBits); + /* UInt32 yMin = */ br.ReadBits(numBits); + /* UInt32 yMax = */ br.ReadBits(numBits); + } + /* UInt32 frameDelay = */ Read16(s); + /* UInt32 numFrames = */ Read16(s); + + _tags.Clear(); + UInt64 offsetPrev = 0; + for (;;) + { + UInt32 pair = Read16(s); + UInt32 type = pair >> 6; + UInt32 length = pair & 0x3F; + if (length == 0x3F) + length = Read32(s); + if (type == 0) + break; + UInt64 offset = s.GetProcessedSize() + NSwfc::kHeaderSize + length; + if (offset > kFileSizeMax || _tags.Size() >= kNumTagsMax) + return S_FALSE; + _tags.Add(CTag()); + CTag &tag = _tags.Back(); + tag.Type = type; + tag.Buf.SetCapacity(length); + if (s.ReadBytes(tag.Buf, length) != length) + return S_FALSE; + if (callback && offset >= offsetPrev + (1 << 20)) + { + UInt64 numItems = _tags.Size(); + RINOK(callback->SetCompleted(&numItems, &offset)); + offsetPrev = offset; + } + } + _packSize = s.GetProcessedSize() + NSwfc::kHeaderSize; + return S_OK; +} + +HRESULT CHandler::OpenSeq2(ISequentialInStream *stream, IArchiveOpenCallback *callback) +{ + HRESULT res; + try { res = OpenSeq3(stream, callback); } + catch(...) { res = S_FALSE; } + return res; +} + +STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream) +{ + return OpenSeq2(stream, NULL); +} + +STDMETHODIMP CHandler::Close() +{ + return S_OK; +} + +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) +{ + COM_TRY_BEGIN + bool allFilesMode = (numItems == (UInt32)-1); + if (allFilesMode) + numItems = _tags.Size(); + if (numItems == 0) + return S_OK; + UInt64 totalSize = 0; + UInt32 i; + for (i = 0; i < numItems; i++) + totalSize += _tags[allFilesMode ? i : indices[i]].Buf.GetCapacity(); + extractCallback->SetTotal(totalSize); + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr<ICompressProgressInfo> progress = lps; + lps->Init(extractCallback, false); + + totalSize = 0; + + for (i = 0; i < numItems; i++) + { + lps->InSize = lps->OutSize = totalSize; + RINOK(lps->SetCur()); + Int32 askMode = testMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; + UInt32 index = allFilesMode ? i : indices[i]; + const CByteBuffer &buf = _tags[index].Buf; + totalSize += buf.GetCapacity(); + + CMyComPtr<ISequentialOutStream> outStream; + RINOK(extractCallback->GetStream(index, &outStream, askMode)); + if (!testMode && !outStream) + continue; + + RINOK(extractCallback->PrepareOperation(askMode)); + if (outStream) + RINOK(WriteStream(outStream, buf, buf.GetCapacity())); + outStream.Release(); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); + } + return S_OK; + COM_TRY_END +} + +static IInArchive *CreateArc() { return new CHandler; } + +static CArcInfo g_ArcInfo = + { L"SWF", L"swf", 0, 0xD7, { 'F', 'W', 'S' }, 3, true, CreateArc, 0 }; + +REGISTER_ARC(Swf) + +}} diff --git a/CPP/7zip/Archive/Tar/TarHandler.cpp b/CPP/7zip/Archive/Tar/TarHandler.cpp index aa4b2aec..31e30573 100755 --- a/CPP/7zip/Archive/Tar/TarHandler.cpp +++ b/CPP/7zip/Archive/Tar/TarHandler.cpp @@ -227,8 +227,8 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val COM_TRY_END } -HRESULT CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +HRESULT CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN ISequentialInStream *stream = _seqStream; @@ -236,7 +236,6 @@ HRESULT CHandler::Extract(const UInt32* indices, UInt32 numItems, if (!seqMode) stream = _stream; - bool testMode = (_aTestMode != 0); bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _items.Size(); @@ -269,8 +268,8 @@ HRESULT CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; const CItemEx *item; if (seqMode) @@ -290,7 +289,7 @@ HRESULT CHandler::Extract(const UInt32* indices, UInt32 numItems, if (item->IsDir()) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } bool skipMode = false; @@ -299,7 +298,7 @@ HRESULT CHandler::Extract(const UInt32* indices, UInt32 numItems, if (!seqMode) continue; skipMode = true; - askMode = NArchive::NExtract::NAskMode::kSkip; + askMode = NExtract::NAskMode::kSkip; } RINOK(extractCallback->PrepareOperation(askMode)); @@ -320,8 +319,8 @@ HRESULT CHandler::Extract(const UInt32* indices, UInt32 numItems, } outStreamSpec->ReleaseStream(); RINOK(extractCallback->SetOperationResult(outStreamSpec->GetRem() == 0 ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError)); } return S_OK; COM_TRY_END diff --git a/CPP/7zip/Archive/Tar/TarRegister.cpp b/CPP/7zip/Archive/Tar/TarRegister.cpp index 3cc0d605..e21c0aac 100755 --- a/CPP/7zip/Archive/Tar/TarRegister.cpp +++ b/CPP/7zip/Archive/Tar/TarRegister.cpp @@ -5,14 +5,14 @@ #include "../../Common/RegisterArc.h" #include "TarHandler.h" -static IInArchive *CreateArc() { return new NArchive::NTar::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NTar::CHandler; } #ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::NTar::CHandler; } +static IOutArchive *CreateArcOut() { return new NArchive::NTar::CHandler; } #else #define CreateArcOut 0 #endif static CArcInfo g_ArcInfo = -{ L"Tar", L"tar", 0, 0xEE, { 'u', 's', 't', 'a', 'r' }, 5, false, CreateArc, CreateArcOut }; +{ L"tar", L"tar", 0, 0xEE, { 'u', 's', 't', 'a', 'r' }, 5, false, CreateArc, CreateArcOut }; REGISTER_ARC(Tar) diff --git a/CPP/7zip/Archive/Udf/UdfHandler.cpp b/CPP/7zip/Archive/Udf/UdfHandler.cpp index 07b61c51..42419a9d 100755 --- a/CPP/7zip/Archive/Udf/UdfHandler.cpp +++ b/CPP/7zip/Archive/Udf/UdfHandler.cpp @@ -10,6 +10,7 @@ #include "../../Common/LimitedStreams.h" #include "../../Common/ProgressUtils.h" +#include "../../Common/StreamObjects.h" #include "../../Compress/CopyCoder.h" @@ -200,57 +201,6 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val COM_TRY_END } -class CBufInStream: - public IInStream, - public CMyUnknownImp -{ - CByteBuffer _data; - UInt64 _pos; - -public: - void Init(const CByteBuffer &data) - { - _data = data; - _pos = 0; - } - - MY_UNKNOWN_IMP - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); -}; - - -STDMETHODIMP CBufInStream::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - if (processedSize != NULL) - *processedSize = 0; - if (_pos > _data.GetCapacity()) - return E_FAIL; - size_t rem = _data.GetCapacity() - (size_t)_pos; - if (size < rem) - rem = (size_t)size; - memcpy(data, (const Byte *)_data + _pos, rem); - _pos += rem; - if (processedSize != NULL) - *processedSize = (UInt32)rem; - return S_OK; -} - -STDMETHODIMP CBufInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) -{ - switch(seekOrigin) - { - case STREAM_SEEK_SET: _pos = offset; break; - case STREAM_SEEK_CUR: _pos += offset; break; - case STREAM_SEEK_END: _pos = _data.GetCapacity() + offset; break; - default: return STG_E_INVALIDFUNCTION; - } - if (newPosition) - *newPosition = _pos; - return S_OK; -} - struct CSeekExtent { UInt64 Phy; @@ -362,8 +312,11 @@ STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) { CBufInStream *inStreamSpec = new CBufInStream; CMyComPtr<ISequentialInStream> inStream = inStreamSpec; - inStreamSpec->Init(item.InlineData); - *stream = inStream .Detach(); + CReferenceBuf *referenceBuf = new CReferenceBuf; + CMyComPtr<IUnknown> ref = referenceBuf; + referenceBuf->Buf = item.InlineData; + inStreamSpec->Init(referenceBuf); + *stream = inStream.Detach(); return S_OK; } @@ -407,12 +360,11 @@ STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _refs2.Size(); if (numItems == 0) @@ -450,8 +402,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; UInt32 index = allFilesMode ? i : indices[i]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); @@ -464,7 +416,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (item.IsDir()) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } currentTotalSize += item.Size; @@ -480,15 +432,15 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, CMyComPtr<ISequentialInStream> udfInStream; HRESULT res = GetStream(index, &udfInStream); if (res == E_NOTIMPL) - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + opRes = NExtract::NOperationResult::kUnSupportedMethod; else if (res != S_OK) - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; else { RINOK(copyCoder->Code(udfInStream, outStream, NULL, NULL, progress)); opRes = outStreamSpec->IsFinishedOK() ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError; + NExtract::NOperationResult::kOK: + NExtract::NOperationResult::kDataError; } outStreamSpec->ReleaseStream(); RINOK(extractCallback->SetOperationResult(opRes)); diff --git a/CPP/7zip/Archive/Udf/UdfRegister.cpp b/CPP/7zip/Archive/Udf/UdfRegister.cpp index b3a6c152..5dc7db6a 100755 --- a/CPP/7zip/Archive/Udf/UdfRegister.cpp +++ b/CPP/7zip/Archive/Udf/UdfRegister.cpp @@ -5,7 +5,7 @@ #include "../../Common/RegisterArc.h" #include "UdfHandler.h" -static IInArchive *CreateArc() { return new NArchive::NUdf::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NUdf::CHandler; } static CArcInfo g_ArcInfo = { L"Udf", L"iso", 0, 0xE0, { 0, 'N', 'S', 'R', '0' }, 5, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/VhdHandler.cpp b/CPP/7zip/Archive/VhdHandler.cpp index 5fc2c918..439b8691 100755 --- a/CPP/7zip/Archive/VhdHandler.cpp +++ b/CPP/7zip/Archive/VhdHandler.cpp @@ -641,24 +641,20 @@ STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIAN COM_TRY_END } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - if (numItems == UInt32(-1)) - numItems = 1; if (numItems == 0) return S_OK; - if (numItems != 1 || indices[0] != 0) + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) return E_INVALIDARG; - bool testMode = (_aTestMode != 0); - RINOK(extractCallback->SetTotal(GetSize())); CMyComPtr<ISequentialOutStream> outStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; RINOK(extractCallback->GetStream(0, &outStream, askMode)); if (!testMode && !outStream) return S_OK; @@ -671,11 +667,11 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, CMyComPtr<ICompressProgressInfo> progress = lps; lps->Init(extractCallback, false); - int res = NArchive::NExtract::NOperationResult::kDataError; + int res = NExtract::NOperationResult::kDataError; CMyComPtr<ISequentialInStream> inStream; HRESULT hres = GetStream(0, &inStream); if (hres == S_FALSE) - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + res = NExtract::NOperationResult::kUnSupportedMethod; else { RINOK(hres); @@ -683,7 +679,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (hres == S_OK) { if (copyCoderSpec->TotalSize == GetSize()) - res = NArchive::NExtract::NOperationResult::kOK; + res = NExtract::NOperationResult::kOK; } else { @@ -721,7 +717,7 @@ STDMETHODIMP CHandler::GetStream(UInt32 /* index */, ISequentialInStream **strea COM_TRY_END } -static IInArchive *CreateArc() { return new CHandler; } +static IInArchive *CreateArc() { return new CHandler; } static CArcInfo g_ArcInfo = { L"VHD", L"vhd", L".mbr", 0xDC, { 'c', 'o', 'n', 'e', 'c', 't', 'i', 'x', 0, 0 }, 10, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/Wim/WimHandler.cpp b/CPP/7zip/Archive/Wim/WimHandler.cpp index 1b8661c9..8093af77 100755 --- a/CPP/7zip/Archive/Wim/WimHandler.cpp +++ b/CPP/7zip/Archive/Wim/WimHandler.cpp @@ -485,17 +485,16 @@ STDMETHODIMP CHandler::Close() return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = m_Database.Items.Size() + m_Xmls.Size(); if (numItems == 0) return S_OK; - bool testMode = (_aTestMode != 0); UInt32 i; UInt64 totalSize = 0; @@ -549,7 +548,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); if (index >= (UInt32)m_Database.Items.Size()) { - if(!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); const CByteBuffer &data = m_Xmls[index - (UInt32)m_Database.Items.Size()].Data; @@ -567,7 +566,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, int streamIndex = item.StreamIndex; if (streamIndex < 0) { - if(!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); realOutStream.Release(); @@ -581,7 +580,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, currentItemUnPacked = si.Resource.UnpackSize; currentItemPacked = si.Resource.PackSize; - if(!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); Int32 opRes = NExtract::NOperationResult::kOK; diff --git a/CPP/7zip/Archive/Wim/WimRegister.cpp b/CPP/7zip/Archive/Wim/WimRegister.cpp index 22344b3a..3c8e216f 100755 --- a/CPP/7zip/Archive/Wim/WimRegister.cpp +++ b/CPP/7zip/Archive/Wim/WimRegister.cpp @@ -5,7 +5,7 @@ #include "../../Common/RegisterArc.h" #include "WimHandler.h" -static IInArchive *CreateArc() { return new NArchive::NWim::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NWim::CHandler; } static CArcInfo g_ArcInfo = { L"Wim", L"wim swm", 0, 0xE6, { 'M', 'S', 'W', 'I', 'M', 0, 0, 0 }, 8, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/XarHandler.cpp b/CPP/7zip/Archive/XarHandler.cpp index 2dddad9f..5a2489d2 100755 --- a/CPP/7zip/Archive/XarHandler.cpp +++ b/CPP/7zip/Archive/XarHandler.cpp @@ -401,12 +401,11 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val COM_TRY_END } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = _files.Size(); if (numItems == 0) @@ -474,8 +473,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, RINOK(lps->SetCur()); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); @@ -485,19 +484,19 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (item.IsDir) { RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); continue; } } - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); outStreamSha1Spec->SetStream(realOutStream); realOutStream.Release(); - Int32 opRes = NArchive::NExtract::NOperationResult::kOK; + Int32 opRes = NExtract::NOperationResult::kOK; #ifdef XAR_SHOW_RAW if (index == _files.Size()) { @@ -526,13 +525,13 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (item.PackSize == item.Size) coder = copyCoder; else - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + opRes = NExtract::NOperationResult::kUnSupportedMethod; else if (item.Method == METHOD_NAME_ZLIB) coder = zlibCoder; else if (item.Method == "bzip2") coder = bzip2Coder; else - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + opRes = NExtract::NOperationResult::kUnSupportedMethod; if (coder) res = coder->Code(inStream, outStream, NULL, NULL, progress); @@ -540,32 +539,32 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, if (res != S_OK) { if (!outStreamLimSpec->IsFinishedOK()) - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; else if (res != S_FALSE) return res; - if (opRes == NArchive::NExtract::NOperationResult::kOK) - opRes = NArchive::NExtract::NOperationResult::kDataError; + if (opRes == NExtract::NOperationResult::kOK) + opRes = NExtract::NOperationResult::kDataError; } - if (opRes == NArchive::NExtract::NOperationResult::kOK) + if (opRes == NExtract::NOperationResult::kOK) { if (outStreamLimSpec->IsFinishedOK() && outStreamSha1Spec->GetSize() == item.Size) { if (!outStreamLimSpec->IsFinishedOK()) { - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; } else if (item.Sha1IsDefined) { Byte digest[NCrypto::NSha1::kDigestSize]; outStreamSha1Spec->Final(digest); if (memcmp(digest, item.Sha1, NCrypto::NSha1::kDigestSize) != 0) - opRes = NArchive::NExtract::NOperationResult::kCRCError; + opRes = NExtract::NOperationResult::kCRCError; } } else - opRes = NArchive::NExtract::NOperationResult::kDataError; + opRes = NExtract::NOperationResult::kDataError; } } } @@ -576,7 +575,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, COM_TRY_END } -static IInArchive *CreateArc() { return new NArchive::NXar::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NXar::CHandler; } static CArcInfo g_ArcInfo = { L"Xar", L"xar", 0, 0xE1, { 'x', 'a', 'r', '!', 0, 0x1C }, 6, false, CreateArc, 0 }; diff --git a/CPP/7zip/Archive/XzHandler.cpp b/CPP/7zip/Archive/XzHandler.cpp index 116e96b6..f37a5841 100755 --- a/CPP/7zip/Archive/XzHandler.cpp +++ b/CPP/7zip/Archive/XzHandler.cpp @@ -449,28 +449,22 @@ struct CXzUnpackerCPP } }; -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool allFilesMode = (numItems == UInt32(-1)); - if (!allFilesMode) - { - if (numItems == 0) - return S_OK; - if (numItems != 1 || indices[0] != 0) - return E_INVALIDARG; - } - - bool testMode = (_aTestMode != 0); + if (numItems == 0) + return S_OK; + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) + return E_INVALIDARG; extractCallback->SetTotal(_packSize); UInt64 currentTotalPacked = 0; RINOK(extractCallback->SetCompleted(¤tTotalPacked)); CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); @@ -567,15 +561,15 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, switch(res) { case SZ_OK: - opRes = NArchive::NExtract::NOperationResult::kOK; break; + opRes = NExtract::NOperationResult::kOK; break; case SZ_ERROR_UNSUPPORTED: - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; break; + opRes = NExtract::NOperationResult::kUnSupportedMethod; break; case SZ_ERROR_CRC: - opRes = NArchive::NExtract::NOperationResult::kCRCError; break; + opRes = NExtract::NOperationResult::kCRCError; break; case SZ_ERROR_DATA: case SZ_ERROR_ARCHIVE: case SZ_ERROR_NO_ARCHIVE: - opRes = NArchive::NExtract::NOperationResult::kDataError; break; + opRes = NExtract::NOperationResult::kDataError; break; default: return SResToHRESULT(res); } @@ -699,9 +693,9 @@ STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *v #endif -static IInArchive *CreateArc() { return new NArchive::NXz::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NXz::CHandler; } #ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::NXz::CHandler; } +static IOutArchive *CreateArcOut() { return new NArchive::NXz::CHandler; } #else #define CreateArcOut 0 #endif diff --git a/CPP/7zip/Archive/ZHandler.cpp b/CPP/7zip/Archive/ZHandler.cpp index 21432b22..49b76a11 100755 --- a/CPP/7zip/Archive/ZHandler.cpp +++ b/CPP/7zip/Archive/ZHandler.cpp @@ -21,24 +21,15 @@ class CHandler: public IInArchive, public CMyUnknownImp { -public: - MY_UNKNOWN_IMP1(IInArchive) - INTERFACE_IInArchive(;) - -private: CMyComPtr<IInStream> _stream; UInt64 _streamStartPosition; UInt64 _packSize; Byte _properties; +public: + MY_UNKNOWN_IMP1(IInArchive) + INTERFACE_IInArchive(;) }; -static IInArchive *CreateArc() { return new CHandler; } - -static CArcInfo g_ArcInfo = - { L"Z", L"z taz", L"* .tar", 5, { 0x1F, 0x9D }, 2, false, CreateArc, 0 }; - -REGISTER_ARC(Z) - STATPROPSTG kProps[] = { { NULL, kpidPackSize, VT_UI8} @@ -96,22 +87,14 @@ STDMETHODIMP CHandler::Close() } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 testModeSpec, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN - bool allFilesMode = (numItems == (UInt32)(-1)); - if (!allFilesMode) - { - if (numItems == 0) - return S_OK; - if (numItems != 1) - return E_INVALIDARG; - if (indices[0] != 0) - return E_INVALIDARG; - } - - bool testMode = (testModeSpec != 0); + if (numItems == 0) + return S_OK; + if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0)) + return E_INVALIDARG; extractCallback->SetTotal(_packSize); @@ -168,4 +151,11 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, COM_TRY_END } +static IInArchive *CreateArc() { return new CHandler; } + +static CArcInfo g_ArcInfo = + { L"Z", L"z taz", L"* .tar", 5, { 0x1F, 0x9D }, 2, false, CreateArc, 0 }; + +REGISTER_ARC(Z) + }} diff --git a/CPP/7zip/Archive/Zip/ZipHandler.cpp b/CPP/7zip/Archive/Zip/ZipHandler.cpp index 547ecf92..2e551931 100755 --- a/CPP/7zip/Archive/Zip/ZipHandler.cpp +++ b/CPP/7zip/Archive/Zip/ZipHandler.cpp @@ -448,7 +448,7 @@ HRESULT CZipDecoder::Decode( ICompressProgressInfo *compressProgress, UInt32 numThreads, Int32 &res) { - res = NArchive::NExtract::NOperationResult::kDataError; + res = NExtract::NOperationResult::kDataError; CInStreamReleaser inStreamReleaser; bool needCRC = true; @@ -466,7 +466,7 @@ HRESULT CZipDecoder::Decode( } if (!pkAesMode) { - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + res = NExtract::NOperationResult::kUnSupportedMethod; return S_OK; } } @@ -560,7 +560,7 @@ HRESULT CZipDecoder::Decode( break; if (c >= 0x80) { - res = NArchive::NExtract::NOperationResult::kDataError; + res = NExtract::NOperationResult::kDataError; return S_OK; } charPassword += (char)c; @@ -609,7 +609,7 @@ HRESULT CZipDecoder::Decode( { if (methodId > 0xFF) { - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + res = NExtract::NOperationResult::kUnSupportedMethod; return S_OK; } szMethodID = kMethodId_ZipBase + (Byte)methodId; @@ -619,7 +619,7 @@ HRESULT CZipDecoder::Decode( if (mi.Coder == 0) { - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + res = NExtract::NOperationResult::kUnSupportedMethod; return S_OK; } } @@ -699,7 +699,7 @@ HRESULT CZipDecoder::Decode( return S_OK; if (result == E_NOTIMPL) { - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; + res = NExtract::NOperationResult::kUnSupportedMethod; return S_OK; } @@ -717,26 +717,25 @@ HRESULT CZipDecoder::Decode( } res = ((crcOK && authOk) ? - NArchive::NExtract::NOperationResult::kOK : - NArchive::NExtract::NOperationResult::kCRCError); + NExtract::NOperationResult::kOK : + NExtract::NOperationResult::kCRCError); return S_OK; } -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) { COM_TRY_BEGIN CZipDecoder myDecoder; - bool testMode = (_aTestMode != 0); UInt64 totalUnPacked = 0, totalPacked = 0; - bool allFilesMode = (numItems == UInt32(-1)); + bool allFilesMode = (numItems == (UInt32)-1); if (allFilesMode) numItems = m_Items.Size(); if(numItems == 0) return S_OK; UInt32 i; - for(i = 0; i < numItems; i++) + for (i = 0; i < numItems; i++) { const CItemEx &item = m_Items[allFilesMode ? i : indices[i]]; totalUnPacked += item.UnPackSize; @@ -763,8 +762,8 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, CMyComPtr<ISequentialOutStream> realOutStream; Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; Int32 index = allFilesMode ? i : indices[i]; RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); @@ -779,7 +778,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, { RINOK(extractCallback->PrepareOperation(askMode)); realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); } continue; } @@ -792,7 +791,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, { RINOK(extractCallback->PrepareOperation(askMode)); realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); + RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); } continue; } @@ -800,7 +799,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, currentItemUnPacked = item.UnPackSize; currentItemPacked = item.PackSize; - if (!testMode && (!realOutStream)) + if (!testMode && !realOutStream) continue; RINOK(extractCallback->PrepareOperation(askMode)); diff --git a/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp b/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp index 2f28d5ec..22d8eeea 100755 --- a/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp +++ b/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp @@ -112,7 +112,7 @@ 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; diff --git a/CPP/7zip/Archive/Zip/ZipIn.cpp b/CPP/7zip/Archive/Zip/ZipIn.cpp index e396fe5b..6943c9ed 100755 --- a/CPP/7zip/Archive/Zip/ZipIn.cpp +++ b/CPP/7zip/Archive/Zip/ZipIn.cpp @@ -318,14 +318,17 @@ HRESULT CInArchive::ReadLocalItemAfterCdItem(CItemEx &item) RINOK(ReadLocalItem(localItem)); if (item.Flags != localItem.Flags) { - if ( - (item.CompressionMethod != NFileHeader::NCompressionMethod::kDeflated || - (item.Flags & 0x7FF9) != (localItem.Flags & 0x7FF9)) && - (item.CompressionMethod != NFileHeader::NCompressionMethod::kStored || - (item.Flags & 0x7FFF) != (localItem.Flags & 0x7FFF)) && - (item.CompressionMethod != NFileHeader::NCompressionMethod::kImploded || - (item.Flags & 0x7FFF) != (localItem.Flags & 0x7FFF)) - ) + UInt32 mask = 0xFFFF; + switch(item.CompressionMethod) + { + case NFileHeader::NCompressionMethod::kDeflated: + mask = 0x7FF9; + break; + default: + if (item.CompressionMethod <= NFileHeader::NCompressionMethod::kImploded) + mask = 0x7FFF; + } + if ((item.Flags & mask) != (localItem.Flags & mask)) return S_FALSE; } @@ -501,7 +504,9 @@ HRESULT CInArchive::FindCd(CCdInfo &cdInfo) UInt64 endPosition; RINOK(m_Stream->Seek(0, STREAM_SEEK_END, &endPosition)); const UInt32 kBufSizeMax = (1 << 16) + kEcdSize + kZip64EcdLocatorSize; - Byte buf[kBufSizeMax]; + CByteBuffer byteBuffer; + byteBuffer.SetCapacity(kBufSizeMax); + Byte *buf = byteBuffer; UInt32 bufSize = (endPosition < kBufSizeMax) ? (UInt32)endPosition : kBufSizeMax; if (bufSize < kEcdSize) return S_FALSE; @@ -622,10 +627,7 @@ HRESULT CInArchive::ReadLocalsAndCd(CObjectVector<CItemEx> &items, CProgressVirt RINOK(ReadCdItem(cdItem)); if (i == 0) - { - if (cdItem.LocalHeaderPosition == 0) - m_ArchiveInfo.Base = m_ArchiveInfo.StartPosition; - } + m_ArchiveInfo.Base = items[i].LocalHeaderPosition - cdItem.LocalHeaderPosition; int index; int left = 0, right = items.Size(); @@ -733,7 +735,15 @@ HRESULT CInArchive::ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *pr items.Clear(); UInt64 cdSize, cdStartOffset; - HRESULT res = ReadCd(items, cdStartOffset, cdSize, progress); + HRESULT res; + try + { + res = ReadCd(items, cdStartOffset, cdSize, progress); + } + catch(CInArchiveException &) + { + res = S_FALSE; + } if (res != S_FALSE && res != S_OK) return res; @@ -793,7 +803,7 @@ HRESULT CInArchive::ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *pr return S_FALSE; } if (m_Signature != NSignature::kEndOfCentralDir) - return S_FALSE; + return S_FALSE; const int kBufSize = kEcdSize - 4; Byte buf[kBufSize]; @@ -817,7 +827,7 @@ HRESULT CInArchive::ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *pr (UInt32)ecd64.cdSize != (UInt32)cdSize || ((UInt32)(ecd64.cdStartOffset) != (UInt32)cdStartOffset && (!items.IsEmpty()))) - return S_FALSE; + return S_FALSE; _inBufMode = false; _inBuffer.Free(); diff --git a/CPP/7zip/Archive/Zip/ZipRegister.cpp b/CPP/7zip/Archive/Zip/ZipRegister.cpp index 2fd36950..3e7aade8 100755 --- a/CPP/7zip/Archive/Zip/ZipRegister.cpp +++ b/CPP/7zip/Archive/Zip/ZipRegister.cpp @@ -5,14 +5,14 @@ #include "../../Common/RegisterArc.h" #include "ZipHandler.h" -static IInArchive *CreateArc() { return new NArchive::NZip::CHandler; } +static IInArchive *CreateArc() { return new NArchive::NZip::CHandler; } #ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::NZip::CHandler; } +static IOutArchive *CreateArcOut() { return new NArchive::NZip::CHandler; } #else #define CreateArcOut 0 #endif static CArcInfo g_ArcInfo = - { L"Zip", L"zip jar xpi odt ods docx xlsx", 0, 1, { 0x50, 0x4B, 0x03, 0x04 }, 4, false, CreateArc, CreateArcOut }; + { L"zip", L"zip jar xpi odt ods docx xlsx", 0, 1, { 0x50, 0x4B, 0x03, 0x04 }, 4, false, CreateArc, CreateArcOut }; REGISTER_ARC(Zip) diff --git a/CPP/7zip/Bundles/Alone/makefile b/CPP/7zip/Bundles/Alone/makefile index 5a8a359b..bd18aa73 100755 --- a/CPP/7zip/Bundles/Alone/makefile +++ b/CPP/7zip/Bundles/Alone/makefile @@ -1,14 +1,15 @@ PROG = 7za.exe -LIBS = $(LIBS) user32.lib oleaut32.lib Advapi32.lib +MY_CONSOLE = 1 CFLAGS = $(CFLAGS) -I ../../../ \ - -DWIN_LONG_PATH \ -DCOMPRESS_MT \ -DCOMPRESS_BZIP2_MT \ -DCOMPRESS_MF_MT \ - -D_7ZIP_LARGE_PAGES \ -DBREAK_HANDLER \ -DBENCH_MT \ - -DSUPPORT_DEVICE_FILE \ + +!IFNDEF UNDER_CE +CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -D_7ZIP_LARGE_PAGES -DSUPPORT_DEVICE_FILE +!ENDIF CONSOLE_OBJS = \ $O\ConsoleClose.obj \ @@ -96,6 +97,7 @@ UI_COMMON_OBJS = \ AR_OBJS = \ $O\Bz2Handler.obj \ + $O\DeflateProps.obj \ $O\GzHandler.obj \ $O\LzmaHandler.obj \ $O\SplitHandler.obj \ diff --git a/CPP/7zip/Bundles/Alone7z/makefile b/CPP/7zip/Bundles/Alone7z/makefile index c2bf482c..94d28509 100755 --- a/CPP/7zip/Bundles/Alone7z/makefile +++ b/CPP/7zip/Bundles/Alone7z/makefile @@ -1,15 +1,15 @@ PROG = 7zr.exe -LIBS = $(LIBS) user32.lib oleaut32.lib Advapi32.lib - +MY_CONSOLE = 1 CFLAGS = $(CFLAGS) -I ../../../ \ - -D_NO_CRYPTO \ - -DWIN_LONG_PATH \ -DCOMPRESS_MT \ -DCOMPRESS_MF_MT \ -D_NO_CRYPTO \ -DBREAK_HANDLER \ -DBENCH_MT \ +!IFNDEF UNDER_CE +CFLAGS = $(CFLAGS) -DWIN_LONG_PATH +!ENDIF CONSOLE_OBJS = \ $O\ConsoleClose.obj \ diff --git a/CPP/7zip/Bundles/Fm/FM.dsp b/CPP/7zip/Bundles/Fm/FM.dsp new file mode 100755 index 00000000..fa36bd66 --- /dev/null +++ b/CPP/7zip/Bundles/Fm/FM.dsp @@ -0,0 +1,1664 @@ +# Microsoft Developer Studio Project File - Name="FM" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=FM - Win32 DebugU +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "FM.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "FM.mak" CFG="FM - Win32 DebugU" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "FM - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "FM - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE "FM - Win32 ReleaseU" (based on "Win32 (x86) Application") +!MESSAGE "FM - Win32 DebugU" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "FM - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /Gz /MD /W3 /GX /O1 /I "..\..\..\\" /D "NDEBUG" /D "_MBCS" /D "WIN32" /D "_WINDOWS" /D "LANG" /D "WIN_LONG_PATH" /D "NEW_FOLDER_INTERFACE" /D "EXTERNAL_CODECS" /D "SUPPORT_DEVICE_FILE" /D "EXTERNAL_LZMA" /Yu"StdAfx.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib Mpr.lib htmlhelp.lib Urlmon.lib /nologo /subsystem:windows /machine:I386 /out:"C:\Program Files\7-ZIP\7zFM.exe" /opt:NOWIN98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "FM - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /Gz /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\\" /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "_WINDOWS" /D "LANG" /D "WIN_LONG_PATH" /D "NEW_FOLDER_INTERFACE" /D "EXTERNAL_CODECS" /D "SUPPORT_DEVICE_FILE" /D "EXTERNAL_LZMA" /Yu"StdAfx.h" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib Mpr.lib htmlhelp.lib Urlmon.lib /nologo /subsystem:windows /debug /machine:I386 /out:"C:\Program Files\7-ZIP\7zFM.exe" /pdbtype:sept + +!ELSEIF "$(CFG)" == "FM - Win32 ReleaseU" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseU" +# PROP BASE Intermediate_Dir "ReleaseU" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "ReleaseU" +# PROP Intermediate_Dir "ReleaseU" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"StdAfx.h" /FD /c +# ADD CPP /nologo /Gz /MD /W3 /GX /O1 /I "..\..\..\\" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "LANG" /D "WIN_LONG_PATH" /D "NEW_FOLDER_INTERFACE" /D "EXTERNAL_CODECS" /D "SUPPORT_DEVICE_FILE" /D "EXTERNAL_LZMA" /Yu"StdAfx.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib Mpr.lib htmlhelp.lib Urlmon.lib /nologo /subsystem:windows /machine:I386 /out:"C:\Program Files\7-ZIP\7zFM.exe" /opt:NOWIN98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "FM - Win32 DebugU" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "DebugU" +# PROP BASE Intermediate_Dir "DebugU" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "DebugU" +# PROP Intermediate_Dir "DebugU" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"StdAfx.h" /FD /GZ /c +# ADD CPP /nologo /Gz /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\\" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "LANG" /D "WIN_LONG_PATH" /D "NEW_FOLDER_INTERFACE" /D "EXTERNAL_CODECS" /D "SUPPORT_DEVICE_FILE" /D "EXTERNAL_LZMA" /Yu"StdAfx.h" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib Mpr.lib htmlhelp.lib Urlmon.lib /nologo /subsystem:windows /debug /machine:I386 /out:"C:\Program Files\7-ZIP\7zFM.exe" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "FM - Win32 Release" +# Name "FM - Win32 Debug" +# Name "FM - Win32 ReleaseU" +# Name "FM - Win32 DebugU" +# Begin Group "Spec" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\FileManager\7zipLogo.ico +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\add.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ClassDefs.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Copy.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Delete.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Extract.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FM.ico +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Move.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Parent.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Properties.bmp +# End Source File +# Begin Source File + +SOURCE=.\resource.rc +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\StdAfx.cpp +# ADD CPP /Yc"StdAfx.h" +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Test.bmp +# End Source File +# End Group +# Begin Group "Archive" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Archive\IArchive.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\OutStreamWithCRC.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\OutStreamWithCRC.h +# End Source File +# End Group +# Begin Group "Folders" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\FileManager\FSDrives.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FSDrives.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FSFolder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FSFolder.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FSFolderCopy.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\IFolder.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\NetFolder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\NetFolder.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\RootFolder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\RootFolder.h +# End Source File +# End Group +# Begin Group "Registry" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\FileManager\RegistryAssociations.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\RegistryAssociations.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\RegistryPlugins.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\RegistryPlugins.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\RegistryUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\RegistryUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ViewSettings.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ViewSettings.h +# End Source File +# End Group +# Begin Group "Panel" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\FileManager\App.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\App.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\AppState.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\EnumFormatEtc.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\EnumFormatEtc.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FileFolderPluginOpen.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FileFolderPluginOpen.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Panel.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Panel.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelCopy.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelCrc.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelDrag.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelFolderChange.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelItemOpen.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelItems.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelKey.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelListNotify.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelMenu.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelOperations.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelSelect.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelSort.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PanelSplitFile.cpp +# End Source File +# End Group +# Begin Group "Dialog" + +# PROP Default_Filter "" +# Begin Group "Options" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\FileManager\EditPage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\EditPage.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FoldersPage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FoldersPage.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\LangPage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\LangPage.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\MenuPage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\MenuPage.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\OptionsDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PluginsPage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PluginsPage.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SettingsPage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SettingsPage.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SystemPage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SystemPage.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\UI\FileManager\AboutDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\AboutDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\BrowseDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\BrowseDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ComboDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ComboDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\CopyDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\CopyDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\DialogSize.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ListViewDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ListViewDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\MessagesDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\MessagesDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\OverwriteDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\OverwriteDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PasswordDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PasswordDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ProgressDialog2.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ProgressDialog2.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SplitDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SplitDialog.h +# End Source File +# End Group +# Begin Group "FM Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\FileManager\ExtractCallback.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ExtractCallback.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FormatUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FormatUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\HelpUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\HelpUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\LangUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\LangUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ProgramLocation.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\ProgramLocation.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\UpdateCallback100.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\UpdateCallback100.h +# End Source File +# End Group +# Begin Group "7-Zip Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Common\FilePathAutoRename.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FilePathAutoRename.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FileStreams.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FileStreams.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\ProgressUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\ProgressUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamObjects.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamObjects.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamUtils.h +# End Source File +# End Group +# Begin Group "C" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\C\7zCrc.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\7zCrc.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Alloc.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +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 +# Begin Source File + +SOURCE=..\..\..\..\C\Sort.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Threads.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Threads.h +# End Source File +# End Group +# Begin Group "Windows" + +# PROP Default_Filter "" +# Begin Group "Control" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\Windows\Control\ComboBox.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\ComboBox.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\CommandBar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\Dialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\Dialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\Edit.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\ImageList.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\ListView.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\ListView.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\ProgressBar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\PropertyPage.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\PropertyPage.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\ReBar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\Static.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\StatusBar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\ToolBar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\Trackbar.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\Window2.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\Window2.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\Windows\Clipboard.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Clipboard.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\COM.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\CommonDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\CommonDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Defs.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Device.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\DLL.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\DLL.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Error.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Error.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileDir.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileDir.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileFind.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileFind.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileIO.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileIO.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileMapping.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileName.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileName.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileSystem.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileSystem.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Handle.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Memory.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Memory.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\MemoryLock.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\MemoryLock.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Menu.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Menu.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Net.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Net.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Process.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Process.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariant.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariant.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariantConversions.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariantConversions.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Registry.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Registry.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\ResourceString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\ResourceString.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Security.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Security.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Shell.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Shell.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Synchronization.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Synchronization.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Thread.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Time.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Time.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Timer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Window.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Window.h +# End Source File +# End Group +# Begin Group "Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\Common\Buffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\CommandLineParser.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\CommandLineParser.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\ComTry.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\CRC.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Defs.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\DynamicBuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Exception.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\IntToString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\IntToString.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Lang.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Lang.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\ListFileUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\ListFileUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyCom.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\NewHandler.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\NewHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Random.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Random.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringConvert.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringConvert.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringToInt.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringToInt.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\TextConfig.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\TextConfig.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Types.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\UTFConvert.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\UTFConvert.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Wildcard.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Wildcard.h +# End Source File +# End Group +# Begin Group "UI" + +# PROP Default_Filter "" +# Begin Group "UI Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveCommandLine.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveCommandLine.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveExtractCallback.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveExtractCallback.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveName.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveName.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveOpenCallback.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveOpenCallback.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\CompressCall.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\CompressCall2.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\DefaultName.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\DefaultName.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\DirItem.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\EnumDirItems.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\EnumDirItems.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ExitCode.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Extract.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Extract.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ExtractingFilePath.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ExtractingFilePath.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ExtractMode.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\IFileExtractCallback.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\LoadCodecs.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\LoadCodecs.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\OpenArchive.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\OpenArchive.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Property.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\PropIDUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\PropIDUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\SetProperties.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\SetProperties.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\SortUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\SortUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\TempFiles.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\TempFiles.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Update.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Update.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateAction.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateAction.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateCallback.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateCallback.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdatePair.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdatePair.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateProduce.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateProduce.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\WorkDir.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\WorkDir.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ZipRegistry.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ZipRegistry.h +# End Source File +# End Group +# Begin Group "Agent" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\Agent\Agent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\Agent.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\AgentOut.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\AgentProxy.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\AgentProxy.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\ArchiveFolder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\ArchiveFolderOpen.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\ArchiveFolderOut.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\IFolderArchive.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\UpdateCallbackAgent.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Agent\UpdateCallbackAgent.h +# End Source File +# End Group +# Begin Group "Explorer" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\Explorer\ContextMenu.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Explorer\ContextMenu.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Explorer\MyMessages.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Explorer\MyMessages.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Explorer\RegistryContextMenu.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Explorer\RegistryContextMenu.h +# End Source File +# End Group +# Begin Group "GUI" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\GUI\BenchmarkDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\BenchmarkDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\BenchmarkDialogRes.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\CompressDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\CompressDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\ExtractDialog.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\ExtractDialog.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\ExtractGUI.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\ExtractGUI.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\UpdateCallbackGUI.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\UpdateCallbackGUI.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\UpdateGUI.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\GUI\UpdateGUI.h +# End Source File +# End Group +# End Group +# Begin Group "Compress" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compress\CopyCoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\CopyCoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA_Alone\LzmaBench.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA_Alone\LzmaBench.h +# End Source File +# End Group +# Begin Group "Interface" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\ICoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\IDecl.h +# End Source File +# Begin Source File + +SOURCE=..\..\IPassword.h +# End Source File +# Begin Source File + +SOURCE=..\..\IProgress.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\UI\FileManager\7zFM.exe.manifest +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\7zipLogo.ico +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Add2.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Copy2.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Delete2.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Extract2.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FilePlugins.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FilePlugins.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\FM.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Info.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Info2.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Move2.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\MyCom2.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\MyLoadMenu.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\MyLoadMenu.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\OpenCallback.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\OpenCallback.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PluginInterface.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PluginLoader.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PropertyName.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\PropertyName.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\resource.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SplitUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SplitUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\StringUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\StringUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SysIconUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\SysIconUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\Test2.bmp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\TextPairs.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\FileManager\TextPairs.h +# End Source File +# End Target +# End Project diff --git a/CPP/7zip/Bundles/Fm/FM.dsw b/CPP/7zip/Bundles/Fm/FM.dsw new file mode 100755 index 00000000..1c955d95 --- /dev/null +++ b/CPP/7zip/Bundles/Fm/FM.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "FM"=.\FM.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/CPP/7zip/Bundles/Fm/StdAfx.cpp b/CPP/7zip/Bundles/Fm/StdAfx.cpp new file mode 100755 index 00000000..d0feea85 --- /dev/null +++ b/CPP/7zip/Bundles/Fm/StdAfx.cpp @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff --git a/CPP/7zip/Bundles/Fm/StdAfx.h b/CPP/7zip/Bundles/Fm/StdAfx.h new file mode 100755 index 00000000..b09de592 --- /dev/null +++ b/CPP/7zip/Bundles/Fm/StdAfx.h @@ -0,0 +1,23 @@ +// stdafx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#define _WIN32_WINNT 0x0400 + +// it's for Windows NT supporting (MENUITEMINFOW) +#define WINVER 0x0400 + +#include <windows.h> +#include <stdio.h> +#include <commctrl.h> +#include <ShlObj.h> +#include <limits.h> +#include <tchar.h> +#include <shlwapi.h> + +// #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include "Common/NewHandler.h" + +#endif diff --git a/CPP/7zip/Bundles/Fm/makefile b/CPP/7zip/Bundles/Fm/makefile new file mode 100755 index 00000000..47bc8eb3 --- /dev/null +++ b/CPP/7zip/Bundles/Fm/makefile @@ -0,0 +1,533 @@ +PROG = 7zFM.exe +CFLAGS = $(CFLAGS) -I ../../../ \ + -DLANG \ + -DNEW_FOLDER_INTERFACE \ + -DEXTERNAL_CODECS \ + -DCOMPRESS_MT \ + -DCOMPRESS_BZIP2_MT \ + -DCOMPRESS_MF_MT \ + +!IFDEF UNDER_CE +LIBS = $(LIBS) ceshell.lib Commctrl.lib +!ELSE +LIBS = $(LIBS) comctl32.lib htmlhelp.lib comdlg32.lib Mpr.lib Gdi32.lib +CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -DSUPPORT_DEVICE_FILE +!ENDIF + +FM_OBJS = \ + $O\App.obj \ + $O\BrowseDialog.obj \ + $O\ClassDefs.obj \ + $O\EnumFormatEtc.obj \ + $O\ExtractCallback.obj \ + $O\FileFolderPluginOpen.obj \ + $O\FilePlugins.obj \ + $O\FM.obj \ + $O\FoldersPage.obj \ + $O\FormatUtils.obj \ + $O\FSFolder.obj \ + $O\FSFolderCopy.obj \ + $O\HelpUtils.obj \ + $O\LangUtils.obj \ + $O\MenuPage.obj \ + $O\MyLoadMenu.obj \ + $O\OpenCallback.obj \ + $O\OptionsDialog.obj \ + $O\Panel.obj \ + $O\PanelCopy.obj \ + $O\PanelCrc.obj \ + $O\PanelDrag.obj \ + $O\PanelFolderChange.obj \ + $O\PanelItemOpen.obj \ + $O\PanelItems.obj \ + $O\PanelKey.obj \ + $O\PanelListNotify.obj \ + $O\PanelMenu.obj \ + $O\PanelOperations.obj \ + $O\PanelSelect.obj \ + $O\PanelSort.obj \ + $O\PanelSplitFile.obj \ + $O\ProgramLocation.obj \ + $O\PropertyName.obj \ + $O\RegistryAssociations.obj \ + $O\RegistryPlugins.obj \ + $O\RegistryUtils.obj \ + $O\RootFolder.obj \ + $O\SplitUtils.obj \ + $O\StringUtils.obj \ + $O\SysIconUtils.obj \ + $O\TextPairs.obj \ + $O\UpdateCallback100.obj \ + $O\ViewSettings.obj \ + $O\AboutDialog.obj \ + $O\ComboDialog.obj \ + $O\CopyDialog.obj \ + $O\EditPage.obj \ + $O\LangPage.obj \ + $O\ListViewDialog.obj \ + $O\MessagesDialog.obj \ + $O\OverwriteDialog.obj \ + $O\PasswordDialog.obj \ + $O\PluginsPage.obj \ + $O\ProgressDialog2.obj \ + $O\SettingsPage.obj \ + $O\SplitDialog.obj \ + $O\SystemPage.obj \ + +COMMON_OBJS = \ + $O\CommandLineParser.obj \ + $O\CRC.obj \ + $O\IntToString.obj \ + $O\Lang.obj \ + $O\ListFileUtils.obj \ + $O\MyMap.obj \ + $O\MyString.obj \ + $O\MyVector.obj \ + $O\MyXml.obj \ + $O\NewHandler.obj \ + $O\Random.obj \ + $O\StringConvert.obj \ + $O\StringToInt.obj \ + $O\TextConfig.obj \ + $O\UTFConvert.obj \ + $O\Wildcard.obj \ + +WIN_OBJS = \ + $O\Clipboard.obj \ + $O\DLL.obj \ + $O\Error.obj \ + $O\FileDir.obj \ + $O\FileFind.obj \ + $O\FileIO.obj \ + $O\FileName.obj \ + $O\Memory.obj \ + $O\MemoryLock.obj \ + $O\Menu.obj \ + $O\Process.obj \ + $O\PropVariant.obj \ + $O\PropVariantConversions.obj \ + $O\PropVariantUtils.obj \ + $O\Registry.obj \ + $O\ResourceString.obj \ + $O\Shell.obj \ + $O\Synchronization.obj \ + $O\System.obj \ + $O\Time.obj \ + $O\Window.obj \ + +!IFNDEF UNDER_CE + +FM_OBJS = $(FM_OBJS) \ + $O\FSDrives.obj \ + $O\NetFolder.obj \ + +WIN_OBJS = $(WIN_OBJS) \ + $O\CommonDialog.obj \ + $O\FileSystem.obj \ + $O\Net.obj \ + $O\Security.obj \ + +!ENDIF + + +WIN_CTRL_OBJS = \ + $O\ComboBox.obj \ + $O\Dialog.obj \ + $O\ListView.obj \ + $O\PropertyPage.obj \ + $O\Window2.obj \ + +7ZIP_COMMON_OBJS = \ + $O\CreateCoder.obj \ + $O\CWrappers.obj \ + $O\FilePathAutoRename.obj \ + $O\FileStreams.obj \ + $O\FilterCoder.obj \ + $O\InBuffer.obj \ + $O\InOutTempBuffer.obj \ + $O\LimitedStreams.obj \ + $O\LockedStream.obj \ + $O\MemBlocks.obj \ + $O\MethodId.obj \ + $O\MethodProps.obj \ + $O\OffsetStream.obj \ + $O\OutBuffer.obj \ + $O\OutMemStream.obj \ + $O\ProgressMt.obj \ + $O\ProgressUtils.obj \ + $O\StreamBinder.obj \ + $O\StreamObjects.obj \ + $O\StreamUtils.obj \ + $O\VirtThread.obj \ + +AR_OBJS = \ + $O\ArjHandler.obj \ + $O\Bz2Handler.obj \ + $O\CpioHandler.obj \ + $O\DebHandler.obj \ + $O\DeflateProps.obj \ + $O\DmgHandler.obj \ + $O\ElfHandler.obj \ + $O\FatHandler.obj \ + $O\FlvHandler.obj \ + $O\GzHandler.obj \ + $O\LzhHandler.obj \ + $O\LzmaHandler.obj \ + $O\MachoHandler.obj \ + $O\MbrHandler.obj \ + $O\MslzHandler.obj \ + $O\MubHandler.obj \ + $O\NtfsHandler.obj \ + $O\PeHandler.obj \ + $O\RpmHandler.obj \ + $O\SplitHandler.obj \ + $O\SwfHandler.obj \ + $O\VhdHandler.obj \ + $O\XarHandler.obj \ + $O\XzHandler.obj \ + $O\ZHandler.obj \ + +AR_COMMON_OBJS = \ + $O\CoderMixer2.obj \ + $O\CoderMixer2MT.obj \ + $O\CrossThreadProgress.obj \ + $O\DummyOutStream.obj \ + $O\FindSignature.obj \ + $O\InStreamWithCRC.obj \ + $O\ItemNameUtils.obj \ + $O\MultiStream.obj \ + $O\OutStreamWithCRC.obj \ + $O\OutStreamWithSha1.obj \ + $O\HandlerOut.obj \ + $O\ParseProperties.obj \ + +UI_COMMON_OBJS = \ + $O\ArchiveCommandLine.obj \ + $O\ArchiveExtractCallback.obj \ + $O\ArchiveName.obj \ + $O\ArchiveOpenCallback.obj \ + $O\CompressCall2.obj \ + $O\DefaultName.obj \ + $O\EnumDirItems.obj \ + $O\Extract.obj \ + $O\ExtractingFilePath.obj \ + $O\LoadCodecs.obj \ + $O\OpenArchive.obj \ + $O\PropIDUtils.obj \ + $O\SetProperties.obj \ + $O\SortUtils.obj \ + $O\TempFiles.obj \ + $O\Update.obj \ + $O\UpdateAction.obj \ + $O\UpdateCallback.obj \ + $O\UpdatePair.obj \ + $O\UpdateProduce.obj \ + $O\WorkDir.obj \ + $O\ZipRegistry.obj \ + +AGENT_OBJS = \ + $O\Agent.obj \ + $O\AgentOut.obj \ + $O\AgentProxy.obj \ + $O\ArchiveFolder.obj \ + $O\ArchiveFolderOpen.obj \ + $O\ArchiveFolderOut.obj \ + $O\UpdateCallbackAgent.obj \ + +EXPLORER_OBJS = \ + $O\ContextMenu.obj \ + $O\MyMessages.obj \ + $O\RegistryContextMenu.obj \ + +GUI_OBJS = \ + $O\BenchmarkDialog.obj \ + $O\CompressDialog.obj \ + $O\ExtractDialog.obj \ + $O\ExtractGUI.obj \ + $O\UpdateCallbackGUI.obj \ + $O\UpdateGUI.obj \ + + +7Z_OBJS = \ + $O\7zCompressionMode.obj \ + $O\7zDecode.obj \ + $O\7zEncode.obj \ + $O\7zExtract.obj \ + $O\7zFolderInStream.obj \ + $O\7zFolderOutStream.obj \ + $O\7zHandler.obj \ + $O\7zHandlerOut.obj \ + $O\7zHeader.obj \ + $O\7zIn.obj \ + $O\7zOut.obj \ + $O\7zProperties.obj \ + $O\7zSpecStream.obj \ + $O\7zUpdate.obj \ + $O\7zRegister.obj \ + +CAB_OBJS = \ + $O\CabBlockInStream.obj \ + $O\CabHandler.obj \ + $O\CabHeader.obj \ + $O\CabIn.obj \ + $O\CabRegister.obj \ + +CHM_OBJS = \ + $O\ChmHandler.obj \ + $O\ChmHeader.obj \ + $O\ChmIn.obj \ + $O\ChmRegister.obj \ + +COM_OBJS = \ + $O\ComHandler.obj \ + $O\ComIn.obj \ + $O\ComRegister.obj \ + +HFS_OBJS = \ + $O\HfsHandler.obj \ + $O\HfsIn.obj \ + $O\HfsRegister.obj \ + +ISO_OBJS = \ + $O\IsoHandler.obj \ + $O\IsoHeader.obj \ + $O\IsoIn.obj \ + $O\IsoRegister.obj \ + +NSIS_OBJS = \ + $O\NsisDecode.obj \ + $O\NsisHandler.obj \ + $O\NsisIn.obj \ + $O\NsisRegister.obj \ + +RAR_OBJS = \ + $O\RarHandler.obj \ + $O\RarHeader.obj \ + $O\RarIn.obj \ + $O\RarItem.obj \ + $O\RarVolumeInStream.obj \ + $O\RarRegister.obj \ + +TAR_OBJS = \ + $O\TarHandler.obj \ + $O\TarHandlerOut.obj \ + $O\TarHeader.obj \ + $O\TarIn.obj \ + $O\TarOut.obj \ + $O\TarUpdate.obj \ + $O\TarRegister.obj \ + +UDF_OBJS = \ + $O\UdfHandler.obj \ + $O\UdfIn.obj \ + $O\UdfRegister.obj \ + +WIM_OBJS = \ + $O\WimHandler.obj \ + $O\WimIn.obj \ + $O\WimRegister.obj \ + +ZIP_OBJS = \ + $O\ZipAddCommon.obj \ + $O\ZipHandler.obj \ + $O\ZipHandlerOut.obj \ + $O\ZipHeader.obj \ + $O\ZipIn.obj \ + $O\ZipItem.obj \ + $O\ZipOut.obj \ + $O\ZipUpdate.obj \ + $O\ZipRegister.obj \ + +COMPRESS_OBJS = \ + $O\ArjDecoder1.obj \ + $O\ArjDecoder2.obj \ + $O\Bcj2Coder.obj \ + $O\Bcj2Register.obj \ + $O\BcjCoder.obj \ + $O\BcjRegister.obj \ + $O\BitlDecoder.obj \ + $O\BranchCoder.obj \ + $O\BranchMisc.obj \ + $O\BranchRegister.obj \ + $O\ByteSwap.obj \ + $O\BZip2Crc.obj \ + $O\BZip2Decoder.obj \ + $O\BZip2Encoder.obj \ + $O\BZip2Register.obj \ + $O\CopyCoder.obj \ + $O\CopyRegister.obj \ + $O\Deflate64Register.obj \ + $O\DeflateDecoder.obj \ + $O\DeflateEncoder.obj \ + $O\DeflateNsisRegister.obj \ + $O\DeflateRegister.obj \ + $O\DeltaFilter.obj \ + $O\ImplodeDecoder.obj \ + $O\ImplodeHuffmanDecoder.obj \ + $O\LzhDecoder.obj \ + $O\Lzma2Decoder.obj \ + $O\Lzma2Encoder.obj \ + $O\Lzma2Register.obj \ + $O\LzmaDecoder.obj \ + $O\LzmaEncoder.obj \ + $O\LzmaRegister.obj \ + $O\LzOutWindow.obj \ + $O\Lzx86Converter.obj \ + $O\LzxDecoder.obj \ + $O\PpmdDecoder.obj \ + $O\PpmdEncoder.obj \ + $O\PpmdRegister.obj \ + $O\QuantumDecoder.obj \ + $O\Rar1Decoder.obj \ + $O\Rar2Decoder.obj \ + $O\Rar3Decoder.obj \ + $O\Rar3Vm.obj \ + $O\RarCodecsRegister.obj \ + $O\ShrinkDecoder.obj \ + $O\ZlibDecoder.obj \ + $O\ZlibEncoder.obj \ + $O\ZDecoder.obj \ + +LZMA_BENCH_OBJS = \ + $O\LzmaBench.obj \ + +CRYPTO_OBJS = \ + $O\7zAes.obj \ + $O\7zAesRegister.obj \ + $O\HmacSha1.obj \ + $O\MyAes.obj \ + $O\Pbkdf2HmacSha1.obj \ + $O\RandGen.obj \ + $O\Rar20Crypto.obj \ + $O\RarAes.obj \ + $O\Sha1.obj \ + $O\WzAes.obj \ + $O\ZipCrypto.obj \ + $O\ZipStrong.obj \ + + +C_OBJS = \ + $O\7zBuf2.obj \ + $O\7zStream.obj \ + $O\Aes.obj \ + $O\Alloc.obj \ + $O\Bra.obj \ + $O\Bra86.obj \ + $O\BraIA64.obj \ + $O\BwtSort.obj \ + $O\Delta.obj \ + $O\HuffEnc.obj \ + $O\LzFind.obj \ + $O\LzFindMt.obj \ + $O\Lzma2Dec.obj \ + $O\Lzma2Enc.obj \ + $O\LzmaDec.obj \ + $O\LzmaEnc.obj \ + $O\MtCoder.obj \ + $O\Sha256.obj \ + $O\Sort.obj \ + $O\Threads.obj \ + $O\Xz.obj \ + $O\XzCrc64.obj \ + $O\XzDec.obj \ + $O\XzEnc.obj \ + $O\XzIn.obj \ + +!include "../../Crc2.mak" + +OBJS = \ + $O\StdAfx.obj \ + $(FM_OBJS)\ + $(COMMON_OBJS) \ + $(WIN_OBJS) \ + $(WIN_CTRL_OBJS) \ + $(7ZIP_COMMON_OBJS) \ + $(AR_OBJS) \ + $(AR_COMMON_OBJS) \ + $(UI_COMMON_OBJS) \ + $(AGENT_OBJS) \ + $(EXPLORER_OBJS) \ + $(GUI_OBJS) \ + $(7Z_OBJS) \ + $(CAB_OBJS) \ + $(CHM_OBJS) \ + $(COM_OBJS) \ + $(HFS_OBJS) \ + $(ISO_OBJS) \ + $(NSIS_OBJS) \ + $(RAR_OBJS) \ + $(TAR_OBJS) \ + $(UDF_OBJS) \ + $(WIM_OBJS) \ + $(ZIP_OBJS) \ + $(COMPRESS_OBJS) \ + $(LZMA_BENCH_OBJS) \ + $(CRYPTO_OBJS) \ + $(CRC_OBJS) \ + $(C_OBJS) \ + $O\resource.res \ + +!include "../../../Build.mak" + +$(FM_OBJS): ../../UI/FileManager/$(*B).cpp + $(COMPL) +$(COMMON_OBJS): ../../../Common/$(*B).cpp + $(COMPL) +$(WIN_OBJS): ../../../Windows/$(*B).cpp + $(COMPL) +$(WIN_CTRL_OBJS): ../../../Windows/Control/$(*B).cpp + $(COMPL) +$(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp + $(COMPL) + +$(AR_OBJS): ../../Archive/$(*B).cpp + $(COMPL) +$(AR_COMMON_OBJS): ../../Archive/Common/$(*B).cpp + $(COMPL) + +$(7Z_OBJS): ../../Archive/7z/$(*B).cpp + $(COMPL) +$(CAB_OBJS): ../../Archive/Cab/$(*B).cpp + $(COMPL) +$(CHM_OBJS): ../../Archive/Chm/$(*B).cpp + $(COMPL) +$(COM_OBJS): ../../Archive/Com/$(*B).cpp + $(COMPL) +$(HFS_OBJS): ../../Archive/Hfs/$(*B).cpp + $(COMPL) +$(ISO_OBJS): ../../Archive/Iso/$(*B).cpp + $(COMPL) +$(NSIS_OBJS): ../../Archive/Nsis/$(*B).cpp + $(COMPL) +$(RAR_OBJS): ../../Archive/Rar/$(*B).cpp + $(COMPL) +$(TAR_OBJS): ../../Archive/Tar/$(*B).cpp + $(COMPL) +$(UDF_OBJS): ../../Archive/Udf/$(*B).cpp + $(COMPL) +$(WIM_OBJS): ../../Archive/Wim/$(*B).cpp + $(COMPL) +$(ZIP_OBJS): ../../Archive/Zip/$(*B).cpp + $(COMPL) + +$(COMPRESS_OBJS): ../../Compress/$(*B).cpp + $(COMPL_O2) +$(LZMA_BENCH_OBJS): ../../Compress/LZMA_Alone/$(*B).cpp + $(COMPL) + +$(CRYPTO_OBJS): ../../Crypto/$(*B).cpp + $(COMPL_O2) + +$(UI_COMMON_OBJS): ../../UI/Common/$(*B).cpp + $(COMPL) +$(AGENT_OBJS): ../../UI/Agent/$(*B).cpp + $(COMPL) +$(EXPLORER_OBJS): ../../UI/Explorer/$(*B).cpp + $(COMPL) +$(GUI_OBJS): ../../UI/GUI/$(*B).cpp + $(COMPL) + +$(C_OBJS): ../../../../C/$(*B).c + $(COMPL_O2) + +!include "../../Crc.mak" diff --git a/CPP/7zip/Bundles/Fm/resource.rc b/CPP/7zip/Bundles/Fm/resource.rc new file mode 100755 index 00000000..c2aab047 --- /dev/null +++ b/CPP/7zip/Bundles/Fm/resource.rc @@ -0,0 +1,7 @@ +#include "../../UI/FileManager/resource.rc" +#include "../../UI/GUI/resource2.rc" + +STRINGTABLE +BEGIN + 100 "7z zip bz2 bzip2 tbz2 tbz rar arj z taz lzh lha cab iso 001 rpm deb cpio tar gz gzip tgz tpz4 wim swm lzma dmg hfs xar vhd fat ntfs xz" +END diff --git a/CPP/7zip/Bundles/Format7z/makefile b/CPP/7zip/Bundles/Format7z/makefile index e26aeadd..a475bf9b 100755 --- a/CPP/7zip/Bundles/Format7z/makefile +++ b/CPP/7zip/Bundles/Format7z/makefile @@ -1,6 +1,5 @@ PROG = 7za.dll DEF_FILE = ../../Archive/Archive2.def -LIBS = $(LIBS) user32.lib oleaut32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DCOMPRESS_MT \ -DCOMPRESS_MF_MT \ diff --git a/CPP/7zip/Bundles/Format7zExtract/makefile b/CPP/7zip/Bundles/Format7zExtract/makefile index c2dd4f7f..d082a007 100755 --- a/CPP/7zip/Bundles/Format7zExtract/makefile +++ b/CPP/7zip/Bundles/Format7zExtract/makefile @@ -1,6 +1,5 @@ PROG = 7zxa.dll DEF_FILE = ../../Archive/Archive2.def -LIBS = $(LIBS) user32.lib oleaut32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DEXTRACT_ONLY \ -DCOMPRESS_MT \ @@ -17,9 +16,6 @@ COMMON_OBJS = \ $O\Wildcard.obj \ WIN_OBJS = \ - $O\FileDir.obj \ - $O\FileFind.obj \ - $O\FileIO.obj \ $O\PropVariant.obj \ $O\Synchronization.obj \ $O\System.obj \ @@ -28,7 +24,6 @@ WIN_OBJS = \ $O\CreateCoder.obj \ $O\CWrappers.obj \ $O\InBuffer.obj \ - $O\InOutTempBuffer.obj \ $O\FilterCoder.obj \ $O\LimitedStreams.obj \ $O\LockedStream.obj \ diff --git a/CPP/7zip/Bundles/Format7zExtractR/makefile b/CPP/7zip/Bundles/Format7zExtractR/makefile index 9f06ca5a..5c5a9187 100755 --- a/CPP/7zip/Bundles/Format7zExtractR/makefile +++ b/CPP/7zip/Bundles/Format7zExtractR/makefile @@ -1,6 +1,5 @@ PROG = 7zxr.dll DEF_FILE = ../../Archive/Archive2.def -LIBS = $(LIBS) user32.lib oleaut32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DEXTRACT_ONLY \ -DCOMPRESS_MT \ @@ -17,9 +16,6 @@ COMMON_OBJS = \ $O\Wildcard.obj \ WIN_OBJS = \ - $O\FileDir.obj \ - $O\FileFind.obj \ - $O\FileIO.obj \ $O\PropVariant.obj \ $O\Synchronization.obj \ $O\System.obj \ @@ -28,7 +24,6 @@ WIN_OBJS = \ $O\CreateCoder.obj \ $O\CWrappers.obj \ $O\InBuffer.obj \ - $O\InOutTempBuffer.obj \ $O\FilterCoder.obj \ $O\LimitedStreams.obj \ $O\LockedStream.obj \ diff --git a/CPP/7zip/Bundles/Format7zF/Format7z.dsp b/CPP/7zip/Bundles/Format7zF/Format7z.dsp index 33caaf95..8785faaf 100755 --- a/CPP/7zip/Bundles/Format7zF/Format7z.dsp +++ b/CPP/7zip/Bundles/Format7zF/Format7z.dsp @@ -234,6 +234,10 @@ SOURCE=..\..\..\Common\CRC.cpp # End Source File # Begin Source File +SOURCE=..\..\..\Common\DynamicBuffer.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Common\IntToString.cpp # End Source File # Begin Source File @@ -555,6 +559,14 @@ SOURCE=..\..\Compress\ZlibDecoder.cpp SOURCE=..\..\Compress\ZlibDecoder.h # End Source File +# Begin Source File + +SOURCE=..\..\Compress\ZlibEncoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\ZlibEncoder.h +# End Source File # End Group # Begin Group "7z Compress" @@ -2179,6 +2191,14 @@ SOURCE=..\..\Archive\DebHandler.cpp # End Source File # Begin Source File +SOURCE=..\..\Archive\DeflateProps.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\DeflateProps.h +# End Source File +# Begin Source File + SOURCE=..\..\Archive\DmgHandler.cpp # End Source File # Begin Source File @@ -2191,6 +2211,10 @@ SOURCE=..\..\Archive\FatHandler.cpp # End Source File # Begin Source File +SOURCE=..\..\Archive\FlvHandler.cpp +# End Source File +# Begin Source File + SOURCE=..\..\Archive\GzHandler.cpp # End Source File # Begin Source File @@ -2215,6 +2239,10 @@ SOURCE=..\..\Archive\MbrHandler.cpp # End Source File # Begin Source File +SOURCE=..\..\Archive\MslzHandler.cpp +# End Source File +# Begin Source File + SOURCE=..\..\Archive\MubHandler.cpp # End Source File # Begin Source File @@ -2235,6 +2263,10 @@ SOURCE=..\..\Archive\SplitHandler.cpp # End Source File # Begin Source File +SOURCE=..\..\Archive\SwfHandler.cpp +# End Source File +# Begin Source File + SOURCE=..\..\Archive\VhdHandler.cpp # End Source File # Begin Source File diff --git a/CPP/7zip/Bundles/Format7zF/makefile b/CPP/7zip/Bundles/Format7zF/makefile index a1f09365..7c35791e 100755 --- a/CPP/7zip/Bundles/Format7zF/makefile +++ b/CPP/7zip/Bundles/Format7zF/makefile @@ -1,23 +1,25 @@ PROG = 7z.dll DEF_FILE = ../../Archive/Archive2.def -LIBS = $(LIBS) user32.lib oleaut32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DEXTERNAL_CODECS \ -DCOMPRESS_MT \ -DCOMPRESS_BZIP2_MT \ -DCOMPRESS_MF_MT \ - -D_7ZIP_LARGE_PAGES \ + +!IFNDEF UNDER_CE +CFLAGS = $(CFLAGS) -D_7ZIP_LARGE_PAGES +!ENDIF COMMON_OBJS = \ $O\CRC.obj \ $O\IntToString.obj \ - $O\NewHandler.obj \ $O\MyMap.obj \ $O\MyString.obj \ + $O\MyVector.obj \ $O\MyXml.obj \ + $O\NewHandler.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\MyVector.obj \ $O\UTFConvert.obj \ $O\Wildcard.obj \ @@ -32,16 +34,16 @@ WIN_OBJS = \ $O\Time.obj \ 7ZIP_COMMON_OBJS = \ - $O\InBuffer.obj \ - $O\InOutTempBuffer.obj \ $O\CreateCoder.obj \ $O\CWrappers.obj \ + $O\InBuffer.obj \ + $O\InOutTempBuffer.obj \ $O\FilterCoder.obj \ $O\LimitedStreams.obj \ $O\LockedStream.obj \ + $O\MemBlocks.obj \ $O\MethodId.obj \ $O\MethodProps.obj \ - $O\MemBlocks.obj \ $O\OffsetStream.obj \ $O\OutBuffer.obj \ $O\OutMemStream.obj \ @@ -59,19 +61,23 @@ AR_OBJS = \ $O\Bz2Handler.obj \ $O\CpioHandler.obj \ $O\DebHandler.obj \ + $O\DeflateProps.obj \ $O\DmgHandler.obj \ $O\ElfHandler.obj \ $O\FatHandler.obj \ + $O\FlvHandler.obj \ $O\GzHandler.obj \ $O\LzhHandler.obj \ $O\LzmaHandler.obj \ $O\MachoHandler.obj \ $O\MbrHandler.obj \ + $O\MslzHandler.obj \ $O\MubHandler.obj \ $O\NtfsHandler.obj \ $O\PeHandler.obj \ $O\RpmHandler.obj \ $O\SplitHandler.obj \ + $O\SwfHandler.obj \ $O\VhdHandler.obj \ $O\XarHandler.obj \ $O\XzHandler.obj \ @@ -230,6 +236,7 @@ COMPRESS_OBJS = \ $O\RarCodecsRegister.obj \ $O\ShrinkDecoder.obj \ $O\ZlibDecoder.obj \ + $O\ZlibEncoder.obj \ $O\ZDecoder.obj \ CRYPTO_OBJS = \ diff --git a/CPP/7zip/Bundles/Format7zF/resource.rc b/CPP/7zip/Bundles/Format7zF/resource.rc index babd1149..60c1f732 100755 --- a/CPP/7zip/Bundles/Format7zF/resource.rc +++ b/CPP/7zip/Bundles/Format7zF/resource.rc @@ -32,5 +32,5 @@ MY_VERSION_INFO_DLL("7z Standalone Plugin", "7za") STRINGTABLE BEGIN - 100 "7z:0 zip:1 bz2:2 bzip2:2 tbz2:2 tbz:2 rar:3 arj:4 z:5 taz:5 lzh:6 lha:6 cab:7 iso:8 split:9 rpm:10 deb:11 cpio:12 tar:13 gz:14 gzip:14 tgz:14 tpz:14 wim:15 swm:15 lzma:16 dmg:17 hfs:18 xar:19 vhd:20 fat:21 ntfs:22 xz:23" + 100 "7z:0 zip:1 bz2:2 bzip2:2 tbz2:2 tbz:2 rar:3 arj:4 z:5 taz:5 lzh:6 lha:6 cab:7 iso:8 001:9 rpm:10 deb:11 cpio:12 tar:13 gz:14 gzip:14 tgz:14 tpz:14 wim:15 swm:15 lzma:16 dmg:17 hfs:18 xar:19 vhd:20 fat:21 ntfs:22 xz:23" END diff --git a/CPP/7zip/Bundles/Format7zR/makefile b/CPP/7zip/Bundles/Format7zR/makefile index 77544ce2..a286303d 100755 --- a/CPP/7zip/Bundles/Format7zR/makefile +++ b/CPP/7zip/Bundles/Format7zR/makefile @@ -1,6 +1,5 @@ PROG = 7zra.dll DEF_FILE = ../../Archive/Archive2.def -LIBS = $(LIBS) user32.lib oleaut32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DCOMPRESS_MT \ -DCOMPRESS_MF_MT \ diff --git a/CPP/7zip/Bundles/SFXCon/Main.cpp b/CPP/7zip/Bundles/SFXCon/Main.cpp index 140f8364..b136ae7c 100755 --- a/CPP/7zip/Bundles/SFXCon/Main.cpp +++ b/CPP/7zip/Bundles/SFXCon/Main.cpp @@ -191,7 +191,7 @@ static bool AddNameToCensor(NWildcard::CCensor &wildcardCensor, const UString &name, bool include, NRecursedType::EEnum type) { /* - if(!IsWildCardFilePathLegal(name)) + if (!IsWildCardFilePathLegal(name)) return false; */ bool isWildCard = DoesNameContainWildCard(name); @@ -229,12 +229,12 @@ void AddToCensorFromNonSwitchesStrings(NWildcard::CCensor &wildcardCensor, #ifndef _WIN32 -static void GetArguments(int numArguments, const char *arguments[], UStringVector &parts) +static void GetArguments(int numArgs, const char *args[], UStringVector &parts) { parts.Clear(); - for(int i = 0; i < numArguments; i++) + for (int i = 0; i < numArgs; i++) { - UString s = MultiByteToUnicodeString(arguments[i]); + UString s = MultiByteToUnicodeString(args[i]); parts.Add(s); } } @@ -242,11 +242,11 @@ static void GetArguments(int numArguments, const char *arguments[], UStringVecto int Main2( #ifndef _WIN32 - int numArguments, const char *arguments[] + int numArgs, const char *args[] #endif ) { - #ifdef _WIN32 + #if defined(_WIN32) && !defined(UNDER_CE) SetFileApisToOEM(); #endif @@ -256,7 +256,7 @@ int Main2( #ifdef _WIN32 NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings); #else - GetArguments(numArguments, arguments, commandStrings); + GetArguments(numArgs, args, commandStrings); #endif #ifdef _WIN32 diff --git a/CPP/7zip/Bundles/SFXCon/makefile b/CPP/7zip/Bundles/SFXCon/makefile index cac6d6ef..eadd5684 100755 --- a/CPP/7zip/Bundles/SFXCon/makefile +++ b/CPP/7zip/Bundles/SFXCon/makefile @@ -1,5 +1,5 @@ PROG = 7zCon.sfx -LIBS = $(LIBS) user32.lib oleaut32.lib +MY_CONSOLE = 1 CFLAGS = $(CFLAGS) -I ../../../ \ -DEXTRACT_ONLY \ -DNO_READ_FROM_CODER \ diff --git a/CPP/7zip/Bundles/SFXSetup/ExtractCallback.cpp b/CPP/7zip/Bundles/SFXSetup/ExtractCallback.cpp index 8ebe2504..a28e82d3 100755 --- a/CPP/7zip/Bundles/SFXSetup/ExtractCallback.cpp +++ b/CPP/7zip/Bundles/SFXSetup/ExtractCallback.cpp @@ -36,7 +36,7 @@ void CExtractCallbackImp::Init(IInArchive *archiveHandler, HRESULT CExtractCallbackImp::Open_CheckBreak() { #ifndef _NO_PROGRESS - return ProgressDialog.ProgressSynch.ProcessStopAndPause(); + return ProgressDialog.Sync.ProcessStopAndPause(); #else return S_OK; #endif @@ -50,7 +50,7 @@ HRESULT CExtractCallbackImp::Open_SetTotal(const UInt64 * /* numFiles */, const HRESULT CExtractCallbackImp::Open_SetCompleted(const UInt64 * /* numFiles */, const UInt64 * /* numBytes */) { #ifndef _NO_PROGRESS - return ProgressDialog.ProgressSynch.ProcessStopAndPause(); + return ProgressDialog.Sync.ProcessStopAndPause(); #else return S_OK; #endif @@ -59,7 +59,7 @@ HRESULT CExtractCallbackImp::Open_SetCompleted(const UInt64 * /* numFiles */, co STDMETHODIMP CExtractCallbackImp::SetTotal(UInt64 size) { #ifndef _NO_PROGRESS - ProgressDialog.ProgressSynch.SetProgress(size, 0); + ProgressDialog.Sync.SetProgress(size, 0); #endif return S_OK; } @@ -67,9 +67,9 @@ STDMETHODIMP CExtractCallbackImp::SetTotal(UInt64 size) STDMETHODIMP CExtractCallbackImp::SetCompleted(const UInt64 *completeValue) { #ifndef _NO_PROGRESS - RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause()); + RINOK(ProgressDialog.Sync.ProcessStopAndPause()); if (completeValue != NULL) - ProgressDialog.ProgressSynch.SetPos(*completeValue); + ProgressDialog.Sync.SetPos(*completeValue); #endif return S_OK; } @@ -89,7 +89,7 @@ STDMETHODIMP CExtractCallbackImp::GetStream(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode) { #ifndef _NO_PROGRESS - if (ProgressDialog.ProgressSynch.GetStopped()) + if (ProgressDialog.Sync.GetStopped()) return E_ABORT; #endif _outFileStream.Release(); diff --git a/CPP/7zip/Bundles/SFXSetup/ExtractCallback.h b/CPP/7zip/Bundles/SFXSetup/ExtractCallback.h index 4f4258bc..c78ff22b 100755 --- a/CPP/7zip/Bundles/SFXSetup/ExtractCallback.h +++ b/CPP/7zip/Bundles/SFXSetup/ExtractCallback.h @@ -1,7 +1,7 @@ // ExtractCallback.h -#ifndef __EXTRACTCALLBACK_H -#define __EXTRACTCALLBACK_H +#ifndef __EXTRACT_CALLBACK_H +#define __EXTRACT_CALLBACK_H #include "resource.h" @@ -66,9 +66,9 @@ public: UInt32 defaultAttributes); #ifndef _NO_PROGRESS - HRESULT StartProgressDialog(const UString &title) + HRESULT StartProgressDialog(const UString &title, NWindows::CThread &thread) { - ProgressDialog.Create(title, 0); + ProgressDialog.Create(title, thread, 0); { #ifdef LANG ProgressDialog.SetText(LangLoadString(IDS_PROGRESS_EXTRACTING, 0x02000890)); diff --git a/CPP/7zip/Bundles/SFXSetup/ExtractEngine.cpp b/CPP/7zip/Bundles/SFXSetup/ExtractEngine.cpp index e5353c21..cc561090 100755 --- a/CPP/7zip/Bundles/SFXSetup/ExtractEngine.cpp +++ b/CPP/7zip/Bundles/SFXSetup/ExtractEngine.cpp @@ -19,9 +19,6 @@ static LPCWSTR kCantOpenArchive = L"Can not open the file as archive"; struct CThreadExtracting { - #ifndef _NO_PROGRESS - bool ShowProgress; - #endif CCodecs *Codecs; UString FileName; UString DestFolder; @@ -33,7 +30,7 @@ struct CThreadExtracting HRESULT Result; UString ErrorMessage; - void Process() + void Process2() { NFile::NFind::CFileInfoW fi; if (!fi.Find(FileName)) @@ -67,15 +64,19 @@ struct CThreadExtracting ExtractCallbackSpec->Init(ArchiveLink.GetArchive(), dirPath, L"Default", fi.MTime, 0); - #ifndef _NO_PROGRESS - if (ShowProgress) - ExtractCallbackSpec->ProgressDialog.WaitCreating(); - #endif Result = ArchiveLink.GetArchive()->Extract(0, (UInt32)-1 , BoolToInt(false), ExtractCallback); - #ifndef _NO_PROGRESS - if (ShowProgress) - ExtractCallbackSpec->ProgressDialog.MyClose(); - #endif + } + + void Process() + { + try + { + #ifndef _NO_PROGRESS + CProgressCloser closer(ExtractCallbackSpec->ProgressDialog); + #endif + Process2(); + } + catch(...) { Result = E_FAIL; } } static THREAD_FUNC_DECL MyThreadFunction(void *param) @@ -100,9 +101,9 @@ HRESULT ExtractArchive(CCodecs *codecs,const UString &fileName, const UString &d #ifndef _NO_PROGRESS - t.ShowProgress = showProgress; if (showProgress) { + t.ExtractCallbackSpec->ProgressDialog.IconID = IDI_ICON; NWindows::CThread thread; RINOK(thread.Create(CThreadExtracting::MyThreadFunction, &t)); @@ -112,13 +113,13 @@ HRESULT ExtractArchive(CCodecs *codecs,const UString &fileName, const UString &d #else title = NWindows::MyLoadStringW(IDS_PROGRESS_EXTRACTING); #endif - t.ExtractCallbackSpec->StartProgressDialog(title); + t.ExtractCallbackSpec->StartProgressDialog(title, thread); } else #endif { - t.Process(); + t.Process2(); } errorMessage = t.ErrorMessage; diff --git a/CPP/7zip/Bundles/SFXSetup/Main.cpp b/CPP/7zip/Bundles/SFXSetup/Main.cpp index ece6e3de..80e23c4e 100755 --- a/CPP/7zip/Bundles/SFXSetup/Main.cpp +++ b/CPP/7zip/Bundles/SFXSetup/Main.cpp @@ -2,7 +2,7 @@ #include "StdAfx.h" -#include <initguid.h> +#include "Common/MyInitGuid.h" #include "Common/CommandLineParser.h" #include "Common/StringConvert.h" @@ -12,6 +12,7 @@ #include "Windows/FileDir.h" #include "Windows/FileFind.h" #include "Windows/FileIO.h" +#include "Windows/NtCheck.h" #include "Windows/ResourceString.h" #include "../../UI/Explorer/MyMessages.h" @@ -38,8 +39,8 @@ static bool ReadDataString(LPCWSTR fileName, LPCSTR startID, const int kBufferSize = (1 << 12); Byte buffer[kBufferSize]; - int signatureStartSize = lstrlenA(startID); - int signatureEndSize = lstrlenA(endID); + int signatureStartSize = MyStringLen(startID); + int signatureEndSize = MyStringLen(endID); UInt32 numBytesPrev = 0; bool writeMode = false; @@ -103,37 +104,32 @@ public: } g_CInstallIDInit; +#ifndef UNDER_CE class CCurrentDirRestorer { CSysString m_CurrentDirectory; public: - CCurrentDirRestorer() - { NFile::NDirectory::MyGetCurrentDirectory(m_CurrentDirectory); } - ~CCurrentDirRestorer() - { RestoreDirectory();} - bool RestoreDirectory() - { return BOOLToBool(::SetCurrentDirectory(m_CurrentDirectory)); } + CCurrentDirRestorer() { NFile::NDirectory::MyGetCurrentDirectory(m_CurrentDirectory); } + ~CCurrentDirRestorer() { RestoreDirectory();} + bool RestoreDirectory() { return BOOLToBool(::SetCurrentDirectory(m_CurrentDirectory)); } }; - -#ifndef _UNICODE -bool g_IsNT = false; -static inline bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} #endif -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */,int /* nCmdShow */) +#define NT_CHECK_FAIL_ACTION ShowErrorMessage(L"Unsupported Windows version"); return 1; + +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + #ifdef UNDER_CE + LPWSTR + #else + LPSTR + #endif + /* lpCmdLine */,int /* nCmdShow */) { g_hInstance = (HINSTANCE)hInstance; - #ifndef _UNICODE - g_IsNT = IsItWindowsNT(); - #endif - InitCommonControls(); + + NT_CHECK + + // InitCommonControls(); UString archiveName, switches; #ifdef _SHELL_EXECUTE @@ -235,10 +231,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR / } } + #ifndef UNDER_CE CCurrentDirRestorer currentDirRestorer; - if (!SetCurrentDirectory(tempDir.GetPath())) return 1; + #endif HANDLE hProcess = 0; #ifdef _SHELL_EXECUTE @@ -247,7 +244,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR / CSysString filePath = GetSystemString(executeFile); SHELLEXECUTEINFO execInfo; execInfo.cbSize = sizeof(execInfo); - execInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT; + execInfo.fMask = SEE_MASK_NOCLOSEPROCESS + #ifndef UNDER_CE + | SEE_MASK_FLAG_DDEWAIT + #endif + ; execInfo.hwnd = NULL; execInfo.lpVerb = NULL; execInfo.lpFile = filePath; diff --git a/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp b/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp index 1f5d99cb..61ec0470 100755 --- a/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp +++ b/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp @@ -619,25 +619,21 @@ SOURCE=..\..\UI\Common\OpenArchive.h # Begin Group "File Manager" # PROP Default_Filter "" -# Begin Group "Dialog" - -# PROP Default_Filter "" # Begin Source File -SOURCE=..\..\UI\FileManager\ProgressDialog.cpp +SOURCE=..\..\UI\FileManager\FormatUtils.cpp # End Source File # Begin Source File -SOURCE=..\..\UI\FileManager\ProgressDialog.h +SOURCE=..\..\UI\FileManager\FormatUtils.h # End Source File -# End Group # Begin Source File -SOURCE=..\..\UI\FileManager\FormatUtils.cpp +SOURCE=..\..\UI\FileManager\ProgressDialog.cpp # End Source File # Begin Source File -SOURCE=..\..\UI\FileManager\FormatUtils.h +SOURCE=..\..\UI\FileManager\ProgressDialog.h # End Source File # End Group # Begin Group "C" diff --git a/CPP/7zip/Bundles/SFXSetup/makefile b/CPP/7zip/Bundles/SFXSetup/makefile index 44ffc9c6..a3c2b12c 100755 --- a/CPP/7zip/Bundles/SFXSetup/makefile +++ b/CPP/7zip/Bundles/SFXSetup/makefile @@ -1,5 +1,4 @@ PROG = 7zS.sfx -LIBS = $(LIBS) user32.lib oleaut32.lib shell32.lib ole32.lib comctl32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DNO_REGISTRY \ -DEXTRACT_ONLY \ diff --git a/CPP/7zip/Bundles/SFXSetup/resource.h b/CPP/7zip/Bundles/SFXSetup/resource.h index 2c7e5a22..58cd13cb 100755 --- a/CPP/7zip/Bundles/SFXSetup/resource.h +++ b/CPP/7zip/Bundles/SFXSetup/resource.h @@ -1,4 +1,4 @@ -#define IDI_ICON3 159 +#define IDI_ICON 1 #define IDS_EXTRACTION_ERROR_TITLE 7 #define IDS_EXTRACTION_ERROR_MESSAGE 8 diff --git a/CPP/7zip/Bundles/SFXSetup/resource.rc b/CPP/7zip/Bundles/SFXSetup/resource.rc index 85c24f0b..8ccdcf2c 100755 --- a/CPP/7zip/Bundles/SFXSetup/resource.rc +++ b/CPP/7zip/Bundles/SFXSetup/resource.rc @@ -3,7 +3,7 @@ MY_VERSION_INFO_APP("7z Setup SFX", "7zS.sfx") -IDI_ICON3 ICON "setup.ico" +IDI_ICON ICON "setup.ico" STRINGTABLE BEGIN diff --git a/CPP/7zip/Bundles/SFXWin/Main.cpp b/CPP/7zip/Bundles/SFXWin/Main.cpp index a538960b..ec5098dd 100755 --- a/CPP/7zip/Bundles/SFXWin/Main.cpp +++ b/CPP/7zip/Bundles/SFXWin/Main.cpp @@ -2,7 +2,7 @@ #include "StdAfx.h" -#include <initguid.h> +#include "Common/MyInitGuid.h" #include "Common/CommandLineParser.h" #include "Common/StringConvert.h" @@ -11,6 +11,7 @@ #include "Windows/Error.h" #include "Windows/FileDir.h" #include "Windows/FileName.h" +#include "Windows/NtCheck.h" #include "Windows/ResourceString.h" #include "../../ICoder.h" @@ -23,28 +24,16 @@ #include "../../UI/GUI/ExtractRes.h" HINSTANCE g_hInstance; -#ifndef _UNICODE -bool g_IsNT = false; -static inline bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} + +#ifdef UNDER_CE +bool g_LVN_ITEMACTIVATE_Support = true; #endif static const wchar_t *kUnknownExceptionMessage = L"ERROR: Unknown Error!"; void ErrorMessageForHRESULT(HRESULT res) { - UString s; - if (res == E_OUTOFMEMORY) - s = NWindows::MyLoadStringW(IDS_MEM_ERROR); - else - s = NWindows::NError::MyFormatMessageW(res); - ShowErrorMessage(s); + ShowErrorMessage(HResultToMessage(res)); } int APIENTRY WinMain2() @@ -53,11 +42,17 @@ int APIENTRY WinMain2() bool assumeYes = false; bool outputFolderDefined = false; UString outputFolder; - UStringVector subStrings; - NCommandLineParser::SplitCommandLine(GetCommandLineW(), subStrings); - for (int i = 1; i < subStrings.Size(); i++) + UStringVector commandStrings; + NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings); + + #ifndef UNDER_CE + if (commandStrings.Size() > 0) + commandStrings.Delete(0); + #endif + + for (int i = 0; i < commandStrings.Size(); i++) { - const UString &s = subStrings[i]; + const UString &s = commandStrings[i]; if (s.CompareNoCase(L"-y") == 0) assumeYes = true; else if (s.Left(2).CompareNoCase(L"-o") == 0) @@ -122,32 +117,44 @@ int APIENTRY WinMain2() NWildcard::CCensorNode wildcardCensor; wildcardCensor.AddItem(true, L"*", true, true, true); + bool messageWasDisplayed = false; result = ExtractGUI(codecs, CIntVector(), v1, v2, - wildcardCensor, eo, (assumeYes ? false: true), ecs); + wildcardCensor, eo, (assumeYes ? false: true), messageWasDisplayed, ecs); if (result == S_OK) { - if (ecs->Messages.Size() > 0 || ecs->NumArchiveErrors != 0) + if (!ecs->IsOK()) return NExitCode::kFatalError; return 0; } if (result == E_ABORT) return NExitCode::kUserBreak; - if (result == S_FALSE) - ShowErrorMessage(L"Error in archive"); - else - ErrorMessageForHRESULT(result); + if (!messageWasDisplayed) + { + if (result == S_FALSE) + ShowErrorMessage(L"Error in archive"); + else + ErrorMessageForHRESULT(result); + } if (result == E_OUTOFMEMORY) return NExitCode::kMemoryError; return NExitCode::kFatalError; } -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */) +#define NT_CHECK_FAIL_ACTION ShowErrorMessage(L"Unsupported Windows version"); return NExitCode::kFatalError; + +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + #ifdef UNDER_CE + LPWSTR + #else + LPSTR + #endif + /* lpCmdLine */, int /* nCmdShow */) { g_hInstance = (HINSTANCE)hInstance; - #ifndef _UNICODE - g_IsNT = IsItWindowsNT(); - #endif + + NT_CHECK + try { return WinMain2(); diff --git a/CPP/7zip/Bundles/SFXWin/SFXWin.dsp b/CPP/7zip/Bundles/SFXWin/SFXWin.dsp index ddd7c5fa..f41bc029 100755 --- a/CPP/7zip/Bundles/SFXWin/SFXWin.dsp +++ b/CPP/7zip/Bundles/SFXWin/SFXWin.dsp @@ -337,11 +337,11 @@ SOURCE=..\..\UI\FileManager\PasswordDialog.h # End Source File # Begin Source File -SOURCE=..\..\UI\FileManager\ProgressDialog.cpp +SOURCE=..\..\UI\FileManager\ProgressDialog2.cpp # End Source File # Begin Source File -SOURCE=..\..\UI\FileManager\ProgressDialog.h +SOURCE=..\..\UI\FileManager\ProgressDialog2.h # End Source File # End Group # Begin Group "7zip Common" diff --git a/CPP/7zip/Bundles/SFXWin/makefile b/CPP/7zip/Bundles/SFXWin/makefile index ec0b8590..5668fc13 100755 --- a/CPP/7zip/Bundles/SFXWin/makefile +++ b/CPP/7zip/Bundles/SFXWin/makefile @@ -1,11 +1,16 @@ PROG = 7z.sfx -LIBS = $(LIBS) user32.lib oleaut32.lib shell32.lib ole32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DNO_REGISTRY \ -DEXTRACT_ONLY \ -DNO_READ_FROM_CODER \ -D_SFX \ +!IFDEF UNDER_CE +LIBS = $(LIBS) ceshell.lib Commctrl.lib +!ELSE +LIBS = $(LIBS) comctl32.lib comdlg32.lib +!ENDIF + SFX_WIN_OBJS = \ $O\Main.obj \ @@ -68,10 +73,15 @@ UI_COMMON_OBJS = \ FM_OBJS = \ $O\ExtractCallback.obj \ $O\FormatUtils.obj \ - $O\MessagesDialog.obj \ $O\OverwriteDialog.obj \ $O\PasswordDialog.obj \ - $O\ProgressDialog.obj \ + $O\ProgressDialog2.obj \ + +!IFDEF UNDER_CE +FM_OBJS = $(FM_OBJS) \ + $O\BrowseDialog.obj \ + $O\SysIconUtils.obj \ +!ENDIF AR_COMMON_OBJS = \ $O\CoderMixer2.obj \ diff --git a/CPP/7zip/Bundles/SFXWin/resource.h b/CPP/7zip/Bundles/SFXWin/resource.h index 0a460213..99878ee6 100755 --- a/CPP/7zip/Bundles/SFXWin/resource.h +++ b/CPP/7zip/Bundles/SFXWin/resource.h @@ -1,7 +1 @@ -#define IDD_DIALOG_EXTRACT 137 - -#define IDI_ICON3 159 - -#define IDC_STATIC_EXTRACT_EXTRACT_TO 1020 -#define IDC_EXTRACT_COMBO_PATH 1021 -#define IDC_EXTRACT_BUTTON_SET_PATH 1022 +#define IDI_ICON 1 diff --git a/CPP/7zip/Bundles/SFXWin/resource.rc b/CPP/7zip/Bundles/SFXWin/resource.rc index 8dd95bf0..35234cae 100755 --- a/CPP/7zip/Bundles/SFXWin/resource.rc +++ b/CPP/7zip/Bundles/SFXWin/resource.rc @@ -1,34 +1,43 @@ #include "../../MyVersionInfo.rc" #include "../../GuiCommon.rc" +#include "../../UI/GUI/ExtractDialogRes.h" #include "resource.h" MY_VERSION_INFO_APP("7z SFX", "7z.sfx") -#define xSize2 214 -#define ySize2 64 +#define xc 240 +#define yc 64 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +IDI_ICON ICON "7z.ico" -#define bYPos (ySize - marg - bYSize) -#define bXPos1 (xSize - marg - bXSize) -#define bXPos2 (bXPos1 - 10 - bXSize) +IDD_DIALOG_EXTRACT MY_DIALOG +CAPTION "7-Zip self-extracting archive" +BEGIN + LTEXT "E&xtract to:", IDC_STATIC_EXTRACT_EXTRACT_TO, m, m, xc, 8 + EDITTEXT IDC_EXTRACT_COMBO_PATH, m, 21, xc - bxsDots - 12, 14, ES_AUTOHSCROLL + PUSHBUTTON "...", IDC_EXTRACT_BUTTON_SET_PATH, xs - m - bxsDots, 20, bxsDots, bys, WS_GROUP + DEFPUSHBUTTON "Extract", IDOK, bx2, by, bxs, bys, WS_GROUP + PUSHBUTTON "Cancel", IDCANCEL, bx1, by, bxs, bys +END -IDI_ICON3 ICON "7z.ico" +#ifdef UNDER_CE -IDD_DIALOG_EXTRACT DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +#undef xc +#define xc 144 + +IDD_DIALOG_EXTRACT_2 MY_DIALOG CAPTION "7-Zip self-extracting archive" -MY_FONT BEGIN - LTEXT "E&xtract to:", IDC_STATIC_EXTRACT_EXTRACT_TO, marg, marg, xSize2, 8 - EDITTEXT IDC_EXTRACT_COMBO_PATH, marg, 21, xSize2 - bDotsSize - 13, 14, ES_AUTOHSCROLL - PUSHBUTTON "...", IDC_EXTRACT_BUTTON_SET_PATH, xSize - marg - bDotsSize, 20, bDotsSize, bYSize, WS_GROUP - DEFPUSHBUTTON "Extract", IDOK, , bXPos2, bYPos, bXSize, bYSize, WS_GROUP - PUSHBUTTON "Cancel", IDCANCEL, bXPos1, bYPos, bXSize, bYSize + LTEXT "E&xtract to:", IDC_STATIC_EXTRACT_EXTRACT_TO, m, m, xc - bxsDots - 12, 8 + EDITTEXT IDC_EXTRACT_COMBO_PATH, m, m + bys + 4, xc, 14, ES_AUTOHSCROLL + PUSHBUTTON "...", IDC_EXTRACT_BUTTON_SET_PATH, xs - m - bxsDots, m, bxsDots, bys, WS_GROUP + DEFPUSHBUTTON "Extract", IDOK, bx2, by, bxs, bys, WS_GROUP + PUSHBUTTON "Cancel", IDCANCEL, bx1, by, bxs, bys END -#include "../../UI/FileManager/MessagesDialog.rc" +#endif + #include "../../UI/FileManager/OverwriteDialog.rc" #include "../../UI/FileManager/PasswordDialog.rc" -#include "../../UI/FileManager/ProgressDialog.rc" +#include "../../UI/FileManager/ProgressDialog2.rc" #include "../../UI/GUI/Extract.rc" diff --git a/CPP/7zip/Bundles/makefile b/CPP/7zip/Bundles/makefile index fd95af31..6a4f16cd 100755 --- a/CPP/7zip/Bundles/makefile +++ b/CPP/7zip/Bundles/makefile @@ -1,6 +1,7 @@ DIRS = \ Alone\~ \ Alone7z\~ \ + Fm\~ \ Format7z\~ \ Format7zF\~ \ Format7zR\~ \ diff --git a/CPP/7zip/Common/FileStreams.cpp b/CPP/7zip/Common/FileStreams.cpp index f7c01d2c..292fc7c2 100755 --- a/CPP/7zip/Common/FileStreams.cpp +++ b/CPP/7zip/Common/FileStreams.cpp @@ -195,7 +195,15 @@ STDMETHODIMP CInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) #endif } -#ifndef _WIN32_WCE +#ifdef UNDER_CE +STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + size_t s2 = fread(data, 1, size, stdout); + if (processedSize != 0) + *processedSize = s2; + return (s2 = size) ? S_OK : E_FAIL; +} +#else STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) { #ifdef _WIN32 @@ -360,7 +368,15 @@ STDMETHODIMP COutFileStream::SetSize(Int64 newSize) #endif } -#ifndef _WIN32_WCE +#ifdef UNDER_CE +STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + size_t s2 = fwrite(data, 1, size, stdout); + if (processedSize != 0) + *processedSize = s2; + return (s2 = size) ? S_OK : E_FAIL; +} +#else STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize) { if (processedSize != NULL) @@ -402,5 +418,4 @@ STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *pro return S_OK; #endif } - #endif diff --git a/CPP/7zip/Common/FileStreams.h b/CPP/7zip/Common/FileStreams.h index 32869192..0b91380d 100755 --- a/CPP/7zip/Common/FileStreams.h +++ b/CPP/7zip/Common/FileStreams.h @@ -63,7 +63,6 @@ public: STDMETHOD(GetSize)(UInt64 *size); }; -#ifndef _WIN32_WCE class CStdInFileStream: public ISequentialInStream, public CMyUnknownImp @@ -74,7 +73,6 @@ public: virtual ~CStdInFileStream() {} STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); }; -#endif class COutFileStream: public IOutStream, @@ -132,7 +130,6 @@ public: STDMETHOD(SetSize)(Int64 newSize); }; -#ifndef _WIN32_WCE class CStdOutFileStream: public ISequentialOutStream, public CMyUnknownImp @@ -143,6 +140,5 @@ public: virtual ~CStdOutFileStream() {} STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); }; -#endif #endif diff --git a/CPP/7zip/Common/InBuffer.cpp b/CPP/7zip/Common/InBuffer.cpp index 03924d2a..ad4f8825 100755 --- a/CPP/7zip/Common/InBuffer.cpp +++ b/CPP/7zip/Common/InBuffer.cpp @@ -74,7 +74,10 @@ bool CInBuffer::ReadBlock() Byte CInBuffer::ReadBlock2() { - if(!ReadBlock()) + if (!ReadBlock()) + { + _processedSize++; return 0xFF; + } return *_buffer++; } diff --git a/CPP/7zip/Common/InOutTempBuffer.cpp b/CPP/7zip/Common/InOutTempBuffer.cpp index 4cc0b2f2..dfe8b3d3 100755 --- a/CPP/7zip/Common/InOutTempBuffer.cpp +++ b/CPP/7zip/Common/InOutTempBuffer.cpp @@ -2,121 +2,121 @@ #include "StdAfx.h" -#include "InOutTempBuffer.h" -#include "../../Common/Defs.h" -// #include "Windows/Defs.h" +#include "../../../C/7zCrc.h" +#include "InOutTempBuffer.h" #include "StreamUtils.h" using namespace NWindows; using namespace NFile; using namespace NDirectory; -static UInt32 kTmpBufferMemorySize = (1 << 20); +static const UInt32 kTempBufSize = (1 << 20); -static LPCTSTR kTempFilePrefixString = TEXT("iot"); +static LPCTSTR kTempFilePrefixString = TEXT("7zt"); -CInOutTempBuffer::CInOutTempBuffer(): - _buffer(NULL) -{ -} +CInOutTempBuffer::CInOutTempBuffer(): _buf(NULL) { } void CInOutTempBuffer::Create() { - _buffer = new Byte[kTmpBufferMemorySize]; + if (!_buf) + _buf = new Byte[kTempBufSize]; } CInOutTempBuffer::~CInOutTempBuffer() { - delete []_buffer; + delete []_buf; } + void CInOutTempBuffer::InitWriting() { - _bufferPosition = 0; - _tmpFileCreated = false; - _fileSize = 0; + _bufPos = 0; + _tempFileCreated = false; + _size = 0; + _crc = CRC_INIT_VAL; } bool CInOutTempBuffer::WriteToFile(const void *data, UInt32 size) { if (size == 0) return true; - if(!_tmpFileCreated) + if (!_tempFileCreated) { CSysString tempDirPath; - if(!MyGetTempPath(tempDirPath)) + if (!MyGetTempPath(tempDirPath)) return false; - if (_tempFile.Create(tempDirPath, kTempFilePrefixString, _tmpFileName) == 0) + if (_tempFile.Create(tempDirPath, kTempFilePrefixString, _tempFileName) == 0) return false; - // _outFile.SetOpenCreationDispositionCreateAlways(); - if(!_outFile.Create(_tmpFileName, true)) + if (!_outFile.Create(_tempFileName, true)) return false; - _tmpFileCreated = true; + _tempFileCreated = true; } - UInt32 processedSize; - if(!_outFile.Write(data, size, processedSize)) + UInt32 processed; + if (!_outFile.Write(data, size, processed)) return false; - _fileSize += processedSize; - return (processedSize == size); -} - -bool CInOutTempBuffer::FlushWrite() -{ - return _outFile.Close(); + _crc = CrcUpdate(_crc, data, processed); + _size += processed; + return (processed == size); } bool CInOutTempBuffer::Write(const void *data, UInt32 size) { - if(_bufferPosition < kTmpBufferMemorySize) + if (_bufPos < kTempBufSize) { - UInt32 curSize = MyMin(kTmpBufferMemorySize - _bufferPosition, size); - memmove(_buffer + _bufferPosition, (const Byte *)data, curSize); - _bufferPosition += curSize; - size -= curSize; - data = ((const Byte *)data) + curSize; - _fileSize += curSize; + UInt32 cur = MyMin(kTempBufSize - _bufPos, size); + memcpy(_buf + _bufPos, data, cur); + _crc = CrcUpdate(_crc, data, cur); + _bufPos += cur; + size -= cur; + data = ((const Byte *)data) + cur; + _size += cur; } return WriteToFile(data, size); } -bool CInOutTempBuffer::InitReading() -{ - _currentPositionInBuffer = 0; - if(_tmpFileCreated) - return _inFile.Open(_tmpFileName); - return true; -} - HRESULT CInOutTempBuffer::WriteToStream(ISequentialOutStream *stream) { - if (_currentPositionInBuffer < _bufferPosition) + if (!_outFile.Close()) + return E_FAIL; + + UInt64 size = 0; + UInt32 crc = CRC_INIT_VAL; + + if (_bufPos > 0) { - UInt32 sizeToWrite = _bufferPosition - _currentPositionInBuffer; - RINOK(WriteStream(stream, _buffer + _currentPositionInBuffer, sizeToWrite)); - _currentPositionInBuffer += sizeToWrite; + RINOK(WriteStream(stream, _buf, _bufPos)); + crc = CrcUpdate(crc, _buf, _bufPos); + size += _bufPos; } - if (!_tmpFileCreated) - return true; - for (;;) + if (_tempFileCreated) { - UInt32 localProcessedSize; - if (!_inFile.ReadPart(_buffer, kTmpBufferMemorySize, localProcessedSize)) + NIO::CInFile inFile; + if (!inFile.Open(_tempFileName)) return E_FAIL; - if (localProcessedSize == 0) - return S_OK; - RINOK(WriteStream(stream, _buffer, localProcessedSize)); + while (size < _size) + { + UInt32 processed; + if (!inFile.ReadPart(_buf, kTempBufSize, processed)) + return E_FAIL; + if (processed == 0) + break; + RINOK(WriteStream(stream, _buf, processed)); + crc = CrcUpdate(crc, _buf, processed); + size += processed; + } } + return (_crc == crc && size == _size) ? S_OK : E_FAIL; } -STDMETHODIMP CSequentialOutTempBufferImp::Write(const void *data, UInt32 size, UInt32 *processedSize) +STDMETHODIMP CSequentialOutTempBufferImp::Write(const void *data, UInt32 size, UInt32 *processed) { - if (!_buffer->Write(data, size)) + if (!_buf->Write(data, size)) { - if (processedSize != NULL) - *processedSize = 0; + if (processed != NULL) + *processed = 0; return E_FAIL; } - if (processedSize != NULL) - *processedSize = size; + if (processed != NULL) + *processed = size; return S_OK; } diff --git a/CPP/7zip/Common/InOutTempBuffer.h b/CPP/7zip/Common/InOutTempBuffer.h index e1e0e971..073f95ac 100755 --- a/CPP/7zip/Common/InOutTempBuffer.h +++ b/CPP/7zip/Common/InOutTempBuffer.h @@ -1,11 +1,11 @@ -// Util/InOutTempBuffer.h +// InOutTempBuffer.h #ifndef __IN_OUT_TEMP_BUFFER_H #define __IN_OUT_TEMP_BUFFER_H -#include "../../Windows/FileIO.h" -#include "../../Windows/FileDir.h" #include "../../Common/MyCom.h" +#include "../../Windows/FileDir.h" +#include "../../Windows/FileIO.h" #include "../IStream.h" @@ -13,14 +13,12 @@ class CInOutTempBuffer { NWindows::NFile::NDirectory::CTempFile _tempFile; NWindows::NFile::NIO::COutFile _outFile; - NWindows::NFile::NIO::CInFile _inFile; - Byte *_buffer; - UInt32 _bufferPosition; - UInt32 _currentPositionInBuffer; - CSysString _tmpFileName; - bool _tmpFileCreated; - - UInt64 _fileSize; + Byte *_buf; + UInt32 _bufPos; + CSysString _tempFileName; + bool _tempFileCreated; + UInt64 _size; + UInt32 _crc; bool WriteToFile(const void *data, UInt32 size); public: @@ -30,23 +28,18 @@ public: void InitWriting(); bool Write(const void *data, UInt32 size); - UInt64 GetDataSize() const { return _fileSize; } - bool FlushWrite(); - bool InitReading(); + HRESULT WriteToStream(ISequentialOutStream *stream); + UInt64 GetDataSize() const { return _size; } }; class CSequentialOutTempBufferImp: public ISequentialOutStream, public CMyUnknownImp { - CInOutTempBuffer *_buffer; + CInOutTempBuffer *_buf; public: - // CSequentialOutStreamImp(): _size(0) {} - // UInt32 _size; - void Init(CInOutTempBuffer *buffer) { _buffer = buffer; } - // UInt32 GetSize() const { return _size; } - + void Init(CInOutTempBuffer *buffer) { _buf = buffer; } MY_UNKNOWN_IMP STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); diff --git a/CPP/7zip/Common/StreamObjects.cpp b/CPP/7zip/Common/StreamObjects.cpp index e043e565..2237b930 100755 --- a/CPP/7zip/Common/StreamObjects.cpp +++ b/CPP/7zip/Common/StreamObjects.cpp @@ -3,21 +3,37 @@ #include "StdAfx.h" #include "StreamObjects.h" -#include "../../Common/Defs.h" - -STDMETHODIMP CSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize) +STDMETHODIMP CBufInStream::Read(void *data, UInt32 size, UInt32 *processedSize) { - size_t rem = _size - _pos; + if (processedSize != NULL) + *processedSize = 0; + if (_pos > _size) + return E_FAIL; + size_t rem = _size - (size_t)_pos; if (size < rem) rem = (size_t)size; - memcpy(data, _dataPointer + _pos, rem); + memcpy(data, _data + (size_t)_pos, rem); _pos += rem; if (processedSize != NULL) *processedSize = (UInt32)rem; return S_OK; } +STDMETHODIMP CBufInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch(seekOrigin) + { + case STREAM_SEEK_SET: _pos = offset; break; + case STREAM_SEEK_CUR: _pos += offset; break; + case STREAM_SEEK_END: _pos = _size + offset; break; + default: return STG_E_INVALIDFUNCTION; + } + if (newPosition) + *newPosition = _pos; + return S_OK; +} + void CWriteBuffer::Write(const void *data, size_t size) { diff --git a/CPP/7zip/Common/StreamObjects.h b/CPP/7zip/Common/StreamObjects.h index a21089cb..e94513ee 100755 --- a/CPP/7zip/Common/StreamObjects.h +++ b/CPP/7zip/Common/StreamObjects.h @@ -1,34 +1,44 @@ // StreamObjects.h -#ifndef __STREAMOBJECTS_H -#define __STREAMOBJECTS_H +#ifndef __STREAM_OBJECTS_H +#define __STREAM_OBJECTS_H #include "../../Common/DynamicBuffer.h" #include "../../Common/MyCom.h" #include "../IStream.h" -class CSequentialInStreamImp: - public ISequentialInStream, +struct CReferenceBuf: + public IUnknown, public CMyUnknownImp { - const Byte *_dataPointer; - size_t _size; - size_t _pos; + CByteBuffer Buf; + MY_UNKNOWN_IMP +}; +class CBufInStream: + public IInStream, + public CMyUnknownImp +{ + const Byte *_data; + UInt64 _pos; + size_t _size; + CMyComPtr<IUnknown> _ref; public: - void Init(const Byte *dataPointer, size_t size) + void Init(const Byte *data, size_t size, IUnknown *ref = 0) { - _dataPointer = dataPointer; + _data = data; _size = size; _pos = 0; + _ref = ref; } + void Init(CReferenceBuf *ref) { Init(ref->Buf, ref->Buf.GetCapacity(), ref); } - MY_UNKNOWN_IMP + MY_UNKNOWN_IMP1(IInStream) STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); }; - class CWriteBuffer { CByteDynamicBuffer _buffer; diff --git a/CPP/7zip/Compress/BZip2Decoder.cpp b/CPP/7zip/Compress/BZip2Decoder.cpp index ef896f6a..76a7187b 100755 --- a/CPP/7zip/Compress/BZip2Decoder.cpp +++ b/CPP/7zip/Compress/BZip2Decoder.cpp @@ -584,12 +584,7 @@ HRESULT CDecoder::DecodeFile(bool &isBZ, ICompressProgressInfo *progress) CState &state = m_States[0]; for (;;) { - if (progress) - { - UInt64 packSize = m_InStream.GetProcessedSize(); - UInt64 unpackSize = m_OutStream.GetProcessedSize(); - RINOK(progress->SetRatioInfo(&packSize, &unpackSize)); - } + RINOK(SetRatioProgress(m_InStream.GetProcessedSize())); bool wasFinished; UInt32 crc; RINOK(ReadSignatures(wasFinished, crc)); @@ -608,7 +603,7 @@ HRESULT CDecoder::DecodeFile(bool &isBZ, ICompressProgressInfo *progress) return S_FALSE; } } - return S_OK; + return SetRatioProgress(m_InStream.GetProcessedSize()); } HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, @@ -766,16 +761,9 @@ void CState::ThreadFunc() if (!needFinish) { if ((randMode ? - DecodeBlock2Rand(Counters + 256, blockSize, origPtr, Decoder->m_OutStream) : - DecodeBlock2(Counters + 256, blockSize, origPtr, Decoder->m_OutStream)) == crc) - { - if (Decoder->Progress) - { - UInt64 inSize = packSize - Decoder->_inStart; - UInt64 unpackSize = Decoder->m_OutStream.GetProcessedSize(); - res = Decoder->Progress->SetRatioInfo(&inSize, &unpackSize); - } - } + DecodeBlock2Rand(Counters + 256, blockSize, origPtr, Decoder->m_OutStream) : + DecodeBlock2(Counters + 256, blockSize, origPtr, Decoder->m_OutStream)) == crc) + res = Decoder->SetRatioProgress(packSize); else res = S_FALSE; } @@ -808,4 +796,13 @@ STDMETHODIMP CDecoder::SetNumberOfThreads(UInt32 numThreads) } #endif +HRESULT CDecoder::SetRatioProgress(UInt64 packSize) +{ + if (!Progress) + return S_OK; + packSize -= _inStart; + UInt64 unpackSize = m_OutStream.GetProcessedSize(); + return Progress->SetRatioInfo(&packSize, &unpackSize); +} + }} diff --git a/CPP/7zip/Compress/BZip2Decoder.h b/CPP/7zip/Compress/BZip2Decoder.h index ea06449e..39520ee3 100755 --- a/CPP/7zip/Compress/BZip2Decoder.h +++ b/CPP/7zip/Compress/BZip2Decoder.h @@ -134,9 +134,9 @@ public: CDecoder(); + HRESULT SetRatioProgress(UInt64 packSize); HRESULT ReadSignatures(bool &wasFinished, UInt32 &crc); - HRESULT Flush() { return m_OutStream.Flush(); } void ReleaseStreams(bool releaseInStream) { diff --git a/CPP/7zip/Compress/Bcj2Coder.cpp b/CPP/7zip/Compress/Bcj2Coder.cpp index 13ce5160..7d93155a 100755 --- a/CPP/7zip/Compress/Bcj2Coder.cpp +++ b/CPP/7zip/Compress/Bcj2Coder.cpp @@ -24,11 +24,11 @@ static bool inline Test86MSByte(Byte b) bool CEncoder::Create() { - if (!_mainStream.Create(1 << 16)) + if (!_mainStream.Create(1 << 18)) return false; - if (!_callStream.Create(1 << 20)) + if (!_callStream.Create(1 << 18)) return false; - if (!_jumpStream.Create(1 << 20)) + if (!_jumpStream.Create(1 << 18)) return false; if (!_rangeEncoder.Create(1 << 20)) return false; diff --git a/CPP/7zip/Compress/DeflateDecoder.cpp b/CPP/7zip/Compress/DeflateDecoder.cpp index cf4a5105..2848cd81 100755 --- a/CPP/7zip/Compress/DeflateDecoder.cpp +++ b/CPP/7zip/Compress/DeflateDecoder.cpp @@ -250,7 +250,7 @@ HRESULT CCoder::CodeReal(ISequentialOutStream *outStream, m_OutWindowStream.SetStream(outStream); CCoderReleaser flusher(this); - const UInt64 inStart = m_InBitStream.GetProcessedSize(); + const UInt64 inStart = _needInitInStream ? 0 : m_InBitStream.GetProcessedSize(); const UInt64 start = m_OutWindowStream.GetProcessedSize(); for (;;) { diff --git a/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp b/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp index 9b005efb..6c31e3ea 100755 --- a/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp +++ b/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp @@ -44,7 +44,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\\" /D "NDEBUG" /D "_MBCS" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /FAcs /Yu"StdAfx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "_MBCS" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /FAcs /Yu"StdAfx.h" /FD /c # ADD BASE RSC /l 0x419 /d "NDEBUG" # ADD RSC /l 0x419 /d "NDEBUG" BSC32=bscmake.exe @@ -69,7 +69,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\..\\" /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /Yu"StdAfx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /Yu"StdAfx.h" /FD /GZ /c # ADD BASE RSC /l 0x419 /d "_DEBUG" # ADD RSC /l 0x419 /d "_DEBUG" BSC32=bscmake.exe @@ -94,7 +94,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "EXCLUDE_COM" /D "NO_REGISTRY" /D "FORMAT_7Z" /D "FORMAT_BZIP2" /D "FORMAT_ZIP" /D "FORMAT_TAR" /D "FORMAT_GZIP" /D "COMPRESS_LZMA" /D "COMPRESS_BCJ_X86" /D "COMPRESS_BCJ2" /D "COMPRESS_COPY" /D "COMPRESS_MF_PAT" /D "COMPRESS_MF_BT" /D "COMPRESS_PPMD" /D "COMPRESS_DEFLATE" /D "COMPRESS_IMPLODE" /D "COMPRESS_BZIP2" /D "CRYPTO_ZIP" /Yu"StdAfx.h" /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\\" /D "NDEBUG" /D "UNICODE" /D "_UNICODE" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /Yu"StdAfx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "UNICODE" /D "_UNICODE" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /Yu"StdAfx.h" /FD /c # ADD BASE RSC /l 0x419 /d "NDEBUG" # ADD RSC /l 0x419 /d "NDEBUG" BSC32=bscmake.exe @@ -121,7 +121,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "EXCLUDE_COM" /D "NO_REGISTRY" /D "FORMAT_7Z" /D "FORMAT_BZIP2" /D "FORMAT_ZIP" /D "FORMAT_TAR" /D "FORMAT_GZIP" /D "COMPRESS_LZMA" /D "COMPRESS_BCJ_X86" /D "COMPRESS_BCJ2" /D "COMPRESS_COPY" /D "COMPRESS_MF_PAT" /D "COMPRESS_MF_BT" /D "COMPRESS_PPMD" /D "COMPRESS_DEFLATE" /D "COMPRESS_IMPLODE" /D "COMPRESS_BZIP2" /D "CRYPTO_ZIP" /D "_MBCS" /Yu"StdAfx.h" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\\" /D "_DEBUG" /D "_UNICODE" /D "UNICODE" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /Yu"StdAfx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "_UNICODE" /D "UNICODE" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /Yu"StdAfx.h" /FD /GZ /c # ADD BASE RSC /l 0x419 /d "_DEBUG" # ADD RSC /l 0x419 /d "_DEBUG" BSC32=bscmake.exe @@ -342,24 +342,6 @@ SOURCE=..\..\Common\StreamUtils.h # Begin Group "LzmaUtil" # PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\..\C\LzmaUtil\Lzma86Dec.c -# SUBTRACT CPP /YX /Yc /Yu -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\C\LzmaUtil\Lzma86Dec.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\C\LzmaUtil\Lzma86Enc.c -# SUBTRACT CPP /YX /Yc /Yu -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\C\LzmaUtil\Lzma86Enc.h -# End Source File # End Group # Begin Source File @@ -412,6 +394,20 @@ SOURCE=..\..\..\..\C\LzHash.h # End Source File # Begin Source File +SOURCE=..\..\..\..\C\Lzma86.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Lzma86Dec.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Lzma86Enc.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + SOURCE=..\..\..\..\C\LzmaDec.c # SUBTRACT CPP /YX /Yc /Yu # End Source File diff --git a/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp b/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp index 3d8e475f..90476378 100755 --- a/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp +++ b/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp @@ -7,7 +7,7 @@ #include <stdio.h> -#if defined(_WIN32) || defined(OS2) || defined(MSDOS) +#if (defined(_WIN32) || defined(OS2) || defined(MSDOS)) && !defined(UNDER_CE) #include <fcntl.h> #include <io.h> #define MY_SET_BINARY_MODE(file) _setmode(_fileno(file), O_BINARY) @@ -19,6 +19,8 @@ #include "../../../Common/StringConvert.h" #include "../../../Common/StringToInt.h" +#include "../../../Windows/NtCheck.h" + #include "../../Common/FileStreams.h" #include "../../Common/StreamUtils.h" @@ -33,23 +35,10 @@ #include "../../../../C/7zVersion.h" #include "../../../../C/Alloc.h" -#include "../../../../C/LzmaUtil/Lzma86Dec.h" -#include "../../../../C/LzmaUtil/Lzma86Enc.h" +#include "../../../../C/Lzma86.h" using namespace NCommandLineParser; -#ifdef _WIN32 -bool g_IsNT = false; -static inline bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} -#endif - static const char *kCantAllocate = "Can not allocate memory"; static const char *kReadError = "Read error"; static const char *kWriteError = "Write error"; @@ -96,9 +85,14 @@ static const CSwitchForm kSwitchForms[] = static const int kNumSwitches = sizeof(kSwitchForms) / sizeof(kSwitchForms[0]); +static void PrintMessage(const char *s) +{ + fprintf(stderr, s); +} + static void PrintHelp() { - fprintf(stderr, "\nUsage: LZMA <e|d> inputFile outputFile [<switches>...]\n" + PrintMessage("\nUsage: LZMA <e|d> inputFile outputFile [<switches>...]\n" " e: encode file\n" " d: decode file\n" " b: Benchmark\n" @@ -130,11 +124,10 @@ static void IncorrectCommand() PrintHelpAndExit("Incorrect command"); } -static void WriteArgumentsToStringList(int numArguments, const char *arguments[], - UStringVector &strings) +static void WriteArgumentsToStringList(int numArgs, const char *args[], UStringVector &strings) { - for(int i = 1; i < numArguments; i++) - strings.Add(MultiByteToUnicodeString(arguments[i])); + for (int i = 1; i < numArgs; i++) + strings.Add(MultiByteToUnicodeString(args[i])); } static bool GetNumber(const wchar_t *s, UInt32 &value) @@ -159,15 +152,15 @@ static void ParseUInt32(const CParser &parser, int index, UInt32 &res) IncorrectCommand(); } -int main2(int n, const char *args[]) +#define NT_CHECK_FAIL_ACTION PrintMessage("Unsupported Windows version"); return 1; + +int main2(int numArgs, const char *args[]) { - #ifdef _WIN32 - g_IsNT = IsItWindowsNT(); - #endif + NT_CHECK - fprintf(stderr, "\nLZMA " MY_VERSION_COPYRIGHT_DATE "\n"); + PrintMessage("\nLZMA " MY_VERSION_COPYRIGHT_DATE "\n"); - if (n == 1) + if (numArgs == 1) { PrintHelp(); return 0; @@ -176,12 +169,12 @@ int main2(int n, const char *args[]) bool unsupportedTypes = (sizeof(Byte) != 1 || sizeof(UInt32) < 4 || sizeof(UInt64) < 4); if (unsupportedTypes) { - fprintf(stderr, "Unsupported base types. Edit Common/Types.h and recompile"); + PrintMessage("Unsupported base types. Edit Common/Types.h and recompile"); return 1; } UStringVector commandStrings; - WriteArgumentsToStringList(n, args, commandStrings); + WriteArgumentsToStringList(numArgs, args, commandStrings); CParser parser(kNumSwitches); try { @@ -461,14 +454,14 @@ int main2(int n, const char *args[]) Byte b = Byte(fileSize >> (8 * i)); if (outStream->Write(&b, 1, 0) != S_OK) { - fprintf(stderr, kWriteError); + PrintMessage(kWriteError); return 1; } } HRESULT result = encoder->Code(inStream, outStream, 0, 0, 0); if (result == E_OUTOFMEMORY) { - fprintf(stderr, "\nError: Can not allocate memory\n"); + PrintMessage("\nError: Can not allocate memory\n"); return 1; } else if (result != S_OK) @@ -486,12 +479,12 @@ int main2(int n, const char *args[]) Byte header[kPropertiesSize + 8]; if (ReadStream_FALSE(inStream, header, kPropertiesSize + 8) != S_OK) { - fprintf(stderr, kReadError); + PrintMessage(kReadError); return 1; } if (decoderSpec->SetDecoderProperties2(header, kPropertiesSize) != S_OK) { - fprintf(stderr, "SetDecoderProperties error"); + PrintMessage("SetDecoderProperties error"); return 1; } fileSize = 0; @@ -500,7 +493,7 @@ int main2(int n, const char *args[]) if (decoder->Code(inStream, outStream, 0, (fileSize == (UInt64)(Int64)-1) ? 0 : &fileSize, 0) != S_OK) { - fprintf(stderr, "Decoder error"); + PrintMessage("Decoder error"); return 1; } } @@ -508,16 +501,16 @@ int main2(int n, const char *args[]) { if (outStreamSpec->Close() != S_OK) { - fprintf(stderr, "File closing error"); + PrintMessage("File closing error"); return 1; } } return 0; } -int MY_CDECL main(int n, const char *args[]) +int MY_CDECL main(int numArgs, const char *args[]) { - try { return main2(n, args); } + try { return main2(numArgs, args); } catch(const char *s) { fprintf(stderr, "\nError: %s\n", s); @@ -525,7 +518,7 @@ int MY_CDECL main(int n, const char *args[]) } catch(...) { - fprintf(stderr, "\nError\n"); + PrintMessage("\nError\n"); return 1; } } diff --git a/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp b/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp index 6a325fe0..d115ed23 100755 --- a/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp +++ b/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp @@ -46,7 +46,20 @@ #include "../LzmaEncoder.h" #endif -static const UInt32 kUncompressMinBlockSize = 1 << 26; +static const UInt32 kUncompressMinBlockSize = +#ifdef UNDER_CE +1 << 24; +#else +1 << 26; +#endif + +static const UInt32 kCrcBlockSize = +#ifdef UNDER_CE +1 << 25; +#else +1 << 30; +#endif + static const UInt32 kAdditionalSize = (1 << 16); static const UInt32 kCompressedAdditionalSize = (1 << 10); static const UInt32 kMaxLzmaPropSize = 5; @@ -273,13 +286,20 @@ static UInt64 GetFreq() #ifndef USE_POSIX_TIME static inline UInt64 GetTime64(const FILETIME &t) { return ((UInt64)t.dwHighDateTime << 32) | t.dwLowDateTime; } #endif + static UInt64 GetUserTime() { #ifdef USE_POSIX_TIME return clock(); #else FILETIME creationTime, exitTime, kernelTime, userTime; - if (::GetProcessTimes(::GetCurrentProcess(), &creationTime, &exitTime, &kernelTime, &userTime) != 0) + if ( + #ifdef UNDER_CE + ::GetThreadTimes(::GetCurrentThread() + #else + ::GetProcessTimes(::GetCurrentProcess() + #endif + , &creationTime, &exitTime, &kernelTime, &userTime) != 0) return GetTime64(userTime) + GetTime64(kernelTime); return (UInt64)GetTickCount() * 10000; #endif @@ -332,7 +352,7 @@ public: STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); }; -void SetStartTime(CBenchInfo &bi) +static void SetStartTime(CBenchInfo &bi) { bi.GlobalFreq = GetFreq(); bi.UserFreq = GetUserFreq(); @@ -340,7 +360,7 @@ void SetStartTime(CBenchInfo &bi) bi.UserTime = ::GetUserTime(); } -void SetFinishTime(const CBenchInfo &biStart, CBenchInfo &dest) +static void SetFinishTime(const CBenchInfo &biStart, CBenchInfo &dest) { dest.GlobalFreq = GetFreq(); dest.UserFreq = GetUserFreq(); @@ -820,6 +840,18 @@ HRESULT LzmaBench( #endif RINOK(status.Res); SetFinishTime(encoders[0].progressInfoSpec[0]->BenchInfo, info); + #ifdef BENCH_MT + #ifdef UNDER_CE + if (numDecoderThreads > 1) + for (i = 0; i < numEncoderThreads; i++) + for (UInt32 j = 0; j < numSubDecoderThreads; j++) + { + FILETIME creationTime, exitTime, kernelTime, userTime; + if (::GetThreadTimes(encoders[i].thread[j], &creationTime, &exitTime, &kernelTime, &userTime) != 0) + info.UserTime += GetTime64(userTime) + GetTime64(kernelTime); + } + #endif + #endif info.UnpackSize = 0; info.PackSize = 0; info.NumIterations = numSubDecoderThreads * encoders[0].NumIterations; @@ -969,7 +1001,7 @@ HRESULT CrcBench(UInt32 numThreads, UInt32 bufferSize, UInt64 &speed) Byte *buf = buffer.Buffer; CBaseRandomGenerator RG; - UInt32 numCycles = ((UInt32)1 << 30) / ((bufferSize >> 2) + 1) + 1; + UInt32 numCycles = (kCrcBlockSize) / ((bufferSize >> 2) + 1) + 1; UInt64 timeVal; #ifdef BENCH_MT diff --git a/CPP/7zip/Compress/LZMA_Alone/makefile b/CPP/7zip/Compress/LZMA_Alone/makefile index f6d94081..197b0ee6 100755 --- a/CPP/7zip/Compress/LZMA_Alone/makefile +++ b/CPP/7zip/Compress/LZMA_Alone/makefile @@ -1,5 +1,5 @@ PROG = lzma.exe -LIBS = $(LIBS) user32.lib +MY_CONSOLE = 1 CFLAGS = $(CFLAGS) \ -DCOMPRESS_MF_MT \ -DBENCH_MT \ @@ -37,14 +37,12 @@ C_OBJS = \ $O\Bra86.obj \ $O\LzFind.obj \ $O\LzFindMt.obj \ + $O\Lzma86Dec.obj \ + $O\Lzma86Enc.obj \ $O\LzmaDec.obj \ $O\LzmaEnc.obj \ $O\Threads.obj \ -C_LZMAUTIL_OBJS = \ - $O\Lzma86Dec.obj \ - $O\Lzma86Enc.obj \ - OBJS = \ $O\StdAfx.obj \ $(LZMA_OBJS) \ @@ -53,7 +51,6 @@ OBJS = \ $(WIN_OBJS) \ $(7ZIP_COMMON_OBJS) \ $(C_OBJS) \ - $(C_LZMAUTIL_OBJS) \ $O\FileStreams.obj \ $O\FileIO.obj \ @@ -76,5 +73,3 @@ $O\FileIO.obj: ../../../Windows/FileIO.cpp $(COMPL) $(C_OBJS): ../../../../C/$(*B).c $(COMPL_O2) -$(C_LZMAUTIL_OBJS): ../../../../C/LzmaUtil/$(*B).c - $(COMPL_O2) diff --git a/CPP/7zip/Compress/LZMA_Alone/makefile.gcc b/CPP/7zip/Compress/LZMA_Alone/makefile.gcc index 8d534372..288ed33a 100755 --- a/CPP/7zip/Compress/LZMA_Alone/makefile.gcc +++ b/CPP/7zip/Compress/LZMA_Alone/makefile.gcc @@ -24,6 +24,7 @@ OBJS = \ LzmaBenchCon.o \ LzmaDecoder.o \ LzmaEncoder.o \ + CWrappers.o \ InBuffer.o \ OutBuffer.o \ FileStreams.o \ @@ -66,6 +67,9 @@ LzmaDecoder.o: ../LzmaDecoder.cpp LzmaEncoder.o: ../LzmaEncoder.cpp $(CXX) $(CFLAGS) ../LzmaEncoder.cpp +CWrappers.o: ../../Common/CWrappers.cpp + $(CXX) $(CFLAGS) ../../Common/CWrappers.cpp + InBuffer.o: ../../Common/InBuffer.cpp $(CXX) $(CFLAGS) ../../Common/InBuffer.cpp @@ -124,11 +128,11 @@ LzmaDec.o: ../../../../C/LzmaDec.c LzmaEnc.o: ../../../../C/LzmaEnc.c $(CXX_C) $(CFLAGS) ../../../../C/LzmaEnc.c -Lzma86Dec.o: ../../../../C/LzmaUtil/Lzma86Dec.c - $(CXX_C) $(CFLAGS) ../../../../C/LzmaUtil/Lzma86Dec.c +Lzma86Dec.o: ../../../../C/Lzma86Dec.c + $(CXX_C) $(CFLAGS) ../../../../C/Lzma86Dec.c -Lzma86Enc.o: ../../../../C/LzmaUtil/Lzma86Enc.c - $(CXX_C) $(CFLAGS) ../../../../C/LzmaUtil/Lzma86Enc.c +Lzma86Enc.o: ../../../../C/Lzma86Enc.c + $(CXX_C) $(CFLAGS) ../../../../C/Lzma86Enc.c clean: -$(RM) $(PROG) $(OBJS) diff --git a/CPP/7zip/Compress/Mtf8.h b/CPP/7zip/Compress/Mtf8.h index 7a6b7fe6..d15dd4a5 100755 --- a/CPP/7zip/Compress/Mtf8.h +++ b/CPP/7zip/Compress/Mtf8.h @@ -3,6 +3,8 @@ #ifndef __COMPRESS_MTF8_H #define __COMPRESS_MTF8_H +#include "../../../C/CpuArch.h" + #include "../../Common/Types.h" namespace NCompress { @@ -63,11 +65,7 @@ struct CMtf8Decoder }; */ -#ifdef _WIN64 -#define MODE_64BIT -#endif - -#ifdef MODE_64BIT +#ifdef MY_CPU_64BIT typedef UInt64 CMtfVar; #define MTF_MOVS 3 #else @@ -102,12 +100,11 @@ struct CMtf8Decoder } for (; i < lim; i += 2) { - CMtfVar next = Buf[i]; - Buf[i] = (next << 8) | prev; - prev = (next >> (MTF_MASK << 3)); - next = Buf[i + 1]; - Buf[i + 1] = (next << 8) | prev; - prev = (next >> (MTF_MASK << 3)); + CMtfVar n0 = Buf[i]; + CMtfVar n1 = Buf[i + 1]; + Buf[i ] = (n0 << 8) | prev; + Buf[i + 1] = (n1 << 8) | (n0 >> (MTF_MASK << 3)); + prev = (n1 >> (MTF_MASK << 3)); } CMtfVar next = Buf[i]; CMtfVar mask = (((CMtfVar)0x100 << pos) - 1); diff --git a/CPP/7zip/Compress/ZlibDecoder.cpp b/CPP/7zip/Compress/ZlibDecoder.cpp index a1bac27b..90d6715d 100755 --- a/CPP/7zip/Compress/ZlibDecoder.cpp +++ b/CPP/7zip/Compress/ZlibDecoder.cpp @@ -4,20 +4,18 @@ #include "../Common/StreamUtils.h" -#include "DeflateDecoder.h" #include "ZlibDecoder.h" namespace NCompress { namespace NZlib { #define DEFLATE_TRY_BEGIN try { -#define DEFLATE_TRY_END } \ - catch(...) { return S_FALSE; } +#define DEFLATE_TRY_END } catch(...) { return S_FALSE; } #define ADLER_MOD 65521 #define ADLER_LOOP_MAX 5550 -static UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size) +UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size) { UInt32 a = adler & 0xFFFF; UInt32 b = (adler >> 16) & 0xFFFF; @@ -52,13 +50,10 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream { DEFLATE_TRY_BEGIN if (!AdlerStream) - { - AdlerSpec = new COutStreamWithAdler; - AdlerStream = AdlerSpec; - } + AdlerStream = AdlerSpec = new COutStreamWithAdler; if (!DeflateDecoder) { - DeflateDecoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder; + DeflateDecoderSpec = new NDeflate::NDecoder::CCOMCoder; DeflateDecoderSpec->ZlibMode = true; DeflateDecoder = DeflateDecoderSpec; } diff --git a/CPP/7zip/Compress/ZlibDecoder.h b/CPP/7zip/Compress/ZlibDecoder.h index 906e241b..95c11002 100755 --- a/CPP/7zip/Compress/ZlibDecoder.h +++ b/CPP/7zip/Compress/ZlibDecoder.h @@ -38,6 +38,8 @@ public: STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + UInt64 GetInputProcessedSize() const { return DeflateDecoderSpec->GetInputProcessedSize() + 2; } + MY_UNKNOWN_IMP }; diff --git a/CPP/7zip/Compress/ZlibEncoder.cpp b/CPP/7zip/Compress/ZlibEncoder.cpp new file mode 100755 index 00000000..09235c33 --- /dev/null +++ b/CPP/7zip/Compress/ZlibEncoder.cpp @@ -0,0 +1,61 @@ +// ZlibEncoder.cpp + +#include "StdAfx.h" + +#include "../Common/StreamUtils.h" + +#include "ZlibEncoder.h" + +namespace NCompress { +namespace NZlib { + +#define DEFLATE_TRY_BEGIN try { +#define DEFLATE_TRY_END } catch(...) { return S_FALSE; } + +UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size); + +STDMETHODIMP CInStreamWithAdler::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + HRESULT result = _stream->Read(data, size, &size); + _adler = Adler32_Update(_adler, (const Byte *)data, size); + _size += size; + if (processedSize != NULL) + *processedSize = size; + return result; +} + +void CEncoder::Create() +{ + if (!DeflateEncoder) + DeflateEncoder = DeflateEncoderSpec = new NDeflate::NEncoder::CCOMCoder; +} + +STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 * /* outSize */, ICompressProgressInfo *progress) +{ + DEFLATE_TRY_BEGIN + if (!AdlerStream) + AdlerStream = AdlerSpec = new CInStreamWithAdler; + Create(); + + { + Byte buf[2] = { 0x78, 0xDA }; + RINOK(WriteStream(outStream, buf, 2)); + } + + AdlerSpec->SetStream(inStream); + AdlerSpec->Init(); + HRESULT res = DeflateEncoder->Code(AdlerStream, outStream, inSize, NULL, progress); + AdlerSpec->ReleaseStream(); + + RINOK(res); + + { + UInt32 a = AdlerSpec->GetAdler(); + Byte buf[4] = { (Byte)(a >> 24), (Byte)(a >> 16), (Byte)(a >> 8), (Byte)(a) }; + return WriteStream(outStream, buf, 4); + } + DEFLATE_TRY_END +} + +}} diff --git a/CPP/7zip/Compress/ZlibEncoder.h b/CPP/7zip/Compress/ZlibEncoder.h new file mode 100755 index 00000000..621cc1d0 --- /dev/null +++ b/CPP/7zip/Compress/ZlibEncoder.h @@ -0,0 +1,48 @@ +// ZlibEncoder.h + +#ifndef __ZLIB_ENCODER_H +#define __ZLIB_ENCODER_H + +#include "DeflateEncoder.h" + +namespace NCompress { +namespace NZlib { + +class CInStreamWithAdler: + public ISequentialInStream, + public CMyUnknownImp +{ + CMyComPtr<ISequentialInStream> _stream; + UInt32 _adler; + UInt64 _size; +public: + MY_UNKNOWN_IMP + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + void SetStream(ISequentialInStream *stream) { _stream = stream; } + void ReleaseStream() { _stream.Release(); } + void Init() { _adler = 1; _size = 0; } // ADLER_INIT_VAL + UInt32 GetAdler() const { return _adler; } + UInt64 GetSize() const { return _size; } +}; + +class CEncoder: + public ICompressCoder, + public CMyUnknownImp +{ + CInStreamWithAdler *AdlerSpec; + CMyComPtr<ISequentialInStream> AdlerStream; + CMyComPtr<ICompressCoder> DeflateEncoder; +public: + NCompress::NDeflate::NEncoder::CCOMCoder *DeflateEncoderSpec; + + void Create(); + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + UInt64 GetInputProcessedSize() const { return AdlerSpec->GetSize(); } + + MY_UNKNOWN_IMP +}; + +}} + +#endif diff --git a/CPP/7zip/Compress/makefile b/CPP/7zip/Compress/makefile index 7c1387c8..e981319d 100755 --- a/CPP/7zip/Compress/makefile +++ b/CPP/7zip/Compress/makefile @@ -1,12 +1,5 @@ DIRS = \ - Branch\~ \ - ByteSwap\~ \ - BZip2\~ \ - Copy\~ \ - Deflate\~ \ - LZMA\~ \ - PPMD\~ \ - Rar\~ \ + LZMA_Alone\~ \ all: $(DIRS) diff --git a/CPP/7zip/Crc.mak b/CPP/7zip/Crc.mak index 99c370b8..872fb378 100755 --- a/CPP/7zip/Crc.mak +++ b/CPP/7zip/Crc.mak @@ -1,11 +1,11 @@ -!IF "$(CPU)" != "IA64" -!IF "$(CPU)" != "AMD64" +!IFNDEF CPU $O\7zCrcT8U.obj: ../../../../Asm/x86/$(*B).asm $(COMPL_ASM) -!ELSE +$O\7zCrcT8.obj: ../../../../C/$(*B).c + $(COMPL_O2) +!ELSE IF "$(CPU)" == "AMD64" $O\7zCrcT8U.obj: ../../../../Asm/x64/$(*B).asm $(COMPL_ASM) -!ENDIF $O\7zCrcT8.obj: ../../../../C/$(*B).c $(COMPL_O2) !ELSE diff --git a/CPP/7zip/Crc2.mak b/CPP/7zip/Crc2.mak index 44d264f7..c257a077 100755 --- a/CPP/7zip/Crc2.mak +++ b/CPP/7zip/Crc2.mak @@ -1,5 +1,5 @@ CRC_OBJS = \ -!IF "$(CPU)" != "IA64" +!IF "$(CPU)" != "IA64" && "$(CPU)" != "ARM" $O\7zCrcT8U.obj \ $O\7zCrcT8.obj \ !ELSE diff --git a/CPP/7zip/Crypto/ZipStrong.cpp b/CPP/7zip/Crypto/ZipStrong.cpp index b29a3ad4..be5b4275 100755 --- a/CPP/7zip/Crypto/ZipStrong.cpp +++ b/CPP/7zip/Crypto/ZipStrong.cpp @@ -7,7 +7,7 @@ #include "../Common/StreamUtils.h" -#include "MyAES.h" +#include "MyAes.h" #include "Sha1.h" #include "ZipStrong.h" diff --git a/CPP/7zip/GuiCommon.rc b/CPP/7zip/GuiCommon.rc index 66dc5ca6..736f94da 100755 --- a/CPP/7zip/GuiCommon.rc +++ b/CPP/7zip/GuiCommon.rc @@ -2,36 +2,69 @@ #include <WinUser.h> #include <CommCtrl.h> -#define marg 7 -#undef bXSize -#undef bYSize -#define bXSize 64 -#define bYSize 14 -#define bDotsSize 20 - LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#undef xSize2 -#undef ySize2 -#undef xSize -#undef ySize -#undef bXPos -#undef bYPos -#undef b1XPos -#undef b1YPos -#undef b2XPos -#undef b2YPos -#undef b3XPos -#undef b3YPos -#undef gPos -#undef gPos2 +#undef m +#undef bxs +#undef bys +#undef bxsDots +#undef y +#undef xc +#undef yc +#undef xs +#undef ys +#undef bx +#undef bx1 +#undef bx2 +#undef bx3 +#undef by +#undef by1 +#undef by2 +#undef by3 #undef gSpace #undef gSize #undef marg2 #undef marg3 +#define m 8 +#define bxs 64 +#define bys 16 +#define bxsDots 20 + +#define xs (xc + m + m) +#define ys (yc + m + m) + +#define bx1 (xs - m - bxs) +#define bx2 (bx1 - m - bxs) +#define bx3 (bx2 - m - bxs) +#define bx bx1 + +#define by1 (ys - m - bys) +#define by2 (by1 - m - bys) +#define by by1 + + +#define MY_MODAL_DIALOG_STYLE STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU + +#define MY_MODAL_RESIZE_DIALOG_STYLE MY_MODAL_DIALOG_STYLE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SIZEBOX | WS_THICKFRAME + +#define MY_PAGE_STYLE STYLE WS_CHILD | WS_DISABLED | WS_CAPTION + +#define MY_FONT FONT 8, "MS Shell Dlg" + +#define SMALL_PAGE_SIZE_X 120 + +#define MY_DIALOG DIALOG 0, 0, xs, ys MY_MODAL_DIALOG_STYLE MY_FONT +#define MY_RESIZE_DIALOG DIALOG 0, 0, xs, ys MY_MODAL_RESIZE_DIALOG_STYLE MY_FONT +#define MY_PAGE DIALOG 0, 0, xs, ys MY_PAGE_STYLE MY_FONT + +#define OK_CANCEL \ + DEFPUSHBUTTON "OK", IDOK, bx2, by, bxs, bys \ + PUSHBUTTON "Cancel", IDCANCEL, bx1, by, bxs, bys + -#define MY_MODAL_DIALOG_STYLE STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -#define MY_PAGE_STYLE STYLE DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +#define MY_COMBO CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +#define MY_COMBO_SORTED MY_COMBO | CBS_SORT +#define MY_COMBO_WITH_EDIT CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP -#define MY_FONT FONT 8, "MS Shell Dlg" +#define MY_CHECKBOX "Button", BS_AUTOCHECKBOX | WS_TABSTOP diff --git a/CPP/7zip/Guid.txt b/CPP/7zip/Guid.txt index 25939aaa..cb4d73d9 100755 --- a/CPP/7zip/Guid.txt +++ b/CPP/7zip/Guid.txt @@ -125,6 +125,10 @@ Handler GUIDs: 0B lzma86 0C xz + D5 Mslz + D6 Flv + D7 Swf + D8 Swfc D9 Ntfs DA Fat DB Mbr diff --git a/CPP/7zip/MyVersion.h b/CPP/7zip/MyVersion.h index ad2f0242..ea5222ac 100755 --- a/CPP/7zip/MyVersion.h +++ b/CPP/7zip/MyVersion.h @@ -1,8 +1,8 @@ #define MY_VER_MAJOR 9 -#define MY_VER_MINOR 04 +#define MY_VER_MINOR 06 #define MY_VER_BUILD 0 -#define MY_VERSION "9.04 beta" -#define MY_7ZIP_VERSION "7-Zip 9.04 beta" -#define MY_DATE "2009-05-30" +#define MY_VERSION "9.06 beta" +#define MY_7ZIP_VERSION "7-Zip 9.06 beta" +#define MY_DATE "2009-08-17" #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/MyVersionInfo.rc b/CPP/7zip/MyVersionInfo.rc index c3712b16..814d7a4a 100755 --- a/CPP/7zip/MyVersionInfo.rc +++ b/CPP/7zip/MyVersionInfo.rc @@ -1,4 +1,11 @@ -#include <WinVer.h> +#define MY_VS_FFI_FILEFLAGSMASK 0x0000003FL +#define MY_VOS_NT_WINDOWS32 0x00040004L +#define MY_VOS_CE_WINDOWS32 0x00050004L + +#define MY_VFT_APP 0x00000001L +#define MY_VFT_DLL 0x00000002L + +// #include <WinVer.h> #include "MyVersion.h" #define MY_VER MY_VER_MAJOR,MY_VER_MINOR,MY_VER_BUILD,0 @@ -14,9 +21,9 @@ LANGUAGE 9, 1 \ 1 VERSIONINFO \ FILEVERSION MY_VER \ PRODUCTVERSION MY_VER \ - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK \ + FILEFLAGSMASK MY_VS_FFI_FILEFLAGSMASK \ FILEFLAGS DBG_FL \ - FILEOS VOS_NT_WINDOWS32 \ + FILEOS MY_VOS_NT_WINDOWS32 \ FILETYPE fileType \ FILESUBTYPE 0x0L \ BEGIN \ @@ -40,6 +47,6 @@ BEGIN \ END \ END -#define MY_VERSION_INFO_APP(descr, intName) MY_VERSION_INFO(VFT_APP, descr, intName, intName ".exe") +#define MY_VERSION_INFO_APP(descr, intName) MY_VERSION_INFO(MY_VFT_APP, descr, intName, intName ".exe") -#define MY_VERSION_INFO_DLL(descr, intName) MY_VERSION_INFO(VFT_DLL, descr, intName, intName ".dll") +#define MY_VERSION_INFO_DLL(descr, intName) MY_VERSION_INFO(MY_VFT_DLL, descr, intName, intName ".dll") diff --git a/CPP/7zip/UI/Agent/Agent.h b/CPP/7zip/UI/Agent/Agent.h index b95725e4..50b101f4 100755 --- a/CPP/7zip/UI/Agent/Agent.h +++ b/CPP/7zip/UI/Agent/Agent.h @@ -206,8 +206,8 @@ public: #endif const CArc &GetArc() { return _archiveLink.Arcs.Back(); } - IInArchive *GetArchive() { return GetArc().Archive; } - bool CanUpdate() const { return _archiveLink.Arcs.Size() == 1; } + IInArchive *GetArchive() { if ( _archiveLink.Arcs.IsEmpty()) return 0; return GetArc().Archive; } + bool CanUpdate() const { return _archiveLink.Arcs.Size() <= 1; } }; #ifdef NEW_FOLDER_INTERFACE diff --git a/CPP/7zip/UI/Agent/AgentOut.cpp b/CPP/7zip/UI/Agent/AgentOut.cpp index 51a5affa..5d9ae62d 100755 --- a/CPP/7zip/UI/Agent/AgentOut.cpp +++ b/CPP/7zip/UI/Agent/AgentOut.cpp @@ -5,7 +5,6 @@ #include "Common/IntToString.h" #include "Common/StringConvert.h" -#include "Windows/Defs.h" #include "Windows/FileDir.h" #include "Windows/PropVariant.h" #include "Windows/PropVariantConversions.h" @@ -16,7 +15,6 @@ #include "../../Common/FileStreams.h" #include "../Common/EnumDirItems.h" -#include "../Common/HandlerLoader.h" #include "../Common/OpenArchive.h" #include "../Common/UpdateCallback.h" #include "../Common/UpdatePair.h" @@ -208,7 +206,7 @@ STDMETHODIMP CAgent::DoOperation( if (GetArchive()) { RINOK(ReadItems()); - EnumerateArchiveItems(this, _proxyArchive->RootFolder, L"", arcItems); + EnumerateArchiveItems(this, _proxyArchive->RootFolder, L"", arcItems); } CRecordVector<CUpdatePair2> updatePairs2; diff --git a/CPP/7zip/UI/Agent/ArchiveFolderOpen.cpp b/CPP/7zip/UI/Agent/ArchiveFolderOpen.cpp index 98c75f4d..af9f6df0 100755 --- a/CPP/7zip/UI/Agent/ArchiveFolderOpen.cpp +++ b/CPP/7zip/UI/Agent/ArchiveFolderOpen.cpp @@ -6,8 +6,16 @@ #include "Common/StringConvert.h" +extern HINSTANCE g_hInstance; + static inline UINT GetCurrentFileCodePage() - { return AreFileApisANSI() ? CP_ACP : CP_OEMCP; } +{ + #ifdef UNDER_CE + return CP_ACP; + #else + return AreFileApisANSI() ? CP_ACP : CP_OEMCP; + #endif +} void CArchiveFolderManager::LoadFormats() { @@ -61,21 +69,25 @@ STDMETHODIMP CArchiveFolderManager::GetExtensions(const wchar_t *type, BSTR *ext return StringToBstr(_codecs.Formats[formatIndex].GetAllExtensions(), extensions); } */ + +static void AddIconExt(const CCodecIcons &lib, UString &dest) +{ + for (int j = 0; j < lib.IconPairs.Size(); j++) + { + if (!dest.IsEmpty()) + dest += L' '; + dest += lib.IconPairs[j].Ext; + } +} + STDMETHODIMP CArchiveFolderManager::GetExtensions(BSTR *extensions) { LoadFormats(); *extensions = 0; UString res; for (int i = 0; i < _codecs->Libs.Size(); i++) - { - const CCodecLib &lib = _codecs->Libs[i]; - for (int j = 0; j < lib.IconPairs.Size(); j++) - { - if (!res.IsEmpty()) - res += L' '; - res += lib.IconPairs[j].Ext; - } - } + AddIconExt(_codecs->Libs[i], res); + AddIconExt(_codecs->InternalIcons, res); return StringToBstr(res, extensions); } @@ -87,13 +99,21 @@ STDMETHODIMP CArchiveFolderManager::GetIconPath(const wchar_t *ext, BSTR *iconPa for (int i = 0; i < _codecs->Libs.Size(); i++) { const CCodecLib &lib = _codecs->Libs[i]; - int ii = lib.FindIconIndex(ext); - if (ii >= 0) + int ii; + if (lib.FindIconIndex(ext, ii)) { *iconIndex = ii; return StringToBstr(GetUnicodeString(lib.Path, GetCurrentFileCodePage()), iconPath); } } + int ii; + if (_codecs->InternalIcons.FindIconIndex(ext, ii)) + { + *iconIndex = ii; + UString path; + NWindows::NDLL::MyGetModuleFileName(g_hInstance, path); + return StringToBstr(path, iconPath); + } return S_OK; } diff --git a/CPP/7zip/UI/Agent/ArchiveFolderOut.cpp b/CPP/7zip/UI/Agent/ArchiveFolderOut.cpp index 8f03f44d..cf3e2d5a 100755 --- a/CPP/7zip/UI/Agent/ArchiveFolderOut.cpp +++ b/CPP/7zip/UI/Agent/ArchiveFolderOut.cpp @@ -31,7 +31,7 @@ HRESULT CAgentFolder::CommonUpdateOperation( IFolderArchiveUpdateCallback *updateCallback100) { NWorkDir::CInfo workDirInfo; - ReadWorkDirInfo(workDirInfo); + workDirInfo.Load(); UString archiveFilePath = _agentSpec->_archiveFilePath; UString workDir = GetWorkDir(workDirInfo, archiveFilePath); CreateComplexDirectory(workDir); diff --git a/CPP/7zip/UI/Agent/IFolderArchive.h b/CPP/7zip/UI/Agent/IFolderArchive.h index 91da1150..7b5b0ba4 100755 --- a/CPP/7zip/UI/Agent/IFolderArchive.h +++ b/CPP/7zip/UI/Agent/IFolderArchive.h @@ -11,7 +11,7 @@ #include "../Common/ExtractMode.h" #include "../Common/IFileExtractCallback.h" -#define FOLDER_ARCHIVE_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 0x01, x) +#define FOLDER_ARCHIVE_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 0x01, x) #define FOLDER_ARCHIVE_INTERFACE(i, x) FOLDER_ARCHIVE_INTERFACE_SUB(i, IUnknown, x) #define INTERFACE_IArchiveFolder(x) \ diff --git a/CPP/7zip/UI/Client7z/Client7z.cpp b/CPP/7zip/UI/Client7z/Client7z.cpp index 7c052171..410b800d 100755 --- a/CPP/7zip/UI/Client7z/Client7z.cpp +++ b/CPP/7zip/UI/Client7z/Client7z.cpp @@ -10,6 +10,7 @@ #include "Windows/FileDir.h" #include "Windows/FileFind.h" #include "Windows/FileName.h" +#include "Windows/NtCheck.h" #include "Windows/PropVariant.h" #include "Windows/PropVariantConversions.h" @@ -46,19 +47,6 @@ typedef UINT32 (WINAPI * CreateObjectFunc)( const GUID *interfaceID, void **outObject); -#ifdef _WIN32 -#ifndef _UNICODE -bool g_IsNT = false; -static inline bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} -#endif -#endif void PrintString(const UString &s) { @@ -660,51 +648,57 @@ STDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDef ////////////////////////////////////////////////////////////////////////// // Main function -int MY_CDECL main(int argc, char* argv[]) +#define NT_CHECK_FAIL_ACTION PrintError("Unsupported Windows version"); return 1; + +int MY_CDECL main(int numArgs, const char *args[]) { - #ifdef _WIN32 - #ifndef _UNICODE - g_IsNT = IsItWindowsNT(); - #endif - #endif + NT_CHECK PrintStringLn(kCopyrightString); - if (argc < 3) + if (numArgs < 3) { PrintStringLn(kHelpString); return 1; } - NWindows::NDLL::CLibrary library; - if (!library.Load(TEXT(kDllName))) + NWindows::NDLL::CLibrary lib; + if (!lib.Load(TEXT(kDllName))) { - PrintError("Can not load library"); + PrintError("Can not load 7-zip library"); return 1; } - CreateObjectFunc createObjectFunc = (CreateObjectFunc)library.GetProcAddress("CreateObject"); + CreateObjectFunc createObjectFunc = (CreateObjectFunc)lib.GetProc("CreateObject"); if (createObjectFunc == 0) { PrintError("Can not get CreateObject"); return 1; } - AString command = argv[1]; - command.MakeLower(); - UString archiveName = GetUnicodeString(argv[2], CP_OEMCP); - if (command.Compare("a") == 0) + char c; + { + AString command = args[1]; + if (command.Length() != 1) + { + PrintError("incorrect command"); + return 1; + } + c = MyCharLower(command[0]); + } + UString archiveName = GetUnicodeString(args[2]); + if (c == 'a') { // create archive command - if (argc < 4) + if (numArgs < 4) { PrintStringLn(kHelpString); return 1; } CObjectVector<CDirItem> dirItems; int i; - for (i = 3; i < argc; i++) + for (i = 3; i < numArgs; i++) { CDirItem di; - UString name = GetUnicodeString(argv[i], CP_OEMCP); + UString name = GetUnicodeString(args[i]); NFile::NFind::CFileInfoW fi; if (!fi.Find(name)) @@ -743,6 +737,30 @@ int MY_CDECL main(int argc, char* argv[]) // updateCallbackSpec->PasswordIsDefined = true; // updateCallbackSpec->Password = L"1"; + /* + { + const wchar_t *names[] = + { + L"s", + L"x" + }; + const int kNumProps = sizeof(names) / sizeof(names[0]); + NWindows::NCOM::CPropVariant values[kNumProps] = + { + false, // solid mode OFF + (UInt32)9 // compression level = 9 - ultra + }; + CMyComPtr<ISetProperties> setProperties; + outArchive->QueryInterface(IID_ISetProperties, (void **)&setProperties); + if (!setProperties) + { + PrintError("ISetProperties unsupported"); + return 1; + } + RINOK(setProperties->SetProperties(names, values, kNumProps)); + } + */ + HRESULT result = outArchive->UpdateItems(outFileStream, dirItems.Size(), updateCallback); updateCallbackSpec->Finilize(); if (result != S_OK) @@ -760,16 +778,16 @@ int MY_CDECL main(int argc, char* argv[]) } else { - if (argc != 3) + if (numArgs != 3) { PrintStringLn(kHelpString); return 1; } bool listCommand; - if (command.Compare("l") == 0) + if (c == 'l') listCommand = true; - else if (command.Compare("x") == 0) + else if (c == 'x') listCommand = false; else { diff --git a/CPP/7zip/UI/Client7z/makefile b/CPP/7zip/UI/Client7z/makefile index 226c36a2..0ff8e72f 100755 --- a/CPP/7zip/UI/Client7z/makefile +++ b/CPP/7zip/UI/Client7z/makefile @@ -1,5 +1,5 @@ PROG = 7z.exe -LIBS = $(LIBS) user32.lib oleaut32.lib advapi32.lib +MY_CONSOLE = 1 CFLAGS = $(CFLAGS) -I ../../../ CONSOLE_OBJS = \ diff --git a/CPP/7zip/UI/Common/ArchiveCommandLine.cpp b/CPP/7zip/UI/Common/ArchiveCommandLine.cpp index 96d47c08..cfb0f796 100755 --- a/CPP/7zip/UI/Common/ArchiveCommandLine.cpp +++ b/CPP/7zip/UI/Common/ArchiveCommandLine.cpp @@ -3,8 +3,10 @@ #include "StdAfx.h" #ifdef _WIN32 +#ifndef UNDER_CE #include <io.h> #endif +#endif #include <stdio.h> #include "Common/ListFileUtils.h" @@ -26,6 +28,12 @@ extern bool g_CaseSensitive; +#ifdef UNDER_CE + +#define MY_IS_TERMINAL(x) false; + +#else + #if _MSC_VER >= 1400 #define MY_isatty_fileno(x) _isatty(_fileno(x)) #else @@ -34,6 +42,8 @@ extern bool g_CaseSensitive; #define MY_IS_TERMINAL(x) (MY_isatty_fileno(x) != 0); +#endif + using namespace NCommandLineParser; using namespace NWindows; using namespace NFile; @@ -250,26 +260,21 @@ static bool ParseArchiveCommand(const UString &commandString, CArchiveCommand &c // ------------------------------------------------------------------ // filenames functions -static bool AddNameToCensor(NWildcard::CCensor &wildcardCensor, +static void AddNameToCensor(NWildcard::CCensor &wildcardCensor, const UString &name, bool include, NRecursedType::EEnum type) { - bool isWildCard = DoesNameContainWildCard(name); bool recursed = false; switch (type) { case NRecursedType::kWildCardOnlyRecursed: - recursed = isWildCard; + recursed = DoesNameContainWildCard(name); break; case NRecursedType::kRecursed: recursed = true; break; - case NRecursedType::kNonRecursed: - recursed = false; - break; } wildcardCensor.AddItem(include, name, recursed); - return true; } static void AddToCensorFromListFile(NWildcard::CCensor &wildcardCensor, @@ -279,15 +284,7 @@ static void AddToCensorFromListFile(NWildcard::CCensor &wildcardCensor, if (!ReadNamesFromListFile(fileName, names, codePage)) throw kIncorrectListFile; for (int i = 0; i < names.Size(); i++) - if (!AddNameToCensor(wildcardCensor, names[i], include, type)) - throw kIncorrectWildCardInListFile; -} - -static void AddCommandLineWildCardToCensr(NWildcard::CCensor &wildcardCensor, - const UString &name, bool include, NRecursedType::EEnum recursedType) -{ - if (!AddNameToCensor(wildcardCensor, name, include, recursedType)) - throw kIncorrectWildCardInCommandLine; + AddNameToCensor(wildcardCensor, names[i], include, type); } static void AddToCensorFromNonSwitchesStrings( @@ -297,14 +294,14 @@ static void AddToCensorFromNonSwitchesStrings( bool thereAreSwitchIncludes, UINT codePage) { if (nonSwitchStrings.Size() == startIndex && (!thereAreSwitchIncludes)) - AddCommandLineWildCardToCensr(wildcardCensor, kUniversalWildcard, true, type); + AddNameToCensor(wildcardCensor, kUniversalWildcard, true, type); for (int i = startIndex; i < nonSwitchStrings.Size(); i++) { const UString &s = nonSwitchStrings[i]; if (s[0] == kFileListID) AddToCensorFromListFile(wildcardCensor, s.Mid(1), true, type, codePage); else - AddCommandLineWildCardToCensr(wildcardCensor, s, true, type); + AddNameToCensor(wildcardCensor, s, true, type); } } @@ -330,9 +327,9 @@ static void ParseMapWithPaths(NWildcard::CCensor &wildcardCensor, UInt32 dataSize = (UInt32)dataSize64; { CFileMapping fileMapping; - if (!fileMapping.Open(FILE_MAP_READ, false, GetSystemString(mappingName))) + if (fileMapping.Open(FILE_MAP_READ, GetSystemString(mappingName)) != 0) ThrowException("Can not open mapping"); - LPVOID data = fileMapping.MapViewOfFile(FILE_MAP_READ, 0, dataSize); + LPVOID data = fileMapping.Map(FILE_MAP_READ, 0, dataSize); if (data == NULL) ThrowException("MapViewOfFile error"); try @@ -347,8 +344,7 @@ static void ParseMapWithPaths(NWildcard::CCensor &wildcardCensor, wchar_t c = curData[i]; if (c == L'\0') { - AddCommandLineWildCardToCensr(wildcardCensor, - name, include, commonRecursedType); + AddNameToCensor(wildcardCensor, name, include, commonRecursedType); name.Empty(); } else @@ -398,7 +394,7 @@ static void AddSwitchWildCardsToCensor(NWildcard::CCensor &wildcardCensor, ThrowUserErrorException(); UString tail = name.Mid(pos + 1); if (name[pos] == kImmediateNameID) - AddCommandLineWildCardToCensr(wildcardCensor, tail, include, recursedType); + AddNameToCensor(wildcardCensor, tail, include, recursedType); else if (name[pos] == kFileListID) AddToCensorFromListFile(wildcardCensor, tail, include, recursedType, codePage); #ifdef _WIN32 @@ -764,6 +760,52 @@ static bool ConvertStringToUInt32(const wchar_t *s, UInt32 &v) return true; } +void EnumerateDirItemsAndSort(NWildcard::CCensor &wildcardCensor, + UStringVector &sortedPaths, + UStringVector &sortedFullPaths) +{ + UStringVector paths; + { + CDirItems dirItems; + { + UStringVector errorPaths; + CRecordVector<DWORD> errorCodes; + HRESULT res = EnumerateItems(wildcardCensor, dirItems, NULL, errorPaths, errorCodes); + if (res != S_OK || errorPaths.Size() > 0) + throw "cannot find archive"; + } + for (int i = 0; i < dirItems.Items.Size(); i++) + { + const CDirItem &dirItem = dirItems.Items[i]; + if (!dirItem.IsDir()) + paths.Add(dirItems.GetPhyPath(i)); + } + } + + if (paths.Size() == 0) + throw "there is no such archive"; + + UStringVector fullPaths; + + int i; + for (i = 0; i < paths.Size(); i++) + { + UString fullPath; + NFile::NDirectory::MyGetFullPathName(paths[i], fullPath); + fullPaths.Add(fullPath); + } + CIntVector indices; + SortFileNames(fullPaths, indices); + sortedPaths.Reserve(indices.Size()); + sortedFullPaths.Reserve(indices.Size()); + for (i = 0; i < indices.Size(); i++) + { + int index = indices[i]; + sortedPaths.Add(paths[index]); + sortedFullPaths.Add(fullPaths[index]); + } +} + void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) { const UStringVector &nonSwitchStrings = parser.NonSwitchStrings; @@ -844,16 +886,14 @@ void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) NWildcard::CCensor archiveWildcardCensor; if (parser[NKey::kArInclude].ThereIs) - { AddSwitchWildCardsToCensor(archiveWildcardCensor, - parser[NKey::kArInclude].PostStrings, true, NRecursedType::kNonRecursed, codePage); - } + parser[NKey::kArInclude].PostStrings, true, NRecursedType::kNonRecursed, codePage); if (parser[NKey::kArExclude].ThereIs) AddSwitchWildCardsToCensor(archiveWildcardCensor, - parser[NKey::kArExclude].PostStrings, false, NRecursedType::kNonRecursed, codePage); + parser[NKey::kArExclude].PostStrings, false, NRecursedType::kNonRecursed, codePage); if (thereIsArchiveName) - AddCommandLineWildCardToCensr(archiveWildcardCensor, options.ArchiveName, true, NRecursedType::kNonRecursed); + AddNameToCensor(archiveWildcardCensor, options.ArchiveName, true, NRecursedType::kNonRecursed); #ifdef _WIN32 ConvertToLongNames(archiveWildcardCensor); @@ -869,50 +909,11 @@ void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) } else { - - UStringVector archivePaths; - - { - CDirItems dirItems; - { - UStringVector errorPaths; - CRecordVector<DWORD> errorCodes; - HRESULT res = EnumerateItems(archiveWildcardCensor, dirItems, NULL, errorPaths, errorCodes); - if (res != S_OK || errorPaths.Size() > 0) - throw "cannot find archive"; - } - for (int i = 0; i < dirItems.Items.Size(); i++) - { - const CDirItem &dirItem = dirItems.Items[i]; - if (!dirItem.IsDir()) - archivePaths.Add(dirItems.GetPhyPath(i)); - } - } - - if (archivePaths.Size() == 0) - throw "there is no such archive"; - - UStringVector archivePathsFull; - - int i; - for (i = 0; i < archivePaths.Size(); i++) - { - UString fullPath; - NFile::NDirectory::MyGetFullPathName(archivePaths[i], fullPath); - archivePathsFull.Add(fullPath); - } - CIntVector indices; - SortFileNames(archivePathsFull, indices); - options.ArchivePathsSorted.Reserve(indices.Size()); - options.ArchivePathsFullSorted.Reserve(indices.Size()); - for (i = 0; i < indices.Size(); i++) - { - options.ArchivePathsSorted.Add(archivePaths[indices[i]]); - options.ArchivePathsFullSorted.Add(archivePathsFull[indices[i]]); + EnumerateDirItemsAndSort(archiveWildcardCensor, + options.ArchivePathsSorted, + options.ArchivePathsFullSorted); } - } - if (isExtractGroupCommand) { SetMethodOptions(parser, options.ExtractProperties); @@ -926,8 +927,7 @@ void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) options.OverwriteMode = NExtract::NOverwriteMode::kAskBefore; if (parser[NKey::kOverwrite].ThereIs) - options.OverwriteMode = - k_OverwriteModes[parser[NKey::kOverwrite].PostCharIndex]; + options.OverwriteMode = k_OverwriteModes[parser[NKey::kOverwrite].PostCharIndex]; else if (options.YesToAll) options.OverwriteMode = NExtract::NOverwriteMode::kWithoutPrompt; } diff --git a/CPP/7zip/UI/Common/ArchiveCommandLine.h b/CPP/7zip/UI/Common/ArchiveCommandLine.h index 6f79b7ee..e8f601df 100755 --- a/CPP/7zip/UI/Common/ArchiveCommandLine.h +++ b/CPP/7zip/UI/Common/ArchiveCommandLine.h @@ -1,10 +1,10 @@ // ArchiveCommandLine.h -#ifndef __ARCHIVECOMMANDLINE_H -#define __ARCHIVECOMMANDLINE_H +#ifndef __ARCHIVE_COMMAND_LINE_H +#define __ARCHIVE_COMMAND_LINE_H -#include "Common/Wildcard.h" #include "Common/CommandLineParser.h" +#include "Common/Wildcard.h" #include "Extract.h" #include "Update.h" @@ -104,4 +104,8 @@ public: void Parse2(CArchiveCommandLineOptions &options); }; +void EnumerateDirItemsAndSort(NWildcard::CCensor &wildcardCensor, + UStringVector &sortedPaths, + UStringVector &sortedFullPaths); + #endif diff --git a/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp b/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp index 7188bcb6..e7e61713 100755 --- a/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp +++ b/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp @@ -75,9 +75,12 @@ struct CInFileStreamVol: public CInFileStream CMyComPtr<IArchiveOpenCallback> OpenCallbackRef; ~CInFileStreamVol() { - int index = OpenCallbackImp->FindName(Name); - if (index >= 0) - OpenCallbackImp->FileNames.Delete(index); + if (OpenCallbackRef) + { + int index = OpenCallbackImp->FindName(Name); + if (index >= 0) + OpenCallbackImp->FileNames.Delete(index); + } } }; diff --git a/CPP/7zip/UI/Common/CompressCall.cpp b/CPP/7zip/UI/Common/CompressCall.cpp index 47f89ed6..c2685f79 100755 --- a/CPP/7zip/UI/Common/CompressCall.cpp +++ b/CPP/7zip/UI/Common/CompressCall.cpp @@ -9,6 +9,7 @@ #include "Windows/FileDir.h" #include "Windows/FileMapping.h" +#include "Windows/Process.h" #include "Windows/Synchronization.h" #include "../FileManager/ProgramLocation.h" @@ -16,253 +17,170 @@ #include "CompressCall.h" -#ifndef _UNICODE -extern bool g_IsNT; -#endif _UNICODE - using namespace NWindows; +#define MY_TRY_BEGIN try { +#define MY_TRY_FINISH } \ + catch(...) { ErrorMessageHRESULT(E_FAIL); return E_FAIL; } + static LPCWSTR kShowDialogSwitch = L" -ad"; static LPCWSTR kEmailSwitch = L" -seml."; -static LPCWSTR kMapSwitch = L" -i#"; -static LPCWSTR kArchiveNoNameSwitch = L" -an"; +static LPCWSTR kIncludeSwitch = L" -i"; static LPCWSTR kArchiveTypeSwitch = L" -t"; -static LPCWSTR kArchiveMapSwitch = L" -ai#"; +static LPCWSTR kArcIncludeSwitches = L" -an -ai"; static LPCWSTR kStopSwitchParsing = L" --"; static LPCWSTR kLargePagesDisable = L" -slp-"; -static void AddLagePagesSwitch(UString ¶ms) +UString GetQuotedString(const UString &s) { - if (!ReadLockMemoryEnable()) - params += kLargePagesDisable; + return UString(L'\"') + s + UString(L'\"'); +} +static void ErrorMessage(LPCWSTR message) +{ + MessageBoxW(g_HWND, message, L"7-Zip", MB_ICONERROR | MB_OK); } -HRESULT MyCreateProcess(const UString ¶ms, - LPCWSTR curDir, bool waitFinish, - NWindows::NSynchronization::CBaseEvent *event) +static void ErrorMessageHRESULT(HRESULT res, LPCWSTR s = NULL) { - const UString params2 = params; - PROCESS_INFORMATION processInformation; - BOOL result; - #ifndef _UNICODE - if (!g_IsNT) + UString s2 = HResultToMessage(res); + if (s) { - STARTUPINFOA startupInfo; - startupInfo.cb = sizeof(startupInfo); - startupInfo.lpReserved = 0; - startupInfo.lpDesktop = 0; - startupInfo.lpTitle = 0; - startupInfo.dwFlags = 0; - startupInfo.cbReserved2 = 0; - startupInfo.lpReserved2 = 0; - - CSysString curDirA; - if (curDir != 0) - curDirA = GetSystemString(curDir); - result = ::CreateProcessA(NULL, (LPSTR)(LPCSTR)GetSystemString(params), - NULL, NULL, FALSE, 0, NULL, - ((curDir != 0) ? (LPCSTR)curDirA: 0), - &startupInfo, &processInformation); + s2 += L'\n'; + s2 += s; } - else - #endif + ErrorMessage(s2); +} + +static HRESULT MyCreateProcess(LPCWSTR imageName, const UString ¶ms, + LPCWSTR curDir, bool waitFinish, + NSynchronization::CBaseEvent *event) +{ + CProcess process; + WRes res = process.Create(imageName, params, curDir); + if (res != 0) { - STARTUPINFOW startupInfo; - startupInfo.cb = sizeof(startupInfo); - startupInfo.lpReserved = 0; - startupInfo.lpDesktop = 0; - startupInfo.lpTitle = 0; - startupInfo.dwFlags = 0; - startupInfo.cbReserved2 = 0; - startupInfo.lpReserved2 = 0; - - result = ::CreateProcessW(NULL, (LPWSTR)(LPCWSTR)params, - NULL, NULL, FALSE, 0, NULL, - curDir, - &startupInfo, &processInformation); + ErrorMessageHRESULT(res, imageName); + return res; } - if (result == 0) - return ::GetLastError(); - else + if (waitFinish) + process.Wait(); + else if (event != NULL) { - ::CloseHandle(processInformation.hThread); - if (waitFinish) - WaitForSingleObject(processInformation.hProcess, INFINITE); - else if (event != NULL) - { - HANDLE handles[] = {processInformation.hProcess, *event }; - ::WaitForMultipleObjects(sizeof(handles) / sizeof(handles[0]), - handles, FALSE, INFINITE); - } - ::CloseHandle(processInformation.hProcess); + HANDLE handles[] = { process, *event }; + ::WaitForMultipleObjects(sizeof(handles) / sizeof(handles[0]), handles, FALSE, INFINITE); } return S_OK; } -static UString GetQuotedString(const UString &s) +static void AddLagePagesSwitch(UString ¶ms) { - return UString(L"\"") + s + UString(L"\""); + if (!ReadLockMemoryEnable()) + params += kLargePagesDisable; } static UString Get7zGuiPath() { UString path; - UString folder; - if (GetProgramFolderPath(folder)) - path += folder; - path += L"7zG.exe"; - return GetQuotedString(path); + GetProgramFolderPath(path); + return path + L"7zG.exe"; } -static HRESULT CreateTempEvent(const wchar_t *name, - NSynchronization::CManualResetEvent &event, UString &eventName) +class CRandNameGenerator { - CRandom random; - random.Init(GetTickCount()); - for (;;) + CRandom _random; +public: + CRandNameGenerator() { _random.Init(); } + UString GenerateName() { - int number = random.Generate(); wchar_t temp[16]; - ConvertUInt32ToString((UInt32)number, temp); - eventName = name; - eventName += temp; - RINOK(event.CreateWithName(false, GetSystemString(eventName))); - if (::GetLastError() != ERROR_ALREADY_EXISTS) - return S_OK; - event.Close(); + ConvertUInt32ToString((UInt32)_random.Generate(), temp); + return temp; } -} +}; static HRESULT CreateMap(const UStringVector &names, - const UString &id, CFileMapping &fileMapping, NSynchronization::CManualResetEvent &event, UString ¶ms) { - UInt32 extraSize = 2; - UInt32 dataSize = 0; + UInt32 totalSize = 1; for (int i = 0; i < names.Size(); i++) - dataSize += (names[i].Length() + 1) * sizeof(wchar_t); - UInt32 totalSize = extraSize + dataSize; + totalSize += (names[i].Length() + 1); + totalSize *= sizeof(wchar_t); + CRandNameGenerator random; + UString mappingName; - - CRandom random; - random.Init(GetTickCount()); for (;;) { - int number = random.Generate(); - wchar_t temp[16]; - ConvertUInt32ToString(UInt32(number), temp); - mappingName = id; - mappingName += L"Mapping"; - mappingName += temp; - if (!fileMapping.Create(INVALID_HANDLE_VALUE, NULL, - PAGE_READWRITE, totalSize, GetSystemString(mappingName))) - return E_FAIL; - if (::GetLastError() != ERROR_ALREADY_EXISTS) + mappingName = L"7zMap" + random.GenerateName(); + + WRes res = fileMapping.Create(PAGE_READWRITE, totalSize, GetSystemString(mappingName)); + if (fileMapping.IsCreated() && res == 0) break; + if (res != ERROR_ALREADY_EXISTS) + return res; fileMapping.Close(); } UString eventName; - RINOK(CreateTempEvent(id + L"MappingEndEvent", event, eventName)); + for (;;) + { + eventName = L"7zEvent" + random.GenerateName(); + WRes res = event.CreateWithName(false, GetSystemString(eventName)); + if (event.IsCreated() && res == 0) + break; + if (res != ERROR_ALREADY_EXISTS) + return res; + event.Close(); + } + params += L'#'; params += mappingName; - params += L":"; - wchar_t string[16]; - ConvertUInt32ToString(totalSize, string); - params += string; + params += L':'; + wchar_t temp[16]; + ConvertUInt32ToString(totalSize, temp); + params += temp; - params += L":"; + params += L':'; params += eventName; - LPVOID data = fileMapping.MapViewOfFile(FILE_MAP_WRITE, 0, totalSize); + LPVOID data = fileMapping.Map(FILE_MAP_WRITE, 0, totalSize); if (data == NULL) return E_FAIL; + CFileUnmapper unmapper(data); { - wchar_t *curData = (wchar_t *)data; - *curData = 0; - curData++; + wchar_t *cur = (wchar_t *)data; + *cur++ = 0; for (int i = 0; i < names.Size(); i++) { const UString &s = names[i]; - memcpy(curData, (const wchar_t *)s, s.Length() * sizeof(wchar_t)); - curData += s.Length(); - *curData++ = L'\0'; + int len = s.Length() + 1; + memcpy(cur, (const wchar_t *)s, len * sizeof(wchar_t)); + cur += len; } } return S_OK; } HRESULT CompressFiles( - const UString &curDir, - const UString &archiveName, - const UString &archiveType, + const UString &arcPathPrefix, + const UString &arcName, + const UString &arcType, const UStringVector &names, - // const UString &outFolder, - bool email, - bool showDialog, - bool waitFinish) + bool email, bool showDialog, bool waitFinish) { - /* - UString curDir; - if (names.Size() > 0) - { - NFile::NDirectory::GetOnlyDirPrefix(names[0], curDir); - } - */ - UString params; - params = Get7zGuiPath(); - params += L" a"; - params += kMapSwitch; - // params += _fileNames[0]; - - UInt32 extraSize = 2; - UInt32 dataSize = 0; - for (int i = 0; i < names.Size(); i++) - dataSize += (names[i].Length() + 1) * sizeof(wchar_t); - UInt32 totalSize = extraSize + dataSize; - - UString mappingName; + MY_TRY_BEGIN + UString params = L'a'; CFileMapping fileMapping; - CRandom random; - random.Init(GetTickCount()); - for (;;) - { - int number = random.Generate(); - wchar_t temp[16]; - ConvertUInt32ToString(UInt32(number), temp); - mappingName = L"7zCompressMapping"; - mappingName += temp; - if (!fileMapping.Create(INVALID_HANDLE_VALUE, NULL, - PAGE_READWRITE, totalSize, GetSystemString(mappingName))) - { - // MyMessageBox(IDS_ERROR, 0x02000605); - return E_FAIL; - } - if (::GetLastError() != ERROR_ALREADY_EXISTS) - break; - fileMapping.Close(); - } - NSynchronization::CManualResetEvent event; - UString eventName; - RINOK(CreateTempEvent(L"7zCompressMappingEndEvent", event, eventName)); - - params += mappingName; - params += L":"; - wchar_t string[16]; - ConvertUInt32ToString(totalSize, string); - params += string; - - params += L":"; - params += eventName; + params += kIncludeSwitch; + RINOK(CreateMap(names, fileMapping, event, params)); - if (!archiveType.IsEmpty()) + if (!arcType.IsEmpty()) { params += kArchiveTypeSwitch; - params += archiveType; + params += arcType; } if (email) @@ -274,71 +192,33 @@ HRESULT CompressFiles( AddLagePagesSwitch(params); params += kStopSwitchParsing; - params += L" "; - - params += GetQuotedString(archiveName); + params += L' '; - LPVOID data = fileMapping.MapViewOfFile(FILE_MAP_WRITE, 0, totalSize); - if (data == NULL) - { - // MyMessageBox(IDS_ERROR, 0x02000605); - return E_FAIL; - } - try - { - wchar_t *curData = (wchar_t *)data; - *curData = 0; - curData++; - for (int i = 0; i < names.Size(); i++) - { - const UString &unicodeString = names[i]; - memcpy(curData, (const wchar_t *)unicodeString , - unicodeString .Length() * sizeof(wchar_t)); - curData += unicodeString.Length(); - *curData++ = L'\0'; - } - // MessageBox(0, params, 0, 0); - RINOK(MyCreateProcess(params, - (curDir.IsEmpty()? 0: (LPCWSTR)curDir), - waitFinish, &event)); - } - catch(...) - { - UnmapViewOfFile(data); - throw; - } - UnmapViewOfFile(data); + params += GetQuotedString( + #ifdef UNDER_CE + arcPathPrefix + + #endif + arcName); - - /* - CThreadCompressMain *compressor = new CThreadCompressMain();; - compressor->FileNames = _fileNames; - CThread thread; - if (!thread.Create(CThreadCompressMain::MyThreadFunction, compressor)) - throw 271824; - */ - return S_OK; + return MyCreateProcess(Get7zGuiPath(), params, + (arcPathPrefix.IsEmpty()? 0: (LPCWSTR)arcPathPrefix), waitFinish, &event); + MY_TRY_FINISH } -static HRESULT ExtractGroupCommand(const UStringVector &archivePaths, - const UString ¶ms) +static HRESULT ExtractGroupCommand(const UStringVector &arcPaths, UString ¶ms) { - UString params2 = params; - AddLagePagesSwitch(params2); - params2 += kArchiveNoNameSwitch; - params2 += kArchiveMapSwitch; + AddLagePagesSwitch(params); + params += kArcIncludeSwitches; CFileMapping fileMapping; NSynchronization::CManualResetEvent event; - RINOK(CreateMap(archivePaths, L"7zExtract", fileMapping, event, params2)); - return MyCreateProcess(params2, 0, false, &event); + RINOK(CreateMap(arcPaths, fileMapping, event, params)); + return MyCreateProcess(Get7zGuiPath(), params, 0, false, &event); } -HRESULT ExtractArchives(const UStringVector &archivePaths, - const UString &outFolder, bool showDialog) +HRESULT ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog) { - UString params; - params = Get7zGuiPath(); - params += L" x"; + MY_TRY_BEGIN + UString params = L'x'; if (!outFolder.IsEmpty()) { params += L" -o"; @@ -346,21 +226,21 @@ HRESULT ExtractArchives(const UStringVector &archivePaths, } if (showDialog) params += kShowDialogSwitch; - return ExtractGroupCommand(archivePaths, params); + return ExtractGroupCommand(arcPaths, params); + MY_TRY_FINISH } -HRESULT TestArchives(const UStringVector &archivePaths) +HRESULT TestArchives(const UStringVector &arcPaths) { - UString params; - params = Get7zGuiPath(); - params += L" t"; - return ExtractGroupCommand(archivePaths, params); + MY_TRY_BEGIN + UString params = L't'; + return ExtractGroupCommand(arcPaths, params); + MY_TRY_FINISH } HRESULT Benchmark() { - UString params; - params = Get7zGuiPath(); - params += L" b"; - return MyCreateProcess(params, 0, false, NULL); + MY_TRY_BEGIN + return MyCreateProcess(Get7zGuiPath(), L'b', 0, false, NULL); + MY_TRY_FINISH } diff --git a/CPP/7zip/UI/Common/CompressCall.h b/CPP/7zip/UI/Common/CompressCall.h index feb45790..fc18df57 100755 --- a/CPP/7zip/UI/Common/CompressCall.h +++ b/CPP/7zip/UI/Common/CompressCall.h @@ -1,30 +1,24 @@ // CompressCall.h -#ifndef __COMPRESSCALL_H -#define __COMPRESSCALL_H +#ifndef __COMPRESS_CALL_H +#define __COMPRESS_CALL_H #include "Common/MyString.h" -#include "Windows/Synchronization.h" -HRESULT MyCreateProcess(const UString ¶ms, - LPCWSTR lpCurrentDirectory, bool waitFinish, - NWindows::NSynchronization::CBaseEvent *event); +UString GetQuotedString(const UString &s); + +extern HWND g_HWND; +UString HResultToMessage(HRESULT errorCode); HRESULT CompressFiles( - const UString &curDir, - const UString &archiveName, - const UString &archiveType, + const UString &arcPathPrefix, + const UString &arcName, + const UString &arcType, const UStringVector &names, - // const UString &outFolder, bool email, bool showDialog, bool waitFinish); -HRESULT ExtractArchives( - const UStringVector &archivePaths, - const UString &outFolder, bool showDialog); - -HRESULT TestArchives(const UStringVector &archivePaths); - +HRESULT ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog); +HRESULT TestArchives(const UStringVector &arcPaths); HRESULT Benchmark(); #endif - diff --git a/CPP/7zip/UI/Common/CompressCall2.cpp b/CPP/7zip/UI/Common/CompressCall2.cpp new file mode 100755 index 00000000..0ed227ca --- /dev/null +++ b/CPP/7zip/UI/Common/CompressCall2.cpp @@ -0,0 +1,173 @@ +// CompressCall.cpp + +#include "StdAfx.h" + +#include "Common/MyException.h" + +#include "../../UI/common/ArchiveCommandLine.h" + +#include "../../UI/GUI/BenchmarkDialog.h" +#include "../../UI/GUI/ExtractGUI.h" +#include "../../UI/GUI/UpdateGUI.h" + +#include "../../UI/GUI/ExtractRes.h" + +#include "CompressCall.h" + +#define MY_TRY_BEGIN try { +#define MY_TRY_FINISH } \ + catch(CSystemException &e) { result = e.ErrorCode; } \ + catch(...) { result = E_FAIL; } \ + if (result != S_OK && result != E_ABORT) \ + ErrorMessageHRESULT(result); + +#define CREATE_CODECS \ + CCodecs *codecs = new CCodecs; \ + CMyComPtr<IUnknown> compressCodecsInfo = codecs; \ + result = codecs->Load(); \ + if (result != S_OK) \ + throw CSystemException(result); + +UString GetQuotedString(const UString &s) +{ + return UString(L'\"') + s + UString(L'\"'); +} + +static void ErrorMessage(LPCWSTR message) +{ + MessageBoxW(g_HWND, message, L"7-Zip", MB_ICONERROR); +} + +static void ErrorMessageHRESULT(HRESULT res) +{ + ErrorMessage(HResultToMessage(res)); +} + +static void ErrorLangMessage(UINT resourceID, UInt32 langID) +{ + ErrorMessage(LangString(resourceID, langID)); +} + +HRESULT CompressFiles( + const UString &arcPathPrefix, + const UString &arcName, + const UString &arcType, + const UStringVector &names, + bool email, bool showDialog, bool /* waitFinish */) +{ + HRESULT result; + MY_TRY_BEGIN + CREATE_CODECS + + CUpdateCallbackGUI callback; + + callback.Init(); + + CUpdateOptions uo; + uo.EMailMode = email; + uo.SetAddActionCommand(); + + CIntVector formatIndices; + if (!codecs->FindFormatForArchiveType(arcType, formatIndices)) + { + ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE, 0x0200060D); + return E_FAIL; + } + if (!uo.Init(codecs, formatIndices, arcPathPrefix + arcName)) + { + ErrorLangMessage(IDS_UPDATE_NOT_SUPPORTED, 0x02000601); + return E_FAIL; + } + + NWildcard::CCensor censor; + for (int i = 0; i < names.Size(); i++) + censor.AddItem(true, names[i], false); + + bool messageWasDisplayed = false; + result = UpdateGUI(codecs, censor, uo, showDialog, messageWasDisplayed, &callback, g_HWND); + + if (result != S_OK) + { + if (result != E_ABORT && messageWasDisplayed) + return E_FAIL; + throw CSystemException(result); + } + if (callback.FailedFiles.Size() > 0) + { + if (!messageWasDisplayed) + throw CSystemException(E_FAIL); + return E_FAIL; + } + MY_TRY_FINISH + return S_OK; +} + +static HRESULT ExtractGroupCommand(const UStringVector &arcPaths, + bool showDialog, const UString &outFolder, bool testMode) +{ + HRESULT result; + MY_TRY_BEGIN + CREATE_CODECS + + CExtractOptions eo; + eo.OutputDir = outFolder; + eo.TestMode = testMode; + + CExtractCallbackImp *ecs = new CExtractCallbackImp; + CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs; + + ecs->Init(); + + // eo.CalcCrc = options.CalcCrc; + + UStringVector arcPathsSorted; + UStringVector arcFullPathsSorted; + { + NWildcard::CCensor acrCensor; + for (int i = 0; i < arcPaths.Size(); i++) + acrCensor.AddItem(true, arcPaths[i], false); + EnumerateDirItemsAndSort(acrCensor, arcPathsSorted, arcFullPathsSorted); + } + + CIntVector formatIndices; + + NWildcard::CCensor censor; + censor.AddItem(true, L"*", false); + + bool messageWasDisplayed = false; + result = ExtractGUI(codecs, formatIndices, arcPathsSorted, arcFullPathsSorted, + censor.Pairs.Front().Head, eo, showDialog, messageWasDisplayed, ecs, g_HWND); + if (result != S_OK) + { + if (result != E_ABORT && messageWasDisplayed) + return E_FAIL; + throw CSystemException(result); + } + return ecs->IsOK() ? S_OK : E_FAIL; + MY_TRY_FINISH + return result; +} + +HRESULT ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog) +{ + return ExtractGroupCommand(arcPaths, showDialog, outFolder, false); +} + +HRESULT TestArchives(const UStringVector &arcPaths) +{ + return ExtractGroupCommand(arcPaths, true, UString(), true); +} + +HRESULT Benchmark() +{ + HRESULT result; + MY_TRY_BEGIN + CREATE_CODECS + result = Benchmark( + #ifdef EXTERNAL_LZMA + codecs, + #endif + (UInt32)-1, (UInt32)-1, g_HWND); + MY_TRY_FINISH + return result; +} diff --git a/CPP/7zip/UI/Common/HandlerLoader.h b/CPP/7zip/UI/Common/HandlerLoader.h deleted file mode 100755 index 4c7e1a8f..00000000 --- a/CPP/7zip/UI/Common/HandlerLoader.h +++ /dev/null @@ -1,38 +0,0 @@ -// HandlerLoader.h - -#ifndef __HANDLERLOADER_H -#define __HANDLERLOADER_H - -#include "../../ICoder.h" -#include "Windows/DLL.h" - -typedef UInt32 (WINAPI * CreateObjectFunc)( - const GUID *clsID, - const GUID *interfaceID, - void **outObject); - -class CHandlerLoader: public NWindows::NDLL::CLibrary -{ -public: - HRESULT CreateHandler(LPCWSTR filepath, REFGUID clsID, - void **archive, bool outHandler) - { - if (!Load(filepath)) - return GetLastError(); - CreateObjectFunc createObject = (CreateObjectFunc) - GetProcAddress("CreateObject"); - if (createObject == NULL) - { - HRESULT res = ::GetLastError(); - Free(); - return res; - } - HRESULT res = createObject(&clsID, - outHandler ? &IID_IOutArchive : &IID_IInArchive, (void **)archive); - if (res != 0) - Free(); - return res; - } -}; - -#endif diff --git a/CPP/7zip/UI/Common/LoadCodecs.cpp b/CPP/7zip/UI/Common/LoadCodecs.cpp index dac8c4d2..856e47fb 100755 --- a/CPP/7zip/UI/Common/LoadCodecs.cpp +++ b/CPP/7zip/UI/Common/LoadCodecs.cpp @@ -111,12 +111,12 @@ static HRESULT GetCoderClass(GetMethodPropertyFunc getMethodProperty, UInt32 ind HRESULT CCodecs::LoadCodecs() { CCodecLib &lib = Libs.Back(); - lib.GetMethodProperty = (GetMethodPropertyFunc)lib.Lib.GetProcAddress("GetMethodProperty"); + lib.GetMethodProperty = (GetMethodPropertyFunc)lib.Lib.GetProc("GetMethodProperty"); if (lib.GetMethodProperty == NULL) return S_OK; UInt32 numMethods = 1; - GetNumberOfMethodsFunc getNumberOfMethodsFunc = (GetNumberOfMethodsFunc)lib.Lib.GetProcAddress("GetNumberOfMethods"); + GetNumberOfMethodsFunc getNumberOfMethodsFunc = (GetNumberOfMethodsFunc)lib.Lib.GetProc("GetNumberOfMethods"); if (getNumberOfMethodsFunc != NULL) { RINOK(getNumberOfMethodsFunc(&numMethods)); @@ -210,10 +210,11 @@ static void SplitString(const UString &srcString, UStringVector &destStrings) destStrings.Add(s); } -void CArcInfoEx::AddExts(const wchar_t* ext, const wchar_t* addExt) +void CArcInfoEx::AddExts(const wchar_t *ext, const wchar_t *addExt) { UStringVector exts, addExts; - SplitString(ext, exts); + if (ext != 0) + SplitString(ext, exts); if (addExt != 0) SplitString(addExt, addExts); for (int i = 0; i < exts.Size(); i++) @@ -236,19 +237,16 @@ HRESULT CCodecs::LoadFormats() { const NDLL::CLibrary &lib = Libs.Back().Lib; GetHandlerPropertyFunc getProp = 0; - GetHandlerPropertyFunc2 getProp2 = (GetHandlerPropertyFunc2) - lib.GetProcAddress("GetHandlerProperty2"); + GetHandlerPropertyFunc2 getProp2 = (GetHandlerPropertyFunc2)lib.GetProc("GetHandlerProperty2"); if (getProp2 == NULL) { - getProp = (GetHandlerPropertyFunc) - lib.GetProcAddress("GetHandlerProperty"); + getProp = (GetHandlerPropertyFunc)lib.GetProc("GetHandlerProperty"); if (getProp == NULL) return S_OK; } UInt32 numFormats = 1; - GetNumberOfFormatsFunc getNumberOfFormats = (GetNumberOfFormatsFunc) - lib.GetProcAddress("GetNumberOfFormats"); + GetNumberOfFormatsFunc getNumberOfFormats = (GetNumberOfFormatsFunc)lib.GetProc("GetNumberOfFormats"); if (getNumberOfFormats != NULL) { RINOK(getNumberOfFormats(&numFormats)); @@ -294,37 +292,48 @@ HRESULT CCodecs::LoadFormats() } #ifdef NEW_FOLDER_INTERFACE -void CCodecLib::LoadIcons() +void CCodecIcons::LoadIcons(HMODULE m) { - UString iconTypes = MyLoadStringW((HMODULE)Lib, kIconTypesResId); + UString iconTypes = MyLoadStringW(m, kIconTypesResId); UStringVector pairs; SplitString(iconTypes, pairs); for (int i = 0; i < pairs.Size(); i++) { const UString &s = pairs[i]; int pos = s.Find(L':'); - if (pos < 0) - continue; CIconPair iconPair; - const wchar_t *end; - UString num = s.Mid(pos + 1); - iconPair.IconIndex = (UInt32)ConvertStringToUInt64(num, &end); - if (*end != L'\0') - continue; + iconPair.IconIndex = -1; + if (pos < 0) + pos = s.Length(); + else + { + UString num = s.Mid(pos + 1); + if (!num.IsEmpty()) + { + const wchar_t *end; + iconPair.IconIndex = (UInt32)ConvertStringToUInt64(num, &end); + if (*end != L'\0') + continue; + } + } iconPair.Ext = s.Left(pos); IconPairs.Add(iconPair); } } -int CCodecLib::FindIconIndex(const UString &ext) const +bool CCodecIcons::FindIconIndex(const UString &ext, int &iconIndex) const { + iconIndex = -1; for (int i = 0; i < IconPairs.Size(); i++) { const CIconPair &pair = IconPairs[i]; if (ext.CompareNoCase(pair.Ext) == 0) - return pair.IconIndex; + { + iconIndex = pair.IconIndex; + return true; + } } - return -1; + return false; } #endif @@ -335,8 +344,9 @@ extern "C" } #endif -HRESULT CCodecs::LoadDll(const CSysString &dllPath) +HRESULT CCodecs::LoadDll(const CSysString &dllPath, bool needCheckDll) { + if (needCheckDll) { NDLL::CLibrary library; if (!library.LoadEx(dllPath, LOAD_LIBRARY_AS_DATAFILE)) @@ -358,13 +368,13 @@ HRESULT CCodecs::LoadDll(const CSysString &dllPath) #ifdef _7ZIP_LARGE_PAGES if (g_LargePageSize != 0) { - SetLargePageModeFunc setLargePageMode = (SetLargePageModeFunc)lib.Lib.GetProcAddress("SetLargePageMode"); + SetLargePageModeFunc setLargePageMode = (SetLargePageModeFunc)lib.Lib.GetProc("SetLargePageMode"); if (setLargePageMode != 0) setLargePageMode(); } #endif - lib.CreateObject = (CreateObjectFunc)lib.Lib.GetProcAddress("CreateObject"); + lib.CreateObject = (CreateObjectFunc)lib.Lib.GetProc("CreateObject"); if (lib.CreateObject != 0) { int startSize = Codecs.Size(); @@ -391,7 +401,7 @@ HRESULT CCodecs::LoadDllsFromFolder(const CSysString &folderPrefix) { if (fi.IsDir()) continue; - RINOK(LoadDll(folderPrefix + fi.Name)); + RINOK(LoadDll(folderPrefix + fi.Name, true)); } return S_OK; } @@ -408,6 +418,10 @@ static inline void SetBuffer(CByteBuffer &bb, const Byte *data, int size) HRESULT CCodecs::Load() { + #ifdef NEW_FOLDER_INTERFACE + InternalIcons.LoadIcons(g_hInstance); + #endif + Formats.Clear(); #ifdef EXTERNAL_CODECS Codecs.Clear(); @@ -430,7 +444,7 @@ HRESULT CCodecs::Load() } #ifdef EXTERNAL_CODECS const CSysString baseFolder = GetBaseFolderPrefixFromRegistry(); - RINOK(LoadDll(baseFolder + kMainDll)); + RINOK(LoadDll(baseFolder + kMainDll, false)); RINOK(LoadDllsFromFolder(baseFolder + kCodecsFolderName TEXT(STRING_PATH_SEPARATOR))); RINOK(LoadDllsFromFolder(baseFolder + kFormatsFolderName TEXT(STRING_PATH_SEPARATOR))); #endif diff --git a/CPP/7zip/UI/Common/LoadCodecs.h b/CPP/7zip/UI/Common/LoadCodecs.h index 71de2ff1..a633dd2e 100755 --- a/CPP/7zip/UI/Common/LoadCodecs.h +++ b/CPP/7zip/UI/Common/LoadCodecs.h @@ -102,21 +102,31 @@ typedef UInt32 (WINAPI *GetMethodPropertyFunc)(UInt32 index, PROPID propID, PROP typedef UInt32 (WINAPI *CreateObjectFunc)(const GUID *clsID, const GUID *interfaceID, void **outObject); +#ifdef NEW_FOLDER_INTERFACE +struct CCodecIcons +{ + struct CIconPair + { + UString Ext; + int IconIndex; + }; + CObjectVector<CIconPair> IconPairs; + void LoadIcons(HMODULE m); + bool FindIconIndex(const UString &ext, int &iconIndex) const; +}; +#endif + struct CCodecLib +#ifdef NEW_FOLDER_INTERFACE +: public CCodecIcons +#endif { NWindows::NDLL::CLibrary Lib; GetMethodPropertyFunc GetMethodProperty; CreateObjectFunc CreateObject; #ifdef NEW_FOLDER_INTERFACE - struct CIconPair - { - UString Ext; - UInt32 IconIndex; - }; CSysString Path; - CObjectVector<CIconPair> IconPairs; - void LoadIcons(); - int FindIconIndex(const UString &ext) const; + void LoadIcons() { CCodecIcons::LoadIcons((HMODULE)Lib); } #endif CCodecLib(): GetMethodProperty(0) {} }; @@ -134,9 +144,14 @@ public: #ifdef EXTERNAL_CODECS CObjectVector<CCodecLib> Libs; CObjectVector<CDllCodecInfo> Codecs; + + #ifdef NEW_FOLDER_INTERFACE + CCodecIcons InternalIcons; + #endif + HRESULT LoadCodecs(); HRESULT LoadFormats(); - HRESULT LoadDll(const CSysString &path); + HRESULT LoadDll(const CSysString &path, bool needCheckDll); HRESULT LoadDllsFromFolder(const CSysString &folderPrefix); HRESULT CreateArchiveHandler(const CArcInfoEx &ai, void **archive, bool outHandler) const diff --git a/CPP/7zip/UI/Common/OpenArchive.cpp b/CPP/7zip/UI/Common/OpenArchive.cpp index ec9f9a45..90c39de9 100755 --- a/CPP/7zip/UI/Common/OpenArchive.cpp +++ b/CPP/7zip/UI/Common/OpenArchive.cpp @@ -94,6 +94,15 @@ static inline bool TestSignature(const Byte *p1, const Byte *p2, size_t size) } #endif +#ifdef UNDER_CE +static const int kNumHashBytes = 1; +#define HASH_VAL(buf, pos) ((buf)[pos]) +#else +static const int kNumHashBytes = 2; +#define HASH_VAL(buf, pos) ((buf)[pos] | ((UInt32)(buf)[pos + 1] << 8)) +#endif + + HRESULT CArc::OpenStream( CCodecs *codecs, int formatIndex, @@ -144,30 +153,33 @@ HRESULT CArc::OpenStream( return S_FALSE; const Byte *buf = byteBuffer; - Byte hash[1 << 16]; - memset(hash, 0xFF, 1 << 16); + CByteBuffer hashBuffer; + const UInt32 kNumVals = 1 << (kNumHashBytes * 8); + hashBuffer.SetCapacity(kNumVals); + Byte *hash = hashBuffer; + memset(hash, 0xFF, kNumVals); Byte prevs[256]; - if (orderIndices.Size() > 255) + if (orderIndices.Size() >= 256) return S_FALSE; int i; for (i = 0; i < orderIndices.Size(); i++) { const CArcInfoEx &ai = codecs->Formats[orderIndices[i]]; const CByteBuffer &sig = ai.StartSignature; - if (sig.GetCapacity() < 2) + if (sig.GetCapacity() < kNumHashBytes) continue; - UInt32 v = sig[0] | ((UInt32)sig[1] << 8); + UInt32 v = HASH_VAL(sig, 0); prevs[i] = hash[v]; hash[v] = (Byte)i; } - processedSize--; + processedSize -= (kNumHashBytes - 1); for (UInt32 pos = 0; pos < processedSize; pos++) { - for (; pos < processedSize && hash[buf[pos] | ((UInt32)buf[pos + 1] << 8)] == 0xFF; pos++); + for (; pos < processedSize && hash[HASH_VAL(buf, pos)] == 0xFF; pos++); if (pos == processedSize) break; - UInt32 v = buf[pos] | ((UInt32)buf[pos + 1] << 8); + UInt32 v = HASH_VAL(buf, pos); Byte *ptr = &hash[v]; int i = *ptr; do @@ -175,14 +187,15 @@ HRESULT CArc::OpenStream( int index = orderIndices[i]; const CArcInfoEx &ai = codecs->Formats[index]; const CByteBuffer &sig = ai.StartSignature; - if (sig.GetCapacity() != 0 && pos + sig.GetCapacity() <= processedSize + 1) - if (TestSignature(buf + pos, sig, sig.GetCapacity())) - { - orderIndices2.Add(index); - orderIndices[i] = 0xFF; - *ptr = prevs[i]; - } - ptr = &prevs[i]; + if (sig.GetCapacity() != 0 && pos + sig.GetCapacity() <= processedSize + (kNumHashBytes - 1) && + TestSignature(buf + pos, sig, sig.GetCapacity())) + { + orderIndices2.Add(index); + orderIndices[i] = 0xFF; + *ptr = prevs[i]; + } + else + ptr = &prevs[i]; i = *ptr; } while (i != 0xFF); @@ -323,6 +336,15 @@ HRESULT CArc::OpenStreamOrFile( stream = fileStream; } + /* + if (callback) + { + UInt64 fileSize; + RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize)); + RINOK(callback->SetTotal(NULL, &fileSize)) + } + */ + return OpenStream(codecs, formatIndex, stream, seqStream, callback); } diff --git a/CPP/7zip/UI/Common/Update.cpp b/CPP/7zip/UI/Common/Update.cpp index 8c8db8de..4ed6049d 100755 --- a/CPP/7zip/UI/Common/Update.cpp +++ b/CPP/7zip/UI/Common/Update.cpp @@ -439,7 +439,7 @@ static HRESULT Compress( { errorInfo.SystemError = ::GetLastError(); errorInfo.FileName = realPath; - errorInfo.Message = L"Can not open file"; + errorInfo.Message = L"7-Zip cannot open file"; return E_FAIL; } } @@ -472,7 +472,7 @@ static HRESULT Compress( if (!sfxStreamSpec->Open(sfxModule)) { errorInfo.SystemError = ::GetLastError(); - errorInfo.Message = L"Can't open sfx module"; + errorInfo.Message = L"7-Zip cannot open SFX module"; errorInfo.FileName = sfxModule; return E_FAIL; } @@ -490,7 +490,7 @@ static HRESULT Compress( { errorInfo.SystemError = ::GetLastError(); errorInfo.FileName = realPath; - errorInfo.Message = L"Can not open file"; + errorInfo.Message = L"7-Zip cannot open file"; return E_FAIL; } } @@ -606,17 +606,14 @@ static HRESULT UpdateWithItemLists( return S_OK; } -#ifdef _WIN32 +#if defined(_WIN32) && !defined(UNDER_CE) class CCurrentDirRestorer { - UString m_CurrentDirectory; + UString _path; public: - CCurrentDirRestorer() - { NFile::NDirectory::MyGetCurrentDirectory(m_CurrentDirectory); } - ~CCurrentDirRestorer() - { RestoreDirectory();} - bool RestoreDirectory() - { return BOOLToBool(NFile::NDirectory::MySetCurrentDirectory(m_CurrentDirectory)); } + CCurrentDirRestorer() { NFile::NDirectory::MyGetCurrentDirectory(_path); } + ~CCurrentDirRestorer() { RestoreDirectory();} + bool RestoreDirectory() { return BOOLToBool(NFile::NDirectory::MySetCurrentDirectory(_path)); } }; #endif @@ -662,13 +659,19 @@ HRESULT UpdateArchive( options.MethodMode.Properties.Add(property); if (options.SfxModule.IsEmpty()) { - errorInfo.Message = L"sfx file is not specified"; + errorInfo.Message = L"SFX file is not specified"; return E_FAIL; } UString name = options.SfxModule; + #ifdef UNDER_CE + if (!NFind::DoesFileExist(name)) + #else if (!NDirectory::MySearchPath(NULL, name, NULL, options.SfxModule)) + #endif { - errorInfo.Message = L"can't find specified sfx module"; + errorInfo.SystemError = ::GetLastError(); + errorInfo.Message = L"7-Zip cannot find specified SFX module"; + errorInfo.FileName = name; return E_FAIL; } } @@ -744,7 +747,6 @@ HRESULT UpdateArchive( { if (res != E_ABORT) errorInfo.Message = L"Scanning error"; - // errorInfo.FileName = errorPath; return res; } RINOK(callback->FinishScanning()); @@ -804,7 +806,7 @@ HRESULT UpdateArchive( if (NFind::DoesFileOrDirExist(path)) { errorInfo.SystemError = 0; - errorInfo.Message = L"File already exists"; + errorInfo.Message = L"The file already exists"; errorInfo.FileName = path; return E_FAIL; } @@ -839,14 +841,14 @@ HRESULT UpdateArchive( if (!NDirectory::DeleteFileAlways(archiveName)) { errorInfo.SystemError = ::GetLastError(); - errorInfo.Message = L"delete file error"; + errorInfo.Message = L"7-Zip cannot delete the file"; errorInfo.FileName = archiveName; return E_FAIL; } if (!NDirectory::MyMoveFile(tempPath, archiveName)) { errorInfo.SystemError = ::GetLastError(); - errorInfo.Message = L"move file error"; + errorInfo.Message = L"7-Zip cannot move the file"; errorInfo.FileName = tempPath; errorInfo.FileName2 = archiveName; return E_FAIL; @@ -858,22 +860,21 @@ HRESULT UpdateArchive( } } - #ifdef _WIN32 + #if defined(_WIN32) && !defined(UNDER_CE) if (options.EMailMode) { NDLL::CLibrary mapiLib; if (!mapiLib.Load(TEXT("Mapi32.dll"))) { errorInfo.SystemError = ::GetLastError(); - errorInfo.Message = L"can not load Mapi32.dll"; + errorInfo.Message = L"7-Zip cannot load Mapi32.dll"; return E_FAIL; } - MY_LPMAPISENDDOCUMENTS fnSend = (MY_LPMAPISENDDOCUMENTS) - mapiLib.GetProcAddress("MAPISendDocuments"); + MY_LPMAPISENDDOCUMENTS fnSend = (MY_LPMAPISENDDOCUMENTS)mapiLib.GetProc("MAPISendDocuments"); if (fnSend == 0) { errorInfo.SystemError = ::GetLastError(); - errorInfo.Message = L"can not find MAPISendDocuments function"; + errorInfo.Message = L"7-Zip cannot find MAPISendDocuments function"; return E_FAIL; } UStringVector fullPaths; @@ -885,6 +886,7 @@ HRESULT UpdateArchive( if (!NFile::NDirectory::MyGetFullPathName(ap.GetFinalPath(), arcPath)) { errorInfo.SystemError = ::GetLastError(); + errorInfo.Message = L"GetFullPathName error"; return E_FAIL; } fullPaths.Add(arcPath); diff --git a/CPP/7zip/UI/Common/Update.h b/CPP/7zip/UI/Common/Update.h index 46547bf9..b5dc21cf 100755 --- a/CPP/7zip/UI/Common/Update.h +++ b/CPP/7zip/UI/Common/Update.h @@ -122,6 +122,15 @@ struct CUpdateOptions EMailRemoveAfter(false), OpenShareForWrite(false) {}; + + void SetAddActionCommand() + { + Commands.Clear(); + CUpdateArchiveCommand c; + c.ActionSet = NUpdateArchive::kAddActionSet; + Commands.Add(c); + } + CRecordVector<UInt64> VolumesSizes; }; diff --git a/CPP/7zip/UI/Common/WorkDir.cpp b/CPP/7zip/UI/Common/WorkDir.cpp index e97275b1..164118e2 100755 --- a/CPP/7zip/UI/Common/WorkDir.cpp +++ b/CPP/7zip/UI/Common/WorkDir.cpp @@ -2,31 +2,28 @@ #include "StdAfx.h" -#include "WorkDir.h" - #include "Common/StringConvert.h" #include "Common/Wildcard.h" -#include "Windows/FileName.h" #include "Windows/FileDir.h" +#include "Windows/FileName.h" -static inline UINT GetCurrentCodePage() - { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } +#include "WorkDir.h" using namespace NWindows; using namespace NFile; -using namespace NName; UString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path) { NWorkDir::NMode::EEnum mode = workDirInfo.Mode; + #ifndef UNDER_CE if (workDirInfo.ForRemovableOnly) { mode = NWorkDir::NMode::kCurrent; UString prefix = path.Left(3); if (prefix[1] == L':' && prefix[2] == L'\\') { - UINT driveType = GetDriveType(GetSystemString(prefix, GetCurrentCodePage())); + UINT driveType = GetDriveType(GetSystemString(prefix, ::AreFileApisANSI() ? CP_ACP : CP_OEMCP)); if (driveType == DRIVE_CDROM || driveType == DRIVE_REMOVABLE) mode = workDirInfo.Mode; } @@ -38,6 +35,7 @@ UString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path) mode = NZipSettings::NWorkDir::NMode::kCurrent; */ } + #endif switch(mode) { case NWorkDir::NMode::kCurrent: @@ -47,18 +45,15 @@ UString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path) case NWorkDir::NMode::kSpecified: { UString tempDir = workDirInfo.Path; - NormalizeDirPathPrefix(tempDir); + NName::NormalizeDirPathPrefix(tempDir); return tempDir; } default: { UString tempDir; - if(!NFile::NDirectory::MyGetTempPath(tempDir)) + if (!NDirectory::MyGetTempPath(tempDir)) throw 141717; return tempDir; } } } - - - diff --git a/CPP/7zip/UI/Common/ZipRegistry.cpp b/CPP/7zip/UI/Common/ZipRegistry.cpp index 16df878f..ac178078 100755 --- a/CPP/7zip/UI/Common/ZipRegistry.cpp +++ b/CPP/7zip/UI/Common/ZipRegistry.cpp @@ -2,142 +2,101 @@ #include "StdAfx.h" -#include "ZipRegistry.h" - #include "Common/IntToString.h" #include "Common/StringConvert.h" -#include "Windows/Synchronization.h" +#include "Windows/FileDir.h" #include "Windows/Registry.h" +#include "Windows/Synchronization.h" -#include "Windows/FileDir.h" +#include "ZipRegistry.h" using namespace NWindows; using namespace NRegistry; -static const TCHAR *kCUBasePath = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-ZIP"); +static NSynchronization::CCriticalSection g_CS; +#define CS_LOCK NSynchronization::CCriticalSectionLock lock(g_CS); -static NSynchronization::CCriticalSection g_RegistryOperationsCriticalSection; +static const TCHAR *kCuPrefix = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") TEXT(STRING_PATH_SEPARATOR); -////////////////////// -// ExtractionInfo +static CSysString GetKeyPath(const CSysString &path) { return kCuPrefix + path; } -static const TCHAR *kExtractionKeyName = TEXT("Extraction"); - -static const TCHAR *kExtractionPathHistoryKeyName = TEXT("PathHistory"); -static const TCHAR *kExtractionExtractModeValueName = TEXT("ExtarctMode"); -static const TCHAR *kExtractionOverwriteModeValueName = TEXT("OverwriteMode"); -static const TCHAR *kExtractionShowPasswordValueName = TEXT("ShowPassword"); +static LONG OpenMainKey(CKey &key, LPCTSTR keyName) +{ + return key.Open(HKEY_CURRENT_USER, GetKeyPath(keyName), KEY_READ); +} -static CSysString GetKeyPath(const CSysString &path) +static LONG CreateMainKey(CKey &key, LPCTSTR keyName) { - return CSysString(kCUBasePath) + CSysString(CHAR_PATH_SEPARATOR) + path; + return key.Create(HKEY_CURRENT_USER, GetKeyPath(keyName)); } -void SaveExtractionInfo(const NExtract::CInfo &info) +namespace NExtract { - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey extractionKey; - extractionKey.Create(HKEY_CURRENT_USER, GetKeyPath(kExtractionKeyName)); - extractionKey.RecurseDeleteKey(kExtractionPathHistoryKeyName); - { - CKey pathHistoryKey; - pathHistoryKey.Create(extractionKey, kExtractionPathHistoryKeyName); - for(int i = 0; i < info.Paths.Size(); i++) - { - wchar_t numberString[16]; - ConvertUInt32ToString(i, numberString); - pathHistoryKey.SetValue(numberString, info.Paths[i]); - } - } - extractionKey.SetValue(kExtractionExtractModeValueName, UInt32(info.PathMode)); - extractionKey.SetValue(kExtractionOverwriteModeValueName, UInt32(info.OverwriteMode)); - extractionKey.SetValue(kExtractionShowPasswordValueName, info.ShowPassword); + +static const TCHAR *kKeyName = TEXT("Extraction"); + +static const TCHAR *kExtractMode = TEXT("ExtractMode"); +static const TCHAR *kOverwriteMode = TEXT("OverwriteMode"); +static const TCHAR *kShowPassword = TEXT("ShowPassword"); +static const TCHAR *kPathHistory = TEXT("PathHistory"); + +void CInfo::Save() const +{ + CS_LOCK + CKey key; + CreateMainKey(key, kKeyName); + key.SetValue(kExtractMode, (UInt32)PathMode); + key.SetValue(kOverwriteMode, (UInt32)OverwriteMode); + key.SetValue(kShowPassword, ShowPassword); + key.RecurseDeleteKey(kPathHistory); + key.SetValue_Strings(kPathHistory, Paths); } -void ReadExtractionInfo(NExtract::CInfo &info) + +void CInfo::Load() { - info.Paths.Clear(); - info.PathMode = NExtract::NPathMode::kCurrentPathnames; - info.OverwriteMode = NExtract::NOverwriteMode::kAskBefore; - info.ShowPassword = false; - - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey extractionKey; - if(extractionKey.Open(HKEY_CURRENT_USER, GetKeyPath(kExtractionKeyName), KEY_READ) != ERROR_SUCCESS) + PathMode = NPathMode::kCurrentPathnames; + OverwriteMode = NOverwriteMode::kAskBefore; + ShowPassword = false; + Paths.Clear(); + + CS_LOCK + CKey key; + if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS) return; - { - CKey pathHistoryKey; - if(pathHistoryKey.Open(extractionKey, kExtractionPathHistoryKeyName, KEY_READ) == - ERROR_SUCCESS) - { - for (;;) - { - wchar_t numberString[16]; - ConvertUInt32ToString(info.Paths.Size(), numberString); - UString path; - if (pathHistoryKey.QueryValue(numberString, path) != ERROR_SUCCESS) - break; - info.Paths.Add(path); - } - } - } - UInt32 extractModeIndex; - if (extractionKey.QueryValue(kExtractionExtractModeValueName, extractModeIndex) == ERROR_SUCCESS) - { - switch (extractModeIndex) - { - case NExtract::NPathMode::kFullPathnames: - case NExtract::NPathMode::kCurrentPathnames: - case NExtract::NPathMode::kNoPathnames: - info.PathMode = NExtract::NPathMode::EEnum(extractModeIndex); - break; - } - } - UInt32 overwriteModeIndex; - if (extractionKey.QueryValue(kExtractionOverwriteModeValueName, overwriteModeIndex) == ERROR_SUCCESS) - { - switch (overwriteModeIndex) - { - case NExtract::NOverwriteMode::kAskBefore: - case NExtract::NOverwriteMode::kWithoutPrompt: - case NExtract::NOverwriteMode::kSkipExisting: - case NExtract::NOverwriteMode::kAutoRename: - case NExtract::NOverwriteMode::kAutoRenameExisting: - info.OverwriteMode = NExtract::NOverwriteMode::EEnum(overwriteModeIndex); - break; - } - } - if (extractionKey.QueryValue(kExtractionShowPasswordValueName, - info.ShowPassword) != ERROR_SUCCESS) - info.ShowPassword = false; + key.GetValue_Strings(kPathHistory, Paths); + UInt32 v; + if (key.QueryValue(kExtractMode, v) == ERROR_SUCCESS && v <= NPathMode::kNoPathnames) + PathMode = (NPathMode::EEnum)v; + if (key.QueryValue(kOverwriteMode, v) == ERROR_SUCCESS && v <= NOverwriteMode::kAutoRenameExisting) + OverwriteMode = (NOverwriteMode::EEnum)v; + key.GetValue_IfOk(kShowPassword, ShowPassword); } -/////////////////////////////////// -// CompressionInfo +} -static const TCHAR *kCompressionKeyName = TEXT("Compression"); +namespace NCompression +{ -static const TCHAR *kCompressionHistoryArchivesKeyName = TEXT("ArcHistory"); -static const TCHAR *kCompressionLevelValueName = TEXT("Level"); -static const TCHAR *kCompressionLastFormatValueName = TEXT("Archiver"); -static const TCHAR *kCompressionShowPasswordValueName = TEXT("ShowPassword"); -static const TCHAR *kCompressionEncryptHeadersValueName = TEXT("EncryptHeaders"); +static const TCHAR *kKeyName = TEXT("Compression"); -static const TCHAR *kCompressionOptionsKeyName = TEXT("Options"); -// static const TCHAR *kSolid = TEXT("Solid"); -// static const TCHAR *kMultiThread = TEXT("Multithread"); +static const TCHAR *kArcHistory = TEXT("ArcHistory"); +static const WCHAR *kArchiver = L"Archiver"; +static const TCHAR *kShowPassword = TEXT("ShowPassword"); +static const TCHAR *kEncryptHeaders = TEXT("EncryptHeaders"); -static const WCHAR *kCompressionOptions = L"Options"; -static const TCHAR *kCompressionLevel = TEXT("Level"); -static const WCHAR *kCompressionMethod = L"Method"; -static const WCHAR *kEncryptionMethod = L"EncryptionMethod"; -static const TCHAR *kCompressionDictionary = TEXT("Dictionary"); -static const TCHAR *kCompressionOrder = TEXT("Order"); -static const TCHAR *kCompressionNumThreads = TEXT("NumThreads"); -static const TCHAR *kCompressionBlockSize = TEXT("BlockSize"); +static const TCHAR *kOptionsKeyName = TEXT("Options"); +static const TCHAR *kLevel = TEXT("Level"); +static const TCHAR *kDictionary = TEXT("Dictionary"); +static const TCHAR *kOrder = TEXT("Order"); +static const TCHAR *kBlockSize = TEXT("BlockSize"); +static const TCHAR *kNumThreads = TEXT("NumThreads"); +static const WCHAR *kMethod = L"Method"; +static const WCHAR *kOptions = L"Options"; +static const WCHAR *kEncryptionMethod = L"EncryptionMethod"; static void SetRegString(CKey &key, const WCHAR *name, const UString &value) { @@ -164,254 +123,171 @@ static void GetRegString(CKey &key, const WCHAR *name, UString &value) static void GetRegUInt32(CKey &key, const TCHAR *name, UInt32 &value) { if (key.QueryValue(name, value) != ERROR_SUCCESS) - value = UInt32(-1); + value = (UInt32)-1; } -void SaveCompressionInfo(const NCompression::CInfo &info) +void CInfo::Save() const { - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - - CKey compressionKey; - compressionKey.Create(HKEY_CURRENT_USER, GetKeyPath(kCompressionKeyName)); - compressionKey.RecurseDeleteKey(kCompressionHistoryArchivesKeyName); - { - CKey historyArchivesKey; - historyArchivesKey.Create(compressionKey, kCompressionHistoryArchivesKeyName); - for(int i = 0; i < info.HistoryArchives.Size(); i++) - { - wchar_t numberString[16]; - ConvertUInt32ToString(i, numberString); - historyArchivesKey.SetValue(numberString, info.HistoryArchives[i]); - } - } - - // compressionKey.SetValue(kSolid, info.Solid); - // compressionKey.SetValue(kMultiThread, info.MultiThread); - compressionKey.RecurseDeleteKey(kCompressionOptionsKeyName); + CS_LOCK + + CKey key; + CreateMainKey(key, kKeyName); + key.SetValue(kLevel, (UInt32)Level); + key.SetValue(kArchiver, ArcType); + key.SetValue(kShowPassword, ShowPassword); + key.SetValue(kEncryptHeaders, EncryptHeaders); + key.RecurseDeleteKey(kArcHistory); + key.SetValue_Strings(kArcHistory, ArcPaths); + + key.RecurseDeleteKey(kOptionsKeyName); { CKey optionsKey; - optionsKey.Create(compressionKey, kCompressionOptionsKeyName); - for(int i = 0; i < info.FormatOptionsVector.Size(); i++) + optionsKey.Create(key, kOptionsKeyName); + for (int i = 0; i < Formats.Size(); i++) { - const NCompression::CFormatOptions &fo = info.FormatOptionsVector[i]; - CKey formatKey; - formatKey.Create(optionsKey, fo.FormatID); + const CFormatOptions &fo = Formats[i]; + CKey fk; + fk.Create(optionsKey, fo.FormatID); - SetRegString(formatKey, kCompressionOptions, fo.Options); - SetRegString(formatKey, kCompressionMethod, fo.Method); - SetRegString(formatKey, kEncryptionMethod, fo.EncryptionMethod); - - SetRegUInt32(formatKey, kCompressionLevel, fo.Level); - SetRegUInt32(formatKey, kCompressionDictionary, fo.Dictionary); - SetRegUInt32(formatKey, kCompressionOrder, fo.Order); - SetRegUInt32(formatKey, kCompressionBlockSize, fo.BlockLogSize); - SetRegUInt32(formatKey, kCompressionNumThreads, fo.NumThreads); + SetRegUInt32(fk, kLevel, fo.Level); + SetRegUInt32(fk, kDictionary, fo.Dictionary); + SetRegUInt32(fk, kOrder, fo.Order); + SetRegUInt32(fk, kBlockSize, fo.BlockLogSize); + SetRegUInt32(fk, kNumThreads, fo.NumThreads); + + SetRegString(fk, kMethod, fo.Method); + SetRegString(fk, kOptions, fo.Options); + SetRegString(fk, kEncryptionMethod, fo.EncryptionMethod); } } - - compressionKey.SetValue(kCompressionLevelValueName, UInt32(info.Level)); - compressionKey.SetValue(kCompressionLastFormatValueName, GetSystemString(info.ArchiveType)); - - compressionKey.SetValue(kCompressionShowPasswordValueName, info.ShowPassword); - compressionKey.SetValue(kCompressionEncryptHeadersValueName, info.EncryptHeaders); - // compressionKey.SetValue(kCompressionMaximizeValueName, info.Maximize); } -void ReadCompressionInfo(NCompression::CInfo &info) +void CInfo::Load() { - info.HistoryArchives.Clear(); + ArcPaths.Clear(); + Formats.Clear(); - // info.Solid = true; - // info.MultiThread = IsMultiProcessor(); - info.FormatOptionsVector.Clear(); + Level = 5; + ArcType = L"7z"; + ShowPassword = false; + EncryptHeaders = false; - info.Level = 5; - info.ArchiveType = L"7z"; - // definedStatus.Maximize = false; - info.ShowPassword = false; - info.EncryptHeaders = false; + CS_LOCK + CKey key; - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey compressionKey; - - if(compressionKey.Open(HKEY_CURRENT_USER, - GetKeyPath(kCompressionKeyName), KEY_READ) != ERROR_SUCCESS) + if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS) return; - - { - CKey historyArchivesKey; - if(historyArchivesKey.Open(compressionKey, kCompressionHistoryArchivesKeyName, KEY_READ) == - ERROR_SUCCESS) - { - for (;;) - { - wchar_t numberString[16]; - ConvertUInt32ToString(info.HistoryArchives.Size(), numberString); - UString path; - if (historyArchivesKey.QueryValue(numberString, path) != ERROR_SUCCESS) - break; - info.HistoryArchives.Add(path); - } - } - } + key.GetValue_Strings(kArcHistory, ArcPaths); - /* - bool solid = false; - if (compressionKey.QueryValue(kSolid, solid) == ERROR_SUCCESS) - info.Solid = solid; - bool multiThread = false; - if (compressionKey.QueryValue(kMultiThread, multiThread) == ERROR_SUCCESS) - info.MultiThread = multiThread; - */ - { CKey optionsKey; - if(optionsKey.Open(compressionKey, kCompressionOptionsKeyName, KEY_READ) == - ERROR_SUCCESS) + if (optionsKey.Open(key, kOptionsKeyName, KEY_READ) == ERROR_SUCCESS) { CSysStringVector formatIDs; optionsKey.EnumKeys(formatIDs); - for(int i = 0; i < formatIDs.Size(); i++) + for (int i = 0; i < formatIDs.Size(); i++) { - CKey formatKey; - NCompression::CFormatOptions fo; + CKey fk; + CFormatOptions fo; fo.FormatID = formatIDs[i]; - if(formatKey.Open(optionsKey, fo.FormatID, KEY_READ) == ERROR_SUCCESS) + if (fk.Open(optionsKey, fo.FormatID, KEY_READ) == ERROR_SUCCESS) { - GetRegString(formatKey, kCompressionOptions, fo.Options); - GetRegString(formatKey, kCompressionMethod, fo.Method); - GetRegString(formatKey, kEncryptionMethod, fo.EncryptionMethod); + GetRegString(fk, kOptions, fo.Options); + GetRegString(fk, kMethod, fo.Method); + GetRegString(fk, kEncryptionMethod, fo.EncryptionMethod); - GetRegUInt32(formatKey, kCompressionLevel, fo.Level); - GetRegUInt32(formatKey, kCompressionDictionary, fo.Dictionary); - GetRegUInt32(formatKey, kCompressionOrder, fo.Order); - GetRegUInt32(formatKey, kCompressionBlockSize, fo.BlockLogSize); - GetRegUInt32(formatKey, kCompressionNumThreads, fo.NumThreads); + GetRegUInt32(fk, kLevel, fo.Level); + GetRegUInt32(fk, kDictionary, fo.Dictionary); + GetRegUInt32(fk, kOrder, fo.Order); + GetRegUInt32(fk, kBlockSize, fo.BlockLogSize); + GetRegUInt32(fk, kNumThreads, fo.NumThreads); - info.FormatOptionsVector.Add(fo); + Formats.Add(fo); } - } } } - UInt32 level; - if (compressionKey.QueryValue(kCompressionLevelValueName, level) == ERROR_SUCCESS) - info.Level = level; - CSysString archiveType; - if (compressionKey.QueryValue(kCompressionLastFormatValueName, archiveType) == ERROR_SUCCESS) - info.ArchiveType = GetUnicodeString(archiveType); - if (compressionKey.QueryValue(kCompressionShowPasswordValueName, - info.ShowPassword) != ERROR_SUCCESS) - info.ShowPassword = false; - if (compressionKey.QueryValue(kCompressionEncryptHeadersValueName, - info.EncryptHeaders) != ERROR_SUCCESS) - info.EncryptHeaders = false; - /* - if (compressionKey.QueryValue(kCompressionLevelValueName, info.Maximize) == ERROR_SUCCESS) - definedStatus.Maximize = true; - */ + UString a; + if (key.QueryValue(kArchiver, a) == ERROR_SUCCESS) + ArcType = a; + key.GetValue_IfOk(kLevel, Level); + key.GetValue_IfOk(kShowPassword, ShowPassword); + key.GetValue_IfOk(kEncryptHeaders, EncryptHeaders); } - -/////////////////////////////////// -// WorkDirInfo +} static const TCHAR *kOptionsInfoKeyName = TEXT("Options"); -static const TCHAR *kWorkDirTypeValueName = TEXT("WorkDirType"); -static const WCHAR *kWorkDirPathValueName = L"WorkDirPath"; -static const TCHAR *kTempRemovableOnlyValueName = TEXT("TempRemovableOnly"); -static const TCHAR *kCascadedMenuValueName = TEXT("CascadedMenu"); -static const TCHAR *kContextMenuValueName = TEXT("ContextMenu"); +namespace NWorkDir +{ +static const TCHAR *kWorkDirType = TEXT("WorkDirType"); +static const WCHAR *kWorkDirPath = L"WorkDirPath"; +static const TCHAR *kTempRemovableOnly = TEXT("TempRemovableOnly"); + -void SaveWorkDirInfo(const NWorkDir::CInfo &info) +void CInfo::Save()const { - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey optionsKey; - optionsKey.Create(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName)); - optionsKey.SetValue(kWorkDirTypeValueName, UInt32(info.Mode)); - optionsKey.SetValue(kWorkDirPathValueName, info.Path); - optionsKey.SetValue(kTempRemovableOnlyValueName, info.ForRemovableOnly); + CS_LOCK + CKey key; + CreateMainKey(key, kOptionsInfoKeyName); + key.SetValue(kWorkDirType, (UInt32)Mode); + key.SetValue(kWorkDirPath, Path); + key.SetValue(kTempRemovableOnly, ForRemovableOnly); } -void ReadWorkDirInfo(NWorkDir::CInfo &info) +void CInfo::Load() { - info.SetDefault(); + SetDefault(); - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey optionsKey; - if(optionsKey.Open(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName), KEY_READ) != ERROR_SUCCESS) + CS_LOCK + CKey key; + if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS) return; UInt32 dirType; - if (optionsKey.QueryValue(kWorkDirTypeValueName, dirType) != ERROR_SUCCESS) + if (key.QueryValue(kWorkDirType, dirType) != ERROR_SUCCESS) return; switch (dirType) { - case NWorkDir::NMode::kSystem: - case NWorkDir::NMode::kCurrent: - case NWorkDir::NMode::kSpecified: - info.Mode = NWorkDir::NMode::EEnum(dirType); + case NMode::kSystem: + case NMode::kCurrent: + case NMode::kSpecified: + Mode = (NMode::EEnum)dirType; } - UString sysWorkDir; - if (optionsKey.QueryValue(kWorkDirPathValueName, sysWorkDir) != ERROR_SUCCESS) + if (key.QueryValue(kWorkDirPath, Path) != ERROR_SUCCESS) { - info.Path.Empty(); - if (info.Mode == NWorkDir::NMode::kSpecified) - info.Mode = NWorkDir::NMode::kSystem; + Path.Empty(); + if (Mode == NMode::kSpecified) + Mode = NMode::kSystem; } - info.Path = GetUnicodeString(sysWorkDir); - if (optionsKey.QueryValue(kTempRemovableOnlyValueName, info.ForRemovableOnly) != ERROR_SUCCESS) - info.SetForRemovableOnlyDefault(); + key.GetValue_IfOk(kTempRemovableOnly, ForRemovableOnly); } -static void SaveOption(const TCHAR *value, bool enabled) -{ - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey optionsKey; - optionsKey.Create(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName)); - optionsKey.SetValue(value, enabled); -} - -static bool ReadOption(const TCHAR *value, bool defaultValue) -{ - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey optionsKey; - if(optionsKey.Open(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName), KEY_READ) != ERROR_SUCCESS) - return defaultValue; - bool enabled; - if (optionsKey.QueryValue(value, enabled) != ERROR_SUCCESS) - return defaultValue; - return enabled; } -void SaveCascadedMenu(bool show) - { SaveOption(kCascadedMenuValueName, show); } -bool ReadCascadedMenu() - { return ReadOption(kCascadedMenuValueName, true); } +static const TCHAR *kCascadedMenu = TEXT("CascadedMenu"); +static const TCHAR *kContextMenu = TEXT("ContextMenu"); - -static void SaveValue(const TCHAR *value, UInt32 valueToWrite) +void CContextMenuInfo::Save() const { - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey optionsKey; - optionsKey.Create(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName)); - optionsKey.SetValue(value, valueToWrite); + CS_LOCK + CKey key; + CreateMainKey(key, kOptionsInfoKeyName); + key.SetValue(kCascadedMenu, Cascaded); + key.SetValue(kContextMenu, Flags); } -static bool ReadValue(const TCHAR *value, UInt32 &result) +void CContextMenuInfo::Load() { - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - CKey optionsKey; - if(optionsKey.Open(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName), KEY_READ) != ERROR_SUCCESS) - return false; - return (optionsKey.QueryValue(value, result) == ERROR_SUCCESS); + Cascaded = true; + Flags = (UInt32)-1; + CS_LOCK + CKey key; + if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS) + return; + key.GetValue_IfOk(kCascadedMenu, Cascaded); + key.GetValue_IfOk(kContextMenu, Flags); } - -void SaveContextMenuStatus(UInt32 value) - { SaveValue(kContextMenuValueName, value); } - -bool ReadContextMenuStatus(UInt32 &value) - { return ReadValue(kContextMenuValueName, value); } diff --git a/CPP/7zip/UI/Common/ZipRegistry.h b/CPP/7zip/UI/Common/ZipRegistry.h index 30be8d89..37835386 100755 --- a/CPP/7zip/UI/Common/ZipRegistry.h +++ b/CPP/7zip/UI/Common/ZipRegistry.h @@ -1,10 +1,11 @@ // ZipRegistry.h -#ifndef __ZIPREGISTRY_H -#define __ZIPREGISTRY_H +#ifndef __ZIP_REGISTRY_H +#define __ZIP_REGISTRY_H #include "Common/MyString.h" #include "Common/Types.h" + #include "ExtractMode.h" namespace NExtract @@ -13,49 +14,56 @@ namespace NExtract { NPathMode::EEnum PathMode; NOverwriteMode::EEnum OverwriteMode; - UStringVector Paths; bool ShowPassword; + UStringVector Paths; + + void Save() const; + void Load(); }; } -namespace NCompression { - +namespace NCompression +{ struct CFormatOptions { - CSysString FormatID; - UString Options; - UString Method; - UString EncryptionMethod; UInt32 Level; UInt32 Dictionary; UInt32 Order; UInt32 BlockLogSize; UInt32 NumThreads; + + CSysString FormatID; + UString Method; + UString Options; + UString EncryptionMethod; + void ResetForLevelChange() { BlockLogSize = NumThreads = Level = Dictionary = Order = UInt32(-1); Method.Empty(); - // EncryptionMethod.Empty(); // Options.Empty(); + // EncryptionMethod.Empty(); } CFormatOptions() { ResetForLevelChange(); } }; struct CInfo { - UStringVector HistoryArchives; UInt32 Level; - UString ArchiveType; - - CObjectVector<CFormatOptions> FormatOptionsVector; - bool ShowPassword; bool EncryptHeaders; + UString ArcType; + UStringVector ArcPaths; + + CObjectVector<CFormatOptions> Formats; + + void Save() const; + void Load(); }; } -namespace NWorkDir{ - +namespace NWorkDir +{ namespace NMode { enum EEnum @@ -70,6 +78,7 @@ namespace NWorkDir{ NMode::EEnum Mode; UString Path; bool ForRemovableOnly; + void SetForRemovableOnlyDefault() { ForRemovableOnly = true; } void SetDefault() { @@ -77,22 +86,20 @@ namespace NWorkDir{ Path.Empty(); SetForRemovableOnlyDefault(); } + + void Save() const; + void Load(); }; } -void SaveExtractionInfo(const NExtract::CInfo &info); -void ReadExtractionInfo(NExtract::CInfo &info); -void SaveCompressionInfo(const NCompression::CInfo &info); -void ReadCompressionInfo(NCompression::CInfo &info); - -void SaveWorkDirInfo(const NWorkDir::CInfo &info); -void ReadWorkDirInfo(NWorkDir::CInfo &info); - -void SaveCascadedMenu(bool enabled); -bool ReadCascadedMenu(); +struct CContextMenuInfo +{ + bool Cascaded; + UInt32 Flags; -void SaveContextMenuStatus(UInt32 value); -bool ReadContextMenuStatus(UInt32 &value); + void Save() const; + void Load(); +}; #endif diff --git a/CPP/7zip/UI/Console/Console.dsp b/CPP/7zip/UI/Console/Console.dsp index c6aeefed..05d15e65 100755 --- a/CPP/7zip/UI/Console/Console.dsp +++ b/CPP/7zip/UI/Console/Console.dsp @@ -284,6 +284,10 @@ SOURCE=..\..\..\Windows\MemoryLock.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\NtCheck.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\PropVariant.cpp # End Source File # Begin Source File diff --git a/CPP/7zip/UI/Console/ConsoleClose.cpp b/CPP/7zip/UI/Console/ConsoleClose.cpp index d18b39e6..f1356a28 100755 --- a/CPP/7zip/UI/Console/ConsoleClose.cpp +++ b/CPP/7zip/UI/Console/ConsoleClose.cpp @@ -9,6 +9,7 @@ static const int kBreakAbortThreshold = 2; namespace NConsoleClose { +#ifndef UNDER_CE static BOOL WINAPI HandlerRoutine(DWORD ctrlType) { if (ctrlType == CTRL_LOGOFF_EVENT) @@ -32,14 +33,19 @@ static BOOL WINAPI HandlerRoutine(DWORD ctrlType) return FALSE; */ } +#endif bool TestBreakSignal() { + #ifdef UNDER_CE + return false; + #else /* if (g_BreakCounter > 0) return true; */ return (g_BreakCounter > 0); + #endif } void CheckCtrlBreak() @@ -50,14 +56,18 @@ void CheckCtrlBreak() CCtrlHandlerSetter::CCtrlHandlerSetter() { + #ifndef UNDER_CE if(!SetConsoleCtrlHandler(HandlerRoutine, TRUE)) throw "SetConsoleCtrlHandler fails"; + #endif } CCtrlHandlerSetter::~CCtrlHandlerSetter() { + #ifndef UNDER_CE if(!SetConsoleCtrlHandler(HandlerRoutine, FALSE)) throw "SetConsoleCtrlHandler fails"; + #endif } } diff --git a/CPP/7zip/UI/Console/List.cpp b/CPP/7zip/UI/Console/List.cpp index 4352bc71..f0f5c315 100755 --- a/CPP/7zip/UI/Console/List.cpp +++ b/CPP/7zip/UI/Console/List.cpp @@ -433,6 +433,7 @@ HRESULT ListArchives(CCodecs *codecs, const CIntVector &formatIndices, for (int i = 0; i < numArcs; i++) { const UString &archiveName = arcPaths[i]; + UInt64 arcPackSize = 0; if (!stdInMode) { NFile::NFind::CFileInfoW fi; @@ -442,6 +443,7 @@ HRESULT ListArchives(CCodecs *codecs, const CIntVector &formatIndices, numErrors++; continue; } + arcPackSize = fi.Size; } CArchiveLink archiveLink; @@ -583,6 +585,14 @@ HRESULT ListArchives(CCodecs *codecs, const CIntVector &formatIndices, totalPackSize += packSize; totalUnPackSize += unpackSize; } + + if (!stdInMode && totalPackSizePointer == 0) + { + if (archiveLink.VolumePaths.Size() != 0) + arcPackSize += archiveLink.VolumesSize; + totalPackSize = arcPackSize; + totalPackSizePointer = &totalPackSize; + } if (enableHeaders && !techMode) { fieldPrinter.PrintTitleLines(); diff --git a/CPP/7zip/UI/Console/Main.cpp b/CPP/7zip/UI/Console/Main.cpp index 368a9667..c8327361 100755 --- a/CPP/7zip/UI/Console/Main.cpp +++ b/CPP/7zip/UI/Console/Main.cpp @@ -2,6 +2,10 @@ #include "StdAfx.h" +#if defined( _WIN32) && defined( _7ZIP_LARGE_PAGES) +#include "../../../../C/Alloc.h" +#endif + #include "Common/MyInitGuid.h" #include "Common/CommandLineParser.h" @@ -11,17 +15,11 @@ #include "Common/StringConvert.h" #include "Common/StringToInt.h" -#include "Windows/Defs.h" #include "Windows/Error.h" -#include "Windows/FileDir.h" -#include "Windows/FileName.h" #ifdef _WIN32 #include "Windows/MemoryLock.h" #endif -#include "../../ICoder.h" -#include "../../IPassword.h" - #include "../Common/ArchiveCommandLine.h" #include "../Common/ExitCode.h" #include "../Common/Extract.h" @@ -29,8 +27,6 @@ #include "../Common/LoadCodecs.h" #endif #include "../Common/PropIDUtils.h" -#include "../Common/Update.h" -#include "../Common/UpdateAction.h" #include "../../Compress/LZMA_Alone/LzmaBenchCon.h" @@ -41,10 +37,6 @@ #include "../../MyVersion.h" -#if defined( _WIN32) && defined( _7ZIP_LARGE_PAGES) -#include "../../../../C/Alloc.h" -#endif - using namespace NWindows; using namespace NFile; using namespace NCommandLineParser; @@ -117,8 +109,9 @@ static const char *kHelpString = // exception messages static const char *kEverythingIsOk = "Everything is Ok"; -static const char *kUserErrorMessage = "Incorrect command line"; // NExitCode::kUserError +static const char *kUserErrorMessage = "Incorrect command line"; static const char *kNoFormats = "7-Zip cannot find the code that works with archives."; +static const char *kUnsupportedArcTypeMessage = "Unsupported archive type"; static const wchar_t *kDefaultSfxModule = L"7zCon.sfx"; @@ -128,19 +121,19 @@ static void ShowMessageAndThrowException(CStdOutStream &s, LPCSTR message, NExit throw code; } -static void PrintHelpAndExit(CStdOutStream &s) // yyy +static void PrintHelpAndExit(CStdOutStream &s) { s << kHelpString; ShowMessageAndThrowException(s, kUserErrorMessage, NExitCode::kUserError); } #ifndef _WIN32 -static void GetArguments(int numArguments, const char *arguments[], UStringVector &parts) +static void GetArguments(int numArgs, const char *args[], UStringVector &parts) { parts.Clear(); - for(int i = 0; i < numArguments; i++) + for (int i = 0; i < numArgs; i++) { - UString s = MultiByteToUnicodeString(arguments[i]); + UString s = MultiByteToUnicodeString(args[i]); parts.Add(s); } } @@ -177,15 +170,13 @@ 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 - int numArguments, const char *arguments[] + int numArgs, const char *args[] #endif ) { - #ifdef _WIN32 + #if defined(_WIN32) && !defined(UNDER_CE) SetFileApisToOEM(); #endif @@ -193,7 +184,7 @@ int Main2( #ifdef _WIN32 NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings); #else - GetArguments(numArguments, arguments, commandStrings); + GetArguments(numArgs, args, commandStrings); #endif if (commandStrings.Size() == 1) diff --git a/CPP/7zip/UI/Console/MainAr.cpp b/CPP/7zip/UI/Console/MainAr.cpp index 02918d79..c54a3d09 100755 --- a/CPP/7zip/UI/Console/MainAr.cpp +++ b/CPP/7zip/UI/Console/MainAr.cpp @@ -2,85 +2,54 @@ #include "StdAfx.h" -// #include <locale.h> +#include "Common/MyException.h" +#include "Common/StdOutStream.h" #include "Windows/Error.h" +#include "Windows/NtCheck.h" -#include "Common/StdOutStream.h" -#include "Common/NewHandler.h" -#include "Common/MyException.h" -#include "Common/StringConvert.h" - -#include "../Common/ExitCode.h" #include "../Common/ArchiveCommandLine.h" +#include "../Common/ExitCode.h" + #include "ConsoleClose.h" using namespace NWindows; CStdOutStream *g_StdStream = 0; -#ifdef _WIN32 -#ifndef _UNICODE -bool g_IsNT = false; -#endif -#if !defined(_UNICODE) || !defined(_WIN64) -static inline bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} -#endif -#endif - extern int Main2( #ifndef _WIN32 - int numArguments, const char *arguments[] + int numArgs, const char *args[] #endif ); static const char *kExceptionErrorMessage = "\n\nError:\n"; static const char *kUserBreak = "\nBreak signaled\n"; - static const char *kMemoryExceptionMessage = "\n\nERROR: Can't allocate required memory!\n"; static const char *kUnknownExceptionMessage = "\n\nUnknown Error\n"; static const char *kInternalExceptionMessage = "\n\nInternal Error #"; +#define NT_CHECK_FAIL_ACTION (*g_StdStream) << "Unsupported Windows version"; return NExitCode::kFatalError; + int MY_CDECL main ( -#ifndef _WIN32 -int numArguments, const char *arguments[] -#endif + #ifndef _WIN32 + int numArgs, const char *args[] + #endif ) { g_StdStream = &g_StdOut; - #ifdef _WIN32 - - #ifdef _UNICODE - #ifndef _WIN64 - if (!IsItWindowsNT()) - { - (*g_StdStream) << "This program requires Windows NT/2000/2003/2008/XP/Vista"; - return NExitCode::kFatalError; - } - #endif - #else - g_IsNT = IsItWindowsNT(); - #endif - - #endif - // setlocale(LC_COLLATE, ".OCP"); + NT_CHECK + NConsoleClose::CCtrlHandlerSetter ctrlHandlerSetter; int res = 0; try { res = Main2( -#ifndef _WIN32 - numArguments, arguments -#endif + #ifndef _WIN32 + numArgs, args + #endif ); } catch(const CNewException &) @@ -112,8 +81,7 @@ int numArguments, const char *arguments[] } UString message; NError::MyFormatMessage(systemError.ErrorCode, message); - (*g_StdStream) << endl << endl << "System error:" << endl << - message << endl; + (*g_StdStream) << endl << endl << "System error:" << endl << message << endl; return (NExitCode::kFatalError); } catch(NExitCode::EEnum &exitCode) diff --git a/CPP/7zip/UI/Console/UserInputUtils.cpp b/CPP/7zip/UI/Console/UserInputUtils.cpp index 798486e7..0e55a868 100755 --- a/CPP/7zip/UI/Console/UserInputUtils.cpp +++ b/CPP/7zip/UI/Console/UserInputUtils.cpp @@ -23,13 +23,18 @@ static const char *kHelpQuestionMessage = NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream) { (*outStream) << kFirstQuestionMessage; - for(;;) + for (;;) { (*outStream) << kHelpQuestionMessage; AString scannedString = g_StdIn.ScanStringUntilNewLine(); scannedString.Trim(); - if(!scannedString.IsEmpty()) - switch(::MyCharUpper(scannedString[0])) + if (!scannedString.IsEmpty()) + switch( + ::MyCharUpper( + #ifdef UNDER_CE + (wchar_t) + #endif + scannedString[0])) { case kYes: return NUserAnswerMode::kYes; diff --git a/CPP/7zip/UI/Console/makefile b/CPP/7zip/UI/Console/makefile index a0d56615..467651ca 100755 --- a/CPP/7zip/UI/Console/makefile +++ b/CPP/7zip/UI/Console/makefile @@ -1,14 +1,16 @@ PROG = 7z.exe -LIBS = $(LIBS) user32.lib oleaut32.lib advapi32.lib +MY_CONSOLE = 1 CFLAGS = $(CFLAGS) -I ../../../ \ -DCOMPRESS_MT \ - -DWIN_LONG_PATH \ -DEXTERNAL_LZMA \ -DEXTERNAL_CODECS \ -DBREAK_HANDLER \ -DBENCH_MT \ - -D_7ZIP_LARGE_PAGES \ - -DSUPPORT_DEVICE_FILE \ + +!IFNDEF UNDER_CE +CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -D_7ZIP_LARGE_PAGES -DSUPPORT_DEVICE_FILE +!ENDIF + CONSOLE_OBJS = \ $O\ConsoleClose.obj \ diff --git a/CPP/7zip/UI/Explorer/ContextMenu.cpp b/CPP/7zip/UI/Explorer/ContextMenu.cpp index efe8ad44..d8fd0e56 100755 --- a/CPP/7zip/UI/Explorer/ContextMenu.cpp +++ b/CPP/7zip/UI/Explorer/ContextMenu.cpp @@ -11,6 +11,7 @@ #include "Windows/FileFind.h" #include "Windows/Memory.h" #include "Windows/Menu.h" +#include "Windows/Process.h" #include "Windows/Shell.h" #include "../Common/ArchiveName.h" @@ -32,8 +33,10 @@ using namespace NWindows; -/////////////////////////////// -// IShellExtInit + +#ifndef UNDER_CE +#define EMAIL_SUPPORT 1 +#endif extern LONG g_DllRefCount; @@ -42,10 +45,11 @@ CZipContextMenu::~CZipContextMenu() { InterlockedDecrement(&g_DllRefCount); } HRESULT CZipContextMenu::GetFileNames(LPDATAOBJECT dataObject, UStringVector &fileNames) { + #ifndef UNDER_CE fileNames.Clear(); - if(dataObject == NULL) + if (dataObject == NULL) return E_FAIL; - FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; + FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; NCOM::CStgMedium stgMedium; HRESULT result = dataObject->GetData(&fmte, &stgMedium); if (result != S_OK) @@ -56,18 +60,20 @@ HRESULT CZipContextMenu::GetFileNames(LPDATAOBJECT dataObject, UStringVector &fi NMemory::CGlobalLock globalLock(stgMedium->hGlobal); drop.Attach((HDROP)globalLock.GetPointer()); drop.QueryFileNames(fileNames); - + #endif return S_OK; } -STDMETHODIMP CZipContextMenu::Initialize(LPCITEMIDLIST pidlFolder, - LPDATAOBJECT dataObject, HKEY /* hkeyProgID */) +// IShellExtInit + +STDMETHODIMP CZipContextMenu::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT dataObject, HKEY /* hkeyProgID */) { // OutputDebugString(TEXT("::Initialize\r\n")); _dropMode = false; _dropPath.Empty(); if (pidlFolder != 0) { + #ifndef UNDER_CE if (NShell::GetPathFromIDList(pidlFolder, _dropPath)) { // OutputDebugString(path); @@ -76,6 +82,7 @@ STDMETHODIMP CZipContextMenu::Initialize(LPCITEMIDLIST pidlFolder, _dropMode = !_dropPath.IsEmpty(); } else + #endif _dropPath.Empty(); } @@ -225,8 +232,7 @@ int FindCommand(CZipContextMenu::ECommandInternalID &id) return -1; } -void CZipContextMenu::FillCommand(ECommandInternalID id, - UString &mainString, CCommandMapItem &commandMapItem) +void CZipContextMenu::FillCommand(ECommandInternalID id, UString &mainString, CCommandMapItem &commandMapItem) { int i = FindCommand(id); if (i < 0) @@ -299,11 +305,6 @@ static UString GetReducedString(const UString &s) return s.Left(kFirstPartSize) + UString(L" ... ") + s.Right(kMaxSize - kFirstPartSize); } -static UString GetQuotedString(const UString &s) -{ - return UString(L'\"') + s + UString(L'\"'); -} - static UString GetQuotedReducedString(const UString &s) { UString s2 = GetReducedString(s); @@ -335,31 +336,35 @@ static const char *kExtractExludeExtensions = " xml xsd xsl xslt" " "; -static bool DoNeedExtract(const UString &name) +static bool FindExt(const char *p, const UString &name) { int extPos = name.ReverseFind('.'); if (extPos < 0) - return true; + return false; UString ext = name.Mid(extPos + 1); ext.MakeLower(); AString ext2 = UnicodeStringToMultiByte(ext); - const char *p = kExtractExludeExtensions; for (int i = 0; p[i] != 0;) { int j; for (j = i; p[j] != ' '; j++); if (ext2.Length() == j - i && memcmp(p + i, (const char *)ext2, ext2.Length()) == 0) - return false; + return true; i = j + 1; } - return true; + return false; +} + +static bool DoNeedExtract(const UString &name) +{ + return !FindExt(kExtractExludeExtensions, name); } STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT commandIDFirst, UINT commandIDLast, UINT flags) { LoadLangOneTime(); - if(_fileNames.Size() == 0) + if (_fileNames.Size() == 0) return E_FAIL; UINT currentCommandID = commandIDFirst; if ((flags & 0x000F) != CMF_NORMAL && @@ -372,13 +377,14 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, CMenu popupMenu; CMenuDestroyer menuDestroyer; - bool cascadedMenu = ReadCascadedMenu(); + CContextMenuInfo ci; + ci.Load(); MENUITEMINFO menuItem; UINT subIndex = indexMenu; - if (cascadedMenu) + if (ci.Cascaded) { CCommandMapItem commandMapItem; - if(!popupMenu.CreatePopup()) + if (!popupMenu.CreatePopup()) return E_FAIL; menuDestroyer.Attach(popupMenu); commandMapItem.CommandInternalID = kCommandNULL; @@ -394,12 +400,10 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, popupMenu.Attach(hMenu); } - UINT32 contextMenuFlags; - if (!ReadContextMenuStatus(contextMenuFlags)) - contextMenuFlags = NContextMenuFlags::GetDefaultFlags(); + UInt32 contextMenuFlags = ci.Flags; UString mainString; - if(_fileNames.Size() == 1 && currentCommandID + 6 <= commandIDLast) + if (_fileNames.Size() == 1 && currentCommandID + 6 <= commandIDLast) { const UString &fileName = _fileNames.Front(); UString folderPrefix; @@ -417,11 +421,39 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, FillCommand(kOpen, mainString, commandMapItem); MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString); _commandMap.Add(commandMapItem); + + /* + if (FindExt(" exe dll ", fileInfo.Name)) + { + CMenu subMenu; + if (subMenu.CreatePopup()) + { + CMenuItem menuItem; + menuItem.fType = MFT_STRING; + menuItem.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID; + menuItem.wID = currentCommandID++; + menuItem.hSubMenu = subMenu; + menuItem.StringValue = LangString(IDS_CONTEXT_OPEN, 0x02000103); + popupMenu.InsertItem(subIndex++, true, menuItem); + const wchar_t *exts[] = { L"7z", L"cab", L"rar", L"zip", L"pe" }; + for (int i = 0; i < sizeof(exts) / sizeof(exts[0]); i++) + { + CCommandMapItem commandMapItem; + FillCommand(kOpenAs, mainString, commandMapItem); + mainString = exts[i]; + commandMapItem.ArchiveType = mainString; + MyInsertMenu(subMenu, subIndex++, currentCommandID++, mainString); + _commandMap.Add(commandMapItem); + } + subMenu.Detach(); + } + } + */ } } } - if(_fileNames.Size() > 0 && currentCommandID + 10 <= commandIDLast) + if (_fileNames.Size() > 0 && currentCommandID + 10 <= commandIDLast) { bool needExtract = false; for(int i = 0; i < _fileNames.Size(); i++) @@ -516,7 +548,7 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, _commandMap.Add(commandMapItem); } - + #ifdef EMAIL_SUPPORT // CompressEmail if ((contextMenuFlags & NContextMenuFlags::kCompressEmail) != 0 && !_dropMode) { @@ -526,6 +558,7 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString); _commandMap.Add(commandMapItem); } + #endif // CompressTo7z if (contextMenuFlags & NContextMenuFlags::kCompressTo7z) @@ -544,6 +577,7 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, _commandMap.Add(commandMapItem); } + #ifdef EMAIL_SUPPORT // CompressTo7zEmail if ((contextMenuFlags & NContextMenuFlags::kCompressTo7zEmail) != 0 && !_dropMode) { @@ -556,6 +590,7 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s); _commandMap.Add(commandMapItem); } + #endif // CompressToZip if (contextMenuFlags & NContextMenuFlags::kCompressToZip) @@ -574,6 +609,7 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, _commandMap.Add(commandMapItem); } + #ifdef EMAIL_SUPPORT // CompressToZipEmail if ((contextMenuFlags & NContextMenuFlags::kCompressToZipEmail) != 0 && !_dropMode) { @@ -586,6 +622,7 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s); _commandMap.Add(commandMapItem); } + #endif } @@ -593,7 +630,7 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, // PRB: Duplicate Menu Items In the File Menu For a Shell Context Menu Extension // ID: Q214477 - if (cascadedMenu) + if (ci.Cascaded) { CMenuItem menuItem; menuItem.fType = MFT_STRING; @@ -614,21 +651,16 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, int CZipContextMenu::FindVerb(const UString &verb) { for(int i = 0; i < _commandMap.Size(); i++) - if(_commandMap[i].Verb.Compare(verb) == 0) + if (_commandMap[i].Verb.Compare(verb) == 0) return i; return -1; } -extern const char *kShellFolderClassIDString; - - -static UString GetProgramCommand() +static UString Get7zFmPath() { UString path; - UString folder; - if (GetProgramFolderPath(folder)) - path = folder; - return GetQuotedString(path + L"7zFM.exe"); + GetProgramFolderPath(path); + return path + L"7zFM.exe"; } STDMETHODIMP CZipContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO commandInfo) @@ -638,22 +670,24 @@ STDMETHODIMP CZipContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO commandInfo) // It's fix for bug: crashing in XP. See example in MSDN: "Creating Context Menu Handlers". + #ifndef UNDER_CE if (commandInfo->cbSize == sizeof(CMINVOKECOMMANDINFOEX) && (commandInfo->fMask & CMIC_MASK_UNICODE) != 0) { LPCMINVOKECOMMANDINFOEX commandInfoEx = (LPCMINVOKECOMMANDINFOEX)commandInfo; - if(HIWORD(commandInfoEx->lpVerbW) == 0) + if (HIWORD(commandInfoEx->lpVerbW) == 0) commandOffset = LOWORD(commandInfo->lpVerb); else commandOffset = FindVerb(commandInfoEx->lpVerbW); } else - if(HIWORD(commandInfo->lpVerb) == 0) + #endif + if (HIWORD(commandInfo->lpVerb) == 0) commandOffset = LOWORD(commandInfo->lpVerb); else commandOffset = FindVerb(GetUnicodeString(commandInfo->lpVerb)); - if(commandOffset < 0 || commandOffset >= _commandMap.Size()) + if (commandOffset < 0 || commandOffset >= _commandMap.Size()) return E_FAIL; const CCommandMapItem commandMapItem = _commandMap[commandOffset]; @@ -665,19 +699,15 @@ STDMETHODIMP CZipContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO commandInfo) { case kOpen: { - UString params; - params = GetProgramCommand(); - params += L' '; - params += GetQuotedString(_fileNames[0]); - MyCreateProcess(params, 0, false, 0); + UString params = GetQuotedString(_fileNames[0]); + MyCreateProcess(Get7zFmPath(), params); break; } case kExtract: case kExtractHere: case kExtractTo: { - ExtractArchives(_fileNames, commandMapItem.Folder, - (commandInternalID == kExtract)); + ExtractArchives(_fileNames, commandMapItem.Folder, (commandInternalID == kExtract)); break; } case kTest: @@ -708,19 +738,19 @@ STDMETHODIMP CZipContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO commandInfo) } catch(...) { - ShowErrorMessageRes(IDS_ERROR, 0x02000605); + ::MessageBoxW(0, L"Error", L"7-Zip", MB_ICONERROR); } return S_OK; } static void MyCopyString(void *dest, const wchar_t *src, bool writeInUnicode) { - if(writeInUnicode) + if (writeInUnicode) { MyStringCopy((wchar_t *)dest, src); } else - lstrcpyA((char *)dest, GetAnsiString(src)); + MyStringCopy((char *)dest, (const char *)GetAnsiString(src)); } STDMETHODIMP CZipContextMenu::GetCommandString(UINT_PTR commandOffset, UINT uType, @@ -729,23 +759,47 @@ STDMETHODIMP CZipContextMenu::GetCommandString(UINT_PTR commandOffset, UINT uTyp int cmdOffset = (int)commandOffset; switch(uType) { + #ifdef UNDER_CE + case GCS_VALIDATE: + #else case GCS_VALIDATEA: case GCS_VALIDATEW: - if(cmdOffset < 0 || cmdOffset >= _commandMap.Size()) + #endif + if (cmdOffset < 0 || cmdOffset >= _commandMap.Size()) return S_FALSE; else return S_OK; } - if(cmdOffset < 0 || cmdOffset >= _commandMap.Size()) + if (cmdOffset < 0 || cmdOffset >= _commandMap.Size()) return E_FAIL; - if(uType == GCS_HELPTEXTA || uType == GCS_HELPTEXTW) + #ifdef UNDER_CE + if (uType == GCS_HELPTEXT) + #else + if (uType == GCS_HELPTEXTA || uType == GCS_HELPTEXTW) + #endif { - MyCopyString(pszName, _commandMap[cmdOffset].HelpString, uType == GCS_HELPTEXTW); + MyCopyString(pszName, _commandMap[cmdOffset].HelpString, + #ifdef UNDER_CE + true + #else + uType == GCS_HELPTEXTW + #endif + ); return NO_ERROR; } - if(uType == GCS_VERBA || uType == GCS_VERBW) + #ifdef UNDER_CE + if (uType == GCS_VERB) + #else + if (uType == GCS_VERBA || uType == GCS_VERBW) + #endif { - MyCopyString(pszName, _commandMap[cmdOffset].Verb, uType == GCS_VERBW); + MyCopyString(pszName, _commandMap[cmdOffset].Verb, + #ifdef UNDER_CE + true + #else + uType == GCS_VERBW + #endif + ); return NO_ERROR; } return E_FAIL; diff --git a/CPP/7zip/UI/Explorer/ContextMenu.h b/CPP/7zip/UI/Explorer/ContextMenu.h index be9f9167..e0ee6376 100755 --- a/CPP/7zip/UI/Explorer/ContextMenu.h +++ b/CPP/7zip/UI/Explorer/ContextMenu.h @@ -1,7 +1,7 @@ // ContextMenu.h -#ifndef __CONTEXTMENU_H -#define __CONTEXTMENU_H +#ifndef __CONTEXT_MENU_H +#define __CONTEXT_MENU_H // {23170F69-40C1-278A-1000-000100020000} DEFINE_GUID(CLSID_CZipContextMenu, @@ -19,7 +19,6 @@ class CZipContextMenu: public IInitContextMenu, public CMyUnknownImp { - public: enum ECommandInternalID @@ -50,21 +49,13 @@ public: MY_UNKNOWN_IMP3_MT(IContextMenu, IShellExtInit, IInitContextMenu) - /////////////////////////////// // IShellExtInit + STDMETHOD(Initialize)(LPCITEMIDLIST pidlFolder, LPDATAOBJECT dataObject, HKEY hkeyProgID); - STDMETHOD(Initialize)(LPCITEMIDLIST pidlFolder, - LPDATAOBJECT dataObject, HKEY hkeyProgID); - - ///////////////////////////// // IContextMenu - - STDMETHOD(QueryContextMenu)(HMENU hmenu, UINT indexMenu, - UINT idCmdFirst, UINT idCmdLast, UINT uFlags); + STDMETHOD(QueryContextMenu)(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO lpici); - STDMETHOD(GetCommandString)(UINT_PTR idCmd, UINT uType, UINT *pwReserved, - LPSTR pszName, UINT cchMax); - + STDMETHOD(GetCommandString)(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax); // IInitContextMenu STDMETHOD(InitContextMenu)(const wchar_t *folder, const wchar_t **names, UINT32 numFiles); @@ -73,11 +64,12 @@ private: bool _dropMode; UString _dropPath; CObjectVector<CCommandMapItem> _commandMap; + HRESULT GetFileNames(LPDATAOBJECT dataObject, UStringVector &fileNames); + int FindVerb(const UString &verb); - void FillCommand(ECommandInternalID id, UString &mainString, - CCommandMapItem &commandMapItem); + void FillCommand(ECommandInternalID id, UString &mainString, CCommandMapItem &commandMapItem); public: CZipContextMenu(); ~CZipContextMenu(); diff --git a/CPP/7zip/UI/Explorer/DllExports.cpp b/CPP/7zip/UI/Explorer/DllExports.cpp index 6fed7cda..5004c1ac 100755 --- a/CPP/7zip/UI/Explorer/DllExports.cpp +++ b/CPP/7zip/UI/Explorer/DllExports.cpp @@ -8,30 +8,38 @@ #include "StdAfx.h" -// #include <locale.h> +#include "Common/MyInitGuid.h" -#include <initguid.h> -#include <windows.h> #include <ShlGuid.h> #include <OleCtl.h> #include "Common/ComTry.h" #include "Common/StringConvert.h" + #include "Windows/DLL.h" +#include "Windows/Error.h" +#include "Windows/NtCheck.h" #include "Windows/Registry.h" -#include "../FileManager/LangUtils.h" #include "../FileManager/IFolder.h" +#include "../FileManager/LangUtils.h" #include "ContextMenu.h" -#include "OptionsDialog.h" using namespace NWindows; -HINSTANCE g_hInstance; -#ifndef _UNICODE -bool g_IsNT = false; -#endif +HINSTANCE g_hInstance = 0; +HWND g_HWND = 0; + +UString HResultToMessage(HRESULT errorCode) +{ + UString message; + if (!NError::MyFormatMessage(errorCode, message)) + message.Empty(); + if (message.IsEmpty()) + message = L"Error"; + return message; +} LONG g_DllRefCount = 0; // Reference count of this DLL. @@ -85,29 +93,23 @@ STDMETHODIMP CShellExtClassFactory::LockServer(BOOL /* fLock */) return S_OK; // Check it } -static bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} + +#define NT_CHECK_FAIL_ACTION return FALSE; extern "C" -BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) +BOOL WINAPI DllMain( + #ifdef UNDER_CE + HANDLE hInstance + #else + HINSTANCE hInstance + #endif + , DWORD dwReason, LPVOID) { - // setlocale(LC_COLLATE, ".ACP"); if (dwReason == DLL_PROCESS_ATTACH) { - g_hInstance = hInstance; + g_hInstance = (HINSTANCE)hInstance; // ODS("In DLLMain, DLL_PROCESS_ATTACH\r\n"); - #ifdef _UNICODE - if (!IsItWindowsNT()) - return FALSE; - #else - g_IsNT = IsItWindowsNT(); - #endif + NT_CHECK } else if (dwReason == DLL_PROCESS_DETACH) { @@ -153,10 +155,16 @@ static BOOL GetStringFromIID(CLSID clsid, LPTSTR s, int size) LPWSTR pwsz; if (StringFromIID(clsid, &pwsz) != S_OK) return FALSE; - if(!pwsz) + if (!pwsz) return FALSE; #ifdef UNICODE - lstrcpyn(s, pwsz, size); + for (int i = 0; i < size; i++) + { + s[i] = pwsz[i]; + if (pwsz[i] == 0) + break; + } + s[size - 1] = 0; #else WideCharToMultiByte(CP_ACP, 0, pwsz, -1, s, size, NULL, NULL); #endif @@ -192,18 +200,20 @@ static BOOL RegisterServer(CLSID clsid, LPCWSTR title) }; //register the CLSID entries - for(int i = 0; clsidEntries[i].hRootKey; i++) + for (int i = 0; clsidEntries[i].hRootKey; i++) { TCHAR subKey[MAX_PATH]; - wsprintf(subKey, clsidEntries[i].SubKey, clsidString); + const CRegItem &r = clsidEntries[i]; + wsprintf(subKey, r.SubKey, clsidString); NRegistry::CKey key; - if (key.Create(clsidEntries[i].hRootKey, subKey, NULL, - REG_OPTION_NON_VOLATILE, KEY_WRITE) != NOERROR) + if (key.Create(r.hRootKey, subKey, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE) != NOERROR) return FALSE; key.SetValue(clsidEntries[i].ValueName, clsidEntries[i].Data); } - if(IsItWindowsNT()) + #if !defined(_WIN64) && !defined(UNDER_CE) + if (IsItWindowsNT()) + #endif { NRegistry::CKey key; if (key.Create(HKEY_LOCAL_MACHINE, kApprovedKeyPath, NULL, @@ -231,7 +241,9 @@ static BOOL UnregisterServer(CLSID clsid) wsprintf (subKey, kClsidMask, clsidString); RegDeleteKey(HKEY_CLASSES_ROOT, subKey); - if(IsItWindowsNT()) + #if !defined(_WIN64) && !defined(UNDER_CE) + if (IsItWindowsNT()) + #endif { HKEY hKey; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, kApprovedKeyPath, 0, KEY_SET_VALUE, &hKey) == NOERROR) @@ -247,45 +259,3 @@ STDAPI DllUnregisterServer(void) { return UnregisterServer(CLSID_CZipContextMenu) ? S_OK: SELFREG_E_CLASS; } - -STDAPI CreateObject( - const GUID *classID, - const GUID *interfaceID, - void **outObject) -{ - LoadLangOneTime(); - COM_TRY_BEGIN - *outObject = 0; - if (*classID == CLSID_CSevenZipOptions) - { - if (*interfaceID == IID_IPluginOptions) - { - CMyComPtr<IPluginOptions> options = new CSevenZipOptions; - *outObject = options.Detach(); - return S_OK; - } - return E_NOINTERFACE; - } - return CLASS_E_CLASSNOTAVAILABLE; - COM_TRY_END -} - -STDAPI GetPluginProperty(PROPID propID, PROPVARIANT *value) -{ - ::VariantClear((tagVARIANT *)value); - switch(propID) - { - case NPlugin::kName: - if ((value->bstrVal = ::SysAllocString(L"7-Zip")) != 0) - value->vt = VT_BSTR; - return S_OK; - case NPlugin::kOptionsClassID: - { - if ((value->bstrVal = ::SysAllocStringByteLen( - (const char *)&CLSID_CSevenZipOptions, sizeof(GUID))) != 0) - value->vt = VT_BSTR; - return S_OK; - } - } - return S_OK; -} diff --git a/CPP/7zip/UI/Explorer/Explorer.def b/CPP/7zip/UI/Explorer/Explorer.def index 752fbb7a..034a269d 100755 --- a/CPP/7zip/UI/Explorer/Explorer.def +++ b/CPP/7zip/UI/Explorer/Explorer.def @@ -7,6 +7,3 @@ EXPORTS DllGetClassObject PRIVATE DllRegisterServer PRIVATE DllUnregisterServer PRIVATE - - CreateObject PRIVATE - GetPluginProperty PRIVATE diff --git a/CPP/7zip/UI/Explorer/Explorer.dsp b/CPP/7zip/UI/Explorer/Explorer.dsp index 832a153a..158390bb 100755 --- a/CPP/7zip/UI/Explorer/Explorer.dsp +++ b/CPP/7zip/UI/Explorer/Explorer.dsp @@ -233,34 +233,6 @@ SOURCE=.\MyMessages.cpp SOURCE=.\MyMessages.h # End Source File # End Group -# Begin Group "Dialogs" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\FoldersPage.cpp -# End Source File -# Begin Source File - -SOURCE=.\FoldersPage.h -# End Source File -# Begin Source File - -SOURCE=.\FoldersPageRes.h -# End Source File -# Begin Source File - -SOURCE=.\SystemPage.cpp -# End Source File -# Begin Source File - -SOURCE=.\SystemPage.h -# End Source File -# Begin Source File - -SOURCE=.\SystemPageRes.h -# End Source File -# End Group # Begin Group "FileManager" # PROP Default_Filter "" @@ -523,6 +495,14 @@ SOURCE=..\..\..\Windows\Menu.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\Process.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Process.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\Registry.cpp # End Source File # Begin Source File @@ -568,14 +548,6 @@ SOURCE=.\ContextMenuFlags.h # End Source File # Begin Source File -SOURCE=.\OptionsDialog.cpp -# End Source File -# Begin Source File - -SOURCE=.\OptionsDialog.h -# End Source File -# Begin Source File - SOURCE=.\RegistryContextMenu.cpp # End Source File # Begin Source File diff --git a/CPP/7zip/UI/Explorer/FoldersPage.rc b/CPP/7zip/UI/Explorer/FoldersPage.rc deleted file mode 100755 index 7b2d4231..00000000 --- a/CPP/7zip/UI/Explorer/FoldersPage.rc +++ /dev/null @@ -1,36 +0,0 @@ -#include "FoldersPageRes.h" -#include "../../GuiCommon.rc" - -#define xSize2 196 -#define ySize2 140 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) - -#define marg2 marg -#define marg3 10 -#define gPos (marg + marg2) -#define gSize (xSize2 - marg2 - marg2) -#define gPos2 (gPos + marg3) - - -IDD_FOLDERS DIALOG 0, 0, xSize, ySize MY_PAGE_STYLE -CAPTION "Folders" -MY_FONT -BEGIN - GROUPBOX "&Working folder", IDC_FOLDERS_STATIC_WORKING_FOLDER, marg, marg, xSize2, 98 - CONTROL "&System temp folder", IDC_FOLDERS_WORK_RADIO_SYSTEM, "Button", BS_AUTORADIOBUTTON | WS_GROUP, - gPos, 20, gSize, 10 - CONTROL "&Current", IDC_FOLDERS_WORK_RADIO_CURRENT, "Button", BS_AUTORADIOBUTTON, - gPos, 34, gSize, 10 - CONTROL "Specified:", IDC_FOLDERS_WORK_RADIO_SPECIFIED, "Button", BS_AUTORADIOBUTTON, - gPos, 48, gSize, 10 - EDITTEXT IDC_FOLDERS_WORK_EDIT_PATH, gPos2, 63, gSize - marg3 - bDotsSize - 10, 14, ES_AUTOHSCROLL - PUSHBUTTON "...", IDC_FOLDERS_WORK_BUTTON_PATH, xSize - marg - marg2 - bDotsSize, 63, bDotsSize, bYSize - CONTROL "Use for removable drives only", IDC_FOLDERS_WORK_CHECK_FOR_REMOVABLE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - gPos, 87, gSize, 10 -END - -STRINGTABLE -BEGIN - IDS_FOLDERS_SET_WORK_PATH_TITLE "Specify a location for temporary archive files." -END diff --git a/CPP/7zip/UI/Explorer/OptionsDialog.cpp b/CPP/7zip/UI/Explorer/OptionsDialog.cpp index b0deaf0d..90a0c0dc 100755 --- a/CPP/7zip/UI/Explorer/OptionsDialog.cpp +++ b/CPP/7zip/UI/Explorer/OptionsDialog.cpp @@ -2,27 +2,29 @@ #include "StdAfx.h" -#include "resource.h" - -#include "OptionsDialog.h" - -#include "Common/StringConvert.h" #include "Windows/Control/PropertyPage.h" +#include "../FileManager/DialogSize.h" #include "../FileManager/LangUtils.h" + #include "FoldersPage.h" #include "FoldersPageRes.h" -#include "SystemPage.h" -#include "SystemPageRes.h" +#include "OptionsDialog.h" +#include "MenuPage.h" +#include "MenuPageRes.h" + +#include "resource.h" using namespace NWindows; static INT_PTR OptionsDialog(HWND hwndOwner) { - CSystemPage systemPage; + CMenuPage systemPage; CFoldersPage foldersPage; UINT32 langIDs[] = { 0x01000300, 0x01000200}; - UINT pageIDs[] = { IDD_SYSTEM, IDD_FOLDERS}; + + BIG_DIALOG_SIZE(200, 200); + UINT pageIDs[] = { SIZED_DIALOG(IDD_MENU), SIZED_DIALOG(IDD_FOLDERS) }; NControl::CPropertyPage *pagePinters[] = { &systemPage, &foldersPage }; CObjectVector<NControl::CPageInfo> pages; const int kNumPages = sizeof(langIDs) / sizeof(langIDs[0]); @@ -43,7 +45,7 @@ STDMETHODIMP CSevenZipOptions::PluginOptions(HWND hWnd, { /* CComBSTR programPath; - RETUEN_IF_NOT_S_OK(callback->GetProgramPath(programName))); + RINOK(callback->GetProgramPath(programName))); */ OptionsDialog(hWnd); return S_OK; @@ -67,5 +69,3 @@ STDMETHODIMP CSevenZipOptions::GetFileExtensions(BSTR * /* extensions */) */ return E_NOTIMPL; } - - diff --git a/CPP/7zip/UI/Explorer/RegistryContextMenu.cpp b/CPP/7zip/UI/Explorer/RegistryContextMenu.cpp index e8e53bb3..656d0bfa 100755 --- a/CPP/7zip/UI/Explorer/RegistryContextMenu.cpp +++ b/CPP/7zip/UI/Explorer/RegistryContextMenu.cpp @@ -2,25 +2,22 @@ #include "StdAfx.h" -#include "RegistryContextMenu.h" -#include "Windows/COM.h" -#include "Windows/Synchronization.h" #include "Windows/Registry.h" -#include "Windows/FileName.h" +#include "Windows/Synchronization.h" + +#include "RegistryContextMenu.h" using namespace NWindows; -using namespace NCOM; using namespace NRegistry; namespace NZipRootRegistry { -static NSynchronization::CCriticalSection g_RegistryOperationsCriticalSection; - -/////////////////////////// -// ContextMenu +#ifndef UNDER_CE -static const TCHAR *kContextMenuKeyName = TEXT("\\shellex\\ContextMenuHandlers\\7-ZIP"); -static const TCHAR *kDragDropMenuKeyName = TEXT("\\shellex\\DragDropHandlers\\7-ZIP"); +static NSynchronization::CCriticalSection g_CS; + +static const TCHAR *kContextMenuKeyName = TEXT("\\shellex\\ContextMenuHandlers\\7-Zip"); +static const TCHAR *kDragDropMenuKeyName = TEXT("\\shellex\\DragDropHandlers\\7-Zip"); static const TCHAR *kExtensionCLSID = TEXT("{23170F69-40C1-278A-1000-000100020000}"); @@ -37,7 +34,7 @@ static CSysString GetFullDragDropMenuKeyName(const CSysString &keyName) static bool CheckHandlerCommon(const CSysString &keyName) { - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; if (key.Open(HKEY_CLASSES_ROOT, keyName, KEY_READ) != ERROR_SUCCESS) return false; @@ -89,7 +86,7 @@ void DeleteContextMenuHandler() static void AddContextMenuHandlerCommon(const CSysString &keyName) { DeleteContextMenuHandlerCommon(keyName); - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; key.Create(HKEY_CLASSES_ROOT, GetFullContextMenuKeyName(keyName)); key.SetValue(NULL, kExtensionCLSID); @@ -98,7 +95,7 @@ static void AddContextMenuHandlerCommon(const CSysString &keyName) static void AddDragDropMenuHandlerCommon(const CSysString &keyName) { DeleteDragDropMenuHandlerCommon(keyName); - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; key.Create(HKEY_CLASSES_ROOT, GetFullDragDropMenuKeyName(keyName)); key.SetValue(NULL, kExtensionCLSID); @@ -114,4 +111,6 @@ void AddContextMenuHandler() AddDragDropMenuHandlerCommon(kRootKeyNameForDrive); } +#endif + } diff --git a/CPP/7zip/UI/Explorer/RegistryContextMenu.h b/CPP/7zip/UI/Explorer/RegistryContextMenu.h index 52b053da..139526a8 100755 --- a/CPP/7zip/UI/Explorer/RegistryContextMenu.h +++ b/CPP/7zip/UI/Explorer/RegistryContextMenu.h @@ -1,13 +1,16 @@ // RegistryContextMenu.h -#ifndef __REGISTRYCONTEXTMENU_H -#define __REGISTRYCONTEXTMENU_H +#ifndef __REGISTRY_CONTEXT_MENU_H +#define __REGISTRY_CONTEXT_MENU_H namespace NZipRootRegistry { +#ifndef UNDER_CE bool CheckContextMenuHandler(); void AddContextMenuHandler(); void DeleteContextMenuHandler(); +#endif + } #endif diff --git a/CPP/7zip/UI/Explorer/StdAfx.h b/CPP/7zip/UI/Explorer/StdAfx.h index d978a3a4..e1fe42f2 100755 --- a/CPP/7zip/UI/Explorer/StdAfx.h +++ b/CPP/7zip/UI/Explorer/StdAfx.h @@ -15,11 +15,9 @@ #include <stddef.h> #include <string.h> -#include <mbstring.h> #include <wchar.h> #include <shlguid.h> -#include <regstr.h> #include "Common/NewHandler.h" diff --git a/CPP/7zip/UI/Explorer/SystemPage.rc b/CPP/7zip/UI/Explorer/SystemPage.rc deleted file mode 100755 index 611fd58b..00000000 --- a/CPP/7zip/UI/Explorer/SystemPage.rc +++ /dev/null @@ -1,24 +0,0 @@ -#include "SystemPageRes.h" -#include "../../GuiCommon.rc" - -#define xSize2 196 -#define ySize2 164 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) - -IDD_SYSTEM DIALOG 0, 0, xSize, ySize MY_PAGE_STYLE -CAPTION "System" -MY_FONT -BEGIN - CONTROL "Integrate 7-Zip to shell context menu", IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, marg, xSize2, 10 - CONTROL "Cascaded context menu", IDC_SYSTEM_CASCADED_MENU, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, 21, xSize2, 10 - LTEXT "Context menu items:", IDC_SYSTEM_STATIC_CONTEXT_MENU_ITEMS, - marg, 37, xSize2, 8 - CONTROL "List1", IDC_SYSTEM_OPTIONS_LIST, "SysListView32", - LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP, - marg, 50, xSize2, ySize - marg - 50 -END diff --git a/CPP/7zip/UI/Explorer/makefile b/CPP/7zip/UI/Explorer/makefile index d9366ffe..89cbc642 100755 --- a/CPP/7zip/UI/Explorer/makefile +++ b/CPP/7zip/UI/Explorer/makefile @@ -1,18 +1,20 @@ PROG = 7-zip.dll DEF_FILE = Explorer.def -LIBS = $(LIBS) user32.lib oleaut32.lib advapi32.lib htmlhelp.lib shell32.lib comctl32.lib ole32.lib comdlg32.lib -CFLAGS = $(CFLAGS) -I ../../../ -Ob2 \ +CFLAGS = $(CFLAGS) -I ../../../ \ -DLANG \ - -DWIN_LONG_PATH \ + +!IFDEF UNDER_CE +LIBS = $(LIBS) Commctrl.lib +!ELSE +LIBS = $(LIBS) comctl32.lib htmlhelp.lib comdlg32.lib Mpr.lib Gdi32.lib +CFLAGS = $(CFLAGS) -DWIN_LONG_PATH +!ENDIF EXPLORER_OBJS = \ $O\DllExports.obj \ $O\ContextMenu.obj \ $O\MyMessages.obj \ - $O\OptionsDialog.obj \ $O\RegistryContextMenu.obj \ - $O\SystemPage.obj \ - $O\FoldersPage.obj \ COMMON_OBJS = \ $O\IntToString.obj \ @@ -35,12 +37,20 @@ WIN_OBJS = \ $O\FileIO.obj \ $O\FileName.obj \ $O\Menu.obj \ + $O\Process.obj \ $O\Registry.obj \ $O\ResourceString.obj \ $O\Shell.obj \ $O\Synchronization.obj \ $O\Window.obj \ +!IFDEF UNDER_CE + +WIN_OBJS = $(WIN_OBJS) \ + $O\CommonDialog.obj \ + +!ENDIF + WIN_CTRL_OBJS = \ $O\Dialog.obj \ $O\ListView.obj \ diff --git a/CPP/7zip/UI/Explorer/resource.h b/CPP/7zip/UI/Explorer/resource.h index 75fa4981..3ddda8f0 100755 --- a/CPP/7zip/UI/Explorer/resource.h +++ b/CPP/7zip/UI/Explorer/resource.h @@ -26,6 +26,3 @@ #define IDS_CONTEXT_FOLDER 170 #define IDS_CONTEXT_ARCHIVE 171 - -#define IDS_ERROR 100 -#define IDS_CONFIG_DIALOG_CAPTION 102 diff --git a/CPP/7zip/UI/Explorer/resource.rc b/CPP/7zip/UI/Explorer/resource.rc index 157fa4cc..80018b45 100755 --- a/CPP/7zip/UI/Explorer/resource.rc +++ b/CPP/7zip/UI/Explorer/resource.rc @@ -1,38 +1,8 @@ #include "../../MyVersionInfo.rc" -#include "resource.h" +#include "resource2.rc" MY_VERSION_INFO_DLL("7-Zip Shell Extension", "7-zip") -1 24 "7-zip.dll.manifest" - -STRINGTABLE -BEGIN - IDS_CONTEXT_EXTRACT "Extract files..." - IDS_CONTEXT_EXTRACT_HELP "Extracts files from the selected archive." - IDS_CONTEXT_COMPRESS "Add to archive..." - IDS_CONTEXT_COMPRESS_HELP "Adds the selected items to archive." - IDS_CONTEXT_OPEN "Open archive" - IDS_CONTEXT_OPEN_HELP "Opens the selected archive." - IDS_CONTEXT_TEST "Test archive" - IDS_CONTEXT_TEST_HELP "Tests integrity of the selected archive." - IDS_CONTEXT_CAPTION_HELP "7-Zip commands" - IDS_CONTEXT_POPUP_CAPTION "7-Zip" - IDS_CONTEXT_EXTRACT_HERE "Extract Here" - IDS_CONTEXT_EXTRACT_HERE_HELP "Extracts files from the selected archive to current folder." - IDS_CONTEXT_EXTRACT_TO "Extract to {0}" - IDS_CONTEXT_EXTRACT_TO_HELP "Extracts files to subfolder." - IDS_CONTEXT_COMPRESS_TO "Add to {0}" - IDS_CONTEXT_COMPRESS_TO_HELP "Adds the selected items to archive." - IDS_CONTEXT_COMPRESS_EMAIL "Compress and email..." - IDS_CONTEXT_COMPRESS_EMAIL_HELP "Compresses the selected items to archive and sends archive via email." - IDS_CONTEXT_COMPRESS_TO_EMAIL "Compress to {0} and email" - IDS_CONTEXT_COMPRESS_TO_EMAIL_HELP "Compresses the selected items to archive and sends archive via email." - IDS_CONTEXT_FOLDER "<Folder>" - IDS_CONTEXT_ARCHIVE "<Archive>" - IDS_ERROR "Error" - IDS_CONFIG_DIALOG_CAPTION "7-Zip Options" -END - -#include "FoldersPage.rc" -#include "SystemPage.rc" - +#ifndef UNDER_CE +1 24 MOVEABLE PURE "7-zip.dll.manifest" +#endif diff --git a/CPP/7zip/UI/Explorer/resource2.rc b/CPP/7zip/UI/Explorer/resource2.rc new file mode 100755 index 00000000..08bc82bf --- /dev/null +++ b/CPP/7zip/UI/Explorer/resource2.rc @@ -0,0 +1,27 @@ +#include "resource.h" + +STRINGTABLE +BEGIN + IDS_CONTEXT_EXTRACT "Extract files..." + IDS_CONTEXT_EXTRACT_HELP "Extracts files from the selected archive." + IDS_CONTEXT_COMPRESS "Add to archive..." + IDS_CONTEXT_COMPRESS_HELP "Adds the selected items to archive." + IDS_CONTEXT_OPEN "Open archive" + IDS_CONTEXT_OPEN_HELP "Opens the selected archive." + IDS_CONTEXT_TEST "Test archive" + IDS_CONTEXT_TEST_HELP "Tests integrity of the selected archive." + IDS_CONTEXT_CAPTION_HELP "7-Zip commands" + IDS_CONTEXT_POPUP_CAPTION "7-Zip" + IDS_CONTEXT_EXTRACT_HERE "Extract Here" + IDS_CONTEXT_EXTRACT_HERE_HELP "Extracts files from the selected archive to current folder." + IDS_CONTEXT_EXTRACT_TO "Extract to {0}" + IDS_CONTEXT_EXTRACT_TO_HELP "Extracts files to subfolder." + IDS_CONTEXT_COMPRESS_TO "Add to {0}" + IDS_CONTEXT_COMPRESS_TO_HELP "Adds the selected items to archive." + IDS_CONTEXT_COMPRESS_EMAIL "Compress and email..." + IDS_CONTEXT_COMPRESS_EMAIL_HELP "Compresses the selected items to archive and sends archive via email." + IDS_CONTEXT_COMPRESS_TO_EMAIL "Compress to {0} and email" + IDS_CONTEXT_COMPRESS_TO_EMAIL_HELP "Compresses the selected items to archive and sends archive via email." + IDS_CONTEXT_FOLDER "<Folder>" + IDS_CONTEXT_ARCHIVE "<Archive>" +END diff --git a/CPP/7zip/UI/Far/FarUtils.cpp b/CPP/7zip/UI/Far/FarUtils.cpp index e06bfe3e..01de0233 100755 --- a/CPP/7zip/UI/Far/FarUtils.cpp +++ b/CPP/7zip/UI/Far/FarUtils.cpp @@ -2,13 +2,13 @@ #include "StdAfx.h" -#include "FarUtils.h" -#include "Common/DynamicBuffer.h" #include "Common/StringConvert.h" -#include "Windows/Defs.h" + #include "Windows/Console.h" #include "Windows/Error.h" +#include "FarUtils.h" + using namespace NWindows; namespace NFar { @@ -16,12 +16,12 @@ namespace NFar { CStartupInfo g_StartupInfo; void CStartupInfo::Init(const PluginStartupInfo &pluginStartupInfo, - const CSysString &pliginNameForRegestry) + const CSysString &pluginNameForRegestry) { m_Data = pluginStartupInfo; - m_RegistryPath = pluginStartupInfo.RootKey; - m_RegistryPath += '\\'; - m_RegistryPath += pliginNameForRegestry; + m_RegistryPath = GetSystemString(pluginStartupInfo.RootKey); + m_RegistryPath += TEXT('\\'); + m_RegistryPath += pluginNameForRegestry; } const char *CStartupInfo::GetMsgString(int messageId) @@ -164,7 +164,7 @@ void CStartupInfo::RestoreScreen(HANDLE handle) m_Data.RestoreScreen(handle); } -const char kRegestryKeyDelimiter = '\''; +const TCHAR kRegestryKeyDelimiter = TEXT('\''); CSysString CStartupInfo::GetFullKeyName(const CSysString &keyName) const { @@ -355,8 +355,8 @@ int CStartupInfo::Menu( item.Checked = 0; item.Separator = 0; item.Selected = (i == selectedItem); - AString reducedString = items[i].Left(sizeof(item.Text) / sizeof(item.Text[0]) - 1); - MyStringCopy(item.Text, (const char *)reducedString); + CSysString reducedString = items[i].Left(sizeof(item.Text) / sizeof(item.Text[0]) - 1); + MyStringCopy(item.Text, (const char *)GetOemString(reducedString)); farMenuItems.Add(item); } return Menu(flags, title, helpTopic, &farMenuItems.Front(), farMenuItems.Size()); @@ -396,7 +396,7 @@ static AString DWORDToString(DWORD number) void PrintErrorMessage(const char *message, int code) { - CSysString tmp = message; + AString tmp = message; tmp += " #"; tmp += DWORDToString(code); g_StartupInfo.ShowMessage(tmp); @@ -404,7 +404,7 @@ void PrintErrorMessage(const char *message, int code) void PrintErrorMessage(const char *message, const char *text) { - CSysString tmp = message; + AString tmp = message; tmp += ":\n"; tmp += text; g_StartupInfo.ShowMessageLines(tmp); @@ -442,10 +442,10 @@ bool WasEscPressed() void ShowErrorMessage(DWORD errorCode) { - AString message; + CSysString message; NError::MyFormatMessage(errorCode, message); - message.Replace("\x0D", ""); - message.Replace("\x0A", " "); + message.Replace(TEXT("\x0D"), TEXT("")); + message.Replace(TEXT("\x0A"), TEXT(" ")); g_StartupInfo.ShowMessage(SystemStringToOemString(message)); } diff --git a/CPP/7zip/UI/Far/FarUtils.h b/CPP/7zip/UI/Far/FarUtils.h index e0126cdc..a4887c9a 100755 --- a/CPP/7zip/UI/Far/FarUtils.h +++ b/CPP/7zip/UI/Far/FarUtils.h @@ -56,7 +56,7 @@ class CStartupInfo public: void Init(const PluginStartupInfo &pluginStartupInfo, - const CSysString &pliginNameForRegestry); + const CSysString &pluginNameForRegestry); const char *GetMsgString(int messageId); int ShowMessage(unsigned int flags, const char *helpTopic, const char **items, int numItems, int numButtons); diff --git a/CPP/7zip/UI/Far/Main.cpp b/CPP/7zip/UI/Far/Main.cpp index 46a16a9f..65aabea6 100755 --- a/CPP/7zip/UI/Far/Main.cpp +++ b/CPP/7zip/UI/Far/Main.cpp @@ -2,89 +2,40 @@ #include "StdAfx.h" -// #include <locale.h> -#include <initguid.h> +#include "Common/MyInitGuid.h" -#include "Plugin.h" - -#include "Common/Wildcard.h" -#include "Common/DynamicBuffer.h" #include "Common/StringConvert.h" -#include "Common/Defs.h" -#include "Windows/FileFind.h" -#include "Windows/FileIO.h" #include "Windows/FileDir.h" -#include "Windows/Defs.h" +#include "Windows/NtCheck.h" -#include "../../IPassword.h" #include "../../Common/FileStreams.h" -#include "../Common/DefaultName.h" -#include "../Common/OpenArchive.h" #include "../Agent/Agent.h" -#include "ProgressBox.h" -#include "FarUtils.h" #include "Messages.h" +#include "Plugin.h" +#include "ProgressBox.h" using namespace NWindows; using namespace NFar; static const char *kCommandPrefix = "7-zip"; - static const char *kRegisrtryMainKeyName = ""; - static const char *kRegisrtryValueNameEnabled = "UsedByDefault3"; -static bool kPluginEnabledDefault = true; - static const char *kHelpTopicConfig = "Config"; - -extern "C" -{ - void WINAPI SetStartupInfo(struct PluginStartupInfo *info); - HANDLE WINAPI OpenFilePlugin(char *name, const unsigned char *Data, - unsigned int DataSize); - HANDLE WINAPI OpenPlugin(int openFrom, int item); - void WINAPI ClosePlugin(HANDLE plugin); - int WINAPI GetFindData(HANDLE plugin, struct PluginPanelItem **panelItems, - int *itemsNumber, int OpMode); - void WINAPI FreeFindData(HANDLE plugin, struct PluginPanelItem *panelItems, - int itemsNumber); - int WINAPI GetFiles(HANDLE plugin, struct PluginPanelItem *panelItems, - int itemsNumber, int move, char *destPath, int opMode); - int WINAPI SetDirectory(HANDLE plugin, char *dir, int opMode); - void WINAPI GetPluginInfo(struct PluginInfo *info); - int WINAPI Configure(int itemNumber); - void WINAPI GetOpenPluginInfo(HANDLE plugin, struct OpenPluginInfo *info); - int WINAPI PutFiles(HANDLE plugin, struct PluginPanelItem *panelItems, - int itemsNumber, int move, int opMode); - int WINAPI DeleteFiles(HANDLE plugin, PluginPanelItem *panelItems, - int itemsNumber, int opMode); - int WINAPI ProcessKey(HANDLE plugin, int key, unsigned int controlState); -}; +static bool kPluginEnabledDefault = true; HINSTANCE g_hInstance; -#ifndef _UNICODE -bool g_IsNT = false; -static bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} -#endif + +#define NT_CHECK_FAIL_ACTION return FALSE; BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) { if (dwReason == DLL_PROCESS_ATTACH) { g_hInstance = hInstance; - #ifndef _UNICODE - g_IsNT = IsItWindowsNT(); - #endif + NT_CHECK } return TRUE; } @@ -96,7 +47,7 @@ static struct COptions static const char *kPliginNameForRegestry = "7-ZIP"; -void WINAPI SetStartupInfo(struct PluginStartupInfo *info) +EXTERN_C void WINAPI SetStartupInfo(struct PluginStartupInfo *info) { MY_TRY_BEGIN; g_StartupInfo.Init(*info, kPliginNameForRegestry); @@ -289,8 +240,7 @@ STDMETHODIMP COpenArchiveCallback::SetCompleted(const UInt64 *completed) return S_OK; } -STDMETHODIMP COpenArchiveCallback::GetStream(const wchar_t *name, - IInStream **inStream) +STDMETHODIMP COpenArchiveCallback::GetStream(const wchar_t *name, IInStream **inStream) { if (WasEscPressed()) return E_ABORT; @@ -443,8 +393,7 @@ static HANDLE MyOpenFilePlugin(const char *name) return (HANDLE)(plugin); } -HANDLE WINAPI OpenFilePlugin(char *name, - const unsigned char * /* data */, unsigned int /* dataSize */) +EXTERN_C HANDLE WINAPI OpenFilePlugin(char *name, const unsigned char * /* data */, unsigned int /* dataSize */) { MY_TRY_BEGIN; if (name == NULL || (!g_Options.Enabled)) @@ -456,7 +405,7 @@ HANDLE WINAPI OpenFilePlugin(char *name, MY_TRY_END2("OpenFilePlugin", INVALID_HANDLE_VALUE); } -HANDLE WINAPI OpenPlugin(int openFrom, int item) +EXTERN_C HANDLE WINAPI OpenPlugin(int openFrom, int item) { MY_TRY_BEGIN; if(openFrom == OPEN_COMMANDLINE) @@ -504,30 +453,28 @@ HANDLE WINAPI OpenPlugin(int openFrom, int item) MY_TRY_END2("OpenPlugin", INVALID_HANDLE_VALUE); } -void WINAPI ClosePlugin(HANDLE plugin) +EXTERN_C void WINAPI ClosePlugin(HANDLE plugin) { MY_TRY_BEGIN; delete (CPlugin *)plugin; MY_TRY_END1("ClosePlugin"); } -int WINAPI GetFindData(HANDLE plugin, struct PluginPanelItem **panelItems, - int *itemsNumber,int opMode) +EXTERN_C int WINAPI GetFindData(HANDLE plugin, struct PluginPanelItem **panelItems, int *itemsNumber, int opMode) { MY_TRY_BEGIN; return(((CPlugin *)plugin)->GetFindData(panelItems, itemsNumber, opMode)); MY_TRY_END2("GetFindData", FALSE); } -void WINAPI FreeFindData(HANDLE plugin, struct PluginPanelItem *panelItems, - int itemsNumber) +EXTERN_C void WINAPI FreeFindData(HANDLE plugin, struct PluginPanelItem *panelItems, int itemsNumber) { MY_TRY_BEGIN; ((CPlugin *)plugin)->FreeFindData(panelItems, itemsNumber); MY_TRY_END1("FreeFindData"); } -int WINAPI GetFiles(HANDLE plugin, struct PluginPanelItem *panelItems, +EXTERN_C int WINAPI GetFiles(HANDLE plugin, struct PluginPanelItem *panelItems, int itemsNumber, int move, char *destPath, int opMode) { MY_TRY_BEGIN; @@ -535,14 +482,14 @@ int WINAPI GetFiles(HANDLE plugin, struct PluginPanelItem *panelItems, MY_TRY_END2("GetFiles", NFileOperationReturnCode::kError); } -int WINAPI SetDirectory(HANDLE plugin, char *dir, int opMode) +EXTERN_C int WINAPI SetDirectory(HANDLE plugin, char *dir, int opMode) { MY_TRY_BEGIN; return(((CPlugin *)plugin)->SetDirectory(dir, opMode)); MY_TRY_END2("SetDirectory", FALSE); } -void WINAPI GetPluginInfo(struct PluginInfo *info) +EXTERN_C void WINAPI GetPluginInfo(struct PluginInfo *info) { MY_TRY_BEGIN; @@ -564,7 +511,7 @@ void WINAPI GetPluginInfo(struct PluginInfo *info) MY_TRY_END1("GetPluginInfo"); } -int WINAPI Configure(int /* itemNumber */) +EXTERN_C int WINAPI Configure(int /* itemNumber */) { MY_TRY_BEGIN; @@ -601,30 +548,28 @@ int WINAPI Configure(int /* itemNumber */) MY_TRY_END2("Configure", FALSE); } -void WINAPI GetOpenPluginInfo(HANDLE plugin,struct OpenPluginInfo *info) +EXTERN_C void WINAPI GetOpenPluginInfo(HANDLE plugin,struct OpenPluginInfo *info) { MY_TRY_BEGIN; ((CPlugin *)plugin)->GetOpenPluginInfo(info); MY_TRY_END1("GetOpenPluginInfo"); } -int WINAPI PutFiles(HANDLE plugin, struct PluginPanelItem *panelItems, - int itemsNumber, int move, int opMode) +EXTERN_C int WINAPI PutFiles(HANDLE plugin, struct PluginPanelItem *panelItems, int itemsNumber, int move, int opMode) { MY_TRY_BEGIN; return(((CPlugin *)plugin)->PutFiles(panelItems, itemsNumber, move, opMode)); MY_TRY_END2("PutFiles", NFileOperationReturnCode::kError); } -int WINAPI DeleteFiles(HANDLE plugin, PluginPanelItem *panelItems, - int itemsNumber, int opMode) +EXTERN_C int WINAPI DeleteFiles(HANDLE plugin, PluginPanelItem *panelItems, int itemsNumber, int opMode) { MY_TRY_BEGIN; return(((CPlugin *)plugin)->DeleteFiles(panelItems, itemsNumber, opMode)); MY_TRY_END2("DeleteFiles", FALSE); } -int WINAPI ProcessKey(HANDLE plugin, int key, unsigned int controlState) +EXTERN_C int WINAPI ProcessKey(HANDLE plugin, int key, unsigned int controlState) { MY_TRY_BEGIN; return (((CPlugin *)plugin)->ProcessKey(key, controlState)); diff --git a/CPP/7zip/UI/Far/Plugin.cpp b/CPP/7zip/UI/Far/Plugin.cpp index c1e45a62..5d9b5cf0 100755 --- a/CPP/7zip/UI/Far/Plugin.cpp +++ b/CPP/7zip/UI/Far/Plugin.cpp @@ -2,40 +2,33 @@ #include "StdAfx.h" -#include "Plugin.h" - #include "Common/IntToString.h" #include "Common/StringConvert.h" #include "Common/Wildcard.h" #include "Windows/FileDir.h" -#include "Windows/FileName.h" #include "Windows/PropVariantConversions.h" #include "../Common/PropIDUtils.h" #include "FarUtils.h" #include "Messages.h" +#include "Plugin.h" using namespace NWindows; using namespace NFar; -CPlugin::CPlugin(const UString &fileName, - IInFolderArchive *archiveHandler, - UString archiveTypeName - ): - m_ArchiveHandler(archiveHandler), - m_FileName(fileName), - _archiveTypeName(archiveTypeName) +CPlugin::CPlugin(const UString &fileName, IInFolderArchive *archiveHandler, UString archiveTypeName): + m_ArchiveHandler(archiveHandler), + m_FileName(fileName), + _archiveTypeName(archiveTypeName) { if (!m_FileInfo.Find(m_FileName)) throw "error"; archiveHandler->BindToRootFolder(&_folder); } -CPlugin::~CPlugin() -{ -} +CPlugin::~CPlugin() {} static void MyGetFileTime(IFolderFolder *anArchiveFolder, UInt32 itemIndex, PROPID propID, FILETIME &fileTime) @@ -59,6 +52,17 @@ static void MyGetFileTime(IFolderFolder *anArchiveFolder, UInt32 itemIndex, #define kDotsReplaceString "[[..]]" #define kDotsReplaceStringU L"[[..]]" +static void CopyStrLimited(char *dest, const AString &src, int len) +{ + len--; + if (src.Length() < len) + len = src.Length(); + memcpy(dest, src, sizeof(dest[0]) * len); + dest[len] = 0; +} + +#define COPY_STR_LIMITED(dest, src) CopyStrLimited(dest, src, sizeof(dest) / sizeof(dest[0])) + void CPlugin::ReadPluginPanelItem(PluginPanelItem &panelItem, UInt32 itemIndex) { NCOM::CPropVariant prop; @@ -69,14 +73,10 @@ void CPlugin::ReadPluginPanelItem(PluginPanelItem &panelItem, UInt32 itemIndex) throw 272340; CSysString oemString = UnicodeStringToMultiByte(prop.bstrVal, CP_OEMCP); - const int kFileNameSizeMax = (int)(sizeof(panelItem.FindData.cFileName) / sizeof(panelItem.FindData.cFileName[0]) - 1); - if (oemString.Length() > kFileNameSizeMax) - oemString = oemString.Left(kFileNameSizeMax); - if (oemString == "..") oemString = kDotsReplaceString; - MyStringCopy(panelItem.FindData.cFileName, (const char *)oemString); + COPY_STR_LIMITED(panelItem.FindData.cFileName, oemString); panelItem.FindData.cAlternateFileName[0] = 0; if (_folder->GetProperty(itemIndex, kpidAttrib, &prop) != S_OK) @@ -138,8 +138,7 @@ void CPlugin::ReadPluginPanelItem(PluginPanelItem &panelItem, UInt32 itemIndex) panelItem.Reserved[2] = 0; } -int CPlugin::GetFindData(PluginPanelItem **panelItems, - int *itemsNumber, int opMode) +int CPlugin::GetFindData(PluginPanelItem **panelItems, int *itemsNumber, int opMode) { // CScreenRestorer screenRestorer; if ((opMode & OPM_SILENT) == 0 && (opMode & OPM_FIND ) == 0) @@ -177,8 +176,7 @@ int CPlugin::GetFindData(PluginPanelItem **panelItems, return(TRUE); } -void CPlugin::FreeFindData(struct PluginPanelItem *panelItems, - int itemsNumber) +void CPlugin::FreeFindData(struct PluginPanelItem *panelItems, int itemsNumber) { for (int i = 0; i < itemsNumber; i++) if (panelItems[i].Description != NULL) @@ -186,7 +184,6 @@ void CPlugin::FreeFindData(struct PluginPanelItem *panelItems, delete []panelItems; } - void CPlugin::EnterToDirectory(const UString &dirName) { CMyComPtr<IFolderFolder> newFolder; @@ -510,12 +507,10 @@ void CPlugin::GetOpenPluginInfo(struct OpenPluginInfo *info) info->Flags = OPIF_USEFILTER | OPIF_USESORTGROUPS| OPIF_USEHIGHLIGHTING| OPIF_ADDDOTS | OPIF_COMPAREFATTIME; - UINT codePage = ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; - - MyStringCopy(m_FileNameBuffer, (const char *)UnicodeStringToMultiByte(m_FileName, codePage)); + COPY_STR_LIMITED(m_FileNameBuffer, UnicodeStringToMultiByte(m_FileName, CP_OEMCP)); info->HostFile = m_FileNameBuffer; // test it it is not static - MyStringCopy(m_CurrentDirBuffer, (const char *)UnicodeStringToMultiByte(m_CurrentDir, CP_OEMCP)); + COPY_STR_LIMITED(m_CurrentDirBuffer, UnicodeStringToMultiByte(m_CurrentDir, CP_OEMCP)); info->CurDir = m_CurrentDirBuffer; info->Format = kPluginFormatName; @@ -540,7 +535,7 @@ void CPlugin::GetOpenPluginInfo(struct OpenPluginInfo *info) m_PannelTitle += m_CurrentDir; } - MyStringCopy(m_PannelTitleBuffer, (const char *)UnicodeStringToMultiByte(m_PannelTitle, CP_OEMCP)); + COPY_STR_LIMITED(m_PannelTitleBuffer, UnicodeStringToMultiByte(m_PannelTitle, CP_OEMCP)); info->PanelTitle = m_PannelTitleBuffer; memset(m_InfoLines, 0, sizeof(m_InfoLines)); @@ -572,8 +567,8 @@ void CPlugin::GetOpenPluginInfo(struct OpenPluginInfo *info) continue; InfoPanelLine &item = m_InfoLines[numItems++]; - MyStringCopy(item.Text, (const char *)GetNameOfProp2(propID, name)); - MyStringCopy(item.Data, (const char *)PropToString2(prop, propID)); + COPY_STR_LIMITED(item.Text, GetNameOfProp2(propID, name)); + COPY_STR_LIMITED(item.Data, PropToString2(prop, propID)); } } } @@ -614,8 +609,8 @@ void CPlugin::GetOpenPluginInfo(struct OpenPluginInfo *info) if (getProps->GetArchiveProperty(propID, &prop) != S_OK || prop.vt == VT_EMPTY) continue; InfoPanelLine &item = m_InfoLines[numItems++]; - MyStringCopy(item.Text, (const char *)GetNameOfProp2(propID, name)); - MyStringCopy(item.Data, (const char *)PropToString2(prop, propID)); + COPY_STR_LIMITED(item.Text, GetNameOfProp2(propID, name)); + COPY_STR_LIMITED(item.Data, PropToString2(prop, propID)); } } diff --git a/CPP/7zip/UI/Far/Plugin.h b/CPP/7zip/UI/Far/Plugin.h index 06003ba5..ab534e21 100755 --- a/CPP/7zip/UI/Far/Plugin.h +++ b/CPP/7zip/UI/Far/Plugin.h @@ -33,10 +33,8 @@ class CPlugin PanelMode PanelMode; void AddColumn(PROPID aPropID); - - void EnterToDirectory(const UString &aDirName); - - void GetPathParts(UStringVector &aPathParts); + void EnterToDirectory(const UString &dirName); + void GetPathParts(UStringVector &pathParts); void GetCurrentDir(); public: UString m_FileName; @@ -45,55 +43,46 @@ public: CMyComPtr<IInFolderArchive> m_ArchiveHandler; CMyComPtr<IFolderFolder> _folder; - // CArchiverInfo m_ArchiverInfo; UString _archiveTypeName; bool PasswordIsDefined; UString Password; - - CPlugin(const UString &fileName, - // const UString &aDefaultName, - IInFolderArchive *archiveHandler, - UString archiveTypeName - ); + CPlugin(const UString &fileName, IInFolderArchive *archiveHandler, UString archiveTypeName); ~CPlugin(); - void ReadValueSafe(PROPID aPropID, NWindows::NCOM::CPropVariant aPropVariant); - void ReadPluginPanelItem(PluginPanelItem &aPanelItem, UINT32 anItemIndex); - - int GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int OpMode); - void FreeFindData(PluginPanelItem *PanelItem,int ItemsNumber); - int SetDirectory(const char *aDir, int opMode); - void GetOpenPluginInfo(struct OpenPluginInfo *anInfo); - - int DeleteFiles(PluginPanelItem *aPanelItems, int itemsNumber, int opMode); + void ReadPluginPanelItem(PluginPanelItem &panelItem, UInt32 itemIndex); + int GetFindData(PluginPanelItem **panelItems,int *itemsNumber,int opMode); + void FreeFindData(PluginPanelItem *panelItem,int ItemsNumber); + int SetDirectory(const char *aszDir, int opMode); + void GetOpenPluginInfo(struct OpenPluginInfo *info); + int DeleteFiles(PluginPanelItem *panelItems, int itemsNumber, int opMode); HRESULT ExtractFiles( bool decompressAllItems, - const UINT32 *indices, - UINT32 numIndices, + const UInt32 *indices, + UInt32 numIndices, bool silent, NExtract::NPathMode::EEnum pathMode, NExtract::NOverwriteMode::EEnum overwriteMode, const UString &destPath, bool passwordIsDefined, const UString &password); - NFar::NFileOperationReturnCode::EEnum GetFiles(struct PluginPanelItem *aPanelItem, int itemsNumber, - int move, char *destPath, int opMode); + NFar::NFileOperationReturnCode::EEnum GetFiles(struct PluginPanelItem *panelItem, int itemsNumber, + int move, char *destPath, int opMode); - NFar::NFileOperationReturnCode::EEnum GetFilesReal(struct PluginPanelItem *aPanelItems, - int itemsNumber, int move, const char *_aDestPath, int opMode, bool aShowBox); + NFar::NFileOperationReturnCode::EEnum GetFilesReal(struct PluginPanelItem *panelItems, + int itemsNumber, int move, const char *_aDestPath, int opMode, bool showBox); - NFar::NFileOperationReturnCode::EEnum PutFiles(struct PluginPanelItem *aPanelItems, int itemsNumber, - int move, int opMode); + NFar::NFileOperationReturnCode::EEnum PutFiles(struct PluginPanelItem *panelItems, int itemsNumber, + int move, int opMode); HRESULT ShowAttributesWindow(); - int ProcessKey(int aKey, unsigned int aControlState); + int ProcessKey(int key, unsigned int controlState); }; -HRESULT CompressFiles(const CObjectVector<PluginPanelItem> &aPluginPanelItems); +HRESULT CompressFiles(const CObjectVector<PluginPanelItem> &pluginPanelItems); #endif diff --git a/CPP/7zip/UI/Far/PluginDelete.cpp b/CPP/7zip/UI/Far/PluginDelete.cpp index a1dfb915..7d6f0314 100755 --- a/CPP/7zip/UI/Far/PluginDelete.cpp +++ b/CPP/7zip/UI/Far/PluginDelete.cpp @@ -2,21 +2,14 @@ #include "StdAfx.h" -#include <stdio.h> - -#include "Plugin.h" -#include "Messages.h" -#include "UpdateCallback100.h" - #include "Windows/FileDir.h" -#include "../../Common/FileStreams.h" - -#include "Common/StringConvert.h" - -#include "../Common/ZipRegistry.h" #include "../Common/WorkDir.h" +#include "Messages.h" +#include "Plugin.h" +#include "UpdateCallback100.h" + using namespace NFar; using namespace NWindows; using namespace NFile; @@ -24,8 +17,7 @@ using namespace NDirectory; static LPCWSTR kTempArchivePrefix = L"7zA"; -int CPlugin::DeleteFiles(PluginPanelItem *panelItems, int numItems, - int opMode) +int CPlugin::DeleteFiles(PluginPanelItem *panelItems, int numItems, int opMode) { if (numItems == 0) return FALSE; @@ -48,8 +40,7 @@ int CPlugin::DeleteFiles(PluginPanelItem *panelItems, int numItems, char msg[1024]; if (numItems == 1) { - sprintf(msg, g_StartupInfo.GetMsgString(NMessageID::kDeleteFile), - panelItems[0].FindData.cFileName); + sprintf(msg, g_StartupInfo.GetMsgString(NMessageID::kDeleteFile), panelItems[0].FindData.cFileName); msgItems[1] = msg; } else if (numItems > 1) @@ -77,7 +68,7 @@ int CPlugin::DeleteFiles(PluginPanelItem *panelItems, int numItems, } NWorkDir::CInfo workDirInfo; - ReadWorkDirInfo(workDirInfo); + workDirInfo.Load(); UString workDir = GetWorkDir(workDirInfo, m_FileName); CreateComplexDirectory(workDir); @@ -101,8 +92,7 @@ int CPlugin::DeleteFiles(PluginPanelItem *panelItems, int numItems, GetPathParts(pathVector); CMyComPtr<IOutFolderArchive> outArchive; - HRESULT result = m_ArchiveHandler.QueryInterface( - IID_IOutFolderArchive, &outArchive); + HRESULT result = m_ArchiveHandler.QueryInterface(IID_IOutFolderArchive, &outArchive); if(result != S_OK) { g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive); diff --git a/CPP/7zip/UI/Far/PluginRead.cpp b/CPP/7zip/UI/Far/PluginRead.cpp index 7cf7c3c6..45f575fb 100755 --- a/CPP/7zip/UI/Far/PluginRead.cpp +++ b/CPP/7zip/UI/Far/PluginRead.cpp @@ -109,7 +109,7 @@ NFileOperationReturnCode::EEnum CPlugin::GetFilesReal(struct PluginPanelItem *pa { const int kPathIndex = 2; - ReadExtractionInfo(extractionInfo); + extractionInfo.Load(); const int kPathModeRadioIndex = 4; const int kOverwriteModeRadioIndex = kPathModeRadioIndex + 4; @@ -230,7 +230,7 @@ NFileOperationReturnCode::EEnum CPlugin::GetFilesReal(struct PluginPanelItem *pa else throw 31806; - SaveExtractionInfo(extractionInfo); + extractionInfo.Save(); if (dialogItems[kFilesModeIndex].Selected) extractSelectedFiles = true; diff --git a/CPP/7zip/UI/Far/PluginWrite.cpp b/CPP/7zip/UI/Far/PluginWrite.cpp index 44c6fecd..4226aa5c 100755 --- a/CPP/7zip/UI/Far/PluginWrite.cpp +++ b/CPP/7zip/UI/Far/PluginWrite.cpp @@ -78,7 +78,7 @@ NFileOperationReturnCode::EEnum CPlugin::PutFiles( const int kXMid = 38; NCompression::CInfo compressionInfo; - ReadCompressionInfo(compressionInfo); + compressionInfo.Load(); int methodIndex = 0; int i; @@ -145,16 +145,16 @@ NFileOperationReturnCode::EEnum CPlugin::PutFiles( else if (dialogItems[kModeRadioIndex + 1].Selected) actionSet = &kUpdateActionSet; else if (dialogItems[kModeRadioIndex + 2].Selected) - actionSet = &kFreshActionSet; + actionSet = &kFreshActionSet; else if (dialogItems[kModeRadioIndex + 3].Selected) - actionSet = &kSynchronizeActionSet; + actionSet = &kSynchronizeActionSet; else throw 51751; - SaveCompressionInfo(compressionInfo); + compressionInfo.Save(); NWorkDir::CInfo workDirInfo; - ReadWorkDirInfo(workDirInfo); + workDirInfo.Load(); UString workDir = GetWorkDir(workDirInfo, m_FileName); CreateComplexDirectory(workDir); @@ -425,8 +425,7 @@ HRESULT CompressFiles(const CObjectVector<PluginPanelItem> &pluginPanelItems) } NCompression::CInfo compressionInfo; - // CZipRegistryManager aZipRegistryManager; - ReadCompressionInfo(compressionInfo); + compressionInfo.Load(); int archiverIndex = 0; @@ -442,7 +441,7 @@ HRESULT CompressFiles(const CObjectVector<PluginPanelItem> &pluginPanelItems) { if (archiverIndex == -1) archiverIndex = i; - if (arcInfo.Name.CompareNoCase(compressionInfo.ArchiveType) == 0) + if (arcInfo.Name.CompareNoCase(compressionInfo.ArcType) == 0) archiverIndex = i; } } @@ -647,11 +646,11 @@ HRESULT CompressFiles(const CObjectVector<PluginPanelItem> &pluginPanelItems) } const CArcInfoEx &archiverInfoFinal = codecs->Formats[archiverIndex]; - compressionInfo.ArchiveType = archiverInfoFinal.Name; - SaveCompressionInfo(compressionInfo); + compressionInfo.ArcType = archiverInfoFinal.Name; + compressionInfo.Save(); NWorkDir::CInfo workDirInfo; - ReadWorkDirInfo(workDirInfo); + workDirInfo.Load(); UString fullArchiveName; if (!MyGetFullPathName(archiveName, fullArchiveName)) diff --git a/CPP/7zip/UI/Far/makefile b/CPP/7zip/UI/Far/makefile index 01c77ded..29d7bcf4 100755 --- a/CPP/7zip/UI/Far/makefile +++ b/CPP/7zip/UI/Far/makefile @@ -1,6 +1,5 @@ PROG = 7-ZipFar.dll DEF_FILE = Far.def -LIBS = $(LIBS) user32.lib oleaut32.lib advapi32.lib ole32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DWIN_LONG_PATH \ -DEXTERNAL_CODECS diff --git a/CPP/7zip/UI/FileManager/AboutDialog.cpp b/CPP/7zip/UI/FileManager/AboutDialog.cpp index a450a765..edfa98ba 100755 --- a/CPP/7zip/UI/FileManager/AboutDialog.cpp +++ b/CPP/7zip/UI/FileManager/AboutDialog.cpp @@ -2,7 +2,6 @@ #include "StdAfx.h" -#include "AboutDialogRes.h" #include "AboutDialog.h" #include "HelpUtils.h" #include "LangUtils.h" @@ -18,15 +17,17 @@ static CIDLangPair kIDLangPairs[] = #define MY_HOME_PAGE TEXT("http://www.7-zip.org/") static LPCTSTR kHomePageURL = MY_HOME_PAGE; +/* static LPCTSTR kRegisterPageURL = MY_HOME_PAGE TEXT("register.html"); static LPCTSTR kSupportPageURL = MY_HOME_PAGE TEXT("support.html"); - +*/ static LPCWSTR kHelpTopic = L"start.htm"; bool CAboutDialog::OnInit() { LangSetWindowText(HWND(*this), 0x01000100); LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); + NormalizePosition(); return CModalDialog::OnInit(); } @@ -35,26 +36,29 @@ void CAboutDialog::OnHelp() ShowHelpWindow(NULL, kHelpTopic); } -static void MyShellExecute(LPCTSTR url) -{ - ::ShellExecute(NULL, NULL, url, NULL, NULL, SW_SHOWNORMAL); -} - bool CAboutDialog::OnButtonClicked(int buttonID, HWND buttonHWND) { + LPCTSTR url; switch(buttonID) { - case IDC_ABOUT_BUTTON_HOMEPAGE: - ::MyShellExecute(kHomePageURL); - break; - case IDC_ABOUT_BUTTON_REGISTER: - ::MyShellExecute(kRegisterPageURL); - break; - case IDC_ABOUT_BUTTON_SUPPORT: - ::MyShellExecute(kSupportPageURL); - break; + case IDC_ABOUT_BUTTON_HOMEPAGE: url = kHomePageURL; break; + /* + case IDC_ABOUT_BUTTON_REGISTER: url = kRegisterPageURL; break; + case IDC_ABOUT_BUTTON_SUPPORT: url = kSupportPageURL; break; + */ default: return CModalDialog::OnButtonClicked(buttonID, buttonHWND); } + + #ifdef UNDER_CE + SHELLEXECUTEINFO s; + memset(&s, 0, sizeof(s)); + s.cbSize = sizeof(s); + s.lpFile = url; + ::ShellExecuteEx(&s); + #else + ::ShellExecute(NULL, NULL, url, NULL, NULL, SW_SHOWNORMAL); + #endif + return true; } diff --git a/CPP/7zip/UI/FileManager/AboutDialog.rc b/CPP/7zip/UI/FileManager/AboutDialog.rc index 7e2438ff..d8f923a7 100755 --- a/CPP/7zip/UI/FileManager/AboutDialog.rc +++ b/CPP/7zip/UI/FileManager/AboutDialog.rc @@ -2,40 +2,25 @@ #include "../../GuiCommon.rc" #include "../../MyVersion.h" -#define xSize2 224 -#define ySize2 158 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#define xc 144 +#define yc 144 -#define bXPos (xSize - marg - bXSize) -#define bYPos (ySize - marg - bYSize) +#define y 80 -#undef b2XSize -#undef b2XPos -#undef infoYPos -#undef infoYSize +IDI_LOGO ICON "../../UI/FileManager/7zipLogo.ico" -#define b2XSize 94 -#define b2XPos (xSize - marg - b2XSize) -#define gSpace 2 -#define gSize (xSize2 - gSpace - b2XSize) +#ifndef SS_REALSIZEIMAGE +#define SS_REALSIZEIMAGE 0x800 +#endif -#define infoYPos 91 -#define infoYSize (ySize2 - infoYPos - bYSize - 2) - -IDI_LOGO ICON "7zipLogo.ico" - -IDD_ABOUT DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +IDD_ABOUT MY_DIALOG CAPTION "About 7-Zip" -MY_FONT -BEGIN - PUSHBUTTON "OK", IDOK, bXPos, bYPos, bXSize, bYSize - PUSHBUTTON "www.7-zip.org", IDC_ABOUT_BUTTON_HOMEPAGE, b2XPos, 7, b2XSize, bYSize - PUSHBUTTON "Support", IDC_ABOUT_BUTTON_SUPPORT, b2XPos, 30, b2XSize, bYSize - PUSHBUTTON "Register", IDC_ABOUT_BUTTON_REGISTER, b2XPos, 53, b2XSize, bYSize - ICON IDI_LOGO, -1, marg, marg, 20, 20, SS_REALSIZEIMAGE - LTEXT MY_7ZIP_VERSION, -1, marg, 54, gSize, 9 - LTEXT MY_COPYRIGHT, -1, marg, 67, gSize, 17 +{ + DEFPUSHBUTTON "OK", IDOK, bx1, by, bxs, bys + PUSHBUTTON "www.7-zip.org", IDC_ABOUT_BUTTON_HOMEPAGE, bx2, by, bxs, bys + ICON IDI_LOGO, -1, m, m, 32, 32, SS_REALSIZEIMAGE + LTEXT MY_7ZIP_VERSION, -1, m, 54, xc, 8 + LTEXT MY_COPYRIGHT, -1, m, 67, xc, 8 LTEXT "7-Zip is free software. However, you can support development of 7-Zip by registering.", - IDC_ABOUT_STATIC_REGISTER_INFO, marg, infoYPos, xSize2, infoYSize -END + IDC_ABOUT_STATIC_REGISTER_INFO, m, y, xc, (by - y - 1) +} diff --git a/CPP/7zip/UI/FileManager/AboutDialogRes.h b/CPP/7zip/UI/FileManager/AboutDialogRes.h index 54475484..f7dd0602 100755 --- a/CPP/7zip/UI/FileManager/AboutDialogRes.h +++ b/CPP/7zip/UI/FileManager/AboutDialogRes.h @@ -1,4 +1,4 @@ -#define IDD_ABOUT 100 +#define IDD_ABOUT 507 #define IDI_LOGO 138 #define IDC_ABOUT_STATIC_REGISTER_INFO 1010 #define IDC_ABOUT_BUTTON_HOMEPAGE 1020 diff --git a/CPP/7zip/UI/FileManager/App.cpp b/CPP/7zip/UI/FileManager/App.cpp index 21942065..184d6ca0 100755 --- a/CPP/7zip/UI/FileManager/App.cpp +++ b/CPP/7zip/UI/FileManager/App.cpp @@ -71,15 +71,14 @@ void CApp::SetListSettings() extendedStyle |= LVS_EX_GRIDLINES; bool mySelectionMode = ReadAlternativeSelection(); - /* if (ReadSingleClick()) { - extendedStyle |= LVS_EX_ONECLICKACTIVATE - | LVS_EX_TRACKSELECT; + extendedStyle |= LVS_EX_ONECLICKACTIVATE | LVS_EX_TRACKSELECT; + /* if (ReadUnderline()) extendedStyle |= LVS_EX_UNDERLINEHOT; + */ } - */ for (int i = 0; i < kNumPanelsMax; i++) { @@ -104,6 +103,10 @@ void CApp::SetShowSystemMenu() ShowSystemMenu = ReadShowSystemMenu(); } +#ifndef ILC_COLOR32 +#define ILC_COLOR32 0x0020 +#endif + HRESULT CApp::CreateOnePanel(int panelIndex, const UString &mainPath, bool &archiveIsOpened, bool &encrypted) { if (PanelsCreated[panelIndex]) @@ -124,24 +127,23 @@ HRESULT CApp::CreateOnePanel(int panelIndex, const UString &mainPath, bool &arch return S_OK; } -static void CreateToolbar( - HWND parent, +static void CreateToolbar(HWND parent, NWindows::NControl::CImageList &imageList, NWindows::NControl::CToolBar &toolBar, - bool LargeButtons) + bool largeButtons) { - toolBar.Attach(::CreateWindowEx(0, - TOOLBARCLASSNAME, - NULL, 0 + toolBar.Attach(::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, 0 + | WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS - | WS_CHILD - | CCS_NOPARENTALIGN - | CCS_NORESIZE - | CCS_NODIVIDER + | TBSTYLE_WRAPABLE // | TBSTYLE_AUTOSIZE - // | CCS_ADJUSTABLE + // | CCS_NORESIZE + #ifdef UNDER_CE + | CCS_NODIVIDER + | CCS_NOPARENTALIGN + #endif ,0,0,0,0, parent, NULL, g_hInstance, NULL)); // TB_BUTTONSTRUCTSIZE message, which is required for @@ -149,8 +151,8 @@ static void CreateToolbar( toolBar.ButtonStructSize(); imageList.Create( - LargeButtons ? 48: 24, - LargeButtons ? 36: 24, + largeButtons ? 48: 24, + largeButtons ? 36: 24, ILC_MASK | ILC_COLOR32, 0, 0); toolBar.SetImageList(0, imageList); } @@ -162,7 +164,7 @@ struct CButtonInfo UINT Bitmap2ResID; UINT StringResID; UInt32 LangID; - UString GetText() const { return LangString(StringResID, LangID); }; + UString GetText() const { return LangString(StringResID, LangID); } }; static CButtonInfo g_StandardButtons[] = @@ -206,17 +208,13 @@ static void SetButtonText(int commandID, UString &s) static void AddButton( NControl::CImageList &imageList, NControl::CToolBar &toolBar, - CButtonInfo &butInfo, - bool showText, - bool large) + CButtonInfo &butInfo, bool showText, bool large) { TBBUTTON but; but.iBitmap = 0; but.idCommand = butInfo.CommandID; but.fsState = TBSTATE_ENABLED; - but.fsStyle = BTNS_BUTTON - // | BTNS_AUTOSIZE - ; + but.fsStyle = TBSTYLE_BUTTON; but.dwData = 0; UString s = butInfo.GetText(); @@ -241,110 +239,54 @@ static void AddButton( #endif } -static void AddBand(NControl::CReBar &reBar, NControl::CToolBar &toolBar) -{ - SIZE size; - toolBar.GetMaxSize(&size); - - RECT rect; - toolBar.GetWindowRect(&rect); - - REBARBANDINFO rbBand; - rbBand.cbSize = sizeof(REBARBANDINFO); // Required - rbBand.fMask = RBBIM_STYLE - | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; - rbBand.fStyle = RBBS_CHILDEDGE; // RBBS_NOGRIPPER; - rbBand.cxMinChild = size.cx; // rect.right - rect.left; - rbBand.cyMinChild = size.cy; // rect.bottom - rect.top; - rbBand.cyChild = rbBand.cyMinChild; - rbBand.cx = rbBand.cxMinChild; - rbBand.cxIdeal = rbBand.cxMinChild; - rbBand.hwndChild = toolBar; - reBar.InsertBand(-1, &rbBand); -} - void CApp::ReloadToolbars() { - if (!_rebar) - return; - HWND parent = _rebar; - - while (_rebar.GetBandCount() > 0) - _rebar.DeleteBand(0); - - _archiveToolBar.Destroy(); - _archiveButtonsImageList.Destroy(); + _buttonsImageList.Destroy(); + _toolBar.Destroy(); - _standardButtonsImageList.Destroy(); - _standardToolBar.Destroy(); - if (ShowArchiveToolbar) + if (ShowArchiveToolbar || ShowStandardToolbar) { - CreateToolbar(parent, _archiveButtonsImageList, _archiveToolBar, LargeButtons); - for (int i = 0; i < sizeof(g_ArchiveButtons) / sizeof(g_ArchiveButtons[0]); i++) - AddButton(_archiveButtonsImageList, _archiveToolBar, g_ArchiveButtons[i], - ShowButtonsLables, LargeButtons); - AddBand(_rebar, _archiveToolBar); - } - - if (ShowStandardToolbar) - { - CreateToolbar(parent, _standardButtonsImageList, _standardToolBar, LargeButtons); - for (int i = 0; i < sizeof(g_StandardButtons) / sizeof(g_StandardButtons[0]); i++) - AddButton(_standardButtonsImageList, _standardToolBar, g_StandardButtons[i], - ShowButtonsLables, LargeButtons); - AddBand(_rebar, _standardToolBar); + CreateToolbar(_window, _buttonsImageList, _toolBar, LargeButtons); + int i; + if (ShowArchiveToolbar) + for (i = 0; i < sizeof(g_ArchiveButtons) / sizeof(g_ArchiveButtons[0]); i++) + AddButton(_buttonsImageList, _toolBar, g_ArchiveButtons[i], ShowButtonsLables, LargeButtons); + if (ShowStandardToolbar) + for (i = 0; i < sizeof(g_StandardButtons) / sizeof(g_StandardButtons[0]); i++) + AddButton(_buttonsImageList, _toolBar, g_StandardButtons[i], ShowButtonsLables, LargeButtons); + + _toolBar.AutoSize(); } } -void CApp::ReloadRebar(HWND hwnd) +void CApp::SaveToolbarChanges() { - _rebar.Destroy(); - if (!ShowArchiveToolbar && !ShowStandardToolbar) - return; - if (g_ComCtl32Version >= MAKELONG(71, 4)) - { - INITCOMMONCONTROLSEX icex; - icex.dwSize = sizeof(INITCOMMONCONTROLSEX); - icex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES; - InitCommonControlsEx(&icex); - - _rebar.Attach(::CreateWindowEx(WS_EX_TOOLWINDOW, - REBARCLASSNAME, - NULL, - WS_VISIBLE - | WS_BORDER - | WS_CHILD - | WS_CLIPCHILDREN - | WS_CLIPSIBLINGS - // | CCS_NODIVIDER - // | CCS_NOPARENTALIGN // it's bead for moveing of two bands - // | CCS_TOP - | RBS_VARHEIGHT - | RBS_BANDBORDERS - // | RBS_AUTOSIZE - ,0,0,0,0, hwnd, NULL, g_hInstance, NULL)); - } - if (_rebar == 0) - return; - REBARINFO rbi; - rbi.cbSize = sizeof(REBARINFO); // Required when using this struct. - rbi.fMask = 0; - rbi.himl = (HIMAGELIST)NULL; - _rebar.SetBarInfo(&rbi); + SaveToolbar(); ReloadToolbars(); + MoveSubWindows(); } +void MyLoadMenu(); + HRESULT CApp::Create(HWND hwnd, const UString &mainPath, int xSizes[2], bool &archiveIsOpened, bool &encrypted) { + _window.Attach(hwnd); + #ifdef UNDER_CE + _commandBar.Create(g_hInstance, hwnd, 1); + #endif + MyLoadMenu(); + #ifdef UNDER_CE + _commandBar.AutoSize(); + #endif + ReadToolbar(); - ReloadRebar(hwnd); + ReloadToolbars(); int i; for (i = 0; i < kNumPanelsMax; i++) PanelsCreated[i] = false; - _window.Attach(hwnd); AppState.Read(); SetListSettings(); SetShowSystemMenu(); @@ -380,8 +322,6 @@ HRESULT CApp::Create(HWND hwnd, const UString &mainPath, int xSizes[2], bool &ar return S_OK; } -extern void MoveSubWindows(HWND hWnd); - HRESULT CApp::SwitchOnOffOnePanel() { if (NumPanels == 1) @@ -398,7 +338,7 @@ HRESULT CApp::SwitchOnOffOnePanel() Panels[1 - LastFocusedPanel].Enable(false); Panels[1 - LastFocusedPanel].Show(SW_HIDE); } - MoveSubWindows(_window); + MoveSubWindows(); return S_OK; } @@ -647,14 +587,16 @@ void CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex) destPath = srcPanel._currentFolderPrefix + destPath; } + #ifndef UNDER_CE if (destPath.Length() > 0 && destPath[0] == '\\') if (destPath.Length() == 1 || destPath[1] != '\\') { srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); return; } + #endif - if (indices.Size() > 1 || (destPath.Length() > 0 && destPath.ReverseFind(WCHAR_PATH_SEPARATOR) == destPath.Length() - 1) || + if (indices.Size() > 1 || (!destPath.IsEmpty() && destPath.Back() == WCHAR_PATH_SEPARATOR) || NFind::DoesDirExist(destPath)) { NDirectory::CreateComplexDirectory(destPath); @@ -831,26 +773,13 @@ int CApp::GetFocusedPanelIndex() const hwnd = GetParent(hwnd); } } - */ +*/ static UString g_ToolTipBuffer; static CSysString g_ToolTipBufferSys; void CApp::OnNotify(int /* ctrlID */, LPNMHDR pnmh) { - if (pnmh->hwndFrom == _rebar) - { - switch(pnmh->code) - { - case RBN_HEIGHTCHANGE: - { - MoveSubWindows(g_HWND); - return; - } - } - return ; - } - else { if (pnmh->code == TTN_GETDISPINFO) { diff --git a/CPP/7zip/UI/FileManager/App.h b/CPP/7zip/UI/FileManager/App.h index 1fc77138..d2ced9ba 100755 --- a/CPP/7zip/UI/FileManager/App.h +++ b/CPP/7zip/UI/FileManager/App.h @@ -3,10 +3,12 @@ #ifndef __APP_H #define __APP_H -#include "Panel.h" -#include "AppState.h" +#include "Windows/Control/CommandBar.h" #include "Windows/Control/ImageList.h" +#include "AppState.h" +#include "Panel.h" + class CApp; extern CApp g_App; @@ -14,8 +16,6 @@ extern HWND g_HWND; const int kNumPanelsMax = 2; -extern void MoveSubWindows(HWND hWnd); - enum { kAddCommand = kToolbarStartID, @@ -77,12 +77,10 @@ class CDropTarget: public: MY_UNKNOWN_IMP1_MT(IDropTarget) - STDMETHOD(DragEnter)(IDataObject * dataObject, DWORD keyState, - POINTL pt, DWORD *effect); + STDMETHOD(DragEnter)(IDataObject * dataObject, DWORD keyState, POINTL pt, DWORD *effect); STDMETHOD(DragOver)(DWORD keyState, POINTL pt, DWORD * effect); STDMETHOD(DragLeave)(); - STDMETHOD(Drop)(IDataObject * dataObject, DWORD keyState, - POINTL pt, DWORD *effect); + STDMETHOD(Drop)(IDataObject * dataObject, DWORD keyState, POINTL pt, DWORD *effect); CDropTarget(): TargetPanelIndex(-1), @@ -119,16 +117,18 @@ public: CPanel Panels[kNumPanelsMax]; bool PanelsCreated[kNumPanelsMax]; - NWindows::NControl::CImageList _archiveButtonsImageList; - NWindows::NControl::CImageList _standardButtonsImageList; + NWindows::NControl::CImageList _buttonsImageList; - NWindows::NControl::CReBar _rebar; - NWindows::NControl::CToolBar _archiveToolBar; - NWindows::NControl::CToolBar _standardToolBar; + #ifdef UNDER_CE + NWindows::NControl::CCommandBar _commandBar; + #endif + NWindows::NControl::CToolBar _toolBar; CDropTarget *_dropTargetSpec; CMyComPtr<IDropTarget> _dropTarget; + CApp(): _window(0), NumPanels(2), LastFocusedPanel(0) {} + void CreateDragTarget() { _dropTargetSpec = new CDropTarget(); @@ -165,94 +165,53 @@ public: void Save(); void Release(); - - /* - void SetFocus(int panelIndex) - { Panels[panelIndex].SetFocusToList(); } - */ - void SetFocusToLastItem() - { Panels[LastFocusedPanel].SetFocusToLastRememberedItem(); } - + // void SetFocus(int panelIndex) { Panels[panelIndex].SetFocusToList(); } + void SetFocusToLastItem() { Panels[LastFocusedPanel].SetFocusToLastRememberedItem(); } int GetFocusedPanelIndex() const { return LastFocusedPanel; } - bool IsPanelVisible(int index) const { return (NumPanels > 1 || index == LastFocusedPanel); } - - /* - void SetCurrentIndex() - { CurrentPanel = GetFocusedPanelIndex(); } - */ - - CApp(): NumPanels(2), LastFocusedPanel(0) {} - CPanel &GetFocusedPanel() - { return Panels[GetFocusedPanelIndex()]; } + CPanel &GetFocusedPanel() { return Panels[GetFocusedPanelIndex()]; } // File Menu - void OpenItem() - { GetFocusedPanel().OpenSelectedItems(true); } - void OpenItemInside() - { GetFocusedPanel().OpenFocusedItemAsInternal(); } - void OpenItemOutside() - { GetFocusedPanel().OpenSelectedItems(false); } - void EditItem() - { GetFocusedPanel().EditItem(); } - void Rename() - { GetFocusedPanel().RenameFile(); } - void CopyTo() - { OnCopy(false, false, GetFocusedPanelIndex()); } - void MoveTo() - { OnCopy(true, false, GetFocusedPanelIndex()); } - void Delete(bool toRecycleBin) - { GetFocusedPanel().DeleteItems(toRecycleBin); } + void OpenItem() { GetFocusedPanel().OpenSelectedItems(true); } + void OpenItemInside() { GetFocusedPanel().OpenFocusedItemAsInternal(); } + void OpenItemOutside() { GetFocusedPanel().OpenSelectedItems(false); } + void EditItem() { GetFocusedPanel().EditItem(); } + void Rename() { GetFocusedPanel().RenameFile(); } + void CopyTo() { OnCopy(false, false, GetFocusedPanelIndex()); } + void MoveTo() { OnCopy(true, false, GetFocusedPanelIndex()); } + void Delete(bool toRecycleBin) { GetFocusedPanel().DeleteItems(toRecycleBin); } void CalculateCrc(); void DiffFiles(); void Split(); void Combine(); - void Properties() - { GetFocusedPanel().Properties(); } - void Comment() - { GetFocusedPanel().ChangeComment(); } + void Properties() { GetFocusedPanel().Properties(); } + void Comment() { GetFocusedPanel().ChangeComment(); } - void CreateFolder() - { GetFocusedPanel().CreateFolder(); } - void CreateFile() - { GetFocusedPanel().CreateFile(); } + void CreateFolder() { GetFocusedPanel().CreateFolder(); } + void CreateFile() { GetFocusedPanel().CreateFile(); } // Edit - void EditCut() - { GetFocusedPanel().EditCut(); } - void EditCopy() - { GetFocusedPanel().EditCopy(); } - void EditPaste() - { GetFocusedPanel().EditPaste(); } - - void SelectAll(bool selectMode) - { GetFocusedPanel().SelectAll(selectMode); } - void InvertSelection() - { GetFocusedPanel().InvertSelection(); } - void SelectSpec(bool selectMode) - { GetFocusedPanel().SelectSpec(selectMode); } - void SelectByType(bool selectMode) - { GetFocusedPanel().SelectByType(selectMode); } - - void RefreshStatusBar() - { GetFocusedPanel().RefreshStatusBar(); } - - void SetListViewMode(UINT32 index) - { GetFocusedPanel().SetListViewMode(index); } - UINT32 GetListViewMode() - { return GetFocusedPanel().GetListViewMode(); } - - void SortItemsWithPropID(PROPID propID) - { GetFocusedPanel().SortItemsWithPropID(propID); } - - void OpenRootFolder() - { GetFocusedPanel().OpenDrivesFolder(); } - void OpenParentFolder() - { GetFocusedPanel().OpenParentFolder(); } - void FoldersHistory() - { GetFocusedPanel().FoldersHistory(); } - void RefreshView() - { GetFocusedPanel().OnReload(); } + void EditCut() { GetFocusedPanel().EditCut(); } + void EditCopy() { GetFocusedPanel().EditCopy(); } + void EditPaste() { GetFocusedPanel().EditPaste(); } + + void SelectAll(bool selectMode) { GetFocusedPanel().SelectAll(selectMode); } + void InvertSelection() { GetFocusedPanel().InvertSelection(); } + void SelectSpec(bool selectMode) { GetFocusedPanel().SelectSpec(selectMode); } + void SelectByType(bool selectMode) { GetFocusedPanel().SelectByType(selectMode); } + + void RefreshStatusBar() { GetFocusedPanel().RefreshStatusBar(); } + + void SetListViewMode(UINT32 index) { GetFocusedPanel().SetListViewMode(index); } + UINT32 GetListViewMode() { return GetFocusedPanel().GetListViewMode(); } + PROPID GetSortID() { return GetFocusedPanel().GetSortID(); } + + void SortItemsWithPropID(PROPID propID) { GetFocusedPanel().SortItemsWithPropID(propID); } + + void OpenRootFolder() { GetFocusedPanel().OpenDrivesFolder(); } + void OpenParentFolder() { GetFocusedPanel().OpenParentFolder(); } + void FoldersHistory() { GetFocusedPanel().FoldersHistory(); } + void RefreshView() { GetFocusedPanel().OnReload(); } void RefreshAllPanels() { for (int i = 0; i < NumPanels; i++) @@ -263,18 +222,29 @@ public: Panels[index].OnReload(); } } + + /* + void SysIconsWereChanged() + { + for (int i = 0; i < NumPanels; i++) + { + int index = i; + if (NumPanels == 1) + index = LastFocusedPanel; + Panels[index].SysIconsWereChanged(); + } + } + */ + void SetListSettings(); void SetShowSystemMenu(); HRESULT SwitchOnOffOnePanel(); bool GetFlatMode() { return Panels[LastFocusedPanel].GetFlatMode(); } void ChangeFlatMode() { Panels[LastFocusedPanel].ChangeFlatMode(); } - void OpenBookmark(int index) - { GetFocusedPanel().OpenBookmark(index); } - void SetBookmark(int index) - { GetFocusedPanel().SetBookmark(index); } + void OpenBookmark(int index) { GetFocusedPanel().OpenBookmark(index); } + void SetBookmark(int index) { GetFocusedPanel().SetBookmark(index); } - void ReloadRebar(HWND hwnd); void ReloadToolbars(); void ReadToolbar() { @@ -293,33 +263,28 @@ public: if (ShowArchiveToolbar) mask |= 8; SaveToolbarsMask(mask); } + + void SaveToolbarChanges(); + void SwitchStandardToolbar() { ShowStandardToolbar = !ShowStandardToolbar; - SaveToolbar(); - ReloadRebar(g_HWND); - MoveSubWindows(_window); + SaveToolbarChanges(); } void SwitchArchiveToolbar() { ShowArchiveToolbar = !ShowArchiveToolbar; - SaveToolbar(); - ReloadRebar(g_HWND); - MoveSubWindows(_window); + SaveToolbarChanges(); } void SwitchButtonsLables() { ShowButtonsLables = !ShowButtonsLables; - SaveToolbar(); - ReloadRebar(g_HWND); - MoveSubWindows(_window); + SaveToolbarChanges(); } void SwitchLargeButtons() { LargeButtons = !LargeButtons; - SaveToolbar(); - ReloadRebar(g_HWND); - MoveSubWindows(_window); + SaveToolbarChanges(); } void AddToArchive() { GetFocusedPanel().AddToArchive(); } @@ -332,6 +297,8 @@ public: void RefreshTitle(bool always = false); void RefreshTitleAlways() { RefreshTitle(true); } void RefreshTitle(int panelIndex, bool always = false); + + void MoveSubWindows(); }; #endif diff --git a/CPP/7zip/UI/FileManager/BrowseDialog.cpp b/CPP/7zip/UI/FileManager/BrowseDialog.cpp new file mode 100755 index 00000000..602b12f3 --- /dev/null +++ b/CPP/7zip/UI/FileManager/BrowseDialog.cpp @@ -0,0 +1,514 @@ +// BrowseDialog.cpp + +#include "StdAfx.h" + +#ifdef UNDER_CE + +#include "Common/IntToString.h" + +#include "Windows/PropVariantConversions.h" + +#include "BrowseDialog.h" +#include "LangUtils.h" +#include "PropertyNameRes.h" + +#ifndef _SFX +#include "RegistryUtils.h" +#endif + +using namespace NWindows; +using namespace NFile; +using namespace NFind; + +extern bool g_LVN_ITEMACTIVATE_Support; + +static const int kParentIndex = -1; + +#ifdef LANG +static CIDLangPair kIDLangPairs[] = +{ + { IDOK, 0x02000702 }, + { IDCANCEL, 0x02000710 } +}; +#endif + +static bool GetParentPath(const UString &path2, UString &dest, UString &focused) +{ + UString path = path2; + dest.Empty(); + if (path.IsEmpty()) + return false; + if (path.Back() == WCHAR_PATH_SEPARATOR) + path.DeleteBack(); + if (path.IsEmpty()) + return false; + int pos = path.ReverseFind(WCHAR_PATH_SEPARATOR); + if (pos < 0 || path.Back() == WCHAR_PATH_SEPARATOR) + return false; + focused = path.Mid(pos + 1); + dest = path.Left(pos + 1); + return true; +} + +bool CBrowseDialog::OnInit() +{ + #ifdef LANG + LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); + #endif + if (!Title.IsEmpty()) + SetText(Title); + _list.Attach(GetItem(IDC_BROWSE_LIST)); + + #ifndef UNDER_CE + _list.SetUnicodeFormat(true); + #endif + + #ifndef _SFX + if (ReadSingleClick()) + _list.SetExtendedListViewStyle(LVS_EX_ONECLICKACTIVATE | LVS_EX_TRACKSELECT); + _showDots = ReadShowDots(); + #endif + + _list.SetImageList(GetSysImageList(true), LVSIL_SMALL); + _list.SetImageList(GetSysImageList(false), LVSIL_NORMAL); + + _list.InsertColumn(0, LangStringSpec(IDS_PROP_NAME, 0x02000204), 100); + _list.InsertColumn(1, LangStringSpec(IDS_PROP_MTIME, 0x0200020C), 100); + { + LV_COLUMNW column; + column.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; + column.fmt = LVCFMT_RIGHT; + column.iSubItem = 2; + UString s = LangStringSpec(IDS_PROP_SIZE, 0x02000207); + column.pszText = (wchar_t *)(const wchar_t *)s; + _list.InsertColumn(2, &column); + + // _list.InsertColumn(2, LangStringSpec(IDS_PROP_SIZE, 0x02000207), 100); + } + + _list.InsertItem(0, L"12345678901234567"); + _list.SetSubItem(0, 1, L"2009-09-09"); + _list.SetSubItem(0, 2, L"9999 MB"); + for (int i = 0; i < 3; i++) + _list.SetColumnWidthAuto(i); + _list.DeleteAllItems(); + + UString selectedName; + if (!FolderMode) + { + int pos = Path.ReverseFind(WCHAR_PATH_SEPARATOR); + if (pos >= 0 && Path.Back() != WCHAR_PATH_SEPARATOR) + { + selectedName = Path.Mid(pos + 1); + Path = Path.Left(pos + 1); + } + } + _ascending = true; + _sortIndex = 0; + + NormalizeSize(); + + while (Reload(Path, selectedName) != S_OK) + { + UString parent; + if (!GetParentPath(Path, parent, selectedName)) + break; + selectedName.Empty(); + Path = parent; + } + + return CModalDialog::OnInit(); +} + +bool CBrowseDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize) +{ + int mx, my; + { + RECT rect; + GetClientRectOfItem(IDC_BROWSE_PARENT, rect); + mx = rect.left; + my = rect.top; + } + InvalidateRect(NULL); + + { + RECT rect; + GetClientRectOfItem(IDC_BROWSE_PATH, rect); + MoveItem(IDC_BROWSE_PATH, rect.left, rect.top, xSize - mx - rect.left, RECT_SIZE_Y(rect)); + } + + int bx1, bx2, by; + GetItemSizes(IDCANCEL, bx1, by); + GetItemSizes(IDOK, bx2, by); + int y = ySize - my - by; + int x = xSize - mx - bx1; + MoveItem(IDCANCEL, x, y, bx1, by); + MoveItem(IDOK, x - mx - bx2, y, bx2, by); + + { + RECT rect; + GetClientRectOfItem(IDC_BROWSE_LIST, rect); + _list.Move(rect.left, rect.top, xSize - mx - rect.left, y - my - rect.top); + } + return false; +} + +static UString ConvertSizeToStringShort(UInt64 value) +{ + wchar_t s[32]; + wchar_t c = L'\0', c2 = L'\0'; + if (value < (UInt64)10000) + { + c = L'\0'; + c2 = L'\0'; + } + else if (value < ((UInt64)10000 << 10)) + { + value >>= 10; + c = L'K'; + } + else if (value < ((UInt64)10000 << 20)) + { + value >>= 20; + c = L'M'; + } + else + { + value >>= 30; + c = L'G'; + } + ConvertUInt64ToString(value, s); + int p = MyStringLen(s); + if (c != 0) + s[p++] = L' '; + s[p++] = c; + s[p++] = c2; + s[p++] = L'\0'; + return s; +} + +int CBrowseDialog::CompareItems(LPARAM lParam1, LPARAM lParam2) +{ + if (lParam1 == kParentIndex) return -1; + if (lParam2 == kParentIndex) return 1; + const CFileInfoW &f1 = _files[(int)lParam1]; + const CFileInfoW &f2 = _files[(int)lParam2]; + + bool isDir1 = f1.IsDir(); + bool isDir2 = f2.IsDir(); + + if (isDir1 && !isDir2) return -1; + if (isDir2 && !isDir1) return 1; + + int result = 0; + switch(_sortIndex) + { + case 0: result = f1.Name.CompareNoCase(f2.Name); break; + case 1: result = CompareFileTime(&f1.MTime, &f2.MTime); break; + case 2: result = MyCompare(f1.Size, f2.Size); break; + } + return _ascending ? result: (-result); +} + +static int CALLBACK CompareItems2(LPARAM lParam1, LPARAM lParam2, LPARAM lpData) +{ + if (lpData == NULL) + return 0; + return ((CBrowseDialog*)lpData)->CompareItems(lParam1, lParam2); +} + +static HRESULT GetNormalizedError() +{ + HRESULT errorCode = GetLastError(); + return (errorCode == 0) ? 1 : errorCode; +} + +HRESULT CBrowseDialog::Reload(const UString &pathPrefix, const UString &selectedName) +{ + CEnumeratorW enumerator(pathPrefix + L'*'); + CObjectVector<CFileInfoW> files; + for (;;) + { + bool found; + CFileInfoW fi; + if (!enumerator.Next(fi, found)) + return GetNormalizedError(); + if (!found) + break; + files.Add(fi); + } + + Path = pathPrefix; + + _files = files; + + SetItemText(IDC_BROWSE_PATH, Path); + _list.SetRedraw(false); + _list.DeleteAllItems(); + + if (!Path.IsEmpty() && Path.Back() != WCHAR_PATH_SEPARATOR) + Path += WCHAR_PATH_SEPARATOR; + + LVITEMW item; + + int index = 0; + int cursorIndex = -1; + + #ifndef _SFX + if (_showDots) + { + UString itemName = L".."; + item.iItem = index; + if (selectedName.IsEmpty()) + cursorIndex = item.iItem; + item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; + int subItem = 0; + item.iSubItem = subItem++; + item.lParam = kParentIndex; + item.pszText = (wchar_t *)(const wchar_t *)itemName; + item.iImage = _extToIconMap.GetIconIndex(FILE_ATTRIBUTE_DIRECTORY, Path); + if (item.iImage < 0) + item.iImage = 0; + _list.InsertItem(&item); + _list.SetSubItem(index, subItem++, L""); + _list.SetSubItem(index, subItem++, L""); + index++; + } + #endif + + for (int i = 0; i < _files.Size(); i++) + { + const CFileInfoW &fi = _files[i]; + item.iItem = index; + if (fi.Name.CompareNoCase(selectedName) == 0) + cursorIndex = item.iItem; + item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; + int subItem = 0; + item.iSubItem = subItem++; + item.lParam = i; + item.pszText = (wchar_t *)(const wchar_t *)fi.Name; + item.iImage = _extToIconMap.GetIconIndex(fi.Attrib, Path + fi.Name); + if (item.iImage < 0) + item.iImage = 0; + _list.InsertItem(&item); + { + FILETIME ft; + UString s; + if (FileTimeToLocalFileTime(&fi.MTime, &ft)) + s = ConvertFileTimeToString(ft, false, false); + _list.SetSubItem(index, subItem++, s); + } + { + UString s; + if (!fi.IsDir()) + s = ConvertSizeToStringShort(fi.Size); + _list.SetSubItem(index, subItem++, s); + } + index++; + } + + if (_list.GetItemCount() > 0 && cursorIndex >= 0) + _list.SetItemState_FocusedSelected(cursorIndex); + _list.SortItems(CompareItems2, (LPARAM)this); + if (_list.GetItemCount() > 0 && cursorIndex < 0) + _list.SetItemState(0, LVIS_FOCUSED, LVIS_FOCUSED); + _list.EnsureVisible(_list.GetFocusedItem(), false); + _list.SetRedraw(true); + return S_OK; +} + +HRESULT CBrowseDialog::Reload() +{ + UString selectedCur; + int index = _list.GetNextSelectedItem(-1); + if (index >= 0) + { + int fileIndex = GetRealItemIndex(index); + if (fileIndex != kParentIndex) + selectedCur = _files[fileIndex].Name; + } + return Reload(Path, selectedCur); +} + +void CBrowseDialog::OpenParentFolder() +{ + UString parent, selected; + if (GetParentPath(Path, parent, selected)) + Reload(parent, selected); +} + +extern UString HResultToMessage(HRESULT errorCode); + +bool CBrowseDialog::OnNotify(UINT /* controlID */, LPNMHDR header) +{ + if (header->hwndFrom != _list) + return false; + switch(header->code) + { + case LVN_ITEMACTIVATE: + if (g_LVN_ITEMACTIVATE_Support) + { + OnItemEnter(); + return true; + } + break; + case NM_DBLCLK: + case NM_RETURN: // probabably it's unused + if (!g_LVN_ITEMACTIVATE_Support) + { + OnItemEnter(); + return true; + } + break; + case LVN_COLUMNCLICK: + { + int index = LPNMLISTVIEW(header)->iSubItem; + if (index == _sortIndex) + _ascending = !_ascending; + else + { + _ascending = (index == 0); + _sortIndex = index; + } + Reload(); + return false; + } + case LVN_KEYDOWN: + { + LRESULT result; + bool boolResult = OnKeyDown(LPNMLVKEYDOWN(header), result); + return boolResult; + } + } + return false; +} + +bool CBrowseDialog::OnKeyDown(LPNMLVKEYDOWN keyDownInfo, LRESULT &result) +{ + bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0; + result = 0; + + switch(keyDownInfo->wVKey) + { + case VK_BACK: + OpenParentFolder(); + return true; + case 'R': + if (ctrl) + { + Reload(); + return true; + } + return false; + } + return false; +} + +bool CBrowseDialog::OnButtonClicked(int buttonID, HWND buttonHWND) +{ + switch(buttonID) + { + case IDC_BROWSE_PARENT: + OpenParentFolder(); + return true; + } + return CModalDialog::OnButtonClicked(buttonID, buttonHWND); +} + +void CBrowseDialog::ShowError(LPCWSTR s) { MessageBoxW(*this, s, L"7-Zip", MB_ICONERROR); } + +void CBrowseDialog::ShowSelectError() +{ + ShowError(FolderMode ? + L"You must select some folder": + L"You must select some file"); +} + +void CBrowseDialog::FinishOnOK() +{ + int index = _list.GetNextSelectedItem(-1); + if (index < 0) + { + if (!FolderMode) + { + ShowSelectError(); + return; + } + } + else + { + int fileIndex = GetRealItemIndex(index); + if (fileIndex == kParentIndex) + { + OpenParentFolder(); + return; + } + const CFileInfoW &file = _files[fileIndex]; + if (file.IsDir() != FolderMode) + { + ShowSelectError(); + return; + } + Path += file.Name; + } + End(IDOK); +} + +void CBrowseDialog::OnItemEnter() +{ + int index = _list.GetNextSelectedItem(-1); + if (index < 0) + return; + int fileIndex = GetRealItemIndex(index); + if (fileIndex == kParentIndex) + OpenParentFolder(); + else + { + const CFileInfoW &file = _files[fileIndex]; + if (!file.IsDir()) + { + if (!FolderMode) + FinishOnOK(); + else + ShowSelectError(); + return; + } + HRESULT res = Reload(Path + file.Name + WCHAR_PATH_SEPARATOR, L""); + if (res != S_OK) + ShowError(HResultToMessage(res)); + } +} + +void CBrowseDialog::OnOK() +{ + if (GetFocus() == _list) + { + OnItemEnter(); + return; + } + FinishOnOK(); +} + +static bool MyBrowse(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath, bool folderMode) +{ + CBrowseDialog dialog; + dialog.Title = title; + dialog.Path = initialFolder; + dialog.FolderMode = folderMode; + if (dialog.Create(owner) != IDOK) + return false; + resultPath = dialog.Path; + return true; +} + +bool MyBrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath) +{ + return MyBrowse(owner, title, initialFolder, resultPath, true); +} + +bool MyBrowseForFile(HWND owner, LPCWSTR title, LPCWSTR initialFolder, LPCWSTR, UString &resultPath) +{ + return MyBrowse(owner, title, initialFolder, resultPath, false); +} + +#endif diff --git a/CPP/7zip/UI/FileManager/BrowseDialog.h b/CPP/7zip/UI/FileManager/BrowseDialog.h new file mode 100755 index 00000000..41eb6b50 --- /dev/null +++ b/CPP/7zip/UI/FileManager/BrowseDialog.h @@ -0,0 +1,77 @@ +// BrowseDialog.h + +#ifndef __BROWSE_DIALOG_H +#define __BROWSE_DIALOG_H + +#ifdef UNDER_CE + +#include "Windows/FileFind.h" + +#include "Windows/Control/Dialog.h" +#include "Windows/Control/ListView.h" + +#include "BrowseDialogRes.h" +#include "SysIconUtils.h" + +class CBrowseDialog: public NWindows::NControl::CModalDialog +{ + NWindows::NControl::CListView _list; + CObjectVector<NWindows::NFile::NFind::CFileInfoW> _files; + CExtToIconMap _extToIconMap; + int _sortIndex; + bool _ascending; + bool _showDots; + + virtual bool OnInit(); + virtual bool OnSize(WPARAM wParam, int xSize, int ySize); + virtual bool OnNotify(UINT controlID, LPNMHDR header); + virtual void OnOK(); + + virtual bool OnButtonClicked(int buttonID, HWND buttonHWND); + virtual bool OnKeyDown(LPNMLVKEYDOWN keyDownInfo, LRESULT &result); + + void FinishOnOK(); + HRESULT Reload(const UString &pathPrefix, const UString &selectedName); + HRESULT Reload(); + void OpenParentFolder(); + + void OnItemEnter(); + + int GetRealItemIndex(int indexInListView) const + { + LPARAM param; + if (!_list.GetItemParam(indexInListView, param)) + return (int)-1; + return (int)param; + } + + void ShowError(LPCWSTR s); + void ShowSelectError(); +public: + UString Title; + UString Path; + bool FolderMode; + + CBrowseDialog(): FolderMode(true), _showDots(false) {} + + INT_PTR Create(HWND parent = 0) { return CModalDialog::Create(IDD_DIALOG_BROWSE, parent); } + int CompareItems(LPARAM lParam1, LPARAM lParam2); +}; + +bool MyBrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath); +bool MyBrowseForFile(HWND owner, LPCWSTR title, LPCWSTR initialFolder, LPCWSTR s, UString &resultPath); + +#else + +#include "Windows/CommonDialog.h" +#include "Windows/Shell.h" + +#define MyBrowseForFolder(h, title, initialFolder, resultPath) \ + NShell::BrowseForFolder(h, title, initialFolder, resultPath) + +#define MyBrowseForFile(h, title, initialFolder, s, resultPath) \ + MyGetOpenFileName(h, title, initialFolder, s, resultPath) + +#endif + +#endif diff --git a/CPP/7zip/UI/FileManager/BrowseDialog.rc b/CPP/7zip/UI/FileManager/BrowseDialog.rc new file mode 100755 index 00000000..4d7ec288 --- /dev/null +++ b/CPP/7zip/UI/FileManager/BrowseDialog.rc @@ -0,0 +1,17 @@ +#include "BrowseDialogRes.h" +#include "../../GuiCommon.rc" + +#define xc 180 +#define yc 160 + +IDD_DIALOG_BROWSE MY_RESIZE_DIALOG +CAPTION "7-Zip: Browse" +{ + LTEXT "", IDC_BROWSE_PATH, m + 20, m + 3, xc - 20, 8 + CONTROL "List1", IDC_BROWSE_LIST, "SysListView32", + LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP, + m, m + 16, xc, yc - bys - m - 16 + PUSHBUTTON "OK", IDOK, bx2, by, bxs, bys + PUSHBUTTON "Cancel", IDCANCEL, bx1, by, bxs, bys + PUSHBUTTON "..", IDC_BROWSE_PARENT, m, m, 16, 14 +} diff --git a/CPP/7zip/UI/FileManager/BrowseDialogRes.h b/CPP/7zip/UI/FileManager/BrowseDialogRes.h new file mode 100755 index 00000000..79f0efdb --- /dev/null +++ b/CPP/7zip/UI/FileManager/BrowseDialogRes.h @@ -0,0 +1,4 @@ +#define IDD_DIALOG_BROWSE 509 +#define IDC_BROWSE_LIST 1000 +#define IDC_BROWSE_PATH 1001 +#define IDC_BROWSE_PARENT 1002 diff --git a/CPP/7zip/UI/FileManager/ClassDefs.cpp b/CPP/7zip/UI/FileManager/ClassDefs.cpp index 5b4401a1..99405d9b 100755 --- a/CPP/7zip/UI/FileManager/ClassDefs.cpp +++ b/CPP/7zip/UI/FileManager/ClassDefs.cpp @@ -2,16 +2,10 @@ #include "StdAfx.h" -#include <initguid.h> +#include "Common/MyInitGuid.h" -#include "IFolder.h" -#include "../../IPassword.h" #include "PluginInterface.h" -#include "ExtractCallback.h" -#include "../../ICoder.h" - #include "../Agent/Agent.h" -// {23170F69-40C1-278A-1000-000100020000} DEFINE_GUID(CLSID_CZipContextMenu, 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00); diff --git a/CPP/7zip/UI/FileManager/ComboDialog.cpp b/CPP/7zip/UI/FileManager/ComboDialog.cpp index 807a5dd2..c3cc08e7 100755 --- a/CPP/7zip/UI/FileManager/ComboDialog.cpp +++ b/CPP/7zip/UI/FileManager/ComboDialog.cpp @@ -43,9 +43,28 @@ bool CComboDialog::OnInit() _comboBox.SetText(Value); for(int i = 0; i < Strings.Size(); i++) _comboBox.AddString(Strings[i]); + NormalizeSize(); return CModalDialog::OnInit(); } +bool CComboDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize) +{ + int mx, my; + GetMargins(8, mx, my); + int bx1, bx2, by; + GetItemSizes(IDCANCEL, bx1, by); + GetItemSizes(IDOK, bx2, by); + int y = ySize - my - by; + int x = xSize - mx - bx1; + + InvalidateRect(NULL); + + MoveItem(IDCANCEL, x, y, bx1, by); + MoveItem(IDOK, x - mx - bx2, y, bx2, by); + ChangeSubWindowSizeX(_comboBox, xSize - mx * 2); + return false; +} + void CComboDialog::OnOK() { _comboBox.GetText(Value); diff --git a/CPP/7zip/UI/FileManager/ComboDialog.h b/CPP/7zip/UI/FileManager/ComboDialog.h index 0a1addc5..ff111b19 100755 --- a/CPP/7zip/UI/FileManager/ComboDialog.h +++ b/CPP/7zip/UI/FileManager/ComboDialog.h @@ -1,10 +1,11 @@ // ComboDialog.h -#ifndef __COMBODIALOG_H -#define __COMBODIALOG_H +#ifndef __COMBO_DIALOG_H +#define __COMBO_DIALOG_H -#include "Windows/Control/Dialog.h" #include "Windows/Control/ComboBox.h" +#include "Windows/Control/Dialog.h" + #include "ComboDialogRes.h" class CComboDialog: public NWindows::NControl::CModalDialog @@ -12,6 +13,7 @@ class CComboDialog: public NWindows::NControl::CModalDialog NWindows::NControl::CComboBox _comboBox; virtual void OnOK(); virtual bool OnInit(); + virtual bool OnSize(WPARAM wParam, int xSize, int ySize); public: // bool Sorted; UString Title; diff --git a/CPP/7zip/UI/FileManager/ComboDialog.rc b/CPP/7zip/UI/FileManager/ComboDialog.rc index 7005e09e..6789347a 100755 --- a/CPP/7zip/UI/FileManager/ComboDialog.rc +++ b/CPP/7zip/UI/FileManager/ComboDialog.rc @@ -1,24 +1,13 @@ #include "ComboDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 233 -#define ySize2 57 +#define xc 240 +#define yc 64 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) - -#define bYPos (ySize - marg - bYSize) -#define b1XPos (xSize - marg - bXSize) -#define b2XPos (b1XPos - 10 - bXSize) - - -IDD_DIALOG_COMBO DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +IDD_DIALOG_COMBO MY_RESIZE_DIALOG CAPTION "Combo" -MY_FONT -BEGIN - LTEXT "", IDC_COMBO_STATIC, marg, marg, xSize2, 8 - COMBOBOX IDC_COMBO_COMBO, marg, 20, xSize2, 65, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - - DEFPUSHBUTTON "OK", IDOK, b2XPos, bYPos, bXSize, bYSize - PUSHBUTTON "Cancel", IDCANCEL, b1XPos, bYPos, bXSize, bYSize -END +{ + LTEXT "", IDC_COMBO_STATIC, m, m, xc, 8 + COMBOBOX IDC_COMBO_COMBO, m, 20, xc, 65, MY_COMBO_WITH_EDIT + OK_CANCEL +} diff --git a/CPP/7zip/UI/FileManager/ComboDialogRes.h b/CPP/7zip/UI/FileManager/ComboDialogRes.h index b5111ddf..7f37cb93 100755 --- a/CPP/7zip/UI/FileManager/ComboDialogRes.h +++ b/CPP/7zip/UI/FileManager/ComboDialogRes.h @@ -1,4 +1,4 @@ -#define IDD_DIALOG_COMBO 200 +#define IDD_DIALOG_COMBO 505 #define IDC_COMBO_STATIC 1000 #define IDC_COMBO_COMBO 1001 diff --git a/CPP/7zip/UI/FileManager/CopyDialog.cpp b/CPP/7zip/UI/FileManager/CopyDialog.cpp index 2bf60301..8cbaf41f 100755 --- a/CPP/7zip/UI/FileManager/CopyDialog.cpp +++ b/CPP/7zip/UI/FileManager/CopyDialog.cpp @@ -1,13 +1,13 @@ // CopyDialog.cpp #include "StdAfx.h" -#include "CopyDialog.h" -#include "Common/StringConvert.h" +#include "Windows/FileName.h" #include "Windows/Control/Static.h" -#include "Windows/Shell.h" -#include "Windows/FileName.h" + +#include "BrowseDialog.h" +#include "CopyDialog.h" #ifdef LANG #include "LangUtils.h" @@ -34,13 +34,53 @@ bool CCopyDialog::OnInit() NControl::CStatic staticContol; staticContol.Attach(GetItem(IDC_COPY_STATIC)); staticContol.SetText(Static); + #ifdef UNDER_CE + // we do it, since WinCE selects Value\something instead of Value !!!! + _path.AddString(Value); + #endif for (int i = 0; i < Strings.Size(); i++) _path.AddString(Strings[i]); _path.SetText(Value); SetItemText(IDC_COPY_INFO, Info); + NormalizeSize(true); return CModalDialog::OnInit(); } +bool CCopyDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize) +{ + int mx, my; + GetMargins(8, mx, my); + int bx1, bx2, by; + GetItemSizes(IDCANCEL, bx1, by); + GetItemSizes(IDOK, bx2, by); + int y = ySize - my - by; + int x = xSize - mx - bx1; + + InvalidateRect(NULL); + + { + RECT rect; + GetClientRectOfItem(IDC_COPY_SET_PATH, rect); + int bx = rect.right - rect.left; + MoveItem(IDC_COPY_SET_PATH, xSize - mx - bx, rect.top, bx, rect.bottom - rect.top); + ChangeSubWindowSizeX(_path, xSize - mx - mx - bx - mx); + } + + { + RECT rect; + GetClientRectOfItem(IDC_COPY_INFO, rect); + NControl::CStatic staticContol; + staticContol.Attach(GetItem(IDC_COPY_INFO)); + int yPos = rect.top; + staticContol.Move(mx, yPos, xSize - mx * 2, y - 2 - yPos); + } + + MoveItem(IDCANCEL, x, y, bx1, by); + MoveItem(IDOK, x - mx - bx2, y, bx2, by); + + return false; +} + bool CCopyDialog::OnButtonClicked(int buttonID, HWND buttonHWND) { switch(buttonID) @@ -57,18 +97,10 @@ void CCopyDialog::OnButtonSetPath() UString currentPath; _path.GetText(currentPath); - /* - #ifdef LANG - UString title = LangLoadString(IDS_EXTRACT_SET_FOLDER, 0x02000881); - #else - UString title = MyLoadString(IDS_EXTRACT_SET_FOLDER); - #endif - */ UString title = LangStringSpec(IDS_SET_FOLDER, 0x03020209); - // UString title = L"Specify a location for output folder"; UString resultPath; - if (!NShell::BrowseForFolder(HWND(*this), title, currentPath, resultPath)) + if (!MyBrowseForFolder(HWND(*this), title, currentPath, resultPath)) return; NFile::NName::NormalizeDirPathPrefix(resultPath); _path.SetCurSel(-1); diff --git a/CPP/7zip/UI/FileManager/CopyDialog.h b/CPP/7zip/UI/FileManager/CopyDialog.h index 55872f1c..2c22d700 100755 --- a/CPP/7zip/UI/FileManager/CopyDialog.h +++ b/CPP/7zip/UI/FileManager/CopyDialog.h @@ -1,10 +1,11 @@ // CopyDialog.h -#ifndef __COPYDIALOG_H -#define __COPYDIALOG_H +#ifndef __COPY_DIALOG_H +#define __COPY_DIALOG_H -#include "Windows/Control/Dialog.h" #include "Windows/Control/ComboBox.h" +#include "Windows/Control/Dialog.h" + #include "CopyDialogRes.h" const int kCopyDialog_NumInfoLines = 11; @@ -14,15 +15,15 @@ class CCopyDialog: public NWindows::NControl::CModalDialog NWindows::NControl::CComboBox _path; virtual void OnOK(); virtual bool OnInit(); + virtual bool OnSize(WPARAM wParam, int xSize, int ySize); void OnButtonSetPath(); bool OnButtonClicked(int buttonID, HWND buttonHWND); public: UString Title; UString Static; UString Value; - UStringVector Strings; - UString Info; + UStringVector Strings; INT_PTR Create(HWND parentWindow = 0) { return CModalDialog::Create(IDD_DIALOG_COPY, parentWindow); } }; diff --git a/CPP/7zip/UI/FileManager/CopyDialog.rc b/CPP/7zip/UI/FileManager/CopyDialog.rc index 1686adda..922dddc4 100755 --- a/CPP/7zip/UI/FileManager/CopyDialog.rc +++ b/CPP/7zip/UI/FileManager/CopyDialog.rc @@ -1,32 +1,17 @@ #include "CopyDialogRes.h" #include "../../GuiCommon.rc" -#undef infoSize -#define infoSize 100 +#define xc 320 +#define yc 144 -#define xSize2 346 -#define ySize2 (infoSize + 50) +#define y 40 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) - -#define bYPos (ySize - marg - bYSize) -#define b1XPos (xSize - marg - bXSize) -#define b2XPos (b1XPos - 10 - bXSize) - -IDD_DIALOG_COPY DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +IDD_DIALOG_COPY MY_RESIZE_DIALOG CAPTION "Copy" -MY_FONT -BEGIN - LTEXT "", IDC_COPY_STATIC, marg, marg, xSize2, 8 - COMBOBOX IDC_COPY_COMBO, marg, 20, xSize2 - bDotsSize - 12, 65, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...", IDC_COPY_SET_PATH, (xSize - marg - bDotsSize), 20, bDotsSize, 14, WS_GROUP - LTEXT "", IDC_COPY_INFO, marg, bYPos - (infoSize + 2), xSize2, infoSize, SS_NOPREFIX | SS_LEFTNOWORDWRAP - DEFPUSHBUTTON "OK", IDOK, b2XPos, bYPos, bXSize, bYSize - PUSHBUTTON "Cancel", IDCANCEL, b1XPos, bYPos, bXSize, bYSize -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SET_FOLDER "Specify a location for output folder." -END +{ + LTEXT "", IDC_COPY_STATIC, m, m, xc, 8 + COMBOBOX IDC_COPY_COMBO, m, 20, xc - bxsDots - m, 65, MY_COMBO_WITH_EDIT + PUSHBUTTON "...", IDC_COPY_SET_PATH, xs - m - bxsDots, 18, bxsDots, bys, WS_GROUP + LTEXT "", IDC_COPY_INFO, m, y, xc, by - y - 1, SS_NOPREFIX | SS_LEFTNOWORDWRAP + OK_CANCEL +} diff --git a/CPP/7zip/UI/FileManager/CopyDialogRes.h b/CPP/7zip/UI/FileManager/CopyDialogRes.h index 900bf29f..4944de84 100755 --- a/CPP/7zip/UI/FileManager/CopyDialogRes.h +++ b/CPP/7zip/UI/FileManager/CopyDialogRes.h @@ -1,4 +1,4 @@ -#define IDD_DIALOG_COPY 202 +#define IDD_DIALOG_COPY 506 #define IDC_COPY_STATIC 1000 #define IDC_COPY_COMBO 1001 diff --git a/CPP/7zip/UI/FileManager/DialogSize.h b/CPP/7zip/UI/FileManager/DialogSize.h new file mode 100755 index 00000000..f4dd1c32 --- /dev/null +++ b/CPP/7zip/UI/FileManager/DialogSize.h @@ -0,0 +1,16 @@ +// DialogSize.h + +#ifndef __DIALOG_SIZE_H +#define __DIALOG_SIZE_H + +#include "Windows/Control/Dialog.h" + +#ifdef UNDER_CE +#define BIG_DIALOG_SIZE(x, y) bool isBig = NWindows::NControl::IsDialogSizeOK(x, y); +#define SIZED_DIALOG(big) (isBig ? big : big ## _2) +#else +#define BIG_DIALOG_SIZE(x, y) +#define SIZED_DIALOG(big) big +#endif + +#endif diff --git a/CPP/7zip/UI/FileManager/EditPage.cpp b/CPP/7zip/UI/FileManager/EditPage.cpp index 69261eb6..dbc580ff 100755 --- a/CPP/7zip/UI/FileManager/EditPage.cpp +++ b/CPP/7zip/UI/FileManager/EditPage.cpp @@ -1,20 +1,14 @@ // EditPage.cpp #include "StdAfx.h" -#include "EditPageRes.h" -#include "EditPage.h" -#include "Common/StringConvert.h" - -#include "Windows/Defs.h" -#include "Windows/CommonDialog.h" -// #include "Windows/FileFind.h" -// #include "Windows/FileDir.h" +#include "EditPage.h" +#include "EditPageRes.h" -#include "RegistryUtils.h" +#include "BrowseDialog.h" #include "HelpUtils.h" #include "LangUtils.h" -#include "ProgramLocation.h" +#include "RegistryUtils.h" using namespace NWindows; @@ -38,9 +32,6 @@ bool CEditPage::OnInit() LONG CEditPage::OnApply() { - // int selectedIndex = _langCombo.GetCurSel(); - // int pathIndex = _langCombo.GetItemData(selectedIndex); - // ReloadLang(); UString editorPath; _editorEdit.GetText(editorPath); SaveRegEditor(editorPath); @@ -49,33 +40,27 @@ LONG CEditPage::OnApply() void CEditPage::OnNotifyHelp() { - ShowHelpWindow(NULL, kEditTopic); // change it + ShowHelpWindow(NULL, kEditTopic); } -bool CEditPage::OnButtonClicked(int aButtonID, HWND aButtonHWND) +bool CEditPage::OnButtonClicked(int buttonID, HWND buttonHWND) { - switch(aButtonID) + switch (buttonID) { case IDC_EDIT_BUTTON_SET: { - OnSetEditorButton(); - // if (!NShell::BrowseForFolder(HWND(*this), title, currentPath, aResultPath)) - // return; + UString editorPath; + _editorEdit.GetText(editorPath); + UString resPath; + if (MyBrowseForFile(HWND(*this), 0, editorPath, L"*.exe", resPath)) + { + _editorEdit.SetText(resPath); + // Changed(); + } return true; } } - return CPropertyPage::OnButtonClicked(aButtonID, aButtonHWND); -} - -void CEditPage::OnSetEditorButton() -{ - UString editorPath; - _editorEdit.GetText(editorPath); - UString resPath; - if(!MyGetOpenFileName(HWND(*this), 0, editorPath, L"*.exe", resPath)) - return; - _editorEdit.SetText(resPath); - // Changed(); + return CPropertyPage::OnButtonClicked(buttonID, buttonHWND); } bool CEditPage::OnCommand(int code, int itemID, LPARAM param) @@ -87,5 +72,3 @@ bool CEditPage::OnCommand(int code, int itemID, LPARAM param) } return CPropertyPage::OnCommand(code, itemID, param); } - - diff --git a/CPP/7zip/UI/FileManager/EditPage.h b/CPP/7zip/UI/FileManager/EditPage.h index 26999dcf..cfc50658 100755 --- a/CPP/7zip/UI/FileManager/EditPage.h +++ b/CPP/7zip/UI/FileManager/EditPage.h @@ -1,7 +1,7 @@ // EditPage.h -#ifndef __EDITPAGE_H -#define __EDITPAGE_H +#ifndef __EDIT_PAGE_H +#define __EDIT_PAGE_H #include "Windows/Control/PropertyPage.h" #include "Windows/Control/Edit.h" @@ -9,13 +9,12 @@ class CEditPage: public NWindows::NControl::CPropertyPage { NWindows::NControl::CEdit _editorEdit; - void OnSetEditorButton(); public: virtual bool OnInit(); virtual void OnNotifyHelp(); virtual bool OnCommand(int code, int itemID, LPARAM param); virtual LONG OnApply(); - virtual bool OnButtonClicked(int aButtonID, HWND aButtonHWND); + virtual bool OnButtonClicked(int buttonID, HWND buttonHWND); }; #endif diff --git a/CPP/7zip/UI/FileManager/EditPage.rc b/CPP/7zip/UI/FileManager/EditPage.rc index ea261286..eb1e8599 100755 --- a/CPP/7zip/UI/FileManager/EditPage.rc +++ b/CPP/7zip/UI/FileManager/EditPage.rc @@ -1,16 +1,13 @@ #include "EditPageRes.h" #include "../../GuiCommon.rc" -#define xSize2 196 -#define ySize2 140 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#define xc SMALL_PAGE_SIZE_X +#define yc 60 -IDD_EDIT DIALOG 0, 0, xSize, ySize MY_PAGE_STYLE +IDD_EDIT MY_PAGE CAPTION "Editor" -MY_FONT -BEGIN - LTEXT "&Editor:", IDC_EDIT_STATIC_EDITOR, marg, marg, xSize2, 8 - EDITTEXT IDC_EDIT_EDIT_EDITOR, marg, 20, xSize2 - 12 - bDotsSize, 14, ES_AUTOHSCROLL - PUSHBUTTON "...", IDC_EDIT_BUTTON_SET, (xSize - marg - bDotsSize), 20, bDotsSize, bYSize -END +{ + LTEXT "&Editor:", IDC_EDIT_STATIC_EDITOR, m, m, xc, 8 + EDITTEXT IDC_EDIT_EDIT_EDITOR, m, 20, xc - m - bxsDots, 14, ES_AUTOHSCROLL + PUSHBUTTON "...", IDC_EDIT_BUTTON_SET, xs - m - bxsDots, 19, bxsDots, bys +} diff --git a/CPP/7zip/UI/FileManager/EditPageRes.h b/CPP/7zip/UI/FileManager/EditPageRes.h index a2de1970..33981ae0 100755 --- a/CPP/7zip/UI/FileManager/EditPageRes.h +++ b/CPP/7zip/UI/FileManager/EditPageRes.h @@ -1,4 +1,4 @@ -#define IDD_EDIT 903 +#define IDD_EDIT 542 #define IDC_EDIT_STATIC_EDITOR 1000 #define IDC_EDIT_EDIT_EDITOR 1002 #define IDC_EDIT_BUTTON_SET 1003 diff --git a/CPP/7zip/UI/FileManager/ExtractCallback.cpp b/CPP/7zip/UI/FileManager/ExtractCallback.cpp index 9902e9a1..d27db23f 100755 --- a/CPP/7zip/UI/FileManager/ExtractCallback.cpp +++ b/CPP/7zip/UI/FileManager/ExtractCallback.cpp @@ -1,23 +1,17 @@ -// ExtractCallback.h +// ExtractCallback.cpp #include "StdAfx.h" -#include "Common/Wildcard.h" -#include "Common/StringConvert.h" - #include "Windows/Error.h" #include "Windows/FileDir.h" #include "Windows/FileFind.h" -#include "Windows/ResourceString.h" #include "../../Common/FilePathAutoRename.h" #include "../GUI/ExtractRes.h" -#include "../GUI/resource.h" #include "ExtractCallback.h" #include "FormatUtils.h" -#include "MessagesDialog.h" #include "OverwriteDialog.h" #ifndef _NO_CRYPTO #include "PasswordDialog.h" @@ -27,20 +21,12 @@ using namespace NWindows; using namespace NFile; using namespace NFind; -CExtractCallbackImp::~CExtractCallbackImp() -{ - if (ShowMessages && !Messages.IsEmpty()) - { - CMessagesDialog messagesDialog; - messagesDialog.Messages = &Messages; - messagesDialog.Create(ParentWindow); - } -} +CExtractCallbackImp::~CExtractCallbackImp() {} void CExtractCallbackImp::Init() { - Messages.Clear(); NumArchiveErrors = 0; + ThereAreMessageErrors = false; #ifndef _SFX NumFolders = NumFiles = 0; NeedAddFile = false; @@ -49,7 +35,8 @@ void CExtractCallbackImp::Init() void CExtractCallbackImp::AddErrorMessage(LPCWSTR message) { - Messages.Add(message); + ThereAreMessageErrors = true; + ProgressDialog->Sync.AddErrorMessage(message); } STDMETHODIMP CExtractCallbackImp::SetNumFiles(UInt64 @@ -59,40 +46,40 @@ STDMETHODIMP CExtractCallbackImp::SetNumFiles(UInt64 ) { #ifndef _SFX - ProgressDialog.ProgressSynch.SetNumFilesTotal(numFiles); + ProgressDialog->Sync.SetNumFilesTotal(numFiles); #endif return S_OK; } STDMETHODIMP CExtractCallbackImp::SetTotal(UInt64 total) { - ProgressDialog.ProgressSynch.SetProgress(total, 0); + ProgressDialog->Sync.SetProgress(total, 0); return S_OK; } STDMETHODIMP CExtractCallbackImp::SetCompleted(const UInt64 *value) { - RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause()); + RINOK(ProgressDialog->Sync.ProcessStopAndPause()); if (value != NULL) - ProgressDialog.ProgressSynch.SetPos(*value); + ProgressDialog->Sync.SetPos(*value); return S_OK; } HRESULT CExtractCallbackImp::Open_CheckBreak() { - return ProgressDialog.ProgressSynch.ProcessStopAndPause(); + return ProgressDialog->Sync.ProcessStopAndPause(); } HRESULT CExtractCallbackImp::Open_SetTotal(const UInt64 * /* numFiles */, const UInt64 * /* numBytes */) { - // if (numFiles != NULL) ProgressDialog.ProgressSynch.SetNumFilesTotal(*numFiles); + // if (numFiles != NULL) ProgressDialog->Sync.SetNumFilesTotal(*numFiles); return S_OK; } HRESULT CExtractCallbackImp::Open_SetCompleted(const UInt64 * /* numFiles */, const UInt64 * /* numBytes */) { - RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause()); - // if (numFiles != NULL) ProgressDialog.ProgressSynch.SetNumFilesCur(*numFiles); + RINOK(ProgressDialog->Sync.ProcessStopAndPause()); + // if (numFiles != NULL) ProgressDialog->Sync.SetNumFilesCur(*numFiles); return S_OK; } @@ -126,7 +113,7 @@ void CExtractCallbackImp::Open_ClearPasswordWasAskedFlag() #ifndef _SFX STDMETHODIMP CExtractCallbackImp::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) { - ProgressDialog.ProgressSynch.SetRatioInfo(inSize, outSize); + ProgressDialog->Sync.SetRatioInfo(inSize, outSize); return S_OK; } #endif @@ -134,14 +121,14 @@ STDMETHODIMP CExtractCallbackImp::SetRatioInfo(const UInt64 *inSize, const UInt6 /* STDMETHODIMP CExtractCallbackImp::SetTotalFiles(UInt64 total) { - ProgressDialog.ProgressSynch.SetNumFilesTotal(total); + ProgressDialog->Sync.SetNumFilesTotal(total); return S_OK; } STDMETHODIMP CExtractCallbackImp::SetCompletedFiles(const UInt64 *value) { if (value != NULL) - ProgressDialog.ProgressSynch.SetNumFilesCur(*value); + ProgressDialog->Sync.SetNumFilesCur(*value); return S_OK; } */ @@ -153,30 +140,16 @@ STDMETHODIMP CExtractCallbackImp::AskOverwrite( { COverwriteDialog dialog; - dialog.OldFileInfo.Time = *existTime; - dialog.OldFileInfo.SizeIsDefined = (existSize != NULL); - if (dialog.OldFileInfo.SizeIsDefined) - dialog.OldFileInfo.Size = *existSize; + dialog.OldFileInfo.SetTime(existTime); + dialog.OldFileInfo.SetSize(existSize); dialog.OldFileInfo.Name = existName; - if (newTime == 0) - dialog.NewFileInfo.TimeIsDefined = false; - else - { - dialog.NewFileInfo.TimeIsDefined = true; - dialog.NewFileInfo.Time = *newTime; - } - - dialog.NewFileInfo.SizeIsDefined = (newSize != NULL); - if (dialog.NewFileInfo.SizeIsDefined) - dialog.NewFileInfo.Size = *newSize; + dialog.NewFileInfo.SetTime(newTime); + dialog.NewFileInfo.SetSize(newSize); dialog.NewFileInfo.Name = newName; - /* - NOverwriteDialog::NResult::EEnum writeAnswer = - NOverwriteDialog::Execute(oldFileInfo, newFileInfo); - */ - INT_PTR writeAnswer = dialog.Create(ProgressDialog); // ParentWindow doesn't work with 7z + ProgressDialog->WaitCreating(); + INT_PTR writeAnswer = dialog.Create(*ProgressDialog); switch(writeAnswer) { @@ -243,7 +216,8 @@ STDMETHODIMP CExtractCallbackImp::SetOperationResult(Int32 operationResult, bool } if (_needWriteArchivePath) { - AddErrorMessage(_currentArchivePath); + if (!_currentArchivePath.IsEmpty()) + AddErrorMessage(_currentArchivePath); _needWriteArchivePath = false; } AddErrorMessage( @@ -259,7 +233,7 @@ STDMETHODIMP CExtractCallbackImp::SetOperationResult(Int32 operationResult, bool NumFolders++; else NumFiles++; - ProgressDialog.ProgressSynch.SetNumFilesCur(NumFiles); + ProgressDialog->Sync.SetNumFilesCur(NumFiles); #endif return S_OK; } @@ -270,7 +244,7 @@ STDMETHODIMP CExtractCallbackImp::SetOperationResult(Int32 operationResult, bool HRESULT CExtractCallbackImp::BeforeOpen(const wchar_t *name) { #ifndef _SFX - ProgressDialog.ProgressSynch.SetTitleFileName(name); + ProgressDialog->Sync.SetTitleFileName(name); #endif _currentArchivePath = name; return S_OK; @@ -280,7 +254,7 @@ HRESULT CExtractCallbackImp::SetCurrentFilePath2(const wchar_t *path) { _currentFilePath = path; #ifndef _SFX - ProgressDialog.ProgressSynch.SetCurrentFileName(path); + ProgressDialog->Sync.SetCurrentFileName(path); #endif return S_OK; } @@ -291,7 +265,7 @@ HRESULT CExtractCallbackImp::SetCurrentFilePath(const wchar_t *path) if (NeedAddFile) NumFiles++; NeedAddFile = true; - ProgressDialog.ProgressSynch.SetNumFilesCur(NumFiles); + ProgressDialog->Sync.SetNumFilesCur(NumFiles); #endif return SetCurrentFilePath2(path); } @@ -365,7 +339,8 @@ STDMETHODIMP CExtractCallbackImp::CryptoGetTextPassword(BSTR *password) if (!PasswordIsDefined) { CPasswordDialog dialog; - if (dialog.Create(ProgressDialog) == IDCANCEL) + ProgressDialog->WaitCreating(); + if (dialog.Create(*ProgressDialog) == IDCANCEL) return E_ABORT; Password = dialog.Password; PasswordIsDefined = true; diff --git a/CPP/7zip/UI/FileManager/ExtractCallback.h b/CPP/7zip/UI/FileManager/ExtractCallback.h index ee46222a..b4e88fd5 100755 --- a/CPP/7zip/UI/FileManager/ExtractCallback.h +++ b/CPP/7zip/UI/FileManager/ExtractCallback.h @@ -1,30 +1,27 @@ // ExtractCallback.h -#ifndef __EXTRACTCALLBACK_H -#define __EXTRACTCALLBACK_H +#ifndef __EXTRACT_CALLBACK_H +#define __EXTRACT_CALLBACK_H + +#include "Common/MyCom.h" + +#include "Windows/ResourceString.h" #include "../Agent/IFolderArchive.h" -#include "Common/MyString.h" #include "../Common/ArchiveOpenCallback.h" -#ifdef _SFX -#include "ProgressDialog.h" -#else -#include "ProgressDialog2.h" +#ifndef _NO_CRYPTO +#include "../../IPassword.h" #endif -#include "Windows/ResourceString.h" +#include "IFolder.h" + +#include "ProgressDialog2.h" #ifdef LANG #include "LangUtils.h" #endif -#ifndef _NO_CRYPTO -#include "../../IPassword.h" -#endif -#include "Common/MyCom.h" -#include "IFolder.h" - class CExtractCallbackImp: public IExtractCallbackUI, public IOpenCallbackUI, @@ -99,32 +96,23 @@ public: #endif private: - // bool _extractMode; UString _currentArchivePath; bool _needWriteArchivePath; UString _currentFilePath; bool _isFolder; - // void CreateComplexDirectory(const UStringVector &aDirPathParts); - HRESULT SetCurrentFilePath2(const wchar_t *filePath); void AddErrorMessage(LPCWSTR message); public: - CProgressDialog ProgressDialog; - UStringVector Messages; - bool ShowMessages; + CProgressDialog *ProgressDialog; #ifndef _SFX UInt64 NumFolders; UInt64 NumFiles; bool NeedAddFile; #endif - HWND ParentWindow; - INT_PTR StartProgressDialog(const UString &title) - { - return ProgressDialog.Create(title, ParentWindow); - } UInt32 NumArchiveErrors; + bool ThereAreMessageErrors; NExtract::NOverwriteMode::EEnum OverwriteMode; #ifndef _NO_CRYPTO @@ -138,13 +126,13 @@ public: PasswordIsDefined(false), PasswordWasAsked(false), #endif - OverwriteMode(NExtract::NOverwriteMode::kAskBefore), - ParentWindow(0), - ShowMessages(true) + OverwriteMode(NExtract::NOverwriteMode::kAskBefore) {} ~CExtractCallbackImp(); void Init(); + + bool IsOK() const { return NumArchiveErrors == 0 && !ThereAreMessageErrors; } }; #endif diff --git a/CPP/7zip/UI/FileManager/FM.cpp b/CPP/7zip/UI/FileManager/FM.cpp index e4bcc998..033e266d 100755 --- a/CPP/7zip/UI/FileManager/FM.cpp +++ b/CPP/7zip/UI/FileManager/FM.cpp @@ -6,7 +6,11 @@ #include "Windows/Error.h" #include "Windows/MemoryLock.h" +#include "Windows/NtCheck.h" + +#ifndef UNDER_CE #include "Windows/Security.h" +#endif #include "../GUI/ExtractRes.h" @@ -29,13 +33,21 @@ using namespace NFind; #define MENU_HEIGHT 26 -#ifndef _UNICODE -bool g_IsNT = false; -#endif HINSTANCE g_hInstance; HWND g_HWND; bool g_OpenArchive = false; static UString g_MainPath; +static bool g_Maximized = false; + +#ifndef UNDER_CE +DWORD g_ComCtl32Version; +#endif + +bool g_LVN_ITEMACTIVATE_Support = true; +// LVN_ITEMACTIVATE replaces both NM_DBLCLK & NM_RETURN +// Windows 2000 +// NT/98 + IE 3 (g_ComCtl32Version >= 4.70) + const int kNumDefaultPanels = 1; @@ -45,21 +57,6 @@ int kPanelSizeMin = 120; // bool OnMenuCommand(HWND hWnd, int id); -static UString GetProgramPath() -{ - UString s; - NDLL::MyGetModuleFileName(g_hInstance, s); - return s; -} - -UString GetProgramFolderPrefix() -{ - UString path = GetProgramPath(); - int pos = path.ReverseFind(WCHAR_PATH_SEPARATOR); - return path.Left(pos + 1); -} - - class CSplitterPos { int _ratio; // 10000 is max @@ -123,22 +120,18 @@ static int g_StartCaptureSplitterPos; CApp g_App; -void MoveSubWindows(HWND hWnd); -void OnSize(HWND hWnd); - LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); const wchar_t *kWindowClass = L"FM"; -#ifndef _UNICODE -static bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} +#ifdef UNDER_CE +#define WS_OVERLAPPEDWINDOW ( \ + WS_OVERLAPPED | \ + WS_CAPTION | \ + WS_SYSMENU | \ + WS_THICKFRAME | \ + WS_MINIMIZEBOX | \ + WS_MAXIMIZEBOX) #endif // FUNCTION: InitInstance(HANDLE, int) @@ -173,14 +166,21 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; - wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_FAM)); + wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON)); // wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hCursor = ::LoadCursor(0, IDC_SIZEWE); // wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); - wc.lpszMenuName = MAKEINTRESOURCEW(IDM_MENU); + wc.lpszMenuName = + #ifdef UNDER_CE + 0 + #else + MAKEINTRESOURCEW(IDM_MENU) + #endif + ; + wc.lpszClassName = kWindowClass; MyRegisterClass(&wc); @@ -225,29 +225,37 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) if (!wnd.Create(kWindowClass, title, style, x, y, xSize, ySize, NULL, NULL, hInstance, NULL)) return FALSE; - g_HWND = (HWND)wnd; + if (nCmdShow == SW_SHOWNORMAL || + nCmdShow == SW_SHOW + #ifndef UNDER_CE + || nCmdShow == SW_SHOWDEFAULT + #endif + ) + { + if (maximized) + nCmdShow = SW_SHOWMAXIMIZED; + else + nCmdShow = SW_SHOWNORMAL; + } + + if (nCmdShow == SW_SHOWMAXIMIZED) + g_Maximized = true; + + #ifndef UNDER_CE WINDOWPLACEMENT placement; placement.length = sizeof(placement); if (wnd.GetPlacement(&placement)) { - if (nCmdShow == SW_SHOWNORMAL || nCmdShow == SW_SHOW || - nCmdShow == SW_SHOWDEFAULT) - { - if (maximized) - placement.showCmd = SW_SHOWMAXIMIZED; - else - placement.showCmd = SW_SHOWNORMAL; - } - else - placement.showCmd = nCmdShow; if (windowPosIsRead) placement.rcNormalPosition = rect; + placement.showCmd = nCmdShow; wnd.SetPlacement(&placement); - // window.Show(nCmdShow); } else + #endif wnd.Show(nCmdShow); + return TRUE; } @@ -277,22 +285,23 @@ static void GetCommands(const UString &aCommandLine, UString &aCommands) } */ -DWORD GetDllVersion(LPCTSTR lpszDllName) +#ifndef UNDER_CE +static DWORD GetDllVersion(LPCTSTR lpszDllName) { HINSTANCE hinstDll; DWORD dwVersion = 0; hinstDll = LoadLibrary(lpszDllName); - if(hinstDll) + if (hinstDll) { DLLGETVERSIONPROC pDllGetVersion; - pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hinstDll, "DllGetVersion"); + pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstDll, "DllGetVersion"); /*Because some DLLs might not implement this function, you must test for it explicitly. Depending on the particular DLL, the lack of a DllGetVersion function can be a useful indicator of the version. */ - if(pDllGetVersion) + if (pDllGetVersion) { DLLVERSIONINFO dvi; HRESULT hr; @@ -302,7 +311,7 @@ DWORD GetDllVersion(LPCTSTR lpszDllName) hr = (*pDllGetVersion)(&dvi); - if(SUCCEEDED(hr)) + if (SUCCEEDED(hr)) { dwVersion = MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion); } @@ -311,8 +320,7 @@ DWORD GetDllVersion(LPCTSTR lpszDllName) } return dwVersion; } - -DWORD g_ComCtl32Version; +#endif /* #ifndef _WIN64 @@ -354,6 +362,7 @@ bool IsLargePageSupported() #endif } +#ifndef UNDER_CE static void SetMemoryLock() { if (!IsLargePageSupported()) @@ -364,6 +373,7 @@ static void SetMemoryLock() if (ReadLockMemoryEnable()) NSecurity::EnableLockMemoryPrivilege(); } +#endif /* static const int kNumSwitches = 1; @@ -378,34 +388,52 @@ enum Enum static const CSwitchForm kSwitchForms[kNumSwitches] = { - { L"SOA", NSwitchType::kSimple, false }, + { L"SOA", NSwitchType::kSimple, false }, }; */ // int APIENTRY WinMain2(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */); -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int nCmdShow) -{ - #ifndef _UNICODE - g_IsNT = IsItWindowsNT(); - #endif +#define NT_CHECK_FAIL_ACTION MessageBoxW(0, L"Unsupported Windows version", L"7-zip", MB_ICONERROR); return 1; +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + #ifdef UNDER_CE + LPWSTR + #else + LPSTR + #endif + /* lpCmdLine */, int nCmdShow) +{ #ifdef _WIN32 + + NT_CHECK SetLargePageSize(); + #endif InitCommonControls(); + #ifndef UNDER_CE g_ComCtl32Version = ::GetDllVersion(TEXT("comctl32.dll")); + g_LVN_ITEMACTIVATE_Support = (g_ComCtl32Version >= MAKELONG(71, 4)); + #endif // OleInitialize is required for drag and drop. + #ifndef UNDER_CE OleInitialize(NULL); + #endif // Maybe needs CoInitializeEx also ? // NCOM::CComInitializer comInitializer; - UString programString, commandsString; + UString commandsString; // MessageBoxW(0, GetCommandLineW(), L"", 0); + + #ifdef UNDER_CE + commandsString = GetCommandLineW(); + #else + UString programString; SplitStringToTwoStrings(GetCommandLineW(), programString, commandsString); + #endif commandsString.Trim(); UString paramString, tailString; @@ -427,7 +455,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* { parser.ParseStrings(kSwitchForms, commandStrings); const UStringVector &nonSwitchStrings = parser.NonSwitchStrings; - if(nonSwitchStrings.Size() > 1) + if (nonSwitchStrings.Size() > 1) { g_MainPath = nonSwitchStrings[1]; // g_OpenArchive = parser[NKey::kOpenArachive].ThereIs; @@ -443,14 +471,14 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* */ + #ifndef UNDER_CE SetMemoryLock(); + #endif MSG msg; if (!InitInstance (hInstance, nCmdShow)) return FALSE; - MyLoadMenu(g_HWND); - #ifndef _UNICODE if (g_IsNT) { @@ -481,40 +509,39 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* } g_HWND = 0; + #ifndef UNDER_CE OleUninitialize(); + #endif return (int)msg.wParam; } static void SaveWindowInfo(HWND aWnd) { - /* + #ifdef UNDER_CE RECT rect; if (!::GetWindowRect(aWnd, &rect)) return; - */ + SaveWindowSize(rect, g_Maximized); + #else WINDOWPLACEMENT placement; placement.length = sizeof(placement); if (!::GetWindowPlacement(aWnd, &placement)) return; - SaveWindowSize(placement.rcNormalPosition, - BOOLToBool(::IsZoomed(aWnd))); - SavePanelsInfo(g_App.NumPanels, g_App.LastFocusedPanel, - g_Splitter.GetPos()); + SaveWindowSize(placement.rcNormalPosition, BOOLToBool(::IsZoomed(aWnd))); + #endif + SavePanelsInfo(g_App.NumPanels, g_App.LastFocusedPanel, g_Splitter.GetPos()); } -void ExecuteCommand(UINT commandID) +static void ExecuteCommand(UINT commandID) { + CPanel::CDisableTimerProcessing disableTimerProcessing1(g_App.Panels[0]); + CPanel::CDisableTimerProcessing disableTimerProcessing2(g_App.Panels[1]); + switch (commandID) { - case kAddCommand: - g_App.AddToArchive(); - break; - case kExtractCommand: - g_App.ExtractArchives(); - break; - case kTestCommand: - g_App.TestArchives(); - break; + case kAddCommand: g_App.AddToArchive(); break; + case kExtractCommand: g_App.ExtractArchives(); break; + case kTestCommand: g_App.TestArchives(); break; } } @@ -554,7 +581,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_CREATE: { - + g_HWND = hWnd; /* INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); @@ -679,7 +706,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { g_Splitter.SetPos(hWnd, g_StartCaptureSplitterPos + (short)LOWORD(lParam) - g_StartCaptureMousePos); - MoveSubWindows(hWnd); + g_App.MoveSubWindows(); } break; } @@ -693,8 +720,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) g_Splitter.SetPos(hWnd, g_SplitterPos ); g_CanChangeSplitter = true; } + + g_Maximized = (wParam == SIZE_MAXIMIZED) || (wParam == SIZE_MAXSHOW); - OnSize(hWnd); + g_App.MoveSubWindows(); /* int xSize = LOWORD(lParam); int ySize = HIWORD(lParam); @@ -729,7 +758,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) */ /* case kLangWasChangedMessage: - MyLoadMenu(g_HWND); + MyLoadMenu(); return 0; */ @@ -749,71 +778,71 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) return 0 ; } */ - } - #ifndef _UNICODE - if (g_IsNT) - return DefWindowProcW(hWnd, message, wParam, lParam); - else - #endif - return DefWindowProc(hWnd, message, wParam, lParam); - -} - -void OnSize(HWND hWnd) -{ - /* - if (g_App._rebar) - { - RECT rect; - ::GetClientRect(hWnd, &rect); - int xSize = rect.right; - int ySize = rect.bottom; - // rect.bottom = 0; - // g_App._rebar.SizeToRect(&rect); - // g_App._rebar.Move(0, 0, xSize, ySize); } - */ - MoveSubWindows(hWnd); + #ifndef _UNICODE + if (g_IsNT) + return DefWindowProcW(hWnd, message, wParam, lParam); + else + #endif + return DefWindowProc(hWnd, message, wParam, lParam); + } -int Window_GetRealHeight(NWindows::CWindow &w) +static int Window_GetRealHeight(NWindows::CWindow &w) { RECT rect; - WINDOWPLACEMENT placement; w.GetWindowRect(&rect); int res = rect.bottom - rect.top; + #ifndef UNDER_CE + WINDOWPLACEMENT placement; if (w.GetPlacement(&placement)) res += placement.rcNormalPosition.top; + #endif return res; } -void MoveSubWindows(HWND hWnd) +void CApp::MoveSubWindows() { + HWND hWnd = _window; RECT rect; + if (hWnd == 0) + return; ::GetClientRect(hWnd, &rect); int xSize = rect.right; + if (xSize == 0) + return; int headerSize = 0; - if (g_App._rebar) - headerSize = Window_GetRealHeight(g_App._rebar); + #ifdef UNDER_CE + _commandBar.AutoSize(); + { + _commandBar.Show(true); // maybe we need it for + headerSize += _commandBar.Height(); + } + #endif + if (_toolBar) + { + _toolBar.AutoSize(); + #ifdef UNDER_CE + int h2 = Window_GetRealHeight(_toolBar); + _toolBar.Move(0, headerSize, xSize, h2); + #endif + headerSize += Window_GetRealHeight(_toolBar); + } int ySize = MyMax((int)(rect.bottom - headerSize), 0); - // It's for such case: Minimize / Close: - if (xSize == 0 && ySize == 0) - return; - - if (g_App.NumPanels > 1) + if (NumPanels > 1) { - g_App.Panels[0].Move(0, headerSize, g_Splitter.GetPos(), ySize); + Panels[0].Move(0, headerSize, g_Splitter.GetPos(), ySize); int xWidth1 = g_Splitter.GetPos() + kSplitterWidth; - g_App.Panels[1].Move(xWidth1, headerSize, xSize - xWidth1, ySize); + Panels[1].Move(xWidth1, headerSize, xSize - xWidth1, ySize); } else { /* - int otherPanel = 1 - g_App.LastFocusedPanel; - if (g_App.PanelsCreated[otherPanel]) - g_App.Panels[otherPanel].Move(0, headerSize, 0, ySize); + int otherPanel = 1 - LastFocusedPanel; + if (PanelsCreated[otherPanel]) + Panels[otherPanel].Move(0, headerSize, 0, ySize); */ - g_App.Panels[g_App.LastFocusedPanel].Move(0, headerSize, xSize, ySize); + Panels[LastFocusedPanel].Move(0, headerSize, xSize, ySize); } } diff --git a/CPP/7zip/UI/FileManager/FM.dsp b/CPP/7zip/UI/FileManager/FM.dsp index 2c3ab6c8..615043b5 100755 --- a/CPP/7zip/UI/FileManager/FM.dsp +++ b/CPP/7zip/UI/FileManager/FM.dsp @@ -404,25 +404,21 @@ SOURCE=.\PanelSplitFile.cpp # Begin Group "Options" # PROP Default_Filter "" -# Begin Group "Settings" - -# PROP Default_Filter "" # Begin Source File -SOURCE=.\SettingsPage.cpp +SOURCE=.\EditPage.cpp # End Source File # Begin Source File -SOURCE=.\SettingsPage.h +SOURCE=.\EditPage.h # End Source File -# End Group # Begin Source File -SOURCE=.\EditPage.cpp +SOURCE=.\FoldersPage.cpp # End Source File # Begin Source File -SOURCE=.\EditPage.h +SOURCE=.\FoldersPage.h # End Source File # Begin Source File @@ -434,48 +430,41 @@ SOURCE=.\LangPage.h # End Source File # Begin Source File -SOURCE=.\PluginsPage.cpp +SOURCE=.\MenuPage.cpp # End Source File # Begin Source File -SOURCE=.\PluginsPage.h +SOURCE=.\MenuPage.h # End Source File # Begin Source File -SOURCE=.\SystemPage.cpp +SOURCE=.\OptionsDialog.cpp # End Source File # Begin Source File -SOURCE=.\SystemPage.h +SOURCE=.\PluginsPage.cpp # End Source File -# End Group -# Begin Group "Password" - -# PROP Default_Filter "" # Begin Source File -SOURCE=.\PasswordDialog.cpp +SOURCE=.\PluginsPage.h # End Source File # Begin Source File -SOURCE=.\PasswordDialog.h +SOURCE=.\SettingsPage.cpp # End Source File -# End Group -# Begin Group "Progress" +# Begin Source File -# PROP Default_Filter "" +SOURCE=.\SettingsPage.h +# End Source File # Begin Source File -SOURCE=.\ProgressDialog2.cpp +SOURCE=.\SystemPage.cpp # End Source File # Begin Source File -SOURCE=.\ProgressDialog2.h +SOURCE=.\SystemPage.h # End Source File # End Group -# Begin Group "About" - -# PROP Default_Filter "" # Begin Source File SOURCE=.\AboutDialog.cpp @@ -484,19 +473,14 @@ SOURCE=.\AboutDialog.cpp SOURCE=.\AboutDialog.h # End Source File -# End Group -# Begin Group "Split" - -# PROP Default_Filter "" # Begin Source File -SOURCE=.\SplitDialog.cpp +SOURCE=.\BrowseDialog.cpp # End Source File # Begin Source File -SOURCE=.\SplitDialog.h +SOURCE=.\BrowseDialog.h # End Source File -# End Group # Begin Source File SOURCE=.\ComboDialog.cpp @@ -515,6 +499,10 @@ SOURCE=CopyDialog.h # End Source File # Begin Source File +SOURCE=.\DialogSize.h +# End Source File +# Begin Source File + SOURCE=.\ListViewDialog.cpp # End Source File # Begin Source File @@ -537,6 +525,30 @@ SOURCE=OverwriteDialog.cpp SOURCE=OverwriteDialog.h # End Source File +# Begin Source File + +SOURCE=.\PasswordDialog.cpp +# End Source File +# Begin Source File + +SOURCE=.\PasswordDialog.h +# End Source File +# Begin Source File + +SOURCE=.\ProgressDialog2.cpp +# End Source File +# Begin Source File + +SOURCE=.\ProgressDialog2.h +# End Source File +# Begin Source File + +SOURCE=.\SplitDialog.cpp +# End Source File +# Begin Source File + +SOURCE=.\SplitDialog.h +# End Source File # End Group # Begin Group "FM Common" @@ -855,6 +867,10 @@ SOURCE=..\..\..\Windows\FileIO.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\FileMapping.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\FileName.cpp # End Source File # Begin Source File @@ -907,6 +923,10 @@ SOURCE=..\..\..\Windows\Net.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\Process.cpp +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\Process.h # End Source File # Begin Source File @@ -1190,10 +1210,6 @@ SOURCE=..\Common\ExtractMode.h # End Source File # Begin Source File -SOURCE=..\Common\HandlerLoader.h -# End Source File -# Begin Source File - SOURCE=..\Common\IFileExtractCallback.h # End Source File # Begin Source File @@ -1333,6 +1349,26 @@ SOURCE=..\Agent\UpdateCallbackAgent.cpp SOURCE=..\Agent\UpdateCallbackAgent.h # End Source File # End Group +# Begin Group "Explorer" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\Explorer\ContextMenu.cpp +# End Source File +# Begin Source File + +SOURCE=..\Explorer\ContextMenu.h +# End Source File +# Begin Source File + +SOURCE=..\Explorer\RegistryContextMenu.cpp +# End Source File +# Begin Source File + +SOURCE=..\Explorer\RegistryContextMenu.h +# End Source File +# End Group # End Group # Begin Group "Compress" @@ -1436,10 +1472,6 @@ SOURCE=.\OpenCallback.h # End Source File # Begin Source File -SOURCE=.\OptionsDialog.cpp -# End Source File -# Begin Source File - SOURCE=.\PluginInterface.h # End Source File # Begin Source File diff --git a/CPP/7zip/UI/FileManager/FSFolder.cpp b/CPP/7zip/UI/FileManager/FSFolder.cpp index 5951fc09..1b3837cf 100755 --- a/CPP/7zip/UI/FileManager/FSFolder.cpp +++ b/CPP/7zip/UI/FileManager/FSFolder.cpp @@ -14,7 +14,11 @@ #include "FSDrives.h" #include "FSFolder.h" + +#ifndef UNDER_CE #include "NetFolder.h" +#endif + #include "SysIconUtils.h" namespace NWindows { @@ -61,8 +65,8 @@ HRESULT CFSFolder::Init(const UString &path, IFolderFolder *parentFolder) { DWORD lastError = GetLastError(); CFindFile findFile; - CFileInfoW fileInfo; - if (!findFile.FindFirst(_path + UString(L"*"), fileInfo)) + CFileInfoW fi; + if (!findFile.FindFirst(_path + UString(L"*"), fi)) return lastError; } return S_OK; @@ -73,13 +77,13 @@ HRESULT GetFolderSize(const UString &path, UInt64 &numFolders, UInt64 &numFiles, RINOK(progress->SetCompleted(NULL)); numFiles = numFolders = size = 0; CEnumeratorW enumerator(path + UString(WSTRING_PATH_SEPARATOR L"*")); - CFileInfoW fileInfo; - while (enumerator.Next(fileInfo)) + CFileInfoW fi; + while (enumerator.Next(fi)) { - if (fileInfo.IsDir()) + if (fi.IsDir()) { UInt64 subFolders, subFiles, subSize; - RINOK(GetFolderSize(path + UString(WCHAR_PATH_SEPARATOR) + fileInfo.Name, subFolders, subFiles, subSize, progress)); + RINOK(GetFolderSize(path + UString(WCHAR_PATH_SEPARATOR) + fi.Name, subFolders, subFiles, subSize, progress)); numFolders += subFolders; numFolders++; numFiles += subFiles; @@ -88,7 +92,7 @@ HRESULT GetFolderSize(const UString &path, UInt64 &numFolders, UInt64 &numFiles, else { numFiles++; - size += fileInfo.Size; + size += fi.Size; } } return S_OK; @@ -98,21 +102,23 @@ HRESULT CFSFolder::LoadSubItems(CDirItem &dirItem, const UString &path) { { CEnumeratorW enumerator(path + L"*"); - CDirItem fileInfo; - while (enumerator.Next(fileInfo)) + CDirItem fi; + while (enumerator.Next(fi)) { - fileInfo.CompressedSizeIsDefined = false; + #ifndef UNDER_CE + fi.CompressedSizeIsDefined = false; /* - if (!GetCompressedFileSize(_path + fileInfo.Name, - fileInfo.CompressedSize)) - fileInfo.CompressedSize = fileInfo.Size; + if (!GetCompressedFileSize(_path + fi.Name, + fi.CompressedSize)) + fi.CompressedSize = fi.Size; */ - if (fileInfo.IsDir()) + #endif + if (fi.IsDir()) { - // fileInfo.Size = GetFolderSize(_path + fileInfo.Name); - fileInfo.Size = 0; + // fi.Size = GetFolderSize(_path + fi.Name); + fi.Size = 0; } - dirItem.Files.Add(fileInfo); + dirItem.Files.Add(fi); } } if (!_flatMode) @@ -237,7 +243,8 @@ STDMETHODIMP CFSFolder::GetNumberOfSubFolders(UInt32 *numSubFolders) } */ -bool MyGetCompressedFileSizeW(LPCWSTR fileName, UInt64 &size) +#ifndef UNDER_CE +static bool MyGetCompressedFileSizeW(LPCWSTR fileName, UInt64 &size) { DWORD highPart; DWORD lowPart = ::GetCompressedFileSizeW(fileName, &highPart); @@ -256,46 +263,49 @@ bool MyGetCompressedFileSizeW(LPCWSTR fileName, UInt64 &size) size = (UInt64(highPart) << 32) | lowPart; return true; } +#endif STDMETHODIMP CFSFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) { NCOM::CPropVariant prop; if (itemIndex >= (UInt32)_refs.Size()) return E_INVALIDARG; - CDirItem &fileInfo = *_refs[itemIndex]; + CDirItem &fi = *_refs[itemIndex]; switch(propID) { - case kpidIsDir: prop = fileInfo.IsDir(); break; - case kpidName: prop = fileInfo.Name; break; - case kpidSize: if (!fileInfo.IsDir()) prop = fileInfo.Size; break; + case kpidIsDir: prop = fi.IsDir(); break; + case kpidName: prop = fi.Name; break; + case kpidSize: if (!fi.IsDir()) prop = fi.Size; break; case kpidPackSize: - if (!fileInfo.CompressedSizeIsDefined) + #ifdef UNDER_CE + prop = fi.Size; + #else + if (!fi.CompressedSizeIsDefined) { - fileInfo.CompressedSizeIsDefined = true; - if (fileInfo.IsDir () || - !MyGetCompressedFileSizeW(_path + GetRelPath(fileInfo), fileInfo.CompressedSize)) - fileInfo.CompressedSize = fileInfo.Size; + fi.CompressedSizeIsDefined = true; + if (fi.IsDir () || + !MyGetCompressedFileSizeW(_path + GetRelPath(fi), fi.CompressedSize)) + fi.CompressedSize = fi.Size; } - prop = fileInfo.CompressedSize; + prop = fi.CompressedSize; + #endif break; - case kpidAttrib: prop = (UInt32)fileInfo.Attrib; break; - case kpidCTime: prop = fileInfo.CTime; break; - case kpidATime: prop = fileInfo.ATime; break; - case kpidMTime: prop = fileInfo.MTime; break; + case kpidAttrib: prop = (UInt32)fi.Attrib; break; + case kpidCTime: prop = fi.CTime; break; + case kpidATime: prop = fi.ATime; break; + case kpidMTime: prop = fi.MTime; break; case kpidComment: { LoadComments(); UString comment; - if (_comments.GetValue(GetRelPath(fileInfo), comment)) + if (_comments.GetValue(GetRelPath(fi), comment)) prop = comment; break; } case kpidPrefix: { if (_flatMode) - { - prop = GetPrefix(fileInfo); - } + prop = GetPrefix(fi); break; } } @@ -333,10 +343,10 @@ UString CFSFolder::GetRelPath(const CDirItem &item) const STDMETHODIMP CFSFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder) { *resultFolder = 0; - const CDirItem &fileInfo = *_refs[index]; - if (!fileInfo.IsDir()) + const CDirItem &fi = *_refs[index]; + if (!fi.IsDir()) return E_INVALIDARG; - return BindToFolderSpec(GetRelPath(fileInfo), resultFolder); + return BindToFolderSpec(GetRelPath(fi), resultFolder); } STDMETHODIMP CFSFolder::BindToFolder(const wchar_t *name, IFolderFolder **resultFolder) @@ -362,15 +372,19 @@ STDMETHODIMP CFSFolder::BindToParentFolder(IFolderFolder **resultFolder) pos = parentPath.ReverseFind(WCHAR_PATH_SEPARATOR); if (pos < 0) { - parentPath.Empty(); + #ifdef UNDER_CE + *resultFolder = 0; + #else CFSDrives *drivesFolderSpec = new CFSDrives; CMyComPtr<IFolderFolder> drivesFolder = drivesFolderSpec; drivesFolderSpec->Init(); *resultFolder = drivesFolder.Detach(); + #endif return S_OK; } UString parentPathReduced = parentPath.Left(pos); parentPath = parentPath.Left(pos + 1); + #ifndef UNDER_CE pos = parentPathReduced.ReverseFind(WCHAR_PATH_SEPARATOR); if (pos == 1) { @@ -382,6 +396,7 @@ STDMETHODIMP CFSFolder::BindToParentFolder(IFolderFolder **resultFolder) *resultFolder = netFolder.Detach(); return S_OK; } + #endif CFSFolder *parentFolderSpec = new CFSFolder; CMyComPtr<IFolderFolder> parentFolder = parentFolderSpec; RINOK(parentFolderSpec->Init(parentPath, 0)); @@ -457,11 +472,11 @@ HRESULT CFSFolder::GetItemsFullSize(const UInt32 *indices, UInt32 numItems, int index = indices[i]; if (index >= _refs.Size()) return E_INVALIDARG; - const CDirItem &fileInfo = *_refs[index]; - if (fileInfo.IsDir()) + const CDirItem &fi = *_refs[index]; + if (fi.IsDir()) { UInt64 subFolders, subFiles, subSize; - RINOK(GetFolderSize(_path + GetRelPath(fileInfo), subFolders, subFiles, subSize, progress)); + RINOK(GetFolderSize(_path + GetRelPath(fi), subFolders, subFiles, subSize, progress)); numFolders += subFolders; numFolders++; numFiles += subFiles; @@ -470,7 +485,7 @@ HRESULT CFSFolder::GetItemsFullSize(const UInt32 *indices, UInt32 numItems, else { numFiles++; - size += fileInfo.Size; + size += fi.Size; } } return S_OK; @@ -478,8 +493,8 @@ HRESULT CFSFolder::GetItemsFullSize(const UInt32 *indices, UInt32 numItems, HRESULT CFSFolder::GetItemFullSize(int index, UInt64 &size, IProgress *progress) { - const CDirItem &fileInfo = *_refs[index]; - if (fileInfo.IsDir()) + const CDirItem &fi = *_refs[index]; + if (fi.IsDir()) { /* CMyComPtr<IFolderFolder> subFolder; @@ -499,9 +514,9 @@ HRESULT CFSFolder::GetItemFullSize(int index, UInt64 &size, IProgress *progress) } */ UInt64 numFolders, numFiles; - return GetFolderSize(_path + GetRelPath(fileInfo), numFolders, numFiles, size, progress); + return GetFolderSize(_path + GetRelPath(fi), numFolders, numFiles, size, progress); } - size = fileInfo.Size; + size = fi.Size; return S_OK; } @@ -560,9 +575,9 @@ STDMETHODIMP CFSFolder::CreateFile(const wchar_t *name, IProgress * /* progress STDMETHODIMP CFSFolder::Rename(UInt32 index, const wchar_t *newName, IProgress * /* progress */) { - const CDirItem &fileInfo = *_refs[index]; - const UString fullPrefix = _path + GetPrefix(fileInfo); - if (!NDirectory::MyMoveFile(fullPrefix + fileInfo.Name, fullPrefix + newName)) + const CDirItem &fi = *_refs[index]; + const UString fullPrefix = _path + GetPrefix(fi); + if (!NDirectory::MyMoveFile(fullPrefix + fi.Name, fullPrefix + newName)) return GetLastError(); return S_OK; } @@ -572,10 +587,10 @@ STDMETHODIMP CFSFolder::Delete(const UInt32 *indices, UInt32 numItems,IProgress RINOK(progress->SetTotal(numItems)); for (UInt32 i = 0; i < numItems; i++) { - const CDirItem &fileInfo = *_refs[indices[i]]; - const UString fullPath = _path + GetRelPath(fileInfo); + const CDirItem &fi = *_refs[indices[i]]; + const UString fullPath = _path + GetRelPath(fi); bool result; - if (fileInfo.IsDir()) + if (fi.IsDir()) result = NDirectory::RemoveDirectoryWithSubItems(fullPath); else result = NDirectory::DeleteFileAlways(fullPath); @@ -592,14 +607,14 @@ STDMETHODIMP CFSFolder::SetProperty(UInt32 index, PROPID propID, { if (index >= (UInt32)_refs.Size()) return E_INVALIDARG; - CDirItem &fileInfo = *_refs[index]; - if (fileInfo.Parent->Parent != 0) + CDirItem &fi = *_refs[index]; + if (fi.Parent->Parent != 0) return E_NOTIMPL; switch(propID) { case kpidComment: { - UString filename = fileInfo.Name; + UString filename = fi.Name; filename.Trim(); if (value->vt == VT_EMPTY) _comments.DeletePair(filename); @@ -630,10 +645,10 @@ STDMETHODIMP CFSFolder::GetSystemIconIndex(UInt32 index, Int32 *iconIndex) { if (index >= (UInt32)_refs.Size()) return E_INVALIDARG; - const CDirItem &fileInfo = *_refs[index]; + const CDirItem &fi = *_refs[index]; *iconIndex = 0; int iconIndexTemp; - if (GetRealIconIndex(_path + GetRelPath(fileInfo), fileInfo.Attrib, iconIndexTemp) != 0) + if (GetRealIconIndex(_path + GetRelPath(fi), fi.Attrib, iconIndexTemp) != 0) { *iconIndex = iconIndexTemp; return S_OK; diff --git a/CPP/7zip/UI/FileManager/FSFolder.h b/CPP/7zip/UI/FileManager/FSFolder.h index 95f40bb3..42e33242 100755 --- a/CPP/7zip/UI/FileManager/FSFolder.h +++ b/CPP/7zip/UI/FileManager/FSFolder.h @@ -3,7 +3,6 @@ #ifndef __FSFOLDER_H #define __FSFOLDER_H -#include "Common/MyString.h" #include "Common/MyCom.h" #include "Windows/FileFind.h" @@ -17,8 +16,10 @@ class CFSFolder; struct CFileInfoEx: public NWindows::NFile::NFind::CFileInfoW { + #ifndef UNDER_CE bool CompressedSizeIsDefined; UInt64 CompressedSize; + #endif }; struct CDirItem; @@ -98,6 +99,9 @@ private: void AddRefs(CDirItem &dirItem); public: HRESULT Init(const UString &path, IFolderFolder *parentFolder); + #ifdef UNDER_CE + HRESULT InitToRoot() { return Init(L"\\", NULL); } + #endif CFSFolder() : _flatMode(false) {} diff --git a/CPP/7zip/UI/FileManager/FSFolderCopy.cpp b/CPP/7zip/UI/FileManager/FSFolderCopy.cpp index 9711616c..b6ffd574 100755 --- a/CPP/7zip/UI/FileManager/FSFolderCopy.cpp +++ b/CPP/7zip/UI/FileManager/FSFolderCopy.cpp @@ -6,8 +6,9 @@ #include "Common/StringConvert.h" -#include "Windows/FileDir.h" +#include "Windows/DLL.h" #include "Windows/Error.h" +#include "Windows/FileDir.h" #include "../../Common/FilePathAutoRename.h" @@ -41,6 +42,29 @@ struct CProgressInfo IProgress *Progress; }; +#ifndef PROGRESS_CONTINUE + +#define PROGRESS_CONTINUE 0 +#define PROGRESS_CANCEL 1 + +#define COPY_FILE_FAIL_IF_EXISTS 0x00000001 + +typedef +DWORD +(WINAPI* LPPROGRESS_ROUTINE)( + LARGE_INTEGER TotalFileSize, + LARGE_INTEGER TotalBytesTransferred, + LARGE_INTEGER StreamSize, + LARGE_INTEGER StreamBytesTransferred, + DWORD dwStreamNumber, + DWORD dwCallbackReason, + HANDLE hSourceFile, + HANDLE hDestinationFile, + LPVOID lpData + ); + +#endif + static DWORD CALLBACK CopyProgressRoutine( LARGE_INTEGER /* TotalFileSize */, // file size LARGE_INTEGER TotalBytesTransferred, // bytes transferred @@ -94,11 +118,17 @@ static bool MyCopyFile(LPCWSTR existingFile, LPCWSTR newFile, IProgress *progres if (g_IsNT) #endif { + const wchar_t *k_DllName = + #ifdef UNDER_CE + L"coredll.dll" + #else + L"kernel32.dll" + #endif + ; CopyFileExPointerW copyFunctionW = (CopyFileExPointerW) - ::GetProcAddress(::GetModuleHandleW(L"kernel32.dll"), - "CopyFileExW"); + My_GetProcAddress(::GetModuleHandleW(k_DllName), "CopyFileExW"); if (copyFunctionW == 0) - return false; + return BOOLToBool(::CopyFileW(existingFile, newFile, TRUE)); if (copyFunctionW(existingFile, newFile, CopyProgressRoutine, &progressInfo, &CancelFlag, COPY_FILE_FAIL_IF_EXISTS)) return true; @@ -141,6 +171,7 @@ typedef BOOL (WINAPI * MoveFileWithProgressPointer)( static bool MyMoveFile(LPCWSTR existingFile, LPCWSTR newFile, IProgress *progress, UInt64 &completedSize) { + #ifndef UNDER_CE // if (IsItWindows2000orHigher()) // { CProgressInfo progressInfo; @@ -148,7 +179,7 @@ static bool MyMoveFile(LPCWSTR existingFile, LPCWSTR newFile, IProgress *progres progressInfo.StartPos = completedSize; MoveFileWithProgressPointer moveFunction = (MoveFileWithProgressPointer) - ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), + My_GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), "MoveFileWithProgressW"); if (moveFunction != 0) { @@ -172,6 +203,7 @@ static bool MyMoveFile(LPCWSTR existingFile, LPCWSTR newFile, IProgress *progres } // } // else + #endif return NDirectory::MyMoveFile(existingFile, newFile); } diff --git a/CPP/7zip/UI/FileManager/FileFolderPluginOpen.cpp b/CPP/7zip/UI/FileManager/FileFolderPluginOpen.cpp index 992fbd8c..310b890c 100755 --- a/CPP/7zip/UI/FileManager/FileFolderPluginOpen.cpp +++ b/CPP/7zip/UI/FileManager/FileFolderPluginOpen.cpp @@ -30,9 +30,12 @@ struct CThreadArchiveOpen void Process() { - OpenCallbackSpec->ProgressDialog.WaitCreating(); - Result = FolderManager->OpenFolderFile(InStream, Path, &Folder, OpenCallback); - OpenCallbackSpec->ProgressDialog.MyClose(); + try + { + CProgressCloser closer(OpenCallbackSpec->ProgressDialog); + Result = FolderManager->OpenFolderFile(InStream, Path, &Folder, OpenCallback); + } + catch(...) { Result = E_FAIL; } } static THREAD_FUNC_DECL MyThreadFunction(void *param) @@ -42,14 +45,15 @@ struct CThreadArchiveOpen } }; -static int FindPlugin(const CObjectVector<CPluginInfo> &plugins, - const UString &pluginName) +/* +static int FindPlugin(const CObjectVector<CPluginInfo> &plugins, const UString &pluginName) { for (int i = 0; i < plugins.Size(); i++) if (plugins[i].Name.CompareNoCase(pluginName) == 0) return i; return -1; } +*/ HRESULT OpenFileFolderPlugin( IInStream *inStream, @@ -77,6 +81,7 @@ HRESULT OpenFileFolderPlugin( NFile::NName::SplitNameToPureNameAndExtension(fileName, pureName, dot, extension); + /* if (!extension.IsEmpty()) { CExtInfo extInfo; @@ -94,6 +99,7 @@ HRESULT OpenFileFolderPlugin( } } } + */ for (int i = 0; i < plugins.Size(); i++) { @@ -127,11 +133,13 @@ HRESULT OpenFileFolderPlugin( t.OpenCallbackSpec->ProgressDialog.MainWindow = parentWindow; t.OpenCallbackSpec->ProgressDialog.MainTitle = LangString(IDS_APP_TITLE, 0x03000000); t.OpenCallbackSpec->ProgressDialog.MainAddTitle = progressTitle + UString(L" "); + t.OpenCallbackSpec->ProgressDialog.WaitMode = true; - NWindows::CThread thread; - if (thread.Create(CThreadArchiveOpen::MyThreadFunction, &t) != S_OK) - throw 271824; - t.OpenCallbackSpec->StartProgressDialog(progressTitle); + { + NWindows::CThread thread; + RINOK(thread.Create(CThreadArchiveOpen::MyThreadFunction, &t)); + t.OpenCallbackSpec->StartProgressDialog(progressTitle, thread); + } if (t.Result == E_ABORT) return t.Result; diff --git a/CPP/7zip/UI/FileManager/FilePlugins.cpp b/CPP/7zip/UI/FileManager/FilePlugins.cpp index 173eeffa..22993383 100755 --- a/CPP/7zip/UI/FileManager/FilePlugins.cpp +++ b/CPP/7zip/UI/FileManager/FilePlugins.cpp @@ -2,14 +2,13 @@ #include "StdAfx.h" -#include "Common/StringConvert.h" #include "Common/MyCom.h" -#include "IFolder.h" +#include "../Agent/Agent.h" + #include "FilePlugins.h" -#include "StringUtils.h" #include "PluginLoader.h" -#include "../Agent/Agent.h" +#include "StringUtils.h" using namespace NRegistryAssociations; @@ -31,9 +30,12 @@ int CExtDatabase::FindPlugin(const UString &plugin) void CExtDatabase::Read() { + /* CObjectVector<CExtInfo> extItems; ReadInternalAssociations(extItems); + */ ReadFileFolderPluginInfoList(Plugins); + /* for (int i = 0; i < extItems.Size(); i++) { const CExtInfo &extInfo = extItems[i]; @@ -48,6 +50,7 @@ void CExtDatabase::Read() } ExtBigItems.Add(extInfoBig); } + */ for (int pluginIndex = 0; pluginIndex < Plugins.Size(); pluginIndex++) { const CPluginInfo &pluginInfo = Plugins[pluginIndex]; @@ -69,6 +72,10 @@ void CExtDatabase::Read() for (int i = 0; i < exts.Size(); i++) { const UString &ext = exts[i]; + #ifdef UNDER_CE + if (ext == L"cab") + continue; + #endif int index = FindExtInfoBig(ext); if (index < 0) { @@ -91,6 +98,7 @@ void CExtDatabase::Read() void CExtDatabase::Save() { + /* CObjectVector<CExtInfo> extItems; for (int i = 0; i < ExtBigItems.Size(); i++) { @@ -107,6 +115,5 @@ void CExtDatabase::Save() extItems.Add(extInfo); } WriteInternalAssociations(extItems); + */ } - - diff --git a/CPP/7zip/UI/Explorer/FoldersPage.cpp b/CPP/7zip/UI/FileManager/FoldersPage.cpp index 67d5e867..068b9d47 100755 --- a/CPP/7zip/UI/Explorer/FoldersPage.cpp +++ b/CPP/7zip/UI/FileManager/FoldersPage.cpp @@ -5,13 +5,7 @@ #include "FoldersPageRes.h" #include "FoldersPage.h" -#include "Common/StringConvert.h" -#include "Windows/Defs.h" -#include "Windows/Shell.h" -#include "Windows/ResourceString.h" - -#include "../Common/ZipRegistry.h" - +#include "../FileManager/BrowseDialog.h" #include "../FileManager/HelpUtils.h" #include "../FileManager/LangUtils.h" @@ -38,7 +32,7 @@ static const int kNumWorkModeButtons = sizeof(kWorkModeButtons) / sizeof(kWorkMo bool CFoldersPage::OnInit() { LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); - ReadWorkDirInfo(m_WorkDirInfo); + m_WorkDirInfo.Load(); CheckButton(IDC_FOLDERS_WORK_CHECK_FOR_REMOVABLE, m_WorkDirInfo.ForRemovableOnly); @@ -138,14 +132,14 @@ void CFoldersPage::OnFoldersWorkButtonPath() m_WorkPath.GetText(currentPath); UString title = LangString(IDS_FOLDERS_SET_WORK_PATH_TITLE, 0x01000281); UString resultPath; - if (NShell::BrowseForFolder(HWND(*this), title, currentPath, resultPath)) + if (MyBrowseForFolder(HWND(*this), title, currentPath, resultPath)) m_WorkPath.SetText(resultPath); } LONG CFoldersPage::OnApply() { GetWorkDir(m_WorkDirInfo); - SaveWorkDirInfo(m_WorkDirInfo); + m_WorkDirInfo.Save(); return PSNRET_NOERROR; } diff --git a/CPP/7zip/UI/Explorer/FoldersPage.h b/CPP/7zip/UI/FileManager/FoldersPage.h index be8a362f..d8456a40 100755 --- a/CPP/7zip/UI/Explorer/FoldersPage.h +++ b/CPP/7zip/UI/FileManager/FoldersPage.h @@ -1,7 +1,7 @@ // FoldersPage.h -#ifndef __FOLDERSPAGE_H -#define __FOLDERSPAGE_H +#ifndef __FOLDERS_PAGE_H +#define __FOLDERS_PAGE_H #include "Windows/Control/PropertyPage.h" @@ -19,7 +19,6 @@ class CFoldersPage : public NWindows::NControl::CPropertyPage int GetWorkMode() const; void GetWorkDir(NWorkDir::CInfo &workDirInfo); // bool WasChanged(); -public: virtual bool OnInit(); virtual bool OnCommand(int code, int itemID, LPARAM lParam); virtual void OnNotifyHelp(); diff --git a/CPP/7zip/UI/FileManager/FoldersPage.rc b/CPP/7zip/UI/FileManager/FoldersPage.rc new file mode 100755 index 00000000..fb48ee6e --- /dev/null +++ b/CPP/7zip/UI/FileManager/FoldersPage.rc @@ -0,0 +1,23 @@ +#include "FoldersPageRes.h" +#include "../../GuiCommon.rc" + +#define xc 196 +#define yc 100 + +IDD_FOLDERS MY_PAGE +#include "FoldersPage2.rc" + +#ifdef UNDER_CE + +#undef xc +#define xc SMALL_PAGE_SIZE_X + +IDD_FOLDERS_2 MY_PAGE +#include "FoldersPage2.rc" + +#endif + +STRINGTABLE +BEGIN + IDS_FOLDERS_SET_WORK_PATH_TITLE "Specify a location for temporary archive files." +END diff --git a/CPP/7zip/UI/FileManager/FoldersPage2.rc b/CPP/7zip/UI/FileManager/FoldersPage2.rc new file mode 100755 index 00000000..0b73ec9f --- /dev/null +++ b/CPP/7zip/UI/FileManager/FoldersPage2.rc @@ -0,0 +1,16 @@ +CAPTION "Folders" +BEGIN + // GROUPBOX "&Working folder", IDC_FOLDERS_STATIC_WORKING_FOLDER, m, m, xc, 98 + + LTEXT "&Working folder", IDC_FOLDERS_STATIC_WORKING_FOLDER, m, m, xc, 8 + CONTROL "&System temp folder", IDC_FOLDERS_WORK_RADIO_SYSTEM, "Button", BS_AUTORADIOBUTTON | WS_GROUP, + m, 20, xc, 10 + CONTROL "&Current", IDC_FOLDERS_WORK_RADIO_CURRENT, "Button", BS_AUTORADIOBUTTON, + m, 34, xc, 10 + CONTROL "Specified:", IDC_FOLDERS_WORK_RADIO_SPECIFIED, "Button", BS_AUTORADIOBUTTON, + m, 48, xc, 10 + EDITTEXT IDC_FOLDERS_WORK_EDIT_PATH, m + m, 62, xc - m - m - bxsDots, 14, ES_AUTOHSCROLL + PUSHBUTTON "...", IDC_FOLDERS_WORK_BUTTON_PATH, xs - m - bxsDots, 61, bxsDots, bys + CONTROL "Use for removable drives only", IDC_FOLDERS_WORK_CHECK_FOR_REMOVABLE, MY_CHECKBOX, + m, 86, xc, 10 +END diff --git a/CPP/7zip/UI/Explorer/FoldersPageRes.h b/CPP/7zip/UI/FileManager/FoldersPageRes.h index 3052409b..896f197a 100755 --- a/CPP/7zip/UI/Explorer/FoldersPageRes.h +++ b/CPP/7zip/UI/FileManager/FoldersPageRes.h @@ -1,6 +1,7 @@ -#define IDD_FOLDERS 900 +#define IDD_FOLDERS 571 +#define IDD_FOLDERS_2 671 -#define IDS_FOLDERS_SET_WORK_PATH_TITLE 103 +#define IDS_FOLDERS_SET_WORK_PATH_TITLE 877 #define IDC_FOLDERS_STATIC_WORKING_FOLDER 1001 diff --git a/CPP/7zip/UI/FileManager/HelpUtils.cpp b/CPP/7zip/UI/FileManager/HelpUtils.cpp index c2bf49a5..a1c17399 100755 --- a/CPP/7zip/UI/FileManager/HelpUtils.cpp +++ b/CPP/7zip/UI/FileManager/HelpUtils.cpp @@ -10,6 +10,11 @@ static LPCWSTR kHelpFileName = L"7-zip.chm::/"; +#ifdef UNDER_CE +void ShowHelpWindow(HWND, LPCWSTR) +{ +} +#else void ShowHelpWindow(HWND hwnd, LPCWSTR topicFile) { UString path; @@ -19,5 +24,4 @@ void ShowHelpWindow(HWND hwnd, LPCWSTR topicFile) path += topicFile; HtmlHelp(hwnd, GetSystemString(path), HH_DISPLAY_TOPIC, NULL); } - - +#endif diff --git a/CPP/7zip/UI/FileManager/LangPage.cpp b/CPP/7zip/UI/FileManager/LangPage.cpp index 264872f6..85829368 100755 --- a/CPP/7zip/UI/FileManager/LangPage.cpp +++ b/CPP/7zip/UI/FileManager/LangPage.cpp @@ -1,16 +1,16 @@ // LangPage.cpp #include "StdAfx.h" -#include "LangPageRes.h" -#include "LangPage.h" #include "Common/StringConvert.h" #include "Windows/ResourceString.h" -#include "RegistryUtils.h" #include "HelpUtils.h" +#include "LangPage.h" +#include "LangPageRes.h" #include "LangUtils.h" +#include "RegistryUtils.h" static CIDLangPair kIDLangPairs[] = { @@ -19,17 +19,19 @@ static CIDLangPair kIDLangPairs[] = static LPCWSTR kLangTopic = L"fm/options.htm#language"; +static UString NativeLangString(const UString &s) +{ + return L" (" + s + L')'; +} + bool CLangPage::OnInit() { - _langWasChanged = false; LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); _langCombo.Attach(GetItem(IDC_LANG_COMBO_LANG)); - UString s = NWindows::MyLoadStringW(IDS_LANG_ENGLISH); - s += L" ("; - s += NWindows::MyLoadStringW(IDS_LANG_NATIVE); - s += L")"; + UString s = NWindows::MyLoadStringW(IDS_LANG_ENGLISH) + + NativeLangString(NWindows::MyLoadStringW(IDS_LANG_NATIVE)); int index = (int)_langCombo.AddString(s); _langCombo.SetItemData(index, _paths.Size()); _paths.Add(L"-"); @@ -40,21 +42,12 @@ bool CLangPage::OnInit() for (int i = 0; i < langs.Size(); i++) { const CLangEx &lang = langs[i]; - UString name; - UString englishName, nationalName; - if (lang.Lang.GetMessage(0x00000000, englishName)) - name = englishName; - else + UString name, nationalName; + if (!lang.Lang.GetMessage(0, name)) name = lang.ShortName; - if (lang.Lang.GetMessage(0x00000001, nationalName)) - { - if (!nationalName.IsEmpty()) - { - name += L" ("; - name += nationalName; - name += L")"; - } - } + if (lang.Lang.GetMessage(1, nationalName) && !nationalName.IsEmpty()) + name += NativeLangString(nationalName); + index = (int)_langCombo.AddString(name); _langCombo.SetItemData(index, _paths.Size()); _paths.Add(lang.ShortName); @@ -70,13 +63,13 @@ LONG CLangPage::OnApply() int pathIndex = (int)_langCombo.GetItemData(selectedIndex); SaveRegLang(_paths[pathIndex]); ReloadLang(); - _langWasChanged = true; + LangWasChanged = true; return PSNRET_NOERROR; } void CLangPage::OnNotifyHelp() { - ShowHelpWindow(NULL, kLangTopic); // change it + ShowHelpWindow(NULL, kLangTopic); } bool CLangPage::OnCommand(int code, int itemID, LPARAM param) diff --git a/CPP/7zip/UI/FileManager/LangPage.h b/CPP/7zip/UI/FileManager/LangPage.h index 64825b8e..e58f5098 100755 --- a/CPP/7zip/UI/FileManager/LangPage.h +++ b/CPP/7zip/UI/FileManager/LangPage.h @@ -1,7 +1,7 @@ // LangPage.h -#ifndef __LANGPAGE_H -#define __LANGPAGE_H +#ifndef __LANG_PAGE_H +#define __LANG_PAGE_H #include "Windows/Control/PropertyPage.h" #include "Windows/Control/ComboBox.h" @@ -11,7 +11,8 @@ class CLangPage: public NWindows::NControl::CPropertyPage NWindows::NControl::CComboBox _langCombo; UStringVector _paths; public: - bool _langWasChanged; + bool LangWasChanged; + CLangPage() { LangWasChanged = false; } virtual bool OnInit(); virtual void OnNotifyHelp(); virtual bool OnCommand(int code, int itemID, LPARAM param); diff --git a/CPP/7zip/UI/FileManager/LangPage.rc b/CPP/7zip/UI/FileManager/LangPage.rc index bd4d83d8..327b33e2 100755 --- a/CPP/7zip/UI/FileManager/LangPage.rc +++ b/CPP/7zip/UI/FileManager/LangPage.rc @@ -1,18 +1,34 @@ #include "LangPageRes.h" #include "../../GuiCommon.rc" -#define xSize2 196 -#define ySize2 140 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#define xc 148 +#define yc 100 -IDD_LANG DIALOG 0, 0, xSize, ySize MY_PAGE_STYLE +IDD_LANG MY_PAGE CAPTION "Language" -MY_FONT -BEGIN - LTEXT "Language:", IDC_LANG_STATIC_LANG, marg, marg, xSize2, 8 - COMBOBOX IDC_LANG_COMBO_LANG, marg, 20, 146, ySize2 - 12, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -END +{ + LTEXT "Language:", IDC_LANG_STATIC_LANG, m, m, xc, 8 + COMBOBOX IDC_LANG_COMBO_LANG, m, 20, xc, yc - 20, MY_COMBO_SORTED +} + + +#ifdef UNDER_CE + +#undef m +#undef xc + +#define m 4 +#define xc (SMALL_PAGE_SIZE_X + 8) + +IDD_LANG_2 MY_PAGE +CAPTION "Language" +{ + LTEXT "Language:", IDC_LANG_STATIC_LANG, m, m, xc, 8 + COMBOBOX IDC_LANG_COMBO_LANG, m, 20, xc, yc - 20, MY_COMBO_SORTED +} + +#endif + STRINGTABLE BEGIN diff --git a/CPP/7zip/UI/FileManager/LangPageRes.h b/CPP/7zip/UI/FileManager/LangPageRes.h index 39571e53..eb704dbf 100755 --- a/CPP/7zip/UI/FileManager/LangPageRes.h +++ b/CPP/7zip/UI/FileManager/LangPageRes.h @@ -1,4 +1,6 @@ -#define IDD_LANG 900 +#define IDD_LANG 544 +#define IDD_LANG_2 644 + #define IDS_LANG_ENGLISH 995 #define IDS_LANG_NATIVE 996 diff --git a/CPP/7zip/UI/FileManager/ListViewDialog.cpp b/CPP/7zip/UI/FileManager/ListViewDialog.cpp index e8001cf6..bec08e0d 100755 --- a/CPP/7zip/UI/FileManager/ListViewDialog.cpp +++ b/CPP/7zip/UI/FileManager/ListViewDialog.cpp @@ -1,7 +1,9 @@ // ListViewDialog.cpp #include "StdAfx.h" + #include "ListViewDialog.h" +#include "RegistryUtils.h" #ifdef LANG #include "LangUtils.h" @@ -18,13 +20,17 @@ bool CListViewDialog::OnInit() LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); #endif _listView.Attach(GetItem(IDC_LISTVIEW_LIST)); + + if (ReadSingleClick()) + _listView.SetExtendedListViewStyle(LVS_EX_ONECLICKACTIVATE | LVS_EX_TRACKSELECT); + SetText(Title); LVCOLUMN columnInfo; columnInfo.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM; columnInfo.fmt = LVCFMT_LEFT; columnInfo.iSubItem = 0; - columnInfo.cx = 1000; + columnInfo.cx = 200; _listView.InsertColumn(0, &columnInfo); @@ -32,20 +38,67 @@ bool CListViewDialog::OnInit() _listView.InsertItem(i, Strings[i]); if (Strings.Size() > 0) - _listView.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); + _listView.SetItemState_FocusedSelected(0); + + _listView.SetColumnWidthAuto(0); StringsWereChanged = false; + + NormalizeSize(); return CModalDialog::OnInit(); } +bool CListViewDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize) +{ + int mx, my; + GetMargins(8, mx, my); + int bx1, bx2, by; + GetItemSizes(IDCANCEL, bx1, by); + GetItemSizes(IDOK, bx2, by); + int y = ySize - my - by; + int x = xSize - mx - bx1; + + /* + RECT rect; + GetClientRect(&rect); + rect.top = y - my; + InvalidateRect(&rect); + */ + InvalidateRect(NULL); + + MoveItem(IDCANCEL, x, y, bx1, by); + MoveItem(IDOK, x - mx - bx2, y, bx2, by); + /* + if (wParam == SIZE_MAXSHOW || wParam == SIZE_MAXIMIZED || wParam == SIZE_MAXHIDE) + mx = 0; + */ + _listView.Move(mx, my, xSize - mx * 2, y - my * 2); + return false; +} + +extern bool g_LVN_ITEMACTIVATE_Support; + bool CListViewDialog::OnNotify(UINT /* controlID */, LPNMHDR header) { if (header->hwndFrom != _listView) return false; switch(header->code) { + case LVN_ITEMACTIVATE: + if (g_LVN_ITEMACTIVATE_Support) + { + OnOK(); + return true; + } + break; case NM_DBLCLK: - OnOK(); - return true; + case NM_RETURN: // probabably it's unused + if (!g_LVN_ITEMACTIVATE_Support) + { + OnOK(); + return true; + } + break; + case LVN_KEYDOWN: { LPNMLVKEYDOWN keyDownInfo = LPNMLVKEYDOWN(header); @@ -55,9 +108,6 @@ bool CListViewDialog::OnNotify(UINT /* controlID */, LPNMHDR header) { if (!DeleteIsAllowed) return false; - int focusedIndex = _listView.GetFocusedItem(); - if (focusedIndex < 0) - focusedIndex = 0; for (;;) { int index = _listView.GetNextSelectedItem(-1); @@ -67,10 +117,10 @@ bool CListViewDialog::OnNotify(UINT /* controlID */, LPNMHDR header) _listView.DeleteItem(index); Strings.Delete(index); } - if (focusedIndex >= _listView.GetItemCount()) - focusedIndex = _listView.GetItemCount() - 1; + int focusedIndex = _listView.GetFocusedItem(); if (focusedIndex >= 0) - _listView.SetItemState(focusedIndex, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); + _listView.SetItemState_FocusedSelected(focusedIndex); + _listView.SetColumnWidthAuto(0); return true; } case 'A': diff --git a/CPP/7zip/UI/FileManager/ListViewDialog.h b/CPP/7zip/UI/FileManager/ListViewDialog.h index 57375c8b..6be51c7e 100755 --- a/CPP/7zip/UI/FileManager/ListViewDialog.h +++ b/CPP/7zip/UI/FileManager/ListViewDialog.h @@ -1,10 +1,11 @@ // ListViewDialog.h -#ifndef __LISTVIEWDIALOG_H -#define __LISTVIEWDIALOG_H +#ifndef __LISTVIEW_DIALOG_H +#define __LISTVIEW_DIALOG_H #include "Windows/Control/Dialog.h" #include "Windows/Control/ListView.h" + #include "ListViewDialogRes.h" class CListViewDialog: public NWindows::NControl::CModalDialog @@ -12,19 +13,18 @@ class CListViewDialog: public NWindows::NControl::CModalDialog NWindows::NControl::CListView _listView; virtual void OnOK(); virtual bool OnInit(); + virtual bool OnSize(WPARAM wParam, int xSize, int ySize); virtual bool OnNotify(UINT controlID, LPNMHDR header); - public: UString Title; bool DeleteIsAllowed; - UStringVector Strings; bool StringsWereChanged; + UStringVector Strings; int FocusedItemIndex; INT_PTR Create(HWND wndParent = 0) { return CModalDialog::Create(IDD_DIALOG_LISTVIEW, wndParent); } CListViewDialog(): DeleteIsAllowed(false) {} - }; #endif diff --git a/CPP/7zip/UI/FileManager/ListViewDialog.rc b/CPP/7zip/UI/FileManager/ListViewDialog.rc index cb456534..8f963bf1 100755 --- a/CPP/7zip/UI/FileManager/ListViewDialog.rc +++ b/CPP/7zip/UI/FileManager/ListViewDialog.rc @@ -1,26 +1,14 @@ #include "ListViewDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 342 -#define ySize2 220 +#define xc 320 +#define yc 240 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) - -#define bYPos (ySize - marg - bYSize) -#define b1XPos (xSize - marg - bXSize) -#define b2XPos (b1XPos - 10 - bXSize) - - -IDD_DIALOG_LISTVIEW DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +IDD_DIALOG_LISTVIEW MY_RESIZE_DIALOG CAPTION "ListView" -MY_FONT -BEGIN +{ CONTROL "List1", IDC_LISTVIEW_LIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP, - marg, marg, xSize2, ySize2 - bYSize - 10 - DEFPUSHBUTTON "OK", IDOK, b2XPos, bYPos, bXSize, bYSize - PUSHBUTTON "Cancel", IDCANCEL, b1XPos, bYPos, bXSize, bYSize -END - - + m, m, xc, yc - bys - m + OK_CANCEL +} diff --git a/CPP/7zip/UI/FileManager/ListViewDialogRes.h b/CPP/7zip/UI/FileManager/ListViewDialogRes.h index 440d14b0..aaa6521f 100755 --- a/CPP/7zip/UI/FileManager/ListViewDialogRes.h +++ b/CPP/7zip/UI/FileManager/ListViewDialogRes.h @@ -1,3 +1,2 @@ -#define IDD_DIALOG_LISTVIEW 201 - -#define IDC_LISTVIEW_LIST 1000 +#define IDD_DIALOG_LISTVIEW 508 +#define IDC_LISTVIEW_LIST 1000 diff --git a/CPP/7zip/UI/Explorer/SystemPage.cpp b/CPP/7zip/UI/FileManager/MenuPage.cpp index 602e4387..719c86ad 100755 --- a/CPP/7zip/UI/Explorer/SystemPage.cpp +++ b/CPP/7zip/UI/FileManager/MenuPage.cpp @@ -1,23 +1,18 @@ -// SystemPage.cpp +// MenuPage.cpp #include "StdAfx.h" -#include "resource.h" -#include "SystemPageRes.h" -#include "SystemPage.h" - -#include "Common/StringConvert.h" -#include "Windows/Defs.h" -#include "Windows/Control/ListView.h" - #include "../Common/ZipRegistry.h" -#include "../FileManager/HelpUtils.h" -#include "../FileManager/LangUtils.h" -#include "../FileManager/FormatUtils.h" +#include "../Explorer/ContextMenuFlags.h" +#include "../Explorer/RegistryContextMenu.h" +#include "../Explorer/resource.h" -#include "RegistryContextMenu.h" -#include "ContextMenuFlags.h" +#include "HelpUtils.h" +#include "LangUtils.h" +#include "MenuPage.h" +#include "MenuPageRes.h" +#include "FormatUtils.h" using namespace NContextMenuFlags; @@ -47,40 +42,41 @@ static CContextMenuItem kMenuItems[] = { IDS_CONTEXT_TEST, 0x02000109, kTest}, { IDS_CONTEXT_COMPRESS, 0x02000107, kCompress }, + { IDS_CONTEXT_COMPRESS_TO, 0x0200010F, kCompressTo7z }, + { IDS_CONTEXT_COMPRESS_TO, 0x0200010F, kCompressToZip } + + #ifndef UNDER_CE + , { IDS_CONTEXT_COMPRESS_EMAIL, 0x02000111, kCompressEmail }, - { IDS_CONTEXT_COMPRESS_TO, 0x0200010F, kCompressTo7z }, - { IDS_CONTEXT_COMPRESS_TO_EMAIL, 0x02000113, kCompressTo7zEmail}, - { IDS_CONTEXT_COMPRESS_TO, 0x0200010F, kCompressToZip }, - { IDS_CONTEXT_COMPRESS_TO_EMAIL, 0x02000113, kCompressToZipEmail} + { IDS_CONTEXT_COMPRESS_TO_EMAIL, 0x02000113, kCompressTo7zEmail }, + { IDS_CONTEXT_COMPRESS_TO_EMAIL, 0x02000113, kCompressToZipEmail } + #endif }; const int kNumMenuItems = sizeof(kMenuItems) / sizeof(kMenuItems[0]); -bool CSystemPage::OnInit() +bool CMenuPage::OnInit() { _initMode = true; LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); - CheckButton(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, - NZipRootRegistry::CheckContextMenuHandler()); - - CheckButton(IDC_SYSTEM_CASCADED_MENU, ReadCascadedMenu()); + #ifdef UNDER_CE + EnableItem(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, false); + #else + CheckButton(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, NZipRootRegistry::CheckContextMenuHandler()); + #endif - UInt32 contextMenuFlags; - if (!ReadContextMenuStatus(contextMenuFlags)) - contextMenuFlags = NContextMenuFlags::GetDefaultFlags(); + CContextMenuInfo ci; + ci.Load(); - m_ListView.Attach(GetItem(IDC_SYSTEM_OPTIONS_LIST)); + CheckButton(IDC_SYSTEM_CASCADED_MENU, ci.Cascaded); - /* - CheckButton(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, - NRegistryAssociations::CheckContextMenuHandler()); - */ + _listView.Attach(GetItem(IDC_SYSTEM_OPTIONS_LIST)); UInt32 newFlags = LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT; - m_ListView.SetExtendedListViewStyle(newFlags, newFlags); + _listView.SetExtendedListViewStyle(newFlags, newFlags); - m_ListView.InsertColumn(0, L"", 270); + _listView.InsertColumn(0, L"", 100); for (int i = 0; i < kNumMenuItems; i++) { @@ -115,19 +111,25 @@ bool CSystemPage::OnInit() } } - int itemIndex = m_ListView.InsertItem(i, s); - m_ListView.SetCheckState(itemIndex, ((contextMenuFlags & menuItem.Flag) != 0)); + int itemIndex = _listView.InsertItem(i, s); + _listView.SetCheckState(itemIndex, ((ci.Flags & menuItem.Flag) != 0)); } + _listView.SetColumnWidthAuto(0); _initMode = false; return CPropertyPage::OnInit(); } +#ifndef UNDER_CE STDAPI DllRegisterServer(void); STDAPI DllUnregisterServer(void); +HWND g_MenuPageHWND = 0; +#endif -LONG CSystemPage::OnApply() +LONG CMenuPage::OnApply() { + #ifndef UNDER_CE + g_MenuPageHWND = *this; if (IsButtonCheckedBool(IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU)) { DllRegisterServer(); @@ -138,23 +140,25 @@ LONG CSystemPage::OnApply() DllUnregisterServer(); NZipRootRegistry::DeleteContextMenuHandler(); } - SaveCascadedMenu(IsButtonCheckedBool(IDC_SYSTEM_CASCADED_MENU)); + #endif - UInt32 flags = 0; + CContextMenuInfo ci; + ci.Cascaded = IsButtonCheckedBool(IDC_SYSTEM_CASCADED_MENU); + ci.Flags = 0; for (int i = 0; i < kNumMenuItems; i++) - if (m_ListView.GetCheckState(i)) - flags |= kMenuItems[i].Flag; - SaveContextMenuStatus(flags); + if (_listView.GetCheckState(i)) + ci.Flags |= kMenuItems[i].Flag; + ci.Save(); return PSNRET_NOERROR; } -void CSystemPage::OnNotifyHelp() +void CMenuPage::OnNotifyHelp() { ShowHelpWindow(NULL, kSystemTopic); } -bool CSystemPage::OnButtonClicked(int buttonID, HWND buttonHWND) +bool CMenuPage::OnButtonClicked(int buttonID, HWND buttonHWND) { switch(buttonID) { @@ -167,9 +171,9 @@ bool CSystemPage::OnButtonClicked(int buttonID, HWND buttonHWND) } -bool CSystemPage::OnNotify(UINT controlID, LPNMHDR lParam) +bool CMenuPage::OnNotify(UINT controlID, LPNMHDR lParam) { - if (lParam->hwndFrom == HWND(m_ListView)) + if (lParam->hwndFrom == HWND(_listView)) { switch(lParam->code) { @@ -181,7 +185,7 @@ bool CSystemPage::OnNotify(UINT controlID, LPNMHDR lParam) } -bool CSystemPage::OnItemChanged(const NMLISTVIEW *info) +bool CMenuPage::OnItemChanged(const NMLISTVIEW *info) { if (_initMode) return true; @@ -192,7 +196,5 @@ bool CSystemPage::OnItemChanged(const NMLISTVIEW *info) if (oldState != newState) Changed(); } - // PostMessage(kRefreshpluginsListMessage, 0); - // RefreshPluginsList(); return true; } diff --git a/CPP/7zip/UI/Explorer/SystemPage.h b/CPP/7zip/UI/FileManager/MenuPage.h index 75fdeb2b..5005ea9c 100755 --- a/CPP/7zip/UI/Explorer/SystemPage.h +++ b/CPP/7zip/UI/FileManager/MenuPage.h @@ -1,25 +1,25 @@ -// SystemPage.h +// MenuPage.h -#ifndef __SYSTEMPAGE_H -#define __SYSTEMPAGE_H +#ifndef __MENU_PAGE_H +#define __MENU_PAGE_H #include "Windows/Control/PropertyPage.h" #include "Windows/Control/ListView.h" #include "../Common/LoadCodecs.h" -class CSystemPage: public NWindows::NControl::CPropertyPage +class CMenuPage: public NWindows::NControl::CPropertyPage { bool _initMode; - CObjectVector<CArcInfoEx> m_Archivers; - NWindows::NControl::CListView m_ListView; -public: + NWindows::NControl::CListView _listView; + virtual bool OnInit(); virtual void OnNotifyHelp(); virtual bool OnNotify(UINT controlID, LPNMHDR lParam); virtual bool OnItemChanged(const NMLISTVIEW *info); virtual LONG OnApply(); virtual bool OnButtonClicked(int buttonID, HWND buttonHWND); +public: }; #endif diff --git a/CPP/7zip/UI/FileManager/MenuPage.rc b/CPP/7zip/UI/FileManager/MenuPage.rc new file mode 100755 index 00000000..bb4281d8 --- /dev/null +++ b/CPP/7zip/UI/FileManager/MenuPage.rc @@ -0,0 +1,24 @@ +#include "MenuPageRes.h" +#include "../../GuiCommon.rc" + +#define xc 196 +#define yc 164 + +IDD_MENU MY_PAGE +#include "MenuPage2.rc" + +#ifdef UNDER_CE + +#undef m +#undef xc +#undef yc + +#define m 4 +#define xc (SMALL_PAGE_SIZE_X + 8) + +#define yc 112 + +IDD_MENU_2 MY_PAGE +#include "MenuPage2.rc" + +#endif diff --git a/CPP/7zip/UI/FileManager/MenuPage2.rc b/CPP/7zip/UI/FileManager/MenuPage2.rc new file mode 100755 index 00000000..1862aa06 --- /dev/null +++ b/CPP/7zip/UI/FileManager/MenuPage2.rc @@ -0,0 +1,14 @@ +#define y 40 + +CAPTION "7-Zip" +BEGIN + CONTROL "Integrate 7-Zip to shell context menu", IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU, + MY_CHECKBOX, m, m, xc, 10 + CONTROL "Cascaded context menu", IDC_SYSTEM_CASCADED_MENU, + MY_CHECKBOX, m, m + 14, xc, 10 + LTEXT "Context menu items:", IDC_SYSTEM_STATIC_CONTEXT_MENU_ITEMS, + m, m + 28, xc, 8 + CONTROL "List", IDC_SYSTEM_OPTIONS_LIST, "SysListView32", + LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP, + m, m + y, xc, yc - y +END diff --git a/CPP/7zip/UI/Explorer/SystemPageRes.h b/CPP/7zip/UI/FileManager/MenuPageRes.h index b125849c..f1220bfd 100755 --- a/CPP/7zip/UI/Explorer/SystemPageRes.h +++ b/CPP/7zip/UI/FileManager/MenuPageRes.h @@ -1,4 +1,5 @@ -#define IDD_SYSTEM 102 +#define IDD_MENU 570 +#define IDD_MENU_2 670 #define IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU 1010 #define IDC_SYSTEM_CASCADED_MENU 1011 diff --git a/CPP/7zip/UI/FileManager/MessagesDialog.cpp b/CPP/7zip/UI/FileManager/MessagesDialog.cpp index 201c0bae..3d73ade1 100755 --- a/CPP/7zip/UI/FileManager/MessagesDialog.cpp +++ b/CPP/7zip/UI/FileManager/MessagesDialog.cpp @@ -1,11 +1,13 @@ // MessagesDialog.cpp #include "StdAfx.h" -#include "MessagesDialog.h" -#include "Common/StringConvert.h" + #include "Common/IntToString.h" + #include "Windows/ResourceString.h" +#include "MessagesDialog.h" + #ifdef LANG #include "LangUtils.h" #endif @@ -49,9 +51,12 @@ bool CMessagesDialog::OnInit() LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); #endif _messageList.Attach(GetItem(IDC_MESSAGE_LIST)); + + #ifndef UNDER_CE _messageList.SetUnicodeFormat(true); + #endif - _messageList.InsertColumn(0, L"#", 30); + _messageList.InsertColumn(0, L"", 30); const UString s = #ifdef LANG @@ -62,15 +67,27 @@ bool CMessagesDialog::OnInit() _messageList.InsertColumn(1, s, 600); - for(int i = 0; i < Messages->Size(); i++) + for (int i = 0; i < Messages->Size(); i++) AddMessage((*Messages)[i]); - /* - if(_messageList.GetItemCount() > 0) - { - UINT aState = LVIS_SELECTED | LVIS_FOCUSED; - _messageList.SetItemState(0, aState, aState); - } - */ + _messageList.SetColumnWidthAuto(0); + _messageList.SetColumnWidthAuto(1); + NormalizeSize(); return CModalDialog::OnInit(); } + +bool CMessagesDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize) +{ + int mx, my; + GetMargins(8, mx, my); + int bx, by; + GetItemSizes(IDOK, bx, by); + int y = ySize - my - by; + int x = xSize - mx - bx; + + InvalidateRect(NULL); + + MoveItem(IDOK, x, y, bx, by); + _messageList.Move(mx, my, xSize - mx * 2, y - my * 2); + return false; +} diff --git a/CPP/7zip/UI/FileManager/MessagesDialog.h b/CPP/7zip/UI/FileManager/MessagesDialog.h index 6df0d46c..1304d516 100755 --- a/CPP/7zip/UI/FileManager/MessagesDialog.h +++ b/CPP/7zip/UI/FileManager/MessagesDialog.h @@ -1,19 +1,20 @@ // MessagesDialog.h -#ifndef __MESSAGESDIALOG_H -#define __MESSAGESDIALOG_H - -#include "MessagesDialogRes.h" +#ifndef __MESSAGES_DIALOG_H +#define __MESSAGES_DIALOG_H #include "Windows/Control/Dialog.h" #include "Windows/Control/ListView.h" +#include "MessagesDialogRes.h" + class CMessagesDialog: public NWindows::NControl::CModalDialog { NWindows::NControl::CListView _messageList; void AddMessageDirect(LPCWSTR message); void AddMessage(LPCWSTR message); virtual bool OnInit(); + virtual bool OnSize(WPARAM wParam, int xSize, int ySize); public: const UStringVector *Messages; INT_PTR Create(HWND parent = 0) { return CModalDialog::Create(IDD_DIALOG_MESSAGES, parent); } diff --git a/CPP/7zip/UI/FileManager/MessagesDialog.rc b/CPP/7zip/UI/FileManager/MessagesDialog.rc index bf1c56b0..fb2f0f7d 100755 --- a/CPP/7zip/UI/FileManager/MessagesDialog.rc +++ b/CPP/7zip/UI/FileManager/MessagesDialog.rc @@ -1,25 +1,14 @@ #include "MessagesDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 430 -#define ySize2 140 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) -#define bXPos (xSize - marg - bXSize) -#define bYPos (ySize - marg - bYSize) +#define xc 440 +#define yc 160 - -IDD_DIALOG_MESSAGES DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +IDD_DIALOG_MESSAGES MY_RESIZE_DIALOG CAPTION "7-Zip: Diagnostic messages" -MY_FONT -BEGIN - DEFPUSHBUTTON "&Close", IDOK, bXPos, bYPos, bXSize, bYSize - CONTROL "List1",IDC_MESSAGE_LIST,"SysListView32", +{ + DEFPUSHBUTTON "&Close", IDOK, bx, by, bxs, bys + CONTROL "List1", IDC_MESSAGE_LIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, - marg, marg, xSize2, ySize2 - bYSize - 6 -END - -STRINGTABLE -BEGIN - IDS_MESSAGES_DIALOG_MESSAGE_COLUMN "Message" -END + m, m, xc, yc - bys - m +} diff --git a/CPP/7zip/UI/FileManager/MyLoadMenu.cpp b/CPP/7zip/UI/FileManager/MyLoadMenu.cpp index f98325a0..ebd41fd9 100755 --- a/CPP/7zip/UI/FileManager/MyLoadMenu.cpp +++ b/CPP/7zip/UI/FileManager/MyLoadMenu.cpp @@ -3,6 +3,7 @@ #include "StdAfx.h" #include "Windows/Menu.h" +#include "Windows/Control/Dialog.h" #include "../../PropID.h" @@ -16,6 +17,8 @@ #include "resource.h" +using namespace NWindows; + static const UINT kOpenBookmarkMenuID = 730; static const UINT kSetBookmarkMenuID = 740; @@ -25,44 +28,28 @@ static LPCWSTR kFMHelpTopic = L"FM/index.htm"; extern void OptionsDialog(HWND hwndOwner, HINSTANCE hInstance); -using namespace NWindows; - -static const int kFileMenuIndex = 0; -static const int kEditMenuIndex = 1; -static const int kViewMenuIndex = 2; -static const int kBookmarksMenuIndex = kViewMenuIndex + 1; - -struct CStringLangPair +enum { - wchar_t *String; - UINT32 LangID; + kMenuIndex_File = 0, + kMenuIndex_Edit, + kMenuIndex_View, + kMenuIndex_Bookmarks }; -static CStringLangPair kStringLangPairs[] = +static const UInt32 kTopMenuLangIDs[] = { - { L"&File", 0x03000102 }, - { L"&Edit", 0x03000103 }, - { L"&View", 0x03000104 }, - { L"&Bookmarks", 0x03000107 }, - { L"&Tools", 0x03000105 }, - { L"&Help", 0x03000106 }, + 0x03000102, + 0x03000103, + 0x03000104, + 0x03000107, + 0x03000105, + 0x03000106 }; -UINT32 kAddToFavoritesLangID = 0x03000710; -UINT32 kToolbarsLangID = 0x03000451; +static const UInt32 kAddToFavoritesLangID = 0x03000710; +static const UInt32 kToolbarsLangID = 0x03000451; -/* -static int FindStringLangItem(const UString &anItem) -{ - for (int i = 0; i < sizeof(kStringLangPairs) / - sizeof(kStringLangPairs[0]); i++) - if (anItem.CompareNoCase(kStringLangPairs[i].String) == 0) - return i; - return -1; -} -*/ - -static CIDLangPair kIDLangPairs[] = +static const CIDLangPair kIDLangPairs[] = { // File { IDM_FILE_OPEN, 0x03000210 }, @@ -136,6 +123,18 @@ static int FindLangItem(int ControlID) return -1; } +static int GetSortControlID(PROPID propID) +{ + switch(propID) + { + case kpidName: return IDM_VIEW_ARANGE_BY_NAME; + case kpidExtension: return IDM_VIEW_ARANGE_BY_TYPE; + case kpidMTime: return IDM_VIEW_ARANGE_BY_DATE; + case kpidSize: return IDM_VIEW_ARANGE_BY_SIZE; + case kpidNoProperty: return IDM_VIEW_ARANGE_NO_SORT; + } + return -1; +} /* static bool g_IsNew_fMask = true; @@ -177,50 +176,38 @@ static UINT Get_fMaskForFTypeAndString() } */ -static UINT Get_fMaskForString() -{ - return MIIM_TYPE; -} - -static UINT Get_fMaskForFTypeAndString() -{ - return MIIM_TYPE; -} - - +static inline UINT Get_fMaskForString() { return MIIM_TYPE; } +static inline UINT Get_fMaskForFTypeAndString() { return MIIM_TYPE; } static void MyChangeMenu(HMENU menuLoc, int level, int menuIndex) { CMenu menu; menu.Attach(menuLoc); - for (int i = 0; i < menu.GetItemCount(); i++) + for (int i = 0;; i++) { CMenuItem item; item.fMask = Get_fMaskForString() | MIIM_SUBMENU | MIIM_ID; item.fType = MFT_STRING; - if (menu.GetItem(i, true, item)) + if (!menu.GetItem(i, true, item)) + break; { UString newString; if (item.hSubMenu) { - if (level == 1 && menuIndex == kBookmarksMenuIndex) - newString = LangString(kAddToFavoritesLangID); + UInt32 langID = 0; + if (level == 1 && menuIndex == kMenuIndex_Bookmarks) + langID = kAddToFavoritesLangID; else { MyChangeMenu(item.hSubMenu, level + 1, i); - if (level == 1 && menuIndex == kViewMenuIndex) - { - newString = LangString(kToolbarsLangID); - } + if (level == 1 && menuIndex == kMenuIndex_View) + langID = kToolbarsLangID; + else if (level == 0 && i < sizeof(kTopMenuLangIDs) / sizeof(kTopMenuLangIDs[0])) + langID = kTopMenuLangIDs[i]; else - { - if (level == 0 && i < sizeof(kStringLangPairs) / - sizeof(kStringLangPairs[0])) - newString = LangString(kStringLangPairs[i].LangID); - else - continue; - } + continue; } + newString = LangString(langID); if (newString.IsEmpty()) continue; } @@ -247,41 +234,14 @@ static void MyChangeMenu(HMENU menuLoc, int level, int menuIndex) } } -CMenu g_FileMenu; +static CMenu g_FileMenu; -class CFileMenuDestroyer +struct CFileMenuDestroyer { -public: - ~CFileMenuDestroyer() - { - if ((HMENU)g_FileMenu != 0) - g_FileMenu.Destroy(); - } + ~CFileMenuDestroyer() { if ((HMENU)g_FileMenu != 0) g_FileMenu.Destroy(); } } g_FileMenuDestroyer; -void MyLoadMenu(HWND hWnd) -{ - if ((HMENU)g_FileMenu != 0) - g_FileMenu.Destroy(); - HMENU oldMenu = ::GetMenu(hWnd); - HMENU baseMenu = ::LoadMenu(g_hInstance, MAKEINTRESOURCE(IDM_MENU)); - ::SetMenu(hWnd, baseMenu); - ::DestroyMenu(oldMenu); - if (!g_LangID.IsEmpty()) - { - HMENU menuOld = ::GetMenu(hWnd); - MyChangeMenu(menuOld, 0, 0); - } - ::DrawMenuBar(hWnd); -} - -extern HWND g_HWND; -void MyLoadMenu() -{ - MyLoadMenu(g_HWND); -} - static void CopyMenu(HMENU srcMenuSpec, HMENU destMenuSpec) { CMenu srcMenu; @@ -289,39 +249,74 @@ static void CopyMenu(HMENU srcMenuSpec, HMENU destMenuSpec) CMenu destMenu; destMenu.Attach(destMenuSpec); int startPos = 0; - for (int i = 0; i < srcMenu.GetItemCount(); i++) + for (int i = 0;; i++) { CMenuItem item; item.fMask = MIIM_STATE | MIIM_ID | Get_fMaskForFTypeAndString(); item.fType = MFT_STRING; if (srcMenu.GetItem(i, true, item)) + { if (destMenu.InsertItem(startPos, true, item)) startPos++; + } + else + break; } } +void MyLoadMenu() +{ + HMENU baseMenu; + + #ifdef UNDER_CE + + HMENU oldMenu = g_App._commandBar.GetMenu(0); + if (oldMenu) + ::DestroyMenu(oldMenu); + BOOL b = g_App._commandBar.InsertMenubar(g_hInstance, IDM_MENU, 0); + baseMenu = g_App._commandBar.GetMenu(0); + if (!g_LangID.IsEmpty()) + MyChangeMenu(baseMenu, 0, 0); + g_App._commandBar.DrawMenuBar(0); + + #else + + HWND hWnd = g_HWND; + HMENU oldMenu = ::GetMenu(hWnd); + ::SetMenu(hWnd, ::LoadMenu(g_hInstance, MAKEINTRESOURCE(IDM_MENU))); + ::DestroyMenu(oldMenu); + baseMenu = ::GetMenu(hWnd); + if (!g_LangID.IsEmpty()) + MyChangeMenu(baseMenu, 0, 0); + ::DrawMenuBar(hWnd); + + #endif + + if ((HMENU)g_FileMenu != 0) + g_FileMenu.Destroy(); + g_FileMenu.CreatePopup(); + CopyMenu(::GetSubMenu(baseMenu, 0), g_FileMenu); +} + void OnMenuActivating(HWND /* hWnd */, HMENU hMenu, int position) { - if (::GetSubMenu(::GetMenu(g_HWND), position) != hMenu) + HMENU mainMenu = + #ifdef UNDER_CE + g_App._commandBar.GetMenu(0); + #else + ::GetMenu(g_HWND) + #endif + ; + if (::GetSubMenu(mainMenu, position) != hMenu) return; - if (position == kFileMenuIndex) + if (position == kMenuIndex_File) { - if ((HMENU)g_FileMenu == 0) - { - g_FileMenu.CreatePopup(); - CopyMenu(hMenu, g_FileMenu); - } CMenu menu; menu.Attach(hMenu); - while (menu.GetItemCount() > 0) - { - if (!menu.RemoveItem(0, MF_BYPOSITION)) - break; - } - // CopyMenu(g_FileMenu, hMenu); + menu.RemoveAllItems(); g_App.GetFocusedPanel().CreateFileMenu(hMenu); } - else if (position == kEditMenuIndex) + else if (position == kMenuIndex_Edit) { /* CMenu menu; @@ -331,35 +326,32 @@ void OnMenuActivating(HWND /* hWnd */, HMENU hMenu, int position) menu.EnableItem(IDM_EDIT_PASTE, IsClipboardFormatAvailableHDROP() ? MF_ENABLED : MF_GRAYED); */ } - else if (position == kViewMenuIndex) + else if (position == kMenuIndex_View) { // View; CMenu menu; menu.Attach(hMenu); menu.CheckRadioItem(IDM_VIEW_LARGE_ICONS, IDM_VIEW_DETAILS, IDM_VIEW_LARGE_ICONS + g_App.GetListViewMode(), MF_BYCOMMAND); - menu.CheckItem(IDM_VIEW_TWO_PANELS, MF_BYCOMMAND | - ((g_App.NumPanels == 2) ? MF_CHECKED : MF_UNCHECKED)); - menu.CheckItem(IDM_VIEW_FLAT_VIEW, MF_BYCOMMAND | - ((g_App.GetFlatMode()) ? MF_CHECKED : MF_UNCHECKED)); - menu.CheckItem(IDM_VIEW_ARCHIVE_TOOLBAR, MF_BYCOMMAND | - (g_App.ShowArchiveToolbar ? MF_CHECKED : MF_UNCHECKED)); - menu.CheckItem(IDM_VIEW_STANDARD_TOOLBAR, MF_BYCOMMAND | - (g_App.ShowStandardToolbar ? MF_CHECKED : MF_UNCHECKED)); - menu.CheckItem(IDM_VIEW_TOOLBARS_LARGE_BUTTONS, MF_BYCOMMAND | - (g_App.LargeButtons ? MF_CHECKED : MF_UNCHECKED)); - menu.CheckItem(IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT, MF_BYCOMMAND | - (g_App.ShowButtonsLables ? MF_CHECKED : MF_UNCHECKED)); + + menu.CheckRadioItem(IDM_VIEW_ARANGE_BY_NAME, IDM_VIEW_ARANGE_NO_SORT, + GetSortControlID(g_App.GetSortID()), MF_BYCOMMAND); + + menu.CheckItemByID(IDM_VIEW_TWO_PANELS, g_App.NumPanels == 2); + menu.CheckItemByID(IDM_VIEW_FLAT_VIEW, g_App.GetFlatMode()); + menu.CheckItemByID(IDM_VIEW_ARCHIVE_TOOLBAR, g_App.ShowArchiveToolbar); + menu.CheckItemByID(IDM_VIEW_STANDARD_TOOLBAR, g_App.ShowStandardToolbar); + menu.CheckItemByID(IDM_VIEW_TOOLBARS_LARGE_BUTTONS, g_App.LargeButtons); + menu.CheckItemByID(IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT, g_App.ShowButtonsLables); } - else if (position == kBookmarksMenuIndex) + else if (position == kMenuIndex_Bookmarks) { CMenu menu; menu.Attach(hMenu); CMenu subMenu; subMenu.Attach(menu.GetSubMenu(0)); - while (subMenu.GetItemCount() > 0) - subMenu.RemoveItem(subMenu.GetItemCount() - 1, MF_BYPOSITION); + subMenu.RemoveAllItems(); int i; for (i = 0; i < 10; i++) { @@ -372,8 +364,7 @@ void OnMenuActivating(HWND /* hWnd */, HMENU hMenu, int position) subMenu.AppendItem(MF_STRING, kSetBookmarkMenuID + i, s); } - while (menu.GetItemCount() > 2) - menu.RemoveItem(menu.GetItemCount() - 1, MF_BYPOSITION); + menu.RemoveAllItemsFrom(2); for (i = 0; i < 10; i++) { @@ -401,84 +392,51 @@ void OnMenuUnActivating(HWND hWnd, HMENU hMenu, int id) { if (::GetSubMenu(::GetMenu(g_HWND), 0) != hMenu) return; - // g_App.GetFocusedPanel()._contextMenu.Release(); -} - -void OnMenuUnActivating(HWND hWnd) -{ } */ - void LoadFileMenu(HMENU hMenu, int startPos, bool programMenu, bool isFsFolder, int numItems, bool allAreFiles) { - { - CMenu srcMenu; - srcMenu.Attach(::GetSubMenu(::GetMenu(g_HWND), 0)); - if ((HMENU)g_FileMenu == 0) - { - g_FileMenu.CreatePopup(); - CopyMenu(srcMenu, g_FileMenu); - } - } - CMenu destMenu; destMenu.Attach(hMenu); UString diffPath; ReadRegDiff(diffPath); - for (int i = 0; i < g_FileMenu.GetItemCount(); i++) + int numRealItems = startPos; + for (int i = 0;; i++) { CMenuItem item; item.fMask = MIIM_STATE | MIIM_ID | Get_fMaskForFTypeAndString(); item.fType = MFT_STRING; - if (g_FileMenu.GetItem(i, true, item)) + if (!g_FileMenu.GetItem(i, true, item)) + break; { - if (!programMenu) - if (item.wID == IDCLOSE) - continue; + if (!programMenu && item.wID == IDCLOSE) + continue; if (item.wID == IDM_FILE_DIFF && diffPath.IsEmpty()) continue; bool isOneFsFile = (isFsFolder && numItems == 1 && allAreFiles); - if ((item.wID == IDM_FILE_SPLIT || item.wID == IDM_FILE_COMBINE) && !isOneFsFile) - item.fState |= MFS_DISABLED; + bool disable = ((item.wID == IDM_FILE_SPLIT || item.wID == IDM_FILE_COMBINE) && !isOneFsFile); - /* - bool createItem = (item.wID == IDM_CREATE_FOLDER || item.wID == IDM_CREATE_FILE); - if (forFileMode) - { - if (createItem) - continue; - } - else - { - if (!createItem) - continue; - } - */ + bool isBigScreen = NControl::IsDialogSizeOK(40, 200); + + if (!isBigScreen && (disable || item.IsSeparator())) + continue; if (destMenu.InsertItem(startPos, true, item)) startPos++; + if (disable) + destMenu.EnableItem(startPos - 1, MF_BYPOSITION | MF_GRAYED); + + if (!item.IsSeparator()) + numRealItems = startPos; } } - while (destMenu.GetItemCount() > 0) - { - CMenuItem item; - item.fMask = MIIM_TYPE; - item.fType = 0; - // item.dwTypeData = 0; - int lastIndex = destMenu.GetItemCount() - 1; - if (!destMenu.GetItem(lastIndex, true, item)) - break; - if(item.fType != MFT_SEPARATOR) - break; - if (!destMenu.RemoveItem(lastIndex, MF_BYPOSITION)) - break; - } + destMenu.RemoveAllItemsFrom(numRealItems); } bool ExecuteFileCommand(int id) @@ -618,7 +576,7 @@ bool OnMenuCommand(HWND hWnd, int id) g_App.SetListViewMode(index); /* CMenu menu; - menu.Attach(::GetSubMenu(::GetMenu(hWnd), kViewMenuIndex)); + menu.Attach(::GetSubMenu(::GetMenu(hWnd), kMenuIndex_View)); menu.CheckRadioItem(IDM_VIEW_LARGE_ICONS, IDM_VIEW_DETAILS, id, MF_BYCOMMAND); */ @@ -688,8 +646,12 @@ bool OnMenuCommand(HWND hWnd, int id) break; case IDM_BENCHMARK: + { + CPanel::CDisableTimerProcessing disableTimerProcessing1(g_App.Panels[0]); + CPanel::CDisableTimerProcessing disableTimerProcessing2(g_App.Panels[1]); Benchmark(); break; + } // Help case IDM_HELP_CONTENTS: ShowHelpWindow(NULL, kFMHelpTopic); @@ -717,4 +679,3 @@ bool OnMenuCommand(HWND hWnd, int id) } return true; } - diff --git a/CPP/7zip/UI/FileManager/MyLoadMenu.h b/CPP/7zip/UI/FileManager/MyLoadMenu.h index 83c1d24f..53e9d0ef 100755 --- a/CPP/7zip/UI/FileManager/MyLoadMenu.h +++ b/CPP/7zip/UI/FileManager/MyLoadMenu.h @@ -1,13 +1,12 @@ // MyLoadMenu.h -#ifndef __MYLOADMENU_H -#define __MYLOADMENU_H +#ifndef __MY_LOAD_MENU_H +#define __MY_LOAD_MENU_H void OnMenuActivating(HWND hWnd, HMENU hMenu, int position); // void OnMenuUnActivating(HWND hWnd, HMENU hMenu, int id); // void OnMenuUnActivating(HWND hWnd); -void MyLoadMenu(HWND hWnd); bool OnMenuCommand(HWND hWnd, int id); void MyLoadMenu(); void LoadFileMenu(HMENU hMenu, int startPos, bool programMenu, diff --git a/CPP/7zip/UI/FileManager/OpenCallback.cpp b/CPP/7zip/UI/FileManager/OpenCallback.cpp index a275f89b..72245ac4 100755 --- a/CPP/7zip/UI/FileManager/OpenCallback.cpp +++ b/CPP/7zip/UI/FileManager/OpenCallback.cpp @@ -15,43 +15,43 @@ using namespace NWindows; STDMETHODIMP COpenArchiveCallback::SetTotal(const UInt64 *numFiles, const UInt64 *numBytes) { - RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause()); + RINOK(ProgressDialog.Sync.ProcessStopAndPause()); { NSynchronization::CCriticalSectionLock lock(_criticalSection); if (numFiles != NULL) { - ProgressDialog.ProgressSynch.SetNumFilesTotal(*numFiles); - ProgressDialog.ProgressSynch.SetBytesProgressMode(false); + ProgressDialog.Sync.SetNumFilesTotal(*numFiles); + ProgressDialog.Sync.SetBytesProgressMode(false); } if (numBytes != NULL) - ProgressDialog.ProgressSynch.SetNumBytesTotal(*numBytes); + ProgressDialog.Sync.SetNumBytesTotal(*numBytes); } return S_OK; } STDMETHODIMP COpenArchiveCallback::SetCompleted(const UInt64 *numFiles, const UInt64 *numBytes) { - RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause()); + RINOK(ProgressDialog.Sync.ProcessStopAndPause()); NSynchronization::CCriticalSectionLock lock(_criticalSection); if (numFiles != NULL) - ProgressDialog.ProgressSynch.SetNumFilesCur(*numFiles); + ProgressDialog.Sync.SetNumFilesCur(*numFiles); if (numBytes != NULL) - ProgressDialog.ProgressSynch.SetPos(*numBytes); + ProgressDialog.Sync.SetPos(*numBytes); return S_OK; } STDMETHODIMP COpenArchiveCallback::SetTotal(const UInt64 total) { - RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause()); - ProgressDialog.ProgressSynch.SetNumBytesTotal(total); + RINOK(ProgressDialog.Sync.ProcessStopAndPause()); + ProgressDialog.Sync.SetNumBytesTotal(total); return S_OK; } STDMETHODIMP COpenArchiveCallback::SetCompleted(const UInt64 *completed) { - RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause()); + RINOK(ProgressDialog.Sync.ProcessStopAndPause()); if (completed != NULL) - ProgressDialog.ProgressSynch.SetPos(*completed); + ProgressDialog.Sync.SetPos(*completed); return S_OK; } @@ -112,6 +112,7 @@ STDMETHODIMP COpenArchiveCallback::CryptoGetTextPassword(BSTR *password) { CPasswordDialog dialog; + ProgressDialog.WaitCreating(); if (dialog.Create(ProgressDialog) == IDCANCEL) return E_ABORT; diff --git a/CPP/7zip/UI/FileManager/OpenCallback.h b/CPP/7zip/UI/FileManager/OpenCallback.h index 5f0fbefc..559eb8fc 100755 --- a/CPP/7zip/UI/FileManager/OpenCallback.h +++ b/CPP/7zip/UI/FileManager/OpenCallback.h @@ -75,7 +75,7 @@ public: _subArchiveMode = false; } */ - void LoadFileInfo(const UString &folderPrefix, const UString &fileName) + void LoadFileInfo(const UString &folderPrefix, const UString &fileName) { _folderPrefix = folderPrefix; if (!_fileInfo.Find(_folderPrefix + fileName)) @@ -83,9 +83,9 @@ public: } void ShowMessage(const UInt64 *completed); - INT_PTR StartProgressDialog(const UString &title) + INT_PTR StartProgressDialog(const UString &title, NWindows::CThread &thread) { - return ProgressDialog.Create(title, ParentWindow); + return ProgressDialog.Create(title, thread, ParentWindow); } }; diff --git a/CPP/7zip/UI/FileManager/OptionsDialog.cpp b/CPP/7zip/UI/FileManager/OptionsDialog.cpp index 09d74705..1b44461f 100755 --- a/CPP/7zip/UI/FileManager/OptionsDialog.cpp +++ b/CPP/7zip/UI/FileManager/OptionsDialog.cpp @@ -2,42 +2,114 @@ #include "StdAfx.h" -#include "resource.h" - -#include "Common/StringConvert.h" - +#include "Windows/Control/Dialog.h" #include "Windows/Control/PropertyPage.h" -#include "Windows/Error.h" -#include "LangPage.h" -#include "LangPageRes.h" -#include "PluginsPage.h" -#include "PluginsPageRes.h" -#include "SystemPage.h" -#include "SystemPageRes.h" +#include "DialogSize.h" #include "EditPage.h" #include "EditPageRes.h" +#include "FoldersPage.h" +#include "FoldersPageRes.h" +#include "LangPage.h" +#include "LangPageRes.h" +#include "MenuPage.h" +#include "MenuPageRes.h" +// #include "PluginsPage.h" +// #include "PluginsPageRes.h" #include "SettingsPage.h" #include "SettingsPageRes.h" +#include "SystemPage.h" +#include "SystemPageRes.h" +#include "App.h" #include "LangUtils.h" #include "MyLoadMenu.h" -#include "App.h" +#include "ProgramLocation.h" + +#include "resource.h" using namespace NWindows; +#ifndef UNDER_CE +typedef UINT32 (WINAPI * DllRegisterServerPtr)(); + +extern HWND g_MenuPageHWND; + +static void ShowMenuErrorMessage(const wchar_t *m) +{ + MessageBoxW(g_MenuPageHWND, m, L"7-Zip", MB_ICONERROR); +} + +static int DllRegisterServer2(const char *name) +{ + NWindows::NDLL::CLibrary lib; + + UString prefix; + GetProgramFolderPath(prefix); + if (!lib.Load(prefix + L"7-zip.dll")) + { + ShowMenuErrorMessage(L"7-Zip cannot load 7-zip.dll"); + return E_FAIL; + } + DllRegisterServerPtr f = (DllRegisterServerPtr)lib.GetProc(name); + if (f == NULL) + { + ShowMenuErrorMessage(L"Incorrect plugin"); + return E_FAIL; + } + HRESULT res = f(); + if (res != S_OK) + ShowMenuErrorMessage(HResultToMessage(res)); + return (int)res; +} + +STDAPI DllRegisterServer(void) +{ + #ifdef UNDER_CE + return S_OK; + #else + return DllRegisterServer2("DllRegisterServer"); + #endif +} + +STDAPI DllUnregisterServer(void) +{ + #ifdef UNDER_CE + return S_OK; + #else + return DllRegisterServer2("DllUnregisterServer"); + #endif +} + +#endif + void OptionsDialog(HWND hwndOwner, HINSTANCE /* hInstance */) { CSystemPage systemPage; - CPluginsPage pluginsPage; + // CPluginsPage pluginsPage; CEditPage editPage; CSettingsPage settingsPage; CLangPage langPage; + CMenuPage menuPage; + CFoldersPage foldersPage; CObjectVector<NControl::CPageInfo> pages; - UINT32 langIDs[] = { 0x03010300, 0x03010100, 0x03010200, 0x03010400, 0x01000400}; - UINT pageIDs[] = { IDD_SYSTEM, IDD_PLUGINS, IDD_EDIT, IDD_SETTINGS, IDD_LANG}; - NControl::CPropertyPage *pagePinters[] = { &systemPage, &pluginsPage, &editPage, &settingsPage, &langPage }; + UINT32 langIDs[] = { 0x03010300, + // 0x03010100, + 0xFFFFFFFF, + 0x01000200, 0x03010200, 0x03010400, 0x01000400}; + + BIG_DIALOG_SIZE(200, 200); + + UINT pageIDs[] = { + SIZED_DIALOG(IDD_SYSTEM), + // IDD_PLUGINS, + SIZED_DIALOG(IDD_MENU), + SIZED_DIALOG(IDD_FOLDERS), + IDD_EDIT, + SIZED_DIALOG(IDD_SETTINGS), + SIZED_DIALOG(IDD_LANG) }; + NControl::CPropertyPage *pagePinters[] = { &systemPage, &menuPage, &foldersPage, &editPage, &settingsPage, &langPage }; const int kNumPages = sizeof(langIDs) / sizeof(langIDs[0]); for (int i = 0; i < kNumPages; i++) { @@ -51,15 +123,23 @@ void OptionsDialog(HWND hwndOwner, HINSTANCE /* hInstance */) INT_PTR res = NControl::MyPropertySheet(pages, hwndOwner, LangString(IDS_OPTIONS, 0x03010000)); if (res != -1 && res != 0) { - if (langPage._langWasChanged) + if (langPage.LangWasChanged) { g_App._window.SetText(LangString(IDS_APP_TITLE, 0x03000000)); MyLoadMenu(); + g_App.ReloadToolbars(); + g_App.MoveSubWindows(); + } + /* + if (systemPage.WasChanged) + { + // probably it doesn't work, since image list is locked? + g_App.SysIconsWereChanged(); } + */ g_App.SetListSettings(); g_App.SetShowSystemMenu(); g_App.RefreshAllPanels(); - g_App.ReloadToolbars(); // ::PostMessage(hwndOwner, kLangWasChangedMessage, 0 , 0); } } diff --git a/CPP/7zip/UI/FileManager/OverwriteDialog.cpp b/CPP/7zip/UI/FileManager/OverwriteDialog.cpp index 42c63266..5f072daf 100755 --- a/CPP/7zip/UI/FileManager/OverwriteDialog.cpp +++ b/CPP/7zip/UI/FileManager/OverwriteDialog.cpp @@ -2,9 +2,8 @@ #include "StdAfx.h" -#include "OverwriteDialog.h" - #include "Common/StringConvert.h" + #include "Windows/FileName.h" #include "Windows/Defs.h" #include "Windows/ResourceString.h" @@ -12,6 +11,7 @@ #include "Windows/PropVariantConversions.h" #include "FormatUtils.h" +#include "OverwriteDialog.h" // #include "../resource.h" @@ -36,6 +36,16 @@ static CIDLangPair kIDLangPairs[] = }; #endif +static const int kCurrentFileNameSizeLimit = 82; +static const int kCurrentFileNameSizeLimit2 = 30; + +void COverwriteDialog::ReduceString(UString &s) +{ + int size = _isBig ? kCurrentFileNameSizeLimit : kCurrentFileNameSizeLimit2; + if (s.Length() > size) + s = s.Left(size / 2) + UString(L" ... ") + s.Right(size / 2); +} + void COverwriteDialog::SetFileInfoControl(int textID, int iconID, const NOverwriteDialog::CFileInfo &fileInfo) { @@ -47,19 +57,23 @@ void COverwriteDialog::SetFileInfoControl(int textID, int iconID, #endif NumberToString(fileInfo.Size)); - UString reducedName; - const int kLineSize = 88; - for (int i = 0; i < fileInfo.Name.Length();) + const UString &fileName = fileInfo.Name; + int slashPos = fileName.ReverseFind(WCHAR_PATH_SEPARATOR); + UString s1, s2; + if (slashPos >= 0) { - reducedName += fileInfo.Name.Mid(i, kLineSize); - reducedName += L" "; - i += kLineSize; + s1 = fileName.Left(slashPos + 1); + s2 = fileName.Mid(slashPos + 1); } - - UString fullString = reducedName; - fullString += L"\n"; + else + s2 = fileName; + ReduceString(s1); + ReduceString(s2); + + UString fullString = s1 + L'\n' + s2; + fullString += L'\n'; fullString += sizeString; - fullString += L"\n"; + fullString += L'\n'; if (fileInfo.TimeIsDefined) { @@ -101,10 +115,9 @@ bool COverwriteDialog::OnInit() LangSetWindowText(HWND(*this), 0x02000900); LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); #endif - SetFileInfoControl(IDC_STATIC_OVERWRITE_OLD_FILE_SIZE_TIME, - IDC_STATIC_OVERWRITE_OLD_FILE_ICON, OldFileInfo); - SetFileInfoControl(IDC_STATIC_OVERWRITE_NEW_FILE_SIZE_TIME, - IDC_STATIC_OVERWRITE_NEW_FILE_ICON, NewFileInfo); + SetFileInfoControl(IDC_STATIC_OVERWRITE_OLD_FILE_SIZE_TIME, IDC_STATIC_OVERWRITE_OLD_FILE_ICON, OldFileInfo); + SetFileInfoControl(IDC_STATIC_OVERWRITE_NEW_FILE_SIZE_TIME, IDC_STATIC_OVERWRITE_NEW_FILE_ICON, NewFileInfo); + NormalizePosition(); return CModalDialog::OnInit(); } diff --git a/CPP/7zip/UI/FileManager/OverwriteDialog.h b/CPP/7zip/UI/FileManager/OverwriteDialog.h index d206fb01..f760611e 100755 --- a/CPP/7zip/UI/FileManager/OverwriteDialog.h +++ b/CPP/7zip/UI/FileManager/OverwriteDialog.h @@ -1,31 +1,68 @@ // OverwriteDialog.h -#ifndef __OVERWRITEDIALOG_H -#define __OVERWRITEDIALOG_H +#ifndef __OVERWRITE_DIALOG_H +#define __OVERWRITE_DIALOG_H + +#include "Common/Types.h" -#include "OverwriteDialogRes.h" #include "Windows/Control/Dialog.h" +#include "DialogSize.h" +#include "OverwriteDialogRes.h" + namespace NOverwriteDialog { struct CFileInfo { bool SizeIsDefined; - UINT64 Size; bool TimeIsDefined; + UInt64 Size; FILETIME Time; UString Name; + + void SetTime(const FILETIME *t) + { + if (t == 0) + TimeIsDefined = false; + else + { + TimeIsDefined = true; + Time = *t; + } + } + void SetSize(const UInt64 *size) + { + if (size == 0) + SizeIsDefined = false; + else + { + SizeIsDefined = true; + Size = *size; + } + } }; } class COverwriteDialog: public NWindows::NControl::CModalDialog { - void SetFileInfoControl(int textID, int iconID, - const NOverwriteDialog::CFileInfo &fileInfo); + bool _isBig; + + void SetFileInfoControl(int textID, int iconID, const NOverwriteDialog::CFileInfo &fileInfo); virtual bool OnInit(); bool OnButtonClicked(int buttonID, HWND buttonHWND); + void ReduceString(UString &s); + public: - INT_PTR Create(HWND parent = 0) { return CModalDialog::Create(IDD_DIALOG_OVERWRITE, parent); } + INT_PTR Create(HWND parent = 0) + { + BIG_DIALOG_SIZE(280, 200); + #ifdef UNDER_CE + _isBig = isBig; + #else + _isBig = true; + #endif + return CModalDialog::Create(SIZED_DIALOG(IDD_DIALOG_OVERWRITE), parent); + } NOverwriteDialog::CFileInfo OldFileInfo; NOverwriteDialog::CFileInfo NewFileInfo; diff --git a/CPP/7zip/UI/FileManager/OverwriteDialog.rc b/CPP/7zip/UI/FileManager/OverwriteDialog.rc index 1cce0876..8961d28b 100755 --- a/CPP/7zip/UI/FileManager/OverwriteDialog.rc +++ b/CPP/7zip/UI/FileManager/OverwriteDialog.rc @@ -1,44 +1,89 @@ #include "OverwriteDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 357 -#define ySize2 204 - -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#define xc 280 +#define yc 200 #undef iconSize -#define iconSize 20 +#define iconSize 24 + +#undef x +#undef fx +#undef fy +#define x (m + iconSize + m) +#define fx (xc - iconSize - m) +#define fy 50 + +#define bSizeBig 104 +#undef bx1 +#define bx1 (xs - m - bSizeBig) + +IDD_DIALOG_OVERWRITE MY_DIALOG +CAPTION "Confirm File Replace" +BEGIN + LTEXT "Destination folder already contains processed file.", IDC_STATIC_OVERWRITE_HEADER, m, 7, xc, 8 + LTEXT "Would you like to replace the existing file", IDC_STATIC_OVERWRITE_QUESTION_BEGIN, m, 28, xc, 8 + + ICON "", IDC_STATIC_OVERWRITE_OLD_FILE_ICON, m, 44, iconSize, iconSize + LTEXT "", IDC_STATIC_OVERWRITE_OLD_FILE_SIZE_TIME, x, 44, fx, fy, SS_NOPREFIX + + LTEXT "with this one?",IDC_STATIC_OVERWRITE_QUESTION_END, m, 98, xc, 8 + + ICON "",IDC_STATIC_OVERWRITE_NEW_FILE_ICON, m, 114, iconSize, iconSize + LTEXT "",IDC_STATIC_OVERWRITE_NEW_FILE_SIZE_TIME, x, 114, fx, fy, SS_NOPREFIX + + PUSHBUTTON "&Yes", IDYES, bx3, by2, bxs, bys + PUSHBUTTON "Yes to &All", IDC_BUTTON_OVERWRITE_YES_TO_ALL, bx2, by2, bxs, bys + PUSHBUTTON "A&uto Rename", IDC_BUTTON_OVERWRITE_AUTO_RENAME, bx1, by2, bSizeBig, bys + PUSHBUTTON "&No", IDNO, bx3, by1, bxs, bys + PUSHBUTTON "No to A&ll", IDC_BUTTON_OVERWRITE_NO_TO_ALL, bx2, by1, bxs, bys + PUSHBUTTON "&Cancel", IDCANCEL, xs - m - bxs, by1, bxs, bys +END -#undef fiXPos -#undef fiXSize -#undef fiYSize -#define fiXPos (iconSize + 12) -#define fiXSize (xSize2 - fiXPos) -#define fiYSize 50 -#define b1YPos (ySize - marg - bYSize) -#define b2YPos (b1YPos - bYSize - 10) +#ifdef UNDER_CE -IDD_DIALOG_OVERWRITE DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +#undef m +#undef xc +#undef yc + +#define m 4 +#define xc 152 +#define yc 144 + +#undef fy +#define fy 40 + +#undef bxs +#define bxs 48 + +#undef bx1 + +#define bx1 (xs - m - bxs) + +IDD_DIALOG_OVERWRITE_2 MY_DIALOG CAPTION "Confirm File Replace" -MY_FONT BEGIN - LTEXT "Destination folder already contains processed file.", IDC_STATIC_OVERWRITE_HEADER, marg, 7, xSize2, 8 - LTEXT "Would you like to replace the existing file", IDC_STATIC_OVERWRITE_QUESTION_BEGIN, marg, 28, xSize2, 8 - ICON "", IDC_STATIC_OVERWRITE_OLD_FILE_ICON, marg, 44, iconSize, iconSize - LTEXT "", IDC_STATIC_OVERWRITE_OLD_FILE_SIZE_TIME, fiXPos, 44, fiXSize, fiYSize, SS_NOPREFIX - LTEXT "with this one?",IDC_STATIC_OVERWRITE_QUESTION_END, marg, 98, xSize2, 8 - ICON "",IDC_STATIC_OVERWRITE_NEW_FILE_ICON, marg, 114, iconSize, iconSize - LTEXT "",IDC_STATIC_OVERWRITE_NEW_FILE_SIZE_TIME, fiXPos, 114, fiXSize, fiYSize, SS_NOPREFIX - PUSHBUTTON "&Yes", IDYES, 78, b2YPos, bXSize, bYSize - PUSHBUTTON "Yes to &All", IDC_BUTTON_OVERWRITE_YES_TO_ALL, 152, b2YPos, bXSize, bYSize - PUSHBUTTON "&No", IDNO, 226, b2YPos, bXSize, bYSize - PUSHBUTTON "No to A&ll", IDC_BUTTON_OVERWRITE_NO_TO_ALL, 300, b2YPos, bXSize, bYSize - PUSHBUTTON "A&uto Rename", IDC_BUTTON_OVERWRITE_AUTO_RENAME, 181, b1YPos, 109, bYSize - PUSHBUTTON "&Cancel", IDCANCEL, 300, b1YPos, bXSize, bYSize + LTEXT "Would you like to replace the existing file", IDC_STATIC_OVERWRITE_QUESTION_BEGIN, m, m, xc, 8 + + ICON "", IDC_STATIC_OVERWRITE_OLD_FILE_ICON, m, 20, iconSize, iconSize + LTEXT "", IDC_STATIC_OVERWRITE_OLD_FILE_SIZE_TIME, x, 20, fx, fy, SS_NOPREFIX + + LTEXT "with this one?",IDC_STATIC_OVERWRITE_QUESTION_END, m, 60, xc, 8 + + ICON "",IDC_STATIC_OVERWRITE_NEW_FILE_ICON, m, 72, iconSize, iconSize + LTEXT "",IDC_STATIC_OVERWRITE_NEW_FILE_SIZE_TIME, x, 72, fx, fy, SS_NOPREFIX + + PUSHBUTTON "&Yes", IDYES, bx3, by2, bxs, bys + PUSHBUTTON "Yes to &All", IDC_BUTTON_OVERWRITE_YES_TO_ALL, bx2, by2, bxs, bys + PUSHBUTTON "A&uto Rename", IDC_BUTTON_OVERWRITE_AUTO_RENAME, bx1, by2, bxs, bys + PUSHBUTTON "&No", IDNO, bx3, by1, bxs, bys + PUSHBUTTON "No to A&ll", IDC_BUTTON_OVERWRITE_NO_TO_ALL, bx2, by1, bxs, bys + PUSHBUTTON "&Cancel", IDCANCEL, bx1, by1, bxs, bys END +#endif + STRINGTABLE BEGIN diff --git a/CPP/7zip/UI/FileManager/OverwriteDialogRes.h b/CPP/7zip/UI/FileManager/OverwriteDialogRes.h index 66710f84..3bc6900d 100755 --- a/CPP/7zip/UI/FileManager/OverwriteDialogRes.h +++ b/CPP/7zip/UI/FileManager/OverwriteDialogRes.h @@ -1,8 +1,9 @@ +#define IDD_DIALOG_OVERWRITE 502 +#define IDD_DIALOG_OVERWRITE_2 602 + #define IDS_FILE_MODIFIED 600 #define IDS_FILE_SIZE 601 -#define IDD_DIALOG_OVERWRITE 502 - #define IDC_STATIC_OVERWRITE_HEADER 1000 #define IDC_STATIC_OVERWRITE_QUESTION_BEGIN 1001 diff --git a/CPP/7zip/UI/FileManager/Panel.cpp b/CPP/7zip/UI/FileManager/Panel.cpp index 9255b117..3988f1f3 100755 --- a/CPP/7zip/UI/FileManager/Panel.cpp +++ b/CPP/7zip/UI/FileManager/Panel.cpp @@ -118,6 +118,9 @@ LRESULT CPanel::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) case kRefreshStatusBar: OnRefreshStatusBar(); return 0; + case kRefreshHeaderComboBox: + LoadFullPathAndShow(); + return 0; case WM_TIMER: OnTimer(); return 0; @@ -184,6 +187,7 @@ LRESULT CMyListView::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0; switch(wParam) { + /* case VK_RETURN: { if (shift && !alt && !ctrl) @@ -193,6 +197,7 @@ LRESULT CMyListView::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) } break; } + */ case VK_NEXT: { if (ctrl && !alt && !shift) @@ -210,6 +215,17 @@ LRESULT CMyListView::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) } } } + #ifdef UNDER_CE + else if (message == WM_KEYUP) + { + if (wParam == VK_F2) // it's VK_TSOFT2 + { + // Activate Menu + ::PostMessage(g_HWND, WM_SYSCOMMAND, SC_KEYMENU, 0); + return 0; + } + } + #endif else if (message == WM_SETFOCUS) { _panel->_lastFocusedIsList = true; @@ -310,15 +326,6 @@ LRESULT CMyComboBoxEdit::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) return CallWindowProc(_origWindowProc, *this, message, wParam, lParam); } -static HIMAGELIST GetSysImageList(bool smallIcons) -{ - SHFILEINFO shellInfo; - return (HIMAGELIST)SHGetFileInfo(TEXT(""), - FILE_ATTRIBUTE_NORMAL |FILE_ATTRIBUTE_DIRECTORY, - &shellInfo, sizeof(shellInfo), - SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | (smallIcons ? SHGFI_SMALLICON : SHGFI_ICON)); -} - bool CPanel::OnCreate(CREATESTRUCT * /* createStruct */) { // _virtualMode = false; @@ -356,7 +363,9 @@ bool CPanel::OnCreate(CREATESTRUCT * /* createStruct */) HWND(*this), (HMENU)(UINT_PTR)(_baseID + 1), g_hInstance, NULL)) return false; + #ifndef UNDER_CE _listView.SetUnicodeFormat(true); + #endif _listView.SetUserDataLongPtr(LONG_PTR(&_listView)); _listView._panel = this; @@ -398,7 +407,9 @@ bool CPanel::OnCreate(CREATESTRUCT * /* createStruct */) // {VIEW_NEWFOLDER, kCreateFolderID, TBSTATE_ENABLED, BTNS_BUTTON, 0L, 0}, }; + #ifndef UNDER_CE if (g_ComCtl32Version >= MAKELONG(71, 4)) + #endif { icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES; @@ -409,7 +420,7 @@ bool CPanel::OnCreate(CREATESTRUCT * /* createStruct */) NULL, WS_VISIBLE | WS_BORDER | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER - | CCS_NOPARENTALIGN + // | CCS_NOPARENTALIGN | CCS_TOP | RBS_VARHEIGHT | RBS_BANDBORDERS @@ -437,17 +448,27 @@ bool CPanel::OnCreate(CREATESTRUCT * /* createStruct */) (LPCTBBUTTON)&tbb, sizeof(tbb) / sizeof(tbb[0]), 0, 0, 0, 0, sizeof (TBBUTTON))); + #ifndef UNDER_CE + // Load ComboBoxEx class icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_USEREX_CLASSES; InitCommonControlsEx(&icex); + #endif - _headerComboBox.CreateEx(0, WC_COMBOBOXEXW, NULL, + _headerComboBox.CreateEx(0, + #ifdef UNDER_CE + WC_COMBOBOXW + #else + WC_COMBOBOXEXW + #endif + , NULL, WS_BORDER | WS_VISIBLE |WS_CHILD | CBS_DROPDOWN | CBS_AUTOHSCROLL, 0, 0, 100, 520, ((_headerReBar == 0) ? HWND(*this) : _headerToolBar), (HMENU)(UINT_PTR)(_comboBoxID), g_hInstance, NULL); - _headerComboBox.SendMessage(CBEM_SETUNICODEFORMAT, (WPARAM)(BOOL)TRUE, 0); + #ifndef UNDER_CE + _headerComboBox.SetUnicodeFormat(true); _headerComboBox.SetImageList(GetSysImageList(true)); @@ -475,6 +496,8 @@ bool CPanel::OnCreate(CREATESTRUCT * /* createStruct */) _comboBoxEdit._origWindowProc = (WNDPROC)_comboBoxEdit.SetLongPtr(GWLP_WNDPROC, LONG_PTR(ComboBoxEditSubclassProc)); + #endif + if (_headerReBar) { REBARINFO rbi; @@ -491,7 +514,7 @@ bool CPanel::OnCreate(CREATESTRUCT * /* createStruct */) REBARBANDINFO rbBand; rbBand.cbSize = sizeof(REBARBANDINFO); // Required - rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; + rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; rbBand.fStyle = RBBS_NOGRIPPER; rbBand.cxMinChild = size.cx; rbBand.cyMinChild = size.cy; @@ -540,6 +563,8 @@ void CPanel::OnDestroy() void CPanel::ChangeWindowSize(int xSize, int ySize) { + if ((HWND)*this == 0) + return; int kHeaderSize; int kStatusBarSize; // int kStatusBar2Size; @@ -577,6 +602,8 @@ void CPanel::ChangeWindowSize(int xSize, int ySize) bool CPanel::OnSize(WPARAM /* wParam */, int xSize, int ySize) { + if ((HWND)*this == 0) + return true; if (_headerReBar) _headerReBar.Move(0, 0, xSize, 0); ChangeWindowSize(xSize, ySize); @@ -611,7 +638,7 @@ bool CPanel::OnNotify(UINT /* controlID */, LPNMHDR header, LRESULT &result) return OnNotifyList(header, result); else if (::GetParent(header->hwndFrom) == _listView && header->code == NM_RCLICK) - return OnRightClick((LPNMITEMACTIVATE)header, result); + return OnRightClick((MY_NMLISTVIEW_NMITEMACTIVATE *)header, result); return false; } @@ -647,15 +674,11 @@ void CPanel::MessageBox(LPCWSTR message) { MessageBox(message, L"7-Zip"); } void CPanel::MessageBoxMyError(LPCWSTR message) { MessageBox(message, L"Error"); } + + void CPanel::MessageBoxError(HRESULT errorCode, LPCWSTR caption) { - UString message; - if (errorCode == E_OUTOFMEMORY) - message = LangString(IDS_MEM_ERROR, 0x0200060B); - else - if (!NError::MyFormatMessage(errorCode, message)) - message = L"Error"; - MessageBox(message, caption); + MessageBox(HResultToMessage(errorCode), caption); } void CPanel::MessageBoxError(HRESULT errorCode) @@ -791,26 +814,19 @@ void CPanel::AddToArchive() UString destCurDirPrefix = _currentFolderPrefix; if (IsFSDrivesFolder()) { - destCurDirPrefix = L"C:\\"; + destCurDirPrefix = ROOT_FS_FOLDER; if (!IsDeviceDrivesPrefix()) curPrefix.Empty(); } for (int i = 0; i < indices.Size(); i++) - { - int index = indices[i]; - names.Add(curPrefix + GetItemRelPath(index)); - } - const UString archiveName = CreateArchiveName( - names.Front(), (names.Size() > 1), false); - + names.Add(curPrefix + GetItemRelPath(indices[i])); + const UString archiveName = CreateArchiveName(names.Front(), (names.Size() > 1), false); HRESULT res = CompressFiles(destCurDirPrefix, archiveName, L"", names, false, true, false); if (res != S_OK) { - if (_currentFolderPrefix.Length() >= MAX_PATH) + if (destCurDirPrefix.Length() >= MAX_PATH) MessageBoxErrorLang(IDS_MESSAGE_UNSUPPORTED_OPERATION_FOR_LONG_PATH_FOLDER, 0x03020A01); - else - MessageBoxError(res); } // KillSelection(); } @@ -866,40 +882,45 @@ void CPanel::ExtractArchives() ::ExtractArchives(paths, _currentFolderPrefix + folderName + UString(WCHAR_PATH_SEPARATOR), true); } -struct CThreadTest +static void AddValuePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s) { + wchar_t sz[32]; + s += LangString(resourceID, langID); + s += L' '; + ConvertUInt64ToString(value, sz); + s += sz; + s += L'\n'; +} + +class CThreadTest: public CProgressThreadVirt +{ + HRESULT ProcessVirt(); +public: CRecordVector<UInt32> Indices; CExtractCallbackImp *ExtractCallbackSpec; CMyComPtr<IFolderArchiveExtractCallback> ExtractCallback; CMyComPtr<IArchiveFolder> ArchiveFolder; - HRESULT Result; +}; - void Test() - { - ExtractCallbackSpec->ProgressDialog.WaitCreating(); - Result = ArchiveFolder->Extract(&Indices[0], Indices.Size(), - NExtract::NPathMode::kFullPathnames, NExtract::NOverwriteMode::kAskBefore, - NULL, BoolToInt(true), ExtractCallback); - ExtractCallbackSpec->ProgressDialog.MyClose(); - } - - static THREAD_FUNC_DECL MyThreadFunction(void *param) +HRESULT CThreadTest::ProcessVirt() +{ + RINOK(ArchiveFolder->Extract(&Indices[0], Indices.Size(), + NExtract::NPathMode::kFullPathnames, NExtract::NOverwriteMode::kAskBefore, + NULL, BoolToInt(true), ExtractCallback)); + if (ExtractCallbackSpec->IsOK()) { - ((CThreadTest*)param)->Test(); - return 0; + UString s; + AddValuePair(IDS_FOLDERS_COLON, 0x02000321, ExtractCallbackSpec->NumFolders, s); + AddValuePair(IDS_FILES_COLON, 0x02000320, ExtractCallbackSpec->NumFiles, s); + // AddSizePair(IDS_SIZE_COLON, 0x02000322, Stat.UnpackSize, s); + // AddSizePair(IDS_COMPRESSED_COLON, 0x02000323, Stat.PackSize, s); + s += L'\n'; + s += LangString(IDS_MESSAGE_NO_ERRORS, 0x02000608); + OkMessage = s; } + return S_OK; }; -static void AddValuePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s) -{ - wchar_t sz[32]; - s += LangString(resourceID, langID); - s += L" "; - ConvertUInt64ToString(value, sz); - s += sz; - s += L"\n"; -} - /* static void AddSizePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s) { @@ -912,7 +933,7 @@ static void AddSizePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s s += L" ("; s += sz; s += L" MB)"; - s += L"\n"; + s += L'\n'; } */ @@ -930,8 +951,7 @@ void CPanel::TestArchives() extracter.ArchiveFolder = archiveFolder; extracter.ExtractCallbackSpec = new CExtractCallbackImp; extracter.ExtractCallback = extracter.ExtractCallbackSpec; - extracter.ExtractCallbackSpec->ParentWindow = GetParent(); - extracter.ExtractCallbackSpec->ShowMessages = true; + extracter.ExtractCallbackSpec->ProgressDialog = &extracter.ProgressDialog; if (indices.IsEmpty()) return; @@ -941,35 +961,17 @@ void CPanel::TestArchives() UString title = LangString(IDS_PROGRESS_TESTING, 0x02000F90); UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000); - extracter.ExtractCallbackSpec->ProgressDialog.CompressingMode = false; - extracter.ExtractCallbackSpec->ProgressDialog.MainWindow = GetParent(); - extracter.ExtractCallbackSpec->ProgressDialog.MainTitle = progressWindowTitle; - extracter.ExtractCallbackSpec->ProgressDialog.MainAddTitle = title + L" "; + extracter.ProgressDialog.CompressingMode = false; + extracter.ProgressDialog.MainWindow = GetParent(); + extracter.ProgressDialog.MainTitle = progressWindowTitle; + extracter.ProgressDialog.MainAddTitle = title + L" "; extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAskBefore; extracter.ExtractCallbackSpec->Init(); - NWindows::CThread extractThread; - if (extractThread.Create(CThreadTest::MyThreadFunction, &extracter) != S_OK) + if (extracter.Create(title, GetParent()) != S_OK) return; - extracter.ExtractCallbackSpec->StartProgressDialog(title); - if (extracter.ExtractCallbackSpec->Messages.IsEmpty() && extracter.Result == S_OK) - { - UString s; - AddValuePair(IDS_FOLDERS_COLON, 0x02000321, extracter.ExtractCallbackSpec->NumFolders, s); - AddValuePair(IDS_FILES_COLON, 0x02000320, extracter.ExtractCallbackSpec->NumFiles, s); - // AddSizePair(IDS_SIZE_COLON, 0x02000322, extracter.Stat.UnpackSize, s); - // AddSizePair(IDS_COMPRESSED_COLON, 0x02000323, extracter.Stat.PackSize, s); - s += L"\n"; - s += LangString(IDS_MESSAGE_NO_ERRORS, 0x02000608); - MessageBoxInfo(s, LangString(IDS_PROGRESS_TESTING, 0x02000F90)); - } - else - { - if (extracter.Result != S_OK && extracter.Result != E_ABORT) - MessageBoxError(extracter.Result, L"Testing Error"); - } } RefreshTitleAlways(); return; @@ -986,4 +988,3 @@ void CPanel::TestArchives() return; ::TestArchives(paths); } - diff --git a/CPP/7zip/UI/FileManager/Panel.h b/CPP/7zip/UI/FileManager/Panel.h index ed157634..ead12d2e 100755 --- a/CPP/7zip/UI/FileManager/Panel.h +++ b/CPP/7zip/UI/FileManager/Panel.h @@ -3,6 +3,8 @@ #ifndef __PANEL_H #define __PANEL_H +#include "../../../../C/Alloc.h" + #include "Common/MyCom.h" #include "Windows/DLL.h" @@ -23,6 +25,7 @@ #include "AppState.h" #include "IFolder.h" #include "MyCom2.h" +#include "ProgressDialog2.h" #include "SysIconUtils.h" const int kParentFolderID = 100; @@ -31,6 +34,12 @@ const int kToolbarStartID = 2000; const int kParentIndex = -1; +#ifdef UNDER_CE +#define ROOT_FS_FOLDER L"\\" +#else +#define ROOT_FS_FOLDER L"C:\\\\" +#endif + struct CPanelCallback { virtual void OnTab() = 0; @@ -118,11 +127,12 @@ struct CFolderLink: public CTempFileInfo enum MyMessages { - kShiftSelectMessage = WM_USER + 1, + kShiftSelectMessage = WM_USER + 1, kReLoadMessage, kSetFocusToListView, kOpenItemChanged, - kRefreshStatusBar + kRefreshStatusBar, + kRefreshHeaderComboBox }; UString GetFolderPath(IFolderFolder * folder); @@ -163,6 +173,12 @@ struct CSelectedState CSelectedState(): FocusedItem(-1), SelectFocused(false) {} }; +#ifdef UNDER_CE +#define MY_NMLISTVIEW_NMITEMACTIVATE NMLISTVIEW +#else +#define MY_NMLISTVIEW_NMITEMACTIVATE NMITEMACTIVATE +#endif + class CPanel: public NWindows::NControl::CWindow2 { CExtToIconMap _extToIconMap; @@ -183,14 +199,20 @@ class CPanel: public NWindows::NControl::CWindow2 bool OnComboBoxCommand(UINT code, LPARAM param, LRESULT &result); + #ifndef UNDER_CE + LRESULT OnNotifyComboBoxEnter(const UString &s); bool OnNotifyComboBoxEndEdit(PNMCBEENDEDITW info, LRESULT &result); #ifndef _UNICODE bool OnNotifyComboBoxEndEdit(PNMCBEENDEDIT info, LRESULT &result); #endif + + #endif + bool OnNotifyReBar(LPNMHDR lParam, LRESULT &result); bool OnNotifyComboBox(LPNMHDR lParam, LRESULT &result); void OnItemChanged(NMLISTVIEW *item); + void OnNotifyActivateItems(); bool OnNotifyList(LPNMHDR lParam, LRESULT &result); void OnDrag(LPNMLISTVIEW nmListView); bool OnKeyDown(LPNMLVKEYDOWN keyDownInfo, LRESULT &result); @@ -203,6 +225,8 @@ public: HWND _mainWindow; CPanelCallback *_panelCallback; + void SysIconsWereChanged() { _extToIconMap.Clear(); } + void DeleteItems(bool toRecycleBin); void DeleteItemsInternal(CRecordVector<UInt32> &indices); void CreateFolder(); @@ -242,7 +266,13 @@ private: public: NWindows::NControl::CReBar _headerReBar; NWindows::NControl::CToolBar _headerToolBar; - NWindows::NControl::CComboBoxEx _headerComboBox; + NWindows::NControl:: + #ifdef UNDER_CE + CComboBox + #else + CComboBoxEx + #endif + _headerComboBox; UStringVector ComboBoxPaths; // CMyComboBox _headerComboBox; CMyComboBoxEdit _comboBoxEdit; @@ -383,8 +413,9 @@ public: void Release(); ~CPanel(); - void OnLeftClick(LPNMITEMACTIVATE itemActivate); - bool OnRightClick(LPNMITEMACTIVATE itemActivate, LRESULT &result); + void OnLeftClick(MY_NMLISTVIEW_NMITEMACTIVATE *itemActivate); + bool OnRightClick(MY_NMLISTVIEW_NMITEMACTIVATE *itemActivate, LRESULT &result); + void ShowColumnsContextMenu(int x, int y); void OnTimer(); void OnReload(); @@ -494,6 +525,8 @@ public: void MessageBoxLastError(LPCWSTR caption); void MessageBoxLastError(); + void MessageBoxErrorForUpdate(HRESULT errorCode, UINT resourceID, UInt32 langID); + void MessageBoxErrorLang(UINT resourceID, UInt32 langID); void OpenFocusedItemAsInternal(); @@ -522,10 +555,11 @@ public: void ChangeComment(); void SetListViewMode(UInt32 index); - UInt32 GetListViewMode() const { return _ListViewMode; }; + UInt32 GetListViewMode() const { return _ListViewMode; } + PROPID GetSortID() const { return _sortID; } void ChangeFlatMode(); - bool GetFlatMode() const { return _flatMode; }; + bool GetFlatMode() const { return _flatMode; } void RefreshStatusBar(); void OnRefreshStatusBar(); @@ -572,4 +606,20 @@ public: UString GetItemsInfoString(const CRecordVector<UInt32> &indices); }; +class CMyBuffer +{ + void *_data; +public: + CMyBuffer(): _data(0) {} + operator void *() { return _data; } + bool Allocate(size_t size) + { + if (_data != 0) + return false; + _data = ::MidAlloc(size); + return _data != 0; + } + ~CMyBuffer() { ::MidFree(_data); } +}; + #endif diff --git a/CPP/7zip/UI/FileManager/PanelCopy.cpp b/CPP/7zip/UI/FileManager/PanelCopy.cpp index 8ad3d4c9..8c27ef2f 100755 --- a/CPP/7zip/UI/FileManager/PanelCopy.cpp +++ b/CPP/7zip/UI/FileManager/PanelCopy.cpp @@ -13,8 +13,10 @@ using namespace NWindows; -struct CThreadExtractInArchive2 +class CPanelCopyThread: public CProgressThreadVirt { + HRESULT ProcessVirt(); +public: CMyComPtr<IFolderOperations> FolderOperations; CRecordVector<UInt32> Indices; UString DestPath; @@ -23,26 +25,17 @@ struct CThreadExtractInArchive2 HRESULT Result; bool MoveMode; - CThreadExtractInArchive2(): MoveMode(false) {} - - DWORD Extract() - { - ExtractCallbackSpec->ProgressDialog.WaitCreating(); - if (MoveMode) - Result = FolderOperations->MoveTo(&Indices.Front(), Indices.Size(), - DestPath, ExtractCallback); - else - Result = FolderOperations->CopyTo(&Indices.Front(), Indices.Size(), - DestPath, ExtractCallback); - ExtractCallbackSpec->ProgressDialog.MyClose(); - return 0; - } - - static THREAD_FUNC_DECL MyThreadFunction(void *param) - { - return ((CThreadExtractInArchive2 *)param)->Extract(); - } + CPanelCopyThread(): MoveMode(false), Result(E_FAIL) {} }; + +HRESULT CPanelCopyThread::ProcessVirt() +{ + if (MoveMode) + Result = FolderOperations->MoveTo(&Indices.Front(), Indices.Size(), DestPath, ExtractCallback); + else + Result = FolderOperations->CopyTo(&Indices.Front(), Indices.Size(), DestPath, ExtractCallback); + return Result; +} HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &folder, bool moveMode, bool showErrorMessages, UStringVector *messages, @@ -61,22 +54,22 @@ HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &fold HRESULT res; { - CThreadExtractInArchive2 extracter; + CPanelCopyThread extracter; + extracter.ExtractCallbackSpec = new CExtractCallbackImp; extracter.ExtractCallback = extracter.ExtractCallbackSpec; - extracter.ExtractCallbackSpec->ParentWindow = GetParent(); - extracter.ExtractCallbackSpec->ShowMessages = showErrorMessages; - extracter.ExtractCallbackSpec->ProgressDialog.CompressingMode = false; + extracter.ExtractCallbackSpec->ProgressDialog = &extracter.ProgressDialog; + extracter.ProgressDialog.CompressingMode = false; UString title = moveMode ? LangString(IDS_MOVING, 0x03020206): LangString(IDS_COPYING, 0x03020205); UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000); - extracter.ExtractCallbackSpec->ProgressDialog.MainWindow = GetParent(); - extracter.ExtractCallbackSpec->ProgressDialog.MainTitle = progressWindowTitle; - extracter.ExtractCallbackSpec->ProgressDialog.MainAddTitle = title + L" "; + extracter.ProgressDialog.MainWindow = GetParent(); + extracter.ProgressDialog.MainTitle = progressWindowTitle; + extracter.ProgressDialog.MainAddTitle = title + L" "; extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAskBefore; extracter.ExtractCallbackSpec->Init(); @@ -88,15 +81,13 @@ HRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &fold extracter.ExtractCallbackSpec->PasswordIsDefined = usePassword; extracter.ExtractCallbackSpec->Password = password; - NWindows::CThread extractThread; - RINOK(extractThread.Create(CThreadExtractInArchive2::MyThreadFunction, &extracter)); - extracter.ExtractCallbackSpec->StartProgressDialog(title); + RINOK(extracter.Create(title, GetParent())); if (messages != 0) - *messages = extracter.ExtractCallbackSpec->Messages; + *messages = extracter.ProgressDialog.Sync.Messages; res = extracter.Result; - if (res == S_OK && extracter.ExtractCallbackSpec->Messages.IsEmpty()) + if (res == S_OK && extracter.ExtractCallbackSpec->IsOK()) { usePassword = extracter.ExtractCallbackSpec->PasswordIsDefined; password = extracter.ExtractCallbackSpec->Password; @@ -113,57 +104,55 @@ struct CThreadUpdate UString FolderPrefix; UStringVector FileNames; CRecordVector<const wchar_t *> FileNamePointers; + CProgressDialog ProgressDialog; CMyComPtr<IFolderArchiveUpdateCallback> UpdateCallback; CUpdateCallback100Imp *UpdateCallbackSpec; HRESULT Result; - DWORD Process() + void Process() { - UpdateCallbackSpec->ProgressDialog.WaitCreating(); - Result = FolderOperations->CopyFrom( + try + { + CProgressCloser closer(ProgressDialog); + Result = FolderOperations->CopyFrom( FolderPrefix, &FileNamePointers.Front(), FileNamePointers.Size(), UpdateCallback); - UpdateCallbackSpec->ProgressDialog.MyClose(); - return 0; + } + catch(...) { Result = E_FAIL; } } - static THREAD_FUNC_DECL MyThreadFunction(void *param) { - return ((CThreadUpdate *)param)->Process(); + ((CThreadUpdate *)param)->Process(); + return 0; } }; - HRESULT CPanel::CopyFrom(const UString &folderPrefix, const UStringVector &filePaths, bool showErrorMessages, UStringVector *messages) { CMyComPtr<IFolderOperations> folderOperations; - if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK) - { - UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); - if (showErrorMessages) - MessageBox(errorMessage); - else if (messages != 0) - messages->Add(errorMessage); - return E_FAIL; - } - + _folder.QueryInterface(IID_IFolderOperations, &folderOperations); HRESULT res; + if (!folderOperations) + res = E_NOINTERFACE; + else { CThreadUpdate updater; updater.UpdateCallbackSpec = new CUpdateCallback100Imp; updater.UpdateCallback = updater.UpdateCallbackSpec; + updater.UpdateCallbackSpec->ProgressDialog = &updater.ProgressDialog; + UString title = LangString(IDS_COPYING, 0x03020205); UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000); - updater.UpdateCallbackSpec->ProgressDialog.MainWindow = GetParent(); - updater.UpdateCallbackSpec->ProgressDialog.MainTitle = progressWindowTitle; - updater.UpdateCallbackSpec->ProgressDialog.MainAddTitle = title + UString(L" "); + updater.ProgressDialog.MainWindow = GetParent(); + updater.ProgressDialog.MainTitle = progressWindowTitle; + updater.ProgressDialog.MainAddTitle = title + UString(L" "); - updater.UpdateCallbackSpec->Init((HWND)*this, false, L""); + updater.UpdateCallbackSpec->Init(false, L""); updater.FolderOperations = folderOperations; updater.FolderPrefix = folderPrefix; updater.FileNames.Reserve(filePaths.Size()); @@ -176,13 +165,24 @@ HRESULT CPanel::CopyFrom(const UString &folderPrefix, const UStringVector &fileP NWindows::CThread thread; RINOK(thread.Create(CThreadUpdate::MyThreadFunction, &updater)); - updater.UpdateCallbackSpec->StartProgressDialog(title); + updater.ProgressDialog.Create(title, thread, GetParent()); if (messages != 0) - *messages = updater.UpdateCallbackSpec->Messages; + *messages = updater.ProgressDialog.Sync.Messages; res = updater.Result; } + + if (res == E_NOINTERFACE) + { + UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); + if (showErrorMessages) + MessageBox(errorMessage); + else if (messages != 0) + messages->Add(errorMessage); + return E_ABORT; + } + RefreshTitleAlways(); return res; } @@ -219,10 +219,9 @@ void CPanel::CopyFromAsk(const UStringVector &filePaths) message += L"\n\'"; message += _currentFolderPrefix; message += L"\' ?"; - int res = ::MessageBoxW(*(this), message, title, MB_YESNOCANCEL | MB_ICONQUESTION | MB_SYSTEMMODAL); + int res = ::MessageBoxW(*(this), message, title, MB_YESNOCANCEL | MB_ICONQUESTION); if (res != IDYES) return; CopyFromNoAsk(filePaths); } - diff --git a/CPP/7zip/UI/FileManager/PanelCrc.cpp b/CPP/7zip/UI/FileManager/PanelCrc.cpp index aaa645cf..6b00a9b5 100755 --- a/CPP/7zip/UI/FileManager/PanelCrc.cpp +++ b/CPP/7zip/UI/FileManager/PanelCrc.cpp @@ -3,19 +3,15 @@ #include "StdAfx.h" #include "../../../../C/7zCrc.h" -#include "../../../../C/Alloc.h" #include "../../../../C/Sha256.h" #include "Common/IntToString.h" -#include "Windows/Error.h" #include "Windows/FileFind.h" #include "Windows/FileIO.h" #include "Windows/FileName.h" -#include "Windows/Thread.h" #include "OverwriteDialogRes.h" -#include "ProgressDialog2.h" #include "App.h" #include "FormatUtils.h" @@ -27,7 +23,6 @@ using namespace NWindows; using namespace NFile; -using namespace NName; static const UInt32 kBufSize = (1 << 15); @@ -40,7 +35,7 @@ struct CDirEnumerator CObjectVector<NFind::CEnumeratorW> Enumerators; UStringVector Prefixes; int Index; - bool GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UString &fullPath, DWORD &errorCode); + HRESULT GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UString &fullPath); void Init(); CDirEnumerator(): FlatMode(false) {}; @@ -53,7 +48,13 @@ void CDirEnumerator::Init() Index = 0; } -bool CDirEnumerator::GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UString &resPath, DWORD &errorCode) +static HRESULT GetNormalizedError() +{ + HRESULT errorCode = GetLastError(); + return (errorCode == 0) ? E_FAIL : errorCode; +} + +HRESULT CDirEnumerator::GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UString &resPath) { filled = false; for (;;) @@ -61,7 +62,7 @@ bool CDirEnumerator::GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UStr if (Enumerators.IsEmpty()) { if (Index >= FileNames.Size()) - return true; + return S_OK; const UString &path = FileNames[Index]; int pos = path.ReverseFind(WCHAR_PATH_SEPARATOR); resPath.Empty(); @@ -80,9 +81,9 @@ bool CDirEnumerator::GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UStr #endif if (!fileInfo.Find(BasePrefix + path)) { - errorCode = ::GetLastError(); + WRes errorCode = GetNormalizedError(); resPath = path; - return false; + return errorCode; } Index++; break; @@ -90,9 +91,9 @@ bool CDirEnumerator::GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UStr bool found; if (!Enumerators.Back().Next(fileInfo, found)) { - errorCode = ::GetLastError(); + HRESULT errorCode = GetNormalizedError(); resPath = Prefixes.Back(); - return false; + return errorCode; } if (found) { @@ -105,36 +106,26 @@ bool CDirEnumerator::GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UStr resPath += fileInfo.Name; if (!FlatMode && fileInfo.IsDir()) { - UString prefix = resPath + (UString)(wchar_t)kDirDelimiter; - Enumerators.Add(NFind::CEnumeratorW(BasePrefix + prefix + (UString)(wchar_t)kAnyStringWildcard)); + UString prefix = resPath + WCHAR_PATH_SEPARATOR; + Enumerators.Add(NFind::CEnumeratorW(BasePrefix + prefix + (UString)(wchar_t)NName::kAnyStringWildcard)); Prefixes.Add(prefix); } filled = true; - return true; + return S_OK; } -struct CThreadCrc +static void ConvertByteToHex(unsigned value, wchar_t *s) { - class CMyBuffer + for (int i = 0; i < 2; i++) { - void *_data; - public: - CMyBuffer(): _data(0) {} - operator void *() { return _data; } - bool Allocate(size_t size) - { - if (_data != 0) - return false; - _data = ::MidAlloc(size); - return _data != 0; - } - ~CMyBuffer() { ::MidFree(_data); } - }; - - CProgressDialog *ProgressDialog; + unsigned t = value & 0xF; + value >>= 4; + s[1 - i] = (wchar_t)((t < 10) ? (L'0' + t) : (L'A' + (t - 10))); + } +} - CDirEnumerator DirEnumerator; - +class CThreadCrc: public CProgressThreadVirt +{ UInt64 NumFilesScan; UInt64 NumFiles; UInt64 NumFolders; @@ -143,155 +134,176 @@ struct CThreadCrc Byte Sha256Sum[SHA256_DIGEST_SIZE]; UInt32 DataNameCrcSum; - HRESULT Result; - DWORD ErrorCode; - UString ErrorPath; - UString Error; - bool ThereIsError; + UString GetResultMessage() const; + HRESULT ProcessVirt(); +public: + CDirEnumerator Enumerator; + +}; + +UString CThreadCrc::GetResultMessage() const +{ + UString s; + wchar_t sz[32]; + + s += LangString(IDS_FILES_COLON, 0x02000320); + s += L' '; + ConvertUInt64ToString(NumFiles, sz); + s += sz; + s += L'\n'; + + s += LangString(IDS_FOLDERS_COLON, 0x02000321); + s += L' '; + ConvertUInt64ToString(NumFolders, sz); + s += sz; + s += L'\n'; - void Process2() + s += LangString(IDS_SIZE_COLON, 0x02000322); + s += L' '; + ConvertUInt64ToString(DataSize, sz); + s += MyFormatNew(IDS_FILE_SIZE, 0x02000982, sz); + s += L'\n'; + + s += LangString(IDS_CHECKSUM_CRC_DATA, 0x03020721); + s += L' '; + ConvertUInt32ToHex(DataCrcSum, sz); + s += sz; + s += L'\n'; + + s += LangString(IDS_CHECKSUM_CRC_DATA_NAMES, 0x03020722); + s += L' '; + ConvertUInt32ToHex(DataNameCrcSum, sz); + s += sz; + s += L'\n'; + + if (NumFiles == 1 && NumFilesScan == 1) { - DataSize = NumFolders = NumFiles = NumFilesScan = DataCrcSum = DataNameCrcSum = 0; - memset(Sha256Sum, 0, SHA256_DIGEST_SIZE); - ProgressDialog->WaitCreating(); - - CMyBuffer bufferObject; - if (!bufferObject.Allocate(kBufSize)) + s += L"SHA-256: "; + for (int i = 0; i < SHA256_DIGEST_SIZE; i++) { - Error = L"Can not allocate memory"; - ThereIsError = true; - return; + wchar_t s2[4]; + ConvertByteToHex(Sha256Sum[i], s2); + s2[2] = 0; + s += s2; } - Byte *buffer = (Byte *)(void *)bufferObject; - - UInt64 totalSize = 0; - - DirEnumerator.Init(); + } + return s; +} - UString scanningStr = LangString(IDS_SCANNING, 0x03020800); - scanningStr += L" "; +HRESULT CThreadCrc::ProcessVirt() +{ + DataSize = NumFolders = NumFiles = NumFilesScan = DataCrcSum = DataNameCrcSum = 0; + memset(Sha256Sum, 0, SHA256_DIGEST_SIZE); + // ProgressDialog.WaitCreating(); + + CMyBuffer bufferObject; + if (!bufferObject.Allocate(kBufSize)) + return E_OUTOFMEMORY; + Byte *buffer = (Byte *)(void *)bufferObject; + + UInt64 totalSize = 0; + + Enumerator.Init(); + + UString scanningStr = LangString(IDS_SCANNING, 0x03020800); + scanningStr += L' '; + + CProgressSync &sync = ProgressDialog.Sync; - for (;;) + for (;;) + { + NFind::CFileInfoW fileInfo; + bool filled; + UString resPath; + HRESULT errorCode = Enumerator.GetNextFile(fileInfo, filled, resPath); + if (errorCode != 0) { - NFile::NFind::CFileInfoW fileInfo; - bool filled; - UString resPath; - if (!DirEnumerator.GetNextFile(fileInfo, filled, resPath, ErrorCode)) - { - ThereIsError = true; - ErrorPath = resPath; - return; - } - 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; + ErrorPath1 = resPath; + return errorCode; } - ProgressDialog->ProgressSynch.SetNumFilesTotal(NumFilesScan); - ProgressDialog->ProgressSynch.SetProgress(totalSize, 0); - - DirEnumerator.Init(); - - for (;;) + if (!filled) + break; + if (!fileInfo.IsDir()) + { + totalSize += fileInfo.Size; + NumFilesScan++; + } + sync.SetCurrentFileName(scanningStr + resPath); + sync.SetProgress(totalSize, 0); + RINOK(sync.SetPosAndCheckPaused(0)); + } + sync.SetNumFilesTotal(NumFilesScan); + sync.SetProgress(totalSize, 0); + + Enumerator.Init(); + + for (;;) + { + NFind::CFileInfoW fileInfo; + bool filled; + UString resPath; + HRESULT errorCode = Enumerator.GetNextFile(fileInfo, filled, resPath); + if (errorCode != 0) { - NFile::NFind::CFileInfoW fileInfo; - bool filled; - UString resPath; - if (!DirEnumerator.GetNextFile(fileInfo, filled, resPath, ErrorCode)) + ErrorPath1 = resPath; + return errorCode; + } + if (!filled) + break; + + UInt32 crc = CRC_INIT_VAL; + CSha256 sha256; + Sha256_Init(&sha256); + + if (fileInfo.IsDir()) + NumFolders++; + else + { + NIO::CInFile inFile; + if (!inFile.Open(Enumerator.BasePrefix + resPath)) { - ThereIsError = true; - ErrorPath = resPath; - return; + errorCode = GetNormalizedError(); + ErrorPath1 = resPath; + return errorCode; } - if (!filled) - break; - - UInt32 crc = CRC_INIT_VAL; - CSha256 sha256; - Sha256_Init(&sha256); - - if (fileInfo.IsDir()) - NumFolders++; - else + sync.SetCurrentFileName(resPath); + sync.SetNumFilesCur(NumFiles); + NumFiles++; + for (;;) { - NFile::NIO::CInFile inFile; - if (!inFile.Open(DirEnumerator.BasePrefix + resPath)) + UInt32 processedSize; + if (!inFile.Read(buffer, kBufSize, processedSize)) { - ErrorCode = ::GetLastError(); - ThereIsError = true; - ErrorPath = resPath; - return; + errorCode = GetNormalizedError(); + ErrorPath1 = resPath; + return errorCode; } - ProgressDialog->ProgressSynch.SetCurrentFileName(resPath); - ProgressDialog->ProgressSynch.SetNumFilesCur(NumFiles); - NumFiles++; - for (;;) - { - UInt32 processedSize; - if (!inFile.Read(buffer, kBufSize, processedSize)) - { - ErrorCode = ::GetLastError(); - ThereIsError = true; - ErrorPath = resPath; - return; - } - 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 (processedSize == 0) + break; + crc = CrcUpdate(crc, buffer, processedSize); if (NumFilesScan == 1) - Sha256_Final(&sha256, Sha256Sum); - } - for (int i = 0; i < resPath.Length(); i++) - { - wchar_t c = resPath[i]; - crc = CRC_UPDATE_BYTE(crc, ((Byte)(c & 0xFF))); - crc = CRC_UPDATE_BYTE(crc, ((Byte)((c >> 8) & 0xFF))); + Sha256_Update(&sha256, buffer, processedSize); + + DataSize += processedSize; + RINOK(sync.SetPosAndCheckPaused(DataSize)); } - DataNameCrcSum += CRC_GET_DIGEST(crc); - 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++) + { + wchar_t c = resPath[i]; + crc = CRC_UPDATE_BYTE(crc, ((Byte)(c & 0xFF))); + crc = CRC_UPDATE_BYTE(crc, ((Byte)((c >> 8) & 0xFF))); + } + DataNameCrcSum += CRC_GET_DIGEST(crc); + RINOK(sync.SetPosAndCheckPaused(DataSize)); } - DWORD Process() - { - try { Process2(); } - catch(...) { Error = L"Error"; ThereIsError = true;} - ProgressDialog->MyClose(); - return 0; - } - - static THREAD_FUNC_DECL MyThreadFunction(void *param) - { - return ((CThreadCrc *)param)->Process(); - } -}; - -static void ConvertByteToHex(unsigned value, wchar_t *s) -{ - for (int i = 0; i < 2; i++) - { - unsigned t = value & 0xF; - value >>= 4; - s[1 - i] = (wchar_t)((t < 10) ? (L'0' + t) : (L'A' + (t - 10))); - } + sync.SetNumFilesCur(NumFiles); + OkMessage = GetResultMessage(); + OkMessageTitle = LangString(IDS_CHECKSUM_INFORMATION, 0x03020720); + return S_OK; } void CApp::CalculateCrc() @@ -308,98 +320,23 @@ void CApp::CalculateCrc() if (indices.IsEmpty()) return; - CThreadCrc combiner; + { + CThreadCrc t; for (int i = 0; i < indices.Size(); i++) - combiner.DirEnumerator.FileNames.Add(srcPanel.GetItemRelPath(indices[i])); - combiner.DirEnumerator.BasePrefix = srcPanel.GetFsPath(); - combiner.DirEnumerator.FlatMode = GetFlatMode(); + t.Enumerator.FileNames.Add(srcPanel.GetItemRelPath(indices[i])); + t.Enumerator.BasePrefix = srcPanel.GetFsPath(); + t.Enumerator.FlatMode = GetFlatMode(); - { - CProgressDialog progressDialog; - combiner.ProgressDialog = &progressDialog; - combiner.ErrorCode = 0; - combiner.Result = S_OK; - combiner.ThereIsError = false; + t.ProgressDialog.ShowCompressionInfo = false; - UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000); UString title = LangString(IDS_CHECKSUM_CALCULATING, 0x03020710); - progressDialog.MainWindow = _window; - progressDialog.MainTitle = progressWindowTitle; - progressDialog.MainAddTitle = title + UString(L" "); + t.ProgressDialog.MainWindow = _window; + t.ProgressDialog.MainTitle = LangString(IDS_APP_TITLE, 0x03000000); + t.ProgressDialog.MainAddTitle = title + UString(L' '); - NWindows::CThread thread; - if (thread.Create(CThreadCrc::MyThreadFunction, &combiner) != S_OK) + if (t.Create(title, _window) != S_OK) return; - progressDialog.Create(title, _window); - - if (combiner.Result != S_OK) - { - if (combiner.Result != E_ABORT) - srcPanel.MessageBoxError(combiner.Result); - } - else if (combiner.ThereIsError) - { - if (combiner.Error.IsEmpty()) - { - UString message = combiner.DirEnumerator.BasePrefix + combiner.ErrorPath; - message += L"\n"; - message += NError::MyFormatMessageW(combiner.ErrorCode); - srcPanel.MessageBoxMyError(message); - } - else - srcPanel.MessageBoxMyError(combiner.Error); - } - else - { - UString s; - { - wchar_t sz[32]; - - s += LangString(IDS_FILES_COLON, 0x02000320); - s += L" "; - ConvertUInt64ToString(combiner.NumFiles, sz); - s += sz; - s += L"\n"; - - s += LangString(IDS_FOLDERS_COLON, 0x02000321); - s += L" "; - ConvertUInt64ToString(combiner.NumFolders, sz); - s += sz; - s += L"\n"; - - s += LangString(IDS_SIZE_COLON, 0x02000322); - s += L" "; - ConvertUInt64ToString(combiner.DataSize, sz); - s += MyFormatNew(IDS_FILE_SIZE, 0x02000982, sz);; - s += L"\n"; - - s += LangString(IDS_CHECKSUM_CRC_DATA, 0x03020721); - s += L" "; - ConvertUInt32ToHex(combiner.DataCrcSum, sz); - s += sz; - s += L"\n"; - - s += LangString(IDS_CHECKSUM_CRC_DATA_NAMES, 0x03020722); - 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)); - } } RefreshTitleAlways(); } diff --git a/CPP/7zip/UI/FileManager/PanelDrag.cpp b/CPP/7zip/UI/FileManager/PanelDrag.cpp index 6d1c9a29..eb5ad871 100755 --- a/CPP/7zip/UI/FileManager/PanelDrag.cpp +++ b/CPP/7zip/UI/FileManager/PanelDrag.cpp @@ -2,6 +2,10 @@ #include "StdAfx.h" +#ifdef UNDER_CE +#include <winuserm.h> +#endif + #include "Common/StringConvert.h" #include "Windows/Memory.h" @@ -413,6 +417,10 @@ void CDropTarget::RemoveSelection() m_SelectionIndex = -1; } +#ifdef UNDER_CE +#define ChildWindowFromPointEx(hwndParent, pt, uFlags) ChildWindowFromPoint(hwndParent, pt) +#endif + void CDropTarget::PositionCursor(POINTL ptl) { m_SubFolderIndex = -1; @@ -767,8 +775,6 @@ void CPanel::CompressDropFiles(const UStringVector &fileNames, const UString &fo { if (fileNames.Size() == 0) return; - const UString archiveName = CreateArchiveName(fileNames.Front(), - (fileNames.Size() > 1), false); bool createNewArchive = true; if (!IsFSFolder()) createNewArchive = !DoesItSupportOperations(); @@ -780,8 +786,9 @@ void CPanel::CompressDropFiles(const UStringVector &fileNames, const UString &fo { NFile::NDirectory::GetOnlyDirPrefix(fileNames.Front(), folderPath2); if (IsFolderInTemp(folderPath2)) - folderPath2 = L"C:\\"; // fix it + folderPath2 = ROOT_FS_FOLDER; } + const UString archiveName = CreateArchiveName(fileNames.Front(), (fileNames.Size() > 1), false); CompressFiles(folderPath2, archiveName, L"", fileNames, false, // email true, // showDialog diff --git a/CPP/7zip/UI/FileManager/PanelFolderChange.cpp b/CPP/7zip/UI/FileManager/PanelFolderChange.cpp index e6336f31..41ffe9da 100755 --- a/CPP/7zip/UI/FileManager/PanelFolderChange.cpp +++ b/CPP/7zip/UI/FileManager/PanelFolderChange.cpp @@ -9,7 +9,11 @@ #include "../../PropID.h" +#ifdef UNDER_CE +#include "FSFolder.h" +#else #include "FSDrives.h" +#endif #include "LangUtils.h" #include "ListViewDialog.h" #include "Panel.h" @@ -193,6 +197,8 @@ void CPanel::LoadFullPathAndShow() _appState->FolderHistory.AddString(_currentFolderPrefix); _headerComboBox.SetText(_currentFolderPrefix); + + #ifndef UNDER_CE COMBOBOXEXITEM item; item.mask = 0; @@ -220,10 +226,12 @@ void CPanel::LoadFullPathAndShow() } item.iItem = -1; _headerComboBox.SetItem(&item); + #endif RefreshTitle(); } +#ifndef UNDER_CE LRESULT CPanel::OnNotifyComboBoxEnter(const UString &s) { if (BindToPathAndRefresh(GetUnicodeString(s)) == S_OK) @@ -262,6 +270,7 @@ bool CPanel::OnNotifyComboBoxEndEdit(PNMCBEENDEDITW info, LRESULT &result) } return false; } +#endif #ifndef _UNICODE bool CPanel::OnNotifyComboBoxEndEdit(PNMCBEENDEDIT info, LRESULT &result) @@ -295,6 +304,16 @@ bool CPanel::OnNotifyComboBoxEndEdit(PNMCBEENDEDIT info, LRESULT &result) void CPanel::AddComboBoxItem(const UString &name, int iconIndex, int indent, bool addToList) { + #ifdef UNDER_CE + + UString s; + iconIndex = iconIndex; + for (int i = 0; i < indent; i++) + s += L" "; + _headerComboBox.AddString(s + name); + + #else + COMBOBOXEXITEMW item; item.mask = CBEIF_TEXT | CBEIF_INDENT; item.iSelectedImage = item.iImage = iconIndex; @@ -304,6 +323,9 @@ void CPanel::AddComboBoxItem(const UString &name, int iconIndex, int indent, boo item.iIndent = indent; item.pszText = (LPWSTR)(LPCWSTR)name; _headerComboBox.InsertItem(&item); + + #endif + if (addToList) ComboBoxPaths.Add(name); } @@ -322,32 +344,30 @@ bool CPanel::OnComboBoxCommand(UINT code, LPARAM /* param */, LRESULT &result) ComboBoxPaths.Clear(); _headerComboBox.ResetContent(); - int iconIndex; - UString name; - int i; UStringVector pathParts; SplitPathToParts(_currentFolderPrefix, pathParts); UString sumPass; + if (!pathParts.IsEmpty()) + pathParts.DeleteBack(); for (i = 0; i < pathParts.Size(); i++) { UString name = pathParts[i]; - if (name.IsEmpty()) - continue; sumPass += name; - UString curName = sumPass; - if (i == 0) - curName += WCHAR_PATH_SEPARATOR; + sumPass += WCHAR_PATH_SEPARATOR; CFileInfoW info; DWORD attrib = FILE_ATTRIBUTE_DIRECTORY; if (info.Find(sumPass)) attrib = info.Attrib; - sumPass += WCHAR_PATH_SEPARATOR; - AddComboBoxItem(name, GetRealIconIndex(curName, attrib), i, false); + AddComboBoxItem(name.IsEmpty() ? L"\\" : name, GetRealIconIndex(sumPass, attrib), i, false); ComboBoxPaths.Add(sumPass); } + #ifndef UNDER_CE + + int iconIndex; + UString name; name = RootFolder_GetName_Documents(iconIndex); AddComboBoxItem(name, iconIndex, 0, true); @@ -369,7 +389,7 @@ bool CPanel::OnComboBoxCommand(UINT code, LPARAM /* param */, LRESULT &result) name = RootFolder_GetName_Network(iconIndex); AddComboBoxItem(name, iconIndex, 0, true); - // UStringVector strings; _appState->FolderHistory.GetList(strings); + #endif return false; } @@ -382,10 +402,14 @@ bool CPanel::OnComboBoxCommand(UINT code, LPARAM /* param */, LRESULT &result) { UString pass = ComboBoxPaths[index]; _headerComboBox.SetCurSel(-1); - _headerComboBox.SetText(pass); // it's fix for seclecting by mouse. + // _headerComboBox.SetText(pass); // it's fix for seclecting by mouse. if (BindToPathAndRefresh(pass) == S_OK) { PostMessage(kSetFocusToListView); + #ifdef UNDER_CE + PostMessage(kRefreshHeaderComboBox); + #endif + return true; } } @@ -410,6 +434,7 @@ bool CPanel::OnComboBoxCommand(UINT code, LPARAM /* param */, LRESULT &result) bool CPanel::OnNotifyComboBox(LPNMHDR header, LRESULT &result) { + #ifndef UNDER_CE switch(header->code) { case CBEN_BEGINEDIT: @@ -429,6 +454,7 @@ bool CPanel::OnNotifyComboBox(LPNMHDR header, LRESULT &result) return OnNotifyComboBoxEndEdit((PNMCBEENDEDITW)header, result); } } + #endif return false; } @@ -463,16 +489,17 @@ void CPanel::OpenParentFolder() { LoadFullPath(); // Maybe we don't need it ?? UString focucedName; - if (!_currentFolderPrefix.IsEmpty()) + if (!_currentFolderPrefix.IsEmpty() && + _currentFolderPrefix.Back() == WCHAR_PATH_SEPARATOR) { - UString string = _currentFolderPrefix; - string.Delete(string.Length() - 1); - int pos = string.ReverseFind(WCHAR_PATH_SEPARATOR); - if (pos < 0) - pos = 0; - else - pos++; - focucedName = string.Mid(pos); + focucedName = _currentFolderPrefix; + focucedName.DeleteBack(); + if (focucedName != L"\\\\.") + { + int pos = focucedName.ReverseFind(WCHAR_PATH_SEPARATOR); + if (pos >= 0) + focucedName = focucedName.Mid(pos + 1); + } } CDisableTimerProcessing disableTimerProcessing1(*this); @@ -553,9 +580,15 @@ void CPanel::OpenRootFolder() void CPanel::OpenDrivesFolder() { CloseOpenFolders(); - CFSDrives *fsFolderSpec = new CFSDrives; - _folder = fsFolderSpec; - fsFolderSpec->Init(); + #ifdef UNDER_CE + NFsFolder::CFSFolder *folderSpec = new NFsFolder::CFSFolder; + _folder = folderSpec; + folderSpec->InitToRoot(); + #else + CFSDrives *folderSpec = new CFSDrives; + _folder = folderSpec; + folderSpec->Init(); + #endif RefreshListCtrl(); } diff --git a/CPP/7zip/UI/FileManager/PanelItemOpen.cpp b/CPP/7zip/UI/FileManager/PanelItemOpen.cpp index 2aab2aae..2deea0af 100755 --- a/CPP/7zip/UI/FileManager/PanelItemOpen.cpp +++ b/CPP/7zip/UI/FileManager/PanelItemOpen.cpp @@ -8,22 +8,19 @@ #include "Windows/Error.h" #include "Windows/FileDir.h" #include "Windows/FileFind.h" -#include "Windows/Synchronization.h" +#include "Windows/Process.h" #include "Windows/Thread.h" -#include "ExtractCallback.h" +#include "../Common/ExtractingFilePath.h" + +#include "App.h" + #include "FileFolderPluginOpen.h" #include "FormatUtils.h" -#include "IFolder.h" #include "LangUtils.h" -#include "Panel.h" #include "RegistryUtils.h" #include "UpdateCallback100.h" -#include "App.h" - -#include "../Common/ExtractingFilePath.h" - #include "resource.h" using namespace NWindows; @@ -31,7 +28,6 @@ using namespace NSynchronization; using namespace NFile; using namespace NDirectory; -extern HWND g_HWND; #ifndef _UNICODE extern bool g_IsNT; #endif @@ -167,6 +163,9 @@ HRESULT CPanel::OpenParentArchiveFolder() static const wchar_t *kStartExtensions[] = { + #ifdef UNDER_CE + L"cab", + #endif L"exe", L"bat", L"com", L"chm", L"msi", L"doc", L"xls", L"ppt", L"pps", L"wps", L"wpt", L"wks", L"xlr", L"wdb", @@ -175,7 +174,9 @@ static const wchar_t *kStartExtensions[] = L"xlam", L"pptx", L"pptm", L"potx", L"potm", L"ppam", L"ppsx", L"ppsm", L"xsn", L"dwf", - + + L"flv", L"swf", + L"odt", L"ods", L"wb3", L"pdf" @@ -194,81 +195,31 @@ static bool DoItemAlwaysStart(const UString &name) return false; } -static HRESULT MyCreateProcess(const UString &command, HANDLE *hProcess) +static UString GetQuotedString(const UString &s) { - PROCESS_INFORMATION processInformation; - BOOL result; - #ifndef _UNICODE - if (!g_IsNT) - { - STARTUPINFOA startupInfo; - startupInfo.cb = sizeof(startupInfo); - startupInfo.lpReserved = 0; - startupInfo.lpDesktop = 0; - startupInfo.lpTitle = 0; - startupInfo.dwFlags = 0; - startupInfo.cbReserved2 = 0; - startupInfo.lpReserved2 = 0; - - result = ::CreateProcessA(NULL, (CHAR *)(const CHAR *)GetSystemString(command), - NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInformation); - } - else - #endif - { - STARTUPINFOW startupInfo; - startupInfo.cb = sizeof(startupInfo); - startupInfo.lpReserved = 0; - startupInfo.lpDesktop = 0; - startupInfo.lpTitle = 0; - startupInfo.dwFlags = 0; - startupInfo.cbReserved2 = 0; - startupInfo.lpReserved2 = 0; - - result = ::CreateProcessW(NULL, (WCHAR *)(const WCHAR *)command, - NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInformation); - } - - if (result == 0) - return ::GetLastError(); - - ::CloseHandle(processInformation.hThread); - *hProcess = processInformation.hProcess; - return S_OK; + return UString(L'\"') + s + UString(L'\"'); } -static HRESULT MyCreateProcess(const UString &command) -{ - HANDLE hProcess; - HRESULT res = MyCreateProcess(command, &hProcess); - if (res == SZ_OK) - ::CloseHandle(hProcess); - return res; -} - -static HANDLE StartEditApplication(const UString &path, HWND window) +static HRESULT StartEditApplication(const UString &path, HWND window, CProcess &process) { UString command; ReadRegEditor(command); if (command.IsEmpty()) { + #ifdef UNDER_CE + command = L"\\Windows\\"; + #else if (!MyGetWindowsDirectory(command)) return 0; NFile::NName::NormalizeDirPathPrefix(command); + #endif command += L"notepad.exe"; } - command = UString(L"\"") + command + UString(L"\""); - command += L" \""; - command += path; - command += L"\""; - HANDLE hProcess; - HRESULT res = MyCreateProcess(command, &hProcess); - if (res == SZ_OK) - return hProcess; - ::MessageBoxW(window, LangString(IDS_CANNOT_START_EDITOR, 0x03020282), - L"7-Zip", MB_OK | MB_ICONSTOP); - return 0; + HRESULT res = process.Create(command, GetQuotedString(path), NULL); + if (res != SZ_OK) + ::MessageBoxW(window, LangString(IDS_CANNOT_START_EDITOR, 0x03020282), L"7-Zip", MB_OK | MB_ICONSTOP); + return res; } void CApp::DiffFiles() @@ -304,16 +255,9 @@ void CApp::DiffFiles() if (command.IsEmpty()) return; - command = UString(L"\"") + command + UString(L"\""); - command += L" \""; - command += path1; - command += L"\""; - - command += L" \""; - command += path2; - command += L"\""; + UString param = GetQuotedString(path1) + L' ' + GetQuotedString(path2); - HRESULT res = MyCreateProcess(command); + HRESULT res = MyCreateProcess(command, param); if (res == SZ_OK) return; ::MessageBoxW(_window, LangString(IDS_CANNOT_START_EDITOR, 0x03020282), L"7-Zip", MB_OK | MB_ICONSTOP); @@ -323,10 +267,9 @@ void CApp::DiffFiles() typedef BOOL (WINAPI * ShellExecuteExWP)(LPSHELLEXECUTEINFOW lpExecInfo); #endif -static HANDLE StartApplication(const UString &dir, const UString &path, HWND window) +static HRESULT StartApplication(const UString &dir, const UString &path, HWND window, CProcess &process) { UINT32 result; - HANDLE hProcess; #ifndef _UNICODE if (g_IsNT) { @@ -346,28 +289,38 @@ static HANDLE StartApplication(const UString &dir, const UString &path, HWND win return 0; shellExecuteExW(&execInfo); result = (UINT32)(UINT_PTR)execInfo.hInstApp; - hProcess = execInfo.hProcess; + process.Attach(execInfo.hProcess); } else #endif { SHELLEXECUTEINFO execInfo; execInfo.cbSize = sizeof(execInfo); - execInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT; + execInfo.fMask = SEE_MASK_NOCLOSEPROCESS + #ifndef UNDER_CE + | SEE_MASK_FLAG_DDEWAIT + #endif + ; execInfo.hwnd = NULL; execInfo.lpVerb = NULL; const CSysString sysPath = GetSystemString(path); const CSysString sysDir = GetSystemString(dir); execInfo.lpFile = sysPath; execInfo.lpParameters = NULL; - execInfo.lpDirectory = sysDir.IsEmpty() ? NULL : (LPCTSTR)sysDir; + execInfo.lpDirectory = + #ifdef UNDER_CE + NULL + #else + sysDir.IsEmpty() ? NULL : (LPCTSTR)sysDir + #endif + ; execInfo.nShow = SW_SHOWNORMAL; execInfo.hProcess = 0; ::ShellExecuteEx(&execInfo); result = (UINT32)(UINT_PTR)execInfo.hInstApp; - hProcess = execInfo.hProcess; + process.Attach(execInfo.hProcess); } - if(result <= 32) + if (result <= 32) { switch(result) { @@ -378,7 +331,13 @@ static HANDLE StartApplication(const UString &dir, const UString &path, HWND win L"7-Zip", MB_OK | MB_ICONSTOP); } } - return hProcess; + return S_OK; +} + +static void StartApplicationDontWait(const UString &dir, const UString &path, HWND window) +{ + CProcess process; + StartApplication(dir, path, window, process); } void CPanel::EditItem(int index) @@ -388,18 +347,29 @@ void CPanel::EditItem(int index) OpenItemInArchive(index, false, true, true); return; } - HANDLE hProcess = StartEditApplication(GetItemFullPath(index), (HWND)*this); - if (hProcess != 0) - ::CloseHandle(hProcess); + CProcess process; + StartEditApplication(GetItemFullPath(index), (HWND)*this, process); } void CPanel::OpenFolderExternal(int index) { UString fsPrefix = GetFsPath(); - HANDLE hProcess = StartApplication(fsPrefix, - fsPrefix + GetItemRelPath(index) + WCHAR_PATH_SEPARATOR, (HWND)*this); - if (hProcess != 0) - ::CloseHandle(hProcess); + UString name; + if (index == kParentIndex) + { + int pos = fsPrefix.ReverseFind(WCHAR_PATH_SEPARATOR); + if (pos >= 0 && pos == fsPrefix.Length() - 1) + { + UString s = fsPrefix.Left(pos); + pos = s.ReverseFind(WCHAR_PATH_SEPARATOR); + if (pos >= 0) + fsPrefix = s.Left(pos + 1); + } + name = fsPrefix; + } + else + name = fsPrefix + GetItemRelPath(index) + WCHAR_PATH_SEPARATOR; + StartApplicationDontWait(fsPrefix, name, (HWND)*this); } void CPanel::OpenItem(int index, bool tryInternal, bool tryExternal) @@ -416,7 +386,8 @@ void CPanel::OpenItem(int index, bool tryInternal, bool tryExternal) MessageBoxErrorLang(IDS_VIRUS, 0x03020284); return; } - UString fullPath = _currentFolderPrefix + name; + UString prefix = GetFsPath(); + UString fullPath = prefix + name; if (tryInternal) if (!tryExternal || !DoItemAlwaysStart(name)) { @@ -432,12 +403,31 @@ void CPanel::OpenItem(int index, bool tryInternal, bool tryExternal) if (tryExternal) { // SetCurrentDirectory opens HANDLE to folder!!! - // NDirectory::MySetCurrentDirectory(_currentFolderPrefix); - HANDLE hProcess = StartApplication(_currentFolderPrefix, fullPath, (HWND)*this); - if (hProcess != 0) - ::CloseHandle(hProcess); + // NDirectory::MySetCurrentDirectory(prefix); + StartApplicationDontWait(prefix, fullPath, (HWND)*this); } } + +class CThreadCopyFrom: public CProgressThreadVirt +{ + HRESULT ProcessVirt(); +public: + UString PathPrefix; + UString Name; + + CMyComPtr<IFolderOperations> FolderOperations; + CMyComPtr<IProgress> UpdateCallback; + CUpdateCallback100Imp *UpdateCallbackSpec; +}; + +HRESULT CThreadCopyFrom::ProcessVirt() +{ + UStringVector fileNames; + CRecordVector<const wchar_t *> fileNamePointers; + fileNames.Add(Name); + fileNamePointers.Add(fileNames[0]); + return FolderOperations->CopyFrom(PathPrefix, &fileNamePointers.Front(), fileNamePointers.Size(), UpdateCallback); +}; HRESULT CPanel::OnOpenItemChanged(const UString &folderPath, const UString &itemName, bool usePassword, const UString &password) @@ -448,19 +438,18 @@ HRESULT CPanel::OnOpenItemChanged(const UString &folderPath, const UString &item MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); return E_FAIL; } - UStringVector fileNames; - CRecordVector<const wchar_t *> fileNamePointers; - fileNames.Add(itemName); - fileNamePointers.Add(fileNames[0]); - - UString pathPrefix = folderPath; - NName::NormalizeDirPathPrefix(pathPrefix); - - CUpdateCallback100Imp *callbackSpec = new CUpdateCallback100Imp; - CMyComPtr<IProgress> callback = callbackSpec; - callbackSpec->Init((HWND)*this, usePassword, password); - return folderOperations->CopyFrom(pathPrefix, &fileNamePointers.Front(), fileNamePointers.Size(), callback); + CThreadCopyFrom t; + t.UpdateCallbackSpec = new CUpdateCallback100Imp; + t.UpdateCallback = t.UpdateCallbackSpec; + t.UpdateCallbackSpec->ProgressDialog = &t.ProgressDialog; + t.Name = itemName; + t.PathPrefix = folderPath; + NName::NormalizeDirPathPrefix(t.PathPrefix); + t.FolderOperations = folderOperations; + t.UpdateCallbackSpec->Init(usePassword, password); + RINOK(t.Create(itemName, (HWND)*this)); + return t.Result; } LRESULT CPanel::OnOpenItemChanged(LPARAM lParam) @@ -658,19 +647,20 @@ void CPanel::OpenItemInArchive(int index, bool tryInternal, bool tryExternal, bo if (!tryExternal) return; - HANDLE hProcess; + CProcess process; + HRESULT res; if (editMode) - hProcess = StartEditApplication(tempFilePath, (HWND)*this); + res = StartEditApplication(tempFilePath, (HWND)*this, process); else - hProcess = StartApplication(tempDirNorm, tempFilePath, (HWND)*this); + res = StartApplication(tempDirNorm, tempFilePath, (HWND)*this, process); - if (hProcess == 0) + if ((HANDLE)process == 0) return; tmpProcessInfo->Window = (HWND)(*this); tmpProcessInfo->FullPathFolderPrefix = _currentFolderPrefix; tmpProcessInfo->ItemName = name; - tmpProcessInfo->ProcessHandle = hProcess; + tmpProcessInfo->ProcessHandle = process.Detach(); NWindows::CThread thread; if (thread.Create(MyThreadFunction, tmpProcessInfo) != S_OK) diff --git a/CPP/7zip/UI/FileManager/PanelItems.cpp b/CPP/7zip/UI/FileManager/PanelItems.cpp index 7ea9585a..626d4309 100755 --- a/CPP/7zip/UI/FileManager/PanelItems.cpp +++ b/CPP/7zip/UI/FileManager/PanelItems.cpp @@ -716,13 +716,20 @@ void CPanel::SaveListViewInfo() } } -bool CPanel::OnRightClick(LPNMITEMACTIVATE itemActiveate, LRESULT &result) + +bool CPanel::OnRightClick(MY_NMLISTVIEW_NMITEMACTIVATE *itemActiveate, LRESULT &result) { if(itemActiveate->hdr.hwndFrom == HWND(_listView)) return false; - POINT point; ::GetCursorPos(&point); + ShowColumnsContextMenu(point.x, point.y); + result = TRUE; + return true; +} + +void CPanel::ShowColumnsContextMenu(int x, int y) +{ CMenu menu; CMenuDestroyer menuDestroyer(menu); @@ -740,8 +747,7 @@ bool CPanel::OnRightClick(LPNMITEMACTIVATE itemActiveate, LRESULT &result) flags |= MF_GRAYED; menu.AppendItem(flags, kCommandStart + i, prop.Name); } - int menuResult = menu.Track(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_NONOTIFY, - point.x, point.y, _listView); + int menuResult = menu.Track(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_NONOTIFY, x, y, _listView); if (menuResult >= kCommandStart && menuResult <= kCommandStart + _properties.Size()) { int index = menuResult - kCommandStart; @@ -775,8 +781,6 @@ bool CPanel::OnRightClick(LPNMITEMACTIVATE itemActiveate, LRESULT &result) _listView.DeleteColumn(visibleIndex); } } - result = TRUE; - return true; } void CPanel::OnReload() diff --git a/CPP/7zip/UI/FileManager/PanelListNotify.cpp b/CPP/7zip/UI/FileManager/PanelListNotify.cpp index aee4759e..43d7981b 100755 --- a/CPP/7zip/UI/FileManager/PanelListNotify.cpp +++ b/CPP/7zip/UI/FileManager/PanelListNotify.cpp @@ -180,7 +180,9 @@ LRESULT CPanel::SetItemText(LVITEMW &item) return 0; } +#ifndef UNDER_CE extern DWORD g_ComCtl32Version; +#endif void CPanel::OnItemChanged(NMLISTVIEW *item) { @@ -194,11 +196,23 @@ void CPanel::OnItemChanged(NMLISTVIEW *item) _selectedStatusVector[index] = newSelected; } +extern bool g_LVN_ITEMACTIVATE_Support; + +void CPanel::OnNotifyActivateItems() +{ + // bool leftCtrl = (::GetKeyState(VK_LCONTROL) & 0x8000) != 0; + // bool rightCtrl = (::GetKeyState(VK_RCONTROL) & 0x8000) != 0; + bool alt = (::GetKeyState(VK_MENU) & 0x8000) != 0; + bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0; + bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0; + if (!shift && alt && !ctrl) + Properties(); + else + OpenSelectedItems(!shift || alt || ctrl); +} + bool CPanel::OnNotifyList(LPNMHDR header, LRESULT &result) { - // bool alt = (::GetKeyState(VK_MENU) & 0x8000) != 0; - // bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0; - // bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0; switch(header->code) { case LVN_ITEMCHANGED: @@ -240,33 +254,23 @@ bool CPanel::OnNotifyList(LPNMHDR header, LRESULT &result) case LVN_COLUMNCLICK: OnColumnClick(LPNMLISTVIEW(header)); return false; - /* - case LVN_ITEMACTIVATE: - RefreshStatusBar(); - if (!alt && !ctrl && !shift) - OpenSelectedItems(true); - return false; - */ + case LVN_ITEMACTIVATE: + if (g_LVN_ITEMACTIVATE_Support) + { + OnNotifyActivateItems(); + return false; + } + break; case NM_DBLCLK: - RefreshStatusBar(); - OpenSelectedItems(true); - return false; case NM_RETURN: - { - bool alt = (::GetKeyState(VK_MENU) & 0x8000) != 0; - bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0; - // bool leftCtrl = (::GetKeyState(VK_LCONTROL) & 0x8000) != 0; - // bool RightCtrl = (::GetKeyState(VK_RCONTROL) & 0x8000) != 0; - bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0; - if (!shift && alt && !ctrl) + if (!g_LVN_ITEMACTIVATE_Support) { - Properties(); + OnNotifyActivateItems(); return false; } - OpenSelectedItems(true); - return false; - } + break; + case NM_RCLICK: RefreshStatusBar(); break; @@ -298,8 +302,10 @@ bool CPanel::OnNotifyList(LPNMHDR header, LRESULT &result) SetFocusToList(); RefreshStatusBar(); if (_mySelectMode) + #ifndef UNDER_CE if (g_ComCtl32Version >= MAKELONG(71, 4)) - OnLeftClick((LPNMITEMACTIVATE)header); + #endif + OnLeftClick((MY_NMLISTVIEW_NMITEMACTIVATE *)header); return false; } case LVN_BEGINLABELEDITW: diff --git a/CPP/7zip/UI/FileManager/PanelMenu.cpp b/CPP/7zip/UI/FileManager/PanelMenu.cpp index 2672f694..093f02f0 100755 --- a/CPP/7zip/UI/FileManager/PanelMenu.cpp +++ b/CPP/7zip/UI/FileManager/PanelMenu.cpp @@ -8,8 +8,9 @@ #include "Windows/PropVariant.h" #include "Windows/PropVariantConversions.h" -#include "../Common/PropIDUtils.h" #include "../../PropID.h" +#include "../Common/PropIDUtils.h" +#include "../Explorer/ContextMenu.h" #include "App.h" #include "LangUtils.h" @@ -22,9 +23,12 @@ using namespace NWindows; +LONG g_DllRefCount = 0; +/* // {23170F69-40C1-278A-1000-000100020000} DEFINE_GUID(CLSID_CZipContextMenu, 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00); +*/ static const UINT kSevenZipStartMenuID = kPluginMenuStartID ; static const UINT kSystemStartMenuID = kPluginMenuStartID + 100; @@ -50,7 +54,7 @@ void CPanel::InvokeSystemCommand(const char *command) contextMenu->InvokeCommand(&ci); } -static const wchar_t *kSeparator = L"--------------------------------------\n"; +static const wchar_t *kSeparator = L"----------------------------\n"; static const wchar_t *kPropValueSeparator = L": "; extern UString ConvertSizeToString(UInt64 value); @@ -442,7 +446,8 @@ void CPanel::CreateSevenZipMenu(HMENU menuSpec, bool sevenZipMenuCreated = false; CMyComPtr<IContextMenu> contextMenu; - if (contextMenu.CoCreateInstance(CLSID_CZipContextMenu, IID_IContextMenu) == S_OK) + contextMenu = new CZipContextMenu; + // if (contextMenu.CoCreateInstance(CLSID_CZipContextMenu, IID_IContextMenu) == S_OK) { CMyComPtr<IInitContextMenu> initContextMenu; if (contextMenu.QueryInterface(IID_IInitContextMenu, &initContextMenu) != S_OK) @@ -489,8 +494,10 @@ void CPanel::CreateFileMenu(HMENU menuSpec, if (g_App.ShowSystemMenu) CreateSystemMenu(menu, operatedIndices, systemContextMenu); + /* if (menu.GetItemCount() > 0) menu.AppendItem(MF_SEPARATOR, 0, (LPCTSTR)0); + */ int i; for (i = 0; i < operatedIndices.Size(); i++) @@ -516,18 +523,28 @@ bool CPanel::InvokePluginCommand(int id, else offset = id - kSevenZipStartMenuID; - CMINVOKECOMMANDINFOEX commandInfo; + #ifdef UNDER_CE + CMINVOKECOMMANDINFO + #else + CMINVOKECOMMANDINFOEX + #endif + commandInfo; commandInfo.cbSize = sizeof(commandInfo); - commandInfo.fMask = CMIC_MASK_UNICODE; + commandInfo.fMask = 0 + #ifndef UNDER_CE + | CMIC_MASK_UNICODE + #endif + ; commandInfo.hwnd = GetParent(); commandInfo.lpVerb = (LPCSTR)(MAKEINTRESOURCE(offset)); commandInfo.lpParameters = NULL; CSysString currentFolderSys = GetSystemString(_currentFolderPrefix); commandInfo.lpDirectory = (LPCSTR)(LPCTSTR)(currentFolderSys); commandInfo.nShow = SW_SHOW; + commandInfo.lpParameters = NULL; + #ifndef UNDER_CE commandInfo.lpTitle = ""; commandInfo.lpVerbW = (LPCWSTR)(MAKEINTRESOURCEW(offset)); - commandInfo.lpParameters = NULL; UString currentFolderUnicode = _currentFolderPrefix; commandInfo.lpDirectoryW = currentFolderUnicode; commandInfo.lpTitleW = L""; @@ -535,6 +552,7 @@ bool CPanel::InvokePluginCommand(int id, // commandInfo.ptInvoke.y = yPos; commandInfo.ptInvoke.x = 0; commandInfo.ptInvoke.y = 0; + #endif HRESULT result; if (isSystemMenu) result = systemContextMenu->InvokeCommand(LPCMINVOKECOMMANDINFO(&commandInfo)); @@ -550,6 +568,12 @@ bool CPanel::InvokePluginCommand(int id, bool CPanel::OnContextMenu(HANDLE windowHandle, int xPos, int yPos) { + if (::GetParent((HWND)windowHandle) == _listView) + { + ShowColumnsContextMenu(xPos, yPos); + return true; + } + if (windowHandle != _listView) return false; /* @@ -599,7 +623,11 @@ bool CPanel::OnContextMenu(HANDLE windowHandle, int xPos, int yPos) CMyComPtr<IContextMenu> systemContextMenu; CreateFileMenu(menu, sevenZipContextMenu, systemContextMenu, false); - int result = menu.Track(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_NONOTIFY, + int result = menu.Track(TPM_LEFTALIGN + #ifndef UNDER_CE + | TPM_RIGHTBUTTON + #endif + | TPM_RETURNCMD | TPM_NONOTIFY, xPos, yPos, _listView); if (result == 0) diff --git a/CPP/7zip/UI/FileManager/PanelOperations.cpp b/CPP/7zip/UI/FileManager/PanelOperations.cpp index 9a60fb1a..579208d2 100755 --- a/CPP/7zip/UI/FileManager/PanelOperations.cpp +++ b/CPP/7zip/UI/FileManager/PanelOperations.cpp @@ -35,8 +35,10 @@ enum EFolderOpType FOLDER_TYPE_RENAME = 2 }; -struct CThreadFolderOperations +class CThreadFolderOperations: public CProgressThreadVirt { + HRESULT ProcessVirt(); +public: EFolderOpType OpType; UString Name; UInt32 Index; @@ -45,45 +47,43 @@ struct CThreadFolderOperations CMyComPtr<IFolderOperations> FolderOperations; CMyComPtr<IProgress> UpdateCallback; CUpdateCallback100Imp *UpdateCallbackSpec; - HRESULT Result; - - CThreadFolderOperations(EFolderOpType opType); - void Process() - { - NCOM::CComInitializer comInitializer; - UpdateCallbackSpec->ProgressDialog.WaitCreating(); + HRESULT Result; - switch(OpType) - { - case FOLDER_TYPE_CREATE_FOLDER: - Result = FolderOperations->CreateFolder(Name, UpdateCallback); - break; - case FOLDER_TYPE_DELETE: - Result = FolderOperations->Delete(&Indices.Front(), Indices.Size(), UpdateCallback); - break; - case FOLDER_TYPE_RENAME: - Result = FolderOperations->Rename(Index, Name, UpdateCallback); - break; - default: - Result = E_FAIL; - } - UpdateCallbackSpec->ProgressDialog.MyClose(); - } + CThreadFolderOperations(EFolderOpType opType): OpType(opType), Result(E_FAIL) {}; + HRESULT DoOperation(CPanel &panel, const UString &progressTitle, const UString &titleError); +}; - static THREAD_FUNC_DECL MyThreadFunction(void *param) +HRESULT CThreadFolderOperations::ProcessVirt() +{ + NCOM::CComInitializer comInitializer; + switch(OpType) { - ((CThreadFolderOperations *)param)->Process(); - return 0; + case FOLDER_TYPE_CREATE_FOLDER: + Result = FolderOperations->CreateFolder(Name, UpdateCallback); + break; + case FOLDER_TYPE_DELETE: + Result = FolderOperations->Delete(&Indices.Front(), Indices.Size(), UpdateCallback); + break; + case FOLDER_TYPE_RENAME: + Result = FolderOperations->Rename(Index, Name, UpdateCallback); + break; + default: + Result = E_FAIL; } + return Result; }; -CThreadFolderOperations::CThreadFolderOperations(EFolderOpType opType): OpType(opType) {}; -static void DoOperation(CThreadFolderOperations &op, CPanel &panel, const UString &progressTitle) +HRESULT CThreadFolderOperations::DoOperation(CPanel &panel, const UString &progressTitle, const UString &titleError) { - op.UpdateCallbackSpec = new CUpdateCallback100Imp; - op.UpdateCallback = op.UpdateCallbackSpec; + UpdateCallbackSpec = new CUpdateCallback100Imp; + UpdateCallback = UpdateCallbackSpec; + UpdateCallbackSpec->ProgressDialog = &ProgressDialog; + + ProgressDialog.WaitMode = true; + ProgressDialog.Sync.SetErrorMessageTitle(titleError); + Result = S_OK; bool usePassword = false; UString password; @@ -94,21 +94,14 @@ static void DoOperation(CThreadFolderOperations &op, CPanel &panel, const UStrin password = fl.Password; } - op.UpdateCallbackSpec->Init(panel.GetParent(), usePassword, password); - - op.UpdateCallbackSpec->ProgressDialog.MainWindow = panel._mainWindow; - op.UpdateCallbackSpec->ProgressDialog.MainTitle = LangString(IDS_APP_TITLE, 0x03000000); - op.UpdateCallbackSpec->ProgressDialog.MainAddTitle = progressTitle + UString(L" "); + UpdateCallbackSpec->Init(usePassword, password); - // op.FolderOperations = folderOperations; - // op.Index = realIndex; - // op.Name = newName; - // HRESULT result = folderOperations->Rename(realIndex, newName, 0); + ProgressDialog.MainWindow = panel._mainWindow; // panel.GetParent() + ProgressDialog.MainTitle = LangString(IDS_APP_TITLE, 0x03000000); + ProgressDialog.MainAddTitle = progressTitle + UString(L" "); - NWindows::CThread thread; - if (thread.Create(CThreadFolderOperations::MyThreadFunction, &op) != S_OK) - throw 271824; - op.UpdateCallbackSpec->StartProgressDialog(progressTitle); + RINOK(Create(progressTitle, ProgressDialog.MainWindow)); + return Result; } #ifndef _UNICODE @@ -124,6 +117,9 @@ void CPanel::DeleteItems(bool toRecycleBin) return; CSelectedState state; SaveSelectedState(state); + + #ifndef UNDER_CE + // WM6 / SHFileOperationW doesn't ask user! So we use internal delete bool useInternalDelete = false; if (IsFSFolder() && toRecycleBin) { @@ -218,16 +214,25 @@ void CPanel::DeleteItems(bool toRecycleBin) else useInternalDelete = true; if (useInternalDelete) + #endif DeleteItemsInternal(indices); RefreshListCtrl(state); } +void CPanel::MessageBoxErrorForUpdate(HRESULT errorCode, UINT resourceID, UInt32 langID) +{ + if (errorCode == E_NOINTERFACE) + MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); + else + MessageBoxError(errorCode, LangString(resourceID, langID)); +} + void CPanel::DeleteItemsInternal(CRecordVector<UInt32> &indices) { CMyComPtr<IFolderOperations> folderOperations; if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK) { - MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); + MessageBoxErrorForUpdate(E_NOINTERFACE, IDS_ERROR_DELETING, 0x03020217); return; } @@ -261,9 +266,9 @@ void CPanel::DeleteItemsInternal(CRecordVector<UInt32> &indices) CThreadFolderOperations op(FOLDER_TYPE_DELETE); op.FolderOperations = folderOperations; op.Indices = indices; - DoOperation(op, *this, LangString(IDS_DELETING, 0x03020216)); - if (op.Result != S_OK) - MessageBoxError(op.Result, LangString(IDS_ERROR_DELETING, 0x03020217)); + op.DoOperation(*this, + LangString(IDS_DELETING, 0x03020216), + LangString(IDS_ERROR_DELETING, 0x03020217)); } RefreshTitleAlways(); } @@ -286,7 +291,7 @@ BOOL CPanel::OnEndLabelEdit(LV_DISPINFOW * lpnmh) CMyComPtr<IFolderOperations> folderOperations; if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK) { - MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); + MessageBoxErrorForUpdate(E_NOINTERFACE, IDS_ERROR_RENAMING, 0x03020221); return FALSE; } const UString newName = lpnmh->item.pszText; @@ -305,12 +310,11 @@ BOOL CPanel::OnEndLabelEdit(LV_DISPINFOW * lpnmh) op.FolderOperations = folderOperations; op.Index = realIndex; op.Name = newName; - DoOperation(op, *this, LangString(IDS_RENAMING, 0x03020220)); - if (op.Result != S_OK) - { - MessageBoxError(op.Result, LangString(IDS_ERROR_RENAMING, 0x03020221)); + HRESULT res = op.DoOperation(*this, + LangString(IDS_RENAMING, 0x03020220), + LangString(IDS_ERROR_RENAMING, 0x03020221)); + if (res != S_OK) return FALSE; - } } // Can't use RefreshListCtrl here. @@ -335,7 +339,7 @@ void CPanel::CreateFolder() CMyComPtr<IFolderOperations> folderOperations; if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK) { - MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); + MessageBoxErrorForUpdate(E_NOINTERFACE, IDS_CREATE_FOLDER_ERROR, 0x03020233); return; } CPanel::CDisableTimerProcessing disableTimerProcessing2(*this); @@ -354,13 +358,11 @@ void CPanel::CreateFolder() CThreadFolderOperations op(FOLDER_TYPE_CREATE_FOLDER); op.FolderOperations = folderOperations; op.Name = newName; - DoOperation(op, *this, LangString(IDS_CREATE_FOLDER, 0x03020230)); - - if (op.Result != S_OK) - { - MessageBoxError(op.Result, LangString(IDS_CREATE_FOLDER_ERROR, 0x03020233)); + HRESULT res = op.DoOperation(*this, + LangString(IDS_CREATE_FOLDER, 0x03020230), + LangString(IDS_CREATE_FOLDER_ERROR, 0x03020233)); + if (res != S_OK) return; - } } int pos = newName.Find(WCHAR_PATH_SEPARATOR); if (pos >= 0) @@ -378,7 +380,7 @@ void CPanel::CreateFile() CMyComPtr<IFolderOperations> folderOperations; if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK) { - MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); + MessageBoxErrorForUpdate(E_NOINTERFACE, IDS_CREATE_FILE_ERROR, 0x03020243); return; } CPanel::CDisableTimerProcessing disableTimerProcessing2(*this); @@ -394,7 +396,7 @@ void CPanel::CreateFile() HRESULT result = folderOperations->CreateFile(newName, 0); if (result != S_OK) { - MessageBoxError(result, LangString(IDS_CREATE_FILE_ERROR, 0x03020243)); + MessageBoxErrorForUpdate(result, IDS_CREATE_FILE_ERROR, 0x03020243); return; } int pos = newName.Find(WCHAR_PATH_SEPARATOR); @@ -454,8 +456,10 @@ void CPanel::ChangeComment() HRESULT result = folderOperations->SetProperty(realIndex, kpidComment, &propVariant, NULL); if (result != S_OK) { - MessageBoxError(result, L"Set Comment Error"); + if (result == E_NOINTERFACE) + MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208); + else + MessageBoxError(result, L"Set Comment Error"); } RefreshListCtrl(state); } - diff --git a/CPP/7zip/UI/FileManager/PanelSelect.cpp b/CPP/7zip/UI/FileManager/PanelSelect.cpp index bbd4a187..64cef433 100755 --- a/CPP/7zip/UI/FileManager/PanelSelect.cpp +++ b/CPP/7zip/UI/FileManager/PanelSelect.cpp @@ -97,8 +97,7 @@ void CPanel::OnInsert() int nextIndex = focusedItem + 1; if (nextIndex < _listView.GetItemCount()) { - _listView.SetItemState(nextIndex, LVIS_FOCUSED | LVIS_SELECTED, - LVIS_FOCUSED | LVIS_SELECTED); + _listView.SetItemState_FocusedSelected(nextIndex); _listView.EnsureVisible(nextIndex, false); } } @@ -250,14 +249,15 @@ void CPanel::KillSelection() } } -void CPanel::OnLeftClick(LPNMITEMACTIVATE itemActivate) +void CPanel::OnLeftClick(MY_NMLISTVIEW_NMITEMACTIVATE *itemActivate) { - if(itemActivate->hdr.hwndFrom != HWND(_listView)) + if (itemActivate->hdr.hwndFrom != HWND(_listView)) return; // It will be work only for Version 4.71 (IE 4); int indexInList = itemActivate->iItem; if (indexInList < 0) return; + #ifndef UNDER_CE if ((itemActivate->uKeyFlags & LVKF_SHIFT) != 0) { // int focusedIndex = _listView.GetFocusedItem(); @@ -280,8 +280,10 @@ void CPanel::OnLeftClick(LPNMITEMACTIVATE itemActivate) } } else + #endif { _startGroupSelect = indexInList; + #ifndef UNDER_CE if ((itemActivate->uKeyFlags & LVKF_CONTROL) != 0) { int realIndex = GetRealItemIndex(indexInList); @@ -291,6 +293,7 @@ void CPanel::OnLeftClick(LPNMITEMACTIVATE itemActivate) _listView.RedrawItem(indexInList); } } + #endif } return; } diff --git a/CPP/7zip/UI/FileManager/PanelSplitFile.cpp b/CPP/7zip/UI/FileManager/PanelSplitFile.cpp index d1531957..150c71b1 100755 --- a/CPP/7zip/UI/FileManager/PanelSplitFile.cpp +++ b/CPP/7zip/UI/FileManager/PanelSplitFile.cpp @@ -2,13 +2,11 @@ #include "StdAfx.h" -#include "../../../../C/Alloc.h" - #include "Common/IntToString.h" +#include "Windows/Error.h" #include "Windows/FileIO.h" #include "Windows/FileFind.h" -#include "Windows/Thread.h" #include "../GUI/ExtractRes.h" @@ -18,27 +16,12 @@ #include "CopyDialog.h" #include "FormatUtils.h" #include "LangUtils.h" -#include "ProgressDialog2.h" #include "SplitDialog.h" #include "SplitUtils.h" using namespace NWindows; -class CMyBuffer -{ - void *_data; -public: - CMyBuffer(): _data(0) {} - operator void *() { return _data; } - bool Allocate(size_t size) - { - if (_data != 0) - return false; - _data = ::MidAlloc(size); - return _data != 0; - } - ~CMyBuffer() { ::MidFree(_data); } -}; +static const wchar_t *g_Message_FileWriteError = L"File write error"; struct CVolSeqName { @@ -92,95 +75,85 @@ struct CVolSeqName static const UInt32 kBufSize = (1 << 20); -struct CThreadSplit +class CThreadSplit: public CProgressThreadVirt { - // HRESULT Result; - // CPanel *Panel; - CProgressDialog *ProgressDialog; + HRESULT ProcessVirt(); +public: UString FilePath; UString VolBasePath; CRecordVector<UInt64> VolumeSizes; - UString Error; +}; + +HRESULT CThreadSplit::ProcessVirt() +{ + NFile::NIO::CInFile inFile; + if (!inFile.Open(FilePath)) + return GetLastError(); + NFile::NIO::COutFile outFile; + CMyBuffer bufferObject; + if (!bufferObject.Allocate(kBufSize)) + return E_OUTOFMEMORY; + Byte *buffer = (Byte *)(void *)bufferObject; + UInt64 curVolSize = 0; + CVolSeqName seqName; + UInt64 length; + if (!inFile.GetLength(length)) + return GetLastError(); + + CProgressSync &sync = ProgressDialog.Sync; + sync.SetProgress(length, 0); + UInt64 pos = 0; + + UInt64 numFiles = 0; + int volIndex = 0; - void Process2() + for (;;) { - // NCOM::CComInitializer comInitializer; - ProgressDialog->WaitCreating(); - NFile::NIO::CInFile inFile; - if (!inFile.Open(FilePath)) - throw L"Can not open file"; - NFile::NIO::COutFile outFile; - CMyBuffer bufferObject; - if (!bufferObject.Allocate(kBufSize)) - throw L"Can not allocate buffer"; - Byte *buffer = (Byte *)(void *)bufferObject; - UInt64 curVolSize = 0; - CVolSeqName seqName; - UInt64 length; - if (!inFile.GetLength(length)) - throw "error"; - - ProgressDialog->ProgressSynch.SetProgress(length, 0); - UInt64 pos = 0; - - int volIndex = 0; - - for (;;) + UInt64 volSize; + if (volIndex < VolumeSizes.Size()) + volSize = VolumeSizes[volIndex]; + else + volSize = VolumeSizes.Back(); + + UInt32 needSize = (UInt32)(MyMin((UInt64)kBufSize, volSize - curVolSize)); + UInt32 processedSize; + if (!inFile.Read(buffer, needSize, processedSize)) + return GetLastError(); + if (processedSize == 0) + break; + needSize = processedSize; + if (curVolSize == 0) { - UInt64 volSize; - if (volIndex < VolumeSizes.Size()) - volSize = VolumeSizes[volIndex]; - else - volSize = VolumeSizes.Back(); - - UInt32 needSize = (UInt32)(MyMin((UInt64)kBufSize, volSize - curVolSize)); - UInt32 processedSize; - if (!inFile.Read(buffer, needSize, processedSize)) - throw L"Can not read input file"; - if (processedSize == 0) - break; - needSize = processedSize; - if (curVolSize == 0) - { - UString name = VolBasePath; - name += L"."; - name += seqName.GetNextName(); - if (!outFile.Create(name, false)) - throw L"Can not create output file"; - ProgressDialog->ProgressSynch.SetCurrentFileName(name); - } - if (!outFile.Write(buffer, needSize, processedSize)) - throw L"Can not write output file"; - if (needSize != processedSize) - throw L"Can not write output file"; - curVolSize += processedSize; - if (curVolSize == volSize) + UString name = VolBasePath; + name += L'.'; + name += seqName.GetNextName(); + sync.SetCurrentFileName(name); + sync.SetNumFilesCur(numFiles++); + if (!outFile.Create(name, false)) { - outFile.Close(); - if (volIndex < VolumeSizes.Size()) - volIndex++; - curVolSize = 0; + HRESULT res = GetLastError(); + ErrorPath1 = name; + return res; } - pos += processedSize; - HRESULT res = ProgressDialog->ProgressSynch.SetPosAndCheckPaused(pos); - if (res != S_OK) - return; } + if (!outFile.Write(buffer, needSize, processedSize)) + return GetLastError(); + if (needSize != processedSize) + throw g_Message_FileWriteError; + curVolSize += processedSize; + if (curVolSize == volSize) + { + outFile.Close(); + if (volIndex < VolumeSizes.Size()) + volIndex++; + curVolSize = 0; + } + pos += processedSize; + RINOK(sync.SetPosAndCheckPaused(pos)); } - void Process() - { - try { Process2(); } - catch(const wchar_t *s) { Error = s; } - catch(...) { Error = L"Error"; } - ProgressDialog->MyClose(); - } - - static THREAD_FUNC_DECL MyThreadFunction(void *param) - { - ((CThreadSplit *)param)->Process(); - return 0; - } -}; + sync.SetNumFilesCur(numFiles); + return S_OK; +} void CApp::Split() { @@ -239,7 +212,7 @@ void CApp::Split() ConvertUInt64ToString(numVolumes, s); if (::MessageBoxW(srcPanel, MyFormatNew(IDS_SPLIT_CONFIRM_MESSAGE, 0x03020521, s), LangString(IDS_SPLIT_CONFIRM_TITLE, 0x03020520), - MB_YESNOCANCEL | MB_ICONQUESTION | MB_TASKMODAL) != IDYES) + MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES) return; } @@ -251,20 +224,20 @@ void CApp::Split() return; } + { CThreadSplit spliter; - // spliter.Panel = this; - { - CProgressDialog progressDialog; - spliter.ProgressDialog = &progressDialog; + CProgressDialog &progressDialog = spliter.ProgressDialog; UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000); UString title = LangString(IDS_SPLITTING, 0x03020510); + progressDialog.ShowCompressionInfo = false; + progressDialog.MainWindow = _window; progressDialog.MainTitle = progressWindowTitle; progressDialog.MainAddTitle = title + UString(L" "); - progressDialog.ProgressSynch.SetTitleFileName(itemName); + progressDialog.Sync.SetTitleFileName(itemName); spliter.FilePath = srcPath + itemName; @@ -276,16 +249,12 @@ void CApp::Split() // CPanel::CDisableTimerProcessing disableTimerProcessing1(srcPanel); // CPanel::CDisableTimerProcessing disableTimerProcessing2(destPanel); - NWindows::CThread thread; - if (thread.Create(CThreadSplit::MyThreadFunction, &spliter) != S_OK) - throw 271824; - progressDialog.Create(title, _window); + if (spliter.Create(title, _window) != 0) + return; } RefreshTitleAlways(); - if (!spliter.Error.IsEmpty()) - srcPanel.MessageBoxMyError(spliter.Error); // disableTimerProcessing1.Restore(); // disableTimerProcessing2.Restore(); // srcPanel.SetFocusToList(); @@ -293,78 +262,71 @@ void CApp::Split() } -struct CThreadCombine +class CThreadCombine: public CProgressThreadVirt { - CProgressDialog *ProgressDialog; - + HRESULT ProcessVirt(); +public: UString InputDirPrefix; UStringVector Names; UString OutputPath; UInt64 TotalSize; +}; - UString Error; - HRESULT Res; +HRESULT CThreadCombine::ProcessVirt() +{ + NFile::NIO::COutFile outFile; + if (!outFile.Create(OutputPath, false)) + { + HRESULT res = GetLastError(); + ErrorPath1 = OutputPath; + return res; + } + + CProgressSync &sync = ProgressDialog.Sync; + sync.SetProgress(TotalSize, 0); - void Process2() + CMyBuffer bufferObject; + if (!bufferObject.Allocate(kBufSize)) + return E_OUTOFMEMORY; + Byte *buffer = (Byte *)(void *)bufferObject; + UInt64 pos = 0; + for (int i = 0; i < Names.Size(); i++) { - NFile::NIO::COutFile outFile; - if (!outFile.Create(OutputPath, false)) + NFile::NIO::CInFile inFile; + const UString nextName = InputDirPrefix + Names[i]; + if (!inFile.Open(nextName)) { - Error = L"Can create open output file:\n" + OutputPath; - return; + HRESULT res = GetLastError(); + ErrorPath1 = nextName; + return res; } - - ProgressDialog->ProgressSynch.SetProgress(TotalSize, 0); - - CMyBuffer bufferObject; - if (!bufferObject.Allocate(kBufSize)) - throw L"Can not allocate buffer"; - Byte *buffer = (Byte *)(void *)bufferObject; - UInt64 pos = 0; - for (int i = 0; i < Names.Size(); i++) + sync.SetCurrentFileName(nextName); + for (;;) { - NFile::NIO::CInFile inFile; - const UString nextName = InputDirPrefix + Names[i]; - if (!inFile.Open(nextName)) + UInt32 processedSize; + if (!inFile.Read(buffer, kBufSize, processedSize)) { - Error = L"Can not open input file:\n" + nextName; - return; + HRESULT res = GetLastError(); + ErrorPath1 = nextName; + return res; } - ProgressDialog->ProgressSynch.SetCurrentFileName(nextName); - for (;;) + if (processedSize == 0) + break; + UInt32 needSize = processedSize; + if (!outFile.Write(buffer, needSize, processedSize)) { - UInt32 processedSize; - if (!inFile.Read(buffer, kBufSize, processedSize)) - throw L"Can not read input file"; - if (processedSize == 0) - break; - UInt32 needSize = processedSize; - if (!outFile.Write(buffer, needSize, processedSize) || needSize != processedSize) - throw L"Can not write output file"; - pos += processedSize; - Res = ProgressDialog->ProgressSynch.SetPosAndCheckPaused(pos); - if (Res != S_OK) - return; + HRESULT res = GetLastError(); + ErrorPath1 = OutputPath; + return res; } + if (needSize != processedSize) + throw g_Message_FileWriteError; + pos += processedSize; + RINOK(sync.SetPosAndCheckPaused(pos)); } } - - void Process() - { - Res = S_OK; - ProgressDialog->WaitCreating(); - try { Process2(); } - catch(const wchar_t *s) { Error = s; } - catch(...) { Error = L"Error";} - ProgressDialog->MyClose(); - } - - static THREAD_FUNC_DECL MyThreadFunction(void *param) - { - ((CThreadCombine *)param)->Process(); - return 0; - } -}; + return S_OK; +} extern void AddValuePair2(UINT resourceID, UInt32 langID, UInt64 num, UInt64 size, UString &s); @@ -410,6 +372,7 @@ void CApp::Combine() return; } + { CThreadCombine combiner; UString nextName = itemName; @@ -491,10 +454,9 @@ void CApp::Combine() return; } - { - CProgressDialog progressDialog; - combiner.ProgressDialog = &progressDialog; - + CProgressDialog &progressDialog = combiner.ProgressDialog; + progressDialog.ShowCompressionInfo = false; + UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000); UString title = LangString(IDS_COMBINING, 0x03020610); @@ -507,15 +469,11 @@ void CApp::Combine() // CPanel::CDisableTimerProcessing disableTimerProcessing1(srcPanel); // CPanel::CDisableTimerProcessing disableTimerProcessing2(destPanel); - NWindows::CThread thread; - if (thread.Create(CThreadCombine::MyThreadFunction, &combiner) != S_OK) - throw 271824; - progressDialog.Create(title, _window); + if (combiner.Create(title, _window) != 0) + return; } RefreshTitleAlways(); - if (!combiner.Error.IsEmpty()) - srcPanel.MessageBoxMyError(combiner.Error); // disableTimerProcessing1.Restore(); // disableTimerProcessing2.Restore(); // srcPanel.SetFocusToList(); diff --git a/CPP/7zip/UI/FileManager/PasswordDialog.cpp b/CPP/7zip/UI/FileManager/PasswordDialog.cpp index 94e8219d..eaf90a24 100755 --- a/CPP/7zip/UI/FileManager/PasswordDialog.cpp +++ b/CPP/7zip/UI/FileManager/PasswordDialog.cpp @@ -1,6 +1,7 @@ // PasswordDialog.cpp #include "StdAfx.h" + #include "PasswordDialog.h" #ifdef LANG @@ -12,7 +13,8 @@ static CIDLangPair kIDLangPairs[] = { { IDC_STATIC_PASSWORD_HEADER, 0x02000B01 }, { IDC_CHECK_PASSWORD_SHOW, 0x02000B02 }, - + { IDOK, 0x02000702 }, + { IDCANCEL, 0x02000710 } }; #endif @@ -33,8 +35,7 @@ bool CPasswordDialog::OnButtonClicked(int buttonID, HWND buttonHWND) { if (buttonID == IDC_CHECK_PASSWORD_SHOW) { - _passwordControl.SetPasswordChar((IsButtonChecked( - IDC_CHECK_PASSWORD_SHOW) == BST_CHECKED) ? 0: TEXT('*')); + _passwordControl.SetPasswordChar(IsButtonCheckedBool(IDC_CHECK_PASSWORD_SHOW) ? 0: TEXT('*')); UString password; _passwordControl.GetText(password); _passwordControl.SetText(password); diff --git a/CPP/7zip/UI/FileManager/PasswordDialog.rc b/CPP/7zip/UI/FileManager/PasswordDialog.rc index 64381aff..2328ac56 100755 --- a/CPP/7zip/UI/FileManager/PasswordDialog.rc +++ b/CPP/7zip/UI/FileManager/PasswordDialog.rc @@ -1,26 +1,14 @@ #include "PasswordDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 172 -#define ySize2 68 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#define xc 140 +#define yc 72 -#define bYPos (ySize - marg - bYSize) -#define b1XPos (xSize - marg - bXSize) -#define b2XPos (b1XPos - 10 - bXSize) - - -IDD_DIALOG_PASSWORD DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +IDD_DIALOG_PASSWORD MY_DIALOG CAPTION "Enter password" -MY_FONT BEGIN - LTEXT "&Enter password:", IDC_STATIC_PASSWORD_HEADER, marg, marg, xSize2, 8 - EDITTEXT IDC_EDIT_PASSWORD, marg , 19, xSize2, 14, ES_PASSWORD | ES_AUTOHSCROLL - - CONTROL "&Show password", IDC_CHECK_PASSWORD_SHOW, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, 41, xSize2, 10 - - DEFPUSHBUTTON "OK", IDOK, b2XPos, bYPos, bXSize, bYSize - PUSHBUTTON "Cancel", IDCANCEL, b1XPos, bYPos, bXSize, bYSize + LTEXT "&Enter password:", IDC_STATIC_PASSWORD_HEADER, m, m, xc, 8 + EDITTEXT IDC_EDIT_PASSWORD, m, 20, xc, 14, ES_PASSWORD | ES_AUTOHSCROLL + CONTROL "&Show password", IDC_CHECK_PASSWORD_SHOW, MY_CHECKBOX, m, 42, xc, 10 + OK_CANCEL END diff --git a/CPP/7zip/UI/FileManager/PluginLoader.h b/CPP/7zip/UI/FileManager/PluginLoader.h index f48c9e97..3cf15aa5 100755 --- a/CPP/7zip/UI/FileManager/PluginLoader.h +++ b/CPP/7zip/UI/FileManager/PluginLoader.h @@ -1,22 +1,18 @@ // PluginLoader.h -#ifndef __PLUGINLOADER_H -#define __PLUGINLOADER_H +#ifndef __PLUGIN_LOADER_H +#define __PLUGIN_LOADER_H #include "Windows/DLL.h" -typedef UINT32 (WINAPI * CreateObjectPointer)( - const GUID *clsID, - const GUID *interfaceID, - void **outObject); +typedef UINT32 (WINAPI * CreateObjectPointer)(const GUID *clsID, const GUID *interfaceID, void **outObject); class CPluginLibrary: public NWindows::NDLL::CLibrary { public: HRESULT CreateManager(REFGUID clsID, IFolderManager **manager) { - CreateObjectPointer createObject = (CreateObjectPointer) - GetProcAddress("CreateObject"); + CreateObjectPointer createObject = (CreateObjectPointer)GetProc("CreateObject"); if (createObject == NULL) return GetLastError(); return createObject(&clsID, &IID_IFolderManager, (void **)manager); diff --git a/CPP/7zip/UI/FileManager/PluginsPage.cpp b/CPP/7zip/UI/FileManager/PluginsPage.cpp index d79e78d8..0eeec9d6 100755 --- a/CPP/7zip/UI/FileManager/PluginsPage.cpp +++ b/CPP/7zip/UI/FileManager/PluginsPage.cpp @@ -1,22 +1,16 @@ // PluginsPage.cpp #include "StdAfx.h" -#include "PluginsPageRes.h" -#include "PluginsPage.h" -#include "Common/StringConvert.h" #include "Common/MyCom.h" -#include "Windows/Defs.h" #include "Windows/DLL.h" -#include "Windows/Control/ListView.h" -#include "Windows/FileFind.h" -#include "RegistryUtils.h" #include "HelpUtils.h" #include "LangUtils.h" +#include "PluginsPage.h" +#include "PluginsPageRes.h" #include "ProgramLocation.h" - #include "PluginInterface.h" static CIDLangPair kIDLangPairs[] = @@ -33,16 +27,16 @@ bool CPluginsPage::OnInit() _listView.Attach(GetItem(IDC_PLUGINS_LIST)); - UINT32 newFlags = /*LVS_EX_CHECKBOXES | */ LVS_EX_FULLROWSELECT; + UINT32 newFlags = /* LVS_EX_CHECKBOXES | */ LVS_EX_FULLROWSELECT; _listView.SetExtendedListViewStyle(newFlags, newFlags); - _listView.InsertColumn(0, L"Plugins", 160); + _listView.InsertColumn(0, L"Plugins", 50); ReadFileFolderPluginInfoList(_plugins); _listView.SetRedraw(false); // _listView.DeleteAllItems(); - for(int i = 0; i < _plugins.Size(); i++) + for (int i = 0; i < _plugins.Size(); i++) { const CPluginInfo &p = _plugins[i]; if (!p.OptionsClassIDDefined) @@ -59,11 +53,12 @@ bool CPluginsPage::OnInit() _listView.SetCheckState(i, true); } _listView.SetRedraw(true); - if(_listView.GetItemCount() > 0) + if (_listView.GetItemCount() > 0) { UINT state = LVIS_SELECTED | LVIS_FOCUSED; _listView.SetItemState(0, state, state); } + _listView.SetColumnWidthAuto(0); return CPropertyPage::OnInit(); } @@ -156,17 +151,15 @@ void CPluginsPage::OnButtonOptions() MessageBoxW(HWND(*this), L"There are no options", L"7-Zip", 0); return; } - NWindows::NDLL::CLibrary library; + NWindows::NDLL::CLibrary lib; CMyComPtr<IPluginOptions> pluginOptions; - if (!library.Load(pluginInfo.FilePath)) + if (!lib.Load(pluginInfo.FilePath)) { MessageBoxW(HWND(*this), L"Can't load plugin", L"7-Zip", 0); return; } - typedef UINT32 (WINAPI * CreateObjectPointer)( - const GUID *clsID, const GUID *interfaceID, void **outObject); - CreateObjectPointer createObject = (CreateObjectPointer) - library.GetProcAddress("CreateObject"); + typedef UINT32 (WINAPI * CreateObjectPointer)(const GUID *clsID, const GUID *interfaceID, void **outObject); + CreateObjectPointer createObject = (CreateObjectPointer)lib.GetProc("CreateObject"); if (createObject == NULL) { MessageBoxW(HWND(*this), L"Incorrect plugin", L"7-Zip", 0); @@ -211,4 +204,4 @@ bool CPluginsPage::OnCommand(int code, int itemID, LPARAM lParam) return CPropertyPage::OnCommand(code, itemID, lParam); } -*/
\ No newline at end of file +*/ diff --git a/CPP/7zip/UI/FileManager/PluginsPage.rc b/CPP/7zip/UI/FileManager/PluginsPage.rc index b4868aa3..18e5dfc8 100755 --- a/CPP/7zip/UI/FileManager/PluginsPage.rc +++ b/CPP/7zip/UI/FileManager/PluginsPage.rc @@ -1,19 +1,15 @@ #include "PluginsPageRes.h" #include "../../GuiCommon.rc" -#define xSize2 196 -#define ySize2 140 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#define xc 96 +#define yc 80 - -IDD_PLUGINS DIALOG 0, 0, xSize, ySize MY_PAGE_STYLE +IDD_PLUGINS MY_PAGE CAPTION "Plugins" -MY_FONT BEGIN - LTEXT "&Plugins:", IDC_PLUGINS_STATIC_PLUGINS, marg, marg, xSize2, 8 - CONTROL "List1", IDC_PLUGINS_LIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | - LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, - marg, 20, xSize2 - bXSize - 12, ySize2 - 12 - PUSHBUTTON "Options...", IDC_PLUGINS_BUTTON_OPTIONS, (xSize - marg - bXSize), 20, bXSize, bYSize + LTEXT "&Plugins:", IDC_PLUGINS_STATIC_PLUGINS, m, m, xc, 8 + CONTROL "List1", IDC_PLUGINS_LIST, "SysListView32", + LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, + m, 20, xc, 40 + PUSHBUTTON "Options...", IDC_PLUGINS_BUTTON_OPTIONS, m, by, bxs, bys END diff --git a/CPP/7zip/UI/FileManager/PluginsPageRes.h b/CPP/7zip/UI/FileManager/PluginsPageRes.h index 8fc923ee..ca07ca5c 100755 --- a/CPP/7zip/UI/FileManager/PluginsPageRes.h +++ b/CPP/7zip/UI/FileManager/PluginsPageRes.h @@ -1,4 +1,4 @@ -#define IDD_PLUGINS 901 +#define IDD_PLUGINS 541 #define IDC_PLUGINS_STATIC_PLUGINS 1000 #define IDC_PLUGINS_LIST 1001 #define IDC_PLUGINS_BUTTON_OPTIONS 1002 diff --git a/CPP/7zip/UI/FileManager/ProgramLocation.cpp b/CPP/7zip/UI/FileManager/ProgramLocation.cpp index fc7b40db..04c2c98c 100755 --- a/CPP/7zip/UI/FileManager/ProgramLocation.cpp +++ b/CPP/7zip/UI/FileManager/ProgramLocation.cpp @@ -1,10 +1,9 @@ -// ProgramLocation.h +// ProgramLocation.cpp #include "StdAfx.h" #include "ProgramLocation.h" -#include "Windows/FileName.h" #include "Windows/DLL.h" using namespace NWindows; diff --git a/CPP/7zip/UI/FileManager/ProgramLocation.h b/CPP/7zip/UI/FileManager/ProgramLocation.h index 38317b45..55c56144 100755 --- a/CPP/7zip/UI/FileManager/ProgramLocation.h +++ b/CPP/7zip/UI/FileManager/ProgramLocation.h @@ -1,7 +1,7 @@ // ProgramLocation.h -#ifndef __PROGRAMLOCATION_H -#define __PROGRAMLOCATION_H +#ifndef __PROGRAM_LOCATION_H +#define __PROGRAM_LOCATION_H #include "Common/MyString.h" diff --git a/CPP/7zip/UI/FileManager/ProgressDialog.cpp b/CPP/7zip/UI/FileManager/ProgressDialog.cpp index 5be77a8f..cdb8399e 100755 --- a/CPP/7zip/UI/FileManager/ProgressDialog.cpp +++ b/CPP/7zip/UI/FileManager/ProgressDialog.cpp @@ -1,15 +1,19 @@ // ProgressDialog.cpp #include "StdAfx.h" + +#include "Common/IntToString.h" + #include "resource.h" + #include "ProgressDialog.h" -#include "Common/IntToString.h" -#include "Common/IntToString.h" using namespace NWindows; +extern HINSTANCE g_hInstance; + static const UINT_PTR kTimerID = 3; -static const UINT kTimerElapse = 50; +static const UINT kTimerElapse = 100; #ifdef LANG #include "LangUtils.h" @@ -22,7 +26,7 @@ static CIDLangPair kIDLangPairs[] = }; #endif -HRESULT CProgressSynch::ProcessStopAndPause() +HRESULT CProgressSync::ProcessStopAndPause() { for (;;) { @@ -48,30 +52,37 @@ void CProgressDialog::AddToTitle(LPCWSTR s) #endif - bool CProgressDialog::OnInit() { - _range = UINT64(-1); + _range = (UInt64)-1; _prevPercentValue = -1; + _wasCreated = true; + _dialogCreatedEvent.Set(); + #ifdef LANG // LangSetWindowText(HWND(*this), 0x02000C00); LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); #endif m_ProgressBar.Attach(GetItem(IDC_PROGRESS1)); + + if (IconID >= 0) + { + HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IconID)); + SetIcon(ICON_BIG, icon); + } + _timer = SetTimer(kTimerID, kTimerElapse); - _dialogCreatedEvent.Set(); SetText(_title); + CheckNeedClose(); return CModalDialog::OnInit(); } -void CProgressDialog::OnCancel() -{ - ProgressSynch.SetStopped(true); -} +void CProgressDialog::OnCancel() { Sync.SetStopped(true); } +void CProgressDialog::OnOK() { } -void CProgressDialog::SetRange(UINT64 range) +void CProgressDialog::SetRange(UInt64 range) { _range = range; _peviousPos = (UInt64)(Int64)-1; @@ -79,16 +90,16 @@ void CProgressDialog::SetRange(UINT64 range) m_ProgressBar.SetRange32(0 , _converter.Count(range)); // Test it for 100% } -void CProgressDialog::SetPos(UINT64 pos) +void CProgressDialog::SetPos(UInt64 pos) { bool redraw = true; if (pos < _range && pos > _peviousPos) { - UINT64 posDelta = pos - _peviousPos; + UInt64 posDelta = pos - _peviousPos; if (posDelta < (_range >> 10)) redraw = false; } - if(redraw) + if (redraw) { m_ProgressBar.SetPos(_converter.Count(pos)); // Test it for 100% _peviousPos = pos; @@ -97,10 +108,13 @@ void CProgressDialog::SetPos(UINT64 pos) bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { - if (ProgressSynch.GetPaused()) + if (Sync.GetPaused()) return true; - UINT64 total, completed; - ProgressSynch.GetProgress(total, completed); + + CheckNeedClose(); + + UInt64 total, completed; + Sync.GetProgress(total, completed); if (total != _range) SetRange(total); SetPos(completed); @@ -124,29 +138,6 @@ bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) return true; } - -//////////////////// -// CU64ToI32Converter - -static const UINT64 kMaxIntValue = 0x7FFFFFFF; - -void CU64ToI32Converter::Init(UINT64 range) -{ - _numShiftBits = 0; - while(range > kMaxIntValue) - { - range >>= 1; - _numShiftBits++; - } -} - -int CU64ToI32Converter::Count(UINT64 aValue) -{ - return int(aValue >> _numShiftBits); -} - -const UINT CProgressDialog::kCloseMessage = WM_USER + 1; - bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { switch(message) @@ -155,14 +146,20 @@ bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { KillTimer(_timer); _timer = 0; - End(0); - return true; + if (_inCancelMessageBox) + { + _externalCloseMessageWasReceived = true; + break; + } + return OnExternalCloseMessage(); } + /* case WM_SETTEXT: { if (_timer == 0) return true; } + */ } return CModalDialog::OnMessage(message, wParam, lParam); } @@ -173,16 +170,35 @@ bool CProgressDialog::OnButtonClicked(int buttonID, HWND buttonHWND) { case IDCANCEL: { - bool paused = ProgressSynch.GetPaused();; - ProgressSynch.SetPaused(true); - int res = ::MessageBoxW(HWND(*this), - L"Are you sure you want to cancel?", - _title, MB_YESNOCANCEL); - ProgressSynch.SetPaused(paused); + bool paused = Sync.GetPaused(); + Sync.SetPaused(true); + _inCancelMessageBox = true; + int res = ::MessageBoxW(HWND(*this), L"Are you sure you want to cancel?", _title, MB_YESNOCANCEL); + _inCancelMessageBox = false; + Sync.SetPaused(paused); if (res == IDCANCEL || res == IDNO) + { + if (_externalCloseMessageWasReceived) + OnExternalCloseMessage(); return true; + } break; } } return CModalDialog::OnButtonClicked(buttonID, buttonHWND); } + +void CProgressDialog::CheckNeedClose() +{ + if (_needClose) + { + PostMessage(kCloseMessage); + _needClose = false; + } +} + +bool CProgressDialog::OnExternalCloseMessage() +{ + End(0); + return true; +} diff --git a/CPP/7zip/UI/FileManager/ProgressDialog.h b/CPP/7zip/UI/FileManager/ProgressDialog.h index 201aead7..429ed740 100755 --- a/CPP/7zip/UI/FileManager/ProgressDialog.h +++ b/CPP/7zip/UI/FileManager/ProgressDialog.h @@ -1,59 +1,61 @@ // ProgressDialog.h -#ifndef __PROGRESSDIALOG_H -#define __PROGRESSDIALOG_H +#ifndef __PROGRESS_DIALOG_H +#define __PROGRESS_DIALOG_H -#include "ProgressDialogRes.h" +#include "Windows/Synchronization.h" +#include "Windows/Thread.h" #include "Windows/Control/Dialog.h" #include "Windows/Control/ProgressBar.h" -#include "Windows/Synchronization.h" -class CProgressSynch +#include "ProgressDialogRes.h" + +class CProgressSync { - NWindows::NSynchronization::CCriticalSection _criticalSection; + NWindows::NSynchronization::CCriticalSection _cs; bool _stopped; bool _paused; - UINT64 _total; - UINT64 _completed; + UInt64 _total; + UInt64 _completed; public: - CProgressSynch(): _stopped(false), _paused(false), _total(1), _completed(0) {} + CProgressSync(): _stopped(false), _paused(false), _total(1), _completed(0) {} HRESULT ProcessStopAndPause(); bool GetStopped() { - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); return _stopped; } void SetStopped(bool value) { - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); _stopped = value; } bool GetPaused() { - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); return _paused; } void SetPaused(bool value) { - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); _paused = value; } - void SetProgress(UINT64 total, UINT64 completed) + void SetProgress(UInt64 total, UInt64 completed) { - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); _total = total; _completed = completed; } - void SetPos(UINT64 completed) + void SetPos(UInt64 completed) { - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); _completed = completed; } - void GetProgress(UINT64 &total, UINT64 &completed) + void GetProgress(UInt64 &total, UInt64 &completed) { - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); total = _total; completed = _completed; } @@ -61,14 +63,17 @@ public: class CU64ToI32Converter { - UINT64 _numShiftBits; + UInt64 _numShiftBits; public: - void Init(UINT64 _range); - int Count(UINT64 aValue); + void Init(UInt64 range) + { + // Windows CE doesn't like big number here. + for (_numShiftBits = 0; range > (1 << 15); _numShiftBits++) + range >>= 1; + } + int Count(UInt64 value) { return int(value >> _numShiftBits); } }; -// class CProgressDialog: public NWindows::NControl::CModelessDialog - class CProgressDialog: public NWindows::NControl::CModalDialog { private: @@ -76,24 +81,35 @@ private: UString _title; CU64ToI32Converter _converter; - UINT64 _peviousPos; - UINT64 _range; + UInt64 _peviousPos; + UInt64 _range; NWindows::NControl::CProgressBar m_ProgressBar; int _prevPercentValue; + bool _wasCreated; + bool _needClose; + bool _inCancelMessageBox; + bool _externalCloseMessageWasReceived; + bool OnTimer(WPARAM timerID, LPARAM callback); - void SetRange(UINT64 range); - void SetPos(UINT64 pos); + void SetRange(UInt64 range); + void SetPos(UInt64 pos); virtual bool OnInit(); virtual void OnCancel(); + virtual void OnOK(); NWindows::NSynchronization::CManualResetEvent _dialogCreatedEvent; #ifndef _SFX void AddToTitle(LPCWSTR string); #endif bool OnButtonClicked(int buttonID, HWND buttonHWND); + + void WaitCreating() { _dialogCreatedEvent.Lock(); } + void CheckNeedClose(); + bool OnExternalCloseMessage(); public: - CProgressSynch ProgressSynch; + CProgressSync Sync; + int IconID; #ifndef _SFX HWND MainWindow; @@ -107,27 +123,48 @@ public: ,MainWindow(0) #endif { + IconID = -1; + _wasCreated = false; + _needClose = false; + _inCancelMessageBox = false; + _externalCloseMessageWasReceived = false; + if (_dialogCreatedEvent.Create() != S_OK) throw 1334987; } - void WaitCreating() { _dialogCreatedEvent.Lock(); } - - - INT_PTR Create(const UString &title, HWND wndParent = 0) + INT_PTR Create(const UString &title, NWindows::CThread &thread, HWND wndParent = 0) { _title = title; - return CModalDialog::Create(IDD_DIALOG_PROGRESS, wndParent); + INT_PTR res = CModalDialog::Create(IDD_DIALOG_PROGRESS, wndParent); + thread.Wait(); + return res; } - static const UINT kCloseMessage; + enum + { + kCloseMessage = WM_USER + 1 + }; virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam); - void MyClose() + void ProcessWasFinished() { - PostMessage(kCloseMessage); + WaitCreating(); + if (_wasCreated) + PostMessage(kCloseMessage); + else + _needClose = true; }; }; + +class CProgressCloser +{ + CProgressDialog *_p; +public: + CProgressCloser(CProgressDialog &p) : _p(&p) {} + ~CProgressCloser() { _p->ProcessWasFinished(); } +}; + #endif diff --git a/CPP/7zip/UI/FileManager/ProgressDialog.rc b/CPP/7zip/UI/FileManager/ProgressDialog.rc index e5cdd7e8..3a65338f 100755 --- a/CPP/7zip/UI/FileManager/ProgressDialog.rc +++ b/CPP/7zip/UI/FileManager/ProgressDialog.rc @@ -1,20 +1,12 @@ #include "ProgressDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 172 -#define ySize2 42 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#define xc 172 +#define yc 44 -#define bYPos (ySize - marg - bYSize) -#define bXPos (xSize - marg - bXSize) - - -IDD_DIALOG_PROGRESS DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +IDD_DIALOG_PROGRESS MY_DIALOG CAPTION "Progress" -MY_FONT BEGIN - PUSHBUTTON "Cancel", IDCANCEL, bXPos, bYPos , bXSize, bYSize - CONTROL "Progress1", IDC_PROGRESS1,"msctls_progress32",PBS_SMOOTH | WS_BORDER, - marg,marg, xSize2, 14 + PUSHBUTTON "Cancel", IDCANCEL, bx, by, bxs, bys + CONTROL "Progress1", IDC_PROGRESS1, "msctls_progress32", PBS_SMOOTH | WS_BORDER, m, m, xc, 14 END diff --git a/CPP/7zip/UI/FileManager/ProgressDialog2.cpp b/CPP/7zip/UI/FileManager/ProgressDialog2.cpp index 87a1521d..2c9996ab 100755 --- a/CPP/7zip/UI/FileManager/ProgressDialog2.cpp +++ b/CPP/7zip/UI/FileManager/ProgressDialog2.cpp @@ -3,17 +3,35 @@ #include "StdAfx.h" #include "Common/IntToString.h" +#include "Common/StringConvert.h" + +#include "Windows/Control/Static.h" +#include "Windows/Error.h" #include "ProgressDialog2.h" +#include "DialogSize.h" + +#include "ProgressDialog2Res.h" + +#include "../GUI/ExtractRes.h" using namespace NWindows; +extern HINSTANCE g_hInstance; + static const UINT_PTR kTimerID = 3; -static const UINT kTimerElapse = 100; -#ifdef LANG +static const UINT kCloseMessage = WM_USER + 1; + +static const UINT kTimerElapse = + #ifdef UNDER_CE + 500 + #else + 100 + #endif + ; + #include "LangUtils.h" -#endif #ifdef LANG static CIDLangPair kIDLangPairs[] = @@ -34,7 +52,7 @@ static CIDLangPair kIDLangPairs[] = }; #endif -HRESULT CProgressSynch::ProcessStopAndPause() +HRESULT CProgressSync::ProcessStopAndPause() { for (;;) { @@ -47,13 +65,38 @@ HRESULT CProgressSynch::ProcessStopAndPause() return S_OK; } -HRESULT CProgressSynch::SetPosAndCheckPaused(UInt64 completed) +HRESULT CProgressSync::SetPosAndCheckPaused(UInt64 completed) { RINOK(ProcessStopAndPause()); SetPos(completed); return S_OK; } + +CProgressDialog::CProgressDialog(): _timer(0), CompressingMode(true) + #ifndef _SFX + , MainWindow(0) + #endif + { + IconID = -1; + MessagesDisplayed = false; + _wasCreated = false; + _needClose = false; + _inCancelMessageBox = false; + _externalCloseMessageWasReceived = false; + + _numPostedMessages = 0; + _errorsWereDisplayed = false; + _waitCloseByCancelButton = false; + _cancelWasPressed = false; + ShowCompressionInfo = true; + WaitMode = false; + if (_dialogCreatedEvent.Create() != S_OK) + throw 1334987; + if (_createDialogEvent.Create() != S_OK) + throw 1334987; + } + #ifndef _SFX CProgressDialog::~CProgressDialog() { @@ -68,7 +111,9 @@ void CProgressDialog::AddToTitle(LPCWSTR s) } } -static const int kTitleFileNameSizeLimit = 40; +#endif + +static const int kTitleFileNameSizeLimit = 36; static const int kCurrentFileNameSizeLimit = 82; static void ReduceString(UString &s, int size) @@ -76,22 +121,34 @@ static void ReduceString(UString &s, int size) if (s.Length() > size) s = s.Left(size / 2) + UString(L" ... ") + s.Right(size / 2); } -#endif + +void CProgressDialog::EnableErrorsControls(bool enable) +{ + int cmdShow = enable ? SW_SHOW : SW_HIDE; + ShowItem(IDC_PROGRESS_ERRORS, cmdShow); + ShowItem(IDC_PROGRESS_ERRORS_VALUE, cmdShow); + ShowItem(IDC_PROGRESS_LIST, cmdShow); +} bool CProgressDialog::OnInit() { - _range = (UInt64)(Int64)(-1); - _prevPercentValue = UInt32(-1); - _prevElapsedSec = UInt32(-1); - _prevRemainingSec = UInt32(-1); - _prevSpeed = UInt32(-1); + _range = (UInt64)(Int64)-1; + _prevPercentValue = (UInt32)-1; + _prevElapsedSec = (UInt32)-1; + _prevRemainingSec = (UInt32)-1; + _prevSpeed = (UInt32)-1; _prevMode = kSpeedBytes; _prevTime = ::GetTickCount(); _elapsedTime = 0; _foreground = true; + m_ProgressBar.Attach(GetItem(IDC_PROGRESS1)); + _messageList.Attach(GetItem(IDC_PROGRESS_LIST)); + + _wasCreated = true; + _dialogCreatedEvent.Set(); + #ifdef LANG - // LangSetWindowText(HWND(*this), 0x02000C00); LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); #endif @@ -104,24 +161,197 @@ bool CProgressDialog::OnInit() window = GetItem(IDC_BUTTON_PAUSE); window.GetText(pauseString); - foregroundString = LangString(IDS_PROGRESS_FOREGROUND, 0x02000C11); - continueString = LangString(IDS_PROGRESS_CONTINUE, 0x02000C13); - pausedString = LangString(IDS_PROGRESS_PAUSED, 0x02000C20); + foregroundString = LangStringSpec(IDS_PROGRESS_FOREGROUND, 0x02000C11); + continueString = LangStringSpec(IDS_PROGRESS_CONTINUE, 0x02000C13); + pausedString = LangStringSpec(IDS_PROGRESS_PAUSED, 0x02000C20); - m_ProgressBar.Attach(GetItem(IDC_PROGRESS1)); - _timer = SetTimer(kTimerID, kTimerElapse); - _dialogCreatedEvent.Set(); SetText(_title); SetPauseText(); SetPriorityText(); + + + #ifndef UNDER_CE + _messageList.SetUnicodeFormat(true); + #endif + + _messageList.InsertColumn(0, L"", 30); + + const UString s = LangStringSpec(IDS_MESSAGES_DIALOG_MESSAGE_COLUMN, 0x02000A80); + + _messageList.InsertColumn(1, s, 600); + + _messageList.SetColumnWidthAuto(0); + _messageList.SetColumnWidthAuto(1); + + + EnableErrorsControls(false); + + GetItemSizes(IDCANCEL, buttonSizeX, buttonSizeY); + _numReduceSymbols = kCurrentFileNameSizeLimit; + NormalizeSize(true); + + if (!ShowCompressionInfo) + { + HideItem(IDC_PROGRESS_PACKED); + HideItem(IDC_PROGRESS_PACKED_VALUE); + HideItem(IDC_PROGRESS_RATIO); + HideItem(IDC_PROGRESS_RATIO_VALUE); + } + + if (IconID >= 0) + { + HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IconID)); + // SetIcon(ICON_SMALL, icon); + SetIcon(ICON_BIG, icon); + } + _timer = SetTimer(kTimerID, kTimerElapse); + #ifdef UNDER_CE + Foreground(); + #endif + + CheckNeedClose(); + return CModalDialog::OnInit(); } -void CProgressDialog::OnCancel() +bool CProgressDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize) { - ProgressSynch.SetStopped(true); + int sY; + int sStep; + int mx, my; + { + RECT rect; + GetClientRectOfItem(IDC_PROGRESS_ELAPSED, rect); + mx = rect.left; + my = rect.top; + sY = rect.bottom - rect.top; + GetClientRectOfItem(IDC_PROGRESS_REMAINING, rect); + sStep = rect.top - my; + } + + + InvalidateRect(NULL); + + int xSizeClient = xSize - mx * 2; + + { + int i; + for (i = 800; i > 40; i = i * 9 / 10) + if (Units_To_Pixels_X(i) <= xSizeClient) + break; + _numReduceSymbols = i / 4; + } + + int yPos = ySize - my - buttonSizeY; + + ChangeSubWindowSizeX(GetItem(IDC_PROGRESS_FILE_NAME), xSize - mx * 2); + ChangeSubWindowSizeX(GetItem(IDC_PROGRESS1), xSize - mx * 2); + + int bSizeX = buttonSizeX; + int mx2 = mx; + for (;; mx2--) + { + int bSize2 = bSizeX * 3 + mx2 * 2; + if (bSize2 <= xSizeClient) + break; + if (mx2 < 5) + { + bSizeX = (xSizeClient - mx2 * 2) / 3; + break; + } + } + if (bSizeX < 2) + bSizeX = 2; + + { + RECT rect; + GetClientRectOfItem(IDC_PROGRESS_LIST, rect); + int y = rect.top; + int ySize2 = yPos - my - y; + const int kMinYSize = buttonSizeY + buttonSizeY * 3 / 4; + int xx = xSize - mx * 2; + if (ySize2 < kMinYSize) + { + ySize2 = kMinYSize; + if (xx > bSizeX * 2) + xx -= bSizeX; + } + + _messageList.Move(mx, y, xx, ySize2); + } + + { + int xPos = xSize - mx; + xPos -= bSizeX; + MoveItem(IDCANCEL, xPos, yPos, bSizeX, buttonSizeY); + xPos -= (mx2 + bSizeX); + MoveItem(IDC_BUTTON_PAUSE, xPos, yPos, bSizeX, buttonSizeY); + xPos -= (mx2 + bSizeX); + MoveItem(IDC_BUTTON_PROGRESS_PRIORITY, xPos, yPos, bSizeX, buttonSizeY); + } + + int valueSize; + int labelSize; + int padSize; + + labelSize = Units_To_Pixels_X(MY_PROGRESS_LABEL_UNITS_MIN); + valueSize = Units_To_Pixels_X(MY_PROGRESS_VALUE_UNITS); + padSize = Units_To_Pixels_X(MY_PROGRESS_PAD_UNITS); + int requiredSize = (labelSize + valueSize) * 2 + padSize; + + int gSize; + { + if (requiredSize < xSizeClient) + { + int incr = (xSizeClient - requiredSize) / 3; + labelSize += incr; + } + else + labelSize = (xSizeClient - valueSize * 2 - padSize) / 2; + if (labelSize < 0) + labelSize = 0; + + gSize = labelSize + valueSize; + padSize = xSizeClient - gSize * 2; + } + + labelSize = gSize - valueSize; + + UINT IDs[] = + { + IDC_PROGRESS_ELAPSED, IDC_PROGRESS_ELAPSED_VALUE, + IDC_PROGRESS_REMAINING, IDC_PROGRESS_REMAINING_VALUE, + IDC_PROGRESS_FILES, IDC_PROGRESS_FILES_VALUE, + IDC_PROGRESS_RATIO, IDC_PROGRESS_RATIO_VALUE, + IDC_PROGRESS_ERRORS, IDC_PROGRESS_ERRORS_VALUE, + + IDC_PROGRESS_TOTAL, IDC_PROGRESS_TOTAL_VALUE, + IDC_PROGRESS_SPEED, IDC_PROGRESS_SPEED_VALUE, + IDC_PROGRESS_UNPACKED, IDC_PROGRESS_UNPACKED_VALUE, + IDC_PROGRESS_PACKED, IDC_PROGRESS_PACKED_VALUE + }; + + yPos = my; + for (int i = 0; i < sizeof(IDs) / sizeof(IDs[0]); i += 2) + { + int x = mx; + const int kNumColumn1Items = 5 * 2; + if (i >= kNumColumn1Items) + { + if (i == kNumColumn1Items) + yPos = my; + x = mx + gSize + padSize; + } + MoveItem(IDs[i], x, yPos, labelSize, sY); + MoveItem(IDs[i + 1], x + labelSize, yPos, valueSize, sY); + yPos += sStep; + } + return false; } +void CProgressDialog::OnCancel() { Sync.SetStopped(true); } +void CProgressDialog::OnOK() { } + static void ConvertSizeToString(UInt64 value, wchar_t *s) { const wchar_t *kModif = L" KM"; @@ -144,7 +374,7 @@ void CProgressDialog::SetRange(UInt64 range) _range = range; _previousPos = (UInt64)(Int64)-1; _converter.Init(range); - m_ProgressBar.SetRange32(0, _converter.Count(range)); // Test it for 100% + m_ProgressBar.SetRange32(0, _converter.Count(range)); } void CProgressDialog::SetPos(UInt64 pos) @@ -157,7 +387,7 @@ void CProgressDialog::SetPos(UInt64 pos) } if(redraw) { - m_ProgressBar.SetPos(_converter.Count(pos)); // Test it for 100% + m_ProgressBar.SetPos(_converter.Count(pos)); // Test it for 100% _previousPos = pos; } } @@ -179,13 +409,11 @@ void CProgressDialog::ShowSize(int id, UInt64 value) SetItemText(id, s); } -bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) +void CProgressDialog::UpdateStatInfo(bool showAll) { - if (ProgressSynch.GetPaused()) - return true; UInt64 total, completed, totalFiles, completedFiles, inSize, outSize; bool bytesProgressMode; - ProgressSynch.GetProgress(total, completed, totalFiles, completedFiles, inSize, outSize, bytesProgressMode); + Sync.GetProgress(total, completed, totalFiles, completedFiles, inSize, outSize, bytesProgressMode); UInt32 curTime = ::GetTickCount(); @@ -222,8 +450,29 @@ bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) elapsedChanged = true; } - if (elapsedChanged) + if (elapsedChanged || showAll) { + { + UInt64 numErrors; + + { + NWindows::NSynchronization::CCriticalSectionLock lock(Sync._cs); + numErrors = Sync.Messages.Size(); + } + if (numErrors > 0) + { + UpdateMessagesDialog(); + TCHAR s[40]; + ConvertUInt64ToString(numErrors, s); + SetItemText(IDC_PROGRESS_ERRORS_VALUE, s); + if (!_errorsWereDisplayed) + { + _errorsWereDisplayed = true; + EnableErrorsControls(true); + } + } + } + if (completed != 0) { @@ -245,7 +494,6 @@ bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) _prevRemainingSec = remainingSec; } } - // if (elapsedChanged) { UInt32 elapsedTime = (_elapsedTime == 0) ? 1 : _elapsedTime; UInt64 speedB = (completed * 1000) / elapsedTime; @@ -296,7 +544,7 @@ bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) total = 1; UInt32 percentValue = (UInt32)(completed * 100 / total); UString titleName; - ProgressSynch.GetTitleFileName(titleName); + Sync.GetTitleFileName(titleName); if (percentValue != _prevPercentValue || _prevTitleName != titleName) { _prevPercentValue = percentValue; @@ -339,7 +587,7 @@ bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) UString fileName; - ProgressSynch.GetCurrentFileName(fileName); + Sync.GetCurrentFileName(fileName); if (_prevFileName != fileName) { int slashPos = fileName.ReverseFind(WCHAR_PATH_SEPARATOR); @@ -351,38 +599,127 @@ bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) } else s2 = fileName; - ReduceString(s1, kCurrentFileNameSizeLimit); - ReduceString(s2, kCurrentFileNameSizeLimit); + ReduceString(s1, _numReduceSymbols); + ReduceString(s2, _numReduceSymbols); UString s = s1 + L"\n" + s2; SetItemText(IDC_PROGRESS_FILE_NAME, s); _prevFileName == fileName; } - - return true; } +bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) +{ + if (Sync.GetPaused()) + return true; -//////////////////// -// CU64ToI32Converter + CheckNeedClose(); -static const UInt64 kMaxIntValue = 0x7FFFFFFF; + UpdateStatInfo(false); + return true; +} -void CU64ToI32Converter::Init(UInt64 range) +struct CWaitCursor { - _numShiftBits = 0; - while(range > kMaxIntValue) + HCURSOR _waitCursor; + HCURSOR _oldCursor; + CWaitCursor() { - range >>= 1; - _numShiftBits++; + _waitCursor = LoadCursor(NULL, IDC_WAIT); + if (_waitCursor != NULL) + _oldCursor = SetCursor(_waitCursor); } -} + ~CWaitCursor() + { + if (_waitCursor != NULL) + SetCursor(_oldCursor); + } +}; -int CU64ToI32Converter::Count(UInt64 aValue) +INT_PTR CProgressDialog::Create(const UString &title, NWindows::CThread &thread, HWND wndParent) { - return int(aValue >> _numShiftBits); + INT_PTR res = 0; + try + { + if (WaitMode) + { + CWaitCursor waitCursor; + HANDLE h[] = { thread, _createDialogEvent }; + + WRes res = WaitForMultipleObjects(sizeof(h) / sizeof(h[0]), h, FALSE, + #ifdef UNDER_CE + 2500 + #else + 1000 + #endif + ); + if (res == WAIT_OBJECT_0 && !Sync.ThereIsMessage()) + return 0; + } + _title = title; + BIG_DIALOG_SIZE(360, 192); + res = CModalDialog::Create(SIZED_DIALOG(IDD_DIALOG_PROGRESS), wndParent); + } + catch(...) + { + _wasCreated = true; + _dialogCreatedEvent.Set(); + res = res; + } + thread.Wait(); + if (!MessagesDisplayed) + MessageBoxW(wndParent, L"Progress Error", L"7-Zip", MB_ICONERROR | MB_OK); + return res; } -const UINT CProgressDialog::kCloseMessage = WM_USER + 1; +bool CProgressDialog::OnExternalCloseMessage() +{ + UpdateStatInfo(true); + + HideItem(IDC_BUTTON_PROGRESS_PRIORITY); + HideItem(IDC_BUTTON_PAUSE); + SetItemText(IDCANCEL, LangStringSpec(IDS_CLOSE, 0x02000713)); + + bool thereAreMessages; + UString okMessage; + UString okMessageTitle; + UString errorMessage; + UString errorMessageTitle; + { + NWindows::NSynchronization::CCriticalSectionLock lock(Sync._cs); + errorMessage = Sync.ErrorMessage; + errorMessageTitle = Sync.ErrorMessageTitle; + okMessage = Sync.OkMessage; + okMessageTitle = Sync.OkMessageTitle; + thereAreMessages = !Sync.Messages.IsEmpty(); + } + if (!errorMessage.IsEmpty()) + { + MessagesDisplayed = true; + if (errorMessageTitle.IsEmpty()) + errorMessageTitle = L"7-Zip"; + MessageBoxW(*this, errorMessage, errorMessageTitle, MB_ICONERROR | MB_OK); + } + else if (!thereAreMessages) + { + MessagesDisplayed = true; + if (!okMessage.IsEmpty()) + { + if (okMessageTitle.IsEmpty()) + okMessageTitle = L"7-Zip"; + MessageBoxW(*this, okMessage, okMessageTitle, MB_OK); + } + } + + if (thereAreMessages && !_cancelWasPressed) + { + _waitCloseByCancelButton = true; + UpdateMessagesDialog(); + return true; + } + + End(0); + return true; +} bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { @@ -392,14 +729,21 @@ bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { KillTimer(_timer); _timer = 0; - End(0); - return true; + if (_inCancelMessageBox) + { + _externalCloseMessageWasReceived = true; + break; + } + return OnExternalCloseMessage(); } + /* case WM_SETTEXT: { if (_timer == 0) return true; + break; } + */ } return CModalDialog::OnMessage(message, wParam, lParam); } @@ -407,31 +751,31 @@ bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) void CProgressDialog::SetTitleText() { UString title; - if (ProgressSynch.GetPaused()) + if (Sync.GetPaused()) { title = pausedString; - title += L" "; + title += L' '; } - if (_prevPercentValue != UInt32(-1)) + if (_prevPercentValue != (UInt32)-1) { wchar_t s[64]; ConvertUInt64ToString(_prevPercentValue, s); title += s; - title += L"%"; + title += L'%'; } if (!_foreground) { - title += L" "; + title += L' '; title += backgroundedString; } - title += L" "; + title += L' '; UString totalTitle = title + _title; UString fileName; - ProgressSynch.GetTitleFileName(fileName); + Sync.GetTitleFileName(fileName); if (!fileName.IsEmpty()) { ReduceString(fileName, kTitleFileNameSizeLimit); - totalTitle += L" "; + totalTitle += L' '; totalTitle += fileName; } SetText(totalTitle); @@ -442,15 +786,15 @@ void CProgressDialog::SetTitleText() void CProgressDialog::SetPauseText() { - SetItemText(IDC_BUTTON_PAUSE, ProgressSynch.GetPaused() ? + SetItemText(IDC_BUTTON_PAUSE, Sync.GetPaused() ? continueString : pauseString); SetTitleText(); } void CProgressDialog::OnPauseButton() { - bool paused = !ProgressSynch.GetPaused(); - ProgressSynch.SetPaused(paused); + bool paused = !Sync.GetPaused(); + Sync.SetPaused(paused); UInt32 curTime = ::GetTickCount(); if (paused) _elapsedTime += (curTime - _prevTime); @@ -469,39 +813,188 @@ void CProgressDialog::SetPriorityText() void CProgressDialog::OnPriorityButton() { _foreground = !_foreground; + #ifndef UNDER_CE SetPriorityClass(GetCurrentProcess(), _foreground ? NORMAL_PRIORITY_CLASS: IDLE_PRIORITY_CLASS); + #endif SetPriorityText(); } +void CProgressDialog::AddMessageDirect(LPCWSTR message) +{ + int itemIndex = _messageList.GetItemCount(); + wchar_t sz[32]; + ConvertInt64ToString(itemIndex, sz); + _messageList.InsertItem(itemIndex, sz); + _messageList.SetSubItem(itemIndex, 1, message); +} + +void CProgressDialog::AddMessage(LPCWSTR message) +{ + UString s = message; + while (!s.IsEmpty()) + { + int pos = s.Find(L'\n'); + if (pos < 0) + break; + AddMessageDirect(s.Left(pos)); + s.Delete(0, pos + 1); + } + AddMessageDirect(s); +} + +void CProgressDialog::UpdateMessagesDialog() +{ + int numMessages; + UStringVector messages; + { + NWindows::NSynchronization::CCriticalSectionLock lock(Sync._cs); + numMessages = _numPostedMessages; + for (int i = _numPostedMessages; i < Sync.Messages.Size(); i++) + messages.Add(Sync.Messages[i]); + _numPostedMessages = Sync.Messages.Size(); + } + if (!messages.IsEmpty()) + { + for (int i = 0; i < messages.Size(); i++) + AddMessage(messages[i]); + if (numMessages < 128) + { + _messageList.SetColumnWidthAuto(0); + _messageList.SetColumnWidthAuto(1); + } + } +} + + bool CProgressDialog::OnButtonClicked(int buttonID, HWND buttonHWND) { switch(buttonID) { + // case IDOK: // if IDCANCEL is not DEFPUSHBUTTON case IDCANCEL: { - bool paused = ProgressSynch.GetPaused();; - // ProgressSynch.SetPaused(true); + if (_waitCloseByCancelButton) + { + MessagesDisplayed = true; + End(IDCLOSE); + break; + } + + bool paused = Sync.GetPaused(); if (!paused) OnPauseButton(); + _inCancelMessageBox = true; int res = ::MessageBoxW(HWND(*this), - LangString(IDS_PROGRESS_ASK_CANCEL, 0x02000C30), + LangStringSpec(IDS_PROGRESS_ASK_CANCEL, 0x02000C30), _title, MB_YESNOCANCEL); - // ProgressSynch.SetPaused(paused); + _inCancelMessageBox = false; if (!paused) OnPauseButton(); if (res == IDCANCEL || res == IDNO) + { + if (_externalCloseMessageWasReceived) + OnExternalCloseMessage(); return true; + } + + _cancelWasPressed = true; + MessagesDisplayed = true; break; } + case IDC_BUTTON_PAUSE: OnPauseButton(); return true; case IDC_BUTTON_PROGRESS_PRIORITY: - { OnPriorityButton(); return true; - } } return CModalDialog::OnButtonClicked(buttonID, buttonHWND); } + +void CProgressDialog::CheckNeedClose() +{ + if (_needClose) + { + PostMessage(kCloseMessage); + _needClose = false; + } +} + +void CProgressDialog::ProcessWasFinished() +{ + // Set Window title here. + if (!WaitMode) + WaitCreating(); + + if (_wasCreated) + PostMessage(kCloseMessage); + else + _needClose = true; +}; + + +HRESULT CProgressThreadVirt::Create(const UString &title, HWND parentWindow) +{ + NWindows::CThread thread; + RINOK(thread.Create(MyThreadFunction, this)); + ProgressDialog.Create(title, thread, parentWindow); + return S_OK; +} + +UString HResultToMessage(HRESULT errorCode) +{ + UString message; + if (errorCode == E_OUTOFMEMORY) + message = LangStringSpec(IDS_MEM_ERROR, 0x0200060B); + else if (!NError::MyFormatMessage(errorCode, message)) + message.Empty(); + if (message.IsEmpty()) + message = L"Error"; + return message; +} + +static void AddMessageToString(UString &dest, const UString &src) +{ + if (!src.IsEmpty()) + { + if (!dest.IsEmpty()) + dest += L'\n'; + dest += src; + } +} + +void CProgressThreadVirt::Process() +{ + CProgressCloser closer(ProgressDialog); + UString m; + try { Result = ProcessVirt(); } + catch(const wchar_t *s) { m = s; } + catch(const UString &s) { m = s; } + catch(const char *s) { m = GetUnicodeString(s); } + catch(...) { m = L"Error"; } + if (Result != E_ABORT) + { + if (m.IsEmpty() && Result != S_OK) + m = HResultToMessage(Result); + } + AddMessageToString(m, ErrorMessage); + AddMessageToString(m, ErrorPath1); + AddMessageToString(m, ErrorPath2); + + if (m.IsEmpty()) + { + if (!OkMessage.IsEmpty()) + { + ProgressDialog.Sync.SetOkMessageTitle(OkMessageTitle); + ProgressDialog.Sync.SetOkMessage(OkMessage); + } + } + else + { + ProgressDialog.Sync.SetErrorMessage(m); + if (Result == S_OK) + Result = E_FAIL; + } +} diff --git a/CPP/7zip/UI/FileManager/ProgressDialog2.h b/CPP/7zip/UI/FileManager/ProgressDialog2.h index 3ab9f4c0..bbdc5afa 100755 --- a/CPP/7zip/UI/FileManager/ProgressDialog2.h +++ b/CPP/7zip/UI/FileManager/ProgressDialog2.h @@ -3,17 +3,15 @@ #ifndef __PROGRESS_DIALOG2_H #define __PROGRESS_DIALOG2_H -#include "Common/Types.h" +#include "Windows/Synchronization.h" +#include "Windows/Thread.h" #include "Windows/Control/Dialog.h" +#include "Windows/Control/ListView.h" #include "Windows/Control/ProgressBar.h" -#include "Windows/Synchronization.h" - -#include "ProgressDialog2Res.h" -class CProgressSynch +class CProgressSync { - NWindows::NSynchronization::CCriticalSection _cs; bool _stopped; bool _paused; bool _bytesProgressMode; @@ -25,11 +23,20 @@ class CProgressSynch UInt64 _inSize; UInt64 _outSize; - UString TitleFileName; - UString CurrentFileName; + UString _titleFileName; + UString _currentFileName; public: - CProgressSynch(): + UStringVector Messages; + UString ErrorMessage; + UString ErrorMessageTitle; + + UString OkMessage; + UString OkMessageTitle; + + NWindows::NSynchronization::CCriticalSection _cs; + + CProgressSync(): _stopped(false), _paused(false), _totalBytes((UInt64)(Int64)-1), _curBytes(0), _totalFiles((UInt64)(Int64)-1), _curFiles(0), @@ -116,22 +123,57 @@ public: void SetTitleFileName(const UString &fileName) { NWindows::NSynchronization::CCriticalSectionLock lock(_cs); - TitleFileName = fileName; + _titleFileName = fileName; } void GetTitleFileName(UString &fileName) { NWindows::NSynchronization::CCriticalSectionLock lock(_cs); - fileName = TitleFileName; + fileName = _titleFileName; } void SetCurrentFileName(const UString &fileName) { NWindows::NSynchronization::CCriticalSectionLock lock(_cs); - CurrentFileName = fileName; + _currentFileName = fileName; } void GetCurrentFileName(UString &fileName) { NWindows::NSynchronization::CCriticalSectionLock lock(_cs); - fileName = CurrentFileName; + fileName = _currentFileName; + } + + void AddErrorMessage(LPCWSTR message) + { + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); + Messages.Add(message); + } + + void SetErrorMessage(const UString &message) + { + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); + ErrorMessage = message; + } + + void SetOkMessage(const UString &message) + { + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); + OkMessage = message; + } + + void SetOkMessageTitle(const UString &title) + { + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); + OkMessageTitle = title; + } + + void SetErrorMessageTitle(const UString &title) + { + NWindows::NSynchronization::CCriticalSectionLock lock(_cs); + ErrorMessageTitle = title; + } + + bool ThereIsMessage() const + { + return !Messages.IsEmpty() || !ErrorMessage.IsEmpty() || !OkMessage.IsEmpty(); } }; @@ -139,12 +181,15 @@ class CU64ToI32Converter { UInt64 _numShiftBits; public: - void Init(UInt64 _range); - int Count(UInt64 aValue); + void Init(UInt64 range) + { + // Windows CE doesn't like big number here. + for (_numShiftBits = 0; range > (1 << 15); _numShiftBits++) + range >>= 1; + } + int Count(UInt64 value) { return int(value >> _numShiftBits); } }; -// class CProgressDialog: public NWindows::NControl::CModelessDialog - enum ESpeedMode { kSpeedBytes, @@ -164,7 +209,8 @@ private: UString continueString; UString pausedString; - + int buttonSizeX; + int buttonSizeY; UINT_PTR _timer; @@ -173,6 +219,7 @@ private: UInt64 _previousPos; UInt64 _range; NWindows::NControl::CProgressBar m_ProgressBar; + NWindows::NControl::CListView _messageList; UInt32 _prevPercentValue; UInt32 _prevTime; @@ -184,11 +231,30 @@ private: bool _foreground; + int _numReduceSymbols; + + bool _wasCreated; + bool _needClose; + + UInt32 _numPostedMessages; + + bool _errorsWereDisplayed; + + bool _waitCloseByCancelButton; + bool _cancelWasPressed; + + bool _inCancelMessageBox; + bool _externalCloseMessageWasReceived; + + void UpdateStatInfo(bool showAll); bool OnTimer(WPARAM timerID, LPARAM callback); void SetRange(UInt64 range); void SetPos(UInt64 pos); virtual bool OnInit(); + virtual bool OnSize(WPARAM wParam, int xSize, int ySize); virtual void OnCancel(); + virtual void OnOK(); + NWindows::NSynchronization::CManualResetEvent _createDialogEvent; NWindows::NSynchronization::CManualResetEvent _dialogCreatedEvent; #ifndef _SFX void AddToTitle(LPCWSTR string); @@ -203,10 +269,25 @@ private: void SetTitleText(); void ShowSize(int id, UInt64 value); + void UpdateMessagesDialog(); + + void AddMessageDirect(LPCWSTR message); + void AddMessage(LPCWSTR message); + + bool OnExternalCloseMessage(); + void EnableErrorsControls(bool enable); + + void ShowAfterMessages(HWND wndParent); + + void CheckNeedClose(); public: - CProgressSynch ProgressSynch; + CProgressSync Sync; bool CompressingMode; - + bool WaitMode; + bool ShowCompressionInfo; + bool MessagesDisplayed; // = true if user pressed OK on all messages or there are no messages. + int IconID; + #ifndef _SFX HWND MainWindow; UString MainTitle; @@ -214,29 +295,64 @@ public: ~CProgressDialog(); #endif - CProgressDialog(): _timer(0), CompressingMode(true) - #ifndef _SFX - ,MainWindow(0) - #endif + CProgressDialog(); + void WaitCreating() { - if (_dialogCreatedEvent.Create() != S_OK) - throw 1334987; + _createDialogEvent.Set(); + _dialogCreatedEvent.Lock(); } - void WaitCreating() { _dialogCreatedEvent.Lock(); } + INT_PTR Create(const UString &title, NWindows::CThread &thread, HWND wndParent = 0); - INT_PTR Create(const UString &title, HWND wndParent = 0) - { - _title = title; - return CModalDialog::Create(IDD_DIALOG_PROGRESS, wndParent); - } - - static const UINT kCloseMessage; virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam); - void MyClose() { PostMessage(kCloseMessage); }; + void ProcessWasFinished(); +}; + + +class CProgressCloser +{ + CProgressDialog *_p; +public: + CProgressCloser(CProgressDialog &p) : _p(&p) {} + ~CProgressCloser() { _p->ProcessWasFinished(); } +}; + +class CProgressThreadVirt +{ +protected: + UString ErrorMessage; + UString ErrorPath1; + UString ErrorPath2; + UString OkMessage; + UString OkMessageTitle; + + // error if any of HRESULT, ErrorMessage, ErrorPath + virtual HRESULT ProcessVirt() = 0; + void Process(); +public: + HRESULT Result; + bool ThreadFinishedOK; // if there is no fatal exception + CProgressDialog ProgressDialog; + + static THREAD_FUNC_DECL MyThreadFunction(void *param) + { + CProgressThreadVirt *p = (CProgressThreadVirt *)param; + try + { + p->Process(); + p->ThreadFinishedOK = true; + } + catch (...) { p->Result = E_FAIL; } + return 0; + } + + HRESULT Create(const UString &title, HWND parentWindow = 0); + CProgressThreadVirt(): Result(E_FAIL), ThreadFinishedOK(false) {} }; +UString HResultToMessage(HRESULT errorCode); + #endif diff --git a/CPP/7zip/UI/FileManager/ProgressDialog2.rc b/CPP/7zip/UI/FileManager/ProgressDialog2.rc index 2b707451..703dbb1f 100755 --- a/CPP/7zip/UI/FileManager/ProgressDialog2.rc +++ b/CPP/7zip/UI/FileManager/ProgressDialog2.rc @@ -1,77 +1,41 @@ #include "ProgressDialog2Res.h" #include "../../GuiCommon.rc" -#define xSize2 350 -#define ySize2 110 +#undef DIALOG_ID +#define DIALOG_ID IDD_DIALOG_PROGRESS +#define xc 360 +#define k 11 +#define z1s 16 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#include "ProgressDialog2a.rc" -#define bYPos (ySize - marg - bYSize) - -#undef bXSize -#define bXSize 80 - -#define bXPos1 (xSize - marg - bXSize) -#define bXPos2 (bXPos1 - 10 - bXSize) -#define bXPos3 (bXPos2 - 10 - bXSize) - -#define x0Size 90 -#define x1 (marg + x0Size) -#define x1Size 70 - -#define x3Size 60 -#define x3 (xSize - marg - x3Size) - -#define x2Size 90 -#define x2 (x3 - x2Size) - -#undef y0 -#undef y1 -#undef y2 -#undef y3 -#define y0 marg -#define y1 (y0 + 11) -#define y2 (y1 + 11) -#define y3 (y2 + 11) +#ifdef UNDER_CE +#include "../../GuiCommon.rc" -IDD_DIALOG_PROGRESS DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE | WS_MINIMIZEBOX -CAPTION "Progress" -MY_FONT -BEGIN - PUSHBUTTON "&Background", IDC_BUTTON_PROGRESS_PRIORITY, bXPos3, bYPos, bXSize, bYSize - PUSHBUTTON "&Pause", IDC_BUTTON_PAUSE, bXPos2, bYPos, bXSize, bYSize - PUSHBUTTON "Cancel", IDCANCEL, bXPos1, bYPos, bXSize, bYSize - LTEXT "Elapsed time:", IDC_PROGRESS_ELAPSED, marg, y0, x0Size, 8 - LTEXT "Remaining time:", IDC_PROGRESS_REMAINING, marg, y1, x0Size, 8 - LTEXT "Files:", IDC_PROGRESS_FILES, marg, y2, x0Size, 8 - LTEXT "Compression ratio:",IDC_PROGRESS_RATIO, marg, y3, x0Size, 8 - LTEXT "Total size:", IDC_PROGRESS_TOTAL, x2, y0, x2Size, 8 - LTEXT "Speed:", IDC_PROGRESS_SPEED, x2, y1, x2Size, 8 - LTEXT "Processed:", IDC_PROGRESS_UNPACKED, x2, y2, x2Size, 8 - LTEXT "Compressed size:", IDC_PROGRESS_PACKED, x2, y3, x2Size, 8 +#undef DIALOG_ID +#undef m +#undef k +#undef z1s - RTEXT "00:00:00", IDC_PROGRESS_ELAPSED_VALUE, x1, y0, x1Size, 8 - RTEXT "", IDC_PROGRESS_REMAINING_VALUE, x1, y1, x1Size, 8 - RTEXT "", IDC_PROGRESS_FILES_VALUE, x1, y2, x1Size, 8 - RTEXT "", IDC_PROGRESS_RATIO_VALUE, x1, y3, x1Size, 8 +#define DIALOG_ID IDD_DIALOG_PROGRESS_2 +#define m 4 +#define k 8 +#define z1s 12 - RTEXT "", IDC_PROGRESS_TOTAL_VALUE, x3, y0, x3Size, 8 - RTEXT "", IDC_PROGRESS_SPEED_VALUE, x3, y1, x3Size, 8 - RTEXT "", IDC_PROGRESS_UNPACKED_VALUE, x3, y2, x3Size, 8 - RTEXT "", IDC_PROGRESS_PACKED_VALUE, x3, y3, x3Size, 8 +#define xc 280 - LTEXT "", IDC_PROGRESS_FILE_NAME, marg, bYPos - 42, xSize2, 21, SS_NOPREFIX | SS_LEFTNOWORDWRAP - CONTROL "Progress1", IDC_PROGRESS1, "msctls_progress32", PBS_SMOOTH | WS_BORDER, marg, bYPos - 20, xSize2, 13 -END +#include "ProgressDialog2a.rc" +#endif STRINGTABLE DISCARDABLE -BEGIN +{ IDS_PROGRESS_PAUSED "Paused" IDS_PROGRESS_FOREGROUND "&Foreground" IDS_PROGRESS_CONTINUE "&Continue" IDS_PROGRESS_ASK_CANCEL "Are you sure you want to cancel?" -END + IDS_CLOSE "&Close" + IDS_MESSAGES_DIALOG_MESSAGE_COLUMN "Message" +} diff --git a/CPP/7zip/UI/FileManager/ProgressDialog2Res.h b/CPP/7zip/UI/FileManager/ProgressDialog2Res.h index 16bf2634..21ac03c2 100755 --- a/CPP/7zip/UI/FileManager/ProgressDialog2Res.h +++ b/CPP/7zip/UI/FileManager/ProgressDialog2Res.h @@ -1,10 +1,16 @@ -#define IDC_BUTTON_PAUSE 3 -#define IDC_BUTTON_PROGRESS_PRIORITY 4 #define IDD_DIALOG_PROGRESS 500 +#define IDD_DIALOG_PROGRESS_2 600 + +#define IDC_BUTTON_PAUSE 50 +#define IDC_BUTTON_PROGRESS_PRIORITY 51 + #define IDS_PROGRESS_PAUSED 700 #define IDS_PROGRESS_FOREGROUND 701 #define IDS_PROGRESS_CONTINUE 702 #define IDS_PROGRESS_ASK_CANCEL 703 +#define IDS_CLOSE 704 +#define IDS_MESSAGES_DIALOG_MESSAGE_COLUMN 503 + #define IDC_PROGRESS1 1000 #define IDC_PROGRESS_ELAPSED 1002 #define IDC_PROGRESS_ELAPSED_VALUE 1003 @@ -24,3 +30,12 @@ #define IDC_PROGRESS_PACKED_VALUE 1017 #define IDC_PROGRESS_UNPACKED 1018 #define IDC_PROGRESS_UNPACKED_VALUE 1019 + +#define IDC_PROGRESS_ERRORS 1030 +#define IDC_PROGRESS_ERRORS_VALUE 1031 +#define IDC_PROGRESS_LIST 1032 + +#define MY_PROGRESS_VALUE_UNITS 44 +#define MY_PROGRESS_LABEL_UNITS_MIN 60 +#define MY_PROGRESS_LABEL_UNITS_START 90 +#define MY_PROGRESS_PAD_UNITS 4 diff --git a/CPP/7zip/UI/FileManager/ProgressDialog2a.rc b/CPP/7zip/UI/FileManager/ProgressDialog2a.rc new file mode 100755 index 00000000..8eba4148 --- /dev/null +++ b/CPP/7zip/UI/FileManager/ProgressDialog2a.rc @@ -0,0 +1,78 @@ +#undef bxs +#define bxs 80 + +#define x0s MY_PROGRESS_LABEL_UNITS_START +#define x1s MY_PROGRESS_VALUE_UNITS +#define x2s MY_PROGRESS_LABEL_UNITS_START +#define x3s MY_PROGRESS_VALUE_UNITS + +#define x1 (m + x0s) +#define x3 (xs - m - x3s) +#define x2 (x3 - x2s) + +#undef y0 +#undef y1 +#undef y2 +#undef y3 +#undef y4 + +#undef z0 +#undef z0z +#undef z1 +#undef z2 +#undef z2 + +#define y0 m +#define y1 (y0 + k) +#define y2 (y1 + k) +#define y3 (y2 + k) +#define y4 (y3 + k) + +#define z2 (y4 + k + 1) +#define z2s 24 + +#define z1 (z2 + z2s) + +#define z0 (z1 + z1s + m) +#define z0s 48 + +#define yc (z0 + z0s + bys) + + +DIALOG_ID MY_RESIZE_DIALOG +CAPTION "Progress" +{ + PUSHBUTTON "&Background", IDC_BUTTON_PROGRESS_PRIORITY, bx3, by, bxs, bys + PUSHBUTTON "&Pause", IDC_BUTTON_PAUSE, bx2, by, bxs, bys + DEFPUSHBUTTON "Cancel", IDCANCEL, bx1, by, bxs, bys + + LTEXT "Elapsed time:", IDC_PROGRESS_ELAPSED, m, y0, x0s, 8 + LTEXT "Remaining time:", IDC_PROGRESS_REMAINING, m, y1, x0s, 8 + LTEXT "Files:", IDC_PROGRESS_FILES, m, y2, x0s, 8 + LTEXT "Compression ratio:",IDC_PROGRESS_RATIO, m, y3, x0s, 8 + LTEXT "Errors:", IDC_PROGRESS_ERRORS, m, y4, x0s, 8 + + LTEXT "Total size:", IDC_PROGRESS_TOTAL, x2, y0, x2s, 8 + LTEXT "Speed:", IDC_PROGRESS_SPEED, x2, y1, x2s, 8 + LTEXT "Processed:", IDC_PROGRESS_UNPACKED, x2, y2, x2s, 8 + LTEXT "Compressed size:", IDC_PROGRESS_PACKED, x2, y3, x2s, 8 + + RTEXT "", IDC_PROGRESS_ELAPSED_VALUE, x1, y0, x1s, 8 + RTEXT "", IDC_PROGRESS_REMAINING_VALUE, x1, y1, x1s, 8 + RTEXT "", IDC_PROGRESS_FILES_VALUE, x1, y2, x1s, 8 + RTEXT "", IDC_PROGRESS_RATIO_VALUE, x1, y3, x1s, 8 + RTEXT "", IDC_PROGRESS_ERRORS_VALUE, x1, y4, x1s, 8 + + RTEXT "", IDC_PROGRESS_TOTAL_VALUE, x3, y0, x3s, 8 + RTEXT "", IDC_PROGRESS_SPEED_VALUE, x3, y1, x3s, 8 + RTEXT "", IDC_PROGRESS_UNPACKED_VALUE, x3, y2, x3s, 8 + RTEXT "", IDC_PROGRESS_PACKED_VALUE, x3, y3, x3s, 8 + + LTEXT "", IDC_PROGRESS_FILE_NAME, m, z2, xc, z2s, SS_NOPREFIX | SS_LEFTNOWORDWRAP + CONTROL "Progress1", IDC_PROGRESS1, "msctls_progress32", PBS_SMOOTH | WS_BORDER, m, z1, xc, z1s + + + CONTROL "List1", IDC_PROGRESS_LIST, "SysListView32", + LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, + m, z0, xc, z0s +} diff --git a/CPP/7zip/UI/FileManager/PropertyName.cpp b/CPP/7zip/UI/FileManager/PropertyName.cpp index 48090d38..79b09300 100755 --- a/CPP/7zip/UI/FileManager/PropertyName.cpp +++ b/CPP/7zip/UI/FileManager/PropertyName.cpp @@ -26,7 +26,7 @@ static CPropertyIDNamePair kPropertyIDNamePairs[] = { kpidPath, IDS_PROP_PATH, 0x02000203 }, { kpidName, IDS_PROP_NAME, 0x02000204 }, { kpidExtension, IDS_PROP_EXTENSION, 0x02000205 }, - { kpidIsDir, IDS_PROP_IS_FOLDER, 0x02000206}, + { kpidIsDir, IDS_PROP_IS_FOLDER, 0x02000206}, { kpidSize, IDS_PROP_SIZE, 0x02000207}, { kpidPackSize, IDS_PROP_PACKED_SIZE, 0x02000208 }, { kpidAttrib, IDS_PROP_ATTRIBUTES, 0x02000209 }, @@ -40,7 +40,7 @@ static CPropertyIDNamePair kPropertyIDNamePairs[] = { kpidSplitAfter, IDS_PROP_SPLIT_AFTER, 0x02000211 }, { kpidDictionarySize, IDS_PROP_DICTIONARY_SIZE, 0x02000212 }, { kpidCRC, IDS_PROP_CRC, 0x02000213 }, - { kpidType, IDS_PROP_FILE_TYPE, 0x02000214}, + { kpidType, IDS_PROP_FILE_TYPE, 0x02000214}, { kpidIsAnti, IDS_PROP_ANTI, 0x02000215 }, { kpidMethod, IDS_PROP_METHOD, 0x02000216 }, { kpidHostOS, IDS_PROP_HOST_OS, 0x02000217 }, diff --git a/CPP/7zip/UI/FileManager/RegistryAssociations.cpp b/CPP/7zip/UI/FileManager/RegistryAssociations.cpp index d4fbfe13..f7edbb4b 100755 --- a/CPP/7zip/UI/FileManager/RegistryAssociations.cpp +++ b/CPP/7zip/UI/FileManager/RegistryAssociations.cpp @@ -20,7 +20,9 @@ namespace NRegistryAssociations { static NSynchronization::CCriticalSection g_CriticalSection; -#define REG_PATH_FM TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-ZIP") TEXT(STRING_PATH_SEPARATOR) TEXT("FM") +#define REG_PATH_FM TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") TEXT(STRING_PATH_SEPARATOR) TEXT("FM") + +/* static const TCHAR *kCUKeyPath = REG_PATH_FM; static const WCHAR *kExtPlugins = L"Plugins"; @@ -64,10 +66,8 @@ void ReadInternalAssociations(CObjectVector<CExtInfo> &items) UString pluginsString; key.QueryValue(kExtPlugins, pluginsString); SplitString(pluginsString, extInfo.Plugins); - /* - if (key.QueryValue(kExtEnabled, extInfo.Enabled) != ERROR_SUCCESS) - extInfo.Enabled = false; - */ + // if (key.QueryValue(kExtEnabled, extInfo.Enabled) != ERROR_SUCCESS) + // extInfo.Enabled = false; items.Add(extInfo); } } @@ -89,6 +89,7 @@ void WriteInternalAssociations(const CObjectVector<CExtInfo> &items) // key.SetValue(kExtEnabled, extInfo.Enabled); } } +*/ /////////////////////////////////// // External @@ -100,6 +101,7 @@ static const TCHAR *kDefaultIconKeyName = TEXT("DefaultIcon"); static const TCHAR *kShellKeyName = TEXT("shell"); static const TCHAR *kOpenKeyName = TEXT("open"); static const TCHAR *kCommandKeyName = TEXT("command"); +static const TCHAR *k7zipPrefix = TEXT("7-Zip."); static CSysString GetExtensionKeyName(const CSysString &extension) { @@ -108,10 +110,11 @@ static CSysString GetExtensionKeyName(const CSysString &extension) static CSysString GetExtProgramKeyName(const CSysString &extension) { - return CSysString(TEXT("7-Zip.")) + extension; + return CSysString(k7zipPrefix) + extension; } -static bool CheckShellExtensionInfo2(const CSysString &extension, UString &iconPath, int &iconIndex) +static bool CheckShellExtensionInfo2(const CSysString &extension, + CSysString programKeyName, UString &iconPath, int &iconIndex) { iconIndex = -1; iconPath.Empty(); @@ -119,15 +122,13 @@ static bool CheckShellExtensionInfo2(const CSysString &extension, UString &iconP CKey extKey; if (extKey.Open(HKEY_CLASSES_ROOT, GetExtensionKeyName(extension), KEY_READ) != ERROR_SUCCESS) return false; - CSysString programNameValue; - if (extKey.QueryValue(NULL, programNameValue) != ERROR_SUCCESS) + if (extKey.QueryValue(NULL, programKeyName) != ERROR_SUCCESS) return false; - CSysString extProgramKeyName = GetExtProgramKeyName(extension); - UString programNameValueU = GetUnicodeString(programNameValue); - if (programNameValueU.CompareNoCase(GetUnicodeString(extProgramKeyName)) != 0) + UString s = GetUnicodeString(k7zipPrefix); + if (s.CompareNoCase(GetUnicodeString(programKeyName.Left(s.Length()))) != 0) return false; CKey iconKey; - if (extKey.Open(HKEY_CLASSES_ROOT, extProgramKeyName + CSysString(TEXT(CHAR_PATH_SEPARATOR)) + kDefaultIconKeyName, KEY_READ) != ERROR_SUCCESS) + if (extKey.Open(HKEY_CLASSES_ROOT, programKeyName + CSysString(TEXT(CHAR_PATH_SEPARATOR)) + kDefaultIconKeyName, KEY_READ) != ERROR_SUCCESS) return false; UString value; if (extKey.QueryValue(NULL, value) == ERROR_SUCCESS) @@ -151,10 +152,11 @@ static bool CheckShellExtensionInfo2(const CSysString &extension, UString &iconP bool CheckShellExtensionInfo(const CSysString &extension, UString &iconPath, int &iconIndex) { NSynchronization::CCriticalSectionLock lock(g_CriticalSection); - if (!CheckShellExtensionInfo2(extension, iconPath, iconIndex)) + CSysString programKeyName; + if (!CheckShellExtensionInfo2(extension, programKeyName, iconPath, iconIndex)) return false; CKey extProgKey; - return (extProgKey.Open(HKEY_CLASSES_ROOT, GetExtProgramKeyName(extension), KEY_READ) == ERROR_SUCCESS); + return (extProgKey.Open(HKEY_CLASSES_ROOT, programKeyName, KEY_READ) == ERROR_SUCCESS); } static void DeleteShellExtensionKey(const CSysString &extension) @@ -177,9 +179,10 @@ static void DeleteShellExtensionProgramKey(const CSysString &extension) void DeleteShellExtensionInfo(const CSysString &extension) { + CSysString programKeyName; UString iconPath; int iconIndex; - if (CheckShellExtensionInfo2(extension, iconPath, iconIndex)) + if (CheckShellExtensionInfo2(extension, programKeyName, iconPath, iconIndex)) DeleteShellExtensionKey(extension); DeleteShellExtensionProgramKey(extension); } @@ -193,7 +196,13 @@ void AddShellExtensionInfo(const CSysString &extension, DeleteShellExtensionKey(extension); DeleteShellExtensionProgramKey(extension); NSynchronization::CCriticalSectionLock lock(g_CriticalSection); - CSysString programKeyName = GetExtProgramKeyName(extension); + CSysString programKeyName; + { + CSysString ext = extension; + if (iconIndex < 0) + ext = TEXT("*"); + programKeyName = GetExtProgramKeyName(ext); + } { CKey extKey; extKey.Create(HKEY_CLASSES_ROOT, GetExtensionKeyName(extension)); @@ -212,7 +221,9 @@ void AddShellExtensionInfo(const CSysString &extension, CKey iconKey; iconKey.Create(programKey, kDefaultIconKeyName); UString iconPathFull = iconPath; - if (iconIndex >= 0) + if (iconIndex < 0) + iconIndex = 0; + // if (iconIndex >= 0) { iconPathFull += L","; wchar_t s[16]; @@ -240,7 +251,7 @@ void AddShellExtensionInfo(const CSysString &extension, // ContextMenu /* -static const TCHAR *kContextMenuKeyName = TEXT("\\shellex\\ContextMenuHandlers\\7-ZIP"); +static const TCHAR *kContextMenuKeyName = TEXT("\\shellex\\ContextMenuHandlers\\7-Zip"); static const TCHAR *kContextMenuHandlerCLASSIDValue = TEXT("{23170F69-40C1-278A-1000-000100020000}"); static const TCHAR *kRootKeyNameForFile = TEXT("*"); diff --git a/CPP/7zip/UI/FileManager/RegistryAssociations.h b/CPP/7zip/UI/FileManager/RegistryAssociations.h index 2516fd2b..5390b9db 100755 --- a/CPP/7zip/UI/FileManager/RegistryAssociations.h +++ b/CPP/7zip/UI/FileManager/RegistryAssociations.h @@ -7,6 +7,7 @@ namespace NRegistryAssociations { + /* struct CExtInfo { UString Ext; @@ -16,6 +17,7 @@ namespace NRegistryAssociations { bool ReadInternalAssociation(const wchar_t *ext, CExtInfo &extInfo); void ReadInternalAssociations(CObjectVector<CExtInfo> &items); void WriteInternalAssociations(const CObjectVector<CExtInfo> &items); + */ bool CheckShellExtensionInfo(const CSysString &extension, UString &iconPath, int &iconIndex); diff --git a/CPP/7zip/UI/FileManager/RegistryPlugins.cpp b/CPP/7zip/UI/FileManager/RegistryPlugins.cpp index 61cceb5f..d49eaa6e 100755 --- a/CPP/7zip/UI/FileManager/RegistryPlugins.cpp +++ b/CPP/7zip/UI/FileManager/RegistryPlugins.cpp @@ -2,21 +2,16 @@ #include "StdAfx.h" -#include "Common/StringConvert.h" -// #include "Windows/Registry.h" -// #include "Windows/Synchronization.h" - #include "Windows/DLL.h" #include "Windows/PropVariant.h" #include "Windows/FileFind.h" +#include "ProgramLocation.h" #include "RegistryPlugins.h" #include "IFolder.h" using namespace NWindows; using namespace NFile; -// using namespace NRegistry; -// using namespace NCOM; /* static const TCHAR *kLMBasePath = TEXT("Software\\7-Zip\\FM"); @@ -32,66 +27,65 @@ static CSysString GetFileFolderPluginsKeyName() CSysString(kPluginsKeyName); } -static NSynchronization::CCriticalSection g_CriticalSection; */ -typedef UINT32 (WINAPI * GetPluginPropertyFunc)( - PROPID propID, PROPVARIANT *value); -static bool ReadPluginInfo(CPluginInfo &pluginInfo) +typedef UINT32 (WINAPI * GetPluginPropertyFunc)(PROPID propID, PROPVARIANT *value); + +static bool ReadPluginInfo(CPluginInfo &pluginInfo, bool needCheckDll) { + if (needCheckDll) { - NDLL::CLibrary library; - if (!library.LoadEx(pluginInfo.FilePath, LOAD_LIBRARY_AS_DATAFILE)) + NDLL::CLibrary lib; + if (!lib.LoadEx(pluginInfo.FilePath, LOAD_LIBRARY_AS_DATAFILE)) return false; } - NDLL::CLibrary library; - if (!library.Load(pluginInfo.FilePath)) + NDLL::CLibrary lib; + if (!lib.Load(pluginInfo.FilePath)) return false; - GetPluginPropertyFunc getPluginProperty = (GetPluginPropertyFunc) - library.GetProcAddress("GetPluginProperty"); + GetPluginPropertyFunc getPluginProperty = (GetPluginPropertyFunc)lib.GetProc("GetPluginProperty"); if (getPluginProperty == NULL) return false; - NCOM::CPropVariant propVariant; - if (getPluginProperty(NPlugin::kName, &propVariant) != S_OK) + NCOM::CPropVariant prop; + if (getPluginProperty(NPlugin::kName, &prop) != S_OK) return false; - if (propVariant.vt != VT_BSTR) + if (prop.vt != VT_BSTR) return false; - pluginInfo.Name = propVariant.bstrVal; - propVariant.Clear(); + pluginInfo.Name = prop.bstrVal; + prop.Clear(); - if (getPluginProperty(NPlugin::kClassID, &propVariant) != S_OK) + if (getPluginProperty(NPlugin::kClassID, &prop) != S_OK) return false; - if (propVariant.vt == VT_EMPTY) + if (prop.vt == VT_EMPTY) pluginInfo.ClassIDDefined = false; - else if (propVariant.vt != VT_BSTR) + else if (prop.vt != VT_BSTR) return false; else { pluginInfo.ClassIDDefined = true; - pluginInfo.ClassID = *(const GUID *)propVariant.bstrVal; + pluginInfo.ClassID = *(const GUID *)prop.bstrVal; } - propVariant.Clear(); + prop.Clear(); - if (getPluginProperty(NPlugin::kOptionsClassID, &propVariant) != S_OK) + if (getPluginProperty(NPlugin::kOptionsClassID, &prop) != S_OK) return false; - if (propVariant.vt == VT_EMPTY) + if (prop.vt == VT_EMPTY) pluginInfo.OptionsClassIDDefined = false; - else if (propVariant.vt != VT_BSTR) + else if (prop.vt != VT_BSTR) return false; else { pluginInfo.OptionsClassIDDefined = true; - pluginInfo.OptionsClassID = *(const GUID *)propVariant.bstrVal; + pluginInfo.OptionsClassID = *(const GUID *)prop.bstrVal; } - propVariant.Clear(); + prop.Clear(); - if (getPluginProperty(NPlugin::kType, &propVariant) != S_OK) + if (getPluginProperty(NPlugin::kType, &prop) != S_OK) return false; - if (propVariant.vt == VT_EMPTY) + if (prop.vt == VT_EMPTY) pluginInfo.Type = kPluginTypeFF; - else if (propVariant.vt == VT_UI4) - pluginInfo.Type = (EPluginType)propVariant.ulVal; + else if (prop.vt == VT_UI4) + pluginInfo.Type = (EPluginType)prop.ulVal; else return false; return true; @@ -103,11 +97,12 @@ void ReadPluginInfoList(CObjectVector<CPluginInfo> &plugins) { plugins.Clear(); - UString baseFolderPrefix = GetProgramFolderPrefix(); + UString baseFolderPrefix; + GetProgramFolderPath(baseFolderPrefix); { CPluginInfo pluginInfo; pluginInfo.FilePath = baseFolderPrefix + L"7-zip.dll"; - if (::ReadPluginInfo(pluginInfo)) + if (::ReadPluginInfo(pluginInfo, false)) plugins.Add(pluginInfo); } UString folderPath = baseFolderPrefix + L"Plugins" WSTRING_PATH_SEPARATOR; @@ -119,7 +114,7 @@ void ReadPluginInfoList(CObjectVector<CPluginInfo> &plugins) continue; CPluginInfo pluginInfo; pluginInfo.FilePath = folderPath + fileInfo.Name; - if (::ReadPluginInfo(pluginInfo)) + if (::ReadPluginInfo(pluginInfo, true)) plugins.Add(pluginInfo); } } diff --git a/CPP/7zip/UI/FileManager/RegistryUtils.cpp b/CPP/7zip/UI/FileManager/RegistryUtils.cpp index bd1248a2..6697169b 100755 --- a/CPP/7zip/UI/FileManager/RegistryUtils.cpp +++ b/CPP/7zip/UI/FileManager/RegistryUtils.cpp @@ -11,7 +11,7 @@ using namespace NWindows; using namespace NRegistry; -#define REG_PATH_7Z TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-ZIP") +#define REG_PATH_7Z TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") static const TCHAR *kCUBasePath = REG_PATH_7Z; static const TCHAR *kCU_FMPath = REG_PATH_7Z TEXT(STRING_PATH_SEPARATOR) TEXT("FM"); @@ -29,7 +29,7 @@ static const TCHAR *kShowGrid = TEXT("ShowGrid"); static const TCHAR *kAlternativeSelection = TEXT("AlternativeSelection"); // static const TCHAR *kLockMemoryAdd = TEXT("LockMemoryAdd"); static const TCHAR *kLargePagesEnable = TEXT("LargePages"); -// static const TCHAR *kSingleClick = TEXT("SingleClick"); +static const TCHAR *kSingleClick = TEXT("SingleClick"); // static const TCHAR *kUnderline = TEXT("Underline"); static const TCHAR *kFlatViewName = TEXT("FlatViewArc"); @@ -135,10 +135,10 @@ bool ReadShowGrid(){ return ReadOption(kShowGrid, false); } void SaveAlternativeSelection(bool enable) { SaveOption(kAlternativeSelection, enable); } bool ReadAlternativeSelection(){ return ReadOption(kAlternativeSelection, false); } -/* void SaveSingleClick(bool enable) { SaveOption(kSingleClick, enable); } bool ReadSingleClick(){ return ReadOption(kSingleClick, false); } +/* void SaveUnderline(bool enable) { SaveOption(kUnderline, enable); } bool ReadUnderline(){ return ReadOption(kUnderline, false); } */ diff --git a/CPP/7zip/UI/FileManager/RegistryUtils.h b/CPP/7zip/UI/FileManager/RegistryUtils.h index 5469f401..3bf06617 100755 --- a/CPP/7zip/UI/FileManager/RegistryUtils.h +++ b/CPP/7zip/UI/FileManager/RegistryUtils.h @@ -4,6 +4,7 @@ #define __REGISTRY_UTILS_H #include "Common/MyString.h" +#include "Common/Types.h" void SaveRegLang(const UString &path); void ReadRegLang(UString &path); @@ -38,10 +39,10 @@ bool ReadAlternativeSelection(); bool ReadLockMemoryEnable(); void SaveLockMemoryEnable(bool enable); -/* void SaveSingleClick(bool enable); bool ReadSingleClick(); +/* void SaveUnderline(bool enable); bool ReadUnderline(); */ diff --git a/CPP/7zip/UI/FileManager/RootFolder.cpp b/CPP/7zip/UI/FileManager/RootFolder.cpp index ea6f5080..1f4886d2 100755 --- a/CPP/7zip/UI/FileManager/RootFolder.cpp +++ b/CPP/7zip/UI/FileManager/RootFolder.cpp @@ -4,14 +4,17 @@ #include "Common/StringConvert.h" +#include "Windows/DLL.h" #include "Windows/PropVariant.h" #include "../../PropID.h" -#include "FSDrives.h" #include "FSFolder.h" #include "LangUtils.h" +#ifndef UNDER_CE #include "NetFolder.h" +#include "FSDrives.h" +#endif #include "RootFolder.h" #include "SysIconUtils.h" @@ -26,7 +29,11 @@ static const STATPROPSTG kProps[] = UString RootFolder_GetName_Computer(int &iconIndex) { + #ifdef UNDER_CE + GetRealIconIndex(L"\\", FILE_ATTRIBUTE_DIRECTORY, iconIndex); + #else iconIndex = GetIconIndexForCSIDL(CSIDL_DRIVES); + #endif return LangString(IDS_COMPUTER, 0x03020300); } @@ -42,20 +49,29 @@ UString RootFolder_GetName_Documents(int &iconIndex) return LangString(IDS_DOCUMENTS, 0x03020302); ; } -const int ROOT_INDEX_COMPUTER = 0; -const int ROOT_INDEX_DOCUMENTS = 1; -const int ROOT_INDEX_NETWORK = 2; -const int ROOT_INDEX_VOLUMES = 3; +enum +{ + ROOT_INDEX_COMPUTER = 0 + #ifndef UNDER_CE + , ROOT_INDEX_DOCUMENTS + , ROOT_INDEX_NETWORK + , ROOT_INDEX_VOLUMES + #endif +}; -static const wchar_t *kVolPrefix = L"\\\\.\\"; +#ifndef UNDER_CE +static const wchar_t *kVolPrefix = L"\\\\."; +#endif void CRootFolder::Init() { _names[ROOT_INDEX_COMPUTER] = RootFolder_GetName_Computer(_iconIndices[ROOT_INDEX_COMPUTER]); + #ifndef UNDER_CE _names[ROOT_INDEX_DOCUMENTS] = RootFolder_GetName_Documents(_iconIndices[ROOT_INDEX_DOCUMENTS]); _names[ROOT_INDEX_NETWORK] = RootFolder_GetName_Network(_iconIndices[ROOT_INDEX_NETWORK]); _names[ROOT_INDEX_VOLUMES] = kVolPrefix; _iconIndices[ROOT_INDEX_VOLUMES] = GetIconIndexForCSIDL(CSIDL_DRIVES); + #endif }; STDMETHODIMP CRootFolder::LoadItems() @@ -90,7 +106,11 @@ UString GetMyDocsPath() UString us; WCHAR s[MAX_PATH + 1]; SHGetSpecialFolderPathWp getW = (SHGetSpecialFolderPathWp) - ::GetProcAddress(::GetModuleHandleA("shell32.dll"), "SHGetSpecialFolderPathW"); + #ifdef UNDER_CE + My_GetProcAddress(GetModuleHandle(TEXT("coredll.dll")), "SHGetSpecialFolderPath"); + #else + My_GetProcAddress(GetModuleHandle(TEXT("shell32.dll")), "SHGetSpecialFolderPathW"); + #endif if (getW && getW(0, s, CSIDL_PERSONAL, FALSE)) us = s; #ifndef _UNICODE @@ -112,6 +132,14 @@ STDMETHODIMP CRootFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolde { *resultFolder = NULL; CMyComPtr<IFolderFolder> subFolder; + #ifdef UNDER_CE + if (index == ROOT_INDEX_COMPUTER) + { + NFsFolder::CFSFolder *fsFolder = new NFsFolder::CFSFolder; + subFolder = fsFolder; + fsFolder->InitToRoot(); + } + #else if (index == ROOT_INDEX_COMPUTER || index == ROOT_INDEX_VOLUMES) { CFSDrives *fsDrivesSpec = new CFSDrives; @@ -134,6 +162,7 @@ STDMETHODIMP CRootFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolde RINOK(fsFolderSpec->Init(s, NULL)); } } + #endif else return E_INVALIDARG; *resultFolder = subFolder.Detach(); @@ -161,9 +190,14 @@ STDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resu for (int i = 0; i < kNumRootFolderItems; i++) if (AreEqualNames(name2, _names[i])) return BindToFolder((UInt32)i, resultFolder); + #ifdef UNDER_CE + if (name2 == L"\\") + return BindToFolder((UInt32)ROOT_INDEX_COMPUTER, resultFolder); + #else if (AreEqualNames(name2, L"My Documents") || AreEqualNames(name2, L"Documents")) return BindToFolder((UInt32)ROOT_INDEX_DOCUMENTS, resultFolder); + #endif if (AreEqualNames(name2, L"My Computer") || AreEqualNames(name2, L"Computer")) return BindToFolder((UInt32)ROOT_INDEX_COMPUTER, resultFolder); @@ -179,6 +213,7 @@ STDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resu CMyComPtr<IFolderFolder> subFolder; + #ifndef UNDER_CE if (name2.Left(4) == kVolPrefix) { CFSDrives *folderSpec = new CFSDrives; @@ -186,6 +221,7 @@ STDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resu folderSpec->Init(true); } else + #endif { if (name2[name2.Length () - 1] != WCHAR_PATH_SEPARATOR) name2 += WCHAR_PATH_SEPARATOR; @@ -193,6 +229,7 @@ STDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resu subFolder = fsFolderSpec; if (fsFolderSpec->Init(name2, 0) != S_OK) { + #ifndef UNDER_CE if (name2[0] == WCHAR_PATH_SEPARATOR) { CNetFolder *netFolderSpec = new CNetFolder; @@ -200,6 +237,7 @@ STDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resu netFolderSpec->Init(name2); } else + #endif return E_INVALIDARG; } } diff --git a/CPP/7zip/UI/FileManager/RootFolder.h b/CPP/7zip/UI/FileManager/RootFolder.h index 9f08e601..21d74db8 100755 --- a/CPP/7zip/UI/FileManager/RootFolder.h +++ b/CPP/7zip/UI/FileManager/RootFolder.h @@ -7,7 +7,13 @@ #include "IFolder.h" -const int kNumRootFolderItems = 4; +const int kNumRootFolderItems = + #ifdef UNDER_CE + 1 + #else + 4 + #endif + ; class CRootFolder: public IFolderFolder, diff --git a/CPP/7zip/UI/FileManager/SettingsPage.cpp b/CPP/7zip/UI/FileManager/SettingsPage.cpp index 8b2eb836..f6694c56 100755 --- a/CPP/7zip/UI/FileManager/SettingsPage.cpp +++ b/CPP/7zip/UI/FileManager/SettingsPage.cpp @@ -1,18 +1,20 @@ // SettingsPage.cpp #include "StdAfx.h" -#include "SettingsPageRes.h" -#include "SettingsPage.h" #include "Common/StringConvert.h" -#include "Windows/Defs.h" +#ifndef UNDER_CE #include "Windows/MemoryLock.h" +#endif -#include "RegistryUtils.h" #include "HelpUtils.h" #include "LangUtils.h" #include "ProgramLocation.h" +#include "RegistryUtils.h" +#include "SettingsPage.h" + +#include "SettingsPageRes.h" using namespace NWindows; @@ -48,7 +50,7 @@ bool CSettingsPage::OnInit() CheckButton(IDC_SETTINGS_LARGE_PAGES, ReadLockMemoryEnable()); else EnableItem(IDC_SETTINGS_LARGE_PAGES, false); - // CheckButton(IDC_SETTINGS_SINGLE_CLICK, ReadSingleClick()); + CheckButton(IDC_SETTINGS_SINGLE_CLICK, ReadSingleClick()); // CheckButton(IDC_SETTINGS_UNDERLINE, ReadUnderline()); // EnableSubItems(); @@ -72,14 +74,16 @@ LONG CSettingsPage::OnApply() SaveFullRow(IsButtonCheckedBool(IDC_SETTINGS_FULL_ROW)); SaveShowGrid(IsButtonCheckedBool(IDC_SETTINGS_SHOW_GRID)); SaveAlternativeSelection(IsButtonCheckedBool(IDC_SETTINGS_ALTERNATIVE_SELECTION)); + #ifndef UNDER_CE if (IsLargePageSupported()) { bool enable = IsButtonCheckedBool(IDC_SETTINGS_LARGE_PAGES); NSecurity::EnableLockMemoryPrivilege(enable); SaveLockMemoryEnable(enable); } + #endif - // SaveSingleClick(IsButtonCheckedBool(IDC_SETTINGS_SINGLE_CLICK)); + SaveSingleClick(IsButtonCheckedBool(IDC_SETTINGS_SINGLE_CLICK)); // SaveUnderline(IsButtonCheckedBool(IDC_SETTINGS_UNDERLINE)); return PSNRET_NOERROR; @@ -94,8 +98,8 @@ bool CSettingsPage::OnButtonClicked(int buttonID, HWND buttonHWND) { switch(buttonID) { - /* case IDC_SETTINGS_SINGLE_CLICK: + /* EnableSubItems(); break; */ diff --git a/CPP/7zip/UI/FileManager/SettingsPage.rc b/CPP/7zip/UI/FileManager/SettingsPage.rc index 1d0e709b..3e4a611e 100755 --- a/CPP/7zip/UI/FileManager/SettingsPage.rc +++ b/CPP/7zip/UI/FileManager/SettingsPage.rc @@ -1,35 +1,22 @@ #include "SettingsPageRes.h" #include "../../GuiCommon.rc" -#define xSize2 196 -#define ySize2 140 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) - - -IDD_SETTINGS DIALOG 0, 0, xSize, ySize MY_PAGE_STYLE -CAPTION "Settings" -MY_FONT -BEGIN - CONTROL "Show "".."" item", IDC_SETTINGS_SHOW_DOTS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, marg, xSize2, 10 - CONTROL "Show real file &icons", IDC_SETTINGS_SHOW_REAL_FILE_ICONS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, 21, xSize2, 10 - CONTROL "Show system &menu", IDC_SETTINGS_SHOW_SYSTEM_MENU, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, 35, xSize2, 10 - CONTROL "&Full row select", IDC_SETTINGS_FULL_ROW, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, 63, xSize2, 10 - CONTROL "Show &grid lines", IDC_SETTINGS_SHOW_GRID, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, 77, xSize2, 10 - CONTROL "&Single-click to open an item", IDC_SETTINGS_SINGLE_CLICK, "Button", BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP, - marg, 91, xSize2, 10 - CONTROL "&Underline current name", IDC_SETTINGS_UNDERLINE, "Button", BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP, - marg + 12, 105, xSize2 - 12, 10 - - CONTROL "&Alternative selection mode", IDC_SETTINGS_ALTERNATIVE_SELECTION, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, 122, xSize2, 10 - - CONTROL "Use &large memory pages", IDC_SETTINGS_LARGE_PAGES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - marg, 142, xSize2, 10 - -END +#define xc 200 +#define yc 120 + +IDD_SETTINGS MY_PAGE +#include "SettingsPage2.rc" + + +#ifdef UNDER_CE + +#undef m +#undef xc + +#define m 4 +#define xc (SMALL_PAGE_SIZE_X + 8) + +IDD_SETTINGS_2 MY_PAGE +#include "SettingsPage2.rc" + +#endif diff --git a/CPP/7zip/UI/FileManager/SettingsPage2.rc b/CPP/7zip/UI/FileManager/SettingsPage2.rc new file mode 100755 index 00000000..c920120e --- /dev/null +++ b/CPP/7zip/UI/FileManager/SettingsPage2.rc @@ -0,0 +1,24 @@ +CAPTION "Settings" +BEGIN + CONTROL "Show "".."" item", IDC_SETTINGS_SHOW_DOTS, MY_CHECKBOX, + m, 8, xc, 10 + CONTROL "Show real file &icons", IDC_SETTINGS_SHOW_REAL_FILE_ICONS, MY_CHECKBOX, + m, 22, xc, 10 + CONTROL "Show system &menu", IDC_SETTINGS_SHOW_SYSTEM_MENU, MY_CHECKBOX, + m, 36, xc, 10 + CONTROL "&Full row select", IDC_SETTINGS_FULL_ROW, MY_CHECKBOX, + m, 50, xc, 10 + CONTROL "Show &grid lines", IDC_SETTINGS_SHOW_GRID, MY_CHECKBOX, + m, 64, xc, 10 + CONTROL "&Single-click to open an item", IDC_SETTINGS_SINGLE_CLICK, MY_CHECKBOX, + m, 78, xc, 10 + /* + CONTROL "&Underline current name", IDC_SETTINGS_UNDERLINE, "Button", BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP, + m + 12, 92, xc - 12, 10 + */ + + CONTROL "&Alternative selection mode", IDC_SETTINGS_ALTERNATIVE_SELECTION, MY_CHECKBOX, + m, 92, xc, 10 + CONTROL "Use &large memory pages", IDC_SETTINGS_LARGE_PAGES, MY_CHECKBOX, + m, 106, xc, 10 +END diff --git a/CPP/7zip/UI/FileManager/SettingsPageRes.h b/CPP/7zip/UI/FileManager/SettingsPageRes.h index 8932dc0e..b6c7f5cc 100755 --- a/CPP/7zip/UI/FileManager/SettingsPageRes.h +++ b/CPP/7zip/UI/FileManager/SettingsPageRes.h @@ -1,4 +1,6 @@ -#define IDD_SETTINGS 904 +#define IDD_SETTINGS 543 +#define IDD_SETTINGS_2 643 + #define IDC_SETTINGS_SHOW_DOTS 1000 #define IDC_SETTINGS_SHOW_REAL_FILE_ICONS 1001 diff --git a/CPP/7zip/UI/FileManager/SplitDialog.cpp b/CPP/7zip/UI/FileManager/SplitDialog.cpp index bab319d1..5dca8e48 100755 --- a/CPP/7zip/UI/FileManager/SplitDialog.cpp +++ b/CPP/7zip/UI/FileManager/SplitDialog.cpp @@ -1,18 +1,18 @@ // SplitDialog.cpp #include "StdAfx.h" -#include "SplitDialog.h" -#include "Common/StringToInt.h" -#include "Windows/Shell.h" #include "Windows/FileName.h" -#include "SplitUtils.h" #ifdef LANG #include "LangUtils.h" #endif +#include "BrowseDialog.h" #include "CopyDialogRes.h" +#include "SplitDialog.h" +#include "SplitUtils.h" +#include "resourceGui.h" using namespace NWindows; @@ -45,9 +45,36 @@ bool CSplitDialog::OnInit() _pathCombo.SetText(Path); AddVolumeItems(_volumeCombo); _volumeCombo.SetCurSel(0); + NormalizeSize(); return CModalDialog::OnInit(); } +bool CSplitDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize) +{ + int mx, my; + GetMargins(8, mx, my); + int bx1, bx2, by; + GetItemSizes(IDCANCEL, bx1, by); + GetItemSizes(IDOK, bx2, by); + int yPos = ySize - my - by; + int xPos = xSize - mx - bx1; + + InvalidateRect(NULL); + + { + RECT rect; + GetClientRectOfItem(IDC_BUTTON_SPLIT_PATH, rect); + int bx = rect.right - rect.left; + MoveItem(IDC_BUTTON_SPLIT_PATH, xSize - mx - bx, rect.top, bx, rect.bottom - rect.top); + ChangeSubWindowSizeX(_pathCombo, xSize - mx - mx - bx - mx); + } + + MoveItem(IDCANCEL, xPos, yPos, bx1, by); + MoveItem(IDOK, xPos - mx - bx2, yPos, bx2, by); + + return false; +} + bool CSplitDialog::OnButtonClicked(int buttonID, HWND buttonHWND) { switch(buttonID) @@ -67,7 +94,7 @@ void CSplitDialog::OnButtonSetPath() UString title = LangStringSpec(IDS_SET_FOLDER, 0x03020209); UString resultPath; - if (!NShell::BrowseForFolder(HWND(*this), title, currentPath, resultPath)) + if (!MyBrowseForFolder(HWND(*this), title, currentPath, resultPath)) return; NFile::NName::NormalizeDirPathPrefix(resultPath); _pathCombo.SetCurSel(-1); @@ -82,7 +109,7 @@ void CSplitDialog::OnOK() volumeString.Trim(); if (!ParseVolumeSizes(volumeString, VolumeSizes) || VolumeSizes.Size() == 0) { - ::MessageBoxW(*this, LangString(IDS_COMPRESS_INCORRECT_VOLUME_SIZE, 0x02000D41), L"7-Zip", 0); + ::MessageBoxW(*this, LangString(IDS_INCORRECT_VOLUME_SIZE, 0x02000D41), L"7-Zip", 0); return; } CModalDialog::OnOK(); diff --git a/CPP/7zip/UI/FileManager/SplitDialog.h b/CPP/7zip/UI/FileManager/SplitDialog.h index 607a3daf..33fb64e7 100755 --- a/CPP/7zip/UI/FileManager/SplitDialog.h +++ b/CPP/7zip/UI/FileManager/SplitDialog.h @@ -1,11 +1,11 @@ // SplitDialog.h -#ifndef __SPLITDIALOG_H -#define __SPLITDIALOG_H +#ifndef __SPLIT_DIALOG_H +#define __SPLIT_DIALOG_H -#include "Common/Types.h" #include "Windows/Control/Dialog.h" #include "Windows/Control/ComboBox.h" + #include "SplitDialogRes.h" class CSplitDialog: public NWindows::NControl::CModalDialog @@ -14,6 +14,7 @@ class CSplitDialog: public NWindows::NControl::CModalDialog NWindows::NControl::CComboBox _volumeCombo; virtual void OnOK(); virtual bool OnInit(); + virtual bool OnSize(WPARAM wParam, int xSize, int ySize); virtual bool OnButtonClicked(int buttonID, HWND buttonHWND); void OnButtonSetPath(); public: diff --git a/CPP/7zip/UI/FileManager/SplitDialog.rc b/CPP/7zip/UI/FileManager/SplitDialog.rc index 7e78daaf..e977d651 100755 --- a/CPP/7zip/UI/FileManager/SplitDialog.rc +++ b/CPP/7zip/UI/FileManager/SplitDialog.rc @@ -1,32 +1,16 @@ #include "SplitDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 223 -#define ySize2 89 +#define xc 288 +#define yc 96 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) - -#define bYPos (ySize - marg - bYSize) -#define b1XPos (xSize - marg - bXSize) -#define b2XPos (b1XPos - 10 - bXSize) - - - -IDD_DIALOG_SPLIT DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +IDD_DIALOG_SPLIT MY_RESIZE_DIALOG CAPTION "Split File" -MY_FONT -BEGIN - LTEXT "&Split to:", IDC_STATIC_SPLIT_PATH, marg, marg, xSize2, 8 - COMBOBOX IDC_COMBO_SPLIT_PATH, marg, 18, xSize2 - bDotsSize - 12, 126, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...", IDC_BUTTON_SPLIT_PATH, xSize - marg - bDotsSize, 17, bDotsSize, bYSize, WS_GROUP - LTEXT "Split to &volumes, bytes:", IDC_STATIC_SPLIT_VOLUME, marg, 38, xSize2, 8 - COMBOBOX IDC_COMBO_SPLIT_VOLUME, marg, 50, 120, 52, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK", IDOK, b2XPos, bYPos, bXSize, bYSize - PUSHBUTTON "Cancel", IDCANCEL, b1XPos, bYPos, bXSize, bYSize -END - -STRINGTABLE BEGIN - IDS_COMPRESS_INCORRECT_VOLUME_SIZE "Incorrect volume size" + LTEXT "&Split to:", IDC_STATIC_SPLIT_PATH, m, m, xc, 8 + COMBOBOX IDC_COMBO_SPLIT_PATH, m, 20, xc - bxsDots - m, 64, MY_COMBO_WITH_EDIT + PUSHBUTTON "...", IDC_BUTTON_SPLIT_PATH, xs - m - bxsDots, 18, bxsDots, bys, WS_GROUP + LTEXT "Split to &volumes, bytes:", IDC_STATIC_SPLIT_VOLUME, m, 44, xc, 8 + COMBOBOX IDC_COMBO_SPLIT_VOLUME, m, 56, 96, 52, MY_COMBO_WITH_EDIT + OK_CANCEL END diff --git a/CPP/7zip/UI/FileManager/SplitDialogRes.h b/CPP/7zip/UI/FileManager/SplitDialogRes.h index 019b7029..a6f06d1c 100755 --- a/CPP/7zip/UI/FileManager/SplitDialogRes.h +++ b/CPP/7zip/UI/FileManager/SplitDialogRes.h @@ -5,4 +5,3 @@ #define IDC_STATIC_SPLIT_VOLUME 1010 #define IDC_COMBO_SPLIT_VOLUME 1011 -#define IDS_COMPRESS_INCORRECT_VOLUME_SIZE 95 diff --git a/CPP/7zip/UI/FileManager/SplitUtils.cpp b/CPP/7zip/UI/FileManager/SplitUtils.cpp index 3a7635fa..8bae0573 100755 --- a/CPP/7zip/UI/FileManager/SplitUtils.cpp +++ b/CPP/7zip/UI/FileManager/SplitUtils.cpp @@ -59,10 +59,11 @@ bool ParseVolumeSizes(const UString &s, CRecordVector<UInt64> &values) void AddVolumeItems(NWindows::NControl::CComboBox &volumeCombo) { - volumeCombo.AddString(TEXT("1457664 - 3.5\" floppy")); + volumeCombo.AddString(TEXT("10M")); volumeCombo.AddString(TEXT("650M - CD")); volumeCombo.AddString(TEXT("700M - CD")); volumeCombo.AddString(TEXT("4480M - DVD")); + volumeCombo.AddString(TEXT("1457664 - 3.5\" floppy")); } UInt64 GetNumberOfVolumes(UInt64 size, CRecordVector<UInt64> &volSizes) diff --git a/CPP/7zip/UI/FileManager/SysIconUtils.cpp b/CPP/7zip/UI/FileManager/SysIconUtils.cpp index 3e5de7aa..e359ed2b 100755 --- a/CPP/7zip/UI/FileManager/SysIconUtils.cpp +++ b/CPP/7zip/UI/FileManager/SysIconUtils.cpp @@ -1,12 +1,13 @@ -// SysIconUtils.h +// SysIconUtils.cpp #include "StdAfx.h" -#include "SysIconUtils.h" #ifndef _UNICODE #include "Common/StringConvert.h" #endif +#include "SysIconUtils.h" + #ifndef _UNICODE extern bool g_IsNT; #endif @@ -18,7 +19,7 @@ int GetIconIndexForCSIDL(int csidl) if (pidl) { SHFILEINFO shellInfo; - SHGetFileInfo(LPCTSTR(pidl), FILE_ATTRIBUTE_NORMAL, + SHGetFileInfo(LPCTSTR(pidl), FILE_ATTRIBUTE_NORMAL, &shellInfo, sizeof(shellInfo), SHGFI_PIDL | SHGFI_SYSICONINDEX); IMalloc *pMalloc; @@ -33,10 +34,10 @@ int GetIconIndexForCSIDL(int csidl) return 0; } -DWORD_PTR GetRealIconIndex(LPCTSTR path, DWORD attributes, int &iconIndex) +DWORD_PTR GetRealIconIndex(LPCTSTR path, DWORD attrib, int &iconIndex) { SHFILEINFO shellInfo; - DWORD_PTR res = ::SHGetFileInfo(path, FILE_ATTRIBUTE_NORMAL | attributes, &shellInfo, + DWORD_PTR res = ::SHGetFileInfo(path, FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo, sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX); iconIndex = shellInfo.iIcon; return res; @@ -44,7 +45,7 @@ DWORD_PTR GetRealIconIndex(LPCTSTR path, DWORD attributes, int &iconIndex) #ifndef _UNICODE -typedef int (WINAPI * SHGetFileInfoWP)(LPCWSTR pszPath, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags); +typedef int (WINAPI * SHGetFileInfoWP)(LPCWSTR pszPath, DWORD attrib, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags); struct CSHGetFileInfoInit { @@ -57,36 +58,36 @@ struct CSHGetFileInfoInit } g_SHGetFileInfoInit; #endif -DWORD_PTR MySHGetFileInfoW(LPCWSTR pszPath, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags) +static DWORD_PTR MySHGetFileInfoW(LPCWSTR pszPath, DWORD attrib, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags) { #ifdef _UNICODE - return SHGetFileInfoW( + return SHGetFileInfo( #else if (g_SHGetFileInfoInit.shGetFileInfoW == 0) return 0; return g_SHGetFileInfoInit.shGetFileInfoW( #endif - pszPath, dwFileAttributes, psfi, cbFileInfo, uFlags); + pszPath, attrib, psfi, cbFileInfo, uFlags); } #ifndef _UNICODE // static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } -DWORD_PTR GetRealIconIndex(LPCWSTR path, DWORD attributes, int &iconIndex) +DWORD_PTR GetRealIconIndex(LPCWSTR path, DWORD attrib, int &iconIndex) { if(g_IsNT) { SHFILEINFOW shellInfo; - DWORD_PTR res = ::MySHGetFileInfoW(path, FILE_ATTRIBUTE_NORMAL | attributes, &shellInfo, + DWORD_PTR res = ::MySHGetFileInfoW(path, FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo, sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX); iconIndex = shellInfo.iIcon; return res; } else - return GetRealIconIndex(UnicodeStringToMultiByte(path), attributes, iconIndex); + return GetRealIconIndex(UnicodeStringToMultiByte(path), attrib, iconIndex); } #endif -DWORD_PTR GetRealIconIndex(const UString &fileName, DWORD attributes, +DWORD_PTR GetRealIconIndex(const UString &fileName, DWORD attrib, int &iconIndex, UString &typeName) { #ifndef _UNICODE @@ -94,9 +95,8 @@ DWORD_PTR GetRealIconIndex(const UString &fileName, DWORD attributes, { SHFILEINFO shellInfo; shellInfo.szTypeName[0] = 0; - DWORD_PTR res = ::SHGetFileInfoA(GetSystemString(fileName), FILE_ATTRIBUTE_NORMAL | attributes, &shellInfo, - sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX - | SHGFI_TYPENAME); + DWORD_PTR res = ::SHGetFileInfoA(GetSystemString(fileName), FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo, + sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME); typeName = GetUnicodeString(shellInfo.szTypeName); iconIndex = shellInfo.iIcon; return res; @@ -106,49 +106,54 @@ DWORD_PTR GetRealIconIndex(const UString &fileName, DWORD attributes, { SHFILEINFOW shellInfo; shellInfo.szTypeName[0] = 0; - DWORD_PTR res = ::MySHGetFileInfoW(fileName, FILE_ATTRIBUTE_NORMAL | attributes, &shellInfo, - sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX - | SHGFI_TYPENAME); + DWORD_PTR res = ::MySHGetFileInfoW(fileName, FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo, + sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME); typeName = shellInfo.szTypeName; iconIndex = shellInfo.iIcon; return res; } } -int CExtToIconMap::GetIconIndex(UINT32 attributes, const UString &fileNameSpec, UString &typeName) +int CExtToIconMap::GetIconIndex(DWORD attrib, const UString &fileName, UString &typeName) { - UString fileName = fileNameSpec; - if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) + int dotPos = fileName.ReverseFind(L'.'); + if ((attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 || dotPos < 0) { - fileName = L"__Fldr__"; - if (_dirIconIndex < 0) - GetRealIconIndex(fileName, attributes, _dirIconIndex, _dirTypeName); - typeName = _dirTypeName; - return _dirIconIndex; + CAttribIconPair pair; + pair.Attrib = attrib; + int index = _attribMap.FindInSorted(pair); + if (index >= 0) + { + typeName = _attribMap[index].TypeName; + return _attribMap[index].IconIndex; + } + GetRealIconIndex( + #ifdef UNDER_CE + L"\\" + #endif + L"__File__" + , attrib, pair.IconIndex, pair.TypeName); + _attribMap.AddToSorted(pair); + typeName = pair.TypeName; + return pair.IconIndex; } - int dotPos = fileName.ReverseFind('.'); - if (dotPos < 0) + + CExtIconPair pair; + pair.Ext = fileName.Mid(dotPos + 1); + int index = _extMap.FindInSorted(pair); + if (index >= 0) { - fileName = L"__File__"; - if (_noExtIconIndex < 0) - GetRealIconIndex(fileName, attributes, _noExtIconIndex, _noExtTypeName); - typeName = _noExtTypeName; - return _noExtIconIndex; + typeName = _extMap[index].TypeName; + return _extMap[index].IconIndex; } - CExtIconPair extIconPair; - extIconPair.Ext = fileName.Mid(dotPos + 1); - int anIndex = _map.FindInSorted(extIconPair); - if (anIndex >= 0) - return _map[anIndex].IconIndex; - fileName = fileName.Mid(dotPos); - GetRealIconIndex(fileName, attributes, extIconPair.IconIndex, extIconPair.TypeName); - _map.AddToSorted(extIconPair); - typeName = extIconPair.TypeName; - return extIconPair.IconIndex; + GetRealIconIndex(fileName.Mid(dotPos), attrib, pair.IconIndex, pair.TypeName); + _extMap.AddToSorted(pair); + typeName = pair.TypeName; + return pair.IconIndex; } -int CExtToIconMap::GetIconIndex(UINT32 attributes, const UString &fileName) +int CExtToIconMap::GetIconIndex(DWORD attrib, const UString &fileName) { UString typeName; - return GetIconIndex(attributes, fileName, typeName); + return GetIconIndex(attrib, fileName, typeName); } diff --git a/CPP/7zip/UI/FileManager/SysIconUtils.h b/CPP/7zip/UI/FileManager/SysIconUtils.h index a90d28bc..5ba9c57f 100755 --- a/CPP/7zip/UI/FileManager/SysIconUtils.h +++ b/CPP/7zip/UI/FileManager/SysIconUtils.h @@ -1,7 +1,7 @@ // SysIconUtils.h -#ifndef __SYSICONUTILS_H -#define __SYSICONUTILS_H +#ifndef __SYS_ICON_UTILS_H +#define __SYS_ICON_UTILS_H #include "Common/MyString.h" @@ -10,42 +10,48 @@ struct CExtIconPair UString Ext; int IconIndex; UString TypeName; - }; -inline bool operator==(const CExtIconPair &a1, const CExtIconPair &a2) +struct CAttribIconPair { - return (a1.Ext == a2.Ext); -} + DWORD Attrib; + int IconIndex; + UString TypeName; +}; -inline bool operator<(const CExtIconPair &a1, const CExtIconPair &a2) -{ - return (a1.Ext < a2.Ext); -} +inline bool operator==(const CExtIconPair &a1, const CExtIconPair &a2) { return a1.Ext == a2.Ext; } +inline bool operator< (const CExtIconPair &a1, const CExtIconPair &a2) { return a1.Ext < a2.Ext; } + +inline bool operator==(const CAttribIconPair &a1, const CAttribIconPair &a2) { return a1.Attrib == a2.Attrib; } +inline bool operator< (const CAttribIconPair &a1, const CAttribIconPair &a2) { return a1.Attrib < a2.Attrib; } class CExtToIconMap { - int _dirIconIndex; - UString _dirTypeName; - int _noExtIconIndex; - UString _noExtTypeName; - CObjectVector<CExtIconPair> _map; + CObjectVector<CExtIconPair> _extMap; + CObjectVector<CAttribIconPair> _attribMap; public: - CExtToIconMap(): _dirIconIndex(-1), _noExtIconIndex(-1) {} void Clear() { - _dirIconIndex = -1; - _noExtIconIndex = -1; - _map.Clear(); + _extMap.Clear(); + _attribMap.Clear(); } - int GetIconIndex(UINT32 attributes, const UString &fileName, UString &typeName); - int GetIconIndex(UINT32 attributes, const UString &fileName); + int GetIconIndex(DWORD attrib, const UString &fileName, UString &typeName); + int GetIconIndex(DWORD attrib, const UString &fileName); }; -DWORD_PTR GetRealIconIndex(LPCTSTR path, DWORD attributes, int &iconIndex); +DWORD_PTR GetRealIconIndex(LPCTSTR path, DWORD attrib, int &iconIndex); #ifndef _UNICODE -DWORD_PTR GetRealIconIndex(LPCWSTR path, DWORD attributes, int &iconIndex); +DWORD_PTR GetRealIconIndex(LPCWSTR path, DWORD attrib, int &iconIndex); #endif int GetIconIndexForCSIDL(int csidl); +inline HIMAGELIST GetSysImageList(bool smallIcons) +{ + SHFILEINFO shellInfo; + return (HIMAGELIST)SHGetFileInfo(TEXT(""), + FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY, + &shellInfo, sizeof(shellInfo), + SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | (smallIcons ? SHGFI_SMALLICON : SHGFI_ICON)); +} + #endif diff --git a/CPP/7zip/UI/FileManager/SystemPage.cpp b/CPP/7zip/UI/FileManager/SystemPage.cpp index 1cd7ce15..3681992d 100755 --- a/CPP/7zip/UI/FileManager/SystemPage.cpp +++ b/CPP/7zip/UI/FileManager/SystemPage.cpp @@ -52,11 +52,11 @@ bool CSystemPage::OnInit() _listViewExt.SetExtendedListViewStyle(newFlags, newFlags); _listViewPlugins.SetExtendedListViewStyle(newFlags, newFlags); - _listViewExt.InsertColumn(0, LangString(IDS_PROP_EXTENSION, 0x02000205), 70); + _listViewExt.InsertColumn(0, LangString(IDS_PROP_EXTENSION, 0x02000205), 40); const UString s = LangString(IDS_PLUGIN, 0x03010310); - _listViewExt.InsertColumn(1, s, 70); + _listViewExt.InsertColumn(1, s, 40); - _listViewPlugins.InsertColumn(0, s, 70); + _listViewPlugins.InsertColumn(0, s, 40); _extDatabase.Read(); @@ -77,11 +77,8 @@ bool CSystemPage::OnInit() } // _listViewExt.SortItems(); - if(_listViewExt.GetItemCount() > 0) - { - UINT state = LVIS_SELECTED | LVIS_FOCUSED; - _listViewExt.SetItemState(0, state, state); - } + if (_listViewExt.GetItemCount() > 0) + _listViewExt.SetItemState_FocusedSelected(0); RefreshPluginsList(-1); _initMode = false; @@ -166,7 +163,10 @@ LONG CSystemPage::OnApply() else NRegistryAssociations::DeleteContextMenuHandler(); */ + #ifndef UNDER_CE SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); + WasChanged = true; + #endif return PSNRET_NOERROR; } @@ -370,12 +370,11 @@ void CSystemPage::RefreshPluginsList(int selectIndex) int itemIndex = _listViewPlugins.InsertItem(i, _extDatabase.Plugins[pluginPair.Index].Name); _listViewPlugins.SetCheckState(itemIndex, pluginPair.Enabled); } - if(_listViewPlugins.GetItemCount() > 0) + if (_listViewPlugins.GetItemCount() > 0) { if (selectIndex < 0) selectIndex = 0; - UINT state = LVIS_SELECTED | LVIS_FOCUSED; - _listViewPlugins.SetItemState(selectIndex, state, state); + _listViewPlugins.SetItemState_FocusedSelected(selectIndex); } _initMode = false; } diff --git a/CPP/7zip/UI/FileManager/SystemPage.h b/CPP/7zip/UI/FileManager/SystemPage.h index 1b5891f6..967731fd 100755 --- a/CPP/7zip/UI/FileManager/SystemPage.h +++ b/CPP/7zip/UI/FileManager/SystemPage.h @@ -1,7 +1,7 @@ // SystemPage.h -#ifndef __SYSTEMPAGE_H -#define __SYSTEMPAGE_H +#ifndef __SYSTEM_PAGE_H +#define __SYSTEM_PAGE_H #include "Windows/Control/PropertyPage.h" #include "Windows/Control/ListView.h" @@ -13,7 +13,6 @@ class CSystemPage: public NWindows::NControl::CPropertyPage bool _initMode; CExtDatabase _extDatabase; - // CObjectVector<NZipRootRegistry::CArchiverInfo> m_Archivers; NWindows::NControl::CListView _listViewExt; NWindows::NControl::CListView _listViewPlugins; @@ -26,6 +25,8 @@ class CSystemPage: public NWindows::NControl::CPropertyPage void SelectAll(); public: + bool WasChanged; + CSystemPage(): WasChanged(false) {} virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam); virtual bool OnInit(); virtual void OnNotifyHelp(); diff --git a/CPP/7zip/UI/FileManager/SystemPage.rc b/CPP/7zip/UI/FileManager/SystemPage.rc index 9b4e808d..52e60d19 100755 --- a/CPP/7zip/UI/FileManager/SystemPage.rc +++ b/CPP/7zip/UI/FileManager/SystemPage.rc @@ -1,26 +1,42 @@ #include "SystemPageRes.h" #include "../../GuiCommon.rc" -#define xSize2 196 -#define ySize2 200 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) -#define g0Size xSize2 -#define gYSize (ySize2 - 20 - bYSize) +#define xc 200 +#define yc 200 - -IDD_SYSTEM DIALOG 0, 0, xSize, ySize MY_PAGE_STYLE +IDD_SYSTEM MY_PAGE CAPTION "System" -MY_FONT BEGIN - LTEXT "Associate 7-Zip with:", IDC_SYSTEM_STATIC_ASSOCIATE, marg, marg, xSize2, 8 - CONTROL "List1", IDC_SYSTEM_LIST_ASSOCIATE, "SysListView32", + LTEXT "Associate 7-Zip with:", IDC_SYSTEM_STATIC_ASSOCIATE, m, m, xc, 8 + CONTROL "List1", IDC_SYSTEM_LIST_ASSOCIATE, "SysListView32", LVS_LIST | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, - marg, 20, g0Size, gYSize - PUSHBUTTON "Select all", IDC_SYSTEM_SELECT_ALL, marg, (ySize - marg - bYSize), 90, bYSize + m, m + 12, xc, (yc - m - 12 - 1 - bys) + PUSHBUTTON "Select all", IDC_SYSTEM_SELECT_ALL, m, (ys - m - bys), 90, bys +END + +#ifdef UNDER_CE + +#undef m +#undef xc +#undef yc + +#define m 4 +#define xc (SMALL_PAGE_SIZE_X + 8) +#define yc (128 + 8) +IDD_SYSTEM_2 MY_PAGE +CAPTION "System" +BEGIN + LTEXT "Associate 7-Zip with:", IDC_SYSTEM_STATIC_ASSOCIATE, m, m, xc, 8 + CONTROL "List1", IDC_SYSTEM_LIST_ASSOCIATE, "SysListView32", + LVS_LIST | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + m, m + 12, xc, (yc - m - 12 - 1 - bys - 8) + PUSHBUTTON "Select all", IDC_SYSTEM_SELECT_ALL, m, (ys - m - bys - 8), 90, bys END +#endif + + STRINGTABLE BEGIN IDS_PLUGIN "Plugin" diff --git a/CPP/7zip/UI/FileManager/SystemPageRes.h b/CPP/7zip/UI/FileManager/SystemPageRes.h index 8dce778b..b60b4533 100755 --- a/CPP/7zip/UI/FileManager/SystemPageRes.h +++ b/CPP/7zip/UI/FileManager/SystemPageRes.h @@ -1,4 +1,5 @@ -#define IDD_SYSTEM 902 +#define IDD_SYSTEM 540 +#define IDD_SYSTEM_2 640 #define IDS_PLUGIN 990 // #define IDC_SYSTEM_INTEGRATE_TO_CONTEXT_MENU 1010 #define IDC_SYSTEM_STATIC_ASSOCIATE 1020 diff --git a/CPP/7zip/UI/FileManager/UpdateCallback100.cpp b/CPP/7zip/UI/FileManager/UpdateCallback100.cpp index 3701d2bb..43dfa4dc 100755 --- a/CPP/7zip/UI/FileManager/UpdateCallback100.cpp +++ b/CPP/7zip/UI/FileManager/UpdateCallback100.cpp @@ -2,73 +2,56 @@ #include "StdAfx.h" -#include "MessagesDialog.h" #include "PasswordDialog.h" #include "UpdateCallback100.h" -CUpdateCallback100Imp::~CUpdateCallback100Imp() -{ - if (ShowMessages && !Messages.IsEmpty()) - { - CMessagesDialog messagesDialog; - messagesDialog.Messages = &Messages; - messagesDialog.Create(_parentWindow); - } -} - -void CUpdateCallback100Imp::AddErrorMessage(LPCWSTR message) -{ - Messages.Add(message); -} - STDMETHODIMP CUpdateCallback100Imp::SetNumFiles(UInt64 numFiles) { - ProgressDialog.ProgressSynch.SetNumFilesTotal(numFiles); + ProgressDialog->Sync.SetNumFilesTotal(numFiles); return S_OK; } STDMETHODIMP CUpdateCallback100Imp::SetTotal(UInt64 size) { - ProgressDialog.ProgressSynch.SetProgress(size, 0); + ProgressDialog->Sync.SetProgress(size, 0); return S_OK; } STDMETHODIMP CUpdateCallback100Imp::SetCompleted(const UInt64 *completeValue) { - RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause()); + RINOK(ProgressDialog->Sync.ProcessStopAndPause()); if (completeValue != NULL) - ProgressDialog.ProgressSynch.SetPos(*completeValue); + ProgressDialog->Sync.SetPos(*completeValue); return S_OK; } STDMETHODIMP CUpdateCallback100Imp::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) { - ProgressDialog.ProgressSynch.SetRatioInfo(inSize, outSize); + ProgressDialog->Sync.SetRatioInfo(inSize, outSize); return S_OK; } STDMETHODIMP CUpdateCallback100Imp::CompressOperation(const wchar_t *name) { - ProgressDialog.ProgressSynch.SetCurrentFileName(name); + ProgressDialog->Sync.SetCurrentFileName(name); return S_OK; } STDMETHODIMP CUpdateCallback100Imp::DeleteOperation(const wchar_t *name) { - ProgressDialog.ProgressSynch.SetCurrentFileName(name); + ProgressDialog->Sync.SetCurrentFileName(name); return S_OK; } STDMETHODIMP CUpdateCallback100Imp::OperationResult(Int32 /* operationResult */) { - NumFiles++; - ProgressDialog.ProgressSynch.SetNumFilesCur(NumFiles); + ProgressDialog->Sync.SetNumFilesCur(++_numFiles); return S_OK; } STDMETHODIMP CUpdateCallback100Imp::UpdateErrorMessage(const wchar_t *message) { - AddErrorMessage(message); + ProgressDialog->Sync.AddErrorMessage(message); return S_OK; } @@ -88,7 +71,7 @@ STDMETHODIMP CUpdateCallback100Imp::SetTotal(const UInt64 * /* files */, const U STDMETHODIMP CUpdateCallback100Imp::SetCompleted(const UInt64 * /* files */, const UInt64 * /* bytes */) { - return ProgressDialog.ProgressSynch.ProcessStopAndPause(); + return ProgressDialog->Sync.ProcessStopAndPause(); } STDMETHODIMP CUpdateCallback100Imp::CryptoGetTextPassword(BSTR *password) @@ -97,7 +80,8 @@ STDMETHODIMP CUpdateCallback100Imp::CryptoGetTextPassword(BSTR *password) if (!_passwordIsDefined) { CPasswordDialog dialog; - if (dialog.Create(_parentWindow) == IDCANCEL) + ProgressDialog->WaitCreating(); + if (dialog.Create(*ProgressDialog) == IDCANCEL) return E_ABORT; _password = dialog.Password; _passwordIsDefined = true; diff --git a/CPP/7zip/UI/FileManager/UpdateCallback100.h b/CPP/7zip/UI/FileManager/UpdateCallback100.h index 5ae194a2..aa13320f 100755 --- a/CPP/7zip/UI/FileManager/UpdateCallback100.h +++ b/CPP/7zip/UI/FileManager/UpdateCallback100.h @@ -4,15 +4,12 @@ #define __UPDATE_CALLBACK100_H #include "Common/MyCom.h" -#include "Common/MyString.h" -#include "../Agent/IFolderArchive.h" -#include "ProgressDialog2.h" #include "../../IPassword.h" -#ifdef LANG -#include "LangUtils.h" -#endif +#include "../Agent/IFolderArchive.h" + +#include "ProgressDialog2.h" class CUpdateCallback100Imp: public IFolderArchiveUpdateCallback, @@ -22,7 +19,14 @@ class CUpdateCallback100Imp: public ICompressProgressInfo, public CMyUnknownImp { + bool _passwordIsDefined; + UString _password; + UInt64 _numFiles; public: + CProgressDialog *ProgressDialog; + + CUpdateCallback100Imp(): ProgressDialog(0) {} + MY_UNKNOWN_IMP5( IFolderArchiveUpdateCallback, ICryptoGetTextPassword2, @@ -38,35 +42,13 @@ public: STDMETHOD(CryptoGetTextPassword)(BSTR *password); STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password); -private: - bool _passwordIsDefined; - UString _password; - void AddErrorMessage(LPCWSTR message); - bool ShowMessages; - -public: - CUpdateCallback100Imp(): ShowMessages(true) {} - ~CUpdateCallback100Imp(); - CProgressDialog ProgressDialog; - HWND _parentWindow; - UStringVector Messages; - UInt64 NumFolders; - UInt64 NumFiles; - - void Init(HWND parentWindow, - bool passwordIsDefined, const UString &password) + void Init(bool passwordIsDefined, const UString &password) { _passwordIsDefined = passwordIsDefined; _password = password; - _parentWindow = parentWindow; - NumFolders = NumFiles = 0; - } - void StartProgressDialog(const UString &title) - { - ProgressDialog.Create(title, _parentWindow); + _numFiles = 0; } - }; #endif diff --git a/CPP/7zip/UI/FileManager/ViewSettings.cpp b/CPP/7zip/UI/FileManager/ViewSettings.cpp index 0f98c217..6ec53787 100755 --- a/CPP/7zip/UI/FileManager/ViewSettings.cpp +++ b/CPP/7zip/UI/FileManager/ViewSettings.cpp @@ -12,7 +12,7 @@ using namespace NWindows; using namespace NRegistry; -#define REG_PATH_FM TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-ZIP") TEXT(STRING_PATH_SEPARATOR) TEXT("FM") +#define REG_PATH_FM TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") TEXT(STRING_PATH_SEPARATOR) TEXT("FM") static const TCHAR *kCUBasePath = REG_PATH_FM; static const TCHAR *kCulumnsKeyName = REG_PATH_FM TEXT(STRING_PATH_SEPARATOR) TEXT("Columns"); @@ -48,7 +48,7 @@ static const UInt32 kColumnHeaderSize = 12; static const UInt32 kColumnInfoVersion = 1; -static NSynchronization::CCriticalSection g_RegistryOperationsCriticalSection; +static NSynchronization::CCriticalSection g_CS; class CTempOutBufferSpec { @@ -126,7 +126,7 @@ void SaveListViewInfo(const UString &id, const CListViewInfo &viewInfo) buffer.WriteUInt32(column.Width); } { - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; key.Create(HKEY_CURRENT_USER, kCulumnsKeyName); key.SetValue(GetSystemString(id), (const Byte *)buffer, dataSize); @@ -140,9 +140,9 @@ void ReadListViewInfo(const UString &id, CListViewInfo &viewInfo) CByteBuffer buffer; UInt32 size; { - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - if(key.Open(HKEY_CURRENT_USER, kCulumnsKeyName, KEY_READ) != ERROR_SUCCESS) + if (key.Open(HKEY_CURRENT_USER, kCulumnsKeyName, KEY_READ) != ERROR_SUCCESS) return; if (key.QueryValue(GetSystemString(id), buffer, size) != ERROR_SUCCESS) return; @@ -197,8 +197,8 @@ struct CPanelsInfo void SaveWindowSize(const RECT &rect, bool maximized) { CSysString keyName = kCUBasePath; + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); key.Create(HKEY_CURRENT_USER, keyName); // CWindowPosition position; CTempOutBufferSpec buffer; @@ -214,9 +214,9 @@ void SaveWindowSize(const RECT &rect, bool maximized) bool ReadWindowSize(RECT &rect, bool &maximized) { CSysString keyName = kCUBasePath; + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - if(key.Open(HKEY_CURRENT_USER, keyName, KEY_READ) != ERROR_SUCCESS) + if (key.Open(HKEY_CURRENT_USER, keyName, KEY_READ) != ERROR_SUCCESS) return false; CByteBuffer buffer; UInt32 size; @@ -239,8 +239,8 @@ bool ReadWindowSize(RECT &rect, bool &maximized) void SavePanelsInfo(UInt32 numPanels, UInt32 currentPanel, UInt32 splitterPos) { CSysString keyName = kCUBasePath; + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); key.Create(HKEY_CURRENT_USER, keyName); CTempOutBufferSpec buffer; @@ -254,9 +254,9 @@ void SavePanelsInfo(UInt32 numPanels, UInt32 currentPanel, UInt32 splitterPos) bool ReadPanelsInfo(UInt32 &numPanels, UInt32 ¤tPanel, UInt32 &splitterPos) { CSysString keyName = kCUBasePath; + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - if(key.Open(HKEY_CURRENT_USER, keyName, KEY_READ) != ERROR_SUCCESS) + if (key.Open(HKEY_CURRENT_USER, keyName, KEY_READ) != ERROR_SUCCESS) return false; CByteBuffer buffer; UInt32 size; @@ -286,7 +286,7 @@ static const UInt32 kDefaultToolbarMask = 8 | 4 | 1; UInt32 ReadToolbarsMask() { CKey key; - if(key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) + if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) return kDefaultToolbarMask; UInt32 mask; if (key.QueryValue(kToolbars, mask) != ERROR_SUCCESS) @@ -305,17 +305,17 @@ static UString GetPanelPathName(UInt32 panelIndex) void SavePanelPath(UInt32 panel, const UString &path) { + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); key.Create(HKEY_CURRENT_USER, kCUBasePath); key.SetValue(GetPanelPathName(panel), path); } bool ReadPanelPath(UInt32 panel, UString &path) { + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - if(key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) + if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) return false; return (key.QueryValue(GetPanelPathName(panel), path) == ERROR_SUCCESS); } @@ -334,7 +334,7 @@ void ReadListMode(CListMode &listMode) { CKey key; listMode.Init(); - if(key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) + if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) return; UInt32 t; if (key.QueryValue(kListMode, t) != ERROR_SUCCESS) @@ -347,53 +347,21 @@ void ReadListMode(CListMode &listMode) } -void SaveStringList(LPCTSTR valueName, const UStringVector &folders) +static void SaveStringList(LPCTSTR valueName, const UStringVector &folders) { - UInt32 sizeInChars = 0; - int i; - for (i = 0; i < folders.Size(); i++) - sizeInChars += folders[i].Length() + 1; - CBuffer<wchar_t> buffer; - buffer.SetCapacity(sizeInChars); - int pos = 0; - for (i = 0; i < folders.Size(); i++) - { - MyStringCopy((wchar_t *)buffer + pos, (const wchar_t *)folders[i]); - pos += folders[i].Length() + 1; - } + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); key.Create(HKEY_CURRENT_USER, kCUBasePath); - key.SetValue(valueName, buffer, sizeInChars * sizeof(wchar_t)); + key.SetValue_Strings(valueName, folders); } -void ReadStringList(LPCTSTR valueName, UStringVector &folders) +static void ReadStringList(LPCTSTR valueName, UStringVector &folders) { folders.Clear(); + NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection); - if(key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) - return; - CByteBuffer buffer; - UInt32 dataSize; - if (key.QueryValue(valueName, buffer, dataSize) != ERROR_SUCCESS) - return; - if (dataSize % sizeof(wchar_t) != 0) - return; - const wchar_t *data = (const wchar_t *)(const Byte *)buffer; - int sizeInChars = dataSize / sizeof(wchar_t); - UString string; - for (int i = 0; i < sizeInChars; i++) - { - wchar_t c = data[i]; - if (c == L'\0') - { - folders.Add(string); - string.Empty(); - } - else - string += c; - } + if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) == ERROR_SUCCESS) + key.GetValue_Strings(valueName, folders); } void SaveFolderHistory(const UStringVector &folders) @@ -411,14 +379,12 @@ void SaveCopyHistory(const UStringVector &folders) void ReadCopyHistory(UStringVector &folders) { ReadStringList(kCopyHistoryValueName, folders); } -void AddUniqueStringToHeadOfList(UStringVector &list, - const UString &string) +void AddUniqueStringToHeadOfList(UStringVector &list, const UString &s) { - for(int i = 0; i < list.Size();) - if (string.CompareNoCase(list[i]) == 0) + for (int i = 0; i < list.Size();) + if (s.CompareNoCase(list[i]) == 0) list.Delete(i); else i++; - list.Insert(0, string); + list.Insert(0, s); } - diff --git a/CPP/7zip/UI/FileManager/ViewSettings.h b/CPP/7zip/UI/FileManager/ViewSettings.h index 2500ce7b..b0510813 100755 --- a/CPP/7zip/UI/FileManager/ViewSettings.h +++ b/CPP/7zip/UI/FileManager/ViewSettings.h @@ -1,9 +1,10 @@ // ViewSettings.h -#ifndef __VIEWSETTINGS_H -#define __VIEWSETTINGS_H +#ifndef __VIEW_SETTINGS_H +#define __VIEW_SETTINGS_H #include "Common/MyString.h" +#include "Common/Types.h" struct CColumnInfo { @@ -44,15 +45,15 @@ struct CListViewInfo return -1; } - bool IsEqual(const CListViewInfo &aNewInfo) const + bool IsEqual(const CListViewInfo &info) const { - if (Columns.Size() != aNewInfo.Columns.Size() || - // SortIndex != aNewInfo.SortIndex || - SortID != aNewInfo.SortID || - Ascending != aNewInfo.Ascending) + if (Columns.Size() != info.Columns.Size() || + // SortIndex != info.SortIndex || + SortID != info.SortID || + Ascending != info.Ascending) return false; for (int i = 0; i < Columns.Size(); i++) - if (Columns[i] != aNewInfo.Columns[i]) + if (Columns[i] != info.Columns[i]) return false; return true; } @@ -92,7 +93,6 @@ void ReadFastFolders(UStringVector &folders); void SaveCopyHistory(const UStringVector &folders); void ReadCopyHistory(UStringVector &folders); -void AddUniqueStringToHeadOfList(UStringVector &list, - const UString &string); +void AddUniqueStringToHeadOfList(UStringVector &list, const UString &s); #endif diff --git a/CPP/7zip/UI/FileManager/makefile b/CPP/7zip/UI/FileManager/makefile index fea2d39a..d26aa04b 100755 --- a/CPP/7zip/UI/FileManager/makefile +++ b/CPP/7zip/UI/FileManager/makefile @@ -1,28 +1,33 @@ PROG = 7zFM.exe -LIBS = $(LIBS) user32.lib oleaut32.lib advapi32.lib shell32.lib ole32.lib comctl32.lib htmlhelp.lib Mpr.lib Gdi32.lib comdlg32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DLANG \ - -DWIN_LONG_PATH \ -DNEW_FOLDER_INTERFACE \ -DEXTERNAL_CODECS \ - -DSUPPORT_DEVICE_FILE \ + +!IFDEF UNDER_CE +LIBS = $(LIBS) ceshell.lib Commctrl.lib +!ELSE +LIBS = $(LIBS) comctl32.lib htmlhelp.lib comdlg32.lib Mpr.lib Gdi32.lib +CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -DSUPPORT_DEVICE_FILE +!ENDIF FM_OBJS = \ $O\App.obj \ + $O\BrowseDialog.obj \ $O\ClassDefs.obj \ $O\EnumFormatEtc.obj \ $O\ExtractCallback.obj \ $O\FileFolderPluginOpen.obj \ $O\FilePlugins.obj \ $O\FM.obj \ + $O\FoldersPage.obj \ $O\FormatUtils.obj \ - $O\FSDrives.obj \ $O\FSFolder.obj \ $O\FSFolderCopy.obj \ $O\HelpUtils.obj \ $O\LangUtils.obj \ + $O\MenuPage.obj \ $O\MyLoadMenu.obj \ - $O\NetFolder.obj \ $O\OpenCallback.obj \ $O\OptionsDialog.obj \ $O\Panel.obj \ @@ -89,21 +94,33 @@ WIN_OBJS = \ $O\FileFind.obj \ $O\FileIO.obj \ $O\FileName.obj \ - $O\FileSystem.obj \ $O\Memory.obj \ $O\MemoryLock.obj \ $O\Menu.obj \ - $O\Net.obj \ + $O\Process.obj \ $O\PropVariant.obj \ $O\PropVariantConversions.obj \ $O\Registry.obj \ $O\ResourceString.obj \ - $O\Security.obj \ $O\Shell.obj \ $O\Synchronization.obj \ $O\Time.obj \ $O\Window.obj \ +!IFNDEF UNDER_CE + +FM_OBJS = $(FM_OBJS) \ + $O\FSDrives.obj \ + $O\NetFolder.obj \ + +WIN_OBJS = $(WIN_OBJS) \ + $O\FileSystem.obj \ + $O\Net.obj \ + $O\Security.obj \ + +!ENDIF + + WIN_CTRL_OBJS = \ $O\ComboBox.obj \ $O\Dialog.obj \ @@ -118,6 +135,9 @@ WIN_CTRL_OBJS = \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ +AR_COMMON_OBJS = \ + $O\OutStreamWithCRC.obj \ + UI_COMMON_OBJS = \ $O\ArchiveExtractCallback.obj \ $O\ArchiveName.obj \ @@ -137,8 +157,9 @@ UI_COMMON_OBJS = \ $O\WorkDir.obj \ $O\ZipRegistry.obj \ -AR_COMMON_OBJS = \ - $O\OutStreamWithCRC.obj \ +EXPLORER_OBJS = \ + $O\ContextMenu.obj \ + $O\RegistryContextMenu.obj \ AGENT_OBJS = \ $O\Agent.obj \ @@ -164,8 +185,9 @@ OBJS = \ $(WIN_OBJS) \ $(WIN_CTRL_OBJS) \ $(7ZIP_COMMON_OBJS) \ - $(UI_COMMON_OBJS) \ $(AR_COMMON_OBJS) \ + $(UI_COMMON_OBJS) \ + $(EXPLORER_OBJS) \ $(AGENT_OBJS) \ $O\CopyCoder.obj \ $(CRC_OBJS) \ @@ -184,12 +206,14 @@ $(WIN_CTRL_OBJS): ../../../Windows/Control/$(*B).cpp $(COMPL) $(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp $(COMPL) -$(UI_COMMON_OBJS): ../Common/$(*B).cpp - $(COMPL) $(AR_COMMON_OBJS): ../../Archive/Common/$(*B).cpp $(COMPL) +$(UI_COMMON_OBJS): ../Common/$(*B).cpp + $(COMPL) $(AGENT_OBJS): ../Agent/$(*B).cpp $(COMPL) +$(EXPLORER_OBJS): ../Explorer/$(*B).cpp + $(COMPL) $O\CopyCoder.obj: ../../Compress/$(*B).cpp $(COMPL) diff --git a/CPP/7zip/UI/FileManager/resource.h b/CPP/7zip/UI/FileManager/resource.h index 72121c89..13c8e0e7 100755 --- a/CPP/7zip/UI/FileManager/resource.h +++ b/CPP/7zip/UI/FileManager/resource.h @@ -1,5 +1,5 @@ -#define IDI_FAM 101 -#define IDI_FM 101 +#include "resourceGui.h" + #define IDR_MENUBAR1 103 #define IDM_MENU 103 #define IDR_ACCELERATOR1 209 @@ -109,9 +109,6 @@ #define IDS_SELECT_MASK 2252 #define IDS_FOLDERS_HISTORY 2260 #define IDS_N_SELECTED_ITEMS 2270 -#define IDS_FILES_COLON 2274 -#define IDS_FOLDERS_COLON 2275 -#define IDS_SIZE_COLON 2276 #define IDS_TOO_MANY_ITEMS 2279 #define IDS_WANT_UPDATE_MODIFIED_FILE 2280 @@ -160,9 +157,6 @@ #define IDS_SCANNING 4050 #define IDS_PROPERTIES 4060 -#define IDS_PROGRESS_TESTING 4100 -#define IDS_MESSAGE_NO_ERRORS 4200 - #define IDS_MESSAGE_UNSUPPORTED_OPERATION_FOR_LONG_PATH_FOLDER 4301 #define IDS_SELECT_ONE_FILE 4302 #define IDS_SELECT_FILES 4303 diff --git a/CPP/7zip/UI/FileManager/resource.rc b/CPP/7zip/UI/FileManager/resource.rc index cdfed0b6..833cb374 100755 --- a/CPP/7zip/UI/FileManager/resource.rc +++ b/CPP/7zip/UI/FileManager/resource.rc @@ -32,7 +32,7 @@ BEGIN MENUITEM "Com&bine files...", IDM_FILE_COMBINE MENUITEM SEPARATOR MENUITEM "P&roperties\tAlt+Enter", IDM_FILE_PROPERTIES - MENUITEM "Comme&nt\tCtrl+Z", IDM_FILE_COMMENT + MENUITEM "Comme&nt...\tCtrl+Z", IDM_FILE_COMMENT MENUITEM "Calculate checksum", IDM_FILE_CRC MENUITEM "Di&ff", IDM_FILE_DIFF MENUITEM SEPARATOR @@ -78,11 +78,9 @@ BEGIN MENUITEM "Large Buttons", IDM_VIEW_TOOLBARS_LARGE_BUTTONS MENUITEM "Show Buttons Text", IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT END - MENUITEM SEPARATOR MENUITEM "Open Root Folder\t\\", IDM_OPEN_ROOT_FOLDER MENUITEM "Up One Level\tBackspace", IDM_OPEN_PARENT_FOLDER MENUITEM "Folders History...\tAlt+F12", IDM_FOLDERS_HISTORY - MENUITEM SEPARATOR MENUITEM "&Refresh\tCtrl+R", IDM_VIEW_REFRESH END POPUP "F&avorites" @@ -97,34 +95,38 @@ BEGIN BEGIN MENUITEM "&Options...", IDM_OPTIONS MENUITEM "&Benchmark", IDM_BENCHMARK + #ifndef UNDER_CE END POPUP "&Help" BEGIN MENUITEM "&Contents...\tF1", IDM_HELP_CONTENTS + #endif MENUITEM SEPARATOR - MENUITEM "&About 7-Zip...", IDM_ABOUT + MENUITEM "&About 7-Zip...", IDM_ABOUT END END -IDI_FM ICON "FM.ico" +IDI_ICON ICON "../../UI/FileManager/FM.ico" -1 24 MOVEABLE PURE "7zFM.exe.manifest" +#ifndef UNDER_CE +1 24 MOVEABLE PURE "../../UI/FileManager/7zFM.exe.manifest" +#endif -IDB_ADD BITMAP "Add.bmp" -IDB_EXTRACT BITMAP "Extract.bmp" -IDB_TEST BITMAP "Test.bmp" -IDB_COPY BITMAP "Copy.bmp" -IDB_MOVE BITMAP "Move.bmp" -IDB_DELETE BITMAP "Delete.bmp" -IDB_INFO BITMAP "Info.bmp" -IDB_ADD2 BITMAP "Add2.bmp" -IDB_EXTRACT2 BITMAP "Extract2.bmp" -IDB_TEST2 BITMAP "Test2.bmp" -IDB_COPY2 BITMAP "Copy2.bmp" -IDB_MOVE2 BITMAP "Move2.bmp" -IDB_DELETE2 BITMAP "Delete2.bmp" -IDB_INFO2 BITMAP "Info2.bmp" +IDB_ADD BITMAP "../../UI/FileManager/Add.bmp" +IDB_EXTRACT BITMAP "../../UI/FileManager/Extract.bmp" +IDB_TEST BITMAP "../../UI/FileManager/Test.bmp" +IDB_COPY BITMAP "../../UI/FileManager/Copy.bmp" +IDB_MOVE BITMAP "../../UI/FileManager/Move.bmp" +IDB_DELETE BITMAP "../../UI/FileManager/Delete.bmp" +IDB_INFO BITMAP "../../UI/FileManager/Info.bmp" +IDB_ADD2 BITMAP "../../UI/FileManager/Add2.bmp" +IDB_EXTRACT2 BITMAP "../../UI/FileManager/Extract2.bmp" +IDB_TEST2 BITMAP "../../UI/FileManager/Test2.bmp" +IDB_COPY2 BITMAP "../../UI/FileManager/Copy2.bmp" +IDB_MOVE2 BITMAP "../../UI/FileManager/Move2.bmp" +IDB_DELETE2 BITMAP "../../UI/FileManager/Delete2.bmp" +IDB_INFO2 BITMAP "../../UI/FileManager/Info2.bmp" STRINGTABLE @@ -187,9 +189,6 @@ BEGIN IDS_SELECT_MASK "Mask:" IDS_FOLDERS_HISTORY "Folders History" IDS_N_SELECTED_ITEMS "{0} object(s) selected" - IDS_FILES_COLON "Files:" - IDS_FOLDERS_COLON "Folders:" - IDS_SIZE_COLON "Size:" IDS_PROP_TOTAL_SIZE "Total Size" IDS_PROP_FREE_SPACE "Free Space" @@ -219,8 +218,6 @@ BEGIN IDS_NETWORK "Network" IDS_DOCUMENTS "Documents" - IDS_PROGRESS_TESTING "Testing" - IDS_MESSAGE_NO_ERRORS "There are no errors" IDS_MESSAGE_UNSUPPORTED_OPERATION_FOR_LONG_PATH_FOLDER "The operation cannot be called from a folder that has a long path." IDS_SELECT_ONE_FILE "You must select one file" IDS_SELECT_FILES "You must select one or more files" @@ -228,20 +225,24 @@ BEGIN END +#include "AboutDialog.rc" +#include "BrowseDialog.rc" #include "ComboDialog.rc" #include "CopyDialog.rc" +#include "EditPage.rc" +#include "FoldersPage.rc" +#include "LangPage.rc" #include "ListViewDialog.rc" -#include "PropertyName.rc" +#include "MenuPage.rc" #include "MessagesDialog.rc" #include "OverwriteDialog.rc" #include "PasswordDialog.rc" -#include "SplitDialog.rc" -#include "ProgressDialog2.rc" -#include "AboutDialog.rc" -#include "LangPage.rc" #include "PluginsPage.rc" -#include "SystemPage.rc" -#include "EditPage.rc" +#include "ProgressDialog2.rc" +#include "PropertyName.rc" #include "SettingsPage.rc" -#include "../GUI/ExtractDialog.rc" +#include "SplitDialog.rc" +#include "SystemPage.rc" #include "../GUI/Extract.rc" +#include "../Explorer/resource2.rc" +#include "resourceGui.rc" diff --git a/CPP/7zip/UI/FileManager/resourceGui.h b/CPP/7zip/UI/FileManager/resourceGui.h new file mode 100755 index 00000000..14cedda5 --- /dev/null +++ b/CPP/7zip/UI/FileManager/resourceGui.h @@ -0,0 +1,10 @@ +#define IDI_ICON 1 + +#define IDS_INCORRECT_VOLUME_SIZE 95 + +#define IDS_FILES_COLON 2274 +#define IDS_FOLDERS_COLON 2275 +#define IDS_SIZE_COLON 2276 + +#define IDS_PROGRESS_TESTING 4100 +#define IDS_MESSAGE_NO_ERRORS 4200 diff --git a/CPP/7zip/UI/FileManager/resourceGui.rc b/CPP/7zip/UI/FileManager/resourceGui.rc new file mode 100755 index 00000000..2e706ea2 --- /dev/null +++ b/CPP/7zip/UI/FileManager/resourceGui.rc @@ -0,0 +1,13 @@ +#include "resourceGui.h" + +STRINGTABLE +BEGIN + IDS_INCORRECT_VOLUME_SIZE "Incorrect volume size" + + IDS_FILES_COLON "Files:" + IDS_FOLDERS_COLON "Folders:" + IDS_SIZE_COLON "Size:" + + IDS_PROGRESS_TESTING "Testing" + IDS_MESSAGE_NO_ERRORS "There are no errors" +END diff --git a/CPP/7zip/UI/GUI/BenchmarkDialog.cpp b/CPP/7zip/UI/GUI/BenchmarkDialog.cpp index c7a1cc5b..f669c0e1 100755 --- a/CPP/7zip/UI/GUI/BenchmarkDialog.cpp +++ b/CPP/7zip/UI/GUI/BenchmarkDialog.cpp @@ -3,19 +3,18 @@ #include "StdAfx.h" #include "Common/IntToString.h" -#include "Common/StringToInt.h" #include "Common/MyException.h" -#include "Windows/Thread.h" + #include "Windows/Error.h" #include "Windows/System.h" +#include "Windows/Thread.h" + #include "../FileManager/HelpUtils.h" -// #include "BenchmarkDialogRes.h" + #include "BenchmarkDialog.h" using namespace NWindows; -// const int kNumBenchDictionaryBitsStart = 21; - static LPCWSTR kHelpTopic = L"fm/benchmark.htm"; static const UINT_PTR kTimerID = 4; @@ -27,6 +26,8 @@ static const UINT kTimerElapse = 1000; using namespace NWindows; +UString HResultToMessage(HRESULT errorCode); + #ifdef LANG static CIDLangPair kIDLangPairs[] = { @@ -57,17 +58,16 @@ static CIDLangPair kIDLangPairs[] = }; #endif -static void MyMessageBoxError(HWND hwnd, LPCWSTR message) -{ - MessageBoxW(hwnd, message, L"7-Zip", MB_ICONERROR); -} - const LPCTSTR kProcessingString = TEXT("..."); const LPCTSTR kMB = TEXT(" MB"); const LPCTSTR kMIPS = TEXT(" MIPS"); const LPCTSTR kKBs = TEXT(" KB/s"); +#ifdef UNDER_CE +static const int kMinDicLogSize = 20; +#else static const int kMinDicLogSize = 21; +#endif static const UInt32 kMinDicSize = (1 << kMinDicLogSize); static const UInt32 kMaxDicSize = #ifdef _WIN64 @@ -83,39 +83,59 @@ bool CBenchmarkDialog::OnInit() LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); #endif - _syncInfo.Init(); + Sync.Init(); - m_Dictionary.Attach(GetItem(IDC_BENCHMARK_COMBO_DICTIONARY)); - int cur = 0; - // _syncInfo.DictionarySize = (1 << kNumBenchDictionaryBitsStart); UInt32 numCPUs = NSystem::GetNumberOfProcessors(); if (numCPUs < 1) numCPUs = 1; numCPUs = MyMin(numCPUs, (UInt32)(1 << 8)); - cur = 0; - bool setDefaultThreads = (_syncInfo.NumThreads == (UInt32)(-1)); - if (setDefaultThreads) + + if (Sync.NumThreads == (UInt32)-1) { - _syncInfo.NumThreads = numCPUs; - if (_syncInfo.NumThreads > 1) - _syncInfo.NumThreads &= ~1; + Sync.NumThreads = numCPUs; + if (Sync.NumThreads > 1) + Sync.NumThreads &= ~1; + } + m_NumThreads.Attach(GetItem(IDC_BENCHMARK_COMBO_NUM_THREADS)); + int cur = 0; + for (UInt32 num = 1; num <= numCPUs * 2;) + { + TCHAR s[40]; + ConvertUInt64ToString(num, s); + int index = (int)m_NumThreads.AddString(s); + m_NumThreads.SetItemData(index, num); + if (num <= Sync.NumThreads) + cur = index; + if (num > 1) + num++; + num++; } + m_NumThreads.SetCurSel(cur); + Sync.NumThreads = GetNumberOfThreads(); + m_Dictionary.Attach(GetItem(IDC_BENCHMARK_COMBO_DICTIONARY)); + cur = 0; UInt64 ramSize = NSystem::GetRamSize(); - bool setDefaultDictionary = (_syncInfo.DictionarySize == (UInt32)(-1)); - if (setDefaultDictionary) + + #ifdef UNDER_CE + const UInt32 kNormalizedCeSize = (16 << 20); + if (ramSize > kNormalizedCeSize && ramSize < (33 << 20)) + ramSize = kNormalizedCeSize; + #endif + + if (Sync.DictionarySize == (UInt32)-1) { int dicSizeLog; - for (dicSizeLog = 25; dicSizeLog >= kBenchMinDicLogSize; dicSizeLog--) - if (GetBenchMemoryUsage(_syncInfo.NumThreads, ((UInt32)1 << dicSizeLog)) + (8 << 20) <= ramSize) + for (dicSizeLog = 25; dicSizeLog > kBenchMinDicLogSize; dicSizeLog--) + if (GetBenchMemoryUsage(Sync.NumThreads, ((UInt32)1 << dicSizeLog)) + (8 << 20) <= ramSize) break; - _syncInfo.DictionarySize = (1 << dicSizeLog); + Sync.DictionarySize = (1 << dicSizeLog); } - if (_syncInfo.DictionarySize < kMinDicSize) - _syncInfo.DictionarySize = kMinDicSize; - if (_syncInfo.DictionarySize > kMaxDicSize) - _syncInfo.DictionarySize = kMaxDicSize; + if (Sync.DictionarySize < kMinDicSize) + Sync.DictionarySize = kMinDicSize; + if (Sync.DictionarySize > kMaxDicSize) + Sync.DictionarySize = kMaxDicSize; for (int i = kMinDicLogSize; i <= 30; i++) for (int j = 0; j < 2; j++) @@ -128,35 +148,17 @@ bool CBenchmarkDialog::OnInit() lstrcat(s, kMB); int index = (int)m_Dictionary.AddString(s); m_Dictionary.SetItemData(index, dictionary); - if (dictionary <= _syncInfo.DictionarySize) + if (dictionary <= Sync.DictionarySize) cur = index; } m_Dictionary.SetCurSel(cur); - m_NumThreads.Attach(GetItem(IDC_BENCHMARK_COMBO_NUM_THREADS)); - for (UInt32 num = 1; ;) - { - if (num > numCPUs * 2) - break; - TCHAR s[40]; - ConvertUInt64ToString(num, s); - int index = (int)m_NumThreads.AddString(s); - m_NumThreads.SetItemData(index, num); - if (num <= numCPUs && setDefaultThreads) - { - _syncInfo.NumThreads = num; - cur = index; - } - if (num > 1) - num++; - num++; - } - m_NumThreads.SetCurSel(cur); - OnChangeSettings(); - _syncInfo._startEvent.Set(); + Sync._startEvent.Set(); _timer = SetTimer(kTimerID, kTimerElapse); + + NormalizePosition(); return CModalDialog::OnInit(); } @@ -213,11 +215,11 @@ void CBenchmarkDialog::OnChangeSettings() SetItemText(g_IDs[i], kProcessingString); _startTime = GetTickCount(); PrintTime(); - NWindows::NSynchronization::CCriticalSectionLock lock(_syncInfo.CS); - _syncInfo.Init(); - _syncInfo.DictionarySize = dictionary; - _syncInfo.Changed = true; - _syncInfo.NumThreads = GetNumberOfThreads(); + NWindows::NSynchronization::CCriticalSectionLock lock(Sync.CS); + Sync.Init(); + Sync.DictionarySize = dictionary; + Sync.Changed = true; + Sync.NumThreads = GetNumberOfThreads(); } void CBenchmarkDialog::OnRestartButton() @@ -228,7 +230,7 @@ void CBenchmarkDialog::OnRestartButton() void CBenchmarkDialog::OnStopButton() { EnableItem(IDC_BUTTON_STOP, false); - _syncInfo.Pause(); + Sync.Pause(); } void CBenchmarkDialog::OnHelp() @@ -238,7 +240,7 @@ void CBenchmarkDialog::OnHelp() void CBenchmarkDialog::OnCancel() { - _syncInfo.Stop(); + Sync.Stop(); KillTimer(_timer); CModalDialog::OnCancel(); } @@ -256,7 +258,7 @@ void CBenchmarkDialog::PrintTime() UInt32 curTime = ::GetTickCount(); UInt32 elapsedTime = (curTime - _startTime); UInt32 elapsedSec = elapsedTime / 1000; - if (elapsedSec != 0 && _syncInfo.WasPaused()) + if (elapsedSec != 0 && Sync.WasPaused()) return; TCHAR s[40]; GetTimeString(elapsedSec, s); @@ -310,26 +312,26 @@ void CBenchmarkDialog::PrintResults( bool CBenchmarkDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { PrintTime(); - NWindows::NSynchronization::CCriticalSectionLock lock(_syncInfo.CS); + NWindows::NSynchronization::CCriticalSectionLock lock(Sync.CS); TCHAR s[40]; - ConvertUInt64ToString((_syncInfo.ProcessedSize >> 20), s); + ConvertUInt64ToString((Sync.ProcessedSize >> 20), s); lstrcat(s, kMB); SetItemText(IDC_BENCHMARK_SIZE_VALUE, s); - ConvertUInt64ToString(_syncInfo.NumPasses, s); + ConvertUInt64ToString(Sync.NumPasses, s); SetItemText(IDC_BENCHMARK_PASSES_VALUE, s); /* - ConvertUInt64ToString(_syncInfo.NumErrors, s); + ConvertUInt64ToString(Sync.NumErrors, s); SetItemText(IDC_BENCHMARK_ERRORS_VALUE, s); */ { - UInt32 dicSizeTemp = (UInt32)MyMax(_syncInfo.ProcessedSize, UInt64(1) << 20); - dicSizeTemp = MyMin(dicSizeTemp, _syncInfo.DictionarySize), + UInt32 dicSizeTemp = (UInt32)MyMax(Sync.ProcessedSize, UInt64(1) << 20); + dicSizeTemp = MyMin(dicSizeTemp, Sync.DictionarySize), PrintResults(dicSizeTemp, - _syncInfo.CompressingInfoTemp, + Sync.CompressingInfoTemp, IDC_BENCHMARK_COMPRESSING_USAGE, IDC_BENCHMARK_COMPRESSING_SPEED, IDC_BENCHMARK_COMPRESSING_RPU, @@ -338,8 +340,8 @@ bool CBenchmarkDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { PrintResults( - _syncInfo.DictionarySize, - _syncInfo.CompressingInfo, + Sync.DictionarySize, + Sync.CompressingInfo, IDC_BENCHMARK_COMPRESSING_USAGE2, IDC_BENCHMARK_COMPRESSING_SPEED2, IDC_BENCHMARK_COMPRESSING_RPU2, @@ -348,8 +350,8 @@ bool CBenchmarkDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { PrintResults( - _syncInfo.DictionarySize, - _syncInfo.DecompressingInfoTemp, + Sync.DictionarySize, + Sync.DecompressingInfoTemp, IDC_BENCHMARK_DECOMPRESSING_USAGE, IDC_BENCHMARK_DECOMPRESSING_SPEED, IDC_BENCHMARK_DECOMPRESSING_RPU, @@ -358,26 +360,26 @@ bool CBenchmarkDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) } { PrintResults( - _syncInfo.DictionarySize, - _syncInfo.DecompressingInfo, + Sync.DictionarySize, + Sync.DecompressingInfo, IDC_BENCHMARK_DECOMPRESSING_USAGE2, IDC_BENCHMARK_DECOMPRESSING_SPEED2, IDC_BENCHMARK_DECOMPRESSING_RPU2, IDC_BENCHMARK_DECOMPRESSING_RATING2, true); - if (_syncInfo.DecompressingInfo.GlobalTime > 0 && - _syncInfo.CompressingInfo.GlobalTime > 0) + if (Sync.DecompressingInfo.GlobalTime > 0 && + Sync.CompressingInfo.GlobalTime > 0) { - UInt64 comprRating = GetCompressRating(_syncInfo.DictionarySize, - _syncInfo.CompressingInfo.GlobalTime, _syncInfo.CompressingInfo.GlobalFreq, _syncInfo.CompressingInfo.UnpackSize); - UInt64 decomprRating = GetDecompressRating(_syncInfo.DecompressingInfo.GlobalTime, - _syncInfo.DecompressingInfo.GlobalFreq, _syncInfo.DecompressingInfo.UnpackSize, - _syncInfo.DecompressingInfo.PackSize, 1); + UInt64 comprRating = GetCompressRating(Sync.DictionarySize, + Sync.CompressingInfo.GlobalTime, Sync.CompressingInfo.GlobalFreq, Sync.CompressingInfo.UnpackSize); + UInt64 decomprRating = GetDecompressRating(Sync.DecompressingInfo.GlobalTime, + Sync.DecompressingInfo.GlobalFreq, Sync.DecompressingInfo.UnpackSize, + Sync.DecompressingInfo.PackSize, 1); PrintRating((comprRating + decomprRating) / 2, IDC_BENCHMARK_TOTAL_RATING_VALUE); PrintRating(( - GetRatingPerUsage(_syncInfo.CompressingInfo, comprRating) + - GetRatingPerUsage(_syncInfo.DecompressingInfo, decomprRating)) / 2, IDC_BENCHMARK_TOTAL_RPU_VALUE); - PrintUsage((GetUsage(_syncInfo.CompressingInfo) + GetUsage(_syncInfo.DecompressingInfo)) / 2, IDC_BENCHMARK_TOTAL_USAGE_VALUE); + GetRatingPerUsage(Sync.CompressingInfo, comprRating) + + GetRatingPerUsage(Sync.DecompressingInfo, decomprRating)) / 2, IDC_BENCHMARK_TOTAL_RPU_VALUE); + PrintUsage((GetUsage(Sync.CompressingInfo) + GetUsage(Sync.DecompressingInfo)) / 2, IDC_BENCHMARK_TOTAL_USAGE_VALUE); } } return true; @@ -411,7 +413,7 @@ bool CBenchmarkDialog::OnButtonClicked(int buttonID, HWND buttonHWND) struct CThreadBenchmark { - CProgressSyncInfo *SyncInfo; + CBenchmarkDialog *BenchmarkDialog; UInt64 _startTime; #ifdef EXTERNAL_LZMA CCodecs *codecs; @@ -431,33 +433,33 @@ struct CThreadBenchmark struct CBenchCallback: public IBenchCallback { UInt32 dictionarySize; - CProgressSyncInfo *SyncInfo; + CProgressSyncInfo *Sync; HRESULT SetEncodeResult(const CBenchInfo &info, bool final); HRESULT SetDecodeResult(const CBenchInfo &info, bool final); }; HRESULT CBenchCallback::SetEncodeResult(const CBenchInfo &info, bool final) { - NSynchronization::CCriticalSectionLock lock(SyncInfo->CS); - if (SyncInfo->Changed || SyncInfo->Paused || SyncInfo->Stopped) + NSynchronization::CCriticalSectionLock lock(Sync->CS); + if (Sync->Changed || Sync->Paused || Sync->Stopped) return E_ABORT; - SyncInfo->ProcessedSize = info.UnpackSize; - if (final && SyncInfo->CompressingInfo.GlobalTime == 0) + Sync->ProcessedSize = info.UnpackSize; + if (final && Sync->CompressingInfo.GlobalTime == 0) { - (CBenchInfo&)SyncInfo->CompressingInfo = info; - if (SyncInfo->CompressingInfo.GlobalTime == 0) - SyncInfo->CompressingInfo.GlobalTime = 1; + (CBenchInfo&)Sync->CompressingInfo = info; + if (Sync->CompressingInfo.GlobalTime == 0) + Sync->CompressingInfo.GlobalTime = 1; } else - (CBenchInfo&)SyncInfo->CompressingInfoTemp = info; + (CBenchInfo&)Sync->CompressingInfoTemp = info; return S_OK; } HRESULT CBenchCallback::SetDecodeResult(const CBenchInfo &info, bool final) { - NSynchronization::CCriticalSectionLock lock(SyncInfo->CS); - if (SyncInfo->Changed || SyncInfo->Paused || SyncInfo->Stopped) + NSynchronization::CCriticalSectionLock lock(Sync->CS); + if (Sync->Changed || Sync->Paused || Sync->Stopped) return E_ABORT; CBenchInfo info2 = info; if (info2.NumIterations == 0) @@ -467,27 +469,28 @@ HRESULT CBenchCallback::SetDecodeResult(const CBenchInfo &info, bool final) info2.PackSize *= info2.NumIterations; info2.NumIterations = 1; - if (final && SyncInfo->DecompressingInfo.GlobalTime == 0) + if (final && Sync->DecompressingInfo.GlobalTime == 0) { - (CBenchInfo&)SyncInfo->DecompressingInfo = info2; - if (SyncInfo->DecompressingInfo.GlobalTime == 0) - SyncInfo->DecompressingInfo.GlobalTime = 1; + (CBenchInfo&)Sync->DecompressingInfo = info2; + if (Sync->DecompressingInfo.GlobalTime == 0) + Sync->DecompressingInfo.GlobalTime = 1; } else - (CBenchInfo&)SyncInfo->DecompressingInfoTemp = info2; + (CBenchInfo&)Sync->DecompressingInfoTemp = info2; return S_OK; } HRESULT CThreadBenchmark::Process() { + CProgressSyncInfo &sync = BenchmarkDialog->Sync; + sync.WaitCreating(); try { - SyncInfo->WaitCreating(); for (;;) { - if (SyncInfo->WasStopped()) + if (sync.WasStopped()) return 0; - if (SyncInfo->WasPaused()) + if (sync.WasPaused()) { Sleep(200); continue; @@ -495,18 +498,18 @@ HRESULT CThreadBenchmark::Process() UInt32 dictionarySize; UInt32 numThreads; { - NSynchronization::CCriticalSectionLock lock(SyncInfo->CS); - if (SyncInfo->Stopped || SyncInfo->Paused) + NSynchronization::CCriticalSectionLock lock(sync.CS); + if (sync.Stopped || sync.Paused) continue; - if (SyncInfo->Changed) - SyncInfo->Init(); - dictionarySize = SyncInfo->DictionarySize; - numThreads = SyncInfo->NumThreads; + if (sync.Changed) + sync.Init(); + dictionarySize = sync.DictionarySize; + numThreads = sync.NumThreads; } CBenchCallback callback; callback.dictionarySize = dictionarySize; - callback.SyncInfo = SyncInfo; + callback.Sync = &sync; HRESULT result; try { @@ -525,44 +528,46 @@ HRESULT CThreadBenchmark::Process() { if (result != E_ABORT) { - // SyncInfo->NumErrors++; + // sync.NumErrors++; { - NSynchronization::CCriticalSectionLock lock(SyncInfo->CS); - SyncInfo->Pause(); + NSynchronization::CCriticalSectionLock lock(sync.CS); + sync.Pause(); } - CSysString message; + UString message; if (result == S_FALSE) - message = TEXT("Decoding error"); + message = L"Decoding error"; + else if (result == CLASS_E_CLASSNOTAVAILABLE) + message = L"Can't find 7z.dll"; else - message = NError::MyFormatMessage(result); - MessageBox(0, message, TEXT("7-Zip"), MB_ICONERROR); + message = HResultToMessage(result); + BenchmarkDialog->MessageBoxError(message); } } else { - NSynchronization::CCriticalSectionLock lock(SyncInfo->CS); - SyncInfo->NumPasses++; + NSynchronization::CCriticalSectionLock lock(sync.CS); + sync.NumPasses++; } } // return S_OK; } catch(CSystemException &e) { - MessageBox(0, NError::MyFormatMessage(e.ErrorCode), TEXT("7-Zip"), MB_ICONERROR); + BenchmarkDialog->MessageBoxError(HResultToMessage(e.ErrorCode)); return E_FAIL; } catch(...) { - MyMessageBoxError(0, L"Some error"); + BenchmarkDialog->MessageBoxError(HResultToMessage(E_FAIL)); return E_FAIL; } } HRESULT Benchmark( - #ifdef EXTERNAL_LZMA - CCodecs *codecs, - #endif - UInt32 numThreads, UInt32 dictionarySize) + #ifdef EXTERNAL_LZMA + CCodecs *codecs, + #endif + UInt32 numThreads, UInt32 dictionarySize, HWND hwndParent) { CThreadBenchmark benchmarker; #ifdef EXTERNAL_LZMA @@ -570,12 +575,12 @@ HRESULT Benchmark( #endif CBenchmarkDialog benchmarkDialog; - benchmarkDialog._syncInfo.DictionarySize = dictionarySize; - benchmarkDialog._syncInfo.NumThreads = numThreads; + benchmarkDialog.Sync.DictionarySize = dictionarySize; + benchmarkDialog.Sync.NumThreads = numThreads; - benchmarker.SyncInfo = &benchmarkDialog._syncInfo; + benchmarker.BenchmarkDialog = &benchmarkDialog; NWindows::CThread thread; RINOK(thread.Create(CThreadBenchmark::MyThreadFunction, &benchmarker)); - benchmarkDialog.Create(0); + benchmarkDialog.Create(hwndParent); return thread.Wait(); } diff --git a/CPP/7zip/UI/GUI/BenchmarkDialog.h b/CPP/7zip/UI/GUI/BenchmarkDialog.h index a57cdb39..3152ee6c 100755 --- a/CPP/7zip/UI/GUI/BenchmarkDialog.h +++ b/CPP/7zip/UI/GUI/BenchmarkDialog.h @@ -1,11 +1,8 @@ // BenchmarkDialog.h -#ifndef __BENCHMARKDIALOG_H -#define __BENCHMARKDIALOG_H +#ifndef __BENCHMARK_DIALOG_H +#define __BENCHMARK_DIALOG_H -#include "BenchmarkDialogRes.h" - -#include "Windows/Control/Dialog.h" #include "Windows/Control/ComboBox.h" #include "Windows/Synchronization.h" #include "../../Compress/LZMA_Alone/LzmaBench.h" @@ -14,6 +11,10 @@ #include "../Common/LoadCodecs.h" #endif +#include "../FileManager/DialogSize.h" + +#include "BenchmarkDialogRes.h" + struct CBenchInfo2 : public CBenchInfo { void Init() { GlobalTime = UserTime = 0; } @@ -116,16 +117,24 @@ class CBenchmarkDialog: UInt32 OnChangeDictionary(); void OnChangeSettings(); public: - CProgressSyncInfo _syncInfo; + CProgressSyncInfo Sync; CBenchmarkDialog(): _timer(0) {} - INT_PTR Create(HWND wndParent = 0) { return CModalDialog::Create(IDD_DIALOG_BENCHMARK, wndParent); } + INT_PTR Create(HWND wndParent = 0) + { + BIG_DIALOG_SIZE(332, 228); + return CModalDialog::Create(SIZED_DIALOG(IDD_DIALOG_BENCHMARK), wndParent); + } + void MessageBoxError(LPCWSTR message) + { + MessageBoxW(*this, message, L"7-Zip", MB_ICONERROR); + } }; HRESULT Benchmark( - #ifdef EXTERNAL_LZMA - CCodecs *codecs, - #endif - UInt32 dictionarySize, UInt32 numThreads); + #ifdef EXTERNAL_LZMA + CCodecs *codecs, + #endif + UInt32 dictionarySize, UInt32 numThreads, HWND hwndParent = NULL); #endif diff --git a/CPP/7zip/UI/GUI/BenchmarkDialog.rc b/CPP/7zip/UI/GUI/BenchmarkDialog.rc index 58f2ab62..b77bac5f 100755 --- a/CPP/7zip/UI/GUI/BenchmarkDialog.rc +++ b/CPP/7zip/UI/GUI/BenchmarkDialog.rc @@ -1,116 +1,227 @@ #include "BenchmarkDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 330 -#define ySize2 228 +#define xc 332 +#define yc 228 + +#undef g0xs +#undef g1x +#undef g1xs +#undef g2xs +#undef g3x +#undef g3xs +#undef g4x + +#define gs 160 +#define gSpace 24 + +#define g0xs 90 +#define g1xs 44 +#define g1x (m + g0xs) +#define gc2x (g1x + g1xs + m) +#define gc2xs 80 + +#define g4x (m + m) + +#define sRating 60 +#define sSpeed 60 +#define sUsage 60 +#define sRpu 60 + +#define xRating (xs - m - m - sRating) +#define xRpu (xRating - sRpu) +#define xUsage (xRpu - sUsage) +#define xSpeed (xUsage - sSpeed) -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#define sLabel (xUsage - g4x) +#define sTotalRating (sUsage + sRpu + sRating + m + m) +#define xTotalRating (xs - m - sTotalRating) -#undef g0XSize -#undef g1XPos -#undef g1XSize -#undef g2XSize -#undef g3XPos -#undef g3XSize +#define g2xs 58 +#define g3xs 36 +#define g3x (m + g2xs) -#define bXPos1 (xSize - marg - bXSize) -#define bXPos2 (bXPos1 - 10 - bXSize) -#define bYPos (ySize - marg - bYSize) +IDD_DIALOG_BENCHMARK DIALOG 0, 0, xs, ys MY_MODAL_DIALOG_STYLE | WS_MINIMIZEBOX +CAPTION "Benchmark" +MY_FONT +BEGIN + PUSHBUTTON "&Restart", IDC_BUTTON_RESTART, bx1, m, bxs, bys + PUSHBUTTON "&Stop", IDC_BUTTON_STOP, bx1, m + bys + 6, bxs, bys + + PUSHBUTTON "&Help", IDHELP, bx2, by, bxs, bys + PUSHBUTTON "Cancel", IDCANCEL, bx1, by, bxs, bys + + LTEXT "&Dictionary size:", IDC_BENCHMARK_DICTIONARY, m, m + 1, g0xs, 8 + COMBOBOX IDC_BENCHMARK_COMBO_DICTIONARY, g1x, m, g1xs, 140, MY_COMBO + LTEXT "Memory usage:", IDC_BENCHMARK_MEMORY, gc2x, m + 1, gc2xs, 8 + LTEXT "0 MB", IDC_BENCHMARK_MEMORY_VALUE, gc2x + gc2xs, m + 1, 40, 8 + + LTEXT "&Number of CPU threads:", IDC_BENCHMARK_NUM_THREADS, m, 28, g0xs, 8 + COMBOBOX IDC_BENCHMARK_COMBO_NUM_THREADS, g1x, 27, g1xs, 140, MY_COMBO + LTEXT "1", IDC_BENCHMARK_HARDWARE_THREADS, gc2x, 28, 40, 8 + + RTEXT "CPU Usage", IDC_BENCHMARK_USAGE_LABEL, xUsage, 54, sUsage, 8 + RTEXT "Speed", IDC_BENCHMARK_SPEED_LABEL, xSpeed, 54, sSpeed, 8 + RTEXT "Rating / Usage", IDC_BENCHMARK_RPU_LABEL, xRpu, 54, sRpu, 8 + RTEXT "Rating", IDC_BENCHMARK_RATING_LABEL, xRating, 54, sRating, 8 + + GROUPBOX "Compressing", IDC_BENCHMARK_COMPRESSING, m, 64, xc, 40 + + LTEXT "Current", IDC_BENCHMARK_CURRENT, g4x, 76, sLabel, 8 + RTEXT "100%", IDC_BENCHMARK_COMPRESSING_USAGE, xUsage, 76, sUsage, 8 + RTEXT "100 KB/s", IDC_BENCHMARK_COMPRESSING_SPEED, xSpeed, 76, sSpeed, 8 + RTEXT "0", IDC_BENCHMARK_COMPRESSING_RPU, xRpu, 76, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_COMPRESSING_RATING, xRating, 76, sRating, 8 + + LTEXT "Resulting", IDC_BENCHMARK_RESULTING, g4x, 89, sLabel, 8 + RTEXT "100%", IDC_BENCHMARK_COMPRESSING_USAGE2, xUsage, 89, sUsage, 8 + RTEXT "100 KB/s", IDC_BENCHMARK_COMPRESSING_SPEED2, xSpeed, 89, sSpeed, 8 + RTEXT "0", IDC_BENCHMARK_COMPRESSING_RPU2, xRpu, 89, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_COMPRESSING_RATING2, xRating, 89, sRating, 8 + + GROUPBOX "Decompressing", IDC_BENCHMARK_DECOMPRESSING, m, 111, xc, 40 + + LTEXT "Current", IDC_BENCHMARK_CURRENT2, g4x, 123, sLabel, 8 + RTEXT "100%", IDC_BENCHMARK_DECOMPRESSING_USAGE, xUsage, 123, sUsage, 8 + RTEXT "100 KB/s", IDC_BENCHMARK_DECOMPRESSING_SPEED, xSpeed, 123, sSpeed, 8 + RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RPU, xRpu, 123, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RATING, xRating, 123, sRating, 8 + + LTEXT "Resulting", IDC_BENCHMARK_RESULTING2, g4x, 136, sLabel, 8 + RTEXT "100%", IDC_BENCHMARK_DECOMPRESSING_USAGE2, xUsage, 136, sUsage, 8 + RTEXT "100 KB/s", IDC_BENCHMARK_DECOMPRESSING_SPEED2, xSpeed, 136, sSpeed, 8 + RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RPU2, xRpu, 136, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RATING2, xRating, 136, sRating, 8 + + GROUPBOX "Total Rating", IDC_BENCHMARK_TOTAL_RATING, xTotalRating, 163, sTotalRating, 38 + RTEXT "0", IDC_BENCHMARK_TOTAL_USAGE_VALUE, xUsage, 181, sUsage, 8 + RTEXT "0", IDC_BENCHMARK_TOTAL_RPU_VALUE, xRpu, 181, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_TOTAL_RATING_VALUE, xRating, 181, sRating, 8 + + LTEXT "Elapsed time:", IDC_BENCHMARK_ELAPSED, m, 163, g2xs, 8 + LTEXT "Size:", IDC_BENCHMARK_SIZE, m, 176, g2xs, 8 + LTEXT "Passes:", IDC_BENCHMARK_PASSES, m, 189, g2xs, 8 + RTEXT "00:00:00", IDC_BENCHMARK_ELAPSED_VALUE, g3x, 163, g3xs, 8 + RTEXT "0", IDC_BENCHMARK_SIZE_VALUE, g3x, 176, g3xs, 8 + RTEXT "0", IDC_BENCHMARK_PASSES_VALUE, g3x, 189, g3xs, 8 +END -#define gSize 160 +#ifdef UNDER_CE + +#undef m +#define m 4 + +#undef xc +#undef yc + +#define xc 154 +#define yc 160 + +#undef g0xs +#undef g1x +#undef g1xs +#undef g2xs +#undef g3x +#undef g3xs + +#undef bxs +#undef bys + +#define bxs 60 +#define bys 14 + +#undef gs +#undef gSpace + +#define gs 160 #define gSpace 24 -#define g0XSize 90 -#define g1XSize 44 -#define g1XPos (marg + g0XSize) -#define gc2XPos (g1XPos + g1XSize + 10) -#define gc2XSize 80 +#define g0xs (xc - bxs) +#define g1xs 44 + +#undef g4x +#define g4x (m) -#define g10XPos (marg + marg) +#undef xRpu +#undef xUsage +#undef xRating +#undef xTotalRating -#define gRatingSize 60 -#define gSpeedSize 60 -#define gUsageSize 60 -#define gRpuSize 60 +#undef sRpu +#undef sRating +#undef sUsage +#undef sLabel +#undef sTotalRating -#define gRatingPos (xSize - marg - marg - gRatingSize) -#define gRpuPos (gRatingPos - gRpuSize) -#define gUsagePos (gRpuPos - gUsageSize) -#define gSpeedPos (gUsagePos - gSpeedSize) +#define sRating 40 +#define sUsage 24 +#define sRpu 40 -#define gLabelSize (gUsagePos - g10XPos) -#define gTotalRatingSize (gUsageSize + gRpuSize + gRatingSize + marg + marg) -#define gTotalRatingPos (xSize - marg - gTotalRatingSize) +#define xRating (xs - m - sRating) +#define xRpu (xRating - sRpu) +#define xUsage (xRpu - sUsage) -#define g2XSize 58 -#define g3XSize 36 -#define g3XPos (marg + g2XSize) +#define sLabel (xUsage - g4x) +#define sTotalRating (sRpu + sRating) +#define xTotalRating (xs - m - sTotalRating) +#define g3xs 32 +#define g3x (xRpu - g3xs) +#define g2xs (g3x - m) -IDD_DIALOG_BENCHMARK DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE | WS_MINIMIZEBOX + +IDD_DIALOG_BENCHMARK_2 DIALOG 0, 0, xs, ys MY_MODAL_DIALOG_STYLE | WS_MINIMIZEBOX CAPTION "Benchmark" MY_FONT BEGIN - PUSHBUTTON "&Restart", IDC_BUTTON_RESTART, bXPos1, marg, bXSize, bYSize - PUSHBUTTON "&Stop", IDC_BUTTON_STOP, bXPos1, 27, bXSize, bYSize - - PUSHBUTTON "&Help", IDHELP, bXPos2, bYPos, bXSize,bYSize - PUSHBUTTON "Cancel", IDCANCEL, bXPos1, bYPos, bXSize, bYSize + PUSHBUTTON "&Restart", IDC_BUTTON_RESTART, bx1, m, bxs, bys + PUSHBUTTON "&Stop", IDC_BUTTON_STOP, bx1, m + bys + m, bxs, bys + PUSHBUTTON "Cancel", IDCANCEL, bx1, m + bys + m + bys + m, bxs, bys - LTEXT "&Dictionary size:", IDC_BENCHMARK_DICTIONARY, marg, marg + 1, g0XSize, 8 - COMBOBOX IDC_BENCHMARK_COMBO_DICTIONARY, g1XPos, marg, g1XSize, 140, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Dictionary size:", IDC_BENCHMARK_DICTIONARY, m, m, g0xs, 8 + COMBOBOX IDC_BENCHMARK_COMBO_DICTIONARY, m, m + 11, g1xs, 140, MY_COMBO - LTEXT "&Number of CPU threads:", IDC_BENCHMARK_NUM_THREADS, marg, 24, g0XSize, 8 - COMBOBOX IDC_BENCHMARK_COMBO_NUM_THREADS, g1XPos, 23, g1XSize, 140, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Number of CPU threads:", IDC_BENCHMARK_NUM_THREADS, m, 31, g0xs, 8 + COMBOBOX IDC_BENCHMARK_COMBO_NUM_THREADS, m, 42, g1xs, 140, MY_COMBO - LTEXT "Memory usage:", IDC_BENCHMARK_MEMORY, gc2XPos, marg + 1, gc2XSize, 8 - LTEXT "0 MB", IDC_BENCHMARK_MEMORY_VALUE, gc2XPos + gc2XSize, marg + 1, 40, 8 - LTEXT "1", IDC_BENCHMARK_HARDWARE_THREADS, gc2XPos, 24, 40, 8 + LTEXT "0 MB", IDC_BENCHMARK_MEMORY_VALUE, m + g1xs + 8, m + 13, xc - bxs - g1xs - 8, 8 + LTEXT "1", IDC_BENCHMARK_HARDWARE_THREADS, m + g1xs + 8, 44, xc - bxs - g1xs - 8, 8 + + LTEXT "Current", IDC_BENCHMARK_CURRENT, g4x, 70, sLabel, 8 + RTEXT "100%", IDC_BENCHMARK_COMPRESSING_USAGE, xUsage, 70, sUsage, 8 + RTEXT "0", IDC_BENCHMARK_COMPRESSING_RPU, xRpu, 70, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_COMPRESSING_RATING, xRating, 70, sRating, 8 - RTEXT "CPU Usage", IDC_BENCHMARK_USAGE_LABEL, gUsagePos, 53, gUsageSize, 8 - RTEXT "Speed", IDC_BENCHMARK_SPEED_LABEL, gSpeedPos, 53, gSpeedSize, 8 - RTEXT "Rating / Usage", IDC_BENCHMARK_RPU_LABEL, gRpuPos, 53, gRpuSize, 8 - RTEXT "Rating", IDC_BENCHMARK_RATING_LABEL, gRatingPos, 53, gRatingSize, 8 + LTEXT "Resulting", IDC_BENCHMARK_RESULTING, g4x, 80, sLabel, 8 + RTEXT "100%", IDC_BENCHMARK_COMPRESSING_USAGE2, xUsage, 80, sUsage, 8 + RTEXT "0", IDC_BENCHMARK_COMPRESSING_RPU2, xRpu, 80, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_COMPRESSING_RATING2, xRating, 80, sRating, 8 + + LTEXT "Compressing", IDC_BENCHMARK_COMPRESSING, m, 60, xc - bxs, 8 - GROUPBOX "Compressing", IDC_BENCHMARK_COMPRESSING, marg, 64, xSize2, 40 - - LTEXT "Current", IDC_BENCHMARK_CURRENT, g10XPos, 76, gLabelSize, 8 - RTEXT "100%", IDC_BENCHMARK_COMPRESSING_USAGE, gUsagePos, 76, gUsageSize, 8 - RTEXT "100 KB/s", IDC_BENCHMARK_COMPRESSING_SPEED, gSpeedPos, 76, gSpeedSize, 8 - RTEXT "0", IDC_BENCHMARK_COMPRESSING_RPU, gRpuPos, 76, gRpuSize, 8 - RTEXT "0", IDC_BENCHMARK_COMPRESSING_RATING, gRatingPos, 76, gRatingSize, 8 + LTEXT "Current", IDC_BENCHMARK_CURRENT2, g4x, 104, sLabel, 8 + RTEXT "100%", IDC_BENCHMARK_DECOMPRESSING_USAGE, xUsage, 104, sUsage, 8 + RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RPU, xRpu, 104, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RATING, xRating, 104, sRating, 8 - LTEXT "Resulting", IDC_BENCHMARK_RESULTING, g10XPos, 89, gLabelSize, 8 - RTEXT "100%", IDC_BENCHMARK_COMPRESSING_USAGE2, gUsagePos, 89, gUsageSize, 8 - RTEXT "100 KB/s", IDC_BENCHMARK_COMPRESSING_SPEED2, gSpeedPos, 89, gSpeedSize, 8 - RTEXT "0", IDC_BENCHMARK_COMPRESSING_RPU2, gRpuPos, 89, gRpuSize, 8 - RTEXT "0", IDC_BENCHMARK_COMPRESSING_RATING2, gRatingPos, 89, gRatingSize, 8 + LTEXT "Resulting", IDC_BENCHMARK_RESULTING2, g4x, 114, sLabel, 8 + RTEXT "100%", IDC_BENCHMARK_DECOMPRESSING_USAGE2, xUsage, 114, sUsage, 8 + RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RPU2, xRpu, 114, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RATING2, xRating, 114, sRating, 8 - GROUPBOX "Decompressing", IDC_BENCHMARK_DECOMPRESSING, marg, 111, xSize2, 40 + LTEXT "Decompressing", IDC_BENCHMARK_DECOMPRESSING, m, 94, xc, 8 - LTEXT "Current", IDC_BENCHMARK_CURRENT2, g10XPos, 123, gLabelSize, 8 - RTEXT "100%", IDC_BENCHMARK_DECOMPRESSING_USAGE, gUsagePos, 123, gUsageSize, 8 - RTEXT "100 KB/s", IDC_BENCHMARK_DECOMPRESSING_SPEED, gSpeedPos, 123, gSpeedSize, 8 - RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RPU, gRpuPos, 123, gRpuSize, 8 - RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RATING, gRatingPos, 123, gRatingSize, 8 + RTEXT "0", IDC_BENCHMARK_TOTAL_RPU_VALUE, xRpu, 140, sRpu, 8 + RTEXT "0", IDC_BENCHMARK_TOTAL_RATING_VALUE, xRating, 140, sRating, 8 - LTEXT "Resulting", IDC_BENCHMARK_RESULTING2, g10XPos, 136, gLabelSize, 8 - RTEXT "100%", IDC_BENCHMARK_DECOMPRESSING_USAGE2, gUsagePos, 136, gUsageSize, 8 - RTEXT "100 KB/s", IDC_BENCHMARK_DECOMPRESSING_SPEED2, gSpeedPos, 136, gSpeedSize, 8 - RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RPU2, gRpuPos, 136, gRpuSize, 8 - RTEXT "0", IDC_BENCHMARK_DECOMPRESSING_RATING2, gRatingPos, 136, gRatingSize, 8 - - GROUPBOX "Total Rating", IDC_BENCHMARK_TOTAL_RATING, gTotalRatingPos, 163, gTotalRatingSize, 38 - RTEXT "0", IDC_BENCHMARK_TOTAL_USAGE_VALUE, gUsagePos, 181, gUsageSize, 8 - RTEXT "0", IDC_BENCHMARK_TOTAL_RPU_VALUE, gRpuPos, 181, gRpuSize, 8 - RTEXT "0", IDC_BENCHMARK_TOTAL_RATING_VALUE, gRatingPos, 181, gRatingSize, 8 - - LTEXT "Elapsed time:", IDC_BENCHMARK_ELAPSED, marg, 163, g2XSize, 8 - LTEXT "Size:", IDC_BENCHMARK_SIZE, marg, 176, g2XSize, 8 - LTEXT "Passes:", IDC_BENCHMARK_PASSES, marg, 189, g2XSize, 8 - RTEXT "00:00:00", IDC_BENCHMARK_ELAPSED_VALUE, g3XPos, 163, g3XSize, 8 - RTEXT "0", IDC_BENCHMARK_SIZE_VALUE, g3XPos, 176, g3XSize, 8 - RTEXT "0", IDC_BENCHMARK_PASSES_VALUE, g3XPos, 189, g3XSize, 8 + LTEXT "Elapsed time:", IDC_BENCHMARK_ELAPSED, m, 130, g2xs, 8 + LTEXT "Size:", IDC_BENCHMARK_SIZE, m, 140, g2xs, 8 + LTEXT "Passes:", IDC_BENCHMARK_PASSES, m, 150, g2xs, 8 + + RTEXT "00:00:00", IDC_BENCHMARK_ELAPSED_VALUE, g3x, 130, g3xs, 8 + RTEXT "0", IDC_BENCHMARK_SIZE_VALUE, g3x, 140, g3xs, 8 + RTEXT "0", IDC_BENCHMARK_PASSES_VALUE, g3x, 150, g3xs, 8 END + +#endif diff --git a/CPP/7zip/UI/GUI/BenchmarkDialogRes.h b/CPP/7zip/UI/GUI/BenchmarkDialogRes.h index 6ef52188..2488bd1c 100755 --- a/CPP/7zip/UI/GUI/BenchmarkDialogRes.h +++ b/CPP/7zip/UI/GUI/BenchmarkDialogRes.h @@ -1,4 +1,5 @@ -#define IDD_DIALOG_BENCHMARK 800 +#define IDD_DIALOG_BENCHMARK 550 +#define IDD_DIALOG_BENCHMARK_2 650 #define IDC_BUTTON_STOP 1001 #define IDC_BUTTON_RESTART 1002 #define IDC_BENCHMARK_DICTIONARY 1010 diff --git a/CPP/7zip/UI/GUI/CompressDialog.cpp b/CPP/7zip/UI/GUI/CompressDialog.cpp index 04a40a43..bafaf371 100755 --- a/CPP/7zip/UI/GUI/CompressDialog.cpp +++ b/CPP/7zip/UI/GUI/CompressDialog.cpp @@ -2,16 +2,14 @@ #include "StdAfx.h" -#include "Common/Defs.h" #include "Common/IntToString.h" #include "Common/StringConvert.h" -#include "Windows/CommonDialog.h" #include "Windows/FileDir.h" #include "Windows/FileName.h" -#include "Windows/ResourceString.h" #include "Windows/System.h" +#include "../FileManager/BrowseDialog.h" #include "../FileManager/FormatUtils.h" #include "../FileManager/HelpUtils.h" #include "../FileManager/SplitUtils.h" @@ -22,8 +20,6 @@ #include "CompressDialog.h" -#include "resource.h" - #ifndef _UNICODE extern bool g_IsNT; #endif @@ -249,7 +245,7 @@ static UInt64 GetMaxRamSizeForProgram() physSize = 0; else physSize -= kMinSysSize; - const UInt64 kMinUseSize = (1 << 25); + const UInt64 kMinUseSize = (1 << 24); if (physSize < kMinUseSize) physSize = kMinUseSize; return physSize; @@ -282,23 +278,24 @@ bool CCompressDialog::OnInit() AddVolumeItems(m_Volume); - ReadCompressionInfo(m_RegistryInfo); + m_RegistryInfo.Load(); CheckButton(IDC_COMPRESS_CHECK_SHOW_PASSWORD, m_RegistryInfo.ShowPassword); CheckButton(IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES, m_RegistryInfo.EncryptHeaders); UpdatePasswordControl(); - Info.ArchiverInfoIndex = 0; + Info.FormatIndex = -1; int i; - for (i = 0; i < m_ArchiverInfoList.Size(); i++) + for (i = 0; i < ArcIndices.Size(); i++) { - const CArcInfoEx &ai = m_ArchiverInfoList[i]; + int arcIndex = ArcIndices[i]; + const CArcInfoEx &ai = (*ArcFormats)[arcIndex]; int index = (int)m_Format.AddString(ai.Name); - m_Format.SetItemData(index, i); - if (ai.Name.CompareNoCase(m_RegistryInfo.ArchiveType) == 0 || i == 0) + m_Format.SetItemData(index, arcIndex); + if (ai.Name.CompareNoCase(m_RegistryInfo.ArcType) == 0 || i == 0) { m_Format.SetCurSel(index); - Info.ArchiverInfoIndex = i; + Info.FormatIndex = arcIndex; } } @@ -306,8 +303,8 @@ bool CCompressDialog::OnInit() SetLevel(); SetParams(); - for (i = 0; i < m_RegistryInfo.HistoryArchives.Size() && i < kHistorySize; i++) - m_ArchivePath.AddString(m_RegistryInfo.HistoryArchives[i]); + for (i = 0; i < m_RegistryInfo.ArcPaths.Size() && i < kHistorySize; i++) + m_ArchivePath.AddString(m_RegistryInfo.ArcPaths[i]); m_UpdateMode.AddString(LangString(IDS_COMPRESS_UPDATE_MODE_ADD, 0x02000DA1)); m_UpdateMode.AddString(LangString(IDS_COMPRESS_UPDATE_MODE_UPDATE, 0x02000DA2)); @@ -332,6 +329,9 @@ bool CCompressDialog::OnInit() SetEncryptionMethod(); SetMemoryUsage(); + + NormalizePosition(); + return CModalDialog::OnInit(); } @@ -339,7 +339,9 @@ namespace NCompressDialog { bool CInfo::GetFullPathName(UString &result) const { + #ifndef UNDER_CE NDirectory::MySetCurrentDirectory(CurrentDirPrefix); + #endif return MyGetFullPathName(ArchiveName, result); } } @@ -491,7 +493,7 @@ void CCompressDialog::OnButtonSetArchive() UString s = LangString(IDS_OPEN_TYPE_ALL_FILES, 0x02000DB1); s += L" (*.*)"; UString resPath; - if (!MyGetOpenFileName(HWND(*this), title, fullFileName, s, resPath)) + if (!MyBrowseForFile(HWND(*this), title, fullFileName, s, resPath)) return; m_ArchivePath.SetText(resPath); } @@ -546,8 +548,8 @@ void CCompressDialog::OnOK() UString s; m_ArchivePath.GetText(s); s.Trim(); - m_RegistryInfo.HistoryArchives.Clear(); - AddUniqueString(m_RegistryInfo.HistoryArchives, s); + m_RegistryInfo.ArcPaths.Clear(); + AddUniqueString(m_RegistryInfo.ArcPaths, s); Info.ArchiveName = s; Info.UpdateMode = NCompressDialog::NUpdateMode::EEnum(m_UpdateMode.GetCurSel()); @@ -564,7 +566,7 @@ void CCompressDialog::OnOK() Info.Method = GetMethodSpec(); Info.EncryptionMethod = GetEncryptionMethodSpec(); - Info.ArchiverInfoIndex = GetFormatIndex(); + Info.FormatIndex = GetFormatIndex(); Info.SFXMode = IsSFX(); Info.OpenShareForWrite = IsButtonCheckedBool(IDC_COMPRESS_SHARED); @@ -590,7 +592,7 @@ void CCompressDialog::OnOK() wchar_t s[32]; ConvertUInt64ToString(volumeSize, s); if (::MessageBoxW(*this, MyFormatNew(IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE, 0x02000D42, s), - L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION | MB_TASKMODAL) != IDYES) + L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES) return; } } @@ -601,15 +603,15 @@ void CCompressDialog::OnOK() UString sTemp; m_ArchivePath.GetLBText(i, sTemp); sTemp.Trim(); - AddUniqueString(m_RegistryInfo.HistoryArchives, sTemp); + AddUniqueString(m_RegistryInfo.ArcPaths, sTemp); } - if (m_RegistryInfo.HistoryArchives.Size() > kHistorySize) - m_RegistryInfo.HistoryArchives.DeleteBack(); + if (m_RegistryInfo.ArcPaths.Size() > kHistorySize) + m_RegistryInfo.ArcPaths.DeleteBack(); - m_RegistryInfo.ArchiveType = m_ArchiverInfoList[Info.ArchiverInfoIndex].Name; + m_RegistryInfo.ArcType = (*ArcFormats)[Info.FormatIndex].Name; m_RegistryInfo.ShowPassword = IsShowPasswordChecked(); - SaveCompressionInfo(m_RegistryInfo); + m_RegistryInfo.Save(); CModalDialog::OnOK(); } @@ -643,9 +645,9 @@ bool CCompressDialog::OnCommand(int code, int itemID, LPARAM lParam) } case IDC_COMPRESS_COMBO_LEVEL: { - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; int index = FindRegistryFormatAlways(ai.Name); - NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; + NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; fo.ResetForLevelChange(); SetMethod(); SetSolidBlockSize(); @@ -693,7 +695,7 @@ void CCompressDialog::SetArchiveName2(bool prevWasSFX) { UString fileName; m_ArchivePath.GetText(fileName); - const CArcInfoEx &prevArchiverInfo = m_ArchiverInfoList[m_PrevFormat]; + const CArcInfoEx &prevArchiverInfo = (*ArcFormats)[m_PrevFormat]; if (prevArchiverInfo.KeepName || Info.KeepName) { UString prevExtension = prevArchiverInfo.GetMainExt(); @@ -716,9 +718,9 @@ void CCompressDialog::SetArchiveName2(bool prevWasSFX) void CCompressDialog::SetArchiveName(const UString &name) { UString fileName = name; - Info.ArchiverInfoIndex = GetFormatIndex(); - const CArcInfoEx &ai = m_ArchiverInfoList[Info.ArchiverInfoIndex]; - m_PrevFormat = Info.ArchiverInfoIndex; + Info.FormatIndex = GetFormatIndex(); + const CArcInfoEx &ai = (*ArcFormats)[Info.FormatIndex]; + m_PrevFormat = Info.FormatIndex; if (ai.KeepName) { fileName = OriginalFileName; @@ -746,10 +748,10 @@ void CCompressDialog::SetArchiveName(const UString &name) int CCompressDialog::FindRegistryFormat(const UString &name) { - for (int i = 0; i < m_RegistryInfo.FormatOptionsVector.Size(); i++) + for (int i = 0; i < m_RegistryInfo.Formats.Size(); i++) { - const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[i]; - if (GetUnicodeString(fo.FormatID) == name) + const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[i]; + if (name.CompareNoCase(GetUnicodeString(fo.FormatID)) == 0) return i; } return -1; @@ -762,7 +764,7 @@ int CCompressDialog::FindRegistryFormatAlways(const UString &name) { NCompression::CFormatOptions fo; fo.FormatID = GetSystemString(name); - index = m_RegistryInfo.FormatOptionsVector.Add(fo); + index = m_RegistryInfo.Formats.Add(fo); } return index; } @@ -770,7 +772,7 @@ int CCompressDialog::FindRegistryFormatAlways(const UString &name) int CCompressDialog::GetStaticFormatIndex() { int formatIndex = GetFormatIndex(); - const CArcInfoEx &ai = m_ArchiverInfoList[formatIndex]; + const CArcInfoEx &ai = (*ArcFormats)[formatIndex]; for (int i = 0; i < MY_SIZE_OF_ARRAY(g_Formats); i++) if (ai.Name.CompareNoCase(g_Formats[i].Name) == 0) return i; @@ -793,12 +795,12 @@ void CCompressDialog::SetLevel() { m_Level.ResetContent(); const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()]; - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; int index = FindRegistryFormat(ai.Name); UInt32 level = kNormal; if (index >= 0) { - const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; + const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; if (fo.Level <= kUltra) level = fo.Level; else @@ -829,12 +831,12 @@ void CCompressDialog::SetMethod(int keepMethodId) return; } const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()]; - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; int index = FindRegistryFormat(ai.Name); UString defaultMethod; if (index >= 0) { - const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; + const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; defaultMethod = fo.Method; } bool isSfx = IsSFX(); @@ -865,14 +867,14 @@ void CCompressDialog::SetMethod(int keepMethodId) bool CCompressDialog::IsZipFormat() { - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; return (ai.Name.CompareNoCase(L"zip") == 0); } void CCompressDialog::SetEncryptionMethod() { _encryptionMethod.ResetContent(); - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; if (ai.Name.CompareNoCase(L"7z") == 0) { _encryptionMethod.AddString(TEXT("AES-256")); @@ -884,7 +886,7 @@ void CCompressDialog::SetEncryptionMethod() UString encryptionMethod; if (index >= 0) { - const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; + const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; encryptionMethod = fo.EncryptionMethod; } _encryptionMethod.AddString(TEXT("ZipCrypto")); @@ -960,12 +962,12 @@ int CCompressDialog::AddDictionarySize(UInt32 size) void CCompressDialog::SetDictionary() { m_Dictionary.ResetContent(); - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; int index = FindRegistryFormat(ai.Name); UInt32 defaultDictionary = UInt32(-1); if (index >= 0) { - const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; + const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; if (fo.Method.CompareNoCase(GetMethodSpec()) == 0) defaultDictionary = fo.Dictionary; } @@ -1105,12 +1107,12 @@ int CCompressDialog::AddOrder(UInt32 size) void CCompressDialog::SetOrder() { m_Order.ResetContent(); - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; int index = FindRegistryFormat(ai.Name); UInt32 defaultOrder = UInt32(-1); if (index >= 0) { - const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; + const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; if (fo.Method.CompareNoCase(GetMethodSpec()) == 0) defaultOrder = fo.Order; } @@ -1224,11 +1226,11 @@ void CCompressDialog::SetSolidBlockSize() UInt32 defaultBlockSize = (UInt32)-1; - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; int index = FindRegistryFormat(ai.Name); if (index >= 0) { - const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; + const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; if (fo.Method.CompareNoCase(GetMethodSpec()) == 0) defaultBlockSize = fo.BlockLogSize; } @@ -1268,12 +1270,12 @@ void CCompressDialog::SetNumThreads() UInt32 numHardwareThreads = NSystem::GetNumberOfProcessors(); UInt32 defaultValue = numHardwareThreads; - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; int index = FindRegistryFormat(ai.Name); if (index >= 0) { - const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; - if (fo.Method.CompareNoCase(GetMethodSpec()) == 0) + const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; + if (fo.Method.CompareNoCase(GetMethodSpec()) == 0 && fo.NumThreads != (UInt32)-1) defaultValue = fo.NumThreads; } @@ -1422,23 +1424,23 @@ void CCompressDialog::SetMemoryUsage() void CCompressDialog::SetParams() { - const CArcInfoEx &ai = m_ArchiverInfoList[GetFormatIndex()]; + const CArcInfoEx &ai = (*ArcFormats)[GetFormatIndex()]; m_Params.SetText(TEXT("")); int index = FindRegistryFormat(ai.Name); if (index >= 0) { - const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; + const NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; m_Params.SetText(fo.Options); } } void CCompressDialog::SaveOptionsInMem() { - const CArcInfoEx &ai = m_ArchiverInfoList[Info.ArchiverInfoIndex]; + const CArcInfoEx &ai = (*ArcFormats)[Info.FormatIndex]; int index = FindRegistryFormatAlways(ai.Name); m_Params.GetText(Info.Options); Info.Options.Trim(); - NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index]; + NCompression::CFormatOptions &fo = m_RegistryInfo.Formats[index]; fo.Options = Info.Options; fo.Level = GetLevelSpec(); fo.Dictionary = GetDictionarySpec(); diff --git a/CPP/7zip/UI/GUI/CompressDialog.h b/CPP/7zip/UI/GUI/CompressDialog.h index 75eeeee8..19c75875 100755 --- a/CPP/7zip/UI/GUI/CompressDialog.h +++ b/CPP/7zip/UI/GUI/CompressDialog.h @@ -4,12 +4,13 @@ #define __COMPRESS_DIALOG_H #include "Windows/Control/ComboBox.h" -#include "Windows/Control/Dialog.h" #include "Windows/Control/Edit.h" #include "../Common/LoadCodecs.h" #include "../Common/ZipRegistry.h" +#include "../FileManager/DialogSize.h" + #include "CompressDialogRes.h" namespace NCompressDialog @@ -53,7 +54,7 @@ namespace NCompressDialog bool GetFullPathName(UString &result) const; - int ArchiverInfoIndex; + int FormatIndex; UString Password; bool EncryptHeadersIsAllowed; @@ -155,13 +156,17 @@ class CCompressDialog: public NWindows::NControl::CModalDialog int GetFormatIndex(); public: - CObjectVector<CArcInfoEx> m_ArchiverInfoList; + CObjectVector<CArcInfoEx> *ArcFormats; + CRecordVector<int> ArcIndices; NCompressDialog::CInfo Info; UString OriginalFileName; // for bzip2, gzip2 INT_PTR Create(HWND wndParent = 0) - { return CModalDialog::Create(IDD_DIALOG_COMPRESS, wndParent); } + { + BIG_DIALOG_SIZE(400, 304); + return CModalDialog::Create(SIZED_DIALOG(IDD_DIALOG_COMPRESS), wndParent); + } protected: diff --git a/CPP/7zip/UI/GUI/CompressDialog.rc b/CPP/7zip/UI/GUI/CompressDialog.rc index 8e79f1bf..5f622c76 100755 --- a/CPP/7zip/UI/GUI/CompressDialog.rc +++ b/CPP/7zip/UI/GUI/CompressDialog.rc @@ -1,124 +1,187 @@ #include "CompressDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 400 -#define ySize2 305 - -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#define xc 400 +#define yc 304 #undef gSize #undef gSpace -#undef g0XSize -#undef g1XPos -#undef g1XSize -#undef g2XSize -#undef g3XPos -#undef g3XSize -#undef g4XPos -#undef g4XPos2 -#undef g4XSize -#undef g4XSize2 -#undef bXPos1 -#undef bXPos2 -#undef bXPos3 -#undef bYPos - -#define gSize 190 +#undef g0xs +#undef g1x +#undef g1xs +#undef g2xs +#undef g3x +#undef g3xs +#undef g4x +#undef g4x2 +#undef g4xs +#undef g4xs2 + +#define gSize 192 #define gSpace 24 -#define g1XSize 90 -#define g0XSize (gSize - g1XSize) -#define g1XPos (marg + g0XSize) - -#define g3XSize 40 -#define g2XSize (gSize - g3XSize) -#define g3XPos (marg + g2XSize) +#define g1xs 88 +#define g0xs (gSize - g1xs) +#define g1x (m + g0xs) -#define g4XPos (marg + gSize + gSpace) -#define g4XPos2 (g4XPos + 7) -#define g4XSize (xSize2 - gSize - gSpace) -#define g4XSize2 (g4XSize - 14) +#define g3xs 40 +#define g2xs (gSize - g3xs) +#define g3x (m + g2xs) -#define OptYPos 73 -#define PswYPos 128 +#define g4x (m + gSize + gSpace) +#define g4x2 (g4x + m) +#define g4xs (xc - gSize - gSpace) +#define g4xs2 (g4xs - m - m) -#define bXPos1 (xSize - marg - bXSize) -#define bXPos2 (bXPos1 - 10 - bXSize) -#define bXPos3 (bXPos2 - 10 - bXSize) +#define yOpt 72 +#define yPsw 128 -#define bYPos (ySize - marg - bYSize) - -IDD_DIALOG_COMPRESS DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +IDD_DIALOG_COMPRESS MY_DIALOG CAPTION "Add to Archive" -MY_FONT BEGIN - LTEXT "&Archive:", IDC_STATIC_COMPRESS_ARCHIVE, marg, marg, xSize2, 8 - COMBOBOX IDC_COMPRESS_COMBO_ARCHIVE, marg, 18, xSize2 - bDotsSize - 12, 126, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...", IDC_COMPRESS_BUTTON_SET_ARCHIVE, xSize - marg - bDotsSize, 17, bDotsSize, bYSize, WS_GROUP + LTEXT "&Archive:", IDC_STATIC_COMPRESS_ARCHIVE, m, m, xc, 8 + COMBOBOX IDC_COMPRESS_COMBO_ARCHIVE, m, 18, xc - bxsDots - 12, 126, MY_COMBO_WITH_EDIT + PUSHBUTTON "...", IDC_COMPRESS_BUTTON_SET_ARCHIVE, xs - m - bxsDots, 17, bxsDots, bys, WS_GROUP - LTEXT "Archive &format:", IDC_STATIC_COMPRESS_FORMAT, marg, 41, g0XSize, 8 - COMBOBOX IDC_COMPRESS_COMBO_FORMAT, g1XPos, 39, g1XSize , 80,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Archive &format:", IDC_STATIC_COMPRESS_FORMAT, m, 41, g0xs, 8 + COMBOBOX IDC_COMPRESS_COMBO_FORMAT, g1x, 39, g1xs , 80, MY_COMBO | CBS_SORT - LTEXT "Compression &level:",IDC_STATIC_COMPRESS_LEVEL, marg, 62, g0XSize, 8 - COMBOBOX IDC_COMPRESS_COMBO_LEVEL, g1XPos, 60, g1XSize, 80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Compression &level:",IDC_STATIC_COMPRESS_LEVEL, m, 62, g0xs, 8 + COMBOBOX IDC_COMPRESS_COMBO_LEVEL, g1x, 60, g1xs, 80, MY_COMBO - LTEXT "Compression &method:",IDC_STATIC_COMPRESS_METHOD, marg, 83, g0XSize, 8 - COMBOBOX IDC_COMPRESS_COMBO_METHOD, g1XPos, 81, g1XSize, 80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Compression &method:",IDC_STATIC_COMPRESS_METHOD, m, 83, g0xs, 8 + COMBOBOX IDC_COMPRESS_COMBO_METHOD, g1x, 81, g1xs, 80, MY_COMBO - LTEXT "&Dictionary size:",IDC_STATIC_COMPRESS_DICTIONARY, marg, 104, g0XSize, 8 - COMBOBOX IDC_COMPRESS_COMBO_DICTIONARY, g1XPos, 102, g1XSize, 167, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Dictionary size:",IDC_STATIC_COMPRESS_DICTIONARY, m, 104, g0xs, 8 + COMBOBOX IDC_COMPRESS_COMBO_DICTIONARY, g1x, 102, g1xs, 167, MY_COMBO - LTEXT "&Word size:",IDC_STATIC_COMPRESS_ORDER, marg, 125, g0XSize, 8 - COMBOBOX IDC_COMPRESS_COMBO_ORDER, g1XPos, 123, g1XSize, 141, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Word size:",IDC_STATIC_COMPRESS_ORDER, m, 125, g0xs, 8 + COMBOBOX IDC_COMPRESS_COMBO_ORDER, g1x, 123, g1xs, 141, MY_COMBO - LTEXT "&Solid Block size:",IDC_STATIC_COMPRESS_SOLID, marg, 146, g0XSize, 8 - COMBOBOX IDC_COMPRESS_COMBO_SOLID, g1XPos, 144, g1XSize, 140, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Solid Block size:",IDC_STATIC_COMPRESS_SOLID, m, 146, g0xs, 8 + COMBOBOX IDC_COMPRESS_COMBO_SOLID, g1x, 144, g1xs, 140, MY_COMBO - LTEXT "&Number of CPU threads:",IDC_STATIC_COMPRESS_THREADS, marg, 167, g0XSize, 8 - COMBOBOX IDC_COMPRESS_COMBO_THREADS, g1XPos, 165, g1XSize - 35, 140, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "1", IDC_COMPRESS_HARDWARE_THREADS, g1XPos + g1XSize - 35 + 10, 167, 25, 8 + LTEXT "&Number of CPU threads:",IDC_STATIC_COMPRESS_THREADS, m, 167, g0xs, 8 + COMBOBOX IDC_COMPRESS_COMBO_THREADS, g1x, 165, g1xs - 35, 140, MY_COMBO + RTEXT "1", IDC_COMPRESS_HARDWARE_THREADS, g1x + g1xs - 35 + 10, 167, 25, 8 - LTEXT "Memory usage for Compressing:", IDC_STATIC_COMPRESS_MEMORY, marg, 190, g2XSize, 8 - RTEXT "0", IDC_STATIC_COMPRESS_MEMORY_VALUE, g3XPos, 190, g3XSize, 8 + LTEXT "Memory usage for Compressing:", IDC_STATIC_COMPRESS_MEMORY, m, 190, g2xs, 8 + RTEXT "0", IDC_STATIC_COMPRESS_MEMORY_VALUE, g3x, 190, g3xs, 8 - LTEXT "Memory usage for Decompressing:", IDC_STATIC_COMPRESS_MEMORY_DE, marg, 206, g2XSize, 8 - RTEXT "0",IDC_STATIC_COMPRESS_MEMORY_DE_VALUE, g3XPos, 206, g3XSize, 8 + LTEXT "Memory usage for Decompressing:", IDC_STATIC_COMPRESS_MEMORY_DE, m, 206, g2xs, 8 + RTEXT "0",IDC_STATIC_COMPRESS_MEMORY_DE_VALUE, g3x, 206, g3xs, 8 - LTEXT "Split to &volumes, bytes:", IDC_STATIC_COMPRESS_VOLUME, marg, 225, gSize, 8 - COMBOBOX IDC_COMPRESS_COMBO_VOLUME, marg, 237, gSize, 73, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + LTEXT "Split to &volumes, bytes:", IDC_STATIC_COMPRESS_VOLUME, m, 225, gSize, 8 + COMBOBOX IDC_COMPRESS_COMBO_VOLUME, m, 237, gSize, 73, MY_COMBO_WITH_EDIT - LTEXT "&Parameters:",IDC_STATIC_COMPRESS_PARAMETERS, marg, 260, xSize2, 8 - EDITTEXT IDC_COMPRESS_EDIT_PARAMETERS, marg, 272, xSize2, 14, ES_AUTOHSCROLL + LTEXT "&Parameters:",IDC_STATIC_COMPRESS_PARAMETERS, m, 260, xc, 8 + EDITTEXT IDC_COMPRESS_EDIT_PARAMETERS, m, 272, xc, 14, ES_AUTOHSCROLL - LTEXT "&Update mode:",IDC_STATIC_COMPRESS_UPDATE_MODE, g4XPos, 39, g4XSize, 8 - COMBOBOX IDC_COMPRESS_COMBO_UPDATE_MODE, g4XPos, 51, g4XSize, 80, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Update mode:",IDC_STATIC_COMPRESS_UPDATE_MODE, g4x, 39, g4xs, 8 + COMBOBOX IDC_COMPRESS_COMBO_UPDATE_MODE, g4x, 51, g4xs, 80, MY_COMBO - GROUPBOX "Options",IDC_STATIC_COMPRESS_OPTIONS, g4XPos, OptYPos, g4XSize, 48 - CONTROL "Create SF&X archive",IDC_COMPRESS_SFX, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - g4XPos2, OptYPos + 14, g4XSize2, 10 - CONTROL "Compress shared files",IDC_COMPRESS_SHARED, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - g4XPos2, OptYPos + 30, g4XSize2, 10 + GROUPBOX "Options",IDC_STATIC_COMPRESS_OPTIONS, g4x, yOpt, g4xs, 48 + CONTROL "Create SF&X archive",IDC_COMPRESS_SFX, MY_CHECKBOX, + g4x2, yOpt + 14, g4xs2, 10 + CONTROL "Compress shared files",IDC_COMPRESS_SHARED, MY_CHECKBOX, + g4x2, yOpt + 30, g4xs2, 10 - GROUPBOX "Encryption",IDC_COMPRESS_ENCRYPTION, g4XPos, PswYPos, g4XSize, 127 + GROUPBOX "Encryption",IDC_COMPRESS_ENCRYPTION, g4x, yPsw, g4xs, 127 + + LTEXT "Enter password:",IDC_STATIC_COMPRESS_PASSWORD1, g4x2, yPsw + 14, g4xs2, 8 + EDITTEXT IDC_COMPRESS_EDIT_PASSWORD1, g4x2, yPsw + 26, g4xs2, 14, ES_PASSWORD | ES_AUTOHSCROLL + LTEXT "Reenter password:",IDC_STATIC_COMPRESS_PASSWORD2, g4x2, yPsw + 46, g4xs2, 8 + EDITTEXT IDC_COMPRESS_EDIT_PASSWORD2, g4x2, yPsw + 58, g4xs2, 14, ES_PASSWORD | ES_AUTOHSCROLL + + CONTROL "Show Password",IDC_COMPRESS_CHECK_SHOW_PASSWORD,MY_CHECKBOX, + g4x2, yPsw + 79, g4xs2, 10 + + LTEXT "&Encryption method:",IDC_STATIC_COMPRESS_ENCRYPTION_METHOD, g4x2, yPsw + 95, 100, 8 + COMBOBOX IDC_COMPRESS_COMBO_ENCRYPTION_METHOD, g4x2 + 100, yPsw + 93, g4xs2 - 100, 198, MY_COMBO + + CONTROL "Encrypt file &names", IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES, MY_CHECKBOX, + g4x2, yPsw + 111, g4xs2, 10 + + DEFPUSHBUTTON "OK", IDOK, bx3, by, bxs, bys, WS_GROUP + PUSHBUTTON "Cancel", IDCANCEL, bx2, by, bxs, bys + PUSHBUTTON "Help", IDHELP, bx1, by, bxs, bys +END + + +#ifdef UNDER_CE + +#undef m +#undef xc +#undef yc - LTEXT "Enter password:",IDC_STATIC_COMPRESS_PASSWORD1, g4XPos2, PswYPos + 14, g4XSize2, 8 - EDITTEXT IDC_COMPRESS_EDIT_PASSWORD1, g4XPos2, PswYPos + 26, g4XSize2, 14, ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "Reenter password:",IDC_STATIC_COMPRESS_PASSWORD2, g4XPos2, PswYPos + 46, g4XSize2, 8 - EDITTEXT IDC_COMPRESS_EDIT_PASSWORD2, g4XPos2, PswYPos + 58, g4XSize2, 14, ES_PASSWORD | ES_AUTOHSCROLL +#define m 4 +#define xc 152 +#define yc 160 - CONTROL "Show Password",IDC_COMPRESS_CHECK_SHOW_PASSWORD,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, - g4XPos2, PswYPos + 79, g4XSize2, 10 - LTEXT "&Encryption method:",IDC_STATIC_COMPRESS_ENCRYPTION_METHOD, g4XPos2, PswYPos + 95, 100, 8 - COMBOBOX IDC_COMPRESS_COMBO_ENCRYPTION_METHOD, g4XPos2 + 100, PswYPos + 93, g4XSize2 - 100, 198, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +IDD_DIALOG_COMPRESS_2 MY_DIALOG +CAPTION "Add to Archive" +MY_FONT +BEGIN + // LTEXT "&Archive:", IDC_STATIC_COMPRESS_ARCHIVE, m, m + 1, 32, 8 + COMBOBOX IDC_COMPRESS_COMBO_ARCHIVE, m, m, xc - bxsDots - m, 126, MY_COMBO_WITH_EDIT + PUSHBUTTON "...", IDC_COMPRESS_BUTTON_SET_ARCHIVE, xs - m - bxsDots, m, bxsDots, 12, WS_GROUP + + COMBOBOX IDC_COMPRESS_COMBO_FORMAT, m , 22, 32, 80, MY_COMBO | CBS_SORT + COMBOBOX IDC_COMPRESS_COMBO_LEVEL, m + 36, 22, 68, 80, MY_COMBO + COMBOBOX IDC_COMPRESS_COMBO_METHOD, m + 108, 22, 44, 80, MY_COMBO + + COMBOBOX IDC_COMPRESS_COMBO_DICTIONARY, m, 40, 40, 80, MY_COMBO + COMBOBOX IDC_COMPRESS_COMBO_ORDER, m + 44, 40, 32, 80, MY_COMBO + COMBOBOX IDC_COMPRESS_COMBO_SOLID, m + 80, 40, 40, 80, MY_COMBO + COMBOBOX IDC_COMPRESS_COMBO_THREADS, m + 124, 40, 28, 80, MY_COMBO + + LTEXT "Split to &volumes, bytes:", IDC_STATIC_COMPRESS_VOLUME, m, 60, 32, 8 + COMBOBOX IDC_COMPRESS_COMBO_VOLUME, m + 32, 58, 44, 73, MY_COMBO_WITH_EDIT + LTEXT "&Parameters:",IDC_STATIC_COMPRESS_PARAMETERS, m + 80, 60, 48, 8 + EDITTEXT IDC_COMPRESS_EDIT_PARAMETERS, m + 128, 58, 24, 13, ES_AUTOHSCROLL + + COMBOBOX IDC_COMPRESS_COMBO_UPDATE_MODE, m, 76, 88, 80, MY_COMBO + CONTROL "SF&X", IDC_COMPRESS_SFX, MY_CHECKBOX, m + 92, 77, 60, 10 - CONTROL "Encrypt file &names", IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - g4XPos2, PswYPos + 111, g4XSize2, 10 + CONTROL "Compress shared files", IDC_COMPRESS_SHARED, MY_CHECKBOX, m, 94, xc, 10 - DEFPUSHBUTTON "OK", IDOK, bXPos3, bYPos, bXSize, bYSize, WS_GROUP - PUSHBUTTON "Cancel", IDCANCEL, bXPos2, bYPos, bXSize, bYSize - PUSHBUTTON "Help", IDHELP, bXPos1, bYPos, bXSize, bYSize + LTEXT "Enter password:", IDC_STATIC_COMPRESS_PASSWORD1, m, 112, 60, 8 + EDITTEXT IDC_COMPRESS_EDIT_PASSWORD1, m + 60, 110, 44, 13, ES_PASSWORD | ES_AUTOHSCROLL + CONTROL "Show Password", IDC_COMPRESS_CHECK_SHOW_PASSWORD, MY_CHECKBOX, m + 108, 112, 44, 10 + + COMBOBOX IDC_COMPRESS_COMBO_ENCRYPTION_METHOD, m, 128, 48, 198, MY_COMBO + CONTROL "Encrypt file &names", IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES, MY_CHECKBOX, m + 52, 130, 100, 10 + + OK_CANCEL +END + +#endif + +STRINGTABLE +BEGIN + IDS_METHOD_STORE "Store" + IDS_METHOD_NORMAL "Normal" + IDS_METHOD_MAXIMUM "Maximum" + IDS_METHOD_FAST "Fast" + IDS_METHOD_FASTEST "Fastest" + IDS_METHOD_ULTRA "Ultra" + + IDS_COMPRESS_NON_SOLID "Non-solid" + IDS_COMPRESS_SOLID "Solid" + + IDS_COMPRESS_UPDATE_MODE_ADD "Add and replace files" + IDS_COMPRESS_UPDATE_MODE_UPDATE "Update and add files" + IDS_COMPRESS_UPDATE_MODE_FRESH "Freshen existing files" + IDS_COMPRESS_UPDATE_MODE_SYNCHRONIZE "Synchronize files" + IDS_COMPRESS_SET_ARCHIVE_DIALOG_TITLE "Browse" + IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE "Specified volume size: {0} bytes.\nAre you sure you want to split archive into such volumes?" + + IDS_OPEN_TYPE_ALL_FILES "All Files" + + IDS_PASSWORD_USE_ASCII "Use only English letters, numbers and special characters (!, #, $, ...) for password." + IDS_PASSWORD_PASSWORDS_DO_NOT_MATCH "Passwords do not match" + IDS_PASSWORD_IS_TOO_LONG "Password is too long" END diff --git a/CPP/7zip/UI/GUI/CompressDialogRes.h b/CPP/7zip/UI/GUI/CompressDialogRes.h index beedde4e..2dcdc80e 100755 --- a/CPP/7zip/UI/GUI/CompressDialogRes.h +++ b/CPP/7zip/UI/GUI/CompressDialogRes.h @@ -1,4 +1,5 @@ -#define IDD_DIALOG_COMPRESS 152 +#define IDD_DIALOG_COMPRESS 551 +#define IDD_DIALOG_COMPRESS_2 651 #define IDC_STATIC_COMPRESS_MEMORY 1022 #define IDC_STATIC_COMPRESS_MEMORY_DE 1023 #define IDC_STATIC_COMPRESS_MEMORY_VALUE 1027 @@ -50,3 +51,31 @@ #define IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES 1122 #define IDC_COMPRESS_SHARED 1130 + + +#define IDS_OPEN_TYPE_ALL_FILES 80 + +#define IDS_METHOD_STORE 81 +#define IDS_METHOD_NORMAL 82 +#define IDS_METHOD_MAXIMUM 83 +#define IDS_METHOD_FAST 84 +#define IDS_METHOD_FASTEST 85 +#define IDS_METHOD_ULTRA 86 + +#define IDS_COMPRESS_NON_SOLID 88 +#define IDS_COMPRESS_SOLID 89 + +#define IDS_COMPRESS_UPDATE_MODE_ADD 90 +#define IDS_COMPRESS_UPDATE_MODE_UPDATE 91 +#define IDS_COMPRESS_UPDATE_MODE_FRESH 92 +#define IDS_COMPRESS_UPDATE_MODE_SYNCHRONIZE 93 + +#define IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE 94 + +#define IDS_COMPRESS_SET_ARCHIVE_DIALOG_TITLE 96 + +#define IDS_PASSWORD_USE_ASCII 110 +#define IDS_PASSWORD_PASSWORDS_DO_NOT_MATCH 111 +#define IDS_PASSWORD_IS_TOO_LONG 112 + +#define IDS_COMPRESS_INCORRECT_VOLUME_SIZE 95 diff --git a/CPP/7zip/UI/GUI/Extract.rc b/CPP/7zip/UI/GUI/Extract.rc index 0c655ce4..ad8f9910 100755 --- a/CPP/7zip/UI/GUI/Extract.rc +++ b/CPP/7zip/UI/GUI/Extract.rc @@ -20,4 +20,14 @@ BEGIN IDS_MEM_ERROR "The system cannot allocate the required amount of memory" IDS_UNKNOWN_ERROR "Unknown Error" IDS_UNSUPPORTED_ARCHIVE_TYPE "Unsupported archive type" + + IDC_EXTRACT_RADIO_FULL_PATHNAMES "Full pathnames" + IDC_EXTRACT_RADIO_CURRENT_PATHNAMES "Current pathnames" + IDC_EXTRACT_RADIO_NO_PATHNAMES "No pathnames" + + IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE "Ask before overwrite" + IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT "Overwrite without prompt" + IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES "Skip existing files" + IDC_EXTRACT_RADIO_AUTO_RENAME "Auto rename" + IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING "Auto rename existing files" END diff --git a/CPP/7zip/UI/GUI/ExtractDialog.cpp b/CPP/7zip/UI/GUI/ExtractDialog.cpp index 6b388700..94556639 100755 --- a/CPP/7zip/UI/GUI/ExtractDialog.cpp +++ b/CPP/7zip/UI/GUI/ExtractDialog.cpp @@ -7,7 +7,7 @@ #include "ExtractDialog.h" #include "Common/StringConvert.h" -#include "Windows/Shell.h" + #include "Windows/FileName.h" #include "Windows/FileDir.h" #include "Windows/ResourceString.h" @@ -18,35 +18,47 @@ #include "../Common/ZipRegistry.h" +#include "../FileManager/BrowseDialog.h" #include "../FileManager/LangUtils.h" +#include "../FileManager/resourceGui.h" #include "ExtractRes.h" #include "ExtractDialogRes.h" -// #include "Help/Context/Extract.h" - using namespace NWindows; using namespace NFile; using namespace NName; -static const int kPathModeButtons[] = +extern HINSTANCE g_hInstance; + +static CIDLangPair kPathMode_Pairs[] = +{ + { IDC_EXTRACT_RADIO_FULL_PATHNAMES, 0x02000811 }, + // { IDC_EXTRACT_RADIO_CURRENT_PATHNAMES, 0x02000812 }, + { IDC_EXTRACT_RADIO_NO_PATHNAMES, 0x02000813 } +}; + +static CIDLangPair kOverwriteMode_Pairs[] = { - IDC_EXTRACT_RADIO_FULL_PATHNAMES, - IDC_EXTRACT_RADIO_CURRENT_PATHNAMES, - IDC_EXTRACT_RADIO_NO_PATHNAMES + { IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE, 0x02000821 }, + { IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT, 0x02000822 }, + { IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES, 0x02000823 }, + { IDC_EXTRACT_RADIO_AUTO_RENAME, 0x02000824 }, + { IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING, 0x02000825 } }; #ifndef _SFX -static const NExtract::NPathMode::EEnum kPathModeButtonsVals[] = +static const + // NExtract::NPathMode::EEnum + int + kPathModeButtonsVals[] = { NExtract::NPathMode::kFullPathnames, - NExtract::NPathMode::kCurrentPathnames, + // NExtract::NPathMode::kCurrentPathnames, NExtract::NPathMode::kNoPathnames }; -static const int kNumPathnamesButtons = sizeof(kPathModeButtons) / sizeof(kPathModeButtons[0]); - static const int kOverwriteButtons[] = { IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE, @@ -56,7 +68,10 @@ static const int kOverwriteButtons[] = IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING, }; -static const NExtract::NOverwriteMode::EEnum kOverwriteButtonsVals[] = +static const + int + // NExtract::NOverwriteMode::EEnum + kOverwriteButtonsVals[] = { NExtract::NOverwriteMode::kAskBefore, NExtract::NOverwriteMode::kWithoutPrompt, @@ -76,65 +91,11 @@ static const int kFilesButtons[] = static const int kNumFilesButtons = sizeof(kFilesButtons) / sizeof(kFilesButtons[0]); */ -void CExtractDialog::GetPathMode() -{ - for (int i = 0; i < kNumPathnamesButtons; i++) - if(IsButtonCheckedBool(kPathModeButtons[i])) - { - PathMode = kPathModeButtonsVals[i]; - return; - } - throw 1; -} - -void CExtractDialog::SetPathMode() -{ - for (int j = 0; j < 2; j++) - { - for (int i = 0; i < kNumPathnamesButtons; i++) - if(PathMode == kPathModeButtonsVals[i]) - { - CheckRadioButton(kPathModeButtons[0], kPathModeButtons[kNumPathnamesButtons - 1], - kPathModeButtons[i]); - return; - } - PathMode = kPathModeButtonsVals[0]; - } - throw 1; -} - -void CExtractDialog::GetOverwriteMode() -{ - for (int i = 0; i < kNumOverwriteButtons; i++) - if(IsButtonCheckedBool(kOverwriteButtons[i])) - { - OverwriteMode = kOverwriteButtonsVals[i]; - return; - } - throw 0; -} - -void CExtractDialog::SetOverwriteMode() -{ - for (int j = 0; j < 2; j++) - { - for (int i = 0; i < kNumOverwriteButtons; i++) - if(OverwriteMode == kOverwriteButtonsVals[i]) - { - CheckRadioButton(kOverwriteButtons[0], kOverwriteButtons[kNumOverwriteButtons - 1], - kOverwriteButtons[i]); - return; - } - OverwriteMode = kOverwriteButtonsVals[0]; - } - throw 1; -} - /* int CExtractDialog::GetFilesMode() const { for (int i = 0; i < kNumFilesButtons; i++) - if(IsButtonCheckedBool(kFilesButtons[i])) + if (IsButtonCheckedBool(kFilesButtons[i])) return i; throw 0; } @@ -147,18 +108,10 @@ static CIDLangPair kIDLangPairs[] = { { IDC_STATIC_EXTRACT_EXTRACT_TO, 0x02000801 }, { IDC_EXTRACT_PATH_MODE, 0x02000810 }, - { IDC_EXTRACT_RADIO_FULL_PATHNAMES, 0x02000811 }, - { IDC_EXTRACT_RADIO_CURRENT_PATHNAMES, 0x02000812 }, - { IDC_EXTRACT_RADIO_NO_PATHNAMES, 0x02000813 }, - { IDC_EXTRACT_OVERWRITE_MODE, 0x02000820 }, - { IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE, 0x02000821 }, - { IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT, 0x02000822 }, - { IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES, 0x02000823 }, - { IDC_EXTRACT_RADIO_AUTO_RENAME, 0x02000824 }, - { IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING, 0x02000825 }, - { IDC_EXTRACT_FILES, 0x02000830 }, - { IDC_EXTRACT_RADIO_SELECTED_FILES, 0x02000831 }, - { IDC_EXTRACT_RADIO_ALL_FILES, 0x02000832 }, + { IDC_EXTRACT_OVERWRITE_MODE, 0x02000820 }, + // { IDC_EXTRACT_FILES, 0x02000830 }, + // { IDC_EXTRACT_RADIO_SELECTED_FILES, 0x02000831 }, + // { IDC_EXTRACT_RADIO_ALL_FILES, 0x02000832 }, { IDC_EXTRACT_PASSWORD, 0x02000802 }, { IDC_EXTRACT_CHECK_SHOW_PASSWORD, 0x02000B02 }, { IDOK, 0x02000702 }, @@ -174,6 +127,23 @@ static CIDLangPair kIDLangPairs[] = static const int kHistorySize = 8; #endif +#ifndef _SFX +static void AddComboItems(NWindows::NControl::CComboBox &combo, const CIDLangPair *items, int numItems, const int *values, int curVal) +{ + int curSel = 0; + for (int i = 0; i < numItems; i++) + { + UString s = LangString(items[i].ControlID, items[i].LangID); + s.Replace(L"&", L""); + int index = (int)combo.AddString(s); + combo.SetItemData(index, i); + if (values[i] == curVal) + curSel = i; + } + combo.SetCurSel(curSel); +} +#endif + bool CExtractDialog::OnInit() { #ifdef LANG @@ -186,18 +156,18 @@ bool CExtractDialog::OnInit() _passwordControl.SetPasswordChar(TEXT('*')); #endif - NExtract::CInfo extractionInfo; + NExtract::CInfo info; #ifdef NO_REGISTRY PathMode = NExtract::NPathMode::kFullPathnames; OverwriteMode = NExtract::NOverwriteMode::kAskBefore; - // extractionInfo.Paths = NExtract::NPathMode::kFullPathnames; + // info.Paths = NExtract::NPathMode::kFullPathnames; #else - ReadExtractionInfo(extractionInfo); - CheckButton(IDC_EXTRACT_CHECK_SHOW_PASSWORD, extractionInfo.ShowPassword); + info.Load(); + CheckButton(IDC_EXTRACT_CHECK_SHOW_PASSWORD, info.ShowPassword); UpdatePasswordControl(); - PathMode = extractionInfo.PathMode; - OverwriteMode = extractionInfo.OverwriteMode; + PathMode = info.PathMode; + OverwriteMode = info.OverwriteMode; #endif _path.Attach(GetItem(IDC_EXTRACT_COMBO_PATH)); @@ -205,22 +175,26 @@ bool CExtractDialog::OnInit() _path.SetText(DirectoryPath); #ifndef NO_REGISTRY - for(int i = 0; i < extractionInfo.Paths.Size() && i < kHistorySize; i++) - _path.AddString(extractionInfo.Paths[i]); + for (int i = 0; i < info.Paths.Size() && i < kHistorySize; i++) + _path.AddString(info.Paths[i]); #endif /* - if(extractionInfo.Paths.Size() > 0) + if (info.Paths.Size() > 0) _path.SetCurSel(0); else _path.SetCurSel(-1); */ - - #ifndef _SFX - SetPathMode(); - SetOverwriteMode(); + + _pathMode.Attach(GetItem(IDC_EXTRACT_COMBO_PATH_MODE)); + AddComboItems(_pathMode, kPathMode_Pairs, sizeof(kPathMode_Pairs) / sizeof(kPathMode_Pairs[0]), + kPathModeButtonsVals, PathMode); + + _overwriteMode.Attach(GetItem(IDC_EXTRACT_COMBO_OVERWRITE_MODE)); + AddComboItems(_overwriteMode, kOverwriteMode_Pairs, sizeof(kOverwriteMode_Pairs) / sizeof(kOverwriteMode_Pairs[0]), + kOverwriteButtonsVals, OverwriteMode); /* CheckRadioButton(kFilesButtons[0], kFilesButtons[kNumFilesButtons - 1], @@ -233,11 +207,15 @@ bool CExtractDialog::OnInit() #endif + HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON)); + SetIcon(ICON_BIG, icon); // CWindow filesWindow = GetItem(IDC_EXTRACT_RADIO_FILES); // filesWindow.Enable(_enableFilesButton); // UpdateWildCardState(); + NormalizePosition(); + return CModalDialog::OnInit(); } @@ -284,7 +262,7 @@ void CExtractDialog::OnButtonSetPath() _path.GetText(currentPath); UString title = LangStringSpec(IDS_EXTRACT_SET_FOLDER, 0x02000881); UString resultPath; - if (!NShell::BrowseForFolder(HWND(*this), title, currentPath, resultPath)) + if (!MyBrowseForFolder(HWND(*this), title, currentPath, resultPath)) return; #ifndef NO_REGISTRY _path.SetCurSel(-1); @@ -294,7 +272,7 @@ void CExtractDialog::OnButtonSetPath() void AddUniqueString(UStringVector &list, const UString &s) { - for(int i = 0; i < list.Size(); i++) + for (int i = 0; i < list.Size(); i++) if (s.CompareNoCase(list[i]) == 0) return; list.Add(s); @@ -303,18 +281,21 @@ void AddUniqueString(UStringVector &list, const UString &s) void CExtractDialog::OnOK() { #ifndef _SFX - GetPathMode(); - GetOverwriteMode(); + NExtract::NPathMode::EEnum pathMode2 = (NExtract::NPathMode::EEnum)kPathModeButtonsVals[_pathMode.GetItemData(_pathMode.GetCurSel())]; + if (PathMode != NExtract::NPathMode::kCurrentPathnames || + pathMode2 != NExtract::NPathMode::kFullPathnames) + PathMode = pathMode2; + OverwriteMode = (NExtract::NOverwriteMode::EEnum)kOverwriteButtonsVals[_overwriteMode.GetItemData(_overwriteMode.GetCurSel())]; + // _filesMode = (NExtractionDialog::NFilesMode::EEnum)GetFilesMode(); _passwordControl.GetText(Password); #endif - NExtract::CInfo extractionInfo; - extractionInfo.PathMode = PathMode; - extractionInfo.OverwriteMode = OverwriteMode; - extractionInfo.ShowPassword = (IsButtonChecked( - IDC_EXTRACT_CHECK_SHOW_PASSWORD) == BST_CHECKED); + NExtract::CInfo info; + info.PathMode = PathMode; + info.OverwriteMode = OverwriteMode; + info.ShowPassword = (IsButtonCheckedBool(IDC_EXTRACT_CHECK_SHOW_PASSWORD)); UString s; @@ -325,10 +306,10 @@ void CExtractDialog::OnOK() #else int currentItem = _path.GetCurSel(); - if(currentItem == CB_ERR) + if (currentItem == CB_ERR) { _path.GetText(s); - if(_path.GetCount() >= kHistorySize) + if (_path.GetCount() >= kHistorySize) currentItem = _path.GetCount() - 1; } else @@ -338,19 +319,19 @@ void CExtractDialog::OnOK() s.Trim(); #ifndef _SFX - AddUniqueString(extractionInfo.Paths, s); + AddUniqueString(info.Paths, s); #endif DirectoryPath = s; #ifndef NO_REGISTRY - for(int i = 0; i < _path.GetCount(); i++) - if(i != currentItem) + for (int i = 0; i < _path.GetCount(); i++) + if (i != currentItem) { UString sTemp; _path.GetLBText(i, sTemp); sTemp.Trim(); - AddUniqueString(extractionInfo.Paths, sTemp); + AddUniqueString(info.Paths, sTemp); } - SaveExtractionInfo(extractionInfo); + info.Save(); #endif CModalDialog::OnOK(); } diff --git a/CPP/7zip/UI/GUI/ExtractDialog.h b/CPP/7zip/UI/GUI/ExtractDialog.h index 6ac82f74..b0636c72 100755 --- a/CPP/7zip/UI/GUI/ExtractDialog.h +++ b/CPP/7zip/UI/GUI/ExtractDialog.h @@ -1,11 +1,10 @@ // ExtractDialog.h -#ifndef __EXTRACTDIALOG_H -#define __EXTRACTDIALOG_H +#ifndef __EXTRACT_DIALOG_H +#define __EXTRACT_DIALOG_H #include "ExtractDialogRes.h" -#include "Windows/Control/Dialog.h" #include "Windows/Control/Edit.h" #include "Windows/Control/ComboBox.h" @@ -14,6 +13,8 @@ #endif #include "../Common/ExtractMode.h" +#include "../FileManager/DialogSize.h" + namespace NExtractionDialog { /* @@ -39,13 +40,11 @@ class CExtractDialog: public NWindows::NControl::CModalDialog #ifndef _SFX NWindows::NControl::CEdit _passwordControl; + NWindows::NControl::CComboBox _pathMode; + NWindows::NControl::CComboBox _overwriteMode; #endif #ifndef _SFX - void GetPathMode(); - void SetPathMode(); - void GetOverwriteMode(); - void SetOverwriteMode(); // int GetFilesMode() const; void UpdatePasswordControl(); #endif @@ -71,7 +70,14 @@ public: NExtract::NOverwriteMode::EEnum OverwriteMode; INT_PTR Create(HWND aWndParent = 0) - { return CModalDialog::Create(IDD_DIALOG_EXTRACT, aWndParent); } + { + #ifdef _SFX + BIG_DIALOG_SIZE(240, 64); + #else + BIG_DIALOG_SIZE(300, 160); + #endif + return CModalDialog::Create(SIZED_DIALOG(IDD_DIALOG_EXTRACT), aWndParent); + } }; #endif diff --git a/CPP/7zip/UI/GUI/ExtractDialog.rc b/CPP/7zip/UI/GUI/ExtractDialog.rc index f1d50317..db8a5b24 100755 --- a/CPP/7zip/UI/GUI/ExtractDialog.rc +++ b/CPP/7zip/UI/GUI/ExtractDialog.rc @@ -1,80 +1,83 @@ #include "ExtractDialogRes.h" #include "../../GuiCommon.rc" -#define xSize2 285 -#define ySize2 204 +#define xc 280 +#define yc 128 -#define xSize (xSize2 + marg + marg) -#define ySize (ySize2 + marg + marg) +#undef g1xs +#undef g2x +#undef g2x2 +#undef g2xs +#undef g2xs2 -#undef g1XSize -#undef g1XSize2 -#undef g1XPos2 -#undef g2XPos -#undef g2XPos2 -#undef g2XSize -#undef g2XSize2 +#define g1xs 128 -#define bYPos (ySize - marg - bYSize) +#define gSpace 24 +#define g2x (m + g1xs + gSpace) +#define g2x2 (g2x + m) +#define g2xs (xc - g1xs - gSpace) +#define g2xs2 (g2xs - m - m) -#define g1XSize 127 -#define g1XSize2 (g1XSize - 13) -#define g1XPos2 (marg + 7) +IDD_DIALOG_EXTRACT MY_DIALOG +CAPTION "Extract" +BEGIN + LTEXT "E&xtract to:", IDC_STATIC_EXTRACT_EXTRACT_TO, m, m, xc, 8 + COMBOBOX IDC_EXTRACT_COMBO_PATH, m, m + 12, xc - bxsDots - 12, 100, MY_COMBO_WITH_EDIT + PUSHBUTTON "...", IDC_EXTRACT_BUTTON_SET_PATH, xs - m - bxsDots, m + 12 - 2, bxsDots, bys, WS_GROUP + + LTEXT "Path mode:", IDC_EXTRACT_PATH_MODE, m, m + 36, g1xs, 8 + COMBOBOX IDC_EXTRACT_COMBO_PATH_MODE, m, m + 48, g1xs, 140, MY_COMBO + + LTEXT "Overwrite mode:", IDC_EXTRACT_OVERWRITE_MODE, m, m + 68, g1xs, 8 + COMBOBOX IDC_EXTRACT_COMBO_OVERWRITE_MODE, m, m + 80, g1xs, 140, MY_COMBO + + #ifdef UNDER_CE + LTEXT "Password", IDC_EXTRACT_PASSWORD, g2x, m + 36, g2xs, 8 + #else + GROUPBOX "Password", IDC_EXTRACT_PASSWORD, g2x, m + 36, g2xs, 56 + #endif + EDITTEXT IDC_EXTRACT_EDIT_PASSWORD, g2x2, m + 50, g2xs2, 14, ES_PASSWORD | ES_AUTOHSCROLL + CONTROL "Show Password", IDC_EXTRACT_CHECK_SHOW_PASSWORD, MY_CHECKBOX, g2x2, m + 72, g2xs2, 10 + + DEFPUSHBUTTON "OK", IDOK, bx3, by, bxs, bys, WS_GROUP + PUSHBUTTON "Cancel", IDCANCEL, bx2, by, bxs, bys + PUSHBUTTON "Help", IDHELP, bx1, by, bxs, bys +END + + +#ifdef UNDER_CE -#define gSpace 14 -#define g2XPos (marg + g1XSize + gSpace) -#define g2XPos2 (g2XPos + 7) -#define g2XSize (xSize2 - g1XSize - gSpace) -#define g2XSize2 (g2XSize - 14) +#undef m +#define m 4 -#define bXPos1 (xSize - marg - bXSize) -#define bXPos2 (bXPos1 - 10 - bXSize) -#define bXPos3 (bXPos2 - 10 - bXSize) +#undef xc +#undef yc -IDD_DIALOG_EXTRACT DIALOG DISCARDABLE 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE +#define xc 152 +#define yc 128 + +#undef g1xs + +#define g1xs 64 + +IDD_DIALOG_EXTRACT_2 MY_DIALOG CAPTION "Extract" -MY_FONT BEGIN - LTEXT "E&xtract to:", IDC_STATIC_EXTRACT_EXTRACT_TO, marg, marg, xSize2, 8 - - COMBOBOX IDC_EXTRACT_COMBO_PATH, marg, 21, xSize2 - bDotsSize - 13, 126, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - - PUSHBUTTON "...", IDC_EXTRACT_BUTTON_SET_PATH, xSize - marg - bDotsSize, 20, bDotsSize, bYSize, WS_GROUP - - GROUPBOX "Path mode",IDC_EXTRACT_PATH_MODE, marg, 44, g1XSize, 57 - CONTROL "Full pathnames", IDC_EXTRACT_RADIO_FULL_PATHNAMES,"Button", BS_AUTORADIOBUTTON | WS_GROUP, - g1XPos2, 57, g1XSize2, 10 - CONTROL "Current pathnames",IDC_EXTRACT_RADIO_CURRENT_PATHNAMES, "Button", BS_AUTORADIOBUTTON, - g1XPos2, 71, g1XSize2, 10 - CONTROL "No pathnames", IDC_EXTRACT_RADIO_NO_PATHNAMES, "Button", BS_AUTORADIOBUTTON, - g1XPos2, 85, g1XSize2, 10 - - GROUPBOX "Overwrite mode",IDC_EXTRACT_OVERWRITE_MODE, g2XPos, 44, g2XSize, 88, WS_GROUP - CONTROL "Ask before overwrite", IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE, "Button", BS_AUTORADIOBUTTON | WS_GROUP, - g2XPos2, 57, g2XSize2, 10 - CONTROL "Overwrite without prompt", IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT, "Button", BS_AUTORADIOBUTTON, - g2XPos2, 71, g2XSize2, 10 - CONTROL "Skip existing files", IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES, "Button", BS_AUTORADIOBUTTON, - g2XPos2, 85, g2XSize2, 10 - CONTROL "Auto rename", IDC_EXTRACT_RADIO_AUTO_RENAME, "Button", BS_AUTORADIOBUTTON, - g2XPos2, 99, g2XSize2, 10 - CONTROL "Auto rename existing files", IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING, "Button", BS_AUTORADIOBUTTON, - g2XPos2,113, g2XSize2, 10 - - GROUPBOX "Files",IDC_EXTRACT_FILES, marg, 140, 127, 48, NOT WS_VISIBLE | WS_DISABLED | WS_GROUP - CONTROL "&Selected files",IDC_EXTRACT_RADIO_SELECTED_FILES, "Button", BS_AUTORADIOBUTTON | NOT WS_VISIBLE | WS_DISABLED | WS_GROUP, - g1XPos2, 153, g1XSize2, 10 - CONTROL "&All files",IDC_EXTRACT_RADIO_ALL_FILES, "Button", BS_AUTORADIOBUTTON | NOT WS_VISIBLE | WS_DISABLED, - g1XPos2, 166, g1XSize2, 10 - - GROUPBOX "Password",IDC_EXTRACT_PASSWORD, g2XPos, 142, g2XSize, 46 - EDITTEXT IDC_EXTRACT_EDIT_PASSWORD,154,153,130,14, ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "Show Password",IDC_EXTRACT_CHECK_SHOW_PASSWORD,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, - g2XPos2, 172, g2XSize2, 10 + LTEXT "E&xtract to:", IDC_STATIC_EXTRACT_EXTRACT_TO, m, m, xc - bxsDots - 8, 8 + COMBOBOX IDC_EXTRACT_COMBO_PATH, m, m + 12, xc - bxsDots - 8, 100, MY_COMBO_WITH_EDIT + PUSHBUTTON "...", IDC_EXTRACT_BUTTON_SET_PATH, xs - m - bxsDots, m + 12 - 3, bxsDots, bys, WS_GROUP + + LTEXT "Path mode:", IDC_EXTRACT_PATH_MODE, m, m + 36, g1xs, 8 + COMBOBOX IDC_EXTRACT_COMBO_PATH_MODE, m + g1xs, m + 36, xc - g1xs, 100, MY_COMBO + + LTEXT "Overwrite mode:", IDC_EXTRACT_OVERWRITE_MODE, m, m + 56, g1xs, 8 + COMBOBOX IDC_EXTRACT_COMBO_OVERWRITE_MODE, m + g1xs, m + 56, xc - g1xs, 100, MY_COMBO + + LTEXT "Password", IDC_EXTRACT_PASSWORD, m, m + 76, g1xs, 8 + EDITTEXT IDC_EXTRACT_EDIT_PASSWORD, m + g1xs, m + 76, xc - g1xs, 14, ES_PASSWORD | ES_AUTOHSCROLL + CONTROL "Show Password", IDC_EXTRACT_CHECK_SHOW_PASSWORD, MY_CHECKBOX, m, m + 92, xc, 10 - DEFPUSHBUTTON "OK", IDOK, bXPos3, bYPos, bXSize, bYSize, WS_GROUP - PUSHBUTTON "Cancel", IDCANCEL, bXPos2, bYPos, bXSize, bYSize - PUSHBUTTON "Help", IDHELP, bXPos1, bYPos, bXSize, bYSize + OK_CANCEL END - +#endif diff --git a/CPP/7zip/UI/GUI/ExtractDialogRes.h b/CPP/7zip/UI/GUI/ExtractDialogRes.h index bc45ed23..38652b29 100755 --- a/CPP/7zip/UI/GUI/ExtractDialogRes.h +++ b/CPP/7zip/UI/GUI/ExtractDialogRes.h @@ -1,24 +1,15 @@ -#define IDD_DIALOG_EXTRACT 137 +#define IDD_DIALOG_EXTRACT 552 +#define IDD_DIALOG_EXTRACT_2 652 #define IDC_STATIC_EXTRACT_EXTRACT_TO 1020 #define IDC_EXTRACT_COMBO_PATH 1021 #define IDC_EXTRACT_BUTTON_SET_PATH 1022 +#define IDC_EXTRACT_COMBO_PATH_MODE 1030 +#define IDC_EXTRACT_COMBO_OVERWRITE_MODE 1031 #define IDC_EXTRACT_PATH_MODE 1040 -#define IDC_EXTRACT_RADIO_FULL_PATHNAMES 1041 -#define IDC_EXTRACT_RADIO_CURRENT_PATHNAMES 1042 -#define IDC_EXTRACT_RADIO_NO_PATHNAMES 1043 - #define IDC_EXTRACT_OVERWRITE_MODE 1050 -#define IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE 1051 -#define IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT 1052 -#define IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES 1053 -#define IDC_EXTRACT_RADIO_SELECTED_FILES 1054 -#define IDC_EXTRACT_RADIO_ALL_FILES 1055 -#define IDC_EXTRACT_RADIO_AUTO_RENAME 1056 -#define IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING 1057 - #define IDC_EXTRACT_FILES 1060 diff --git a/CPP/7zip/UI/GUI/ExtractGUI.cpp b/CPP/7zip/UI/GUI/ExtractGUI.cpp index 95864d2c..54ffd51c 100755 --- a/CPP/7zip/UI/GUI/ExtractGUI.cpp +++ b/CPP/7zip/UI/GUI/ExtractGUI.cpp @@ -13,14 +13,16 @@ #include "../FileManager/ExtractCallback.h" #include "../FileManager/FormatUtils.h" #include "../FileManager/LangUtils.h" +#include "../FileManager/resourceGui.h" #include "../Common/ArchiveExtractCallback.h" #include "../Common/PropIDUtils.h" #include "../Explorer/MyMessages.h" -#include "resource.h" +#include "resource2.h" #include "ExtractRes.h" + #include "ExtractDialog.h" #include "ExtractGUI.h" @@ -28,87 +30,84 @@ using namespace NWindows; static const wchar_t *kIncorrectOutDir = L"Incorrect output directory path"; -struct CThreadExtracting -{ - CCodecs *codecs; - CExtractCallbackImp *ExtractCallbackSpec; - CIntVector FormatIndices; - - UStringVector *ArchivePaths; - UStringVector *ArchivePathsFull; - const NWildcard::CCensorNode *WildcardCensor; - const CExtractOptions *Options; - CMyComPtr<IExtractCallbackUI> ExtractCallback; - CDecompressStat Stat; - UString ErrorMessage; - HRESULT Result; - - DWORD Process() - { - ExtractCallbackSpec->ProgressDialog.WaitCreating(); - try - { - Result = DecompressArchives( - codecs, FormatIndices, - *ArchivePaths, *ArchivePathsFull, - *WildcardCensor, *Options, ExtractCallbackSpec, ExtractCallback, ErrorMessage, Stat); - } - catch(const UString &s) - { - ErrorMessage = s; - Result = E_FAIL; - } - catch(const wchar_t *s) - { - ErrorMessage = s; - Result = E_FAIL; - } - catch(const char *s) - { - ErrorMessage = GetUnicodeString(s); - Result = E_FAIL; - } - catch(...) - { - Result = E_FAIL; - } - ExtractCallbackSpec->ProgressDialog.MyClose(); - return 0; - } - static THREAD_FUNC_DECL MyThreadFunction(void *param) - { - return ((CThreadExtracting *)param)->Process(); - } -}; - #ifndef _SFX static void AddValuePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s) { wchar_t sz[32]; s += LangString(resourceID, langID); - s += L" "; + s += L' '; ConvertUInt64ToString(value, sz); s += sz; - s += L"\n"; + s += L'\n'; } static void AddSizePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s) { wchar_t sz[32]; s += LangString(resourceID, langID); - s += L" "; + s += L' '; ConvertUInt64ToString(value, sz); s += sz; ConvertUInt64ToString(value >> 20, sz); s += L" ("; s += sz; s += L" MB)"; - s += L"\n"; + s += L'\n'; } #endif +class CThreadExtracting: public CProgressThreadVirt +{ + HRESULT ProcessVirt(); +public: + CCodecs *codecs; + CExtractCallbackImp *ExtractCallbackSpec; + CIntVector FormatIndices; + + UStringVector *ArchivePaths; + UStringVector *ArchivePathsFull; + const NWildcard::CCensorNode *WildcardCensor; + const CExtractOptions *Options; + CMyComPtr<IExtractCallbackUI> ExtractCallback; + UString Title; +}; + +HRESULT CThreadExtracting::ProcessVirt() +{ + CDecompressStat Stat; + HRESULT res = DecompressArchives(codecs, FormatIndices, *ArchivePaths, *ArchivePathsFull, + *WildcardCensor, *Options, ExtractCallbackSpec, ExtractCallback, ErrorMessage, Stat); + #ifndef _SFX + if (Options->TestMode && ExtractCallbackSpec->IsOK()) + { + UString s; + AddValuePair(IDS_ARCHIVES_COLON, 0x02000324, Stat.NumArchives, s); + AddValuePair(IDS_FOLDERS_COLON, 0x02000321, Stat.NumFolders, s); + AddValuePair(IDS_FILES_COLON, 0x02000320, Stat.NumFiles, s); + AddSizePair(IDS_SIZE_COLON, 0x02000322, Stat.UnpackSize, s); + AddSizePair(IDS_COMPRESSED_COLON, 0x02000323, Stat.PackSize, s); + + if (Options->CalcCrc) + { + wchar_t temp[16]; + ConvertUInt32ToHex(Stat.CrcSum, temp); + s += L"CRC: "; + s += temp; + s += L'\n'; + } + + s += L'\n'; + s += LangString(IDS_MESSAGE_NO_ERRORS, 0x02000608); + + OkMessageTitle = Title; + OkMessage = s; + } + #endif + return res; +}; + HRESULT ExtractGUI( CCodecs *codecs, const CIntVector &formatIndices, @@ -117,8 +116,12 @@ HRESULT ExtractGUI( const NWildcard::CCensorNode &wildcardCensor, CExtractOptions &options, bool showDialog, - CExtractCallbackImp *extractCallback) + bool &messageWasDisplayed, + CExtractCallbackImp *extractCallback, + HWND hwndParent) { + messageWasDisplayed = false; + CThreadExtracting extracter; extracter.codecs = codecs; extracter.FormatIndices = formatIndices; @@ -126,14 +129,17 @@ HRESULT ExtractGUI( if (!options.TestMode) { UString outputDir = options.OutputDir; + #ifndef UNDER_CE if (outputDir.IsEmpty()) NFile::NDirectory::MyGetCurrentDirectory(outputDir); + #endif if (showDialog) { CExtractDialog dialog; if (!NFile::NDirectory::MyGetFullPathName(outputDir, dialog.DirectoryPath)) { ShowErrorMessage(kIncorrectOutDir); + messageWasDisplayed = true; return E_FAIL; } NFile::NName::NormalizeDirPathPrefix(dialog.DirectoryPath); @@ -141,7 +147,7 @@ HRESULT ExtractGUI( // dialog.OverwriteMode = options.OverwriteMode; // dialog.PathMode = options.PathMode; - if(dialog.Create(0) != IDOK) + if (dialog.Create(hwndParent) != IDOK) return E_ABORT; outputDir = dialog.DirectoryPath; options.OverwriteMode = dialog.OverwriteMode; @@ -154,6 +160,7 @@ HRESULT ExtractGUI( if (!NFile::NDirectory::MyGetFullPathName(outputDir, options.OutputDir)) { ShowErrorMessage(kIncorrectOutDir); + messageWasDisplayed = true; return E_FAIL; } NFile::NName::NormalizeDirPathPrefix(options.OutputDir); @@ -167,7 +174,7 @@ HRESULT ExtractGUI( 0x02000603, #endif options.OutputDir); - MyMessageBox(s2 + UString(L"\n") + s); + MyMessageBox(s2 + UString(L'\n') + s); return E_FAIL; } */ @@ -176,47 +183,23 @@ HRESULT ExtractGUI( UString title = LangStringSpec(options.TestMode ? IDS_PROGRESS_TESTING : IDS_PROGRESS_EXTRACTING, options.TestMode ? 0x02000F90: 0x02000890); + extracter.Title = title; extracter.ExtractCallbackSpec = extractCallback; + extracter.ExtractCallbackSpec->ProgressDialog = &extracter.ProgressDialog; extracter.ExtractCallback = extractCallback; extracter.ExtractCallbackSpec->Init(); + extracter.ProgressDialog.CompressingMode = false; + extracter.ArchivePaths = &archivePaths; extracter.ArchivePathsFull = &archivePathsFull; extracter.WildcardCensor = &wildcardCensor; extracter.Options = &options; - NWindows::CThread thread; - RINOK(thread.Create(CThreadExtracting::MyThreadFunction, &extracter)); - extracter.ExtractCallbackSpec->StartProgressDialog(title); - if (extracter.Result == S_OK && options.TestMode && - extracter.ExtractCallbackSpec->Messages.IsEmpty() && - extracter.ExtractCallbackSpec->NumArchiveErrors == 0) - { - #ifndef _SFX - UString s; - AddValuePair(IDS_ARCHIVES_COLON, 0x02000324, extracter.Stat.NumArchives, s); - AddValuePair(IDS_FOLDERS_COLON, 0x02000321, extracter.Stat.NumFolders, s); - AddValuePair(IDS_FILES_COLON, 0x02000320, extracter.Stat.NumFiles, s); - AddSizePair(IDS_SIZE_COLON, 0x02000322, extracter.Stat.UnpackSize, s); - AddSizePair(IDS_COMPRESSED_COLON, 0x02000323, extracter.Stat.PackSize, s); - - if (options.CalcCrc) - { - wchar_t temp[16]; - ConvertUInt32ToHex(extracter.Stat.CrcSum, temp); - s += L"CRC: "; - s += temp; - s += L"\n"; - } + extracter.ProgressDialog.IconID = IDI_ICON; - s += L"\n"; - s += LangString(IDS_MESSAGE_NO_ERRORS, 0x02000608); - - MessageBoxW(0, s, LangString(IDS_PROGRESS_TESTING, 0x02000F90), 0); - #endif - } - if (extracter.Result != S_OK) - if (!extracter.ErrorMessage.IsEmpty()) - throw extracter.ErrorMessage; + RINOK(extracter.Create(title, hwndParent)); + messageWasDisplayed = extracter.ThreadFinishedOK & + extracter.ProgressDialog.MessagesDisplayed; return extracter.Result; } diff --git a/CPP/7zip/UI/GUI/ExtractGUI.h b/CPP/7zip/UI/GUI/ExtractGUI.h index ffefabfe..b0a692f0 100755 --- a/CPP/7zip/UI/GUI/ExtractGUI.h +++ b/CPP/7zip/UI/GUI/ExtractGUI.h @@ -7,6 +7,18 @@ #include "../FileManager/ExtractCallback.h" +/* + RESULT can be S_OK, even if there are errors!!! + if RESULT == S_OK, check extractCallback->IsOK() after ExtractGUI(). + + RESULT = E_ABORT - user break. + RESULT != E_ABORT: + { + messageWasDisplayed = true - message was displayed already. + messageWasDisplayed = false - there was some internal error, so you must show error message. + } +*/ + HRESULT ExtractGUI( CCodecs *codecs, const CIntVector &formatIndices, @@ -15,6 +27,8 @@ HRESULT ExtractGUI( const NWildcard::CCensorNode &wildcardCensor, CExtractOptions &options, bool showDialog, - CExtractCallbackImp *extractCallback); + bool &messageWasDisplayed, + CExtractCallbackImp *extractCallback, + HWND hwndParent = NULL); #endif diff --git a/CPP/7zip/UI/GUI/ExtractRes.h b/CPP/7zip/UI/GUI/ExtractRes.h index 084181ea..6219edda 100755 --- a/CPP/7zip/UI/GUI/ExtractRes.h +++ b/CPP/7zip/UI/GUI/ExtractRes.h @@ -17,3 +17,13 @@ #define IDS_MEM_ERROR 105 #define IDS_UNKNOWN_ERROR 106 #define IDS_UNSUPPORTED_ARCHIVE_TYPE 107 + +#define IDC_EXTRACT_RADIO_FULL_PATHNAMES 1041 +#define IDC_EXTRACT_RADIO_CURRENT_PATHNAMES 1042 +#define IDC_EXTRACT_RADIO_NO_PATHNAMES 1043 + +#define IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE 1051 +#define IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT 1052 +#define IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES 1053 +#define IDC_EXTRACT_RADIO_AUTO_RENAME 1056 +#define IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING 1057 diff --git a/CPP/7zip/UI/GUI/GUI.cpp b/CPP/7zip/UI/GUI/GUI.cpp index 3a1a633e..a59e7557 100755 --- a/CPP/7zip/UI/GUI/GUI.cpp +++ b/CPP/7zip/UI/GUI/GUI.cpp @@ -2,7 +2,7 @@ #include "StdAfx.h" -#include <initguid.h> +#include "Common/MyInitGuid.h" #include "../../../../C/Alloc.h" @@ -11,6 +11,7 @@ #include "Common/StringConvert.h" #include "Windows/Error.h" +#include "Windows/NtCheck.h" #ifdef _WIN32 #include "Windows/MemoryLock.h" #endif @@ -30,7 +31,10 @@ using namespace NWindows; HINSTANCE g_hInstance; #ifndef _UNICODE -bool g_IsNT = false; +#endif + +#ifdef UNDER_CE +bool g_LVN_ITEMACTIVATE_Support = true; #endif static void ErrorMessage(LPCWSTR message) @@ -55,7 +59,7 @@ static int ShowSysErrorMessage(DWORD errorCode) { if (errorCode == E_OUTOFMEMORY) return ShowMemErrorMessage(); - ErrorMessage(NError::MyFormatMessageW(errorCode)); + ErrorMessage(HResultToMessage(errorCode)); return NExitCode::kFatalError; } @@ -63,12 +67,16 @@ static int Main2() { UStringVector commandStrings; NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings); - if (commandStrings.Size() <= 1) + + #ifndef UNDER_CE + if (commandStrings.Size() > 0) + commandStrings.Delete(0); + #endif + if (commandStrings.Size() == 0) { MessageBoxW(0, L"Specify command", L"7-Zip", 0); return 0; } - commandStrings.Delete(0); CArchiveCommandLineOptions options; CArchiveCommandLineParser parser; @@ -76,7 +84,7 @@ static int Main2() parser.Parse1(commandStrings, options); parser.Parse2(options); - #ifdef _WIN32 + #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) if (options.LargePages) NSecurity::EnableLockMemoryPrivilege(); #endif @@ -114,7 +122,6 @@ static int Main2() { CExtractCallbackImp *ecs = new CExtractCallbackImp; CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs; - ecs->ProgressDialog.CompressingMode = false; #ifndef _NO_CRYPTO ecs->PasswordIsDefined = options.PasswordEnabled; @@ -135,14 +142,19 @@ static int Main2() eo.Properties = options.ExtractProperties; #endif + bool messageWasDisplayed = false; HRESULT result = ExtractGUI(codecs, formatIndices, options.ArchivePathsSorted, options.ArchivePathsFullSorted, options.WildcardCensor.Pairs.Front().Head, - eo, options.ShowDialog, ecs); + eo, options.ShowDialog, messageWasDisplayed, ecs); if (result != S_OK) + { + if (result != E_ABORT && messageWasDisplayed) + return NExitCode::kFatalError; throw CSystemException(result); - if (ecs->Messages.Size() > 0 || ecs->NumArchiveErrors != 0) + } + if (!ecs->IsOK()) return NExitCode::kFatalError; } else if (options.Command.IsFromUpdateGroup()) @@ -163,31 +175,30 @@ static int Main2() // callback.StdOutMode = options.UpdateOptions.StdOutMode; callback.Init(); - CUpdateErrorInfo errorInfo; - if (!options.UpdateOptions.Init(codecs, formatIndices, options.ArchiveName)) { ErrorLangMessage(IDS_UPDATE_NOT_SUPPORTED, 0x02000601); return NExitCode::kFatalError; } + bool messageWasDisplayed = false; HRESULT result = UpdateGUI( codecs, options.WildcardCensor, options.UpdateOptions, options.ShowDialog, - errorInfo, &callback); + messageWasDisplayed, &callback); if (result != S_OK) { - if (!errorInfo.Message.IsEmpty()) - { - ErrorMessage(errorInfo.Message); - if (result == E_FAIL) - return NExitCode::kFatalError; - } + if (result != E_ABORT && messageWasDisplayed) + return NExitCode::kFatalError; throw CSystemException(result); } if (callback.FailedFiles.Size() > 0) + { + if (!messageWasDisplayed) + throw CSystemException(E_FAIL); return NExitCode::kWarning; + } } else { @@ -196,29 +207,19 @@ static int Main2() return 0; } -static bool inline IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} +#define NT_CHECK_FAIL_ACTION ErrorMessage(L"Unsupported Windows version"); return NExitCode::kFatalError; -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */) -{ - g_hInstance = hInstance; - #ifdef _UNICODE - if (!IsItWindowsNT()) - { - ErrorMessage(L"This program requires Windows NT/2000/2003/2008/XP/Vista"); - return NExitCode::kFatalError; - } +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + #ifdef UNDER_CE + LPWSTR #else - g_IsNT = IsItWindowsNT(); + LPSTR #endif - + /* lpCmdLine */, int /* nCmdShow */) +{ + g_hInstance = hInstance; #ifdef _WIN32 + NT_CHECK SetLargePageSize(); #endif diff --git a/CPP/7zip/UI/GUI/GUI.dsp b/CPP/7zip/UI/GUI/GUI.dsp index 42c83c60..16a24d40 100755 --- a/CPP/7zip/UI/GUI/GUI.dsp +++ b/CPP/7zip/UI/GUI/GUI.dsp @@ -405,14 +405,6 @@ SOURCE=.\ExtractDialog.h # End Source File # Begin Source File -SOURCE=..\FileManager\MessagesDialog.cpp -# End Source File -# Begin Source File - -SOURCE=..\FileManager\MessagesDialog.h -# End Source File -# Begin Source File - SOURCE=..\FileManager\OverwriteDialog.cpp # End Source File # Begin Source File @@ -800,9 +792,17 @@ SOURCE=..\..\..\Windows\Control\ListView.h SOURCE=..\..\..\Windows\Control\ProgressBar.h # End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Control\Static.h +# End Source File # End Group # Begin Source File +SOURCE=..\..\..\Windows\COM.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\CommonDialog.cpp # End Source File # Begin Source File @@ -851,6 +851,10 @@ SOURCE=..\..\..\Windows\FileIO.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\FileMapping.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\FileName.cpp # End Source File # Begin Source File diff --git a/CPP/7zip/UI/GUI/UpdateCallbackGUI.cpp b/CPP/7zip/UI/GUI/UpdateCallbackGUI.cpp index 07c74e9b..862c96a1 100755 --- a/CPP/7zip/UI/GUI/UpdateCallbackGUI.cpp +++ b/CPP/7zip/UI/GUI/UpdateCallbackGUI.cpp @@ -2,41 +2,29 @@ #include "StdAfx.h" -#include "Common/Defs.h" #include "Common/IntToString.h" #include "Common/StringConvert.h" #include "Windows/Error.h" #include "Windows/PropVariant.h" -#include "../FileManager/MessagesDialog.h" #include "../FileManager/PasswordDialog.h" #include "UpdateCallbackGUI.h" using namespace NWindows; -CUpdateCallbackGUI::~CUpdateCallbackGUI() -{ - if (!Messages.IsEmpty()) - { - CMessagesDialog messagesDialog; - messagesDialog.Messages = &Messages; - messagesDialog.Create(ParentWindow); - } -} +CUpdateCallbackGUI::~CUpdateCallbackGUI() {} void CUpdateCallbackGUI::Init() { FailedFiles.Clear(); - Messages.Clear(); - NumArchiveErrors = 0; NumFiles = 0; } void CUpdateCallbackGUI::AddErrorMessage(LPCWSTR message) { - Messages.Add(message); + ProgressDialog->Sync.AddErrorMessage(message); } void CUpdateCallbackGUI::AddErrorMessage(const wchar_t *name, DWORD systemError) @@ -52,8 +40,7 @@ HRESULT CUpdateCallbackGUI::OpenResult(const wchar_t *name, HRESULT result) { if (result != S_OK) { - AddErrorMessage (UString(L"Error: ") + name + - UString(L" is not supported archive")); + AddErrorMessage (UString(L"Error: ") + name + UString(L" is not supported archive")); } return S_OK; } @@ -77,7 +64,7 @@ HRESULT CUpdateCallbackGUI::FinishScanning() HRESULT CUpdateCallbackGUI::StartArchive(const wchar_t *name, bool /* updating */) { - ProgressDialog.ProgressSynch.SetTitleFileName(name); + ProgressDialog->Sync.SetTitleFileName(name); return S_OK; } @@ -88,14 +75,14 @@ HRESULT CUpdateCallbackGUI::FinishArchive() HRESULT CUpdateCallbackGUI::CheckBreak() { - return ProgressDialog.ProgressSynch.ProcessStopAndPause(); + return ProgressDialog->Sync.ProcessStopAndPause(); } HRESULT CUpdateCallbackGUI::ScanProgress(UInt64 /* numFolders */, UInt64 numFiles, const wchar_t *path) { - ProgressDialog.ProgressSynch.SetCurrentFileName(path); - ProgressDialog.ProgressSynch.SetNumFilesTotal(numFiles); - return ProgressDialog.ProgressSynch.ProcessStopAndPause(); + ProgressDialog->Sync.SetCurrentFileName(path); + ProgressDialog->Sync.SetNumFilesTotal(numFiles); + return ProgressDialog->Sync.ProcessStopAndPause(); } HRESULT CUpdateCallbackGUI::Finilize() @@ -105,13 +92,13 @@ HRESULT CUpdateCallbackGUI::Finilize() HRESULT CUpdateCallbackGUI::SetNumFiles(UInt64 numFiles) { - ProgressDialog.ProgressSynch.SetNumFilesTotal(numFiles); + ProgressDialog->Sync.SetNumFilesTotal(numFiles); return S_OK; } HRESULT CUpdateCallbackGUI::SetTotal(UInt64 total) { - ProgressDialog.ProgressSynch.SetProgress(total, 0); + ProgressDialog->Sync.SetProgress(total, 0); return S_OK; } @@ -119,20 +106,20 @@ HRESULT CUpdateCallbackGUI::SetCompleted(const UInt64 *completeValue) { RINOK(CheckBreak()); if (completeValue != NULL) - ProgressDialog.ProgressSynch.SetPos(*completeValue); + ProgressDialog->Sync.SetPos(*completeValue); return S_OK; } HRESULT CUpdateCallbackGUI::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) { RINOK(CheckBreak()); - ProgressDialog.ProgressSynch.SetRatioInfo(inSize, outSize); + ProgressDialog->Sync.SetRatioInfo(inSize, outSize); return S_OK; } HRESULT CUpdateCallbackGUI::GetStream(const wchar_t *name, bool /* isAnti */) { - ProgressDialog.ProgressSynch.SetCurrentFileName(name); + ProgressDialog->Sync.SetCurrentFileName(name); return S_OK; } @@ -150,7 +137,7 @@ HRESULT CUpdateCallbackGUI::OpenFileError(const wchar_t *name, DWORD systemError HRESULT CUpdateCallbackGUI::SetOperationResult(Int32 /* operationResult */) { NumFiles++; - ProgressDialog.ProgressSynch.SetNumFilesCur(NumFiles); + ProgressDialog->Sync.SetNumFilesCur(NumFiles); return S_OK; } @@ -159,38 +146,31 @@ HRESULT CUpdateCallbackGUI::CryptoGetTextPassword2(Int32 *passwordIsDefined, BST *password = NULL; if (!PasswordIsDefined) { - if (AskPassword) + if (passwordIsDefined == 0 || AskPassword) { CPasswordDialog dialog; - if (dialog.Create(ProgressDialog) == IDCANCEL) + ProgressDialog->WaitCreating(); + if (dialog.Create(*ProgressDialog) == IDCANCEL) return E_ABORT; Password = dialog.Password; PasswordIsDefined = true; } } - *passwordIsDefined = BoolToInt(PasswordIsDefined); + if (passwordIsDefined != 0) + *passwordIsDefined = BoolToInt(PasswordIsDefined); return StringToBstr(Password, password); } HRESULT CUpdateCallbackGUI::CryptoGetTextPassword(BSTR *password) { - *password = NULL; - if (!PasswordIsDefined) - { - CPasswordDialog dialog; - if (dialog.Create(ProgressDialog) == IDCANCEL) - return E_ABORT; - Password = dialog.Password; - PasswordIsDefined = true; - } - return StringToBstr(Password, password); + return CryptoGetTextPassword2(NULL, password); } /* It doesn't work, since main stream waits Dialog HRESULT CUpdateCallbackGUI::CloseProgress() { - ProgressDialog.MyClose(); + ProgressDialog->MyClose(); return S_OK; }; */ @@ -198,18 +178,18 @@ HRESULT CUpdateCallbackGUI::CloseProgress() HRESULT CUpdateCallbackGUI::Open_CheckBreak() { - return ProgressDialog.ProgressSynch.ProcessStopAndPause(); + return ProgressDialog->Sync.ProcessStopAndPause(); } HRESULT CUpdateCallbackGUI::Open_SetTotal(const UInt64 * /* numFiles */, const UInt64 * /* numBytes */) { - // if (numFiles != NULL) ProgressDialog.ProgressSynch.SetNumFilesTotal(*numFiles); + // if (numFiles != NULL) ProgressDialog->Sync.SetNumFilesTotal(*numFiles); return S_OK; } HRESULT CUpdateCallbackGUI::Open_SetCompleted(const UInt64 * /* numFiles */, const UInt64 * /* numBytes */) { - return ProgressDialog.ProgressSynch.ProcessStopAndPause(); + return ProgressDialog->Sync.ProcessStopAndPause(); } #ifndef _NO_CRYPTO @@ -217,15 +197,7 @@ HRESULT CUpdateCallbackGUI::Open_SetCompleted(const UInt64 * /* numFiles */, con HRESULT CUpdateCallbackGUI::Open_CryptoGetTextPassword(BSTR *password) { PasswordWasAsked = true; - if (!PasswordIsDefined) - { - CPasswordDialog dialog; - if (dialog.Create(ProgressDialog) == IDCANCEL) - return E_ABORT; - Password = dialog.Password; - PasswordIsDefined = true; - } - return StringToBstr(Password, password); + return CryptoGetTextPassword2(NULL, password); } HRESULT CUpdateCallbackGUI::Open_GetPasswordIfAny(UString &password) @@ -248,7 +220,7 @@ void CUpdateCallbackGUI::Open_ClearPasswordWasAskedFlag() /* HRESULT CUpdateCallbackGUI::ShowDeleteFile(const wchar_t *name) { - ProgressDialog.ProgressSynch.SetCurrentFileName(name); + ProgressDialog->Sync.SetCurrentFileName(name); return S_OK; } */ diff --git a/CPP/7zip/UI/GUI/UpdateCallbackGUI.h b/CPP/7zip/UI/GUI/UpdateCallbackGUI.h index 1f8b70e0..b5ca154a 100755 --- a/CPP/7zip/UI/GUI/UpdateCallbackGUI.h +++ b/CPP/7zip/UI/GUI/UpdateCallbackGUI.h @@ -12,7 +12,6 @@ class CUpdateCallbackGUI: public IUpdateCallbackUI2 { public: - // bool StdOutMode; bool PasswordIsDefined; UString Password; bool AskPassword; @@ -22,9 +21,7 @@ public: CUpdateCallbackGUI(): PasswordIsDefined(false), PasswordWasAsked(false), - AskPassword(false), - // StdOutMode(false) - ParentWindow(0) + AskPassword(false) {} ~CUpdateCallbackGUI(); @@ -33,19 +30,10 @@ public: INTERFACE_IUpdateCallbackUI2(;) INTERFACE_IOpenCallbackUI(;) - // HRESULT CloseProgress(); - UStringVector FailedFiles; - CProgressDialog ProgressDialog; - HWND ParentWindow; - void StartProgressDialog(const UString &title) - { - ProgressDialog.Create(title, ParentWindow); - } + CProgressDialog *ProgressDialog; - UStringVector Messages; - int NumArchiveErrors; void AddErrorMessage(LPCWSTR message); void AddErrorMessage(const wchar_t *name, DWORD systemError); }; diff --git a/CPP/7zip/UI/GUI/UpdateGUI.cpp b/CPP/7zip/UI/GUI/UpdateGUI.cpp index 2d4dbbc2..ed6cae54 100755 --- a/CPP/7zip/UI/GUI/UpdateGUI.cpp +++ b/CPP/7zip/UI/GUI/UpdateGUI.cpp @@ -16,12 +16,15 @@ #include "../Explorer/MyMessages.h" +#include "../FileManager/LangUtils.h" +#include "../FileManager/ProgramLocation.h" #include "../FileManager/StringUtils.h" +#include "../FileManager/resourceGui.h" #include "CompressDialog.h" #include "UpdateGUI.h" -#include "resource.h" +#include "resource2.h" using namespace NWindows; using namespace NFile; @@ -29,51 +32,31 @@ using namespace NFile; static const wchar_t *kDefaultSfxModule = L"7z.sfx"; static const wchar_t *kSFXExtension = L"exe"; -struct CThreadUpdating +extern void AddMessageToString(UString &dest, const UString &src); + +UString HResultToMessage(HRESULT errorCode); + +class CThreadUpdating: public CProgressThreadVirt { + HRESULT ProcessVirt(); +public: CCodecs *codecs; - CUpdateCallbackGUI *UpdateCallbackGUI; const NWildcard::CCensor *WildcardCensor; CUpdateOptions *Options; - - CUpdateErrorInfo *ErrorInfo; - HRESULT Result; - - DWORD Process() - { - UpdateCallbackGUI->ProgressDialog.WaitCreating(); - try - { - Result = UpdateArchive(codecs, *WildcardCensor, *Options, - *ErrorInfo, UpdateCallbackGUI, UpdateCallbackGUI); - } - catch(const UString &s) - { - ErrorInfo->Message = s; - Result = E_FAIL; - } - catch(const wchar_t *s) - { - ErrorInfo->Message = s; - Result = E_FAIL; - } - catch(const char *s) - { - ErrorInfo->Message = GetUnicodeString(s); - Result = E_FAIL; - } - catch(...) - { - Result = E_FAIL; - } - UpdateCallbackGUI->ProgressDialog.MyClose(); - return 0; - } - static THREAD_FUNC_DECL MyThreadFunction(void *param) - { - return ((CThreadUpdating *)param)->Process(); - } +}; + +HRESULT CThreadUpdating::ProcessVirt() +{ + CUpdateErrorInfo ei; + HRESULT res = UpdateArchive(codecs, *WildcardCensor, *Options, + ei, UpdateCallbackGUI, UpdateCallbackGUI); + ErrorMessage = ei.Message; + ErrorPath1 = ei.FileName; + ErrorPath2 = ei.FileName2; + if (ei.SystemError != S_OK && ei.SystemError != E_FAIL && ei.SystemError != E_ABORT) + return ei.SystemError; + return res; }; static void AddProp(CObjectVector<CProperty> &properties, const UString &name, const UString &value) @@ -210,19 +193,22 @@ static void SetOutProperties( static HRESULT ShowDialog( CCodecs *codecs, const NWildcard::CCensor &censor, - CUpdateOptions &options, CUpdateCallbackGUI *callback) + CUpdateOptions &options, CUpdateCallbackGUI *callback, HWND hwndParent) { if (options.Commands.Size() != 1) throw "It must be one command"; UString currentDirPrefix; + #ifndef UNDER_CE { if (!NDirectory::MyGetCurrentDirectory(currentDirPrefix)) return E_FAIL; NName::NormalizeDirPathPrefix(currentDirPrefix); } + #endif bool oneFile = false; NFind::CFileInfoW fileInfo; + UString name; if (censor.Pairs.Size() > 0) { const NWildcard::CPair &pair = censor.Pairs[0]; @@ -231,7 +217,7 @@ static HRESULT ShowDialog( const NWildcard::CItem &item = pair.Head.IncludeItems[0]; if (item.ForFile) { - UString name = pair.Prefix; + name = pair.Prefix; for (int i = 0; i < item.PathParts.Size(); i++) { if (i > 0) @@ -249,13 +235,17 @@ static HRESULT ShowDialog( CCompressDialog dialog; NCompressDialog::CInfo &di = dialog.Info; - for(int i = 0; i < codecs->Formats.Size(); i++) + dialog.ArcFormats = &codecs->Formats; + for (int i = 0; i < codecs->Formats.Size(); i++) { const CArcInfoEx &ai = codecs->Formats[i]; + if (ai.Name.CompareNoCase(L"swfc") == 0) + if (!oneFile || name.Right(4).CompareNoCase(L".swf") != 0) + continue; if (ai.UpdateEnabled && (oneFile || !ai.KeepName)) - dialog.m_ArchiverInfoList.Add(ai); + dialog.ArcIndices.Add(i); } - if(dialog.m_ArchiverInfoList.Size() == 0) + if (dialog.ArcIndices.Size() == 0) { ShowErrorMessage(L"No Update Engines"); return E_FAIL; @@ -263,7 +253,7 @@ static HRESULT ShowDialog( // di.ArchiveName = options.ArchivePath.GetFinalPath(); di.ArchiveName = options.ArchivePath.GetPathWithoutExt(); - dialog.OriginalFileName = fileInfo.Name; + dialog.OriginalFileName = options.ArchivePath.Prefix + fileInfo.Name; di.CurrentDirPrefix = currentDirPrefix; di.SFXMode = options.SfxMode; @@ -274,7 +264,7 @@ static HRESULT ShowDialog( di.KeepName = !oneFile; - if(dialog.Create(0) != IDOK) + if (dialog.Create(hwndParent) != IDOK) return E_ABORT; options.VolumesSizes = di.VolumeSizes; @@ -305,7 +295,7 @@ static HRESULT ShowDialog( default: throw 1091756; } - const CArcInfoEx &archiverInfo = dialog.m_ArchiverInfoList[di.ArchiverInfoIndex]; + const CArcInfoEx &archiverInfo = codecs->Formats[di.FormatIndex]; callback->PasswordIsDefined = (!di.Password.IsEmpty()); if (callback->PasswordIsDefined) callback->Password = di.Password; @@ -334,17 +324,17 @@ static HRESULT ShowDialog( if (di.SFXMode) options.SfxMode = true; - options.MethodMode.FormatIndex = archiverInfo.FormatIndex; + options.MethodMode.FormatIndex = di.FormatIndex; options.ArchivePath.VolExtension = archiverInfo.GetMainExt(); - if(di.SFXMode) + if (di.SFXMode) options.ArchivePath.BaseExtension = kSFXExtension; else options.ArchivePath.BaseExtension = options.ArchivePath.VolExtension; options.ArchivePath.ParseFromPath(di.ArchiveName); NWorkDir::CInfo workDirInfo; - ReadWorkDirInfo(workDirInfo); + workDirInfo.Load(); options.WorkingDir.Empty(); if (workDirInfo.Mode != NWorkDir::NMode::kCurrent) { @@ -361,29 +351,49 @@ HRESULT UpdateGUI( const NWildcard::CCensor &censor, CUpdateOptions &options, bool showDialog, - CUpdateErrorInfo &errorInfo, - CUpdateCallbackGUI *callback) + bool &messageWasDisplayed, + CUpdateCallbackGUI *callback, + HWND hwndParent) { + messageWasDisplayed = false; if (showDialog) { - RINOK(ShowDialog(codecs, censor, options, callback)); + RINOK(ShowDialog(codecs, censor, options, callback, hwndParent)); } if (options.SfxMode && options.SfxModule.IsEmpty()) - options.SfxModule = kDefaultSfxModule; + { + UString folder; + if (!GetProgramFolderPath(folder)) + folder.Empty(); + options.SfxModule = folder + kDefaultSfxModule; + } CThreadUpdating tu; tu.codecs = codecs; tu.UpdateCallbackGUI = callback; + tu.UpdateCallbackGUI->ProgressDialog = &tu.ProgressDialog; tu.UpdateCallbackGUI->Init(); + UString title = LangString(IDS_PROGRESS_COMPRESSING, 0x02000DC0); + + /* + if (hwndParent != 0) + { + tu.ProgressDialog.MainWindow = hwndParent; + // tu.ProgressDialog.MainTitle = fileName; + tu.ProgressDialog.MainAddTitle = title + L" "; + } + */ + tu.WildcardCensor = &censor; tu.Options = &options; - tu.ErrorInfo = &errorInfo; + tu.ProgressDialog.IconID = IDI_ICON; + + RINOK(tu.Create(title, hwndParent)); - NWindows::CThread thread; - RINOK(thread.Create(CThreadUpdating::MyThreadFunction, &tu)) - tu.UpdateCallbackGUI->StartProgressDialog(LangString(IDS_PROGRESS_COMPRESSING, 0x02000DC0)); + messageWasDisplayed = tu.ThreadFinishedOK & + tu.ProgressDialog.MessagesDisplayed; return tu.Result; } diff --git a/CPP/7zip/UI/GUI/UpdateGUI.h b/CPP/7zip/UI/GUI/UpdateGUI.h index 112eff0f..c06ec1e7 100755 --- a/CPP/7zip/UI/GUI/UpdateGUI.h +++ b/CPP/7zip/UI/GUI/UpdateGUI.h @@ -4,16 +4,28 @@ #define __UPDATE_GUI_H #include "../Common/Update.h" + #include "UpdateCallbackGUI.h" -#include "../FileManager/UpdateCallback100.h" +/* + callback->FailedFiles contains names of files for that there were problems. + RESULT can be S_OK, even if there are such warnings!!! + + RESULT = E_ABORT - user break. + RESULT != E_ABORT: + { + messageWasDisplayed = true - message was displayed already. + messageWasDisplayed = false - there was some internal error, so you must show error message. + } +*/ HRESULT UpdateGUI( CCodecs *codecs, const NWildcard::CCensor &censor, CUpdateOptions &options, bool showDialog, - CUpdateErrorInfo &errorInfo, - CUpdateCallbackGUI *callback); + bool &messageWasDisplayed, + CUpdateCallbackGUI *callback, + HWND hwndParent = NULL); #endif diff --git a/CPP/7zip/UI/GUI/makefile b/CPP/7zip/UI/GUI/makefile index 233e2ee2..a3763cbf 100755 --- a/CPP/7zip/UI/GUI/makefile +++ b/CPP/7zip/UI/GUI/makefile @@ -1,14 +1,17 @@ PROG = 7zG.exe -LIBS = $(LIBS) user32.lib advapi32.lib oleaut32.lib shell32.lib comctl32.lib htmlhelp.lib ole32.lib comdlg32.lib CFLAGS = $(CFLAGS) -I ../../../ \ -DLANG \ -DCOMPRESS_MT \ - -DWIN_LONG_PATH \ -DEXTERNAL_LZMA \ -DEXTERNAL_CODECS \ -DBENCH_MT \ - -D_7ZIP_LARGE_PAGES \ - -DSUPPORT_DEVICE_FILE \ + +!IFDEF UNDER_CE +LIBS = $(LIBS) ceshell.lib Commctrl.lib +!ELSE +LIBS = $(LIBS) comctl32.lib htmlhelp.lib comdlg32.lib +CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -DSUPPORT_DEVICE_FILE -D_7ZIP_LARGE_PAGES +!ENDIF GUI_OBJS = \ $O\BenchmarkDialog.obj \ @@ -102,11 +105,16 @@ FM_OBJS = \ $O\RegistryUtils.obj \ $O\SplitUtils.obj \ $O\StringUtils.obj \ - $O\MessagesDialog.obj \ $O\OverwriteDialog.obj \ $O\PasswordDialog.obj \ $O\ProgressDialog2.obj \ +!IFDEF UNDER_CE +FM_OBJS = $(FM_OBJS) \ + $O\BrowseDialog.obj \ + $O\SysIconUtils.obj \ +!ENDIF + C_OBJS = \ $O\Alloc.obj \ $O\Threads.obj \ diff --git a/CPP/7zip/UI/GUI/resource.h b/CPP/7zip/UI/GUI/resource.h deleted file mode 100755 index e154e035..00000000 --- a/CPP/7zip/UI/GUI/resource.h +++ /dev/null @@ -1,49 +0,0 @@ -#define IDS_CONTEXT_EXTRACT 142 -#define IDS_CONTEXT_EXTRACT_HELP 143 -#define IDS_CONTEXT_COMPRESS 144 -#define IDS_CONTEXT_COMPRESS_HELP 145 -#define IDS_CONTEXT_OPEN 146 -#define IDS_CONTEXT_OPEN_HELP 147 -#define IDS_CONTEXT_TEST 148 -#define IDS_CONTEXT_TEST_HELP 149 -#define IDS_CONTEXT_CAPTION_HELP 150 -#define IDS_CONTEXT_POPUP_CAPTION 151 -#define IDS_OPEN_TYPE_ALL_FILES 80 - -#define IDS_METHOD_STORE 81 -#define IDS_METHOD_NORMAL 82 -#define IDS_METHOD_MAXIMUM 83 -#define IDS_METHOD_FAST 84 -#define IDS_METHOD_FASTEST 85 -#define IDS_METHOD_ULTRA 86 - -#define IDS_COMPRESS_NON_SOLID 88 -#define IDS_COMPRESS_SOLID 89 - -#define IDS_COMPRESS_UPDATE_MODE_ADD 90 -#define IDS_COMPRESS_UPDATE_MODE_UPDATE 91 -#define IDS_COMPRESS_UPDATE_MODE_FRESH 92 -#define IDS_COMPRESS_UPDATE_MODE_SYNCHRONIZE 93 - -#define IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE 94 -#define IDS_COMPRESS_INCORRECT_VOLUME_SIZE 95 - -#define IDS_COMPRESS_SET_ARCHIVE_DIALOG_TITLE 96 -#define IDS_CANT_UPDATE_ARCHIVE 97 - -#define IDS_PROGRESS_COMPRESSING 98 -#define IDS_PROGRESS_TESTING 99 -#define IDS_ERROR 100 -#define IDS_MESSAGE_NO_ERRORS 101 -#define IDS_CONFIG_DIALOG_CAPTION 102 - -#define IDS_PASSWORD_USE_ASCII 110 -#define IDS_PASSWORD_PASSWORDS_DO_NOT_MATCH 111 -#define IDS_PASSWORD_IS_TOO_LONG 112 - -#define IDS_FILES_COLON 2274 -#define IDS_FOLDERS_COLON 2275 -#define IDS_SIZE_COLON 2276 -#define IDS_COMPRESSED_COLON 2277 -#define IDS_ARCHIVES_COLON 2278 - diff --git a/CPP/7zip/UI/GUI/resource.rc b/CPP/7zip/UI/GUI/resource.rc index 7782e178..bfc2029b 100755 --- a/CPP/7zip/UI/GUI/resource.rc +++ b/CPP/7zip/UI/GUI/resource.rc @@ -1,68 +1,21 @@ #include "../../MyVersionInfo.rc" #include <winnt.h> -#include "resource.h" + +#include "resource2.rc" +#include "../FileManager/resourceGui.rc" MY_VERSION_INFO_APP("7-Zip GUI", "7zg") -IDI_ICON1 ICON "FM.ico" +IDI_ICON ICON "FM.ico" +#ifndef UNDER_CE 1 24 MOVEABLE PURE "7zG.exe.manifest" +#endif -STRINGTABLE -BEGIN - IDS_CONTEXT_EXTRACT "Extract files..." - IDS_CONTEXT_EXTRACT_HELP "Extracts files from the selected archive." - IDS_CONTEXT_COMPRESS "Add to archive..." - IDS_CONTEXT_COMPRESS_HELP "Adds the selected items to archive." - IDS_CONTEXT_OPEN "Open" - IDS_CONTEXT_OPEN_HELP "Opens the selected archive." - IDS_CONTEXT_TEST "Test archive" - IDS_CONTEXT_TEST_HELP "Tests integrity of the selected archive." - IDS_CONTEXT_CAPTION_HELP "7-Zip commands" - IDS_CONTEXT_POPUP_CAPTION "7-Zip" - IDS_OPEN_TYPE_ALL_FILES "All Files" - IDS_METHOD_STORE "Store" - IDS_METHOD_NORMAL "Normal" - IDS_METHOD_MAXIMUM "Maximum" - IDS_METHOD_FAST "Fast" - IDS_METHOD_FASTEST "Fastest" - IDS_METHOD_ULTRA "Ultra" - IDS_COMPRESS_NON_SOLID "Non-solid" - IDS_COMPRESS_SOLID "Solid" - - IDS_COMPRESS_UPDATE_MODE_ADD "Add and replace files" - IDS_COMPRESS_UPDATE_MODE_UPDATE "Update and add files" - IDS_COMPRESS_UPDATE_MODE_FRESH "Freshen existing files" - IDS_COMPRESS_UPDATE_MODE_SYNCHRONIZE "Synchronize files" - IDS_COMPRESS_SET_ARCHIVE_DIALOG_TITLE "Browse" - IDS_COMPRESS_INCORRECT_VOLUME_SIZE "Incorrect volume size" - IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE "Specified volume size: {0} bytes.\nAre you sure you want to split archive into such volumes?" - - IDS_PASSWORD_USE_ASCII "Use only English letters, numbers and special characters (!, #, $, ...) for password." - IDS_PASSWORD_PASSWORDS_DO_NOT_MATCH "Passwords do not match" - IDS_PASSWORD_IS_TOO_LONG "Password is too long" - - IDS_CANT_UPDATE_ARCHIVE "Can not update archive '{0}'" - IDS_PROGRESS_COMPRESSING "Compressing" - IDS_PROGRESS_TESTING "Testing" - IDS_ERROR "Error" - IDS_MESSAGE_NO_ERRORS "There are no errors" - IDS_CONFIG_DIALOG_CAPTION "7-Zip Options" - - IDS_FILES_COLON "Files:" - IDS_FOLDERS_COLON "Folders:" - IDS_SIZE_COLON "Size:" - IDS_COMPRESSED_COLON "Compressed size:" - IDS_ARCHIVES_COLON "Archives:" - -END - +#ifdef UNDER_CE #include "../FileManager/PropertyName.rc" +#endif #include "../FileManager/OverwriteDialog.rc" #include "../FileManager/PasswordDialog.rc" -#include "../FileManager/MessagesDialog.rc" #include "../FileManager/ProgressDialog2.rc" #include "Extract.rc" -#include "ExtractDialog.rc" -#include "CompressDialog.rc" -#include "BenchmarkDialog.rc" diff --git a/CPP/7zip/UI/GUI/resource2.h b/CPP/7zip/UI/GUI/resource2.h new file mode 100755 index 00000000..4f8b1573 --- /dev/null +++ b/CPP/7zip/UI/GUI/resource2.h @@ -0,0 +1,3 @@ +#define IDS_COMPRESSED_COLON 2277 +#define IDS_ARCHIVES_COLON 2278 +#define IDS_PROGRESS_COMPRESSING 98 diff --git a/CPP/7zip/UI/GUI/resource2.rc b/CPP/7zip/UI/GUI/resource2.rc new file mode 100755 index 00000000..542717ee --- /dev/null +++ b/CPP/7zip/UI/GUI/resource2.rc @@ -0,0 +1,11 @@ +#include "ExtractDialog.rc" +#include "CompressDialog.rc" +#include "BenchmarkDialog.rc" +#include "resource2.h" + +STRINGTABLE +BEGIN + IDS_COMPRESSED_COLON "Compressed size:" + IDS_ARCHIVES_COLON "Archives:" + IDS_PROGRESS_COMPRESSING "Compressing" +END diff --git a/CPP/7zip/makefile b/CPP/7zip/makefile index dcdabb5d..fde715a4 100755 --- a/CPP/7zip/makefile +++ b/CPP/7zip/makefile @@ -1,6 +1,7 @@ DIRS = \ UI\~ \ Bundles\~ \ + Compress\~ \ all: $(DIRS) @@ -8,4 +9,3 @@ $(DIRS): cd $(@D) $(MAKE) -nologo cd .. - diff --git a/CPP/Build.mak b/CPP/Build.mak index 9d4ac524..3356b8e5 100755 --- a/CPP/Build.mak +++ b/CPP/Build.mak @@ -1,3 +1,5 @@ +LIBS = $(LIBS) oleaut32.lib ole32.lib + !IFDEF CPU !IFNDEF NO_BUFFEROVERFLOWU LIBS = $(LIBS) bufferoverflowU.lib @@ -21,9 +23,22 @@ MY_ML = ml64 !ENDIF !ENDIF + +!IFDEF UNDER_CE +RFLAGS = $(RFLAGS) -dUNDER_CE +!IFDEF MY_CONSOLE +LFLAGS = $(LFLAGS) /ENTRY:mainACRTStartup +!ENDIF +!ELSE +LFLAGS = $(LFLAGS) -OPT:NOWIN98 +CFLAGS = $(CFLAGS) -Gr +LIBS = $(LIBS) user32.lib advapi32.lib shell32.lib +!ENDIF + + COMPL_ASM = $(MY_ML) -c -Fo$O/ $** -CFLAGS = $(CFLAGS) -nologo -c -Fo$O/ -WX -EHsc -Gr -Gy -GR- +CFLAGS = $(CFLAGS) -nologo -c -Fo$O/ -WX -EHsc -Gy -GR- !IFDEF MY_STATIC_LINK !IFNDEF MY_SINGLE_THREAD @@ -42,7 +57,7 @@ CFLAGS = $(CFLAGS) -W3 CFLAGS_O1 = $(CFLAGS) -O1 CFLAGS_O2 = $(CFLAGS) -O2 -LFLAGS = $(LFLAGS) -nologo -OPT:NOWIN98 -OPT:REF -OPT:ICF +LFLAGS = $(LFLAGS) -nologo -OPT:REF -OPT:ICF !IFDEF DEF_FILE LFLAGS = $(LFLAGS) -DLL -DEF:$(DEF_FILE) @@ -50,10 +65,10 @@ LFLAGS = $(LFLAGS) -DLL -DEF:$(DEF_FILE) PROGPATH = $O\$(PROG) -COMPL_O1 = $(CPP) $(CFLAGS_O1) $** -COMPL_O2 = $(CPP) $(CFLAGS_O2) $** -COMPL_PCH = $(CPP) $(CFLAGS_O1) -Yc"StdAfx.h" -Fp$O/a.pch $** -COMPL = $(CPP) $(CFLAGS_O1) -Yu"StdAfx.h" -Fp$O/a.pch $** +COMPL_O1 = $(CC) $(CFLAGS_O1) $** +COMPL_O2 = $(CC) $(CFLAGS_O2) $** +COMPL_PCH = $(CC) $(CFLAGS_O1) -Yc"StdAfx.h" -Fp$O/a.pch $** +COMPL = $(CC) $(CFLAGS_O1) -Yu"StdAfx.h" -Fp$O/a.pch $** all: $(PROGPATH) @@ -65,7 +80,10 @@ $O: $(PROGPATH): $O $(OBJS) $(DEF_FILE) link $(LFLAGS) -out:$(PROGPATH) $(OBJS) $(LIBS) + +!IFNDEF NO_DEFAULT_RES $O\resource.res: $(*B).rc - rc -fo$@ $** + rc $(RFLAGS) -fo$@ $** +!ENDIF $O\StdAfx.obj: $(*B).cpp $(COMPL_PCH) diff --git a/CPP/Common/Buffer.h b/CPP/Common/Buffer.h index b6960fa8..118fe11f 100755 --- a/CPP/Common/Buffer.h +++ b/CPP/Common/Buffer.h @@ -19,7 +19,7 @@ public: } CBuffer(): _capacity(0), _items(0) {}; CBuffer(const CBuffer &buffer): _capacity(0), _items(0) { *this = buffer; } - CBuffer(size_t size): _items(0), _capacity(0) { SetCapacity(size); } + CBuffer(size_t size): _items(0), _capacity(0) { SetCapacity(size); } virtual ~CBuffer() { delete []_items; } operator T *() { return _items; }; operator const T *() const { return _items; }; diff --git a/CPP/Common/MyGuidDef.h b/CPP/Common/MyGuidDef.h index 7cfaba0c..337884f6 100755 --- a/CPP/Common/MyGuidDef.h +++ b/CPP/Common/MyGuidDef.h @@ -47,7 +47,7 @@ inline int operator!=(REFGUID g1, REFGUID g2) { return !(g1 == g2); } #ifdef INITGUID #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } + MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } #else #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ MY_EXTERN_C const GUID name diff --git a/CPP/Common/MyInitGuid.h b/CPP/Common/MyInitGuid.h index 4fc15565..d6a48698 100755 --- a/CPP/Common/MyInitGuid.h +++ b/CPP/Common/MyInitGuid.h @@ -1,10 +1,17 @@ // Common/MyInitGuid.h -#ifndef __COMMON_MYINITGUID_H -#define __COMMON_MYINITGUID_H +#ifndef __COMMON_MY_INITGUID_H +#define __COMMON_MY_INITGUID_H #ifdef _WIN32 +#ifdef UNDER_CE +#include <basetyps.h> +#endif #include <initguid.h> +#ifdef UNDER_CE +DEFINE_GUID(IID_IUnknown, +0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); +#endif #else #define INITGUID #include "MyGuidDef.h" diff --git a/CPP/Common/MyString.cpp b/CPP/Common/MyString.cpp index 2c02e822..3d1ce2b8 100755 --- a/CPP/Common/MyString.cpp +++ b/CPP/Common/MyString.cpp @@ -96,7 +96,7 @@ int MyStringCollate(const wchar_t *s1, const wchar_t *s2) #endif } -#ifndef _WIN32_WCE +#ifndef UNDER_CE int MyStringCollate(const char *s1, const char *s2) { return ConvertCompareResult(CompareStringA( diff --git a/CPP/Common/MyString.h b/CPP/Common/MyString.h index bae239da..e8830092 100755 --- a/CPP/Common/MyString.h +++ b/CPP/Common/MyString.h @@ -4,7 +4,6 @@ #define __COMMON_STRING_H #include <string.h> -// #include <wchar.h> #include "MyVector.h" @@ -39,13 +38,15 @@ inline const wchar_t* MyStringGetPrevCharPointer(const wchar_t *, const wchar_t #ifdef _WIN32 -inline char* MyStringGetNextCharPointer(char *p) - { return CharNextA(p); } inline const char* MyStringGetNextCharPointer(const char *p) - { return CharNextA(p); } +{ + #ifdef UNDER_CE + return p + 1; + #else + return CharNextA(p); + #endif +} -inline char* MyStringGetPrevCharPointer(char *base, char *p) - { return CharPrevA(base, p); } inline const char* MyStringGetPrevCharPointer(const char *base, const char *p) { return CharPrevA(base, p); } @@ -58,8 +59,6 @@ inline wchar_t MyCharUpper(wchar_t c) wchar_t MyCharUpper(wchar_t c); #endif -inline char MyCharLower(char c) - { return (char)(unsigned int)(UINT_PTR)CharLowerA((LPSTR)(UINT_PTR)(unsigned int)(unsigned char)c); } #ifdef _UNICODE inline wchar_t MyCharLower(wchar_t c) { return (wchar_t)(unsigned int)(UINT_PTR)CharLowerW((LPWSTR)(UINT_PTR)(unsigned int)c); } @@ -67,6 +66,13 @@ inline wchar_t MyCharLower(wchar_t c) wchar_t MyCharLower(wchar_t c); #endif +inline char MyCharLower(char c) +#ifdef UNDER_CE + { return (char)MyCharLower((wchar_t)c); } +#else + { return (char)(unsigned int)(UINT_PTR)CharLowerA((LPSTR)(UINT_PTR)(unsigned int)(unsigned char)c); } +#endif + inline char * MyStringUpper(char *s) { return CharUpperA(s); } #ifdef _UNICODE inline wchar_t * MyStringUpper(wchar_t *s) { return CharUpperW(s); } @@ -89,7 +95,7 @@ wchar_t MyCharUpper(wchar_t c); // Compare /* -#ifndef _WIN32_WCE +#ifndef UNDER_CE int MyStringCollate(const char *s1, const char *s2); int MyStringCollateNoCase(const char *s1, const char *s2); #endif @@ -148,12 +154,8 @@ class CStringBase MoveItems(index + size, index); } - static T *GetNextCharPointer(T *p) - { return MyStringGetNextCharPointer(p); } static const T *GetNextCharPointer(const T *p) { return MyStringGetNextCharPointer(p); } - static T *GetPrevCharPointer(T *base, T *p) - { return MyStringGetPrevCharPointer(base, p); } static const T *GetPrevCharPointer(const T *base, const T *p) { return MyStringGetPrevCharPointer(base, p); } protected: @@ -168,10 +170,8 @@ protected: return; /* const int kMaxStringSize = 0x20000000; - #ifndef _WIN32_WCE if (newCapacity > kMaxStringSize || newCapacity < _length) throw 1052337; - #endif */ T *newBuffer = new T[realCapacity]; if (_capacity > 0) @@ -234,6 +234,8 @@ public: operator const T*() const { return _chars;} + T Back() const { return _chars[_length - 1]; } + // The minimum size of the character buffer in characters. // This value does not include space for a null terminator. T* GetBuffer(int minBufLength) @@ -246,10 +248,8 @@ public: void ReleaseBuffer(int newLength) { /* - #ifndef _WIN32_WCE if (newLength >= _capacity) throw 282217; - #endif */ _chars[newLength] = 0; _length = newLength; @@ -316,7 +316,7 @@ public: CStringBase Mid(int startIndex) const { return Mid(startIndex, _length - startIndex); } - CStringBase Mid(int startIndex, int count ) const + CStringBase Mid(int startIndex, int count) const { if (startIndex + count > _length) count = _length - startIndex; @@ -369,7 +369,7 @@ public: int Find(T c) const { return Find(c, 0); } int Find(T c, int startIndex) const { - T *p = _chars + startIndex; + const T *p = _chars + startIndex; for (;;) { if (*p == c) @@ -399,7 +399,7 @@ public: { if (_length == 0) return -1; - T *p = _chars + _length - 1; + const T *p = _chars + _length - 1; for (;;) { if (*p == c) @@ -530,7 +530,7 @@ public: } return number; } - int Delete(int index, int count = 1 ) + int Delete(int index, int count = 1) { if (index + count > _length) count = _length - index; @@ -541,6 +541,7 @@ public: } return _length; } + void DeleteBack() { Delete(_length - 1); } }; template <class T> diff --git a/CPP/Common/MyUnknown.h b/CPP/Common/MyUnknown.h index 136145a7..e9e8666b 100755 --- a/CPP/Common/MyUnknown.h +++ b/CPP/Common/MyUnknown.h @@ -1,22 +1,11 @@ // MyUnknown.h -#ifndef __MYUNKNOWN_H -#define __MYUNKNOWN_H +#ifndef __MY_UNKNOWN_H +#define __MY_UNKNOWN_H #ifdef _WIN32 - -#ifdef _WIN32_WCE -#if (_WIN32_WCE > 300) -#include <basetyps.h> -#else -#define MIDL_INTERFACE(x) struct -#endif -#else #include <basetyps.h> -#endif - #include <unknwn.h> - #else #include "MyWindows.h" #endif diff --git a/CPP/Common/Random.cpp b/CPP/Common/Random.cpp index 9519987e..4bd3fcf9 100755 --- a/CPP/Common/Random.cpp +++ b/CPP/Common/Random.cpp @@ -2,16 +2,25 @@ #include "StdAfx.h" -#include <time.h> #include <stdlib.h> +#ifndef _WIN32 +#include <time.h> +#endif + #include "Random.h" -void CRandom::Init(unsigned int seed) - { srand(seed); } +void CRandom::Init(unsigned int seed) { srand(seed); } void CRandom::Init() - { Init((unsigned int)time(NULL)); } +{ + Init((unsigned int) + #ifdef _WIN32 + GetTickCount() + #else + time(NULL) + #endif + ); +} -int CRandom::Generate() const - { return rand(); } +int CRandom::Generate() const { return rand(); } diff --git a/CPP/Common/StringConvert.cpp b/CPP/Common/StringConvert.cpp index 9bd47deb..681895b7 100755 --- a/CPP/Common/StringConvert.cpp +++ b/CPP/Common/StringConvert.cpp @@ -17,10 +17,8 @@ UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) int numChars = MultiByteToWideChar(codePage, 0, srcString, srcString.Length(), resultString.GetBuffer(srcString.Length()), srcString.Length() + 1); - #ifndef _WIN32_WCE if (numChars == 0) throw 282228; - #endif resultString.ReleaseBuffer(numChars); } return resultString; @@ -38,10 +36,8 @@ AString UnicodeStringToMultiByte(const UString &s, UINT codePage, char defaultCh dest.GetBuffer(numRequiredBytes), numRequiredBytes + 1, &defaultChar, &defUsed); defaultCharWasUsed = (defUsed != FALSE); - #ifndef _WIN32_WCE if (numChars == 0) throw 282229; - #endif dest.ReleaseBuffer(numChars); } return dest; @@ -53,7 +49,7 @@ AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) return UnicodeStringToMultiByte(srcString, codePage, '_', defaultCharWasUsed); } -#ifndef _WIN32_WCE +#ifndef UNDER_CE AString SystemStringToOemString(const CSysString &srcString) { AString result; @@ -99,4 +95,3 @@ AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) } #endif - diff --git a/CPP/Common/StringConvert.h b/CPP/Common/StringConvert.h index 0c37eb07..cd737bec 100755 --- a/CPP/Common/StringConvert.h +++ b/CPP/Common/StringConvert.h @@ -1,7 +1,7 @@ // Common/StringConvert.h -#ifndef __COMMON_STRINGCONVERT_H -#define __COMMON_STRINGCONVERT_H +#ifndef __COMMON_STRING_CONVERT_H +#define __COMMON_STRING_CONVERT_H #include "MyWindows.h" #include "MyString.h" @@ -66,7 +66,7 @@ inline AString GetOemString(const UString &unicodeString) { return UnicodeStringToMultiByte(unicodeString, codePage); } #endif -#ifndef _WIN32_WCE +#ifndef UNDER_CE AString SystemStringToOemString(const CSysString &srcString); #endif diff --git a/CPP/Windows/COM.h b/CPP/Windows/COM.h index ceffc97f..cf003d59 100755 --- a/CPP/Windows/COM.h +++ b/CPP/Windows/COM.h @@ -13,7 +13,15 @@ namespace NCOM { class CComInitializer { public: - CComInitializer() { CoInitialize(NULL);}; + CComInitializer() + { + #ifdef UNDER_CE + CoInitializeEx(NULL, COINIT_MULTITHREADED); + #else + // it's single thread. Do we need multithread? + CoInitialize(NULL); + #endif + }; ~CComInitializer() { CoUninitialize(); }; }; diff --git a/CPP/Windows/Clipboard.cpp b/CPP/Windows/Clipboard.cpp index 1e66522f..e1ff62be 100755 --- a/CPP/Windows/Clipboard.cpp +++ b/CPP/Windows/Clipboard.cpp @@ -2,6 +2,10 @@ #include "StdAfx.h" +#ifdef UNDER_CE +#include <winuserm.h> +#endif + #include "Windows/Clipboard.h" #include "Windows/Defs.h" #include "Windows/Memory.h" diff --git a/CPP/Windows/CommonDialog.cpp b/CPP/Windows/CommonDialog.cpp index f794fc88..4ee7412d 100755 --- a/CPP/Windows/CommonDialog.cpp +++ b/CPP/Windows/CommonDialog.cpp @@ -2,10 +2,17 @@ #include "StdAfx.h" +#ifdef UNDER_CE +#include <commdlg.h> +#endif + #ifndef _UNICODE #include "Common/StringConvert.h" #endif #include "Common/MyCom.h" + +#include "Windows/Defs.h" + #include "CommonDialog.h" #ifndef _UNICODE @@ -62,7 +69,15 @@ void CDoubleZeroStringListW::SetForBuffer(LPWSTR buffer) buffer[m_Indexes[i]] = L'\0'; } -bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, LPCWSTR s, UString &resPath) +#define MY_OFN_PROJECT 0x00400000 +#define MY_OFN_SHOW_ALL 0x01000000 + +bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, + LPCWSTR s, UString &resPath + #ifdef UNDER_CE + , bool openFolder + #endif + ) { const int kBufferSize = MAX_PATH * 2; #ifndef _UNICODE @@ -146,7 +161,12 @@ bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, LPCWSTR s info.lpstrTitle = title; - info.Flags = OFN_EXPLORER | OFN_HIDEREADONLY; + info.Flags = OFN_EXPLORER | OFN_HIDEREADONLY + #ifdef UNDER_CE + | (openFolder ? (MY_OFN_PROJECT | MY_OFN_SHOW_ALL) : 0) + #endif + ; + info.nFileOffset = 0; info.nFileExtension = 0; info.lpstrDefExt = NULL; diff --git a/CPP/Windows/CommonDialog.h b/CPP/Windows/CommonDialog.h index 250c64f7..f24bb5b2 100755 --- a/CPP/Windows/CommonDialog.h +++ b/CPP/Windows/CommonDialog.h @@ -1,16 +1,18 @@ // Windows/CommonDialog.h -#ifndef __WINDOWS_COMMONDIALOG_H -#define __WINDOWS_COMMONDIALOG_H - -#include <windows.h> +#ifndef __WINDOWS_COMMON_DIALOG_H +#define __WINDOWS_COMMON_DIALOG_H #include "Common/MyString.h" -#include "Windows/Defs.h" namespace NWindows{ -bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, LPCWSTR s, UString &resPath); +bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, + LPCWSTR s, UString &resPath + #ifdef UNDER_CE + , bool openFolder = false + #endif +); } diff --git a/CPP/Windows/Control/ComboBox.cpp b/CPP/Windows/Control/ComboBox.cpp index d9738f32..40d2f865 100755 --- a/CPP/Windows/Control/ComboBox.cpp +++ b/CPP/Windows/Control/ComboBox.cpp @@ -1,8 +1,5 @@ // Windows/Control/ComboBox.cpp -// #define _UNICODE -// #define UNICODE - #include "StdAfx.h" #ifndef _UNICODE @@ -10,7 +7,6 @@ #endif #include "Windows/Control/ComboBox.h" -#include "Windows/Defs.h" #ifndef _UNICODE extern bool g_IsNT; @@ -59,5 +55,4 @@ LRESULT CComboBox::GetLBText(int index, UString &s) } #endif - }} diff --git a/CPP/Windows/Control/ComboBox.h b/CPP/Windows/Control/ComboBox.h index 58c86703..aa0eb930 100755 --- a/CPP/Windows/Control/ComboBox.h +++ b/CPP/Windows/Control/ComboBox.h @@ -3,11 +3,10 @@ #ifndef __WINDOWS_CONTROL_COMBOBOX_H #define __WINDOWS_CONTROL_COMBOBOX_H -#include "Windows/Window.h" -#include "Windows/Defs.h" - #include <commctrl.h> +#include "../Window.h" + namespace NWindows { namespace NControl { @@ -15,33 +14,34 @@ class CComboBox: public CWindow { public: void ResetContent() { SendMessage(CB_RESETCONTENT, 0, 0); } - LRESULT AddString(LPCTSTR string) { return SendMessage(CB_ADDSTRING, 0, (LPARAM)string); } + LRESULT AddString(LPCTSTR s) { return SendMessage(CB_ADDSTRING, 0, (LPARAM)s); } #ifndef _UNICODE - LRESULT AddString(LPCWSTR string); + LRESULT AddString(LPCWSTR s); #endif LRESULT SetCurSel(int index) { return SendMessage(CB_SETCURSEL, index, 0); } int GetCurSel() { return (int)SendMessage(CB_GETCURSEL, 0, 0); } int GetCount() { return (int)SendMessage(CB_GETCOUNT, 0, 0); } LRESULT GetLBTextLen(int index) { return SendMessage(CB_GETLBTEXTLEN, index, 0); } - LRESULT GetLBText(int index, LPTSTR string) { return SendMessage(CB_GETLBTEXT, index, (LPARAM)string); } + LRESULT GetLBText(int index, LPTSTR s) { return SendMessage(CB_GETLBTEXT, index, (LPARAM)s); } LRESULT GetLBText(int index, CSysString &s); #ifndef _UNICODE LRESULT GetLBText(int index, UString &s); #endif - LRESULT SetItemData(int index, LPARAM lParam) - { return SendMessage(CB_SETITEMDATA, index, lParam); } - LRESULT GetItemData(int index) - { return SendMessage(CB_GETITEMDATA, index, 0); } + LRESULT SetItemData(int index, LPARAM lParam) { return SendMessage(CB_SETITEMDATA, index, lParam); } + LRESULT GetItemData(int index) { return SendMessage(CB_GETITEMDATA, index, 0); } - void ShowDropDown(bool show = true) - { SendMessage(CB_SHOWDROPDOWN, show ? TRUE : FALSE, 0); } + void ShowDropDown(bool show = true) { SendMessage(CB_SHOWDROPDOWN, show ? TRUE : FALSE, 0); } }; +#ifndef UNDER_CE + class CComboBoxEx: public CComboBox { public: + bool SetUnicodeFormat(bool fUnicode) { return LRESULTToBool(SendMessage(CBEM_SETUNICODEFORMAT, BOOLToBool(fUnicode), 0)); } + LRESULT DeleteItem(int index) { return SendMessage(CBEM_DELETEITEM, index, 0); } LRESULT InsertItem(COMBOBOXEXITEM *item) { return SendMessage(CBEM_INSERTITEM, 0, (LPARAM)item); } #ifndef _UNICODE @@ -54,6 +54,8 @@ public: HIMAGELIST SetImageList(HIMAGELIST imageList) { return (HIMAGELIST)SendMessage(CBEM_SETIMAGELIST, 0, (LPARAM)imageList); } }; +#endif + }} -#endif
\ No newline at end of file +#endif diff --git a/CPP/Windows/Control/CommandBar.h b/CPP/Windows/Control/CommandBar.h new file mode 100755 index 00000000..4cbe07b6 --- /dev/null +++ b/CPP/Windows/Control/CommandBar.h @@ -0,0 +1,48 @@ +// Windows/Control/CommandBar.h + +#ifndef __WINDOWS_CONTROL_COMMANDBAR_H +#define __WINDOWS_CONTROL_COMMANDBAR_H + +#ifdef UNDER_CE + +#include "Windows/Window.h" + +namespace NWindows { +namespace NControl { + +class CCommandBar: public NWindows::CWindow +{ +public: + bool Create(HINSTANCE hInst, HWND hwndParent, int idCmdBar) + { + _window = ::CommandBar_Create(hInst, hwndParent, idCmdBar); + return (_window != NULL); + } + + // Macros + // void Destroy() { CommandBar_Destroy(_window); } + bool AddButtons(int iButton, UINT numButtons, LPTBBUTTON buttons) { return BOOLToBool(SendMessage(TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)buttons)); } + bool InsertButton(int iButton, LPTBBUTTON button) { return BOOLToBool(SendMessage(TB_INSERTBUTTON, (WPARAM)iButton, (LPARAM)button)); } + BOOL AddToolTips(UINT numToolTips, LPTSTR toolTips) { return BOOLToBool(SendMessage(TB_SETTOOLTIPS, (WPARAM)numToolTips, (LPARAM)toolTips)); } + void AutoSize() { SendMessage(TB_AUTOSIZE, 0, 0); } + + bool AddAdornments(DWORD dwFlags) { return BOOLToBool(::CommandBar_AddAdornments(_window, dwFlags, 0)); } + int AddBitmap(HINSTANCE hInst, int idBitmap, int iNumImages, int iImageWidth, int iImageHeight) { return ::CommandBar_AddBitmap(_window, hInst, idBitmap, iNumImages, iImageWidth, iImageHeight); } + bool DrawMenuBar(WORD iButton) { return BOOLToBool(::CommandBar_DrawMenuBar(_window, iButton)); } + HMENU GetMenu(WORD iButton) { return ::CommandBar_GetMenu(_window, iButton); } + int Height() { return CommandBar_Height(_window); } + HWND InsertComboBox(HINSTANCE hInst, int iWidth, UINT dwStyle, WORD idComboBox, WORD iButton) { return ::CommandBar_InsertComboBox(_window, hInst, iWidth, dwStyle, idComboBox, iButton); } + bool InsertMenubar(HINSTANCE hInst, WORD idMenu, WORD iButton) { return BOOLToBool(::CommandBar_InsertMenubar(_window, hInst, idMenu, iButton)); } + bool InsertMenubarEx(HINSTANCE hInst, LPTSTR pszMenu, WORD iButton) { return BOOLToBool(::CommandBar_InsertMenubarEx(_window, hInst, pszMenu, iButton)); } + bool Show(bool cmdShow) { return BOOLToBool(::CommandBar_Show(_window, BoolToBOOL(cmdShow))); } + + + // CE 4.0 + void AlignAdornments() { CommandBar_AlignAdornments(_window); } +}; + +}} + +#endif + +#endif
\ No newline at end of file diff --git a/CPP/Windows/Control/Dialog.cpp b/CPP/Windows/Control/Dialog.cpp index 8bae85be..dd0cf066 100755 --- a/CPP/Windows/Control/Dialog.cpp +++ b/CPP/Windows/Control/Dialog.cpp @@ -15,8 +15,7 @@ extern bool g_IsNT; namespace NWindows { namespace NControl { -static INT_PTR APIENTRY DialogProcedure(HWND dialogHWND, UINT message, - WPARAM wParam, LPARAM lParam) +static INT_PTR APIENTRY DialogProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam) { CWindow dialogTmp(dialogHWND); if (message == WM_INITDIALOG) @@ -27,30 +26,31 @@ static INT_PTR APIENTRY DialogProcedure(HWND dialogHWND, UINT message, if (message == WM_INITDIALOG) dialog->Attach(dialogHWND); - return BoolToBOOL(dialog->OnMessage(message, wParam, lParam)); + try { return BoolToBOOL(dialog->OnMessage(message, wParam, lParam)); } + catch(...) { return true; } } bool CDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { - case WM_INITDIALOG: - return OnInit(); - case WM_COMMAND: - return OnCommand(wParam, lParam); - case WM_NOTIFY: - return OnNotify((UINT)wParam, (LPNMHDR) lParam); - case WM_HELP: - { - OnHelp((LPHELPINFO)lParam); + case WM_INITDIALOG: return OnInit(); + case WM_COMMAND: return OnCommand(wParam, lParam); + case WM_NOTIFY: return OnNotify((UINT)wParam, (LPNMHDR) lParam); + case WM_TIMER: return OnTimer(wParam, lParam); + case WM_SIZE: return OnSize(wParam, LOWORD(lParam), HIWORD(lParam)); + case WM_HELP: OnHelp(); return true; + /* + OnHelp( + #ifdef UNDER_CE + (void *) + #else + (LPHELPINFO) + #endif + lParam); return true; - } - case WM_TIMER: - { - return OnTimer(wParam, lParam); - } - default: - return false; + */ + default: return false; } } @@ -70,21 +70,77 @@ bool CDialog::OnButtonClicked(int buttonID, HWND /* buttonHWND */) { switch(buttonID) { - case IDOK: - OnOK(); - break; - case IDCANCEL: - OnCancel(); - break; - case IDHELP: - OnHelp(); - break; - default: - return false; + case IDOK: OnOK(); break; + case IDCANCEL: OnCancel(); break; + case IDHELP: OnHelp(); break; + default: return false; } return true; } +static bool GetWorkAreaRect(RECT *rect) +{ + // use another function for multi-monitor. + return BOOLToBool(::SystemParametersInfo(SPI_GETWORKAREA, NULL, rect, NULL)); +} + +bool IsDialogSizeOK(int xSize, int ySize) +{ + // it returns for system font. Real font uses another values + LONG v = GetDialogBaseUnits(); + int x = LOWORD(v); + int y = HIWORD(v); + + RECT rect; + GetWorkAreaRect(&rect); + int wx = RECT_SIZE_X(rect); + int wy = RECT_SIZE_Y(rect); + return + xSize / 4 * x <= wx && + ySize / 8 * y <= wy; +} + +void CDialog::NormalizeSize(bool fullNormalize) +{ + RECT workRect; + GetWorkAreaRect(&workRect); + int xSize = RECT_SIZE_X(workRect); + int ySize = RECT_SIZE_Y(workRect); + RECT rect; + GetWindowRect(&rect); + int xSize2 = RECT_SIZE_X(rect); + int ySize2 = RECT_SIZE_Y(rect); + bool needMove = (xSize2 > xSize || ySize2 > ySize); + if (xSize2 > xSize || (needMove && fullNormalize)) + { + rect.left = workRect.left; + rect.right = workRect.right; + xSize2 = xSize; + } + if (ySize2 > ySize || (needMove && fullNormalize)) + { + rect.top = workRect.top; + rect.bottom = workRect.bottom; + ySize2 = ySize; + } + if (needMove) + { + if (fullNormalize) + Show(SW_SHOWMAXIMIZED); + else + Move(rect.left, rect.top, xSize2, ySize2, true); + } +} + +void CDialog::NormalizePosition() +{ + RECT workRect, rect; + GetWorkAreaRect(&workRect); + GetWindowRect(&rect); + if (rect.bottom > workRect.bottom && rect.top > workRect.top) + Move(rect.left, workRect.top, RECT_SIZE_X(rect), RECT_SIZE_Y(rect), true); +} + bool CModelessDialog::Create(LPCTSTR templateName, HWND parentWindow) { HWND aHWND = CreateDialogParam(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this); diff --git a/CPP/Windows/Control/Dialog.h b/CPP/Windows/Control/Dialog.h index daebb1bf..2b5147e7 100755 --- a/CPP/Windows/Control/Dialog.h +++ b/CPP/Windows/Control/Dialog.h @@ -4,7 +4,6 @@ #define __WINDOWS_CONTROL_DIALOG_H #include "Windows/Window.h" -#include "Windows/Defs.h" namespace NWindows { namespace NControl { @@ -24,6 +23,8 @@ public: bool ShowItem(int itemID, int cmdShow) const { return BOOLToBool(::ShowWindow(GetItem(itemID), cmdShow)); } + bool HideItem(int itemID) const { return ShowItem(itemID, SW_HIDE); } + bool SetItemText(int itemID, LPCTSTR s) { return BOOLToBool(SetDlgItemText(_window, itemID, s)); } @@ -50,11 +51,11 @@ public: bool SetItemInt(int itemID, UINT value, bool isSigned) { return BOOLToBool(SetDlgItemInt(_window, itemID, value, BoolToBOOL(isSigned))); } bool GetItemInt(int itemID, bool isSigned, UINT &value) - { - BOOL result; - value = GetDlgItemInt(_window, itemID, &result, BoolToBOOL(isSigned)); - return BOOLToBool(result); - } + { + BOOL result; + value = GetDlgItemInt(_window, itemID, &result, BoolToBOOL(isSigned)); + return BOOLToBool(result); + } HWND GetNextGroupItem(HWND control, bool previous) { return GetNextDlgGroupItem(_window, control, BoolToBOOL(previous)); } @@ -87,8 +88,17 @@ public: virtual bool OnInit() { return true; } virtual bool OnCommand(WPARAM wParam, LPARAM lParam); virtual bool OnCommand(int code, int itemID, LPARAM lParam); - virtual void OnHelp(LPHELPINFO /* helpInfo */) { OnHelp(); }; + virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; } + + /* + #ifdef UNDER_CE + virtual void OnHelp(void *) { OnHelp(); }; + #else + virtual void OnHelp(LPHELPINFO) { OnHelp(); }; + #endif + */ virtual void OnHelp() {}; + virtual bool OnButtonClicked(int buttonID, HWND buttonHWND); virtual void OnOK() {}; virtual void OnCancel() {}; @@ -99,12 +109,63 @@ public: { return SetLongPtr(DWLP_MSGRESULT, newLongPtr); } LONG_PTR GetMsgResult() const { return GetLongPtr(DWLP_MSGRESULT); } + + + bool GetMargins(int margin, int &x, int &y) + { + RECT rect; + rect.left = 0; + rect.top = 0; + rect.right = margin; + rect.bottom = margin; + if (!MapRect(&rect)) + return false; + x = rect.right - rect.left; + y = rect.bottom - rect.top; + return true; + } + + int Units_To_Pixels_X(int units) + { + RECT rect; + rect.left = 0; + rect.top = 0; + rect.right = units; + rect.bottom = units; + if (!MapRect(&rect)) + return units * 3 / 2; + return rect.right - rect.left; + } + + bool GetItemSizes(int id, int &x, int &y) + { + RECT rect; + if (!::GetWindowRect(GetItem(id), &rect)) + return false; + x = rect.right - rect.left; + y = rect.bottom - rect.top; + return true; + } + + void GetClientRectOfItem(int id, RECT &rect) + { + ::GetWindowRect(GetItem(id), &rect); + ScreenToClient(&rect); + } + + + bool MoveItem(int id, int x, int y, int width, int height, bool repaint = true) + { return BOOLToBool(::MoveWindow(GetItem(id), x, y, width, height, BoolToBOOL(repaint))); } + + void NormalizeSize(bool fullNormalize = false); + void NormalizePosition(); }; class CModelessDialog: public CDialog { public: bool Create(LPCTSTR templateName, HWND parentWindow); + bool Create(UINT resID, HWND parentWindow) { return Create(MAKEINTRESOURCEW(resID), parentWindow); } #ifndef _UNICODE bool Create(LPCWSTR templateName, HWND parentWindow); #endif @@ -116,22 +177,20 @@ class CModalDialog: public CDialog { public: INT_PTR Create(LPCTSTR templateName, HWND parentWindow); - INT_PTR Create(UINT resID, HWND parentWindow) - { return Create(MAKEINTRESOURCEW(resID), parentWindow); } + INT_PTR Create(UINT resID, HWND parentWindow) { return Create(MAKEINTRESOURCEW(resID), parentWindow); } #ifndef _UNICODE INT_PTR Create(LPCWSTR templateName, HWND parentWindow); #endif - bool End(INT_PTR result) - { return BOOLToBool(::EndDialog(_window, result)); } + bool End(INT_PTR result) { return BOOLToBool(::EndDialog(_window, result)); } virtual void OnOK() { End(IDOK); } virtual void OnCancel() { End(IDCANCEL); } }; class CDialogChildControl: public NWindows::CWindow { -public: int m_ID; +public: void Init(const NWindows::NControl::CDialog &parentDialog, int id) { m_ID = id; @@ -139,6 +198,8 @@ public: } }; +bool IsDialogSizeOK(int xSize, int ySize); + }} -#endif
\ No newline at end of file +#endif diff --git a/CPP/Windows/Control/ListView.h b/CPP/Windows/Control/ListView.h index 0daf65f3..1258ec93 100755 --- a/CPP/Windows/Control/ListView.h +++ b/CPP/Windows/Control/ListView.h @@ -4,7 +4,6 @@ #define __WINDOWS_CONTROL_LISTVIEW_H #include "Windows/Window.h" -#include "Windows/Defs.h" #include <commctrl.h> @@ -19,17 +18,14 @@ public: HWND parentWindow, HMENU idOrHMenu, HINSTANCE instance, LPVOID createParam); - bool SetUnicodeFormat(bool fUnicode) - { return BOOLToBool(ListView_SetUnicodeFormat(_window, BOOLToBool(fUnicode))); } + #ifndef UNDER_CE + bool SetUnicodeFormat(bool fUnicode) { return BOOLToBool(ListView_SetUnicodeFormat(_window, BOOLToBool(fUnicode))); } + #endif - bool DeleteAllItems() - { return BOOLToBool(ListView_DeleteAllItems(_window)); } - - bool DeleteColumn(int columnIndex) - { return BOOLToBool(ListView_DeleteColumn(_window, columnIndex)); } + bool DeleteAllItems() { return BOOLToBool(ListView_DeleteAllItems(_window)); } + bool DeleteColumn(int columnIndex) { return BOOLToBool(ListView_DeleteColumn(_window, columnIndex)); } - int InsertColumn(int columnIndex, const LVCOLUMN *columnInfo) - { return ListView_InsertColumn(_window, columnIndex, columnInfo); } + int InsertColumn(int columnIndex, const LVCOLUMN *columnInfo) { return ListView_InsertColumn(_window, columnIndex, columnInfo); } int InsertColumn(int columnIndex, LPCTSTR text, int width); int InsertItem(const LVITEM* item) { return ListView_InsertItem(_window, item); } int InsertItem(int index, LPCTSTR text); @@ -38,8 +34,7 @@ public: #ifndef _UNICODE - int InsertColumn(int columnIndex, const LVCOLUMNW *columnInfo) - { return (int)SendMessage(LVM_INSERTCOLUMNW, (WPARAM)columnIndex, (LPARAM)columnInfo); } + int InsertColumn(int columnIndex, const LVCOLUMNW *columnInfo) { return (int)SendMessage(LVM_INSERTCOLUMNW, (WPARAM)columnIndex, (LPARAM)columnInfo); } int InsertColumn(int columnIndex, LPCWSTR text, int width); int InsertItem(const LV_ITEMW* item) { return (int)SendMessage(LVM_INSERTITEMW, 0, (LPARAM)item); } int InsertItem(int index, LPCWSTR text); @@ -48,41 +43,30 @@ public: #endif - bool DeleteItem(int itemIndex) - { return BOOLToBool(ListView_DeleteItem(_window, itemIndex)); } + bool DeleteItem(int itemIndex) { return BOOLToBool(ListView_DeleteItem(_window, itemIndex)); } - UINT GetSelectedCount() const - { return ListView_GetSelectedCount(_window); } - int GetItemCount() const - { return ListView_GetItemCount(_window); } + UINT GetSelectedCount() const { return ListView_GetSelectedCount(_window); } + int GetItemCount() const { return ListView_GetItemCount(_window); } - INT GetSelectionMark() const - { return ListView_GetSelectionMark(_window); } + INT GetSelectionMark() const { return ListView_GetSelectionMark(_window); } - void SetItemCount(int numItems) - { ListView_SetItemCount(_window, numItems); } - void SetItemCountEx(int numItems, DWORD flags) - { ListView_SetItemCountEx(_window, numItems, flags); } + void SetItemCount(int numItems) { ListView_SetItemCount(_window, numItems); } + void SetItemCountEx(int numItems, DWORD flags) { ListView_SetItemCountEx(_window, numItems, flags); } - int GetNextItem(int startIndex, UINT flags) const - { return ListView_GetNextItem(_window, startIndex, flags); } - int GetNextSelectedItem(int startIndex) const - { return GetNextItem(startIndex, LVNI_SELECTED); } - int GetFocusedItem() const - { return GetNextItem(-1, LVNI_FOCUSED); } + int GetNextItem(int startIndex, UINT flags) const { return ListView_GetNextItem(_window, startIndex, flags); } + int GetNextSelectedItem(int startIndex) const { return GetNextItem(startIndex, LVNI_SELECTED); } + int GetFocusedItem() const { return GetNextItem(-1, LVNI_FOCUSED); } - bool GetItem(LVITEM* item) const - { return BOOLToBool(ListView_GetItem(_window, item)); } + bool GetItem(LVITEM* item) const { return BOOLToBool(ListView_GetItem(_window, item)); } bool GetItemParam(int itemIndex, LPARAM ¶m) const; - void GetItemText(int itemIndex, int aSubItemIndex, LPTSTR aText, int aTextSizeMax) const - { ListView_GetItemText(_window, itemIndex, aSubItemIndex, aText, aTextSizeMax); } + void GetItemText(int itemIndex, int subItemIndex, LPTSTR text, int textSizeMax) const + { ListView_GetItemText(_window, itemIndex, subItemIndex, text, textSizeMax); } bool SortItems(PFNLVCOMPARE compareFunction, LPARAM dataParam) { return BOOLToBool(ListView_SortItems(_window, compareFunction, dataParam)); } - void SetItemState(int index, UINT state, UINT mask) - { ListView_SetItemState(_window, index, state, mask); } - UINT GetItemState(int index, UINT mask) const - { return ListView_GetItemState(_window, index, mask); } + void SetItemState(int index, UINT state, UINT mask) { ListView_SetItemState(_window, index, state, mask); } + void SetItemState_FocusedSelected(int index) { SetItemState(index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); } + UINT GetItemState(int index, UINT mask) const { return ListView_GetItemState(_window, index, mask); } bool GetColumn(int columnIndex, LVCOLUMN* columnInfo) const { return BOOLToBool(ListView_GetColumn(_window, columnIndex, columnInfo)); } @@ -91,48 +75,33 @@ public: { return ListView_SetImageList(_window, imageList, imageListType); } // version 4.70: NT5 | (NT4 + ie3) | w98 | (w95 + ie3) - DWORD GetExtendedListViewStyle() - { return ListView_GetExtendedListViewStyle(_window); } - void SetExtendedListViewStyle(DWORD exStyle) - { ListView_SetExtendedListViewStyle(_window, exStyle); } - void SetExtendedListViewStyle(DWORD exMask, DWORD exStyle) - { ListView_SetExtendedListViewStyleEx(_window, exMask, exStyle); } - - #ifndef _WIN32_WCE - void SetCheckState(UINT index, bool checkState) - { ListView_SetCheckState(_window, index, BoolToBOOL(checkState)); } - #endif - bool GetCheckState(UINT index) - { return BOOLToBool(ListView_GetCheckState(_window, index)); } + DWORD GetExtendedListViewStyle() { return ListView_GetExtendedListViewStyle(_window); } + void SetExtendedListViewStyle(DWORD exStyle) { ListView_SetExtendedListViewStyle(_window, exStyle); } + void SetExtendedListViewStyle(DWORD exMask, DWORD exStyle) { ListView_SetExtendedListViewStyleEx(_window, exMask, exStyle); } + void SetCheckState(UINT index, bool checkState) { ListView_SetCheckState(_window, index, BoolToBOOL(checkState)); } + bool GetCheckState(UINT index) { return BOOLToBool(ListView_GetCheckState(_window, index)); } - bool EnsureVisible(int index, bool partialOK) - { return BOOLToBool(ListView_EnsureVisible(_window, index, BoolToBOOL(partialOK))); } + bool EnsureVisible(int index, bool partialOK) { return BOOLToBool(ListView_EnsureVisible(_window, index, BoolToBOOL(partialOK))); } - bool GetItemRect(int index, RECT *rect, int code) - { return BOOLToBool(ListView_GetItemRect(_window, index, rect, code)); } + bool GetItemRect(int index, RECT *rect, int code) { return BOOLToBool(ListView_GetItemRect(_window, index, rect, code)); } - HWND GetEditControl() - { return ListView_GetEditControl(_window) ; } - HWND EditLabel(int itemIndex) - { return ListView_EditLabel(_window, itemIndex) ; } + HWND GetEditControl() { return ListView_GetEditControl(_window) ; } + HWND EditLabel(int itemIndex) { return ListView_EditLabel(_window, itemIndex) ; } - bool RedrawItems(int firstIndex, int lastIndex) - { return BOOLToBool(ListView_RedrawItems(_window, firstIndex, lastIndex)); } + bool RedrawItems(int firstIndex, int lastIndex) { return BOOLToBool(ListView_RedrawItems(_window, firstIndex, lastIndex)); } bool RedrawAllItems() { if (GetItemCount() > 0) return RedrawItems(0, GetItemCount() - 1); return true; } - bool RedrawItem(int index) - { return RedrawItems(index, index); } + bool RedrawItem(int index) { return RedrawItems(index, index); } - int HitTest(LPLVHITTESTINFO info) - { return ListView_HitTest(_window, info); } - - COLORREF GetBkColor() - { return ListView_GetBkColor(_window); } + int HitTest(LPLVHITTESTINFO info) { return ListView_HitTest(_window, info); } + COLORREF GetBkColor() { return ListView_GetBkColor(_window); } + bool SetColumnWidth(int iCol, int cx) { return BOOLToBool(ListView_SetColumnWidth(_window, iCol, cx)); } + bool SetColumnWidthAuto(int iCol) { return SetColumnWidth(iCol, LVSCW_AUTOSIZE); } }; }} diff --git a/CPP/Windows/Control/ProgressBar.h b/CPP/Windows/Control/ProgressBar.h index 6ce837cc..4591880a 100755 --- a/CPP/Windows/Control/ProgressBar.h +++ b/CPP/Windows/Control/ProgressBar.h @@ -3,8 +3,7 @@ #ifndef __WINDOWS_CONTROL_PROGRESSBAR_H #define __WINDOWS_CONTROL_PROGRESSBAR_H -#include "Windows/Window.h" -#include "Windows/Defs.h" +#include "../Window.h" namespace NWindows { namespace NControl { @@ -12,30 +11,21 @@ namespace NControl { class CProgressBar: public CWindow { public: - LRESULT SetPos(int pos) - { return SendMessage(PBM_SETPOS, pos, 0); } - LRESULT DeltaPos(int increment) - { return SendMessage(PBM_DELTAPOS, increment, 0); } - UINT GetPos() - { return (UINT)SendMessage(PBM_GETPOS, 0, 0); } - LRESULT SetRange(unsigned short minValue, unsigned short maxValue) - { return SendMessage(PBM_SETRANGE, 0, MAKELPARAM(minValue, maxValue)); } - DWORD SetRange32(int minValue, int maxValue) - { return (DWORD)SendMessage(PBM_SETRANGE32, minValue, maxValue); } - int SetStep(int step) - { return (int)SendMessage(PBM_SETSTEP, step, 0); } - LRESULT StepIt() - { return SendMessage(PBM_STEPIT, 0, 0); } - - INT GetRange(bool minValue, PPBRANGE range) - { return (INT)SendMessage(PBM_GETRANGE, BoolToBOOL(minValue), (LPARAM)range); } + LRESULT SetPos(int pos) { return SendMessage(PBM_SETPOS, pos, 0); } + LRESULT DeltaPos(int increment) { return SendMessage(PBM_DELTAPOS, increment, 0); } + UINT GetPos() { return (UINT)SendMessage(PBM_GETPOS, 0, 0); } + LRESULT SetRange(unsigned short minValue, unsigned short maxValue) { return SendMessage(PBM_SETRANGE, 0, MAKELPARAM(minValue, maxValue)); } + DWORD SetRange32(int minValue, int maxValue) { return (DWORD)SendMessage(PBM_SETRANGE32, minValue, maxValue); } + int SetStep(int step) { return (int)SendMessage(PBM_SETSTEP, step, 0); } + LRESULT StepIt() { return SendMessage(PBM_STEPIT, 0, 0); } + INT GetRange(bool minValue, PPBRANGE range) { return (INT)SendMessage(PBM_GETRANGE, BoolToBOOL(minValue), (LPARAM)range); } - COLORREF SetBarColor(COLORREF color) - { return (COLORREF)SendMessage(PBM_SETBARCOLOR, 0, color); } - COLORREF SetBackgroundColor(COLORREF color) - { return (COLORREF)SendMessage(PBM_SETBKCOLOR, 0, color); } + #ifndef UNDER_CE + COLORREF SetBarColor(COLORREF color) { return (COLORREF)SendMessage(PBM_SETBARCOLOR, 0, color); } + COLORREF SetBackgroundColor(COLORREF color) { return (COLORREF)SendMessage(PBM_SETBKCOLOR, 0, color); } + #endif }; }} -#endif
\ No newline at end of file +#endif diff --git a/CPP/Windows/Control/PropertyPage.h b/CPP/Windows/Control/PropertyPage.h index e041d289..4e7e088e 100755 --- a/CPP/Windows/Control/PropertyPage.h +++ b/CPP/Windows/Control/PropertyPage.h @@ -3,8 +3,7 @@ #ifndef __WINDOWS_CONTROL_PROPERTYPAGE_H #define __WINDOWS_CONTROL_PROPERTYPAGE_H -#include "Windows/Control/Dialog.h" -#include "Windows/Defs.h" +#include "Dialog.h" namespace NWindows { namespace NControl { @@ -16,21 +15,21 @@ class CPropertyPage: public CDialog public: CPropertyPage(HWND window = NULL): CDialog(window){}; - void Changed() { PropSheet_Changed(GetParent(), HWND(*this)); } - void UnChanged() { PropSheet_UnChanged(GetParent(), HWND(*this)); } + void Changed() { PropSheet_Changed(GetParent(), (HWND)*this); } + void UnChanged() { PropSheet_UnChanged(GetParent(), (HWND)*this); } virtual bool OnNotify(UINT controlID, LPNMHDR lParam); virtual bool OnKillActive() { return false; } // false = OK - virtual bool OnKillActive(const PSHNOTIFY * /* aPSHNOTIFY */) { return OnKillActive(); } + virtual bool OnKillActive(const PSHNOTIFY *) { return OnKillActive(); } virtual LONG OnSetActive() { return false; } // false = OK - virtual LONG OnSetActive(const PSHNOTIFY * /* aPSHNOTIFY */) { return OnKillActive(); } + virtual LONG OnSetActive(const PSHNOTIFY *) { return OnSetActive(); } virtual LONG OnApply() { return PSNRET_NOERROR; } - virtual LONG OnApply(const PSHNOTIFY * /* aPSHNOTIFY */) { return OnApply(); } - virtual void OnNotifyHelp() { } - virtual void OnNotifyHelp(const PSHNOTIFY * /* aPSHNOTIFY */) { OnNotifyHelp(); } - virtual void OnReset() { } - virtual void OnReset(const PSHNOTIFY * /* aPSHNOTIFY */) { OnReset(); } + virtual LONG OnApply(const PSHNOTIFY *) { return OnApply(); } + virtual void OnNotifyHelp() {} + virtual void OnNotifyHelp(const PSHNOTIFY *) { OnNotifyHelp(); } + virtual void OnReset() {} + virtual void OnReset(const PSHNOTIFY *) { OnReset(); } }; struct CPageInfo diff --git a/CPP/Windows/Control/Static.h b/CPP/Windows/Control/Static.h index 5dded0ec..cb3126dd 100755 --- a/CPP/Windows/Control/Static.h +++ b/CPP/Windows/Control/Static.h @@ -3,8 +3,7 @@ #ifndef __WINDOWS_CONTROL_STATIC_H #define __WINDOWS_CONTROL_STATIC_H -#include "Windows/Window.h" -#include "Windows/Defs.h" +#include "../Window.h" namespace NWindows { namespace NControl { @@ -12,16 +11,18 @@ namespace NControl { class CStatic: public CWindow { public: - HICON SetIcon(HICON icon) - { return (HICON)SendMessage(STM_SETICON, (WPARAM)icon, 0); } - HICON GetIcon() - { return (HICON)SendMessage(STM_GETICON, 0, 0); } - HANDLE SetImage(WPARAM imageType, HANDLE handle) - { return (HANDLE)SendMessage(STM_SETIMAGE, imageType, (LPARAM)handle); } - HANDLE GetImage(WPARAM imageType) - { return (HANDLE)SendMessage(STM_GETIMAGE, imageType, 0); } + HANDLE SetImage(WPARAM imageType, HANDLE handle) { return (HANDLE)SendMessage(STM_SETIMAGE, imageType, (LPARAM)handle); } + HANDLE GetImage(WPARAM imageType) { return (HANDLE)SendMessage(STM_GETIMAGE, imageType, 0); } + + #ifdef UNDER_CE + HICON SetIcon(HICON icon) { return (HICON)SetImage(IMAGE_ICON, icon); } + HICON GetIcon() { return (HICON)GetImage(IMAGE_ICON); } + #else + HICON SetIcon(HICON icon) { return (HICON)SendMessage(STM_SETICON, (WPARAM)icon, 0); } + HICON GetIcon() { return (HICON)SendMessage(STM_GETICON, 0, 0); } + #endif }; }} -#endif
\ No newline at end of file +#endif diff --git a/CPP/Windows/Control/ToolBar.h b/CPP/Windows/Control/ToolBar.h index 4bd21531..262184ae 100755 --- a/CPP/Windows/Control/ToolBar.h +++ b/CPP/Windows/Control/ToolBar.h @@ -4,7 +4,6 @@ #define __WINDOWS_CONTROL_TOOLBAR_H #include "Windows/Window.h" -#include "Windows/Defs.h" namespace NWindows { namespace NControl { @@ -12,23 +11,33 @@ namespace NControl { class CToolBar: public NWindows::CWindow { public: + void AutoSize() { SendMessage(TB_AUTOSIZE, 0, 0); } + DWORD GetButtonSize() { return (DWORD)SendMessage(TB_GETBUTTONSIZE, 0, 0); } + bool GetMaxSize(LPSIZE size) - { return LRESULTToBool(SendMessage(TB_GETMAXSIZE, 0, (LPARAM)size)); } - bool EnableButton(UINT buttonID, bool enable) - { return LRESULTToBool(SendMessage(TB_ENABLEBUTTON, buttonID, - MAKELONG(BoolToBOOL(enable), 0))); } - void ButtonStructSize() - { SendMessage(TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON)); } - HIMAGELIST SetImageList(UINT listIndex, HIMAGELIST imageList) - { return HIMAGELIST(SendMessage(TB_SETIMAGELIST, listIndex, (LPARAM)imageList)); } - bool AddButton(UINT numButtons, LPTBBUTTON buttons) - { return LRESULTToBool(SendMessage(TB_ADDBUTTONS, numButtons, (LPARAM)buttons)); } + #ifdef UNDER_CE + { + // maybe it must be fixed for more than 1 buttons + DWORD val = GetButtonSize(); + size->cx = LOWORD(val); + size->cy = HIWORD(val); + return true; + } + #else + { + return LRESULTToBool(SendMessage(TB_GETMAXSIZE, 0, (LPARAM)size)); + } + #endif + + bool EnableButton(UINT buttonID, bool enable) { return LRESULTToBool(SendMessage(TB_ENABLEBUTTON, buttonID, MAKELONG(BoolToBOOL(enable), 0))); } + void ButtonStructSize() { SendMessage(TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON)); } + HIMAGELIST SetImageList(UINT listIndex, HIMAGELIST imageList) { return HIMAGELIST(SendMessage(TB_SETIMAGELIST, listIndex, (LPARAM)imageList)); } + bool AddButton(UINT numButtons, LPTBBUTTON buttons) { return LRESULTToBool(SendMessage(TB_ADDBUTTONS, numButtons, (LPARAM)buttons)); } #ifndef _UNICODE - bool AddButtonW(UINT numButtons, LPTBBUTTON buttons) - { return LRESULTToBool(SendMessage(TB_ADDBUTTONSW, numButtons, (LPARAM)buttons)); } + bool AddButtonW(UINT numButtons, LPTBBUTTON buttons) { return LRESULTToBool(SendMessage(TB_ADDBUTTONSW, numButtons, (LPARAM)buttons)); } #endif }; }} -#endif
\ No newline at end of file +#endif diff --git a/CPP/Windows/Control/Window2.cpp b/CPP/Windows/Control/Window2.cpp index 3900f649..e1299048 100755 --- a/CPP/Windows/Control/Window2.cpp +++ b/CPP/Windows/Control/Window2.cpp @@ -20,15 +20,21 @@ ATOM MyRegisterClass(CONST WNDCLASSW *wndClass); namespace NControl { +#ifdef UNDER_CE +#define MY_START_WM_CREATE WM_CREATE +#else +#define MY_START_WM_CREATE WM_NCCREATE +#endif + static LRESULT CALLBACK WindowProcedure(HWND aHWND, UINT message, WPARAM wParam, LPARAM lParam) { CWindow tempWindow(aHWND); - if (message == WM_NCCREATE) + if (message == MY_START_WM_CREATE) tempWindow.SetUserDataLongPtr( LONG_PTR(((LPCREATESTRUCT)lParam)->lpCreateParams)); CWindow2 *window = (CWindow2*)(tempWindow.GetUserDataLongPtr()); - if (window != NULL && message == WM_NCCREATE) + if (window != NULL && message == MY_START_WM_CREATE) window->Attach(aHWND); if (window == 0) { diff --git a/CPP/Windows/Control/Window2.h b/CPP/Windows/Control/Window2.h index 8af902f8..b016a13d 100755 --- a/CPP/Windows/Control/Window2.h +++ b/CPP/Windows/Control/Window2.h @@ -4,7 +4,6 @@ #define __WINDOWS_CONTROL_WINDOW2_H #include "Windows/Window.h" -#include "Windows/Defs.h" namespace NWindows { namespace NControl { diff --git a/CPP/Windows/DLL.cpp b/CPP/Windows/DLL.cpp index 8a95a256..5afd72d9 100755 --- a/CPP/Windows/DLL.cpp +++ b/CPP/Windows/DLL.cpp @@ -2,12 +2,12 @@ #include "StdAfx.h" -#include "DLL.h" -#include "Defs.h" #ifndef _UNICODE #include "../Common/StringConvert.h" #endif +#include "DLL.h" + #ifndef _UNICODE extern bool g_IsNT; #endif @@ -15,11 +15,6 @@ extern bool g_IsNT; namespace NWindows { namespace NDLL { -CLibrary::~CLibrary() -{ - Free(); -} - bool CLibrary::Free() { if (_module == 0) diff --git a/CPP/Windows/DLL.h b/CPP/Windows/DLL.h index 4c2ffa2b..4a253b32 100755 --- a/CPP/Windows/DLL.h +++ b/CPP/Windows/DLL.h @@ -8,17 +8,25 @@ namespace NWindows { namespace NDLL { +#ifdef UNDER_CE +#define My_GetProcAddress(module, proceName) GetProcAddressA(module, proceName) +#else +#define My_GetProcAddress(module, proceName) ::GetProcAddress(module, proceName) +#endif + class CLibrary { bool LoadOperations(HMODULE newModule); protected: HMODULE _module; public: + CLibrary(): _module(NULL) {}; + ~CLibrary() { Free(); } + operator HMODULE() const { return _module; } HMODULE* operator&() { return &_module; } + bool IsLoaded() const { return (_module != NULL); }; - CLibrary():_module(NULL) {}; - ~CLibrary(); void Attach(HMODULE m) { Free(); @@ -31,8 +39,6 @@ public: return m; } - // operator HMODULE() const { return _module; }; - bool IsLoaded() const { return (_module != NULL); }; bool Free(); bool LoadEx(LPCTSTR fileName, DWORD flags = LOAD_LIBRARY_AS_DATAFILE); bool Load(LPCTSTR fileName); @@ -40,8 +46,7 @@ public: bool LoadEx(LPCWSTR fileName, DWORD flags = LOAD_LIBRARY_AS_DATAFILE); bool Load(LPCWSTR fileName); #endif - FARPROC GetProcAddress(LPCSTR procName) const - { return ::GetProcAddress(_module, procName); } + FARPROC GetProc(LPCSTR procName) const { return My_GetProcAddress(_module, procName); } }; bool MyGetModuleFileName(HMODULE hModule, CSysString &result); diff --git a/CPP/Windows/FileDir.cpp b/CPP/Windows/FileDir.cpp index cffce7f0..81fcd6ef 100755 --- a/CPP/Windows/FileDir.cpp +++ b/CPP/Windows/FileDir.cpp @@ -38,6 +38,8 @@ static CSysString GetSysPath(LPCWSTR sysPath) { return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); } #endif +#ifndef UNDER_CE + bool MyGetWindowsDirectory(CSysString &path) { UINT needLength = ::GetWindowsDirectory(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); @@ -52,6 +54,8 @@ bool MyGetSystemDirectory(CSysString &path) return (needLength > 0 && needLength <= MAX_PATH); } +#endif + #ifndef _UNICODE bool MyGetWindowsDirectory(UString &path) { @@ -441,7 +445,41 @@ bool RemoveDirectoryWithSubItems(const UString &path) } #endif -#ifndef _WIN32_WCE +bool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName) +{ + int index; + if (!MyGetFullPathName(fileName, resultName, index)) + return false; + resultName = resultName.Left(index); + return true; +} + +bool GetOnlyName(LPCTSTR fileName, CSysString &resultName) +{ + int index; + if (!MyGetFullPathName(fileName, resultName, index)) + return false; + resultName = resultName.Mid(index); + return true; +} + +#ifdef UNDER_CE +bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath) +{ + resultPath = fileName; + return true; +} + +bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, int &fileNamePartStartIndex) +{ + resultPath = fileName; + // change it + fileNamePartStartIndex = resultPath.ReverseFind('\\'); + fileNamePartStartIndex++; + return true; +} + +#else bool MyGetShortPathName(LPCTSTR longPath, CSysString &shortPath) { @@ -534,15 +572,6 @@ bool MyGetFullPathName(LPCWSTR fileName, UString &path) } #endif -bool GetOnlyName(LPCTSTR fileName, CSysString &resultName) -{ - int index; - if (!MyGetFullPathName(fileName, resultName, index)) - return false; - resultName = resultName.Mid(index); - return true; -} - #ifndef _UNICODE bool GetOnlyName(LPCWSTR fileName, UString &resultName) { @@ -554,15 +583,6 @@ bool GetOnlyName(LPCWSTR fileName, UString &resultName) } #endif -bool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName) -{ - int index; - if (!MyGetFullPathName(fileName, resultName, index)) - return false; - resultName = resultName.Left(index); - return true; -} - #ifndef _UNICODE bool GetOnlyDirPrefix(LPCWSTR fileName, UString &resultName) { @@ -603,7 +623,6 @@ bool MyGetCurrentDirectory(UString &path) return true; } #endif -#endif bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, CSysString &resultPath, UINT32 &filePart) @@ -615,6 +634,7 @@ bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, resultPath.ReleaseBuffer(); return (value > 0 && value <= MAX_PATH); } +#endif #ifndef _UNICODE bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, @@ -715,9 +735,13 @@ bool CTempFile::Create(LPCTSTR prefix, CSysString &resultPath) return false; if (Create(tempPath, prefix, resultPath) != 0) return true; + #ifdef UNDER_CE + return false; + #else if (!MyGetWindowsDirectory(tempPath)) return false; return (Create(tempPath, prefix, resultPath) != 0); + #endif } bool CTempFile::Remove() diff --git a/CPP/Windows/FileDir.h b/CPP/Windows/FileDir.h index 279ccdc6..04542d87 100755 --- a/CPP/Windows/FileDir.h +++ b/CPP/Windows/FileDir.h @@ -41,14 +41,16 @@ bool DeleteFileAlways(LPCWSTR name); bool RemoveDirectoryWithSubItems(const UString &path); #endif -#ifndef _WIN32_WCE +bool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName); +bool GetOnlyName(LPCTSTR fileName, CSysString &resultName); +#ifdef UNDER_CE +bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath); +bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, int &fileNamePartStartIndex); +#else bool MyGetShortPathName(LPCTSTR longPath, CSysString &shortPath); -bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath, - int &fileNamePartStartIndex); +bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath, int &fileNamePartStartIndex); bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath); -bool GetOnlyName(LPCTSTR fileName, CSysString &resultName); -bool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName); #ifndef _UNICODE bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, int &fileNamePartStartIndex); @@ -64,31 +66,28 @@ bool MyGetCurrentDirectory(CSysString &resultPath); bool MySetCurrentDirectory(LPCWSTR path); bool MyGetCurrentDirectory(UString &resultPath); #endif -#endif -bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, - CSysString &resultPath, UINT32 &filePart); +bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, CSysString &resultPath, UINT32 &filePart); #ifndef _UNICODE -bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, - UString &resultPath, UINT32 &filePart); +bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, UString &resultPath, UINT32 &filePart); #endif -inline bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, - CSysString &resultPath) +inline bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, CSysString &resultPath) { UINT32 value; return MySearchPath(path, fileName, extension, resultPath, value); } #ifndef _UNICODE -inline bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, - UString &resultPath) +inline bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, UString &resultPath) { UINT32 value; return MySearchPath(path, fileName, extension, resultPath, value); } #endif +#endif + bool MyGetTempPath(CSysString &resultPath); #ifndef _UNICODE bool MyGetTempPath(UString &resultPath); diff --git a/CPP/Windows/FileFind.cpp b/CPP/Windows/FileFind.cpp index d0cb2327..e3358f90 100755 --- a/CPP/Windows/FileFind.cpp +++ b/CPP/Windows/FileFind.cpp @@ -61,10 +61,10 @@ bool CFileInfoW::IsDots() const fi.IsDevice = false; /* - #ifndef _WIN32_WCE - fi.ReparseTag = fd.dwReserved0; - #else + #ifdef UNDER_CE fi.ObjectID = fd.dwOID; + #else + fi.ReparseTag = fd.dwReserved0; #endif */ @@ -390,7 +390,7 @@ HANDLE CFindChangeNotification::FindFirst(LPCWSTR pathName, bool watchSubtree, D } #endif -#ifndef _WIN32_WCE +#ifndef UNDER_CE bool MyGetLogicalDriveStrings(CSysStringVector &driveStrings) { driveStrings.Clear(); diff --git a/CPP/Windows/FileFind.h b/CPP/Windows/FileFind.h index 4644d048..63631f66 100755 --- a/CPP/Windows/FileFind.h +++ b/CPP/Windows/FileFind.h @@ -37,10 +37,10 @@ public: bool IsDevice; /* - #ifndef _WIN32_WCE - UINT32 ReparseTag; - #else + #ifdef UNDER_CE DWORD ObjectID; + #else + UINT32 ReparseTag; #endif */ @@ -148,7 +148,7 @@ public: bool FindNext() { return BOOLToBool(::FindNextChangeNotification(_handle)); } }; -#ifndef _WIN32_WCE +#ifndef UNDER_CE bool MyGetLogicalDriveStrings(CSysStringVector &driveStrings); #ifndef _UNICODE bool MyGetLogicalDriveStrings(UStringVector &driveStrings); diff --git a/CPP/Windows/FileIO.cpp b/CPP/Windows/FileIO.cpp index 7279ea15..938e6c70 100755 --- a/CPP/Windows/FileIO.cpp +++ b/CPP/Windows/FileIO.cpp @@ -21,6 +21,14 @@ namespace NFile { #ifdef SUPPORT_DEVICE_FILE bool IsDeviceName(LPCTSTR n) { + #ifdef UNDER_CE + int len = (int)MyStringLen(n); + if (len < 5 || len > 5 || memcmp(n, TEXT("DSK"), 3 * sizeof(TCHAR)) != 0) + return false; + if (n[4] != ':') + return false; + // for reading use SG_REQ sg; if (DeviceIoControl(dsk, IOCTL_DISK_READ)); + #else if (n[0] != '\\' || n[1] != '\\' || n[2] != '.' || n[3] != '\\') return false; int len = (int)MyStringLen(n); @@ -31,6 +39,7 @@ bool IsDeviceName(LPCTSTR n) for (int i = 17; i < len; i++) if (n[i] < '0' || n[i] > '9') return false; + #endif return true; } @@ -241,6 +250,11 @@ void CInFile::GetDeviceLength() { if (_handle != INVALID_HANDLE_VALUE && IsDeviceFile) { + #ifdef UNDER_CE + LengthDefined = true; + Length = 128 << 20; + + #else PARTITION_INFORMATION partInfo; LengthDefined = true; Length = 0; @@ -257,6 +271,7 @@ void CInFile::GetDeviceLength() Length = geom.Cylinders.QuadPart * geom.TracksPerCylinder * geom.SectorsPerTrack * geom.BytesPerSector; } // SeekToBegin(); + #endif } } @@ -360,10 +375,10 @@ bool COutFile::Create(LPCTSTR fileName, bool createAlways) #ifndef _UNICODE bool COutFile::Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, creationDisposition, flagsAndAttributes); } + { return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, creationDisposition, flagsAndAttributes); } bool COutFile::Open(LPCWSTR fileName, DWORD creationDisposition) - { return Open(fileName, FILE_SHARE_READ, creationDisposition, FILE_ATTRIBUTE_NORMAL); } + { return Open(fileName, FILE_SHARE_READ, creationDisposition, FILE_ATTRIBUTE_NORMAL); } bool COutFile::Create(LPCWSTR fileName, bool createAlways) { return Open(fileName, GetCreationDisposition(createAlways)); } diff --git a/CPP/Windows/FileIO.h b/CPP/Windows/FileIO.h index 4e7308c7..dce692fe 100755 --- a/CPP/Windows/FileIO.h +++ b/CPP/Windows/FileIO.h @@ -29,10 +29,10 @@ protected: HANDLE _handle; bool Create(LPCTSTR fileName, DWORD desiredAccess, - DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); + DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); #ifndef _UNICODE bool Create(LPCWSTR fileName, DWORD desiredAccess, - DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); + DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); #endif public: @@ -82,6 +82,7 @@ class CInFile: public CFileBase bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const { return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize); } + #ifndef UNDER_CE bool GetGeometry(DISK_GEOMETRY *res) const { return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, res, sizeof(*res)); } @@ -90,6 +91,7 @@ class CInFile: public CFileBase bool GetPartitionInfo(PARTITION_INFORMATION *res) { return DeviceIoControlOut(IOCTL_DISK_GET_PARTITION_INFO, LPVOID(res), sizeof(*res)); } + #endif void GetDeviceLength(); #endif diff --git a/CPP/Windows/FileMapping.h b/CPP/Windows/FileMapping.h index 25f5a519..3f0ebd74 100755 --- a/CPP/Windows/FileMapping.h +++ b/CPP/Windows/FileMapping.h @@ -3,46 +3,58 @@ #ifndef __WINDOWS_FILEMAPPING_H #define __WINDOWS_FILEMAPPING_H -#include "Windows/Handle.h" -#include "Windows/Defs.h" +#include "Common/Types.h" + +#include "Handle.h" namespace NWindows { -// namespace NFile { -// namespace NMapping { class CFileMapping: public CHandle { public: - bool Create(HANDLE file, LPSECURITY_ATTRIBUTES attributes, - DWORD protect, UINT64 maximumSize, LPCTSTR name) + WRes Create(DWORD protect, UInt64 maxSize, LPCTSTR name) { - _handle = ::CreateFileMapping(file, attributes, - protect, DWORD(maximumSize >> 32), DWORD(maximumSize), name); - return (_handle != NULL); + _handle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, protect, (DWORD)(maxSize >> 32), (DWORD)maxSize, name); + return ::GetLastError(); } - bool Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) + WRes Open(DWORD desiredAccess, LPCTSTR name) { - _handle = ::OpenFileMapping(desiredAccess, BoolToBOOL(inheritHandle), name); - return (_handle != NULL); + #ifdef UNDER_CE + WRes res = Create(PAGE_READONLY, 0, name); + if (res == ERROR_ALREADY_EXISTS) + return 0; + Close(); + if (res == 0) + res = ERROR_FILE_NOT_FOUND; + return res; + #else + _handle = ::OpenFileMapping(desiredAccess, FALSE, name); + if (_handle != 0) + return 0; + return ::GetLastError(); + #endif } - LPVOID MapViewOfFile(DWORD desiredAccess, UINT64 fileOffset, - SIZE_T numberOfBytesToMap) + LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap) { - return ::MapViewOfFile(_handle, desiredAccess, - DWORD(fileOffset >> 32), DWORD(fileOffset), numberOfBytesToMap); + return ::MapViewOfFile(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap); } - LPVOID MapViewOfFileEx(DWORD desiredAccess, UINT64 fileOffset, - SIZE_T numberOfBytesToMap, LPVOID baseAddress) + #ifndef UNDER_CE + LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap, LPVOID baseAddress) { - return ::MapViewOfFileEx(_handle, desiredAccess, - DWORD(fileOffset >> 32), DWORD(fileOffset), - numberOfBytesToMap, baseAddress); + return ::MapViewOfFileEx(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap, baseAddress); } - + #endif +}; +class CFileUnmapper +{ + const void *_data; +public: + CFileUnmapper(const void *data) : _data(data) {} + ~CFileUnmapper() { ::UnmapViewOfFile(_data); } }; } diff --git a/CPP/Windows/Handle.h b/CPP/Windows/Handle.h index 0791b4ac..bb7cb705 100755 --- a/CPP/Windows/Handle.h +++ b/CPP/Windows/Handle.h @@ -13,6 +13,7 @@ public: operator HANDLE() { return _handle; } CHandle(): _handle(NULL) {} ~CHandle() { Close(); } + bool IsCreated() const { return (_handle != NULL); } bool Close() { if (_handle == NULL) @@ -22,8 +23,7 @@ public: _handle = NULL; return true; } - void Attach(HANDLE handle) - { _handle = handle; } + void Attach(HANDLE handle) { _handle = handle; } HANDLE Detach() { HANDLE handle = _handle; diff --git a/CPP/Windows/Memory.cpp b/CPP/Windows/Memory.cpp index 435ea999..4c23205e 100755 --- a/CPP/Windows/Memory.cpp +++ b/CPP/Windows/Memory.cpp @@ -7,11 +7,6 @@ namespace NWindows { namespace NMemory { -CGlobal::~CGlobal() -{ - Free(); -} - bool CGlobal::Alloc(UINT flags, SIZE_T size) { HGLOBAL newBlock = ::GlobalAlloc(flags, size); @@ -29,29 +24,6 @@ bool CGlobal::Free() return (m_MemoryHandle == NULL); } -void CGlobal::Attach(HGLOBAL hGlobal) -{ - Free(); - m_MemoryHandle = hGlobal; -} - -HGLOBAL CGlobal::Detach() -{ - HGLOBAL h = m_MemoryHandle; - m_MemoryHandle = NULL; - return h; -} - -LPVOID CGlobal::Lock() const -{ - return ::GlobalLock(m_MemoryHandle); -} - -void CGlobal::Unlock() const -{ - ::GlobalUnlock(m_MemoryHandle); -} - bool CGlobal::ReAlloc(SIZE_T size) { HGLOBAL newBlock = ::GlobalReAlloc(m_MemoryHandle, size, GMEM_MOVEABLE); diff --git a/CPP/Windows/Memory.h b/CPP/Windows/Memory.h index 763c9575..1984baf6 100755 --- a/CPP/Windows/Memory.h +++ b/CPP/Windows/Memory.h @@ -11,18 +11,26 @@ class CGlobal HGLOBAL m_MemoryHandle; public: CGlobal(): m_MemoryHandle(NULL){}; - ~CGlobal(); + ~CGlobal() { Free(); } operator HGLOBAL() const { return m_MemoryHandle; }; - void Attach(HGLOBAL hGlobal); - HGLOBAL Detach(); + void Attach(HGLOBAL hGlobal) + { + Free(); + m_MemoryHandle = hGlobal; + } + HGLOBAL Detach() + { + HGLOBAL h = m_MemoryHandle; + m_MemoryHandle = NULL; + return h; + } bool Alloc(UINT flags, SIZE_T size); bool Free(); - LPVOID Lock() const; - void Unlock() const; + LPVOID Lock() const { return GlobalLock(m_MemoryHandle); } + void Unlock() const { GlobalUnlock(m_MemoryHandle); } bool ReAlloc(SIZE_T size); }; - class CGlobalLock { HGLOBAL m_Global; @@ -31,12 +39,12 @@ public: LPVOID GetPointer() const { return m_Pointer; } CGlobalLock(HGLOBAL hGlobal): m_Global(hGlobal) { - m_Pointer = ::GlobalLock(hGlobal); + m_Pointer = GlobalLock(hGlobal); }; ~CGlobalLock() { if (m_Pointer != NULL) - ::GlobalUnlock(m_Global); + GlobalUnlock(m_Global); } }; diff --git a/CPP/Windows/MemoryLock.cpp b/CPP/Windows/MemoryLock.cpp index 284c832c..e0f43099 100755 --- a/CPP/Windows/MemoryLock.cpp +++ b/CPP/Windows/MemoryLock.cpp @@ -5,6 +5,8 @@ namespace NWindows { namespace NSecurity { +#ifndef UNDER_CE + #ifndef _UNICODE typedef BOOL (WINAPI * OpenProcessTokenP)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle); typedef BOOL (WINAPI * LookupPrivilegeValueP)(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid); @@ -75,4 +77,6 @@ bool EnableLockMemoryPrivilege(bool enable) } #endif +#endif + }} diff --git a/CPP/Windows/MemoryLock.h b/CPP/Windows/MemoryLock.h index 321024bd..5fe619de 100755 --- a/CPP/Windows/MemoryLock.h +++ b/CPP/Windows/MemoryLock.h @@ -6,7 +6,9 @@ namespace NWindows { namespace NSecurity { +#ifndef UNDER_CE bool EnableLockMemoryPrivilege(bool enable = true); +#endif }} diff --git a/CPP/Windows/Menu.cpp b/CPP/Windows/Menu.cpp index 0c16a0e9..675f8623 100755 --- a/CPP/Windows/Menu.cpp +++ b/CPP/Windows/Menu.cpp @@ -161,7 +161,20 @@ bool CMenu::InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item) ConvertItemToSysForm(item, si); if (item.IsString()) si.dwTypeData = (LPWSTR)(LPCWSTR)item.StringValue; + #ifdef UNDER_CE + UINT flags = (item.fType & MFT_SEPARATOR) ? MF_SEPARATOR : MF_STRING; + UINT id = item.wID; + if ((item.fMask & MIIM_SUBMENU) != 0) + { + flags |= MF_POPUP; + id = (UINT)item.hSubMenu; + } + if (!Insert(itemIndex, flags | (byPosition ? MF_BYPOSITION : MF_BYCOMMAND), id, item.StringValue)) + return false; + return SetItemInfo(itemIndex, byPosition, &si); + #else return InsertItem(itemIndex, byPosition, &si); + #endif } } diff --git a/CPP/Windows/Menu.h b/CPP/Windows/Menu.h index f14287de..2563b911 100755 --- a/CPP/Windows/Menu.h +++ b/CPP/Windows/Menu.h @@ -24,6 +24,7 @@ struct CMenuItem // HBITMAP hbmpItem; bool IsString() const // change it MIIM_STRING { return ((fMask & MIIM_TYPE) != 0 && (fType == MFT_STRING)); } + bool IsSeparator() const { return (fType == MFT_SEPARATOR); } CMenuItem(): fMask(0), fType(0), fState(0), wID(0), hSubMenu(0), hbmpChecked(0), hbmpUnchecked(0), dwItemData(0) {} }; @@ -63,23 +64,33 @@ public: } int GetItemCount() - { return GetMenuItemCount(_menu); } + { + #ifdef UNDER_CE + for (int i = 0;; i++) + { + CMenuItem item; + item.fMask = MIIM_STATE; + if (!GetItem(i, true, item)) + return i; + } + #else + return GetMenuItemCount(_menu); + #endif + } - HMENU GetSubMenu(int pos) - { return ::GetSubMenu(_menu, pos); } + HMENU GetSubMenu(int pos) { return ::GetSubMenu(_menu, pos); } + #ifndef UNDER_CE bool GetItemString(UINT idItem, UINT flag, CSysString &result) { result.Empty(); int len = ::GetMenuString(_menu, idItem, 0, 0, flag); - len = ::GetMenuString(_menu, idItem, result.GetBuffer(len + 2), - len + 1, flag); + len = ::GetMenuString(_menu, idItem, result.GetBuffer(len + 2), len + 1, flag); result.ReleaseBuffer(); return (len != 0); } - UINT GetItemID(int pos) - { return ::GetMenuItemID(_menu, pos); } - UINT GetItemState(UINT id, UINT flags) - { return ::GetMenuState(_menu, id, flags); } + UINT GetItemID(int pos) { return ::GetMenuItemID(_menu, pos); } + UINT GetItemState(UINT id, UINT flags) { return ::GetMenuState(_menu, id, flags); } + #endif bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo) { return BOOLToBool(::GetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } @@ -92,11 +103,14 @@ public: bool Insert(UINT position, UINT flags, UINT_PTR idNewItem, LPCTSTR newItem) { return BOOLToBool(::InsertMenu(_menu, position, flags, idNewItem, newItem)); } + #ifndef UNDER_CE bool InsertItem(UINT itemIndex, bool byPosition, LPCMENUITEMINFO itemInfo) { return BOOLToBool(::InsertMenuItem(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } + #endif - bool RemoveItem(UINT item, UINT flags) - { return BOOLToBool(::RemoveMenu(_menu, item, flags)); } + bool RemoveItem(UINT item, UINT flags) { return BOOLToBool(::RemoveMenu(_menu, item, flags)); } + void RemoveAllItemsFrom(UINT index) { while (RemoveItem(index, MF_BYPOSITION)); } + void RemoveAllItems() { RemoveAllItemsFrom(0); } #ifndef _UNICODE bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo) @@ -112,16 +126,15 @@ public: bool SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item); bool InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item); - int Track(UINT flags, int x, int y, HWND hWnd) - { return ::TrackPopupMenuEx(_menu, flags, x, y, hWnd, NULL); } + int Track(UINT flags, int x, int y, HWND hWnd) { return ::TrackPopupMenuEx(_menu, flags, x, y, hWnd, NULL); } bool CheckRadioItem(UINT idFirst, UINT idLast, UINT idCheck, UINT flags) { return BOOLToBool(::CheckMenuRadioItem(_menu, idFirst, idLast, idCheck, flags)); } - DWORD CheckItem(UINT id, UINT uCheck) - { return ::CheckMenuItem(_menu, id, uCheck); } - BOOL EnableItem(UINT uIDEnableItem, UINT uEnable) - { return EnableMenuItem(_menu, uIDEnableItem, uEnable); } + DWORD CheckItem(UINT id, UINT uCheck) { return ::CheckMenuItem(_menu, id, uCheck); } + DWORD CheckItemByID(UINT id, bool check) { return CheckItem(id, MF_BYCOMMAND | (check ? MF_CHECKED : MF_UNCHECKED)); } + + BOOL EnableItem(UINT uIDEnableItem, UINT uEnable) { return EnableMenuItem(_menu, uIDEnableItem, uEnable); } }; class CMenuDestroyer diff --git a/CPP/Windows/Net.cpp b/CPP/Windows/Net.cpp index a5c3f15c..b0a18732 100755 --- a/CPP/Windows/Net.cpp +++ b/CPP/Windows/Net.cpp @@ -2,12 +2,12 @@ #include "StdAfx.h" -#include "Windows/Net.h" - #ifndef _UNICODE #include "Common/StringConvert.h" #endif +#include "Windows/Net.h" + #ifndef _UNICODE extern bool g_IsNT; #endif @@ -105,7 +105,7 @@ static void SetComplexString2(LPWSTR *destString, bool defined, const UString &s *destString = 0; } -static void ConvertCResourceToNETRESOURCE(const CResourceW &resource, NETRESOURCEW &netResource) +static void ConvertCResourceToNETRESOURCE(const CResourceW &resource, NETRESOURCEW &netResource) { netResource.dwScope = resource.Scope; netResource.dwType = resource.Type; @@ -209,7 +209,7 @@ DWORD CEnum::Next(CResource &resource) ZeroMemory(lpnrLocal, kBufferSize); DWORD bufferSize = kBufferSize; DWORD numEntries = 1; - DWORD result = Next(&numEntries, lpnrLocal, &bufferSize); + DWORD result = Next(&numEntries, lpnrLocal, &bufferSize); if (result != NO_ERROR) return result; if (numEntries != 1) @@ -230,7 +230,7 @@ DWORD CEnum::Next(CResourceW &resource) ZeroMemory(lpnrLocal, kBufferSize); DWORD bufferSize = kBufferSize; DWORD numEntries = 1; - DWORD result = NextW(&numEntries, lpnrLocal, &bufferSize); + DWORD result = NextW(&numEntries, lpnrLocal, &bufferSize); if (result != NO_ERROR) return result; if (numEntries != 1) @@ -256,7 +256,7 @@ DWORD GetResourceParent(const CResource &resource, CResource &parentResource) DWORD bufferSize = kBufferSize; NETRESOURCE netResource; ConvertCResourceToNETRESOURCE(resource, netResource); - DWORD result = ::WNetGetResourceParent(&netResource, lpnrLocal, &bufferSize); + DWORD result = ::WNetGetResourceParent(&netResource, lpnrLocal, &bufferSize); if (result != NO_ERROR) return result; ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource); @@ -276,7 +276,7 @@ DWORD GetResourceParent(const CResourceW &resource, CResourceW &parentResource) DWORD bufferSize = kBufferSize; NETRESOURCEW netResource; ConvertCResourceToNETRESOURCE(resource, netResource); - DWORD result = ::WNetGetResourceParentW(&netResource, lpnrLocal, &bufferSize); + DWORD result = ::WNetGetResourceParentW(&netResource, lpnrLocal, &bufferSize); if (result != NO_ERROR) return result; ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource); diff --git a/CPP/Windows/NtCheck.h b/CPP/Windows/NtCheck.h new file mode 100755 index 00000000..e56318f0 --- /dev/null +++ b/CPP/Windows/NtCheck.h @@ -0,0 +1,44 @@ +// Windows/NtCheck.h + +#ifndef __WINDOWS_NT_CHECK_H +#define __WINDOWS_NT_CHECK_H + +#ifdef _WIN32 + +#if !defined(_WIN64) && !defined(UNDER_CE) +static inline bool IsItWindowsNT() +{ + OSVERSIONINFO vi; + vi.dwOSVersionInfoSize = sizeof(vi); + return (::GetVersionEx(&vi) && vi.dwPlatformId == VER_PLATFORM_WIN32_NT); +} +#endif + +#ifndef _UNICODE + #if defined(_WIN64) || defined(UNDER_CE) + bool g_IsNT = true; + #define SET_IS_NT + #else + bool g_IsNT = false; + #define SET_IS_NT g_IsNT = IsItWindowsNT(); + #endif + #define NT_CHECK_ACTION + // #define NT_CHECK_ACTION { NT_CHECK_FAIL_ACTION } +#else + #if !defined(_WIN64) && !defined(UNDER_CE) + #define NT_CHECK_ACTION if (!IsItWindowsNT()) { NT_CHECK_FAIL_ACTION } + #else + #define NT_CHECK_ACTION + #endif + #define SET_IS_NT +#endif + +#define NT_CHECK NT_CHECK_ACTION SET_IS_NT + +#else + +#define NT_CHECK + +#endif + +#endif diff --git a/CPP/Windows/Process.cpp b/CPP/Windows/Process.cpp new file mode 100755 index 00000000..d600abe0 --- /dev/null +++ b/CPP/Windows/Process.cpp @@ -0,0 +1,81 @@ +// Process.cpp + +#include "StdAfx.h" + +#include "../Common/StringConvert.h" + +#include "Process.h" + +#ifndef _UNICODE +extern bool g_IsNT; +#endif _UNICODE + +namespace NWindows { + +static UString GetQuotedString(const UString &s) +{ + return UString(L'\"') + s + UString(L'\"'); +} + +WRes CProcess::Create(LPCWSTR imageName, const UString ¶ms, LPCWSTR curDir) +{ + Close(); + const UString params2 = + #ifndef UNDER_CE + GetQuotedString(imageName) + L' ' + + #endif + params; + #ifdef UNDER_CE + curDir = 0; + #else + imageName = 0; + #endif + PROCESS_INFORMATION pi; + BOOL result; + #ifndef _UNICODE + if (!g_IsNT) + { + STARTUPINFOA si; + si.cb = sizeof(si); + si.lpReserved = 0; + si.lpDesktop = 0; + si.lpTitle = 0; + si.dwFlags = 0; + si.cbReserved2 = 0; + si.lpReserved2 = 0; + + CSysString curDirA; + if (curDir != 0) + curDirA = GetSystemString(curDir); + result = ::CreateProcessA(NULL, (LPSTR)(LPCSTR)GetSystemString(params2), + NULL, NULL, FALSE, 0, NULL, ((curDir != 0) ? (LPCSTR)curDirA: 0), &si, &pi); + } + else + #endif + { + STARTUPINFOW si; + si.cb = sizeof(si); + si.lpReserved = 0; + si.lpDesktop = 0; + si.lpTitle = 0; + si.dwFlags = 0; + si.cbReserved2 = 0; + si.lpReserved2 = 0; + + result = CreateProcessW(imageName, (LPWSTR)(LPCWSTR)params2, + NULL, NULL, FALSE, 0, NULL, (LPWSTR)curDir, &si, &pi); + } + if (result == 0) + return ::GetLastError(); + ::CloseHandle(pi.hThread); + _handle = pi.hProcess; + return 0; +} + +WRes MyCreateProcess(LPCWSTR imageName, const UString ¶ms) +{ + CProcess process; + return process.Create(imageName, params, 0); +} + +} diff --git a/CPP/Windows/Process.h b/CPP/Windows/Process.h new file mode 100755 index 00000000..5b01c377 --- /dev/null +++ b/CPP/Windows/Process.h @@ -0,0 +1,100 @@ +// Windows/Process.h + +#ifndef __WINDOWS_PROCESS_H +#define __WINDOWS_PROCESS_H + +#include <psapi.h> + +#include "../Common/MyString.h" + +#include "Defs.h" +#include "Handle.h" + +namespace NWindows { + +class CProcess: public CHandle +{ +public: + bool Open(DWORD desiredAccess, bool inheritHandle, DWORD processId) + { + _handle = ::OpenProcess(desiredAccess, inheritHandle, processId); + return (_handle != 0); + } + + #ifndef UNDER_CE + + bool GetExitCodeProcess(LPDWORD lpExitCode) { return BOOLToBool(::GetExitCodeProcess(_handle, lpExitCode)); } + bool Terminate(UINT exitCode) { return BOOLToBool(::TerminateProcess(_handle, exitCode)); } + #if(WINVER >= 0x0500) + DWORD GetGuiResources (DWORD uiFlags) { return ::GetGuiResources(_handle, uiFlags); } + #endif + bool SetPriorityClass(DWORD dwPriorityClass) { return BOOLToBool(::SetPriorityClass(_handle, dwPriorityClass)); } + DWORD GetPriorityClass() { return ::GetPriorityClass(_handle); } + bool GetIoCounters(PIO_COUNTERS lpIoCounters ) { return BOOLToBool(::GetProcessIoCounters(_handle, lpIoCounters )); } + + bool GetTimes(LPFILETIME creationTime, LPFILETIME exitTime, LPFILETIME kernelTime, LPFILETIME userTime) + { return BOOLToBool(::GetProcessTimes(_handle, creationTime, exitTime, kernelTime, userTime)); } + + DWORD WaitForInputIdle(DWORD milliseconds) { return ::WaitForInputIdle(_handle, milliseconds); } + + // Debug + + bool ReadMemory(LPCVOID baseAddress, LPVOID buffer, SIZE_T size, SIZE_T* numberOfBytesRead) + { return BOOLToBool(::ReadProcessMemory(_handle, baseAddress, buffer, size, numberOfBytesRead)); } + + bool WriteMemory(LPVOID baseAddress, LPCVOID buffer, SIZE_T size, SIZE_T* numberOfBytesWritten) + { return BOOLToBool(::WriteProcessMemory(_handle, baseAddress, buffer, size, numberOfBytesWritten)); } + + bool FlushInstructionCache(LPCVOID baseAddress = 0, SIZE_T size = 0) + { return BOOLToBool(::FlushInstructionCache(_handle, baseAddress, size)); } + + LPVOID VirtualAlloc(LPVOID address, SIZE_T size, DWORD allocationType, DWORD protect) + { return VirtualAllocEx(_handle, address, size, allocationType, protect); } + + bool VirtualFree(LPVOID address, SIZE_T size, DWORD freeType) + { return BOOLToBool(::VirtualFreeEx(_handle, address, size, freeType)); } + + // Process Status API (PSAPI) + + bool EmptyWorkingSet() + { return BOOLToBool(::EmptyWorkingSet(_handle)); } + bool EnumModules(HMODULE *hModules, DWORD arraySizeInBytes, LPDWORD receivedBytes) + { return BOOLToBool(::EnumProcessModules(_handle, hModules, arraySizeInBytes, receivedBytes)); } + + DWORD MyGetModuleBaseName(HMODULE hModule, LPTSTR baseName, DWORD size) + { return ::GetModuleBaseName(_handle, hModule, baseName, size); } + bool MyGetModuleBaseName(HMODULE hModule, CSysString &name) + { + const int length = 1000; + DWORD resultLen = MyGetModuleBaseName(hModule, name.GetBuffer(length), length); + name.ReleaseBuffer(); + return (resultLen != 0); + } + + DWORD MyGetModuleFileNameEx(HMODULE hModule, LPTSTR baseName, DWORD size) + { return ::GetModuleFileNameEx(_handle, hModule, baseName, size); } + bool MyGetModuleFileNameEx(HMODULE hModule, CSysString &name) + { + const int length = MAX_PATH + 100; + DWORD resultLen = MyGetModuleFileNameEx(hModule, name.GetBuffer(length), length); + name.ReleaseBuffer(); + return (resultLen != 0); + } + + bool GetModuleInformation(HMODULE hModule, LPMODULEINFO moduleInfo) + { return BOOLToBool(::GetModuleInformation(_handle, hModule, moduleInfo, sizeof(MODULEINFO))); } + bool GetMemoryInfo(PPROCESS_MEMORY_COUNTERS memCounters) + { return BOOLToBool(::GetProcessMemoryInfo(_handle, memCounters, sizeof(PROCESS_MEMORY_COUNTERS))); } + + #endif + + WRes Create(LPCWSTR imageName, const UString ¶ms, LPCWSTR curDir); + + DWORD Wait() { return ::WaitForSingleObject(_handle, INFINITE); } +}; + +WRes MyCreateProcess(LPCWSTR imageName, const UString ¶ms); + +} + +#endif diff --git a/CPP/Windows/PropVariantConversions.cpp b/CPP/Windows/PropVariantConversions.cpp index df8abfb0..2d8456cd 100755 --- a/CPP/Windows/PropVariantConversions.cpp +++ b/CPP/Windows/PropVariantConversions.cpp @@ -2,12 +2,12 @@ #include "StdAfx.h" -#include "PropVariantConversions.h" +#include "Common/IntToString.h" +#include "Common/StringConvert.h" #include "Windows/Defs.h" -#include "Common/StringConvert.h" -#include "Common/IntToString.h" +#include "PropVariantConversions.h" static UString ConvertUInt64ToString(UInt64 value) { @@ -64,10 +64,10 @@ bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool return true; } -UString ConvertFileTimeToString(const FILETIME &fileTime, bool includeTime, bool includeSeconds) +UString ConvertFileTimeToString(const FILETIME &ft, bool includeTime, bool includeSeconds) { char s[32]; - ConvertFileTimeToString(fileTime, s, includeTime, includeSeconds); + ConvertFileTimeToString(ft, s, includeTime, includeSeconds); return GetUnicodeString(s); } @@ -88,12 +88,7 @@ UString ConvertPropVariantToString(const PROPVARIANT &prop) case VT_I4: return ConvertInt64ToString(prop.lVal); case VT_I8: return ConvertInt64ToString(prop.hVal.QuadPart); case VT_BOOL: return VARIANT_BOOLToBool(prop.boolVal) ? L"+" : L"-"; - default: - #ifndef _WIN32_WCE - throw 150245; - #else - return UString(); - #endif + default: throw 150245; } } @@ -105,11 +100,6 @@ UInt64 ConvertPropVariantToUInt64(const PROPVARIANT &prop) case VT_UI2: return prop.uiVal; case VT_UI4: return prop.ulVal; case VT_UI8: return (UInt64)prop.uhVal.QuadPart; - default: - #ifndef _WIN32_WCE - throw 151199; - #else - return 0; - #endif + default: throw 151199; } } diff --git a/CPP/Windows/PropVariantConversions.h b/CPP/Windows/PropVariantConversions.h index 68ad9612..3de4dedb 100755 --- a/CPP/Windows/PropVariantConversions.h +++ b/CPP/Windows/PropVariantConversions.h @@ -1,14 +1,14 @@ // Windows/PropVariantConversions.h -#ifndef __PROPVARIANTCONVERSIONS_H -#define __PROPVARIANTCONVERSIONS_H +#ifndef __PROP_VARIANT_CONVERSIONS_H +#define __PROP_VARIANT_CONVERSIONS_H -#include "Common/Types.h" #include "Common/MyString.h" +#include "Common/Types.h" bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime = true, bool includeSeconds = true); UString ConvertFileTimeToString(const FILETIME &ft, bool includeTime = true, bool includeSeconds = true); -UString ConvertPropVariantToString(const PROPVARIANT &propVariant); -UInt64 ConvertPropVariantToUInt64(const PROPVARIANT &propVariant); +UString ConvertPropVariantToString(const PROPVARIANT &prop); +UInt64 ConvertPropVariantToUInt64(const PROPVARIANT &prop); #endif diff --git a/CPP/Windows/Registry.cpp b/CPP/Windows/Registry.cpp index 96cab0c2..8b25375d 100755 --- a/CPP/Windows/Registry.cpp +++ b/CPP/Windows/Registry.cpp @@ -16,24 +16,6 @@ namespace NRegistry { #define MYASSERT(expr) // _ASSERTE(expr) -CKey::~CKey() -{ - Close(); -} - -HKEY CKey::Detach() -{ - HKEY hKey = _object; - _object = NULL; - return hKey; -} - -void CKey::Attach(HKEY hKey) -{ - MYASSERT(_object == NULL); - _object = hKey; -} - LONG CKey::Create(HKEY parentKey, LPCTSTR keyName, LPTSTR keyClass, DWORD options, REGSAM accessMask, LPSECURITY_ATTRIBUTES securityAttributes, LPDWORD disposition) @@ -224,6 +206,24 @@ LONG CKey::QueryValue(LPCTSTR name, bool &value) return res; } +LONG CKey::GetValue_IfOk(LPCTSTR name, UInt32 &value) +{ + UInt32 newVal; + LONG res = QueryValue(name, newVal); + if (res == ERROR_SUCCESS) + value = newVal; + return res; +} + +LONG CKey::GetValue_IfOk(LPCTSTR name, bool &value) +{ + bool newVal; + LONG res = QueryValue(name, newVal); + if (res == ERROR_SUCCESS) + value = newVal; + return res; +} + LONG CKey::QueryValue(LPCTSTR name, LPTSTR value, UInt32 &count) { MYASSERT(count != NULL); @@ -321,4 +321,49 @@ LONG CKey::EnumKeys(CSysStringVector &keyNames) return ERROR_SUCCESS; } +LONG CKey::SetValue_Strings(LPCTSTR valueName, const UStringVector &strings) +{ + UInt32 numChars = 0; + int i; + for (i = 0; i < strings.Size(); i++) + numChars += strings[i].Length() + 1; + CBuffer<wchar_t> buffer; + buffer.SetCapacity(numChars); + int pos = 0; + for (i = 0; i < strings.Size(); i++) + { + const UString &s = strings[i]; + MyStringCopy((wchar_t *)buffer + pos, (const wchar_t *)s); + pos += s.Length() + 1; + } + return SetValue(valueName, buffer, numChars * sizeof(wchar_t)); +} + +LONG CKey::GetValue_Strings(LPCTSTR valueName, UStringVector &strings) +{ + strings.Clear(); + CByteBuffer buffer; + UInt32 dataSize; + LONG res = QueryValue(valueName, buffer, dataSize); + if (res != ERROR_SUCCESS) + return res; + if (dataSize % sizeof(wchar_t) != 0) + return E_FAIL; + const wchar_t *data = (const wchar_t *)(const Byte *)buffer; + int numChars = dataSize / sizeof(wchar_t); + UString s; + for (int i = 0; i < numChars; i++) + { + wchar_t c = data[i]; + if (c == 0) + { + strings.Add(s); + s.Empty(); + } + else + s += c; + } + return res; +} + }} diff --git a/CPP/Windows/Registry.h b/CPP/Windows/Registry.h index c6b14572..f0561e68 100755 --- a/CPP/Windows/Registry.h +++ b/CPP/Windows/Registry.h @@ -17,19 +17,23 @@ class CKey HKEY _object; public: CKey(): _object(NULL) {} - ~CKey(); + ~CKey() { Close(); } operator HKEY() const { return _object; } + void Attach(HKEY key) { _object = key; } + HKEY Detach() + { + HKEY key = _object; + _object = NULL; + return key; + } - HKEY Detach(); - void Attach(HKEY key); LONG Create(HKEY parentKey, LPCTSTR keyName, LPTSTR keyClass = REG_NONE, DWORD options = REG_OPTION_NON_VOLATILE, REGSAM accessMask = KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTES securityAttributes = NULL, LPDWORD disposition = NULL); - LONG Open(HKEY parentKey, LPCTSTR keyName, - REGSAM accessMask = KEY_ALL_ACCESS); + LONG Open(HKEY parentKey, LPCTSTR keyName, REGSAM accessMask = KEY_ALL_ACCESS); LONG Close(); @@ -52,6 +56,9 @@ public: LONG SetValue(LPCTSTR name, const void *value, UInt32 size); + LONG SetValue_Strings(LPCTSTR valueName, const UStringVector &strings); + LONG GetValue_Strings(LPCTSTR valueName, UStringVector &strings); + LONG SetKeyValue(LPCTSTR keyName, LPCTSTR valueName, LPCTSTR value); LONG QueryValue(LPCTSTR name, UInt32 &value); @@ -59,6 +66,9 @@ public: LONG QueryValue(LPCTSTR name, LPTSTR value, UInt32 &dataSize); LONG QueryValue(LPCTSTR name, CSysString &value); + LONG GetValue_IfOk(LPCTSTR name, UInt32 &value); + LONG GetValue_IfOk(LPCTSTR name, bool &value); + #ifndef _UNICODE LONG QueryValue(LPCWSTR name, LPWSTR value, UInt32 &dataSize); LONG QueryValue(LPCWSTR name, UString &value); diff --git a/CPP/Windows/Security.h b/CPP/Windows/Security.h index 90cf2caf..ba66de44 100755 --- a/CPP/Windows/Security.h +++ b/CPP/Windows/Security.h @@ -3,10 +3,10 @@ #ifndef __WINDOWS_SECURITY_H #define __WINDOWS_SECURITY_H -#include "Defs.h" - #include <NTSecAPI.h> +#include "Defs.h" + namespace NWindows { namespace NSecurity { @@ -128,8 +128,8 @@ public: PLSA_ENUMERATION_INFORMATION *enumerationBuffer, PULONG countReturned) { return LsaEnumerateAccountsWithUserRight(_handle, userRights, (void **)enumerationBuffer, countReturned); } - NTSTATUS EnumerateAccountRights(PSID sid, PLSA_UNICODE_STRING* userRights, PULONG countOfRights) - { return ::LsaEnumerateAccountRights(_handle, sid, userRights, countOfRights); } + NTSTATUS EnumerateAccountRights(PSID sid, PLSA_UNICODE_STRING* userRights, PULONG countOfRights) + { return ::LsaEnumerateAccountRights(_handle, sid, userRights, countOfRights); } NTSTATUS LookupSids(ULONG count, PSID* sids, PLSA_REFERENCED_DOMAIN_LIST* referencedDomains, PLSA_TRANSLATED_NAME* names) diff --git a/CPP/Windows/Shell.cpp b/CPP/Windows/Shell.cpp index f2aee286..010449fb 100755 --- a/CPP/Windows/Shell.cpp +++ b/CPP/Windows/Shell.cpp @@ -2,12 +2,13 @@ #include "StdAfx.h" +#include "Common/MyCom.h" #ifndef _UNICODE #include "Common/StringConvert.h" #endif -#include "Common/MyCom.h" -#include "Windows/Shell.h" + #include "Windows/COM.h" +#include "Windows/Shell.h" #ifndef _UNICODE extern bool g_IsNT; @@ -16,8 +17,9 @@ extern bool g_IsNT; namespace NWindows { namespace NShell { -///////////////////////// -// CItemIDList +#ifndef UNDER_CE + +// SHGetMalloc is unsupported in Windows Mobile? void CItemIDList::Free() { @@ -62,6 +64,7 @@ CItemIDList& CItemIDList::operator=(const CItemIDList &object) return *this; } */ + ///////////////////////////// // CDrop @@ -79,11 +82,6 @@ void CDrop::Free() m_Assigned = false; } -CDrop::~CDrop() -{ - Free(); -} - UINT CDrop::QueryCountOfFiles() { return QueryFile(0xFFFFFFFF, (LPTSTR)NULL, 0); @@ -121,9 +119,6 @@ void CDrop::QueryFileNames(UStringVector &fileNames) } -///////////////////////////// -// Functions - bool GetPathFromIDList(LPCITEMIDLIST itemIDList, CSysString &path) { bool result = BOOLToBool(::SHGetPathFromIDList(itemIDList, path.GetBuffer(MAX_PATH * 2))); @@ -131,6 +126,40 @@ bool GetPathFromIDList(LPCITEMIDLIST itemIDList, CSysString &path) return result; } +#endif + +#ifdef UNDER_CE + +bool BrowseForFolder(LPBROWSEINFO, CSysString) +{ + return false; +} + +bool BrowseForFolder(HWND, LPCTSTR, UINT, LPCTSTR, CSysString &) +{ + return false; +} + +bool BrowseForFolder(HWND owner, LPCTSTR title, + LPCTSTR initialFolder, CSysString &resultPath) +{ + /* + // SHBrowseForFolder doesn't work before CE 6.0 ? + if (GetProcAddress(LoadLibrary(L"ceshell.dll", L"SHBrowseForFolder") == 0) + MessageBoxW(0, L"no", L"", 0); + else + MessageBoxW(0, L"yes", L"", 0); + */ + /* + UString s = L"all files"; + s += L" (*.*)"; + return MyGetOpenFileName(owner, title, initialFolder, s, resultPath, true); + */ + return false; +} + +#else + bool BrowseForFolder(LPBROWSEINFO browseInfo, CSysString &resultPath) { NWindows::NCOM::CComInitializer comInitializer; @@ -145,6 +174,7 @@ bool BrowseForFolder(LPBROWSEINFO browseInfo, CSysString &resultPath) int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /* lp */, LPARAM data) { + #ifndef UNDER_CE switch(uMsg) { case BFFM_INITIALIZED: @@ -166,6 +196,7 @@ int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /* lp */, LPARAM da default: break; } + #endif return 0; } @@ -177,8 +208,15 @@ bool BrowseForFolder(HWND owner, LPCTSTR title, UINT ulFlags, BROWSEINFO browseInfo; browseInfo.hwndOwner = owner; browseInfo.pidlRoot = NULL; + + // there are Unicode/astring problems in WinCE SDK!!! + #ifdef UNDER_CE + browseInfo.pszDisplayName = (LPSTR)displayName.GetBuffer(MAX_PATH); + browseInfo.lpszTitle = (LPCSTR)title; + #else browseInfo.pszDisplayName = displayName.GetBuffer(MAX_PATH); browseInfo.lpszTitle = title; + #endif browseInfo.ulFlags = ulFlags; browseInfo.lpfn = (initialFolder != NULL) ? BrowseCallbackProc : NULL; browseInfo.lParam = (LPARAM)initialFolder; @@ -189,7 +227,10 @@ bool BrowseForFolder(HWND owner, LPCTSTR title, LPCTSTR initialFolder, CSysString &resultPath) { return BrowseForFolder(owner, title, - BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT, initialFolder, resultPath); + #ifndef UNDER_CE + BIF_NEWDIALOGSTYLE | + #endif + BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT, initialFolder, resultPath); // BIF_STATUSTEXT; BIF_USENEWUI (Version 5.0) } @@ -289,4 +330,6 @@ bool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString & #endif +#endif + }} diff --git a/CPP/Windows/Shell.h b/CPP/Windows/Shell.h index 3990c334..d2b39acf 100755 --- a/CPP/Windows/Shell.h +++ b/CPP/Windows/Shell.h @@ -9,12 +9,12 @@ #include "Common/MyString.h" #include "Windows/Defs.h" - namespace NWindows{ namespace NShell{ ///////////////////////// // CItemIDList +#ifndef UNDER_CE class CItemIDList { @@ -55,9 +55,9 @@ class CDrop bool m_Assigned; void Free(); public: - CDrop(bool mustBeFinished) : m_MustBeFinished(mustBeFinished), - m_Assigned(false) {} - ~CDrop(); + CDrop(bool mustBeFinished) : m_MustBeFinished(mustBeFinished), m_Assigned(false) {} + ~CDrop() { Free(); } + void Attach(HDROP object); operator HDROP() { return m_Object;} bool QueryPoint(LPPOINT point) @@ -74,6 +74,8 @@ public: void QueryFileNames(UStringVector &fileNames); }; +#endif + ///////////////////////////// // Functions @@ -88,5 +90,4 @@ bool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString & #endif }} - -#endif
\ No newline at end of file +#endif diff --git a/CPP/Windows/Synchronization.h b/CPP/Windows/Synchronization.h index 54fcf952..dc695f6f 100755 --- a/CPP/Windows/Synchronization.h +++ b/CPP/Windows/Synchronization.h @@ -25,12 +25,10 @@ public: ~CBaseEvent() { Close(); } WRes Close() { return Event_Close(&_object); } #ifdef _WIN32 - WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, - LPSECURITY_ATTRIBUTES securityAttributes = NULL) + WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL) { - _object = ::CreateEvent(securityAttributes, BoolToBOOL(manualReset), - BoolToBOOL(initiallyOwn), name); - if (_object != 0) + _object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name); + if (name == NULL && _object != 0) return 0; return ::GetLastError(); } @@ -95,14 +93,14 @@ public: class CMutex: public CObject { public: - WRes Create(bool initiallyOwn, LPCTSTR name = NULL, - LPSECURITY_ATTRIBUTES securityAttributes = NULL) + WRes Create(bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL) { - _handle = ::CreateMutex(securityAttributes, BoolToBOOL(initiallyOwn), name); - if (_handle != 0) + _handle = ::CreateMutex(sa, BoolToBOOL(initiallyOwn), name); + if (name == NULL && _handle != 0) return 0; return ::GetLastError(); } + #ifndef UNDER_CE WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) { _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name); @@ -110,6 +108,7 @@ public: return 0; return ::GetLastError(); } + #endif WRes Release() { return ::ReleaseMutex(_handle) ? 0 : ::GetLastError(); diff --git a/CPP/Windows/System.cpp b/CPP/Windows/System.cpp index 8e4069c2..4bc8d2a3 100755 --- a/CPP/Windows/System.cpp +++ b/CPP/Windows/System.cpp @@ -2,6 +2,8 @@ #include "StdAfx.h" +#include "../Common/Defs.h" + #include "System.h" namespace NWindows { @@ -14,6 +16,8 @@ UInt32 GetNumberOfProcessors() return (UInt32)systemInfo.dwNumberOfProcessors; } +#ifndef UNDER_CE + #if !defined(_WIN64) && defined(__GNUC__) typedef struct _MY_MEMORYSTATUSEX { @@ -37,26 +41,30 @@ typedef struct _MY_MEMORYSTATUSEX { typedef BOOL (WINAPI *GlobalMemoryStatusExP)(MY_LPMEMORYSTATUSEX lpBuffer); +#endif + UInt64 GetRamSize() { + #ifndef UNDER_CE MY_MEMORYSTATUSEX stat; stat.dwLength = sizeof(stat); + #endif #ifdef _WIN64 if (!::GlobalMemoryStatusEx(&stat)) return 0; - return stat.ullTotalPhys; + return MyMin(stat.ullTotalVirtual, stat.ullTotalPhys); #else + #ifndef UNDER_CE GlobalMemoryStatusExP globalMemoryStatusEx = (GlobalMemoryStatusExP) - ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), - "GlobalMemoryStatusEx"); - if (globalMemoryStatusEx != 0) - if (globalMemoryStatusEx(&stat)) - return stat.ullTotalPhys; + ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), "GlobalMemoryStatusEx"); + if (globalMemoryStatusEx != 0 && globalMemoryStatusEx(&stat)) + return MyMin(stat.ullTotalVirtual, stat.ullTotalPhys); + #endif { MEMORYSTATUS stat; stat.dwLength = sizeof(stat); - GlobalMemoryStatus(&stat); - return stat.dwTotalPhys; + ::GlobalMemoryStatus(&stat); + return MyMin(stat.dwTotalVirtual, stat.dwTotalPhys); } #endif } diff --git a/CPP/Windows/Time.cpp b/CPP/Windows/Time.cpp index 810dcbe2..ec9ca47d 100755 --- a/CPP/Windows/Time.cpp +++ b/CPP/Windows/Time.cpp @@ -2,45 +2,129 @@ #include "StdAfx.h" -#include "Time.h" #include "Windows/Defs.h" +#include "Time.h" + namespace NWindows { namespace NTime { -bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime) +static const UInt32 kNumTimeQuantumsInSecond = 10000000; +static const UInt32 kFileTimeStartYear = 1601; +static const UInt32 kDosTimeStartYear = 1980; +static const UInt32 kUnixTimeStartYear = 1970; +static const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * + 60 * 60 * 24 * (89 + 365 * (kUnixTimeStartYear - kFileTimeStartYear)); + +bool DosTimeToFileTime(UInt32 dosTime, FILETIME &ft) { - return BOOLToBool(::DosDateTimeToFileTime((UInt16)(dosTime >> 16), (UInt16)(dosTime & 0xFFFF), &fileTime)); + #if defined(_WIN32) && !defined(UNDER_CE) + return BOOLToBool(::DosDateTimeToFileTime((UInt16)(dosTime >> 16), (UInt16)(dosTime & 0xFFFF), &ft)); + #else + ft.dwLowDateTime = 0; + ft.dwHighDateTime = 0; + UInt64 res; + if (!GetSecondsSince1601(kDosTimeStartYear + (dosTime >> 25), (dosTime >> 21) & 0xF, (dosTime >> 16) & 0x1F, + (dosTime >> 11) & 0x1F, (dosTime >> 5) & 0x3F, (dosTime & 0x1F) * 2, res)) + return false; + res *= kNumTimeQuantumsInSecond; + ft.dwLowDateTime = (UInt32)res; + ft.dwHighDateTime = (UInt32)(res >> 32); + return true; + #endif } static const UInt32 kHighDosTime = 0xFF9FBF7D; static const UInt32 kLowDosTime = 0x210000; -bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime) +#define PERIOD_4 (4 * 365 + 1) +#define PERIOD_100 (PERIOD_4 * 25 - 1) +#define PERIOD_400 (PERIOD_100 * 4 + 1) + +bool FileTimeToDosTime(const FILETIME &ft, UInt32 &dosTime) { + #if defined(_WIN32) && !defined(UNDER_CE) + WORD datePart, timePart; - if (!::FileTimeToDosDateTime(&fileTime, &datePart, &timePart)) + if (!::FileTimeToDosDateTime(&ft, &datePart, &timePart)) { - dosTime = (fileTime.dwHighDateTime >= 0x01C00000) ? kHighDosTime : kLowDosTime; + dosTime = (ft.dwHighDateTime >= 0x01C00000) ? kHighDosTime : kLowDosTime; return false; } dosTime = (((UInt32)datePart) << 16) + timePart; + + #else + + unsigned year, mon, day, hour, min, sec; + UInt64 v64 = ft.dwLowDateTime | ((UInt64)ft.dwHighDateTime << 32); + Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + unsigned temp; + UInt32 v; + v64 += (kNumTimeQuantumsInSecond * 2 - 1); + v64 /= kNumTimeQuantumsInSecond; + sec = (unsigned)(v64 % 60); + v64 /= 60; + min = (unsigned)(v64 % 60); + v64 /= 60; + hour = (unsigned)(v64 % 24); + v64 /= 24; + + v = (UInt32)v64; + + year = (unsigned)(kFileTimeStartYear + v / PERIOD_400 * 400); + v %= PERIOD_400; + + temp = (unsigned)(v / PERIOD_100); + if (temp == 4) + temp = 3; + year += temp * 100; + v -= temp * PERIOD_100; + + temp = v / PERIOD_4; + if (temp == 25) + temp = 24; + year += temp * 4; + v -= temp * PERIOD_4; + + temp = v / 365; + if (temp == 4) + temp = 3; + year += temp; + v -= temp * 365; + + if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) + ms[1] = 29; + for (mon = 1; mon <= 12; mon++) + { + unsigned s = ms[mon - 1]; + if (v < s) + break; + v -= s; + } + day = (unsigned)v + 1; + + dosTime = kLowDosTime; + if (year < kDosTimeStartYear) + return false; + year -= kDosTimeStartYear; + dosTime = kHighDosTime; + if (year >= 128) + return false; + dosTime = (year << 25) | (mon << 21) | (day << 16) | (hour << 11) | (min << 5) | (sec >> 1); + #endif return true; } -static const UInt32 kNumTimeQuantumsInSecond = 10000000; -static const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * 60 * 60 * 24 * 134774; - -void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime) +void UnixTimeToFileTime(UInt32 unixTime, FILETIME &ft) { UInt64 v = kUnixTimeStartValue + ((UInt64)unixTime) * kNumTimeQuantumsInSecond; - fileTime.dwLowDateTime = (DWORD)v; - fileTime.dwHighDateTime = (DWORD)(v >> 32); + ft.dwLowDateTime = (DWORD)v; + ft.dwHighDateTime = (DWORD)(v >> 32); } -bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime) +bool FileTimeToUnixTime(const FILETIME &ft, UInt32 &unixTime) { - UInt64 winTime = (((UInt64)fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime; + UInt64 winTime = (((UInt64)ft.dwHighDateTime) << 32) + ft.dwLowDateTime; if (winTime < kUnixTimeStartValue) { unixTime = 0; @@ -60,10 +144,10 @@ bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day, unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds) { resSeconds = 0; - if (year < 1601 || year >= 10000 || month < 1 || month > 12 || + if (year < kFileTimeStartYear || year >= 10000 || month < 1 || month > 12 || day < 1 || day > 31 || hour > 23 || min > 59 || sec > 59) return false; - UInt32 numYears = year - 1601; + UInt32 numYears = year - kFileTimeStartYear; UInt32 numDays = numYears * 365 + numYears / 4 - numYears / 100 + numYears / 400; Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) diff --git a/CPP/Windows/Window.h b/CPP/Windows/Window.h index b7604b8a..729b0f24 100755 --- a/CPP/Windows/Window.h +++ b/CPP/Windows/Window.h @@ -3,7 +3,7 @@ #ifndef __WINDOWS_WINDOW_H #define __WINDOWS_WINDOW_H -#include "Windows/Defs.h" +#include "Defs.h" #include "Common/MyString.h" namespace NWindows { @@ -22,6 +22,13 @@ bool MySetWindowText(HWND wnd, LPCWSTR s); #endif +#ifdef UNDER_CE +#define GWLP_USERDATA GWL_USERDATA +#define GWLP_WNDPROC GWL_WNDPROC +#define BTNS_BUTTON TBSTYLE_BUTTON +#define WC_COMBOBOXW L"ComboBox" +#define DWLP_MSGRESULT DWL_MSGRESULT +#endif class CWindow { @@ -45,9 +52,13 @@ public: return window; } + bool Foreground() { return BOOLToBool(::SetForegroundWindow(_window)); } + HWND GetParent() const { return ::GetParent(_window); } - bool GetWindowRect(LPRECT rect) const { return BOOLToBool(::GetWindowRect(_window,rect )); } + bool GetWindowRect(LPRECT rect) const { return BOOLToBool(::GetWindowRect(_window,rect)); } + #ifndef UNDER_CE bool IsZoomed() const { return BOOLToBool(::IsZoomed(_window)); } + #endif bool ClientToScreen(LPPOINT point) const { return BOOLToBool(::ClientToScreen(_window, point)); } bool ScreenToClient(LPPOINT point) const { return BOOLToBool(::ScreenToClient(_window, point)); } @@ -101,45 +112,73 @@ public: bool IsWindow() { return BOOLToBool(::IsWindow(_window)); } bool Move(int x, int y, int width, int height, bool repaint = true) { return BOOLToBool(::MoveWindow(_window, x, y, width, height, BoolToBOOL(repaint))); } + + bool ChangeSubWindowSizeX(HWND hwnd, int xSize) + { + RECT rect; + ::GetWindowRect(hwnd, &rect); + POINT p1; + p1.x = rect.left; + p1.y = rect.top; + ScreenToClient(&p1); + return BOOLToBool(::MoveWindow(hwnd, p1.x, p1.y, xSize, rect.bottom - rect.top, TRUE)); + } + + void ScreenToClient(RECT *rect) + { + POINT p1, p2; + p1.x = rect->left; + p1.y = rect->top; + p2.x = rect->right; + p2.y = rect->bottom; + ScreenToClient(&p1); + ScreenToClient(&p2); + + rect->left = p1.x; + rect->top = p1.y; + rect->right = p2.x; + rect->bottom = p2.y; + } + bool GetClientRect(LPRECT rect) { return BOOLToBool(::GetClientRect(_window, rect)); } bool Show(int cmdShow) { return BOOLToBool(::ShowWindow(_window, cmdShow)); } + #ifndef UNDER_CE bool SetPlacement(CONST WINDOWPLACEMENT *placement) { return BOOLToBool(::SetWindowPlacement(_window, placement)); } bool GetPlacement(WINDOWPLACEMENT *placement) { return BOOLToBool(::GetWindowPlacement(_window, placement)); } + #endif bool Update() { return BOOLToBool(::UpdateWindow(_window)); } bool InvalidateRect(LPCRECT rect, bool backgroundErase = true) { return BOOLToBool(::InvalidateRect(_window, rect, BoolToBOOL(backgroundErase))); } void SetRedraw(bool redraw = true) { SendMessage(WM_SETREDRAW, BoolToBOOL(redraw), 0); } - #ifndef _WIN32_WCE - LONG_PTR SetStyle(LONG_PTR style) - { return SetLongPtr(GWL_STYLE, style); } - LONG_PTR GetStyle( ) const - { return GetLongPtr(GWL_STYLE); } - #else - LONG SetStyle(LONG_PTR style) - { return SetLong(GWL_STYLE, style); } - DWORD GetStyle( ) const - { return GetLong(GWL_STYLE); } - #endif + LONG_PTR SetStyle(LONG_PTR style) { return SetLongPtr(GWL_STYLE, style); } + LONG_PTR GetStyle() const { return GetLongPtr(GWL_STYLE); } + // bool MyIsMaximized() const { return ((GetStyle() & WS_MAXIMIZE) != 0); } + + LONG_PTR SetLong(int index, LONG newLongPtr) { return ::SetWindowLong(_window, index, newLongPtr); } + LONG_PTR GetLong(int index) const { return ::GetWindowLong(_window, index); } + LONG_PTR SetUserDataLong(LONG newLongPtr) { return SetLong(GWLP_USERDATA, newLongPtr); } + LONG_PTR GetUserDataLong() const { return GetLong(GWLP_USERDATA); } + + + #ifdef UNDER_CE + + LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr) { return SetLong(index, newLongPtr); } + LONG_PTR GetLongPtr(int index) const { return GetLong(index); } - LONG_PTR SetLong(int index, LONG newLongPtr ) - { return ::SetWindowLong(_window, index, newLongPtr); } - LONG_PTR GetLong(int index) const - { return ::GetWindowLong(_window, index ); } - LONG_PTR SetUserDataLong(LONG newLongPtr ) - { return SetLong(GWLP_USERDATA, newLongPtr); } - LONG_PTR GetUserDataLong() const - { return GetLong(GWLP_USERDATA); } - - #ifndef _WIN32_WCE - LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr ) + LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetUserDataLong(newLongPtr); } + LONG_PTR GetUserDataLongPtr() const { return GetUserDataLong(); } + + #else + + LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr) { return ::SetWindowLongPtr(_window, index, #ifndef _WIN64 (LONG) #endif newLongPtr); } #ifndef _UNICODE - LONG_PTR SetLongPtrW(int index, LONG_PTR newLongPtr ) + LONG_PTR SetLongPtrW(int index, LONG_PTR newLongPtr) { return ::SetWindowLongPtrW(_window, index, #ifndef _WIN64 (LONG) @@ -147,12 +186,10 @@ public: newLongPtr); } #endif - LONG_PTR GetLongPtr(int index) const - { return ::GetWindowLongPtr(_window, index ); } - LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr ) - { return SetLongPtr(GWLP_USERDATA, newLongPtr); } - LONG_PTR GetUserDataLongPtr() const - { return GetLongPtr(GWLP_USERDATA); } + LONG_PTR GetLongPtr(int index) const { return ::GetWindowLongPtr(_window, index); } + LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetLongPtr(GWLP_USERDATA, newLongPtr); } + LONG_PTR GetUserDataLongPtr() const { return GetLongPtr(GWLP_USERDATA); } + #endif /* @@ -202,7 +239,7 @@ public: bool IsEnabled() { return BOOLToBool(::IsWindowEnabled(_window)); } - #ifndef _WIN32_WCE + #ifndef UNDER_CE HMENU GetSystemMenu(bool revert) { return ::GetSystemMenu(_window, BoolToBOOL(revert)); } #endif @@ -211,8 +248,13 @@ public: { return ::SetTimer(_window, idEvent, elapse, timerFunc); } bool KillTimer(UINT_PTR idEvent) {return BOOLToBool(::KillTimer(_window, idEvent)); } + + HICON SetIcon(WPARAM sizeType, HICON icon) { return (HICON)SendMessage(WM_SETICON, sizeType, (LPARAM)icon); } }; +#define RECT_SIZE_X(r) ((r).right - (r).left) +#define RECT_SIZE_Y(r) ((r).bottom - (r).top) + } #endif diff --git a/DOC/7zip.inf b/DOC/7zip.inf new file mode 100755 index 00000000..c6a2d962 --- /dev/null +++ b/DOC/7zip.inf @@ -0,0 +1,53 @@ +[CODE] + +[Version] +Signature = "$Windows NT$" +Provider = "7-zip.org" +CESignature = "$Windows CE$" + +[CEStrings] +AppName = "7-Zip" +InstallDir = %CE1%\%AppName% + +[Strings] +AppVer = "9.06" +AppDate = "2009-08-17" + +[CEDevice] +; ProcessorType = 2577 ; ARM +VersionMin = 3.0 +BuildMin = 0.0 +VersionMax = 1000.0 +BuildMax = 0xE0000000 + +[DefaultInstall] +CopyFiles = CopyFilesSection,CopyFilesSection.Lang +AddReg = RegSettings +CEShortcuts = Shortcuts + +[SourceDisksNames] +1 = ,"Common files",,"." +2 = ,"Lang files",,"Lang" + +[SourceDisksFiles] +7zFM.exe = 1 +7z.sfx = 1 +ru.txt = 2 + +[DestinationDirs] +DefaultDestDir = ,%InstallDir% +CopyFilesSection = ,%InstallDir% +CopyFilesSection.Lang = ,"%InstallDir%\Lang" +Shortcuts = ,%CE11% + +[CopyFilesSection] +7zFM.exe +7z.sfx + +[CopyFilesSection.Lang] +ru.txt + +[RegSettings] + +[Shortcuts] +7-Zip,0,7zFM.exe diff --git a/DOC/7zip.nsi b/DOC/7zip.nsi index 0ae546e8..2e8b31ec 100755 --- a/DOC/7zip.nsi +++ b/DOC/7zip.nsi @@ -2,7 +2,7 @@ ;Defines !define VERSION_MAJOR 9 -!define VERSION_MINOR 04 +!define VERSION_MINOR 06 !define VERSION_POSTFIX_FULL " beta" !ifdef WIN64 !ifdef IA64 diff --git a/DOC/7zip.wxs b/DOC/7zip.wxs index 312da6ce..202f0adb 100755 --- a/DOC/7zip.wxs +++ b/DOC/7zip.wxs @@ -1,7 +1,7 @@ <?xml version="1.0"?> <?define VerMajor = "9" ?> -<?define VerMinor = "04" ?> +<?define VerMinor = "06" ?> <?define VerBuild = "00" ?> <?define MmVer = "$(var.VerMajor).$(var.VerMinor)" ?> <?define MmHex = "0$(var.VerMajor)$(var.VerMinor)" ?> diff --git a/DOC/Methods.txt b/DOC/Methods.txt index 5b5cb931..0415a126 100755 --- a/DOC/Methods.txt +++ b/DOC/Methods.txt @@ -1,4 +1,4 @@ -7-Zip method IDs (4.65) +7-Zip method IDs (9.04) ----------------------- Each compression or crypto method in 7z has unique binary value (ID). @@ -25,12 +25,21 @@ List of defined IDs 00 - Copy -02 - Common +03 - Delta +04 - x86 (BCJ) +05 - PPC (Big Endian) +06 - IA64 +07 - ARM (little endian) +08 - ARM Thumb (little endian) +09 - SPARC +21 - LZMA2 + +02.. - Common 03 Swap - 2 Swap2 - 4 Swap4 -03 - 7z +03.. - 7z 01 - LZMA 01 - Version @@ -60,7 +69,7 @@ List of defined IDs 01 - experimental methods. -04 - Misc +04.. - Misc 00 - Reserved 01 - Zip 00 - Copy (not used). Use {00} instead @@ -87,7 +96,7 @@ List of defined IDs 02 - BZip2NSIS -06 - Crypto +06.. - Crypto 00 - 01 - AES 0x - AES-128 @@ -114,7 +123,7 @@ List of defined IDs 07 - 7z 01 - AES-256 + SHA-256 -07 - Hash (subject to change) +07.. - Hash (subject to change) 00 - 01 - CRC 02 - SHA-1 diff --git a/DOC/history.txt b/DOC/history.txt index bf2b4ca4..36c53e06 100755 --- a/DOC/history.txt +++ b/DOC/history.txt @@ -1,6 +1,11 @@ Sources history of the 7-Zip ---------------------------- +9.05 2009-07-05 +------------------------- +- FileMapping.h::CFileMapping now returns WRes + + 9.04 2009-05-30 ------------------------- - ICoder.h: NCoderPropID::EEnum values were changed diff --git a/DOC/lzma.txt b/DOC/lzma.txt index 026b850d..c3963384 100755 --- a/DOC/lzma.txt +++ b/DOC/lzma.txt @@ -1,4 +1,4 @@ -LZMA SDK 9.04 +LZMA SDK 9.06 ------------- LZMA SDK provides the documentation, samples, header files, libraries, |