diff options
Diffstat (limited to 'CPP/7zip/UI/Client7z/Client7z.cpp')
-rw-r--r--[-rwxr-xr-x] | CPP/7zip/UI/Client7z/Client7z.cpp | 174 |
1 files changed, 104 insertions, 70 deletions
diff --git a/CPP/7zip/UI/Client7z/Client7z.cpp b/CPP/7zip/UI/Client7z/Client7z.cpp index d181843d..0c7ae1c9 100755..100644 --- a/CPP/7zip/UI/Client7z/Client7z.cpp +++ b/CPP/7zip/UI/Client7z/Client7z.cpp @@ -2,39 +2,46 @@ #include "StdAfx.h" -#include "Common/IntToString.h" -#include "Common/MyInitGuid.h" -#include "Common/StringConvert.h" - -#include "Windows/DLL.h" -#include "Windows/FileDir.h" -#include "Windows/FileFind.h" -#include "Windows/FileName.h" -#include "Windows/NtCheck.h" -#include "Windows/PropVariant.h" -#include "Windows/PropVariantConversions.h" +#include <stdio.h> + +#include "../../../Common/Defs.h" +#include "../../../Common/MyInitGuid.h" + +#include "../../../Common/IntToString.h" +#include "../../../Common/StringConvert.h" + +#include "../../../Windows/DLL.h" +#include "../../../Windows/FileDir.h" +#include "../../../Windows/FileFind.h" +#include "../../../Windows/FileName.h" +#include "../../../Windows/NtCheck.h" +#include "../../../Windows/PropVariant.h" +#include "../../../Windows/PropVariantConv.h" #include "../../Common/FileStreams.h" #include "../../Archive/IArchive.h" #include "../../IPassword.h" -#include "../../MyVersion.h" +#include "../../../../C/7zVersion.h" #ifdef _WIN32 HINSTANCE g_hInstance = 0; #endif +// Tou can find the list of all GUIDs in Guid.txt file. // use another CLSIDs, if you want to support other formats (zip, rar, ...). // {23170F69-40C1-278A-1000-000110070000} DEFINE_GUID(CLSID_CFormat7z, 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x07, 0x00, 0x00); using namespace NWindows; +using namespace NFile; +using namespace NDir; #define kDllName "7z.dll" -static const char *kCopyrightString = "\n" MY_7ZIP_VERSION +static const char *kCopyrightString = "\n7-Zip " MY_VERSION " (" kDllName " client) " MY_COPYRIGHT " " MY_DATE "\n"; @@ -46,12 +53,6 @@ static const char *kHelpString = " Client7z.exe x archive.7z : eXtract files from archive.7z\n"; -typedef UINT32 (WINAPI * CreateObjectFunc)( - const GUID *clsID, - const GUID *interfaceID, - void **outObject); - - static AString FStringToConsoleString(const FString &s) { return GetOemString(fs2us(s)); @@ -177,7 +178,11 @@ static const char *kSkippingString = "Skipping "; static const char *kUnsupportedMethod = "Unsupported Method"; static const char *kCRCFailed = "CRC Failed"; static const char *kDataError = "Data Error"; -static const char *kUnknownError = "Unknown Error"; +static const char *kUnavailableData = "Unavailable data"; +static const char *kUnexpectedEnd = "Unexpected end of data"; +static const char *kDataAfterEnd = "There are some data after the end of the payload data"; +static const char *kIsNotArc = "Is not archive"; +static const char *kHeadersError = "Headers Error"; class CArchiveExtractCallback: public IArchiveExtractCallback, @@ -232,7 +237,7 @@ void CArchiveExtractCallback::Init(IInArchive *archiveHandler, const FString &di NumErrors = 0; _archiveHandler = archiveHandler; _directoryPath = directoryPath; - NFile::NName::NormalizeDirPathPrefix(_directoryPath); + NName::NormalizeDirPathPrefix(_directoryPath); } STDMETHODIMP CArchiveExtractCallback::SetTotal(UInt64 /* size */) @@ -314,10 +319,8 @@ STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index, // Get Size NCOM::CPropVariant prop; RINOK(_archiveHandler->GetProperty(index, kpidSize, &prop)); - bool newFileSizeDefined = (prop.vt != VT_EMPTY); UInt64 newFileSize; - if (newFileSizeDefined) - newFileSize = ConvertPropVariantToUInt64(prop); + /* bool newFileSizeDefined = */ ConvertPropVariantToUInt64(prop, newFileSize); } @@ -325,7 +328,7 @@ STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index, // Create folders for file int slashPos = _filePath.ReverseFind(WCHAR_PATH_SEPARATOR); if (slashPos >= 0) - NFile::NDirectory::CreateComplexDirectory(_directoryPath + us2fs(_filePath.Left(slashPos))); + CreateComplexDir(_directoryPath + us2fs(_filePath.Left(slashPos))); } FString fullProcessedPath = _directoryPath + us2fs(_filePath); @@ -333,14 +336,14 @@ STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index, if (_processedFileInfo.isDir) { - NFile::NDirectory::CreateComplexDirectory(fullProcessedPath); + CreateComplexDir(fullProcessedPath); } else { - NFile::NFind::CFileInfo fi; + NFind::CFileInfo fi; if (fi.Find(fullProcessedPath)) { - if (!NFile::NDirectory::DeleteFileAlways(fullProcessedPath)) + if (!DeleteFileAlways(fullProcessedPath)) { PrintError("Can not delete output file", fullProcessedPath); return E_ABORT; @@ -379,27 +382,53 @@ STDMETHODIMP CArchiveExtractCallback::PrepareOperation(Int32 askExtractMode) STDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 operationResult) { - switch(operationResult) + switch (operationResult) { case NArchive::NExtract::NOperationResult::kOK: break; default: { NumErrors++; - PrintString(" "); - switch(operationResult) + PrintString(" : "); + const char *s = NULL; + switch (operationResult) { - case NArchive::NExtract::NOperationResult::kUnSupportedMethod: - PrintString(kUnsupportedMethod); + case NArchive::NExtract::NOperationResult::kUnsupportedMethod: + s = kUnsupportedMethod; break; case NArchive::NExtract::NOperationResult::kCRCError: - PrintString(kCRCFailed); + s = kCRCFailed; break; case NArchive::NExtract::NOperationResult::kDataError: - PrintString(kDataError); + s = kDataError; + break; + case NArchive::NExtract::NOperationResult::kUnavailable: + s = kUnavailableData; + break; + case NArchive::NExtract::NOperationResult::kUnexpectedEnd: + s = kUnexpectedEnd; + break; + case NArchive::NExtract::NOperationResult::kDataAfterEnd: + s = kDataAfterEnd; + break; + case NArchive::NExtract::NOperationResult::kIsNotArc: + s = kIsNotArc; + break; + case NArchive::NExtract::NOperationResult::kHeadersError: + s = kHeadersError; break; - default: - PrintString(kUnknownError); + } + if (s) + { + PrintString("Error : "); + PrintString(s); + } + else + { + char temp[16]; + ConvertUInt32ToString(operationResult, temp); + PrintString("Error #"); + PrintString(temp); } } } @@ -412,7 +441,7 @@ STDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 operationResult) } _outFileStream.Release(); if (_extractMode && _processedFileInfo.AttribDefined) - NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attrib); + SetFileAttrib(_diskFilePath, _processedFileInfo.Attrib); PrintNewLine(); return S_OK; } @@ -528,7 +557,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 /* index */, if (newProperties != NULL) *newProperties = BoolToInt(true); if (indexInArchive != NULL) - *indexInArchive = (UInt32)-1; + *indexInArchive = (UInt32)(Int32)-1; return S_OK; } @@ -632,7 +661,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOu wchar_t temp[16]; ConvertUInt32ToString(index + 1, temp); UString res = temp; - while (res.Length() < 2) + while (res.Len() < 2) res = UString(L'0') + res; UString fileName = VolName; fileName += L'.'; @@ -685,8 +714,8 @@ int MY_CDECL main(int numArgs, const char *args[]) PrintError("Can not load 7-zip library"); return 1; } - CreateObjectFunc createObjectFunc = (CreateObjectFunc)lib.GetProc("CreateObject"); - if (createObjectFunc == 0) + Func_CreateObject createObjectFunc = (Func_CreateObject)lib.GetProc("CreateObject"); + if (!createObjectFunc) { PrintError("Can not get CreateObject"); return 1; @@ -695,15 +724,15 @@ int MY_CDECL main(int numArgs, const char *args[]) char c; { AString command = args[1]; - if (command.Length() != 1) + if (command.Len() != 1) { PrintError("incorrect command"); return 1; } - c = (char)MyCharUpper(command[0]); + c = (char)MyCharLower_Ascii(command[0]); } FString archiveName = CmdStringToFString(args[2]); - if (c == 'A') + if (c == 'a') { // create archive command if (numArgs < 4) @@ -712,27 +741,29 @@ int MY_CDECL main(int numArgs, const char *args[]) return 1; } CObjectVector<CDirItem> dirItems; - int i; - for (i = 3; i < numArgs; i++) { - CDirItem di; - FString name = CmdStringToFString(args[i]); - - NFile::NFind::CFileInfo fi; - if (!fi.Find(name)) + int i; + for (i = 3; i < numArgs; i++) { - PrintError("Can't find file", name); - return 1; + CDirItem di; + FString name = CmdStringToFString(args[i]); + + NFind::CFileInfo fi; + if (!fi.Find(name)) + { + PrintError("Can't find file", name); + return 1; + } + + di.Attrib = fi.Attrib; + di.Size = fi.Size; + di.CTime = fi.CTime; + di.ATime = fi.ATime; + di.MTime = fi.MTime; + di.Name = fs2us(name); + di.FullPath = name; + dirItems.Add(di); } - - di.Attrib = fi.Attrib; - di.Size = fi.Size; - di.CTime = fi.CTime; - di.ATime = fi.ATime; - di.MTime = fi.MTime; - di.Name = fs2us(name); - di.FullPath = name; - dirItems.Add(di); } COutFileStream *outFileStreamSpec = new COutFileStream; CMyComPtr<IOutStream> outFileStream = outFileStreamSpec; @@ -762,7 +793,7 @@ int MY_CDECL main(int numArgs, const char *args[]) L"s", L"x" }; - const int kNumProps = sizeof(names) / sizeof(names[0]); + const unsigned kNumProps = ARRAY_SIZE(names); NCOM::CPropVariant values[kNumProps] = { false, // solid mode OFF @@ -786,7 +817,7 @@ int MY_CDECL main(int numArgs, const char *args[]) PrintError("Update Error"); return 1; } - for (i = 0; i < updateCallbackSpec->FailedFiles.Size(); i++) + FOR_VECTOR (i, updateCallbackSpec->FailedFiles) { PrintNewLine(); PrintError("Error for file", updateCallbackSpec->FailedFiles[i]); @@ -803,9 +834,9 @@ int MY_CDECL main(int numArgs, const char *args[]) } bool listCommand; - if (c == 'L') + if (c == 'l') listCommand = true; - else if (c == 'X') + else if (c == 'x') listCommand = false; else { @@ -854,7 +885,8 @@ int MY_CDECL main(int numArgs, const char *args[]) // Get uncompressed size of file NCOM::CPropVariant prop; archive->GetProperty(i, kpidSize, &prop); - UString s = ConvertPropVariantToString(prop); + char s[32]; + ConvertPropVariantToShortString(prop, s); PrintString(s); PrintString(" "); } @@ -862,8 +894,10 @@ int MY_CDECL main(int numArgs, const char *args[]) // Get name of file NCOM::CPropVariant prop; archive->GetProperty(i, kpidPath, &prop); - UString s = ConvertPropVariantToString(prop); - PrintString(s); + if (prop.vt == VT_BSTR) + PrintString(prop.bstrVal); + else if (prop.vt != VT_EMPTY) + PrintString("ERROR!"); } PrintNewLine(); } |