ReactOS 0.4.16-dev-1151-g3842b59
CAppDB Class Reference

#include <appdb.h>

Collaboration diagram for CAppDB:

Public Member Functions

 CAppDB (const CStringW &path)
 
VOID GetApps (CAtlList< CAppInfo * > &List, AppsCategories Type) const
 
CAvailableApplicationInfoFindAvailableByPackageName (const CStringW &name)
 
CAppInfoFindByPackageName (const CStringW &name)
 
VOID UpdateAvailable ()
 
VOID UpdateInstalled ()
 
VOID RemoveCached ()
 
size_t GetAvailableCount () const
 

Static Public Member Functions

static CStringW GetDefaultPath ()
 
static DWORD RemoveInstalledAppFromRegistry (const CAppInfo *Info)
 
static CInstalledApplicationInfoCreateInstalledAppByRegistryKey (LPCWSTR Name)
 
static CInstalledApplicationInfoCreateInstalledAppInstance (LPCWSTR KeyName, BOOL User, REGSAM WowSam)
 
static HKEY EnumInstalledRootKey (UINT Index, REGSAM &RegSam)
 

Private Member Functions

BOOL EnumerateFiles ()
 

Static Private Member Functions

static CInstalledApplicationInfoEnumerateRegistry (CAtlList< CAppInfo * > *List, LPCWSTR Name)
 
static CInstalledApplicationInfoCreateInstalledAppByRegistryKey (LPCWSTR KeyName, HKEY hKeyParent, UINT KeyIndex)
 

Private Attributes

CPathW m_BasePath
 
CAtlList< CAppInfo * > m_Available
 
CAtlList< CAppInfo * > m_Installed
 

Detailed Description

Definition at line 8 of file appdb.h.

Constructor & Destructor Documentation

◆ CAppDB()

CAppDB::CAppDB ( const CStringW path)

Definition at line 33 of file appdb.cpp.

34{
36}
void Canonicalize()
Definition: atlpath.h:149
CPathW m_BasePath
Definition: appdb.h:11

Member Function Documentation

◆ CreateInstalledAppByRegistryKey() [1/2]

CInstalledApplicationInfo * CAppDB::CreateInstalledAppByRegistryKey ( LPCWSTR  KeyName,
HKEY  hKeyParent,
UINT  KeyIndex 
)
staticprivate

Definition at line 178 of file appdb.cpp.

179{
180 CRegKey hSubKey;
181 if (hSubKey.Open(hKeyParent, KeyName, KEY_READ) != ERROR_SUCCESS)
182 return NULL;
184
185 size = sizeof(DWORD);
186 if (!RegQueryValueExW(hSubKey, L"SystemComponent", NULL, NULL, (LPBYTE)&value, &size) && value == 1)
187 {
188 // Ignore system components
189 return NULL;
190 }
191
192 size = 0;
193 BOOL bIsUpdate = !RegQueryValueExW(hSubKey, L"ParentKeyName", NULL, NULL, NULL, &size);
194
197 pInfo = new CInstalledApplicationInfo(hSubKey.Detach(), KeyName, cat, KeyIndex);
198 if (pInfo && pInfo->Valid())
199 {
200 return pInfo;
201 }
202 delete pInfo;
203 return NULL;
204}
AppsCategories
Definition: appinfo.h:25
@ ENUM_UPDATES
Definition: appinfo.h:47
@ ENUM_INSTALLED_APPLICATIONS
Definition: appinfo.h:46
LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired=KEY_READ|KEY_WRITE) noexcept
Definition: atlbase.h:1173
HKEY Detach() noexcept
Definition: atlbase.h:1166
virtual BOOL Valid() const override
Definition: appinfo.cpp:545
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
#define KEY_READ
Definition: nt_native.h:1023
#define DWORD
Definition: nt_native.h:44
#define L(x)
Definition: ntvdm.h:50
unsigned char * LPBYTE
Definition: typedefs.h:53
Definition: pdh_main.c:96
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2699

