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/FileManager/FM.cpp')
-rw-r--r--[-rwxr-xr-x]CPP/7zip/UI/FileManager/FM.cpp334
1 files changed, 223 insertions, 111 deletions
diff --git a/CPP/7zip/UI/FileManager/FM.cpp b/CPP/7zip/UI/FileManager/FM.cpp
index 147a1fb7..537103ae 100755..100644
--- a/CPP/7zip/UI/FileManager/FM.cpp
+++ b/CPP/7zip/UI/FileManager/FM.cpp
@@ -4,12 +4,17 @@
#include "../../../../C/Alloc.h"
-#include "Windows/Error.h"
-#include "Windows/MemoryLock.h"
-#include "Windows/NtCheck.h"
+#include "../../../Common/IntToString.h"
+#include "../../../Common/StringConvert.h"
+#include "../../../Common/StringToInt.h"
+
+#include "../../../Windows/ErrorMsg.h"
+#include "../../../Windows/MemoryLock.h"
+#include "../../../Windows/NtCheck.h"
+#include "../../../Windows/System.h"
#ifndef UNDER_CE
-#include "Windows/Security.h"
+#include "../../../Windows/SecurityUtils.h"
#endif
#include "../GUI/ExtractRes.h"
@@ -33,6 +38,8 @@ using namespace NFind;
#define MENU_HEIGHT 26
+UInt64 g_RAM_Size;
+
#ifdef _WIN32
HINSTANCE g_hInstance;
#endif
@@ -43,7 +50,30 @@ static UString g_ArcFormat;
static bool g_Maximized = false;
#ifndef UNDER_CE
+
DWORD g_ComCtl32Version;
+
+static DWORD GetDllVersion(LPCTSTR dllName)
+{
+ DWORD dwVersion = 0;
+ HINSTANCE hinstDll = LoadLibrary(dllName);
+ if (hinstDll)
+ {
+ DLLGETVERSIONPROC pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstDll, "DllGetVersion");
+ if (pDllGetVersion)
+ {
+ DLLVERSIONINFO dvi;
+ ZeroMemory(&dvi, sizeof(dvi));
+ dvi.cbSize = sizeof(dvi);
+ HRESULT hr = (*pDllGetVersion)(&dvi);
+ if (SUCCEEDED(hr))
+ dwVersion = MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion);
+ }
+ FreeLibrary(hinstDll);
+ }
+ return dwVersion;
+}
+
#endif
bool g_IsSmallScreen = false;
@@ -140,18 +170,13 @@ const wchar_t *kWindowClass = L"FM";
#endif
// FUNCTION: InitInstance(HANDLE, int)
-BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
+static BOOL InitInstance(int nCmdShow)
{
CWindow wnd;
- g_hInstance = hInstance;
-
- ReloadLangSmart();
-
// LoadString(hInstance, IDS_CLASS, windowClass, MAX_LOADSTRING);
- // LoadString(hInstance, IDS_APP_TITLE, title, MAX_LOADSTRING);
- UString title = LangString(IDS_APP_TITLE, 0x03000000);
+ UString title = L"7-Zip"; // LangString(IDS_APP_TITLE, 0x03000000);
/*
//If it is already running, then focus on the window
@@ -170,8 +195,8 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
+ wc.hInstance = g_hInstance;
+ wc.hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON));
// wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hCursor = ::LoadCursor(0, IDC_SIZEWE);
@@ -196,39 +221,40 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
DWORD style = WS_OVERLAPPEDWINDOW;
// DWORD style = 0;
- RECT rect;
- bool maximized = false;
- int x , y, xSize, ySize;
+ CWindowInfo info;
+ info.maximized = false;
+ int x, y, xSize, ySize;
x = y = xSize = ySize = CW_USEDEFAULT;
- bool windowPosIsRead = ReadWindowSize(rect, maximized);
+ bool windowPosIsRead;
+ info.Read(windowPosIsRead, g_PanelsInfoDefined);
if (windowPosIsRead)
{
// x = rect.left;
// y = rect.top;
- xSize = rect.right - rect.left;
- ySize = rect.bottom - rect.top;
+ xSize = RECT_SIZE_X(info.rect);
+ ySize = RECT_SIZE_Y(info.rect);
}
- UInt32 numPanels, currentPanel;
- g_PanelsInfoDefined = ReadPanelsInfo(numPanels, currentPanel, g_SplitterPos);
+
if (g_PanelsInfoDefined)
{
- if (numPanels < 1 || numPanels > 2)
- numPanels = kNumDefaultPanels;
- if (currentPanel >= 2)
- currentPanel = 0;
+ g_SplitterPos = info.splitterPos;
+ if (info.numPanels < 1 || info.numPanels > 2)
+ info.numPanels = kNumDefaultPanels;
+ if (info.currentPanel >= 2)
+ info.currentPanel = 0;
}
else
{
- numPanels = kNumDefaultPanels;
- currentPanel = 0;
+ info.numPanels = kNumDefaultPanels;
+ info.currentPanel = 0;
}
- g_App.NumPanels = numPanels;
- g_App.LastFocusedPanel = currentPanel;
+ g_App.NumPanels = info.numPanels;
+ g_App.LastFocusedPanel = info.currentPanel;
if (!wnd.Create(kWindowClass, title, style,
- x, y, xSize, ySize, NULL, NULL, hInstance, NULL))
+ x, y, xSize, ySize, NULL, NULL, g_hInstance, NULL))
return FALSE;
if (nCmdShow == SW_SHOWNORMAL ||
@@ -238,7 +264,7 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
#endif
)
{
- if (maximized)
+ if (info.maximized)
nCmdShow = SW_SHOWMAXIMIZED;
else
nCmdShow = SW_SHOWNORMAL;
@@ -253,7 +279,7 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
if (wnd.GetPlacement(&placement))
{
if (windowPosIsRead)
- placement.rcNormalPosition = rect;
+ placement.rcNormalPosition = info.rect;
placement.showCmd = nCmdShow;
wnd.SetPlacement(&placement);
}
@@ -286,47 +312,10 @@ static void GetCommands(const UString &aCommandLine, UString &aCommands)
else
aProgramName += aChar;
}
- aCommands = aCommandLine.Mid(i);
+ aCommands = aCommandLine.Ptr(i);
}
*/
-#ifndef UNDER_CE
-static DWORD GetDllVersion(LPCTSTR lpszDllName)
-{
- HINSTANCE hinstDll;
- DWORD dwVersion = 0;
- hinstDll = LoadLibrary(lpszDllName);
- if (hinstDll)
- {
- DLLGETVERSIONPROC pDllGetVersion;
- 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)
- {
- DLLVERSIONINFO dvi;
- HRESULT hr;
-
- ZeroMemory(&dvi, sizeof(dvi));
- dvi.cbSize = sizeof(dvi);
-
- hr = (*pDllGetVersion)(&dvi);
-
- if (SUCCEEDED(hr))
- {
- dwVersion = MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion);
- }
- }
- FreeLibrary(hinstDll);
- }
- return dwVersion;
-}
-#endif
-
/*
#ifndef _WIN64
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
@@ -368,6 +357,7 @@ bool IsLargePageSupported()
}
#ifndef UNDER_CE
+
static void SetMemoryLock()
{
if (!IsLargePageSupported())
@@ -376,8 +366,27 @@ static void SetMemoryLock()
NSecurity::AddLockMemoryPrivilege();
if (ReadLockMemoryEnable())
- NSecurity::EnableLockMemoryPrivilege();
+ NSecurity::EnablePrivilege_LockMemory();
+}
+
+bool g_SymLink_Supported = false;
+
+static void Set_SymLink_Supported()
+{
+ g_SymLink_Supported = false;
+ OSVERSIONINFO versionInfo;
+ versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
+ if (!::GetVersionEx(&versionInfo))
+ return;
+ if (versionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || versionInfo.dwMajorVersion < 6)
+ return;
+ g_SymLink_Supported = true;
+ // if (g_SymLink_Supported)
+ {
+ NSecurity::EnablePrivilege_SymLink();
+ }
}
+
#endif
/*
@@ -399,16 +408,18 @@ static const CSwitchForm kSwitchForms[kNumSwitches] =
// int APIENTRY WinMain2(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */);
-#define NT_CHECK_FAIL_ACTION MessageBoxW(0, L"Unsupported Windows version", L"7-zip", MB_ICONERROR); return 1;
+static void ErrorMessage(const wchar_t *s)
+{
+ MessageBoxW(0, s, L"7-Zip", MB_ICONERROR);
+}
-int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
- #ifdef UNDER_CE
- LPWSTR
- #else
- LPSTR
- #endif
- /* lpCmdLine */, int nCmdShow)
+
+#define NT_CHECK_FAIL_ACTION ErrorMessage(L"Unsupported Windows version"); return 1;
+
+static int WINAPI WinMain2(int nCmdShow)
{
+ g_RAM_Size = NSystem::GetRamSize();
+
#ifdef _WIN32
/*
@@ -440,6 +451,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
#endif
+ LoadLangOneTime();
+
InitCommonControls();
#ifndef UNDER_CE
@@ -471,8 +484,48 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
SplitStringToTwoStrings(commandsString, paramString, tailString);
paramString.Trim();
tailString.Trim();
- if (tailString.Left(2) == L"-t")
- g_ArcFormat = tailString.Mid(2);
+ if (tailString.IsPrefixedBy(L"-t"))
+ g_ArcFormat = tailString.Ptr(2);
+
+ /*
+ UStringVector switches;
+ for (;;)
+ {
+ if (tailString.IsEmpty())
+ break;
+ UString s1, s2;
+ SplitStringToTwoStrings(tailString, s1, s2);
+ if (s2.IsEmpty())
+ {
+ tailString.Trim();
+ switches.Add(tailString);
+ break;
+ }
+ s1.Trim();
+ switches.Add(s1);
+ tailString = s2;
+ }
+
+ FOR_VECTOR(i, switches)
+ {
+ const UString &sw = switches[i];
+ if (sw.IsPrefixedBy(L"-t"))
+ g_ArcFormat = sw.Ptr(2);
+ //
+ else if (sw.IsPrefixedBy(L"-stp"))
+ {
+ const wchar_t *end;
+ UInt32 val = ConvertStringToUInt32(sw.Ptr(4), &end);
+ if (*end != 0)
+ throw 111;
+ g_TypeParseLevel = val;
+ }
+ else
+ //
+ throw 112;
+ }
+ */
+
if (!paramString.IsEmpty())
{
g_MainPath = paramString;
@@ -504,18 +557,21 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
*/
- #ifndef UNDER_CE
+ #if defined(_WIN32) && !defined(UNDER_CE)
SetMemoryLock();
+ Set_SymLink_Supported();
#endif
+ g_App.ReloadLang();
+
MSG msg;
- if (!InitInstance (hInstance, nCmdShow))
+ if (!InitInstance (nCmdShow))
return FALSE;
#ifndef _UNICODE
if (g_IsNT)
{
- HACCEL hAccels = LoadAcceleratorsW(hInstance, MAKEINTRESOURCEW(IDR_ACCELERATOR1));
+ HACCEL hAccels = LoadAcceleratorsW(g_hInstance, MAKEINTRESOURCEW(IDR_ACCELERATOR1));
while (GetMessageW(&msg, NULL, 0, 0))
{
if (TranslateAcceleratorW(g_HWND, hAccels, &msg) == 0)
@@ -528,7 +584,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
else
#endif
{
- HACCEL hAccels = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
+ HACCEL hAccels = LoadAccelerators(g_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
while (GetMessage(&msg, NULL, 0, 0))
{
if (TranslateAccelerator(g_HWND, hAccels, &msg) == 0)
@@ -548,21 +604,85 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
return (int)msg.wParam;
}
+int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
+ #ifdef UNDER_CE
+ LPWSTR
+ #else
+ LPSTR
+ #endif
+ /* lpCmdLine */, int nCmdShow)
+{
+ g_hInstance = hInstance;
+
+ try
+ {
+ return WinMain2(nCmdShow);
+ }
+ catch(const CNewException &)
+ {
+ ErrorMessage(LangString(IDS_MEM_ERROR));
+ return 1;
+ }
+ catch(const UString &s)
+ {
+ ErrorMessage(s);
+ return 1;
+ }
+ catch(const AString &s)
+ {
+ ErrorMessage(GetUnicodeString(s));
+ return 1;
+ }
+ catch(const wchar_t *s)
+ {
+ ErrorMessage(s);
+ return 1;
+ }
+ catch(const char *s)
+ {
+ ErrorMessage(GetUnicodeString(s));
+ return 1;
+ }
+ catch(int v)
+ {
+ wchar_t s[32];
+ ConvertUInt32ToString(v, s);
+ ErrorMessage(UString(L"Error: ") + s);
+ return 1;
+ }
+ catch(...)
+ {
+ ErrorMessage(L"Unknown error");
+ return 1;
+ }
+}
+
static void SaveWindowInfo(HWND aWnd)
{
+ CWindowInfo info;
+
#ifdef UNDER_CE
- RECT rect;
- if (!::GetWindowRect(aWnd, &rect))
+
+ if (!::GetWindowRect(aWnd, &info.rect))
return;
- SaveWindowSize(rect, g_Maximized);
+ info.maximized = g_Maximized;
+
#else
+
WINDOWPLACEMENT placement;
placement.length = sizeof(placement);
if (!::GetWindowPlacement(aWnd, &placement))
return;
- SaveWindowSize(placement.rcNormalPosition, BOOLToBool(::IsZoomed(aWnd)));
+ info.rect = placement.rcNormalPosition;
+ info.maximized = BOOLToBool(::IsZoomed(aWnd));
+
#endif
- SavePanelsInfo(g_App.NumPanels, g_App.LastFocusedPanel, g_Splitter.GetPos());
+
+ info.numPanels = g_App.NumPanels;
+ info.currentPanel = g_App.LastFocusedPanel;
+ info.splitterPos = g_Splitter.GetPos();
+
+ info.Save();
}
static void ExecuteCommand(UINT commandID)
@@ -572,9 +692,9 @@ static void ExecuteCommand(UINT commandID)
switch (commandID)
{
- case kAddCommand: g_App.AddToArchive(); break;
- case kExtractCommand: g_App.ExtractArchives(); break;
- case kTestCommand: g_App.TestArchives(); break;
+ case kMenuCmdID_Toolbar_Add: g_App.AddToArchive(); break;
+ case kMenuCmdID_Toolbar_Extract: g_App.ExtractArchives(); break;
+ case kMenuCmdID_Toolbar_Test: g_App.TestArchives(); break;
}
}
@@ -588,7 +708,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
wmEvent = HIWORD(wParam);
if ((HWND) lParam != NULL && wmEvent != 0)
break;
- if (wmId >= kToolbarStartID)
+ if (wmId >= kMenuCmdID_Toolbar_Start && wmId < kMenuCmdID_Toolbar_End)
{
ExecuteCommand(wmId);
return 0;
@@ -636,7 +756,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
WS_CHILD | WS_BORDER | WS_VISIBLE | TBSTYLE_TOOLTIPS, // | TBSTYLE_FLAT
baseID + 2, 11,
(HINSTANCE)HINST_COMMCTRL, IDB_VIEW_SMALL_COLOR,
- (LPCTBBUTTON)&tbb, sizeof(tbb) / sizeof(tbb[0]),
+ (LPCTBBUTTON)&tbb, ARRAY_SIZE(tbb),
0, 0, 100, 30, sizeof (TBBUTTON)));
*/
// HCURSOR cursor = ::LoadCursor(0, IDC_SIZEWE);
@@ -679,22 +799,14 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
UString message = L"Error";
if (res == S_FALSE || res == S_OK)
{
- if (encrypted)
- message = MyFormatNew(IDS_CANT_OPEN_ENCRYPTED_ARCHIVE, 0x0200060A, g_MainPath);
- else
- message = MyFormatNew(IDS_CANT_OPEN_ARCHIVE, 0x02000609, g_MainPath);
- }
- else
- {
- if (res != S_OK)
- {
- if (res == E_OUTOFMEMORY)
- message = LangString(IDS_MEM_ERROR, 0x0200060B);
- else
- message = NError::MyFormatMessageW(res);
- }
+ message = MyFormatNew(encrypted ?
+ IDS_CANT_OPEN_ENCRYPTED_ARCHIVE :
+ IDS_CANT_OPEN_ARCHIVE,
+ g_MainPath);
}
- MessageBoxW(0, message, L"7-zip", MB_ICONERROR);
+ else if (res != S_OK)
+ message = HResultToMessage(res);
+ ErrorMessage(message);
return -1;
}
// g_SplitterPos = 0;
@@ -824,7 +936,7 @@ static int Window_GetRealHeight(NWindows::CWindow &w)
{
RECT rect;
w.GetWindowRect(&rect);
- int res = rect.bottom - rect.top;
+ int res = RECT_SIZE_Y(rect);
#ifndef UNDER_CE
WINDOWPLACEMENT placement;
if (w.GetPlacement(&placement))