[RAPPS]
authorAlexander Shaposhnikov <sanchaez@reactos.org>
Thu, 24 Aug 2017 22:04:44 +0000 (22:04 +0000)
committerAlexander Shaposhnikov <sanchaez@reactos.org>
Thu, 24 Aug 2017 22:04:44 +0000 (22:04 +0000)
Changes in the update process:
- Made UpdateAppsDB() functions static and added ForceUpdateAppsDB()
- EnumAvailableApplications() doesn't update DB on it's own
- Force updating now done only if bUpdateAtStart set or if no settings loaded (first run)
- Minor cleanup

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

reactos/base/applications/rapps/available.cpp
reactos/base/applications/rapps/gui.cpp
reactos/base/applications/rapps/include/available.h
reactos/base/applications/rapps/loaddlg.cpp
reactos/base/applications/rapps/unattended.cpp
reactos/base/applications/rapps/winmain.cpp

index f484260..44a7653 100644 (file)
@@ -201,15 +201,28 @@ inline BOOL CAvailableApplicationInfo::GetString(LPCWSTR lpKeyName, ATL::CString
 // CAvailableApplicationInfo 
 
 // CAvailableApps
-CAvailableApps::CAvailableApps()
+ATL::CStringW CAvailableApps::m_szPath;
+ATL::CStringW CAvailableApps::m_szCabPath;
+ATL::CStringW CAvailableApps::m_szAppsPath;
+ATL::CStringW CAvailableApps::m_szSearchPath;
+
+BOOL CAvailableApps::InitializeStaticStrings()
 {
-    //set all paths
-    if (GetStorageDirectory(m_szPath))
+    //FIXME: maybe provide a fallback?
+    if (m_szPath.IsEmpty() && GetStorageDirectory(m_szPath))
     {
         m_szAppsPath = m_szPath + L"\\rapps\\";
         m_szCabPath = m_szPath + L"\\rappmgr.cab";
         m_szSearchPath = m_szAppsPath + L"*.txt";
+        return TRUE;
     }
+    return FALSE;
+}
+
+CAvailableApps::CAvailableApps()
+{
+    //set all paths
+    InitializeStaticStrings();
 }
 
 VOID CAvailableApps::FreeCachedEntries()
@@ -235,7 +248,6 @@ VOID CAvailableApps::DeleteCurrentAppsDB()
     if (m_szPath.IsEmpty())
         return;
 
-    DeleteFileW(m_szCabPath.GetString());
     hFind = FindFirstFileW(m_szSearchPath.GetString(), &FindFileData);
 
     if (hFind != INVALID_HANDLE_VALUE)
@@ -248,50 +260,62 @@ VOID CAvailableApps::DeleteCurrentAppsDB()
         } while (FindNextFileW(hFind, &FindFileData) != 0);
         FindClose(hFind);
     }