Referenced by CreateInstalledAppInstance(), EnumerateRegistry(), and HandleUninstallCommand().

◆ CreateInstalledAppByRegistryKey() [2/2]

CInstalledApplicationInfo * CAppDB::CreateInstalledAppByRegistryKey ( LPCWSTR  Name)
static

Definition at line 254 of file appdb.cpp.

255{
256 return EnumerateRegistry(NULL, Name);
257}
static CInstalledApplicationInfo * EnumerateRegistry(CAtlList< CAppInfo * > *List, LPCWSTR Name)
Definition: appdb.cpp:207
LPWSTR Name
Definition: desk.c:124

◆ CreateInstalledAppInstance()

CInstalledApplicationInfo * CAppDB::CreateInstalledAppInstance ( LPCWSTR  KeyName,
BOOL  User,
REGSAM  WowSam 
)
static

Definition at line 260 of file appdb.cpp.

261{
262 HKEY hRootKey = User ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
263 UINT KeyIndex = User ? (0) : ((WowSam & KEY_WOW64_64KEY) ? 2 : 1);
265 if (hKey.Open(hRootKey, UNINSTALL_SUBKEY, KEY_READ | WowSam) == ERROR_SUCCESS)
266 {
268 }
269 return NULL;
270}
#define UNINSTALL_SUBKEY
Definition: appdb.cpp:19
static CInstalledApplicationInfo * CreateInstalledAppByRegistryKey(LPCWSTR KeyName, HKEY hKeyParent, UINT KeyIndex)
Definition: appdb.cpp:178
FxAutoRegKey hKey
unsigned int UINT
Definition: ndis.h:50
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define KEY_WOW64_64KEY
Definition: cmtypes.h:46

Referenced by HandleUninstallCommand().

◆ EnumerateFiles()

BOOL CAppDB::EnumerateFiles ( )
private

Definition at line 81 of file appdb.cpp.

82{
84
85 CPathW AppsPath = m_BasePath;
86 AppsPath += RAPPS_DATABASE_SUBDIR;
87 CPathW WildcardPath = AppsPath;
88 WildcardPath += L"*.txt";
89
90 WIN32_FIND_DATAW FindFileData;
91 HANDLE hFind = FindFirstFileW(WildcardPath, &FindFileData);
92 if (hFind == INVALID_HANDLE_VALUE)
93 {
94 return FALSE;
95 }
96
97 do
98 {
99 CStringW szPkgName = FindFileData.cFileName;
101 szPkgName.ReleaseBuffer();
102
103 CAppInfo *Info = FindByPackageName(szPkgName);
104 ATLASSERT(Info == NULL);
105 if (!Info)
106 {
107 CConfigParser *Parser = new CConfigParser(CPathW(AppsPath) += FindFileData.cFileName);
108 int Cat;
109 if (!Parser->GetInt(DB_CATEGORY, Cat))
110 Cat = ENUM_INVALID;
111
112 Info = new CAvailableApplicationInfo(Parser, szPkgName, static_cast<AppsCategories>(Cat), AppsPath);
113 if (Info->Valid())
114 {
116 }
117 else
118 {
119 delete Info;
120 }
121 }
122
123 } while (FindNextFileW(hFind, &FindFileData));
124
125 FindClose(hFind);
126 return TRUE;
127}
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
static VOID ClearList(CAtlList< CAppInfo * > &list)
Definition: appdb.cpp:22
#define DB_CATEGORY
Definition: appinfo.h:90
@ ENUM_INVALID
Definition: appinfo.h:48
#define RAPPS_DATABASE_SUBDIR
Definition: defines.h:37
POSITION AddTail(INARGTYPE element)
Definition: atlcoll.h:629
void ReleaseBuffer(_In_ int nNewLength=-1)
Definition: atlsimpstr.h:387
CAppInfo * FindByPackageName(const CStringW &name)
Definition: appdb.h:34
CAtlList< CAppInfo * > m_Available
Definition: appdb.h:12
BOOL GetInt(const CStringW &KeyName, INT &iResult)
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
Definition: path.c:823
CPathT< CStringW > CPathW
Definition: atlpath.h:395
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690

