[RAPPS] Use FTP in passive mode
[reactos.git] / base / applications / rapps / available.cpp
index f7577f0..5ed7119 100644 (file)
 
  // CAvailableApplicationInfo
 CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam)
-    : m_IsInstalled(FALSE), m_HasLanguageInfo(FALSE), m_HasInstalledVersion(FALSE)
+    : m_IsSelected(FALSE), m_LicenseType(LICENSE_NONE), m_sFileName(sFileNameParam),
+    m_IsInstalled(FALSE), m_HasLanguageInfo(FALSE), m_HasInstalledVersion(FALSE)
 {
-    m_LicenseType = LICENSE_NONE;
-
-    m_sFileName = sFileNameParam;
-
     RetrieveGeneralInfo();
 }
 
@@ -207,39 +204,28 @@ inline BOOL CAvailableApplicationInfo::GetString(LPCWSTR lpKeyName, ATL::CString
     }
     return TRUE;
 }
-// CAvailableApplicationInfo 
-
-// CAvailableApps
-ATL::CStringW CAvailableApps::m_szPath;
-ATL::CStringW CAvailableApps::m_szCabPath;
-ATL::CStringW CAvailableApps::m_szAppsPath;
-ATL::CStringW CAvailableApps::m_szSearchPath;
+// CAvailableApplicationInfo
 
-BOOL CAvailableApps::InitializeStaticStrings()
+// AvailableStrings
+AvailableStrings::AvailableStrings()
 {
-
-    if (!m_szPath.IsEmpty())
-    {
-        // strings are filled
-        return TRUE;
-    }
-
     //FIXME: maybe provide a fallback?
-    if (GetStorageDirectory(m_szPath))
+    if (GetStorageDirectory(szPath))
     {
-        m_szAppsPath = m_szPath + L"\\rapps\\";
-        m_szCabPath = m_szPath + L"\\rappmgr.cab";
-        m_szSearchPath = m_szAppsPath + L"*.txt";
-        return TRUE;
+        szAppsPath = szPath + L"\\rapps\\";
+        szCabName = L"rappmgr.cab";
+        szCabDir = szPath;
+        szCabPath = (szCabDir + L"\\") + szCabName;
+        szSearchPath = szAppsPath + L"*.txt";
     }
-
-    return FALSE;
 }
+// AvailableStrings
+
+// CAvailableApps
+AvailableStrings CAvailableApps::m_Strings;
 
 CAvailableApps::CAvailableApps()
 {
-    //set all paths
-    InitializeStaticStrings();
 }
 
 VOID CAvailableApps::FreeCachedEntries()
@@ -261,26 +247,21 @@ VOID CAvailableApps::DeleteCurrentAppsDB()
     HANDLE hFind = INVALID_HANDLE_VALUE;
     WIN32_FIND_DATAW FindFileData;
 
-    if (!InitializeStaticStrings())
-    {
-        return;
-    }
-
-    hFind = FindFirstFileW(m_szSearchPath.GetString(), &FindFileData);
+    hFind = FindFirstFileW(m_Strings.szSearchPath.GetString(), &FindFileData);
 
     if (hFind != INVALID_HANDLE_VALUE)
     {
         ATL::CStringW szTmp;
         do
         {
-            szTmp = m_szAppsPath + FindFileData.cFileName;
+            szTmp = m_Strings.szAppsPath + FindFileData.cFileName;
             DeleteFileW(szTmp.GetString());
         } while (FindNextFileW(hFind, &FindFileData) != 0);
         FindClose(hFind);
     }
 
-    RemoveDirectoryW(m_szAppsPath);
-    RemoveDirectoryW(m_szPath);
+    RemoveDirectoryW(m_Strings.szAppsPath);
+    RemoveDirectoryW(m_Strings.szPath);
 }
 
 BOOL CAvailableApps::UpdateAppsDB()
@@ -288,18 +269,13 @@ BOOL CAvailableApps::UpdateAppsDB()
     HANDLE hFind = INVALID_HANDLE_VALUE;
     WIN32_FIND_DATAW FindFileData;
 