+
+    RemoveDirectoryW(m_szAppsPath);
+    RemoveDirectoryW(m_szPath);
 }
 
 BOOL CAvailableApps::UpdateAppsDB()
 {
-    DeleteCurrentAppsDB();
+    HANDLE hFind = INVALID_HANDLE_VALUE;
+    WIN32_FIND_DATAW FindFileData;
 
-    CDownloadManager::DownloadApplicationsDB(APPLICATION_DATABASE_URL);
+    if (m_szPath.IsEmpty() && !InitializeStaticStrings())
+    {
+        return FALSE;
+    }
 
-    if (m_szPath.IsEmpty())
+    if (!CreateDirectoryW(m_szPath.GetString(), NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
+    {
         return FALSE;
+    }
+
+    //if there are some files in the db folder - we're good
+    hFind = FindFirstFileW(m_szSearchPath.GetString(), &FindFileData);
+    if (hFind != INVALID_HANDLE_VALUE)
+    {
+        return TRUE;
+    }
+
+    CDownloadManager::DownloadApplicationsDB(APPLICATION_DATABASE_URL);
 
     if (!ExtractFilesFromCab(m_szCabPath, m_szAppsPath))
     {
         return FALSE;
     }
 
+    DeleteFileW(m_szCabPath.GetString());
+
     return TRUE;
 }
 
+BOOL CAvailableApps::ForceUpdateAppsDB()
+{
+    DeleteCurrentAppsDB();
+    return UpdateAppsDB();
+}
+
 BOOL CAvailableApps::EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
 {
     HANDLE hFind = INVALID_HANDLE_VALUE;
     WIN32_FIND_DATAW FindFileData;
 
-    if (!CreateDirectoryW(m_szPath.GetString(), NULL) &&
-        GetLastError() != ERROR_ALREADY_EXISTS)
-    {
-        return FALSE;
-    }
-
     hFind = FindFirstFileW(m_szSearchPath.GetString(), &FindFileData);
 
     if (hFind == INVALID_HANDLE_VALUE)
     {
-        if(!UpdateAppsDB()) {
-            return FALSE;
-        }
-
-        hFind = FindFirstFileW(m_szSearchPath.GetString(), &FindFileData);
-
-        if (hFind == INVALID_HANDLE_VALUE)
-        {
-            return FALSE;
-        }
+        //no db yet
+        return FALSE;
     }
 
     do
index 343771a..d0a8346 100644 (file)
@@ -1321,7 +1321,7 @@ private:
             break;
 
         case ID_RESETDB:
-            m_AvailableApps.UpdateAppsDB();
+            CAvailableApps::ForceUpdateAppsDB();
             UpdateApplicationsList(-1);
             break;
 
index 1e20c4c..5c9fff0 100644 (file)
@@ -107,16 +107,21 @@ private:
 class CAvailableApps
 {
     ATL::CAtlList<CAvailableApplicationInfo*> m_InfoList;
-    ATL::CStringW m_szPath;
-    ATL::CStringW m_szCabPath;
-    ATL::CStringW m_szAppsPath;
-    ATL::CStringW m_szSearchPath;
+    static ATL::CStringW m_szPath;
+    static ATL::CStringW m_szCabPath;
+    static ATL::CStringW m_szAppsPath;
+    static ATL::CStringW m_szSearchPath;
+
+    static BOOL InitializeStaticStrings();
 
 public:
     CAvailableApps();
+
+    static BOOL UpdateAppsDB();
+    static BOOL ForceUpdateAppsDB();
+
     VOID FreeCachedEntries();
-    VOID DeleteCurrentAppsDB();
-    BOOL UpdateAppsDB();
+    static VOID DeleteCurrentAppsDB();
     BOOL EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc);
     const PAPPLICATION_INFO FindInfo(const ATL::CStringW& szAppName);
     ATL::CSimpleArray<PAPPLICATION_INFO> FindInfoList(const ATL::CSimpleArray<ATL::CStringW> &arrAppsNames);
index 3d43bb7..d024d86 100644 (file)
@@ -565,7 +565,6 @@ DWORD WINAPI CDownloadManager::ThreadFunc(LPVOID param)
             continue;
         }
 
-
         // build the path for the download
         p = wcsrchr(pCurrentInfo->szUrlDownload.GetString(), L'/');
         q = wcsrchr(pCurrentInfo->szUrlDownload.GetString(), L'?');
index 69836b1..5bcd169 100644 (file)
@@ -56,6 +56,7 @@ BOOL CmdParser(LPWSTR lpCmdLine)
     }
 
     CAvailableApps apps;
+    CAvailableApps::UpdateAppsDB();
     apps.EnumAvailableApplications(ENUM_ALL_AVAILABLE, NULL);
     ATL::CSimpleArray<PAPPLICATION_INFO> arrAppInfo = apps.FindInfoList(arrNames);
     if (arrAppInfo.GetSize() > 0)
index 20e16d5..1e61c56 100644 (file)
@@ -128,6 +128,7 @@ INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
     HANDLE hMutex;
     HACCEL KeyBrd;
     MSG Msg;
+    BOOL bFirstLaunch;
 
     InitializeAtlModule(hInstance, TRUE);
 
@@ -149,8 +150,8 @@ INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
         SetForegroundWindow(hWindow);
         return 1;
     }
-
-    if (!LoadSettings())
+    bFirstLaunch = LoadSettings();
+    if (bFirstLaunch)
     {
         FillDefaultSettings(&SettingsInfo);
     }
@@ -158,20 +159,20 @@ INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
     InitLogs();
     InitCommonControls();
 
-    //skip window creation if there were some keys
+    // skip window creation if there were some keys
     if (!CmdParser(lpCmdLine))
     {
+        if (SettingsInfo.bUpdateAtStart || bFirstLaunch)
+            CAvailableApps::ForceUpdateAppsDB();
+
         hMainWnd = CreateMainWindow();
+
         if (hMainWnd)
         {
             /* Maximize it if we must */
-            ShowWindow(hMainWnd, (SettingsInfo.bSaveWndPos && SettingsInfo.Maximized ? SW_MAXIMIZE : nShowCmd));
+            ShowWindow(hMainWnd, ((SettingsInfo.bSaveWndPos && SettingsInfo.Maximized) ? SW_MAXIMIZE : nShowCmd));
             UpdateWindow(hMainWnd);
 
-            //TODO: get around the ugliness
-            if (SettingsInfo.bUpdateAtStart)
-                GetAvailableApps()->UpdateAppsDB();
-
             /* Load the menu hotkeys */
             KeyBrd = LoadAcceleratorsW(NULL, MAKEINTRESOURCEW(HOTKEYS));