Referenced by UpdateAvailable().

◆ EnumerateRegistry()

CInstalledApplicationInfo * CAppDB::EnumerateRegistry ( CAtlList< CAppInfo * > *  List,
LPCWSTR  Name 
)
staticprivate

Definition at line 207 of file appdb.cpp.

208{
209 ATLASSERT(List || SearchOnly);
210 REGSAM wowsam;
211 HKEY hRootKey;
212 for (UINT rki = 0; (hRootKey = EnumInstalledRootKey(rki, wowsam)); ++rki)
213 {
215 if (hKey.Open(hRootKey, UNINSTALL_SUBKEY, KEY_READ | wowsam) != ERROR_SUCCESS)
216 {
217 continue;
218 }
219 for (DWORD Index = 0;; ++Index)
220 {
221 WCHAR szKeyName[MAX_PATH];
222 DWORD dwSize = _countof(szKeyName);
223 if (hKey.EnumKey(Index, szKeyName, &dwSize) != ERROR_SUCCESS)
224 {
225 break;
226 }
227 if (List || !StrCmpIW(SearchOnly, szKeyName))
228 {
230 Info = CreateInstalledAppByRegistryKey(szKeyName, hKey, rki);
231 if (Info)
232 {
233 if (List)
234 List->AddTail(Info);
235 else
236 return Info;
237 }
238 }
239 }
240 }
241 return NULL;
242}
static HKEY EnumInstalledRootKey(UINT Index, REGSAM &RegSam)
Definition: appdb.cpp:166
int WINAPI StrCmpIW(LPCWSTR lpszStr, LPCWSTR lpszComp)
Definition: string.c:353
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define _countof(array)
Definition: sndvol32.h:70
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
ACCESS_MASK REGSAM
Definition: winreg.h:69
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by CreateInstalledAppByRegistryKey(), and UpdateInstalled().

◆ EnumInstalledRootKey()

HKEY CAppDB::EnumInstalledRootKey ( UINT  Index,
REGSAM RegSam 
)
static

Definition at line 166 of file appdb.cpp.

167{
168 // Loop for through all combinations.
169 // Note that HKEY_CURRENT_USER\Software does not have a redirect
170 // https://learn.microsoft.com/en-us/windows/win32/winprog64/shared-registry-keys#redirected-shared-and-reflected-keys-under-wow64
171 if (Index < (IsSystem64Bit() ? 3 : 2))
172 return GetRootKeyInfo(Index, RegSam);
173 else
174 return NULL;
175}
static HKEY GetRootKeyInfo(UINT Index, REGSAM &RegSam)
Definition: appdb.cpp:154
BOOL IsSystem64Bit()
Definition: misc.cpp:382

Referenced by EnumerateRegistry().

◆ FindAvailableByPackageName()

CAvailableApplicationInfo * CAppDB::FindAvailableByPackageName ( const CStringW name)

Definition at line 47 of file appdb.cpp.

48{
49 POSITION CurrentListPosition = m_Available.GetHeadPosition();
50 while (CurrentListPosition)
51 {
52 CAppInfo *Info = m_Available.GetNext(CurrentListPosition);
53 if (Info->szIdentifier == name)
54 {
55 return static_cast<CAvailableApplicationInfo *>(Info);
56 }
57 }
58 return NULL;
59}
POSITION GetHeadPosition() const
Definition: atlcoll.h:554
E & GetNext(_Inout_ POSITION &pos)
Definition: atlcoll.h:566
Definition: name.c:39

Referenced by ExtractArchiveForExecution(), FindByPackageName(), HandleGenerateInstallerCommand(), and HandleUninstallCommand().

◆ FindByPackageName()

