Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/UI/Client7z/Client7z.cpp')
-rwxr-xr-xCPP/7zip/UI/Client7z/Client7z.cpp108
1 files changed, 63 insertions, 45 deletions
diff --git a/CPP/7zip/UI/Client7z/Client7z.cpp b/CPP/7zip/UI/Client7z/Client7z.cpp
index 410b800d..d181843d 100755
--- a/CPP/7zip/UI/Client7z/Client7z.cpp
+++ b/CPP/7zip/UI/Client7z/Client7z.cpp
@@ -21,6 +21,10 @@
#include "../../IPassword.h"
#include "../../MyVersion.h"
+#ifdef _WIN32
+HINSTANCE g_hInstance = 0;
+#endif
+
// use another CLSIDs, if you want to support other formats (zip, rar, ...).
// {23170F69-40C1-278A-1000-000110070000}
DEFINE_GUID(CLSID_CFormat7z,
@@ -30,9 +34,9 @@ using namespace NWindows;
#define kDllName "7z.dll"
-static const char *kCopyrightString = MY_7ZIP_VERSION
+static const char *kCopyrightString = "\n" MY_7ZIP_VERSION
" (" kDllName " client) "
-MY_COPYRIGHT " " MY_DATE;
+MY_COPYRIGHT " " MY_DATE "\n";
static const char *kHelpString =
"Usage: Client7z.exe [a | l | x ] archive.7z [fileName ...]\n"
@@ -48,28 +52,46 @@ typedef UINT32 (WINAPI * CreateObjectFunc)(
void **outObject);
-void PrintString(const UString &s)
+static AString FStringToConsoleString(const FString &s)
+{
+ return GetOemString(fs2us(s));
+}
+
+static FString CmdStringToFString(const char *s)
+{
+ return us2fs(GetUnicodeString(s));
+}
+
+static void PrintString(const UString &s)
{
printf("%s", (LPCSTR)GetOemString(s));
}
-void PrintString(const AString &s)
+static void PrintString(const AString &s)
{
printf("%s", (LPCSTR)s);
}
-void PrintNewLine()
+static void PrintNewLine()
{
PrintString("\n");
}
-void PrintStringLn(const AString &s)
+static void PrintStringLn(const AString &s)
{
PrintString(s);
PrintNewLine();
}
-void PrintError(const AString &s)
+static void PrintError(const char *message, const FString &name)
+{
+ printf("Error: %s", (LPCSTR)message);
+ PrintNewLine();
+ PrintString(FStringToConsoleString(name));
+ PrintNewLine();
+}
+
+static void PrintError(const AString &s)
{
PrintNewLine();
PrintString(s);
@@ -148,8 +170,6 @@ STDMETHODIMP CArchiveOpenCallback::CryptoGetTextPassword(BSTR *password)
//////////////////////////////////////////////////////////////
// Archive Extracting callback class
-static const wchar_t *kCantDeleteOutputFile = L"ERROR: Can not delete output file ";
-
static const char *kTestingString = "Testing ";
static const char *kExtractingString = "Extracting ";
static const char *kSkippingString = "Skipping ";
@@ -181,9 +201,9 @@ public:
private:
CMyComPtr<IInArchive> _archiveHandler;
- UString _directoryPath; // Output directory
+ FString _directoryPath; // Output directory
UString _filePath; // name inside arcvhive
- UString _diskFilePath; // full path to file on disk
+ FString _diskFilePath; // full path to file on disk
bool _extractMode;
struct CProcessedFileInfo
{
@@ -198,7 +218,7 @@ private:
CMyComPtr<ISequentialOutStream> _outFileStream;
public:
- void Init(IInArchive *archiveHandler, const UString &directoryPath);
+ void Init(IInArchive *archiveHandler, const FString &directoryPath);
UInt64 NumErrors;
bool PasswordIsDefined;
@@ -207,7 +227,7 @@ public:
CArchiveExtractCallback() : PasswordIsDefined(false) {}
};
-void CArchiveExtractCallback::Init(IInArchive *archiveHandler, const UString &directoryPath)
+void CArchiveExtractCallback::Init(IInArchive *archiveHandler, const FString &directoryPath)
{
NumErrors = 0;
_archiveHandler = archiveHandler;
@@ -305,10 +325,10 @@ STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index,
// Create folders for file
int slashPos = _filePath.ReverseFind(WCHAR_PATH_SEPARATOR);
if (slashPos >= 0)
- NFile::NDirectory::CreateComplexDirectory(_directoryPath + _filePath.Left(slashPos));
+ NFile::NDirectory::CreateComplexDirectory(_directoryPath + us2fs(_filePath.Left(slashPos)));
}
- UString fullProcessedPath = _directoryPath + _filePath;
+ FString fullProcessedPath = _directoryPath + us2fs(_filePath);
_diskFilePath = fullProcessedPath;
if (_processedFileInfo.isDir)
@@ -317,12 +337,12 @@ STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index,
}
else
{
- NFile::NFind::CFileInfoW fi;
+ NFile::NFind::CFileInfo fi;
if (fi.Find(fullProcessedPath))
{
if (!NFile::NDirectory::DeleteFileAlways(fullProcessedPath))
{
- PrintString(UString(kCantDeleteOutputFile) + fullProcessedPath);
+ PrintError("Can not delete output file", fullProcessedPath);
return E_ABORT;
}
}
@@ -331,7 +351,7 @@ STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index,
CMyComPtr<ISequentialOutStream> outStreamLoc(_outFileStreamSpec);
if (!_outFileStreamSpec->Open(fullProcessedPath, CREATE_ALWAYS))
{
- PrintString((UString)L"can not open output file " + fullProcessedPath);
+ PrintError("Can not open output file", fullProcessedPath);
return E_ABORT;
}
_outFileStream = outStreamLoc;
@@ -423,7 +443,7 @@ struct CDirItem
FILETIME ATime;
FILETIME MTime;
UString Name;
- UString FullPath;
+ FString FullPath;
UInt32 Attrib;
bool isDir() const { return (Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 ; }
@@ -458,7 +478,7 @@ public:
UString VolName;
UString VolExt;
- UString DirPrefix;
+ FString DirPrefix;
const CObjectVector<CDirItem> *DirItems;
bool PasswordIsDefined;
@@ -467,7 +487,7 @@ public:
bool m_NeedBeClosed;
- UStringVector FailedFiles;
+ FStringVector FailedFiles;
CRecordVector<HRESULT> FailedCodes;
CArchiveUpdateCallback(): PasswordIsDefined(false), AskPassword(false), DirItems(0) {};
@@ -514,7 +534,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 /* index */,
STDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
{
- NWindows::NCOM::CPropVariant prop;
+ NCOM::CPropVariant prop;
if (propID == kpidIsAnti)
{
@@ -571,7 +591,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream
{
CInFileStream *inStreamSpec = new CInFileStream;
CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);
- UString path = DirPrefix + dirItem.FullPath;
+ FString path = DirPrefix + dirItem.FullPath;
if (!inStreamSpec->Open(path))
{
DWORD sysError = ::GetLastError();
@@ -620,7 +640,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOu
fileName += VolExt;
COutFileStream *streamSpec = new COutFileStream;
CMyComPtr<ISequentialOutStream> streamLoc(streamSpec);
- if (!streamSpec->Create(fileName, false))
+ if (!streamSpec->Create(us2fs(fileName), false))
return ::GetLastError();
*volumeStream = streamLoc.Detach();
return S_OK;
@@ -643,8 +663,6 @@ STDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDef
return StringToBstr(Password, password);
}
-
-
//////////////////////////////////////////////////////////////////////////
// Main function
@@ -661,8 +679,8 @@ int MY_CDECL main(int numArgs, const char *args[])
PrintStringLn(kHelpString);
return 1;
}
- NWindows::NDLL::CLibrary lib;
- if (!lib.Load(TEXT(kDllName)))
+ NDLL::CLibrary lib;
+ if (!lib.Load(NDLL::GetModuleDirPrefix() + FTEXT(kDllName)))
{
PrintError("Can not load 7-zip library");
return 1;
@@ -682,10 +700,10 @@ int MY_CDECL main(int numArgs, const char *args[])
PrintError("incorrect command");
return 1;
}
- c = MyCharLower(command[0]);
+ c = (char)MyCharUpper(command[0]);
}
- UString archiveName = GetUnicodeString(args[2]);
- if (c == 'a')
+ FString archiveName = CmdStringToFString(args[2]);
+ if (c == 'A')
{
// create archive command
if (numArgs < 4)
@@ -698,12 +716,12 @@ int MY_CDECL main(int numArgs, const char *args[])
for (i = 3; i < numArgs; i++)
{
CDirItem di;
- UString name = GetUnicodeString(args[i]);
+ FString name = CmdStringToFString(args[i]);
- NFile::NFind::CFileInfoW fi;
+ NFile::NFind::CFileInfo fi;
if (!fi.Find(name))
{
- PrintString(UString(L"Can't find file") + name);
+ PrintError("Can't find file", name);
return 1;
}
@@ -712,7 +730,7 @@ int MY_CDECL main(int numArgs, const char *args[])
di.CTime = fi.CTime;
di.ATime = fi.ATime;
di.MTime = fi.MTime;
- di.Name = name;
+ di.Name = fs2us(name);
di.FullPath = name;
dirItems.Add(di);
}
@@ -745,7 +763,7 @@ int MY_CDECL main(int numArgs, const char *args[])
L"x"
};
const int kNumProps = sizeof(names) / sizeof(names[0]);
- NWindows::NCOM::CPropVariant values[kNumProps] =
+ NCOM::CPropVariant values[kNumProps] =
{
false, // solid mode OFF
(UInt32)9 // compression level = 9 - ultra
@@ -771,7 +789,7 @@ int MY_CDECL main(int numArgs, const char *args[])
for (i = 0; i < updateCallbackSpec->FailedFiles.Size(); i++)
{
PrintNewLine();
- PrintString((UString)L"Error for file: " + updateCallbackSpec->FailedFiles[i]);
+ PrintError("Error for file", updateCallbackSpec->FailedFiles[i]);
}
if (updateCallbackSpec->FailedFiles.Size() != 0)
return 1;
@@ -785,9 +803,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
{
@@ -807,7 +825,7 @@ int MY_CDECL main(int numArgs, const char *args[])
if (!fileSpec->Open(archiveName))
{
- PrintError("Can not open archive file");
+ PrintError("Can not open archive file", archiveName);
return 1;
}
@@ -820,7 +838,7 @@ int MY_CDECL main(int numArgs, const char *args[])
if (archive->Open(file, 0, openCallback) != S_OK)
{
- PrintError("Can not open archive");
+ PrintError("Can not open file as archive", archiveName);
return 1;
}
}
@@ -834,7 +852,7 @@ int MY_CDECL main(int numArgs, const char *args[])
{
{
// Get uncompressed size of file
- NWindows::NCOM::CPropVariant prop;
+ NCOM::CPropVariant prop;
archive->GetProperty(i, kpidSize, &prop);
UString s = ConvertPropVariantToString(prop);
PrintString(s);
@@ -842,12 +860,12 @@ int MY_CDECL main(int numArgs, const char *args[])
}
{
// Get name of file
- NWindows::NCOM::CPropVariant prop;
+ NCOM::CPropVariant prop;
archive->GetProperty(i, kpidPath, &prop);
UString s = ConvertPropVariantToString(prop);
PrintString(s);
}
- PrintString("\n");
+ PrintNewLine();
}
}
else
@@ -855,7 +873,7 @@ int MY_CDECL main(int numArgs, const char *args[])
// Extract command
CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;
CMyComPtr<IArchiveExtractCallback> extractCallback(extractCallbackSpec);
- extractCallbackSpec->Init(archive, L""); // second parameter is output folder path
+ extractCallbackSpec->Init(archive, FTEXT("")); // second parameter is output folder path
extractCallbackSpec->PasswordIsDefined = false;
// extractCallbackSpec->PasswordIsDefined = true;
// extractCallbackSpec->Password = L"1";