[RAPPS]
[reactos.git] / reactos / base / applications / rapps / misc.cpp
index 1353828..b1c2938 100644 (file)
@@ -1,16 +1,17 @@
 /*
- * PROJECT:         ReactOS Applications Manager
- * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            base/applications/rapps/misc.cpp
- * PURPOSE:         Misc functions
- * PROGRAMMERS:     Dmitry Chapyshev           (dmitry@reactos.org)
- *                  Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
- *                  Alexander Shaposhnikov     (chaez.san@gmail.com)
+ * PROJECT:     ReactOS Applications Manager
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * FILE:        base/applications/rapps/misc.cpp
+ * PURPOSE:     Misc functions
+ * COPYRIGHT:   Copyright 2009 Dmitry Chapyshev           (dmitry@reactos.org)
+ *              Copyright 2015 Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
+ *              Copyright 2017 Alexander Shaposhnikov     (sanchaez@reactos.org)
  */
-#include "defines.h"
+#include "rapps.h"
 
 #include "gui.h"
 #include "misc.h"
+#include "cabinet.h"
 
  /* SESSION Operation */
 #define EXTRACT_FILLFILELIST  0x00000001
 
 static HANDLE hLog = NULL;
 
-struct ERF
-{
-    int erfOper;
-    int erfType;
-    BOOL fError;
-};
-
-struct FILELIST
-{
-    LPSTR FileName;
-    FILELIST *next;
-    BOOL DoExtract;
-};
-
-struct SESSION
-{
-    INT FileSize;
-    ERF Error;
-    FILELIST *FileList;
-    INT FileCount;
-    INT Operation;
-    CHAR Destination[MAX_PATH];
-    CHAR CurrentFile[MAX_PATH];
-    CHAR Reserved[MAX_PATH];
-    FILELIST *FilterList;
-};
-
-typedef HRESULT(WINAPI *fnExtract)(SESSION *dest, LPCSTR szCabName);
-fnExtract pfnExtract;
-
 INT GetWindowWidth(HWND hwnd)
 {
     RECT Rect;
@@ -110,13 +81,13 @@ VOID SetWelcomeText()
 {
     ATL::CStringW szText;
 
-    szText.LoadStringW(hInst, IDS_WELCOME_TITLE);
+    szText.LoadStringW(IDS_WELCOME_TITLE);
     NewRichEditText(szText, CFE_BOLD);
 
-    szText.LoadStringW(hInst, IDS_WELCOME_TEXT);
+    szText.LoadStringW(IDS_WELCOME_TEXT);
     InsertRichEditText(szText, 0);
 
-    szText.LoadStringW(hInst, IDS_WELCOME_URL);
+    szText.LoadStringW(IDS_WELCOME_URL);
     InsertRichEditText(szText, CFM_LINK);
 }
 
@@ -160,7 +131,7 @@ VOID ShowPopupMenu(HWND hwnd, UINT MenuID, UINT DefaultItem)
 }
 
 BOOL StartProcess(ATL::CStringW &Path, BOOL Wait)
