mirror of
https://github.com/reactos/reactos.git
synced 2024-09-10 21:04:26 +00:00
![Amine Khaldi](/assets/img/avatar_default.png)
* Create a branch for some evul shell experiments. svn path=/branches/shell-experiments/; revision=61927
395 lines
8.8 KiB
C
395 lines
8.8 KiB
C
/*
|
|
* PROJECT: ReactOS Applications Manager
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
* FILE: base/applications/rapps/misc.c
|
|
* PURPOSE: Misc functions
|
|
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
|
*/
|
|
|
|
#include "rapps.h"
|
|
|
|
/* SESSION Operation */
|
|
#define EXTRACT_FILLFILELIST 0x00000001
|
|
#define EXTRACT_EXTRACTFILES 0x00000002
|
|
|
|
static HANDLE hLog = NULL;
|
|
|
|
typedef struct
|
|
{
|
|
int erfOper;
|
|
int erfType;
|
|
BOOL fError;
|
|
} ERF, *PERF;
|
|
|
|
struct FILELIST
|
|
{
|
|
LPSTR FileName;
|
|
struct FILELIST *next;
|
|
BOOL DoExtract;
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
INT FileSize;
|
|
ERF Error;
|
|
struct FILELIST *FileList;
|
|
INT FileCount;
|
|
INT Operation;
|
|
CHAR Destination[MAX_PATH];
|
|
CHAR CurrentFile[MAX_PATH];
|
|
CHAR Reserved[MAX_PATH];
|
|
struct FILELIST *FilterList;
|
|
} SESSION;
|
|
|
|
HRESULT (WINAPI *pfnExtract)(SESSION *dest, LPCSTR szCabName);
|
|
|
|
|
|
INT
|
|
GetSystemColorDepth(VOID)
|
|
{
|
|
DEVMODE pDevMode;
|
|
INT ColorDepth;
|
|
|
|
pDevMode.dmSize = sizeof(DEVMODE);
|
|
pDevMode.dmDriverExtra = 0;
|
|
|
|
if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &pDevMode))
|
|
{
|
|
/* TODO: Error message */
|
|
return ILC_COLOR;
|
|
}
|
|
|
|
switch (pDevMode.dmBitsPerPel)
|
|
{
|
|
case 32: ColorDepth = ILC_COLOR32; break;
|
|
case 24: ColorDepth = ILC_COLOR24; break;
|
|
case 16: ColorDepth = ILC_COLOR16; break;
|
|
case 8: ColorDepth = ILC_COLOR8; break;
|
|
case 4: ColorDepth = ILC_COLOR4; break;
|
|
default: ColorDepth = ILC_COLOR; break;
|
|
}
|
|
|
|
return ColorDepth;
|
|
}
|
|
|
|
int
|
|
GetWindowWidth(HWND hwnd)
|
|
{
|
|
RECT Rect;
|
|
|
|
GetWindowRect(hwnd, &Rect);
|
|
return (Rect.right - Rect.left);
|
|
}
|
|
|
|
int
|
|
GetWindowHeight(HWND hwnd)
|
|
{
|
|
RECT Rect;
|
|
|
|
GetWindowRect(hwnd, &Rect);
|
|
return (Rect.bottom - Rect.top);
|
|
}
|
|
|
|
int
|
|
GetClientWindowWidth(HWND hwnd)
|
|
{
|
|
RECT Rect;
|
|
|
|
GetClientRect(hwnd, &Rect);
|
|
return (Rect.right - Rect.left);
|
|
}
|
|
|
|
int
|
|
GetClientWindowHeight(HWND hwnd)
|
|
{
|
|
RECT Rect;
|
|
|
|
GetClientRect(hwnd, &Rect);
|
|
return (Rect.bottom - Rect.top);
|
|
}
|
|
|
|
VOID
|
|
CopyTextToClipboard(LPCWSTR lpszText)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (OpenClipboard(NULL))
|
|
{
|
|
HGLOBAL ClipBuffer;
|
|
WCHAR *Buffer;
|
|
DWORD cchBuffer;
|
|
|
|
EmptyClipboard();
|
|
cchBuffer = wcslen(lpszText) + 1;
|
|
ClipBuffer = GlobalAlloc(GMEM_DDESHARE, cchBuffer * sizeof(WCHAR));
|
|
Buffer = GlobalLock(ClipBuffer);
|
|
hr = StringCchCopyW(Buffer, cchBuffer, lpszText);
|
|
GlobalUnlock(ClipBuffer);
|
|
|
|
if (SUCCEEDED(hr))
|
|
SetClipboardData(CF_UNICODETEXT, ClipBuffer);
|
|
|
|
CloseClipboard();
|
|
}
|
|
}
|
|
|
|
VOID
|
|
SetWelcomeText(VOID)
|
|
{
|
|
WCHAR szText[MAX_STR_LEN*3];
|
|
|
|
LoadStringW(hInst, IDS_WELCOME_TITLE, szText, sizeof(szText) / sizeof(WCHAR));
|
|
NewRichEditText(szText, CFE_BOLD);
|
|
|
|
LoadStringW(hInst, IDS_WELCOME_TEXT, szText, sizeof(szText) / sizeof(WCHAR));
|
|
InsertRichEditText(szText, 0);
|
|
|
|
LoadStringW(hInst, IDS_WELCOME_URL, szText, sizeof(szText) / sizeof(WCHAR));
|
|
InsertRichEditText(szText, CFM_LINK);
|
|
}
|
|
|
|
VOID
|
|
ShowPopupMenu(HWND hwnd, UINT MenuID, UINT DefaultItem)
|
|
{
|
|
HMENU hMenu = NULL;
|
|
HMENU hPopupMenu;
|
|
MENUITEMINFO mii;
|
|
POINT pt;
|
|
|
|
if (MenuID)
|
|
{
|
|
hMenu = LoadMenuW(hInst, MAKEINTRESOURCEW(MenuID));
|
|
hPopupMenu = GetSubMenu(hMenu, 0);
|
|
}
|
|
else
|
|
hPopupMenu = GetMenu(hwnd);
|
|
|
|
ZeroMemory(&mii, sizeof(mii));
|
|
mii.cbSize = sizeof(mii);
|
|
mii.fMask = MIIM_STATE;
|
|
GetMenuItemInfo(hPopupMenu, DefaultItem, FALSE, &mii);
|
|
if (!(mii.fState & MFS_GRAYED))
|
|
SetMenuDefaultItem(hPopupMenu, DefaultItem, FALSE);
|
|
|
|
GetCursorPos(&pt);
|
|
|
|
SetForegroundWindow(hwnd);
|
|
TrackPopupMenu(hPopupMenu, 0, pt.x, pt.y, 0, hMainWnd, NULL);
|
|
|
|
if (hMenu)
|
|
DestroyMenu(hMenu);
|
|
}
|
|
|
|
BOOL
|
|
StartProcess(LPWSTR lpPath, BOOL Wait)
|
|
{
|
|
PROCESS_INFORMATION pi;
|
|
STARTUPINFOW si;
|
|
DWORD dwRet;
|
|
MSG msg;
|
|
|
|
ZeroMemory(&si, sizeof(si));
|
|
si.cb = sizeof(si);
|
|
si.dwFlags = STARTF_USESHOWWINDOW;
|
|
si.wShowWindow = SW_SHOW;
|
|
|
|
if (!CreateProcessW(NULL, lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
CloseHandle(pi.hThread);
|
|
if (Wait) EnableWindow(hMainWnd, FALSE);
|
|
|
|
while (Wait)
|
|
{
|
|
dwRet = MsgWaitForMultipleObjects(1, &pi.hProcess, FALSE, INFINITE, QS_ALLEVENTS);
|
|
if (dwRet == WAIT_OBJECT_0 + 1)
|
|
{
|
|
while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (dwRet == WAIT_OBJECT_0 || dwRet == WAIT_FAILED)
|
|
break;
|
|
}
|
|
}
|
|
|
|
CloseHandle(pi.hProcess);
|
|
|
|
if (Wait)
|
|
{
|
|
EnableWindow(hMainWnd, TRUE);
|
|
SetForegroundWindow(hMainWnd);
|
|
SetFocus(hMainWnd);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
GetStorageDirectory(PWCHAR lpDirectory, DWORD cch)
|
|
{
|
|
if (cch < MAX_PATH)
|
|
return FALSE;
|
|
|
|
if (!SHGetSpecialFolderPathW(NULL, lpDirectory, CSIDL_LOCAL_APPDATA, TRUE))
|
|
return FALSE;
|
|
|
|
if (FAILED(StringCchCatW(lpDirectory, cch, L"\\rapps")))
|
|
return FALSE;
|
|
|
|
if (!CreateDirectoryW(lpDirectory, NULL) &&
|
|
GetLastError() != ERROR_ALREADY_EXISTS)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath)
|
|
{
|
|
HINSTANCE hCabinetDll;
|
|
CHAR szCabName[MAX_PATH];
|
|
SESSION Dest;
|
|
HRESULT Result;
|
|
|
|
hCabinetDll = LoadLibraryW(L"cabinet.dll");
|
|
if (hCabinetDll)
|
|
{
|
|
pfnExtract = (void *) GetProcAddress(hCabinetDll, "Extract");
|
|
if (pfnExtract)
|
|
{
|
|
ZeroMemory(&Dest, sizeof(SESSION));
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, lpOutputPath, -1, Dest.Destination, MAX_PATH, NULL, NULL);
|
|
WideCharToMultiByte(CP_ACP, 0, lpCabName, -1, szCabName, MAX_PATH, NULL, NULL);
|
|
Dest.Operation = EXTRACT_FILLFILELIST;
|
|
|
|
Result = pfnExtract(&Dest, szCabName);
|
|
if (Result == S_OK)
|
|
{
|
|
Dest.Operation = EXTRACT_EXTRACTFILES;
|
|
Result = pfnExtract(&Dest, szCabName);
|
|
if (Result == S_OK)
|
|
{
|
|
FreeLibrary(hCabinetDll);
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
FreeLibrary(hCabinetDll);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
VOID
|
|
InitLogs(VOID)
|
|
{
|
|
WCHAR szBuf[MAX_PATH] = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\ReactOS Application Manager\\ReactOS Application Manager";
|
|
WCHAR szPath[MAX_PATH];
|
|
DWORD dwCategoryNum = 1;
|
|
DWORD dwDisp, dwData;
|
|
HKEY hKey;
|
|
|
|
if (!SettingsInfo.bLogEnabled) return;
|
|
|
|
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE,
|
|
szBuf, 0, NULL,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_WRITE, NULL, &hKey, &dwDisp) != ERROR_SUCCESS)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!GetModuleFileName(NULL, szPath, sizeof(szPath) / sizeof(szPath[0])))
|
|
return;
|
|
|
|
if (RegSetValueExW(hKey,
|
|
L"EventMessageFile",
|
|
0,
|
|
REG_EXPAND_SZ,
|
|
(LPBYTE)szPath,
|
|
(DWORD)(wcslen(szPath) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKey);
|
|
return;
|
|
}
|
|
|
|
dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE |
|
|
EVENTLOG_INFORMATION_TYPE;
|
|
|
|
if (RegSetValueExW(hKey,
|
|
L"TypesSupported",
|
|
0,
|
|
REG_DWORD,
|
|
(LPBYTE)&dwData,
|
|
sizeof(DWORD)) != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKey);
|
|
return;
|
|
}
|
|
|
|
if (RegSetValueExW(hKey,
|
|
L"CategoryMessageFile",
|
|
0,
|
|
REG_EXPAND_SZ,
|
|
(LPBYTE)szPath,
|
|
(DWORD)(wcslen(szPath) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKey);
|
|
return;
|
|
}
|
|
|
|
if (RegSetValueExW(hKey,
|
|
L"CategoryCount",
|
|
0,
|
|
REG_DWORD,
|
|
(LPBYTE)&dwCategoryNum,
|
|
sizeof(DWORD)) != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKey);
|
|
return;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
hLog = RegisterEventSourceW(NULL, L"ReactOS Application Manager");
|
|
}
|
|
|
|
|
|
VOID
|
|
FreeLogs(VOID)
|
|
{
|
|
if (hLog) DeregisterEventSource(hLog);
|
|
}
|
|
|
|
|
|
BOOL
|
|
WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg)
|
|
{
|
|
if (!SettingsInfo.bLogEnabled) return TRUE;
|
|
|
|
if (!ReportEventW(hLog,
|
|
wType,
|
|
0,
|
|
dwEventID,
|
|
NULL,
|
|
1,
|
|
0,
|
|
(LPCWSTR*)&lpMsg,
|
|
NULL))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|