/*
- * 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;
{
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);
}
}
BOOL StartProcess(ATL::CStringW &Path, BOOL Wait)
-{
+{
return StartProcess(const_cast<LPWSTR>(Path.GetString()), Wait);;
}
CHAR szCabName[MAX_PATH];
SESSION Dest;
HRESULT Result;
-
+ fnExtract pfnExtract;
+
hCabinetDll = LoadLibraryW(L"cabinet.dll");
if (hCabinetDll)
{
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);
}
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(),
|| 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