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)
15 /* SESSION Operation */
16 #define EXTRACT_FILLFILELIST 0x00000001
17 #define EXTRACT_EXTRACTFILES 0x00000002
19 static HANDLE hLog
= NULL
;
42 CHAR Destination
[MAX_PATH
];
43 CHAR CurrentFile
[MAX_PATH
];
44 CHAR Reserved
[MAX_PATH
];
48 typedef HRESULT(WINAPI
*fnExtract
)(SESSION
*dest
, LPCSTR szCabName
);
51 INT
GetWindowWidth(HWND hwnd
)
55 GetWindowRect(hwnd
, &Rect
);
56 return (Rect
.right
- Rect
.left
);
59 INT
GetWindowHeight(HWND hwnd
)
63 GetWindowRect(hwnd
, &Rect
);
64 return (Rect
.bottom
- Rect
.top
);
67 INT
GetClientWindowWidth(HWND hwnd
)
71 GetClientRect(hwnd
, &Rect
);
72 return (Rect
.right
- Rect
.left
);
75 INT
GetClientWindowHeight(HWND hwnd
)
79 GetClientRect(hwnd
, &Rect
);
80 return (Rect
.bottom
- Rect
.top
);
83 VOID
CopyTextToClipboard(LPCWSTR lpszText
)
85 if (!OpenClipboard(NULL
))
96 cchBuffer
= wcslen(lpszText
) + 1;
97 ClipBuffer
= GlobalAlloc(GMEM_DDESHARE
, cchBuffer
* sizeof(WCHAR
));
99 Buffer
= (PWCHAR
) GlobalLock(ClipBuffer
);
100 hr
= StringCchCopyW(Buffer
, cchBuffer
, lpszText
);
101 GlobalUnlock(ClipBuffer
);
104 SetClipboardData(CF_UNICODETEXT
, ClipBuffer
);
109 VOID
SetWelcomeText()
111 ATL::CStringW szText
;
113 szText
.LoadStringW(hInst
, IDS_WELCOME_TITLE
);
114 NewRichEditText(szText
, CFE_BOLD
);
116 szText
.LoadStringW(hInst
, IDS_WELCOME_TEXT
);
117 InsertRichEditText(szText
, 0);
119 szText
.LoadStringW(hInst
, IDS_WELCOME_URL
);
120 InsertRichEditText(szText
, CFM_LINK
);
123 VOID
ShowPopupMenu(HWND hwnd
, UINT MenuID
, UINT DefaultItem
)
127 MENUITEMINFO ItemInfo
;
132 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(MenuID
));
133 hPopupMenu
= GetSubMenu(hMenu
, 0);
137 hPopupMenu
= GetMenu(hwnd
);
140 ZeroMemory(&ItemInfo
, sizeof(ItemInfo
));
141 ItemInfo
.cbSize
= sizeof(ItemInfo
);
142 ItemInfo
.fMask
= MIIM_STATE
;
144 GetMenuItemInfoW(hPopupMenu
, DefaultItem
, FALSE
, &ItemInfo
);
146 if (!(ItemInfo
.fState
& MFS_GRAYED
))
148 SetMenuDefaultItem(hPopupMenu
, DefaultItem
, FALSE
);
153 SetForegroundWindow(hwnd
);
154 TrackPopupMenu(hPopupMenu
, 0, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
162 BOOL
StartProcess(ATL::CStringW
&Path
, BOOL Wait
)
164 return StartProcess(const_cast<LPWSTR
>(Path
.GetString()), Wait
);;
167 BOOL
StartProcess(LPWSTR lpPath
, BOOL Wait
)
169 PROCESS_INFORMATION pi
;
174 ZeroMemory(&si
, sizeof(si
));
176 si
.dwFlags
= STARTF_USESHOWWINDOW
;
177 si
.wShowWindow
= SW_SHOW
;
179 if (!CreateProcessW(NULL
, lpPath
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
))
184 CloseHandle(pi
.hThread
);
188 EnableWindow(hMainWnd
, FALSE
);
193 dwRet
= MsgWaitForMultipleObjects(1, &pi
.hProcess
, FALSE
, INFINITE
, QS_ALLEVENTS
);
194 if (dwRet
== WAIT_OBJECT_0
+ 1)
196 while (PeekMessageW(&msg
, NULL
, 0, 0, PM_REMOVE
))
198 TranslateMessage(&msg
);
199 DispatchMessageW(&msg
);
204 if (dwRet
== WAIT_OBJECT_0
|| dwRet
== WAIT_FAILED
)
209 CloseHandle(pi
.hProcess
);
213 EnableWindow(hMainWnd
, TRUE
);
214 SetForegroundWindow(hMainWnd
);
221 BOOL
GetStorageDirectory(ATL::CStringW
& Directory
)
223 if (!SHGetSpecialFolderPathW(NULL
, Directory
.GetBuffer(MAX_PATH
), CSIDL_LOCAL_APPDATA
, TRUE
))
225 Directory
.ReleaseBuffer();
229 Directory
.ReleaseBuffer();
230 Directory
+= L
"\\rapps";
232 return (CreateDirectoryW(Directory
.GetString(), NULL
) || GetLastError() == ERROR_ALREADY_EXISTS
);
235 BOOL
ExtractFilesFromCab(const ATL::CStringW
&CabName
, const ATL::CStringW
&OutputPath
)
237 return ExtractFilesFromCab(CabName
.GetString(), OutputPath
.GetString());
240 BOOL
ExtractFilesFromCab(LPCWSTR lpCabName
, LPCWSTR lpOutputPath
)
242 HINSTANCE hCabinetDll
;
243 CHAR szCabName
[MAX_PATH
];
247 hCabinetDll
= LoadLibraryW(L
"cabinet.dll");
250 pfnExtract
= (fnExtract
) GetProcAddress(hCabinetDll
, "Extract");
253 ZeroMemory(&Dest
, sizeof(Dest
));
255 WideCharToMultiByte(CP_ACP
, 0, lpOutputPath
, -1, Dest
.Destination
, MAX_PATH
, NULL
, NULL
);
256 WideCharToMultiByte(CP_ACP
, 0, lpCabName
, -1, szCabName
, MAX_PATH
, NULL
, NULL
);
257 Dest
.Operation
= EXTRACT_FILLFILELIST
;
259 Result
= pfnExtract(&Dest
, szCabName
);
262 Dest
.Operation
= EXTRACT_EXTRACTFILES
;
263 Result
= pfnExtract(&Dest
, szCabName
);
266 FreeLibrary(hCabinetDll
);
271 FreeLibrary(hCabinetDll
);
279 if (!SettingsInfo
.bLogEnabled
)
284 WCHAR szPath
[MAX_PATH
];
285 DWORD dwCategoryNum
= 1;
286 DWORD dwDisp
, dwData
;
289 if (key
.Create(HKEY_LOCAL_MACHINE
,
290 L
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\ReactOS Application Manager",
291 REG_NONE
, REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, &dwDisp
) != ERROR_SUCCESS
)
296 if (!GetModuleFileNameW(NULL
, szPath
, _countof(szPath
)))
301 dwData
= EVENTLOG_ERROR_TYPE
| EVENTLOG_WARNING_TYPE
|
302 EVENTLOG_INFORMATION_TYPE
;
304 if ((key
.SetStringValue(L
"EventMessageFile",
306 REG_EXPAND_SZ
) == ERROR_SUCCESS
)
307 && (key
.SetStringValue(L
"CategoryMessageFile",
309 REG_EXPAND_SZ
) == ERROR_SUCCESS
)
310 && (key
.SetDWORDValue(L
"TypesSupported",
311 dwData
) == ERROR_SUCCESS
)
312 && (key
.SetDWORDValue(L
"CategoryCount",
313 dwCategoryNum
) == ERROR_SUCCESS
))
316 hLog
= RegisterEventSourceW(NULL
, L
"ReactOS Application Manager");
327 DeregisterEventSource(hLog
);
332 BOOL
WriteLogMessage(WORD wType
, DWORD dwEventID
, LPCWSTR lpMsg
)
334 if (!SettingsInfo
.bLogEnabled
)
339 if (!ReportEventW(hLog
, wType
, 0, dwEventID
,
340 NULL
, 1, 0, &lpMsg
, NULL
))
348 BOOL
GetInstalledVersion_WowUser(ATL::CStringW
* szVersionResult
,
349 const ATL::CStringW
& RegName
,
353 BOOL bHasSucceded
= FALSE
;
355 ATL::CStringW szVersion
;
356 ATL::CStringW szPath
= L
"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + RegName
;
358 if (key
.Open(IsUserKey
? HKEY_CURRENT_USER
: HKEY_LOCAL_MACHINE
,
360 keyWow
| KEY_READ
) != ERROR_SUCCESS
)
365 if (szVersionResult
!= NULL
)
367 ULONG dwSize
= MAX_PATH
* sizeof(WCHAR
);
369 if (key
.QueryStringValue(L
"DisplayVersion",
370 szVersion
.GetBuffer(MAX_PATH
),
371 &dwSize
) == ERROR_SUCCESS
)
373 szVersion
.ReleaseBuffer();
374 *szVersionResult
= szVersion
;
379 szVersion
.ReleaseBuffer();
385 szVersion
.ReleaseBuffer();
392 BOOL
GetInstalledVersion(ATL::CStringW
*pszVersion
, const ATL::CStringW
&szRegName
)
394 return (!szRegName
.IsEmpty()
395 && (GetInstalledVersion_WowUser(pszVersion
, szRegName
, TRUE
, KEY_WOW64_32KEY
)
396 || GetInstalledVersion_WowUser(pszVersion
, szRegName
, FALSE
, KEY_WOW64_32KEY
)
397 || GetInstalledVersion_WowUser(pszVersion
, szRegName
, TRUE
, KEY_WOW64_64KEY
)
398 || GetInstalledVersion_WowUser(pszVersion
, szRegName
, FALSE
, KEY_WOW64_64KEY
)));