2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/rapps/misc.cpp
5 * PURPOSE: Misc functions
6 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
7 * Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
8 * Alexander Shaposhnikov (chaez.san@gmail.com)
13 /* SESSION Operation */
14 #define EXTRACT_FILLFILELIST 0x00000001
15 #define EXTRACT_EXTRACTFILES 0x00000002
17 static HANDLE hLog
= NULL
;
29 struct FILELIST
*next
;
37 struct FILELIST
*FileList
;
40 CHAR Destination
[MAX_PATH
];
41 CHAR CurrentFile
[MAX_PATH
];
42 CHAR Reserved
[MAX_PATH
];
43 struct FILELIST
*FilterList
;
46 typedef HRESULT(WINAPI
*fnExtract
)(SESSION
*dest
, LPCSTR szCabName
);
50 GetSystemColorDepth(VOID
)
55 pDevMode
.dmSize
= sizeof(pDevMode
);
56 pDevMode
.dmDriverExtra
= 0;
58 if (!EnumDisplaySettingsW(NULL
, ENUM_CURRENT_SETTINGS
, &pDevMode
))
60 /* TODO: Error message */
64 switch (pDevMode
.dmBitsPerPel
)
66 case 32: ColorDepth
= ILC_COLOR32
; break;
67 case 24: ColorDepth
= ILC_COLOR24
; break;
68 case 16: ColorDepth
= ILC_COLOR16
; break;
69 case 8: ColorDepth
= ILC_COLOR8
; break;
70 case 4: ColorDepth
= ILC_COLOR4
; break;
71 default: ColorDepth
= ILC_COLOR
; break;
78 GetWindowWidth(HWND hwnd
)
82 GetWindowRect(hwnd
, &Rect
);
83 return (Rect
.right
- Rect
.left
);
87 GetWindowHeight(HWND hwnd
)
91 GetWindowRect(hwnd
, &Rect
);
92 return (Rect
.bottom
- Rect
.top
);
96 GetClientWindowWidth(HWND hwnd
)
100 GetClientRect(hwnd
, &Rect
);
101 return (Rect
.right
- Rect
.left
);
105 GetClientWindowHeight(HWND hwnd
)
109 GetClientRect(hwnd
, &Rect
);
110 return (Rect
.bottom
- Rect
.top
);
114 CopyTextToClipboard(LPCWSTR lpszText
)
118 if (OpenClipboard(NULL
))
125 cchBuffer
= wcslen(lpszText
) + 1;
126 ClipBuffer
= GlobalAlloc(GMEM_DDESHARE
, cchBuffer
* sizeof(WCHAR
));
127 Buffer
= (PWCHAR
) GlobalLock(ClipBuffer
);
128 hr
= StringCchCopyW(Buffer
, cchBuffer
, lpszText
);
129 GlobalUnlock(ClipBuffer
);
132 SetClipboardData(CF_UNICODETEXT
, ClipBuffer
);
141 ATL::CStringW szText
;
143 szText
.LoadStringW(hInst
, IDS_WELCOME_TITLE
);
144 NewRichEditText(szText
, CFE_BOLD
);
146 szText
.LoadStringW(hInst
, IDS_WELCOME_TEXT
);
147 InsertRichEditText(szText
, 0);
149 szText
.LoadStringW(hInst
, IDS_WELCOME_URL
);
150 InsertRichEditText(szText
, CFM_LINK
);
154 ShowPopupMenu(HWND hwnd
, UINT MenuID
, UINT DefaultItem
)
163 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(MenuID
));
164 hPopupMenu
= GetSubMenu(hMenu
, 0);
167 hPopupMenu
= GetMenu(hwnd
);
169 ZeroMemory(&mii
, sizeof(mii
));
170 mii
.cbSize
= sizeof(mii
);
171 mii
.fMask
= MIIM_STATE
;
172 GetMenuItemInfoW(hPopupMenu
, DefaultItem
, FALSE
, &mii
);
174 if (!(mii
.fState
& MFS_GRAYED
))
175 SetMenuDefaultItem(hPopupMenu
, DefaultItem
, FALSE
);
179 SetForegroundWindow(hwnd
);
180 TrackPopupMenu(hPopupMenu
, 0, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
187 StartProcess(ATL::CStringW
&Path
, BOOL Wait
)
189 BOOL result
= StartProcess(const_cast<LPWSTR
>(Path
.GetString()), Wait
);
194 StartProcess(LPWSTR lpPath
, BOOL Wait
)
196 PROCESS_INFORMATION pi
;
201 ZeroMemory(&si
, sizeof(si
));
203 si
.dwFlags
= STARTF_USESHOWWINDOW
;
204 si
.wShowWindow
= SW_SHOW
;
206 if (!CreateProcessW(NULL
, lpPath
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
))
211 CloseHandle(pi
.hThread
);
212 if (Wait
) EnableWindow(hMainWnd
, FALSE
);
216 dwRet
= MsgWaitForMultipleObjects(1, &pi
.hProcess
, FALSE
, INFINITE
, QS_ALLEVENTS
);
217 if (dwRet
== WAIT_OBJECT_0
+ 1)
219 while (PeekMessageW(&msg
, NULL
, 0, 0, PM_REMOVE
))
221 TranslateMessage(&msg
);
222 DispatchMessage(&msg
);
227 if (dwRet
== WAIT_OBJECT_0
|| dwRet
== WAIT_FAILED
)
232 CloseHandle(pi
.hProcess
);
236 EnableWindow(hMainWnd
, TRUE
);
237 SetForegroundWindow(hMainWnd
);
245 GetStorageDirectory(ATL::CStringW
& Directory
)
247 if (!SHGetSpecialFolderPathW(NULL
, Directory
.GetBuffer(MAX_PATH
), CSIDL_LOCAL_APPDATA
, TRUE
))
249 Directory
.ReleaseBuffer();
253 Directory
.ReleaseBuffer();
254 Directory
+= L
"\\rapps";
256 return (CreateDirectoryW(Directory
.GetString(), NULL
) || GetLastError() == ERROR_ALREADY_EXISTS
);
260 ExtractFilesFromCab(const ATL::CStringW
&CabName
, const ATL::CStringW
&OutputPath
)
262 return ExtractFilesFromCab(CabName
.GetString(), OutputPath
.GetString());
266 ExtractFilesFromCab(LPCWSTR lpCabName
, LPCWSTR lpOutputPath
)
268 HINSTANCE hCabinetDll
;
269 CHAR szCabName
[MAX_PATH
];
273 hCabinetDll
= LoadLibraryW(L
"cabinet.dll");
276 pfnExtract
= (fnExtract
) GetProcAddress(hCabinetDll
, "Extract");
279 ZeroMemory(&Dest
, sizeof(Dest
));
281 WideCharToMultiByte(CP_ACP
, 0, lpOutputPath
, -1, Dest
.Destination
, MAX_PATH
, NULL
, NULL
);
282 WideCharToMultiByte(CP_ACP
, 0, lpCabName
, -1, szCabName
, MAX_PATH
, NULL
, NULL
);
283 Dest
.Operation
= EXTRACT_FILLFILELIST
;
285 Result
= pfnExtract(&Dest
, szCabName
);
288 Dest
.Operation
= EXTRACT_EXTRACTFILES
;
289 Result
= pfnExtract(&Dest
, szCabName
);
292 FreeLibrary(hCabinetDll
);
297 FreeLibrary(hCabinetDll
);
306 WCHAR szBuf
[MAX_PATH
] = L
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\ReactOS Application Manager";
307 WCHAR szPath
[MAX_PATH
];
308 DWORD dwCategoryNum
= 1;
309 DWORD dwDisp
, dwData
;
312 if (!SettingsInfo
.bLogEnabled
) return;
314 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
,
316 REG_OPTION_NON_VOLATILE
,
317 KEY_WRITE
, NULL
, &hKey
, &dwDisp
) != ERROR_SUCCESS
)
322 if (!GetModuleFileNameW(NULL
, szPath
, _countof(szPath
)))
325 if (RegSetValueExW(hKey
,
330 (DWORD
) (wcslen(szPath
) + 1) * sizeof(WCHAR
)) != ERROR_SUCCESS
)
336 dwData
= EVENTLOG_ERROR_TYPE
| EVENTLOG_WARNING_TYPE
|
337 EVENTLOG_INFORMATION_TYPE
;
339 if (RegSetValueExW(hKey
,
344 sizeof(DWORD
)) != ERROR_SUCCESS
)
350 if (RegSetValueExW(hKey
,
351 L
"CategoryMessageFile",
355 (DWORD
) (wcslen(szPath
) + 1) * sizeof(WCHAR
)) != ERROR_SUCCESS
)
361 if (RegSetValueExW(hKey
,
365 (LPBYTE
) &dwCategoryNum
,
366 sizeof(DWORD
)) != ERROR_SUCCESS
)
374 hLog
= RegisterEventSourceW(NULL
, L
"ReactOS Application Manager");
381 if (hLog
) DeregisterEventSource(hLog
);
386 WriteLogMessage(WORD wType
, DWORD dwEventID
, LPCWSTR lpMsg
)
388 if (!SettingsInfo
.bLogEnabled
) return TRUE
;
390 if (!ReportEventW(hLog
, wType
, 0, dwEventID
,
391 NULL
, 1, 0, &lpMsg
, NULL
))