[RAPPS]
authorAlexander Shaposhnikov <sanchaez@reactos.org>
Mon, 26 Jun 2017 22:07:43 +0000 (22:07 +0000)
committerAlexander Shaposhnikov <sanchaez@reactos.org>
Mon, 26 Jun 2017 22:07:43 +0000 (22:07 +0000)
* Reduced "installed" check - checks only for the key inself and not the DisplayName.
  Blazing fast!
* Added installed version getter
* Added version parser function (without definition yet).
  Meant to support versions like 1.2.3.4.
* rapps.h: Added #pragma once

svn path=/branches/GSoC_2017/rapps/; revision=75211

reactos/base/applications/rapps/available.cpp
reactos/base/applications/rapps/installed.cpp
reactos/base/applications/rapps/misc.cpp
reactos/base/applications/rapps/rapps.h

index 7e48334..279029c 100644 (file)
@@ -40,11 +40,14 @@ inline void _GetStringNullFailure(LPCWSTR a, T(&b)[N], T (&cFileName)[N2]) {
   }
 }
 
-//App is "installed" if the RegName is in the registry
-inline bool _AppInstallCheckKey(PAPPLICATION_INFO Info, REGSAM key) {
-  return *Info->szRegName 
-    && (IsInstalledApplicationEx(Info->szRegName, TRUE, key) 
-    || IsInstalledApplicationEx(Info->szRegName, FALSE, key));
+//App is "installed" if the RegName or Name is in the registry
+inline bool _AppInstallCheckKey(PAPPLICATION_INFO Info, REGSAM key)
+{
+    return (*Info->szRegName
+        && (IsInstalledApplication(Info->szRegName, TRUE, key)
+        || IsInstalledApplication(Info->szRegName, FALSE, key)))
+        || (*Info->szName && (IsInstalledApplication(Info->szName, TRUE, key)
+            || IsInstalledApplication(Info->szName, FALSE, key)));
 }
 
 
index f0c7e55..9f07a92 100644 (file)
@@ -28,50 +28,59 @@ GetApplicationString(HKEY hKey, LPCWSTR lpKeyName, LPWSTR lpString)
     return FALSE;
 }
 
+
+
 BOOL
-IsInstalledApplicationEx(LPWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow)
+IsInstalledApplication(LPCWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow)
 {
-    DWORD dwSize = MAX_PATH, dwType;
-    WCHAR szName[MAX_PATH];
-    WCHAR szDisplayName[MAX_PATH];
-    HKEY hKey, hSubKey;
-    INT ItemIndex = 0;
+    HKEY hKey = NULL;
+    BOOL IsInstalled = FALSE;
 
-    if (RegOpenKeyExW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
+    if ((RegOpenKeyExW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
                     L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, keyWow | KEY_ENUMERATE_SUB_KEYS,
-                    &hKey) != ERROR_SUCCESS)
+                    &hKey) == ERROR_SUCCESS) \
+        && FindRegistryKeyByName(hKey, keyWow, lpRegName, NULL))
     {
-        return FALSE;
+        IsInstalled = TRUE;
     }
+    RegCloseKey(hKey);
+    return IsInstalled;
+}
+
+BOOL
+InstalledVersion(LPWSTR szVersionResult, UINT iVersionResultSize, LPCWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow)
+{
+    DWORD dwSize = MAX_PATH;
+    DWORD dwType = REG_SZ;
+    WCHAR szVersion[MAX_PATH];
+    HKEY hKey, hSubKey;
+    BOOL HasVersion = FALSE;
+    iVersionResultSize = 0;
 
-    while (RegEnumKeyExW(hKey, ItemIndex, szName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+    if (RegOpenKeyExW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
+        L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, keyWow | KEY_ENUMERATE_SUB_KEYS,
+        &hKey) == ERROR_SUCCESS)
     {
-        if (RegOpenKeyExW(hKey, szName, 0, keyWow | KEY_READ, &hSubKey) == ERROR_SUCCESS)
+        if (FindRegistryKeyByName(hKey, keyWow, lpRegName, &hSubKey))
         {
-
-            dwType = REG_SZ;
-            dwSize = sizeof(szDisplayName);
+            dwSize = sizeof(szVersion);
             if (RegQueryValueExW(hSubKey,
-                                 L"DisplayName",
-                                 NULL,
-                                 &dwType,
-                                 (LPBYTE)szDisplayName,
-                                 &dwSize) == ERROR_SUCCESS)
+                L"DisplayVersion",
+                NULL,
+                &dwType,
+                (LPBYTE) szVersion,
+                &dwSize) == ERROR_SUCCESS)
             {
-                if (wcscmp(szDisplayName, lpRegName) == 0)
-                {
-                    RegCloseKey(hSubKey);
-                    RegCloseKey(hKey);
-                    return TRUE;
-                } 
+                szVersionResult = szVersion;
+                iVersionResultSize = dwSize;
+                HasVersion = TRUE;
             }
         }
         RegCloseKey(hSubKey);
-        dwSize = MAX_PATH;
-        ItemIndex++;
     }