CAppInfo * CAppDB::FindByPackageName ( const CStringW name)
inline

Definition at line 34 of file appdb.h.

CAvailableApplicationInfo * FindAvailableByPackageName(const CStringW &name)
Definition: appdb.cpp:47

Referenced by EnumerateFiles(), HandleInfoCommand(), HandleInstallCommand(), and HandleSetupCommand().

◆ GetApps()

void CAppDB::GetApps ( CAtlList< CAppInfo * > &  List,
AppsCategories  Type 
) const

Definition at line 62 of file appdb.cpp.

63{
64 const BOOL UseInstalled = IsInstalledEnum(Type);
65 const CAtlList<CAppInfo *> &list = UseInstalled ? m_Installed : m_Available;
66 const BOOL IncludeAll = UseInstalled ? (Type == ENUM_ALL_INSTALLED) : (Type == ENUM_ALL_AVAILABLE);
67
68 POSITION CurrentListPosition = list.GetHeadPosition();
69 while (CurrentListPosition)
70 {
71 CAppInfo *Info = list.GetNext(CurrentListPosition);
72
73 if (IncludeAll || Type == Info->iCategory)
74 {
75 List.AddTail(Info);
76 }
77 }
78}
Type
Definition: Type.h:7
BOOL IsInstalledEnum(INT x)
Definition: appinfo.h:68
@ ENUM_ALL_AVAILABLE
Definition: appinfo.h:26
@ ENUM_ALL_INSTALLED
Definition: appinfo.h:45
CAtlList< CAppInfo * > m_Installed
Definition: appdb.h:13
Definition: list.h:37

Referenced by HandleFindCommand(), SearchForAppWithDisplayName(), and CMainWindow::UpdateApplicationsList().

◆ GetAvailableCount()

size_t CAppDB::GetAvailableCount ( ) const
inline

Definition at line 53 of file appdb.h.

54 {
55 return m_Available.GetCount();
56 }
size_t GetCount() const
Definition: atlcoll.h:542

Referenced by CMainWindow::CheckAvailable().

◆ GetDefaultPath()

CStringW CAppDB::GetDefaultPath ( )
static

Definition at line 39 of file appdb.cpp.

40{
43 return path;
44}
BOOL GetStorageDirectory(CStringW &lpDirectory)
Definition: misc.cpp:237

Referenced by ExtractArchiveForExecution(), and ParseCmdAndExecute().

◆ RemoveCached()

VOID CAppDB::RemoveCached ( )

Definition at line 300 of file appdb.cpp.

301{
302 // Delete icons
303 CPathW AppsPath = m_BasePath;
304 AppsPath += RAPPS_DATABASE_SUBDIR;
305 CPathW IconPath = AppsPath;
306 IconPath += L"icons";
308
309 // Delete leftover screenshots
310 CPathW ScrnshotFolder = AppsPath;
311 ScrnshotFolder += L"screenshots";
312 DeleteWithWildcard(ScrnshotFolder, L"*.tmp");
313
314 // Delete data base files (*.txt)
315 DeleteWithWildcard(AppsPath, L"*.txt");
316
318 RemoveDirectoryW(ScrnshotFolder);
319 RemoveDirectoryW(AppsPath);
321}
static void DeleteWithWildcard(const CPathW &Dir, const CStringW &Filter)
Definition: appdb.cpp:273
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
Definition: dir.c:732
static const WCHAR IconPath[]
Definition: install.c:51

Referenced by CMainWindow::CheckAvailable(), CMainWindow::OnCommand(), and ParseCmdAndExecute().

◆ RemoveInstalledAppFromRegistry()

DWORD CAppDB::RemoveInstalledAppFromRegistry ( const CAppInfo Info)
static

Definition at line 324 of file appdb.cpp.

