reactos/base/applications/rapps/misc.c
Timo Kreuzer 6afbc8f483 Hopefully create a branch and not destroy the svn repository.
svn path=/branches/reactos-yarotows/; revision=45219
2010-01-23 23:25:04 +00:00

352 lines
7.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)
{
if(OpenClipboard(NULL))
{
HGLOBAL ClipBuffer;
WCHAR *Buffer;
EmptyClipboard();
ClipBuffer = GlobalAlloc(GMEM_DDESHARE, (wcslen(lpszText) + 1) * sizeof(TCHAR));
Buffer = (WCHAR*)GlobalLock(ClipBuffer);
wcscpy(Buffer, lpszText);
GlobalUnlock(ClipBuffer);
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)
{
HMENU hPopupMenu = GetSubMenu(LoadMenuW(hInst, MAKEINTRESOURCEW(MenuID)), 0);
POINT pt;
GetCursorPos(&pt);
SetForegroundWindow(hwnd);
TrackPopupMenu(hPopupMenu, 0, pt.x, pt.y, 0, hMainWnd, NULL);
DestroyMenu(hPopupMenu);
}
BOOL
StartProcess(LPWSTR lpPath, BOOL Wait)
{
PROCESS_INFORMATION pi;
STARTUPINFOW si;
DWORD dwRet;
MSG msg;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
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
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 (!GetCurrentDirectoryW(MAX_PATH, szPath)) return;
wcscat(szPath, L"\\rapps.exe");
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;
}