+
     RegCloseKey(hKey);
-    return FALSE;
+    return HasVersion;
 }
 
 
index 26e548a..499f74e 100644 (file)
@@ -496,4 +496,28 @@ UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName)
     RtlUnicodeStringToInteger(&BufferW, 0, &Result);
 
     return Result;
-}
\ No newline at end of file
+}
+
+
+BOOL
+ParseVersion(LPWSTR szVersion, INT* version)
+{
+    return TRUE;
+}
+
+
+//Finds subkey in key by name or path and returns it
+BOOL
+FindRegistryKeyByName(_In_ HKEY hKeyBase, _In_ REGSAM keyWow, _In_ LPCWSTR lpcKey, _Out_opt_ PHKEY hKeyResult)
+{
+    HKEY hSubKey;
+    if (RegOpenKeyExW(hKeyBase, lpcKey, 0, keyWow | KEY_READ, &hSubKey) == ERROR_SUCCESS)
+    {
+        hKeyResult = &hSubKey;
+        return TRUE;
+    }
+    hKeyResult = NULL;
+    RegCloseKey(hSubKey);
+    return FALSE;
+}
+
index 15c152e..1ed84b2 100644 (file)
@@ -1,3 +1,5 @@
+#pragma once
+
 #ifndef _RAPPS_H
 #define _RAPPS_H
 
@@ -71,6 +73,7 @@
 #define IS_INSTALLED_ENUM(a) (a >= ENUM_INSTALLED_MIN && a <= ENUM_INSTALLED_MAX)
 #define IS_AVAILABLE_ENUM(a) (a >= ENUM_AVAILABLE_MIN && a <= ENUM_AVAILABLE_MAX)
 
+
 /* aboutdlg.c */
 VOID ShowAboutDialog(VOID);
 
@@ -142,9 +145,11 @@ BOOL EnumInstalledApplications(INT EnumType, BOOL IsUserKey, APPENUMPROC lpEnumP
 BOOL GetApplicationString(HKEY hKey, LPCWSTR lpKeyName, LPWSTR lpString);
 BOOL ShowInstalledAppInfo(INT Index);
 BOOL UninstallApplication(INT Index, BOOL bModify);
-BOOL IsInstalledApplicationEx(LPWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow);
+BOOL IsInstalledApplication(LPCWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow);
 VOID RemoveAppFromRegistry(INT Index);
 
+BOOL InstalledVersion(LPWSTR szVersionResult, UINT iVersionResultSize, LPCWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow);
+
 /* winmain.c */
 extern HWND hMainWnd;
 extern HINSTANCE hInst;
@@ -176,6 +181,8 @@ BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg);
 UINT ParserGetString(LPCWSTR lpKeyName, LPWSTR lpReturnedString, UINT nSize, LPCWSTR lpFileName);
 UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName);
 
+BOOL FindRegistryKeyByName(_In_ HKEY hKeyBase, _In_ REGSAM keyWow, _In_ LPCWSTR lpcKey, _Out_opt_ PHKEY hKeyResult);
+
 /* settingsdlg.c */
 VOID CreateSettingsDlg(HWND hwnd);