-    if (!InitializeStaticStrings())
-    {
-        return FALSE;
-    }
-
-    if (!CreateDirectoryW(m_szPath.GetString(), NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
+    if (!CreateDirectoryW(m_Strings.szPath, 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);
+    hFind = FindFirstFileW(m_Strings.szSearchPath, &FindFileData);
     if (hFind != INVALID_HANDLE_VALUE)
     {
         FindClose(hFind);
@@ -308,12 +284,14 @@ BOOL CAvailableApps::UpdateAppsDB()
 
     CDownloadManager::DownloadApplicationsDB(APPLICATION_DATABASE_URL);
 
-    if (!ExtractFilesFromCab(m_szCabPath, m_szAppsPath))
+    if (!ExtractFilesFromCab(m_Strings.szCabName, 
+                             m_Strings.szCabDir,
+                             m_Strings.szAppsPath))
     {
         return FALSE;
     }
 
-    DeleteFileW(m_szCabPath.GetString());
+    DeleteFileW(m_Strings.szCabPath);
 
     return TRUE;
 }
@@ -330,7 +308,7 @@ BOOL CAvailableApps::Enum(INT EnumType, AVAILENUMPROC lpEnumProc)
     HANDLE hFind = INVALID_HANDLE_VALUE;
     WIN32_FIND_DATAW FindFileData;
 
-    hFind = FindFirstFileW(m_szSearchPath.GetString(), &FindFileData);
+    hFind = FindFirstFileW(m_Strings.szSearchPath.GetString(), &FindFileData);
 
     if (hFind == INVALID_HANDLE_VALUE)
     {
@@ -378,17 +356,15 @@ BOOL CAvailableApps::Enum(INT EnumType, AVAILENUMPROC lpEnumProc)
         m_InfoList.AddTail(Info);
 
 skip_if_cached:
-        if (Info->m_Category == FALSE)
-            continue;
-
-        if (EnumType != Info->m_Category && EnumType != ENUM_ALL_AVAILABLE)
-            continue;
-
-        Info->RefreshAppInfo();
-
-        if (lpEnumProc)
-            lpEnumProc(static_cast<CAvailableApplicationInfo*>(Info), m_szAppsPath.GetString());
+        if (EnumType == Info->m_Category
+            || EnumType == ENUM_ALL_AVAILABLE
+            || (EnumType == ENUM_CAT_SELECTED && Info->m_IsSelected))
+        {
+            Info->RefreshAppInfo();
 
+            if (lpEnumProc)
+                lpEnumProc(Info, m_Strings.szAppsPath.GetString());
+        }
     } while (FindNextFileW(hFind, &FindFileData) != 0);
 
     FindClose(hFind);
@@ -430,33 +406,35 @@ ATL::CSimpleArray<CAvailableApplicationInfo> CAvailableApps::FindInfoList(const
     return result;
 }
 
-const ATL::CStringW& CAvailableApps::GetFolderPath() const
-{
-    return m_szPath;
-}
-
-const ATL::CStringW& CAvailableApps::GetAppPath() const
+ATL::CSimpleArray<CAvailableApplicationInfo> CAvailableApps::GetSelected() const
 {
-    return m_szAppsPath;
-}
+    ATL::CSimpleArray<CAvailableApplicationInfo> result;
+    POSITION CurrentListPosition = m_InfoList.GetHeadPosition();
+    CAvailableApplicationInfo* Info;
 
-const ATL::CStringW& CAvailableApps::GetCabPath() const
-{
-    return m_szCabPath;
+    while (CurrentListPosition != NULL)
+    {
+        Info = m_InfoList.GetNext(CurrentListPosition);
+        if (Info->m_IsSelected)
+        {
+            result.Add(*Info);
+        }
+    }
+    return result;
 }
 
-LPCWSTR CAvailableApps::GetFolderPathString() const
+const ATL::CStringW& CAvailableApps::GetFolderPath() const
 {
-    return m_szPath.GetString();
+    return m_Strings.szPath;
 }
 
-LPCWSTR CAvailableApps::GetAppPathString() const
+const ATL::CStringW& CAvailableApps::GetAppPath() const
 {
-    return m_szPath.GetString();
+    return m_Strings.szAppsPath;
 }
 
-LPCWSTR CAvailableApps::GetCabPathString() const
+const ATL::CStringW& CAvailableApps::GetCabPath() const
 {
-    return m_szPath.GetString();
+    return m_Strings.szCabPath;
 }
 // CAvailableApps