-{ 
+{
     return StartProcess(const_cast<LPWSTR>(Path.GetString()), Wait);;
 }
 
@@ -243,7 +214,8 @@ BOOL ExtractFilesFromCab(LPCWSTR lpCabName, LPCWSTR lpOutputPath)
     CHAR szCabName[MAX_PATH];
     SESSION Dest;
     HRESULT Result;
-
+    fnExtract pfnExtract;
+    
     hCabinetDll = LoadLibraryW(L"cabinet.dll");
     if (hCabinetDll)
     {
@@ -260,12 +232,18 @@ BOOL ExtractFilesFromCab(LPCWSTR lpCabName, LPCWSTR lpOutputPath)
             if (Result == S_OK)
             {
                 Dest.Operation = EXTRACT_EXTRACTFILES;
+                CreateDirectoryW(lpOutputPath, NULL);
+
                 Result = pfnExtract(&Dest, szCabName);
                 if (Result == S_OK)
                 {
                     FreeLibrary(hCabinetDll);
                     return TRUE;
                 }
+                else
+                {
+                    RemoveDirectoryW(lpOutputPath);
+                }
             }
         }
         FreeLibrary(hCabinetDll);
@@ -346,14 +324,14 @@ BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPCWSTR lpMsg)
 }
 
 BOOL GetInstalledVersion_WowUser(ATL::CStringW* szVersionResult,
-                                 const ATL::CStringW& RegName,
+                                 const ATL::CStringW& szRegName,
                                  BOOL IsUserKey,
                                  REGSAM keyWow)
 {
     BOOL bHasSucceded = FALSE;
     ATL::CRegKey key;
     ATL::CStringW szVersion;
-    ATL::CStringW szPath = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + RegName;
+    ATL::CStringW szPath = ATL::CStringW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%ls") + szRegName;
 
     if (key.Open(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
                  szPath.GetString(),
@@ -397,3 +375,91 @@ BOOL GetInstalledVersion(ATL::CStringW *pszVersion, const ATL::CStringW &szRegNa
                 || GetInstalledVersion_WowUser(pszVersion, szRegName, TRUE, KEY_WOW64_64KEY)
                 || GetInstalledVersion_WowUser(pszVersion, szRegName, FALSE, KEY_WOW64_64KEY)));
 }
+
+// CConfigParser
+
+CConfigParser::CConfigParser(const ATL::CStringW& FileName) : szConfigPath(GetINIFullPath(FileName))
+{
+    CacheINILocale();
+}
+
+ATL::CStringW CConfigParser::GetINIFullPath(const ATL::CStringW& FileName)
+{
+    ATL::CStringW szDir;
+    ATL::CStringW szBuffer;
+
+    GetStorageDirectory(szDir);
+    szBuffer.Format(L"%ls\\rapps\\%ls", szDir.GetString(), FileName.GetString());
+
+    return szBuffer;
+}
+
+VOID CConfigParser::CacheINILocale()
+{
+    // TODO: Set default locale if call fails
+    // find out what is the current system lang code (e.g. "0a") and append it to SectionLocale
+    GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_ILANGUAGE,
+                    m_szLocaleID.GetBuffer(m_cchLocaleSize), m_cchLocaleSize);
+
+    m_szLocaleID.ReleaseBuffer();
+    m_szCachedINISectionLocale = L"Section." + m_szLocaleID;
+
+    // turn "Section.0c0a" into "Section.0a", keeping just the neutral lang part
+    m_szCachedINISectionLocaleNeutral = m_szCachedINISectionLocale + m_szLocaleID.Right(2);
+}
+
+UINT CConfigParser::GetString(const ATL::CStringW& KeyName, ATL::CStringW& ResultString)
+{
+    DWORD dwResult;
+
+    LPWSTR ResultStringBuffer = ResultString.GetBuffer(MAX_PATH);
+    // 1st - find localized strings (e.g. "Section.0c0a")
+    dwResult = GetPrivateProfileStringW(m_szCachedINISectionLocale.GetString(),
+                                        KeyName.GetString(),
+                                        NULL,
+                                        ResultStringBuffer,
+                                        MAX_PATH,
+                                        szConfigPath.GetString());
+
+    if (!dwResult)
+    {
+        // 2nd - if they weren't present check for neutral sub-langs/ generic translations (e.g. "Section.0a")
+        dwResult = GetPrivateProfileStringW(m_szCachedINISectionLocaleNeutral.GetString(),
+                                            KeyName.GetString(),
+                                            NULL,
+                                            ResultStringBuffer,
+                                            MAX_PATH,
+                                            szConfigPath.GetString());
+        if (!dwResult)
+        {
+            // 3rd - if they weren't present fallback to standard english strings (just "Section")
+            dwResult = GetPrivateProfileStringW(L"Section",
+                                                KeyName.GetString(),
+                                                NULL,
+                                                ResultStringBuffer,
+                                                MAX_PATH,
+                                                szConfigPath.GetString());
+        }
+    }
+
+    ResultString.ReleaseBuffer();
+    return (dwResult != 0 ? TRUE : FALSE);
+}
+
+UINT CConfigParser::GetInt(const ATL::CStringW& KeyName)
+{
+    ATL::CStringW Buffer;
+
+    // grab the text version of our entry
+    if (!GetString(KeyName, Buffer))
+        return FALSE;
+
+    if (Buffer.IsEmpty())
+        return FALSE;
+
+    // convert it to an actual integer
+    INT result = StrToIntW(Buffer.GetString());
+
+    return (UINT) (result <= 0) ? 0 : result;
+}
+// CConfigParser