325{
326 // Validate that this is actually an installed app / update
327 ATLASSERT(Info->iCategory == ENUM_INSTALLED_APPLICATIONS || Info->iCategory == ENUM_UPDATES);
328 if (Info->iCategory != ENUM_INSTALLED_APPLICATIONS && Info->iCategory != ENUM_UPDATES)
330
331 const CInstalledApplicationInfo *InstalledInfo = static_cast<const CInstalledApplicationInfo *>(Info);
332
333 CStringW Name = InstalledInfo->szIdentifier;
334 REGSAM wowsam;
335 HKEY hRoot = GetRootKeyInfo(InstalledInfo->m_KeyInfo, wowsam);
337 if (!hRoot)
338 return ERROR_OPEN_FAILED;
339
340 CRegKey Uninstall;
341 LSTATUS err = Uninstall.Open(hRoot, UNINSTALL_SUBKEY, KEY_READ | KEY_WRITE | wowsam);
342 if (err == ERROR_SUCCESS)
343 {
344 err = Uninstall.RecurseDeleteKey(Name);
345 }
346 return err;
347}
LONG RecurseDeleteKey(LPCTSTR lpszKey) noexcept
Definition: atlbase.h:1414
const CStringW szIdentifier
Definition: appinfo.h:114
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
static HTREEITEM hRoot
Definition: treeview.c:383
#define KEY_WRITE
Definition: nt_native.h:1031
#define err(...)
#define ERROR_OPEN_FAILED
Definition: winerror.h:184

Referenced by CMainWindow::RemoveSelectedAppFromRegistry(), and UninstallThread().

◆ UpdateAvailable()

VOID CAppDB::UpdateAvailable ( )

Definition at line 130 of file appdb.cpp.

131{
133 return;
134
135 if (EnumerateFiles())
136 return;
137
140
141 CPathW AppsPath = m_BasePath;
142 AppsPath += RAPPS_DATABASE_SUBDIR;
144 return;
145
146 CPathW CabFile = m_BasePath;
147 CabFile += APPLICATION_DATABASE_NAME;
148 DeleteFileW(CabFile);
149
151}
#define APPLICATION_DATABASE_URL
Definition: defines.h:40
#define APPLICATION_DATABASE_NAME
Definition: defines.h:41
SETTINGS_INFO SettingsInfo
Definition: winmain.cpp:21
BOOL ExtractFilesFromCab(const CStringW &szCabName, const CStringW &szCabDir, const CStringW &szOutputDir, EXTRACTCALLBACK Callback, void *Cookie)
Definition: cabinet.cpp:250
BOOL EnumerateFiles()
Definition: appdb.cpp:81
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
VOID DownloadApplicationsDB(LPCWSTR lpUrl, BOOL IsOfficial)
Definition: loaddlg.cpp:1176
BOOL bUseSource
Definition: settings.h:24
WCHAR szSourceURL[INTERNET_MAX_URL_LENGTH]
Definition: settings.h:25
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by CMainWindow::CheckAvailable(), ExtractArchiveForExecution(), ParseCmdAndExecute(), and CMainWindow::UpdateApplicationsList().

◆ UpdateInstalled()

VOID CAppDB::UpdateInstalled ( )

Definition at line 245 of file appdb.cpp.

246{
247 // Remove all old entries
249
251}

Referenced by ParseCmdAndExecute(), and CMainWindow::UpdateApplicationsList().

Member Data Documentation

◆ m_Available

CAtlList<CAppInfo *> CAppDB::m_Available
private

Definition at line 12 of file appdb.h.

Referenced by EnumerateFiles(), FindAvailableByPackageName(), GetApps(), and GetAvailableCount().

◆ m_BasePath

CPathW CAppDB::m_BasePath
private

Definition at line 11 of file appdb.h.

Referenced by CAppDB(), EnumerateFiles(), RemoveCached(), and UpdateAvailable().

◆ m_Installed

CAtlList<CAppInfo *> CAppDB::m_Installed
private

Definition at line 13 of file appdb.h.

Referenced by GetApps(), and UpdateInstalled().


The documentation for this class was generated from the following files: