[RAPPS]
authorKamil Hornicek <kamil.hornicek@reactos.org>
Thu, 19 Mar 2015 19:26:14 +0000 (19:26 +0000)
committerKamil Hornicek <kamil.hornicek@reactos.org>
Thu, 19 Mar 2015 19:26:14 +0000 (19:26 +0000)
- remove the custom parser, add caching, accelerators and lazy loading support and more (patch by Ismael Ferreras Morezuelas)
- modifications by me:
- don't rely on an undocumented behavior when calling GetPrivateProfileStringW and check the return value instead (should get fixed in kernel32 too)
- modify the packaging scripts so the resulting CAB file contains UTF16 encoded files and remove the re-encoding hack from the patch (this is backwards compatible as the previous parser implementation was UTF16 aware)
CORE-9060

svn path=/trunk/; revision=66814

31 files changed:
reactos/base/applications/rapps/CMakeLists.txt
reactos/base/applications/rapps/CreateCabFile.bat
reactos/base/applications/rapps/CreateCabFile.sh
reactos/base/applications/rapps/available.c
reactos/base/applications/rapps/lang/bg-BG.rc
reactos/base/applications/rapps/lang/cs-CZ.rc
reactos/base/applications/rapps/lang/de-DE.rc
reactos/base/applications/rapps/lang/en-US.rc
reactos/base/applications/rapps/lang/es-ES.rc
reactos/base/applications/rapps/lang/fr-FR.rc
reactos/base/applications/rapps/lang/he-IL.rc
reactos/base/applications/rapps/lang/it-IT.rc
reactos/base/applications/rapps/lang/ja-JP.rc
reactos/base/applications/rapps/lang/no-NO.rc
reactos/base/applications/rapps/lang/pl-PL.rc
reactos/base/applications/rapps/lang/pt-BR.rc
reactos/base/applications/rapps/lang/ro-RO.rc
reactos/base/applications/rapps/lang/ru-RU.rc
reactos/base/applications/rapps/lang/sk-SK.rc
reactos/base/applications/rapps/lang/sq-AL.rc
reactos/base/applications/rapps/lang/sv-SE.rc
reactos/base/applications/rapps/lang/tr-TR.rc
reactos/base/applications/rapps/lang/uk-UA.rc
reactos/base/applications/rapps/lang/zh-CN.rc
reactos/base/applications/rapps/lang/zh-TW.rc
reactos/base/applications/rapps/misc.c
reactos/base/applications/rapps/parser.c [deleted file]
reactos/base/applications/rapps/rapps.h
reactos/base/applications/rapps/rapps.rc
reactos/base/applications/rapps/resource.h
reactos/base/applications/rapps/winmain.c

index 03e6c8f..25d0bd1 100644 (file)
@@ -7,7 +7,6 @@ list(APPEND SOURCE
     listview.c
     loaddlg.c
     misc.c
-    parser.c
     richedit.c
     settingsdlg.c
     splitter.c
index 3434397..b83f7d0 100644 (file)
@@ -1 +1,10 @@
-..\..\..\output-MinGW-i386\host-tools\tools\cabman\cabman.exe -M mszip -S rappmgr.cab rapps\*.txt
+@echo off
+
+mkdir rapps\utf16
+
+for %%f in (rapps\*.txt) do (
+     ..\..\..\output-MinGW-i386\host-tools\tools\utf16le.exe "rapps\%%~nf.txt" "rapps\utf16\%%~nf.txt"
+)
+
+..\..\..\output-MinGW-i386\host-tools\tools\cabman\cabman.exe -M mszip -S rappmgr.cab rapps\utf16\*.txt
+rmdir /s /q rapps\utf16
index d185b44..5c66855 100755 (executable)
@@ -1 +1,9 @@
-../../../output-MinGW-i386/host-tools/tools/cabman/cabman -M mszip -S rappmgr.cab rapps/*.txt
+#/bin/sh
+cd rapps
+mkdir utf16
+for i in $(find -type f); do
+  ../../../../output-MinGW-i386/host-tools/tools/utf16le.exe $i utf16/$i
+done
+cd ..
+../../../output-MinGW-i386/host-tools/tools/cabman/cabman -M mszip -S rappmgr.cab rapps/utf16/*.txt
+rm -r rapps/uft16
\ No newline at end of file
index ac0b2b5..3920f3f 100644 (file)
@@ -3,11 +3,32 @@
  * LICENSE:         GPL - See COPYING in the top level directory
  * FILE:            base/applications/rapps/available.c
  * PURPOSE:         Functions for working with availabled applications
- * PROGRAMMERS:     Dmitry Chapyshev (dmitry@reactos.org)
+ * PROGRAMMERS:     Dmitry Chapyshev           (dmitry@reactos.org)
+ *                  Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
  */
 
+#include <ndk/rtlfuncs.h>
 #include "rapps.h"
 
+#define ADD_TEXT(a, b, c, d) \
+    if (b[0] != '\0') \
+    { \
+        LoadStringW(hInst, a, szText, _countof(szText)); \
+        InsertRichEditText(szText, c); \
+        InsertRichEditText(b, d); \
+    } \
+
+#define GET_STRING1(a, b)  \
+    if (!ParserGetString(a, b, MAX_PATH, FindFileData.cFileName)) \
+        continue;
+
+#define GET_STRING2(a, b)  \
+    if (!ParserGetString(a, b, MAX_PATH, FindFileData.cFileName)) \
+        b[0] = '\0';
+
+LIST_ENTRY CachedEntriesHead = {0};
+PLIST_ENTRY pCachedEntry = NULL;
+
 BOOL
 ShowAvailableAppInfo(INT Index)
 {
@@ -20,19 +41,11 @@ ShowAvailableAppInfo(INT Index)
 
     InsertRichEditText(L"\n", 0);
 
-#define ADD_TEXT(a, b, c, d) \
-    if (b[0] != '\0') \
-    { \
-        LoadStringW(hInst, a, szText, sizeof(szText) / sizeof(WCHAR)); \
-        InsertRichEditText(szText, c); \
-        InsertRichEditText(b, d); \
-    } \
-
-    ADD_TEXT(IDS_AINFO_VERSION, Info->szVersion, CFE_BOLD, 0);
-    ADD_TEXT(IDS_AINFO_LICENSE, Info->szLicense, CFE_BOLD, 0);
-    ADD_TEXT(IDS_AINFO_SIZE, Info->szSize, CFE_BOLD, 0);
-    ADD_TEXT(IDS_AINFO_URLSITE, Info->szUrlSite, CFE_BOLD, CFE_LINK);
-    ADD_TEXT(IDS_AINFO_DESCRIPTION, Info->szDesc, CFE_BOLD, 0);
+    ADD_TEXT(IDS_AINFO_VERSION,     Info->szVersion, CFE_BOLD, 0);
+    ADD_TEXT(IDS_AINFO_LICENSE,     Info->szLicense, CFE_BOLD, 0);
+    ADD_TEXT(IDS_AINFO_SIZE,        Info->szSize,    CFE_BOLD, 0);
+    ADD_TEXT(IDS_AINFO_URLSITE,     Info->szUrlSite, CFE_BOLD, CFE_LINK);
+    ADD_TEXT(IDS_AINFO_DESCRIPTION, Info->szDesc,    CFE_BOLD, 0);
 
     return TRUE;
 }
@@ -49,7 +62,7 @@ DeleteCurrentAppsDB(VOID)
     HRESULT hr;
     BOOL result = TRUE;
 
-    if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0])))
+    if (!GetStorageDirectory(szPath, _countof(szPath)))
         return FALSE;
 
     hr = StringCbPrintfW(szCabPath, sizeof(szCabPath),
@@ -61,6 +74,7 @@ DeleteCurrentAppsDB(VOID)
     result = result && DeleteFileW(szCabPath);
 
     hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\");
+
     if (FAILED(hr))
         return FALSE;
 
@@ -71,6 +85,7 @@ DeleteCurrentAppsDB(VOID)
         return FALSE;
 
     hFind = FindFirstFileW(szSearchPath, &FindFileData);
+
     if (hFind == INVALID_HANDLE_VALUE)
         return result;
 
@@ -82,6 +97,7 @@ DeleteCurrentAppsDB(VOID)
         if (FAILED(hr))
             continue;
         result = result && DeleteFileW(szTmp);
+
     } while (FindNextFileW(hFind, &FindFileData) != 0);
 
     FindClose(hFind);
@@ -102,7 +118,7 @@ UpdateAppsDB(VOID)
 
     DownloadApplicationsDB(APPLICATION_DATABASE_URL);
 
-    if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0])))
+    if (!GetStorageDirectory(szPath, _countof(szPath)))
         return FALSE;
 
     if (FAILED(StringCbPrintfW(szCabPath, sizeof(szCabPath),
@@ -132,13 +148,18 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
     WIN32_FIND_DATAW FindFileData;
     WCHAR szPath[MAX_PATH];
     WCHAR szAppsPath[MAX_PATH];
-    WCHAR szSectionLocale[MAX_PATH] = L"Section.";
     WCHAR szCabPath[MAX_PATH];
-    WCHAR szLocale[4 + 1];
-    APPLICATION_INFO Info;
+    PAPPLICATION_INFO Info;
     HRESULT hr;
 
-    if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0])))
+    /* initialize the cached list if hasn't been yet */
+    if (pCachedEntry == NULL)
+    {
+        InitializeListHead(&CachedEntriesHead);
+        pCachedEntry = &CachedEntriesHead;
+    }
+
+    if (!GetStorageDirectory(szPath, _countof(szPath)))
         return FALSE;
 
     hr = StringCbPrintfW(szCabPath, sizeof(szCabPath),
@@ -148,9 +169,12 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
         return FALSE;
 
     hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\");
+
     if (FAILED(hr))
         return FALSE;
+
     hr = StringCbCopyW(szAppsPath, sizeof(szAppsPath), szPath);
+
     if (FAILED(hr))
         return FALSE;
 
@@ -161,10 +185,12 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
     }
 
     hr = StringCbCatW(szPath, sizeof(szPath), L"*.txt");
+
     if (FAILED(hr))
         return FALSE;
 
     hFind = FindFirstFileW(szPath, &FindFileData);
+
     if (hFind == INVALID_HANDLE_VALUE)
     {
         if (GetFileAttributesW(szCabPath) == INVALID_FILE_ATTRIBUTES)
@@ -172,61 +198,84 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
 
         ExtractFilesFromCab(szCabPath, szAppsPath);
         hFind = FindFirstFileW(szPath, &FindFileData);
+
         if (hFind == INVALID_HANDLE_VALUE)
             return FALSE;
     }
 
-    if (!GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_ILANGUAGE,
-                        szLocale, sizeof(szLocale) / sizeof(WCHAR)))
+    do
     {
-        FindClose(hFind);
-        return FALSE;
-    }
+        /* loop for all the cached entries */
+        for (pCachedEntry = CachedEntriesHead.Flink; pCachedEntry != &CachedEntriesHead; pCachedEntry = pCachedEntry->Flink)
+        {
+            Info = CONTAINING_RECORD(pCachedEntry, APPLICATION_INFO, List);
+
+            /* do we already have this entry in cache? */
+            if(_wcsicmp(FindFileData.cFileName, Info->cFileName) == 0)
+            {
+                /* is it current enough, or the file has been modified since our last time here? */
+                if (CompareFileTime(&FindFileData.ftLastWriteTime, &Info->ftCacheStamp) == 1)
+                {
+                    /* recreate our cache, this is the slow path */
+                    RemoveEntryList(&Info->List);
+                    HeapFree(GetProcessHeap(), 0, Info);
+                }
+                else
+                {
+                    /* speedy path, compare directly, we already have the data */
+                    goto skip_if_cached;
+                }
+
+                break;
+            }
+        }
 
-    hr = StringCbCatW(szSectionLocale, sizeof(szSectionLocale), szLocale);
-    if (FAILED(hr))
-    {
-        FindClose(hFind);
-        return FALSE;
-    }
+        /* create a new entry */
+        Info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(APPLICATION_INFO));
 
-#define GET_STRING1(a, b)  \
-    if (!ParserGetString(szSectionLocale, a, b, MAX_PATH, FindFileData.cFileName)) \
-        if (!ParserGetString(L"Section", a, b, MAX_PATH, FindFileData.cFileName)) \
+        if(!Info)
+            break;
+
+        Info->Category = ParserGetInt(L"Category", FindFileData.cFileName);
+
+        /* copy the cache-related fields for the next time */
+        RtlCopyMemory(&Info->cFileName,    &FindFileData.cFileName, MAX_PATH);
+        RtlCopyMemory(&Info->ftCacheStamp, &FindFileData.ftLastWriteTime, sizeof(FILETIME));
+
+        /* add our cached entry to the cached list */
+        InsertTailList(&CachedEntriesHead, &Info->List);
+
+skip_if_cached:
+
+        if (Info->Category == -1)
             continue;
 
-#define GET_STRING2(a, b)  \
-    if (!ParserGetString(szSectionLocale, a, b, MAX_PATH, FindFileData.cFileName)) \
-        if (!ParserGetString(L"Section", a, b, MAX_PATH, FindFileData.cFileName)) \
-            b[0] = '\0';
+        if (EnumType != Info->Category && EnumType != ENUM_ALL_AVAILABLE)
+            continue;
 
-    do
-    {
-        Info.Category = ParserGetInt(szSectionLocale, L"Category", FindFileData.cFileName);
-        if (Info.Category == -1)
+        /* if our cache hit was only partial, we need to parse
+           and lazily fill the rest of fields only when needed */
+
+        if (Info->szUrlDownload[0] == 0)
         {
-            Info.Category = ParserGetInt(L"Section", L"Category", FindFileData.cFileName);
-            if (Info.Category == -1)
-                continue;
+            GET_STRING1(L"Name",        Info->szName);
+            GET_STRING1(L"URLDownload", Info->szUrlDownload);
+
+            GET_STRING2(L"RegName",     Info->szRegName);
+            GET_STRING2(L"Version",     Info->szVersion);
+            GET_STRING2(L"License",     Info->szLicense);
+            GET_STRING2(L"Description", Info->szDesc);
+            GET_STRING2(L"Size",        Info->szSize);
+            GET_STRING2(L"URLSite",     Info->szUrlSite);
+            GET_STRING2(L"CDPath",      Info->szCDPath);
         }
 
-        if (EnumType != Info.Category && EnumType != ENUM_ALL_AVAILABLE) continue;
+        if (!lpEnumProc(Info))
+            break;
 
-        GET_STRING1(L"Name", Info.szName);
-        GET_STRING1(L"URLDownload", Info.szUrlDownload);
-
-        GET_STRING2(L"RegName", Info.szRegName);
-        GET_STRING2(L"Version", Info.szVersion);
-        GET_STRING2(L"License", Info.szLicense);
-        GET_STRING2(L"Description", Info.szDesc);
-        GET_STRING2(L"Size", Info.szSize);
-        GET_STRING2(L"URLSite", Info.szUrlSite);
-        GET_STRING2(L"CDPath", Info.szCDPath);
-
-        if (!lpEnumProc(&Info)) break;
     } while (FindNextFileW(hFind, &FindFileData) != 0);
 
     FindClose(hFind);
 
     return TRUE;
-}
+}
\ No newline at end of file
index ec1d8ea..cacfebb 100644 (file)
@@ -14,19 +14,19 @@ BEGIN
     END
     POPUP "&Приложения"
     BEGIN
-        MENUITEM "&Слагане", ID_INSTALL
-        MENUITEM "&Махане", ID_UNINSTALL
+        MENUITEM "&Слагане\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Махане\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Промяна", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Пре&махване от регистъра", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "О&пресняване", ID_REFRESH
+        MENUITEM "О&пресняване\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
     POPUP "Помощ"
     BEGIN
-        MENUITEM "Помощ", ID_HELP, GRAYED
+        MENUITEM "Помощ\tF1", ID_HELP, GRAYED
         MENUITEM "За", ID_ABOUT
     END
 END
@@ -44,15 +44,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Слагане", ID_INSTALL
-        MENUITEM "&Махане", ID_UNINSTALL
+        MENUITEM "&Слагане\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Махане\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Промяна", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Пре&махване от регистъра", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "О&пресняване", ID_REFRESH
+        MENUITEM "О&пресняване\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index df5abf5..d535493 100644 (file)
@@ -15,19 +15,19 @@ BEGIN
     END
     POPUP "&Programy"
     BEGIN
-        MENUITEM "&Instalovat", ID_INSTALL
-        MENUITEM "&Odinstalovat", ID_UNINSTALL
+        MENUITEM "&Instalovat\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Odinstalovat\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Změnit", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Odstranit z &registru", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "Ob&novit", ID_REFRESH
+        MENUITEM "Ob&novit\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "&Aktualizovat databázi", ID_RESETDB
+        MENUITEM "&Aktualizovat databázi\tCtrl+F5", ID_RESETDB
     END
     POPUP "Nápověda"
     BEGIN
-        MENUITEM "Nápověda", ID_HELP, GRAYED
+        MENUITEM "Nápověda\tF1", ID_HELP, GRAYED
         MENUITEM "O programu...", ID_ABOUT
     END
 END
@@ -45,15 +45,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Instalovat", ID_INSTALL
-        MENUITEM "&Odinstalovat", ID_UNINSTALL
+        MENUITEM "&Instalovat\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Odinstalovat\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Změnit", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Odstranit z &registru", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "Ob&novit", ID_REFRESH
+        MENUITEM "Ob&novit\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "&Aktualizovat databázi", ID_RESETDB
+        MENUITEM "&Aktualizovat databázi\tCtrl+F5", ID_RESETDB
     END
 END
 
index a276044..6ade42d 100644 (file)
@@ -10,19 +10,19 @@ BEGIN
     END
     POPUP "&Programme"
     BEGIN
-        MENUITEM "&Installieren", ID_INSTALL
-        MENUITEM "&Deinstallieren", ID_UNINSTALL
+        MENUITEM "&Installieren\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Deinstallieren\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Ändern", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Aus &Registry entfernen", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Aktualisieren", ID_REFRESH
+        MENUITEM "&Aktualisieren\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Da&tenbank aktualisieren", ID_RESETDB
+        MENUITEM "Da&tenbank aktualisieren\tCtrl+F5", ID_RESETDB
     END
     POPUP "Hilfe"
     BEGIN
-        MENUITEM "Hilfe", ID_HELP, GRAYED
+        MENUITEM "Hilfe\tF1", ID_HELP, GRAYED
         MENUITEM "Über", ID_ABOUT
     END
 END
@@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Installieren", ID_INSTALL
-        MENUITEM "&Deinstallieren", ID_UNINSTALL
+        MENUITEM "&Installieren\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Deinstallieren\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Ändern", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Aus &Registry entfernen", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Aktualisieren", ID_REFRESH
+        MENUITEM "&Aktualisieren\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Da&tenbank aktualisieren", ID_RESETDB
+        MENUITEM "Da&tenbank aktualisieren\tCtrl+F5", ID_RESETDB
     END
 END
 
index 18c69fa..073446b 100644 (file)
@@ -10,19 +10,19 @@ BEGIN
     END
     POPUP "&Programs"
     BEGIN
-        MENUITEM "&Install", ID_INSTALL
-        MENUITEM "&Uninstall", ID_UNINSTALL
+        MENUITEM "&Install\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modify", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Remove from Registry", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Refresh", ID_REFRESH
+        MENUITEM "&Refresh\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
     POPUP "Help"
     BEGIN
-        MENUITEM "Help", ID_HELP, GRAYED
+        MENUITEM "Help\tF1", ID_HELP, GRAYED
         MENUITEM "About", ID_ABOUT
     END
 END
@@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Install", ID_INSTALL
-        MENUITEM "&Uninstall", ID_UNINSTALL
+        MENUITEM "&Install\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modify", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Remove from Registry", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Refresh", ID_REFRESH
+        MENUITEM "&Refresh\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index 38c9c59..2cf408e 100644 (file)
@@ -13,19 +13,19 @@ BEGIN
     END
     POPUP "&Programas"
     BEGIN
-        MENUITEM "&Instalar", ID_INSTALL
-        MENUITEM "&Desinstalar", ID_UNINSTALL
+        MENUITEM "&Instalar\tCtrl+Intro", ID_INSTALL
+        MENUITEM "&Desinstalar\tCtrl+Supr", ID_UNINSTALL
         MENUITEM "&Modificar", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Eliminar del Registro", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Recargar", ID_REFRESH
+        MENUITEM "&Recargar\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "&Actualizar el listado desde Internet", ID_RESETDB
+        MENUITEM "&Actualizar el listado desde Internet\tCtrl+F5", ID_RESETDB
     END
     POPUP "Ayuda"
     BEGIN
-        MENUITEM "Ayuda", ID_HELP, GRAYED
+        MENUITEM "Ayuda\tF1", ID_HELP, GRAYED
         MENUITEM "Acerca de", ID_ABOUT
     END
 END
@@ -43,19 +43,19 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Instalar", ID_INSTALL
-        MENUITEM "&Desinstalar", ID_UNINSTALL
+        MENUITEM "&Instalar\tCtrl+Intro", ID_INSTALL
+        MENUITEM "&Desinstalar\tCtrl+Supr", ID_UNINSTALL
         MENUITEM "&Modificar", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Eliminar del Registro", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Recargar",   ID_REFRESH
+        MENUITEM "&Recargar\tF5",   ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "&Actualizar listado desde Internet", ID_RESETDB
+        MENUITEM "&Actualizar listado desde Internet\tCtrl+F5", ID_RESETDB
     END
 END
 
-IDD_SETTINGS_DIALOG DIALOGEX 0, 0, 250, 215
+IDD_SETTINGS_DIALOG DIALOGEX 0, 0, 250, 200
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Ajustes"
 FONT 8, "MS Shell Dlg"
@@ -69,16 +69,16 @@ BEGIN
     EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL
     PUSHBUTTON "&Seleccionar", IDC_CHOOSE, 187, 85, 50, 14
     AUTOCHECKBOX "&Borrar el instalador del programa tras su instalación", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12
-    GROUPBOX "Proxy", -1, 4, 116, 240, 76
-    CONTROL "System proxy settings", IDC_PROXY_DEFAULT, "Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 130, 210, 10
-    CONTROL "Direct (No proxy)", IDC_NO_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 145, 210, 10
-    CONTROL "Proxy", IDC_USE_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 160, 74, 10
-    EDITTEXT IDC_PROXY_SERVER, 90, 160, 147, 12, ES_AUTOHSCROLL | WS_DISABLED
-    LTEXT "No proxy for", -1, 27, 175, 64, 10
-    EDITTEXT IDC_NO_PROXY_FOR, 90, 175, 147, 12, ES_AUTOHSCROLL | WS_DISABLED
-    PUSHBUTTON "Por defecto", IDC_DEFAULT_SETTINGS, 8, 195, 60, 14
-    PUSHBUTTON "Aceptar", IDOK, 116, 195, 60, 14
-    PUSHBUTTON "Cancelar", IDCANCEL, 181, 195, 60, 14
+    GROUPBOX "Proxy", -1, 4, 116, 240, 61
+    CONTROL "Utilizar el proxy del sistema", IDC_PROXY_DEFAULT, "Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 128, 218, 10
+    CONTROL "Conexión directa (sin nada)", IDC_NO_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 141, 218, 10
+    CONTROL "Proxy:", IDC_USE_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 154, 35, 10
+    EDITTEXT IDC_PROXY_SERVER, 51, 153, 70, 14, ES_AUTOHSCROLL
+    LTEXT "Sin proxy para:", -1, 125, 154, 50, 8, SS_RIGHT
+    EDITTEXT IDC_NO_PROXY_FOR, 177, 153, 61, 14, ES_AUTOHSCROLL
+    PUSHBUTTON "Por defecto", IDC_DEFAULT_SETTINGS, 8, 180, 60, 14
+    PUSHBUTTON "Aceptar", IDOK, 116, 180, 60, 14
+    PUSHBUTTON "Cancelar", IDCANCEL, 181, 180, 60, 14
 END
 
 IDD_INSTALL_DIALOG DIALOGEX 0, 0, 216, 97
index ef5fda1..32ebd8f 100644 (file)
@@ -10,19 +10,19 @@ BEGIN
     END
     POPUP "&Programmes"
     BEGIN
-        MENUITEM "&Installer", ID_INSTALL
-        MENUITEM "&Désinstaller", ID_UNINSTALL
+        MENUITEM "&Installer\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Désinstaller\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modifier", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Supprimer du registre", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Rafraîchir", ID_REFRESH
+        MENUITEM "&Rafraîchir\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Me&ttre à jour la base", ID_RESETDB
+        MENUITEM "Me&ttre à jour la base\tCtrl+F5", ID_RESETDB
     END
     POPUP "Aide"
     BEGIN
-        MENUITEM "Aide", ID_HELP, GRAYED
+        MENUITEM "Aide\tF1", ID_HELP, GRAYED
         MENUITEM "À propos", ID_ABOUT
     END
 END
@@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Installer", ID_INSTALL
-        MENUITEM "&Désinstaller", ID_UNINSTALL
+        MENUITEM "&Installer\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Désinstaller\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modifier", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Supprimer du registre", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Rafraîchir", ID_REFRESH
+        MENUITEM "&Rafraîchir\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Me&ttre à jour la base", ID_RESETDB
+        MENUITEM "Me&ttre à jour la base\tCtrl+F5", ID_RESETDB
     END
 END
 
index 3992ef4..aa99f71 100644 (file)
@@ -12,19 +12,19 @@ BEGIN
     END
     POPUP "&תכניות"
     BEGIN
-        MENUITEM "התקנה", ID_INSTALL
-        MENUITEM "הסרה", ID_UNINSTALL
+        MENUITEM "התקנה\tCtrl+Enter", ID_INSTALL
+        MENUITEM "הסרה\tCtrl+Del", ID_UNINSTALL
         MENUITEM "שינוי", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "הסרה מהרשום", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "רענון", ID_REFRESH
+        MENUITEM "רענון\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
     POPUP "עזרה"
     BEGIN
-        MENUITEM "עזרה", ID_HELP, GRAYED
+        MENUITEM "עזרה\tF1", ID_HELP, GRAYED
         MENUITEM "אודות", ID_ABOUT
     END
 END
@@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "התקנה", ID_INSTALL
-        MENUITEM "הסרה", ID_UNINSTALL
+        MENUITEM "התקנה\tCtrl+Enter", ID_INSTALL
+        MENUITEM "הסרה\tCtrl+Del", ID_UNINSTALL
         MENUITEM "שינוי", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "הסרה מהרשום", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "רענן", ID_REFRESH
+        MENUITEM "רענן\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index 983676c..c72d504 100644 (file)
@@ -10,19 +10,19 @@ BEGIN
     END
     POPUP "&Programmi"
     BEGIN
-        MENUITEM "&Installa", ID_INSTALL
-        MENUITEM "&Disinstalla", ID_UNINSTALL
+        MENUITEM "&Installa\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Disinstalla\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modifica", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Remuovi da Registry", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Aggiorna", ID_REFRESH
+        MENUITEM "&Aggiorna\tF5", ID_REFRESH
         MENUITEM SEPARATOR
         MENUITEM "Update Da&tabase", ID_RESETDB
     END
     POPUP "?"
     BEGIN
-        MENUITEM "Guida", ID_HELP, GRAYED
+        MENUITEM "Guida\tF1", ID_HELP, GRAYED
         MENUITEM "Informazioni", ID_ABOUT
     END
 END
@@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Installa", ID_INSTALL
-        MENUITEM "&Disinstalla", ID_UNINSTALL
+        MENUITEM "&Installa\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Disinstalla\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modifica", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Rimuovi da Registry", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Aggiorna", ID_REFRESH
+        MENUITEM "&Aggiorna\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index a81e4f1..9e78007 100644 (file)
@@ -10,19 +10,19 @@ BEGIN
     END
     POPUP "プログラム(&P)"
     BEGIN
-        MENUITEM "インストール(&I)", ID_INSTALL
-        MENUITEM "アンインストール(&U)", ID_UNINSTALL
+        MENUITEM "インストール(&I)\tCtrl+Enter", ID_INSTALL
+        MENUITEM "アンインストール(&U)\tCtrl+Del", ID_UNINSTALL
         MENUITEM "変更(&M)", ID_MODIFY
         MENUITEM SEPARATOR
-        MENUITEM "レジストリから削除(&R)", ID_REGREMOVE
+        MENUITEM "レジストリから削除(&R)\tF5", ID_REGREMOVE
         MENUITEM SEPARATOR
         MENUITEM "更新(&R)", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "アップデート データベース(&T)", ID_RESETDB
+        MENUITEM "アップデート データベース(&T)\tCtrl+F5", ID_RESETDB
     END
     POPUP "ヘルプ"
     BEGIN
-        MENUITEM "ヘルプ", ID_HELP, GRAYED
+        MENUITEM "ヘルプ\tF1", ID_HELP, GRAYED
         MENUITEM "バージョン情報", ID_ABOUT
     END
 END
@@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "インストール(&I)", ID_INSTALL
-        MENUITEM "アンインストール(&U)", ID_UNINSTALL
+        MENUITEM "インストール(&I)\tCtrl+Enter", ID_INSTALL
+        MENUITEM "アンインストール(&U)\tCtrl+Del", ID_UNINSTALL
         MENUITEM "変更(&M)", ID_MODIFY
         MENUITEM SEPARATOR
-        MENUITEM "レジストリから削除(&R)", ID_REGREMOVE
+        MENUITEM "レジストリから削除(&R)\tF5", ID_REGREMOVE
         MENUITEM SEPARATOR
         MENUITEM "更新(&R)", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "アップデート データベース(&T)", ID_RESETDB
+        MENUITEM "アップデート データベース(&T)\tCtrl+F5", ID_RESETDB
     END
 END
 
index 621f4e4..9c2455f 100644 (file)
@@ -10,19 +10,19 @@ BEGIN
     END
     POPUP "&Programmer"
     BEGIN
-        MENUITEM "&Installere", ID_INSTALL
-        MENUITEM "&Avinstallere", ID_UNINSTALL
+        MENUITEM "&Installere\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Avinstallere\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Endre", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Remove from Registry", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Oppdatere", ID_REFRESH
+        MENUITEM "&Oppdatere\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
     POPUP "Hjelp"
     BEGIN
-        MENUITEM "Hjelp", ID_HELP, GRAYED
+        MENUITEM "Hjelp\tF1", ID_HELP, GRAYED
         MENUITEM "Om", ID_ABOUT
     END
 END
@@ -32,7 +32,7 @@ BEGIN
     POPUP "popup"
     BEGIN
         MENUITEM "&Åpne lenke i en nettleser", ID_OPEN_LINK
-        MENUITEM "&Kopier lenke  til utklipptavlen", ID_COPY_LINK
+        MENUITEM "&Kopier lenke til utklipptavlen", ID_COPY_LINK
     END
 END
 
@@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Installere", ID_INSTALL
-        MENUITEM "&Avinstallere", ID_UNINSTALL
+        MENUITEM "&Installere\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Avinstallere\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Endre", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Remove from Registry", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Oppdater", ID_REFRESH
+        MENUITEM "&Oppdater\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index 41acccd..c9afe6e 100644 (file)
@@ -18,19 +18,19 @@ BEGIN
     END
     POPUP "&Programy"
     BEGIN
-        MENUITEM "&Instaluj", ID_INSTALL
-        MENUITEM "&Odinstaluj", ID_UNINSTALL
+        MENUITEM "&Instaluj\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Odinstaluj\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modyfikuj", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Usuń z rejestru", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "O&dśwież", ID_REFRESH
+        MENUITEM "O&dśwież\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Ak&tualizuj bazę programów", ID_RESETDB
+        MENUITEM "Ak&tualizuj bazę programów\tCtrl+F5", ID_RESETDB
     END
     POPUP "Pomoc"
     BEGIN
-        MENUITEM "Pomoc", ID_HELP, GRAYED
+        MENUITEM "Pomoc\tF1", ID_HELP, GRAYED
         MENUITEM "O programie", ID_ABOUT
     END
 END
@@ -48,15 +48,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Instaluj", ID_INSTALL
-        MENUITEM "&Odinstaluj", ID_UNINSTALL
+        MENUITEM "&Instaluj\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Odinstaluj\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modyfikuj", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Usuń z rejestru", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Odśwież", ID_REFRESH
+        MENUITEM "&Odśwież\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Ak&tualizuj bazę programów", ID_RESETDB
+        MENUITEM "Ak&tualizuj bazę programów\tCtrl+F5", ID_RESETDB
     END
 END
 
index 4aa7a8d..b70b973 100644 (file)
@@ -12,19 +12,19 @@ BEGIN
     END
     POPUP "&Programas"
     BEGIN
-        MENUITEM "I&nstalar", ID_INSTALL
-        MENUITEM "&Desinstalar", ID_UNINSTALL
+        MENUITEM "I&nstalar\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Desinstalar\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modificar", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Remover do Registro", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "A&tualizar", ID_REFRESH
+        MENUITEM "A&tualizar\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
     POPUP "Aj&uda"
     BEGIN
-        MENUITEM "Aj&uda", ID_HELP, GRAYED
+        MENUITEM "Aj&uda\tF1", ID_HELP, GRAYED
         MENUITEM "&Sobre", ID_ABOUT
     END
 END
@@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Instalar", ID_INSTALL
-        MENUITEM "&Desinstalar", ID_UNINSTALL
+        MENUITEM "&Instalar\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Desinstalar\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modificar", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Remover do Registro", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Atualizar", ID_REFRESH
+        MENUITEM "&Atualizar\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index 6df30ed..9a49ec4 100644 (file)
@@ -16,19 +16,19 @@ BEGIN
     END
     POPUP "&Programe"
     BEGIN
-        MENUITEM "&Instalează", ID_INSTALL
-        MENUITEM "&Dezinstalează", ID_UNINSTALL
+        MENUITEM "&Instalează\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Dezinstalează\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modifică", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Elimină din registru", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "Împ&rospătează", ID_REFRESH
+        MENUITEM "Împ&rospătează\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "&Actualizează baza de date", ID_RESETDB
+        MENUITEM "&Actualizează baza de date\tCtrl+F5", ID_RESETDB
     END
     POPUP "Aj&utor"
     BEGIN
-        MENUITEM "&Manual…", ID_HELP, GRAYED
+        MENUITEM "&Manual…\tF1", ID_HELP, GRAYED
         MENUITEM "&Despre…", ID_ABOUT
     END
 END
@@ -46,15 +46,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Instalează", ID_INSTALL
-        MENUITEM "&Dezinstalează", ID_UNINSTALL
+        MENUITEM "&Instalează\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Dezinstalează\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modifică", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Elimină din registru", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "Împ&rospătează", ID_REFRESH
+        MENUITEM "Împ&rospătează\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "&Actualizează baza de date", ID_RESETDB
+        MENUITEM "&Actualizează baza de date\tCtrl+F5", ID_RESETDB
     END
 END
 
index f804460..9f4ba70 100644 (file)
@@ -10,19 +10,19 @@ BEGIN
     END
     POPUP "&Программы"
     BEGIN
-        MENUITEM "У&становить", ID_INSTALL
-        MENUITEM "&Удалить", ID_UNINSTALL
+        MENUITEM "У&становить\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Удалить\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Изменить", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "У&далить из реестра", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Обновить", ID_REFRESH
+        MENUITEM "&Обновить\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Обновить &базу данных", ID_RESETDB
+        MENUITEM "Обновить &базу данных\tCtrl+F5", ID_RESETDB
     END
     POPUP "Справка"
     BEGIN
-        MENUITEM "Содержание", ID_HELP, GRAYED
+        MENUITEM "Содержание\tF1", ID_HELP, GRAYED
         MENUITEM "О программе", ID_ABOUT
     END
 END
@@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Установить", ID_INSTALL
-        MENUITEM "&Удалить", ID_UNINSTALL
+        MENUITEM "&Установить\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Удалить\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Изменить", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "У&далить из реестра", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Обновить", ID_REFRESH
+        MENUITEM "&Обновить\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Обновить &базу данных", ID_RESETDB
+        MENUITEM "Обновить &базу данных\tCtrl+F5", ID_RESETDB
     END
 END
 
index 695c89b..b25ef95 100644 (file)
@@ -15,19 +15,19 @@ BEGIN
     END
     POPUP "&Programy"
     BEGIN
-        MENUITEM "&Inštalovať", ID_INSTALL
-        MENUITEM "O&dinštalovať", ID_UNINSTALL
+        MENUITEM "&Inštalovať\tCtrl+Enter", ID_INSTALL
+        MENUITEM "O&dinštalovať\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Zmeniť", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Odst&rániť z Registrov", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Obnoviť", ID_REFRESH
+        MENUITEM "&Obnoviť\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
     POPUP "Pomocník"
     BEGIN
-        MENUITEM "Pomocník", ID_HELP, GRAYED
+        MENUITEM "Pomocník\tF1", ID_HELP, GRAYED
         MENUITEM "Čo je ...", ID_ABOUT
     END
 END
@@ -45,15 +45,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Inštalovať", ID_INSTALL
-        MENUITEM "O&dinštalovať", ID_UNINSTALL
+        MENUITEM "&Inštalovať\tCtrl+Enter", ID_INSTALL
+        MENUITEM "O&dinštalovať\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Zmeniť", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Odst&rániť z Registrov", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Obnoviť", ID_REFRESH
+        MENUITEM "&Obnoviť\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index 74294f5..bfc4193 100644 (file)
@@ -14,19 +14,19 @@ BEGIN
     END
     POPUP "&Programe"
     BEGIN
-        MENUITEM "&Instalo", ID_INSTALL
-        MENUITEM "&Uninstall", ID_UNINSTALL
+        MENUITEM "&Instalo\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modifiko", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Hiq nga Regjistri", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Rifresko", ID_REFRESH
+        MENUITEM "&Rifresko\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
     POPUP "Ndihmë"
     BEGIN
-        MENUITEM "Ndihmë", ID_HELP, GRAYED
+        MENUITEM "Ndihmë\tF1", ID_HELP, GRAYED
         MENUITEM "Rreth", ID_ABOUT
     END
 END
@@ -44,15 +44,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Instalo", ID_INSTALL
-        MENUITEM "&Uninstall", ID_UNINSTALL
+        MENUITEM "&Instalo\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Modifiko", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Hiq nga Regjistri", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Rifresko", ID_REFRESH
+        MENUITEM "&Rifresko\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index a98f7e6..7d75243 100644 (file)
@@ -17,19 +17,19 @@ BEGIN
     END
     POPUP "&Program"
     BEGIN
-        MENUITEM "&Installera", ID_INSTALL
-        MENUITEM "&Avinstallera", ID_UNINSTALL
+        MENUITEM "&Installera\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Avinstallera\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Ändra", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Ta bort från Registret", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Uppdatera", ID_REFRESH
+        MENUITEM "&Uppdatera\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
     POPUP "Hjälp"
     BEGIN
-        MENUITEM "Hjälp", ID_HELP, GRAYED
+        MENUITEM "Hjälp\tF1", ID_HELP, GRAYED
         MENUITEM "Om...", ID_ABOUT
     END
 END
@@ -47,15 +47,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Installera", ID_INSTALL
-        MENUITEM "&Avinstallera", ID_UNINSTALL
+        MENUITEM "&Installera\tCtrl+Enter", ID_INSTALL
+        MENUITEM "&Avinstallera\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Ändra", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Ta bort från Registret", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Uppdatera", ID_REFRESH
+        MENUITEM "&Uppdatera\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index 4cc2bd6..a877484 100644 (file)
@@ -12,19 +12,19 @@ BEGIN
     END
     POPUP "Y&azılım"
     BEGIN
-        MENUITEM "&Kur", ID_INSTALL
-        MENUITEM "K&aldır", ID_UNINSTALL
+        MENUITEM "&Kur\tCtrl+Enter", ID_INSTALL
+        MENUITEM "K&aldır\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Değiştir", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Girişi Değer Defteri'nden Kaldır", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Yenile", ID_REFRESH
+        MENUITEM "&Yenile\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Ya&zılım Veri Tabanını Yenile", ID_RESETDB
+        MENUITEM "Ya&zılım Veri Tabanını Yenile\tCtrl+F5", ID_RESETDB
     END
     POPUP "&Yardım"
     BEGIN
-        MENUITEM "&Yardım", ID_HELP, GRAYED
+        MENUITEM "&Yardım\tF1", ID_HELP, GRAYED
         MENUITEM "&Üzerine...", ID_ABOUT
     END
 END
@@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Kur", ID_INSTALL
-        MENUITEM "K&aldır", ID_UNINSTALL
+        MENUITEM "&Kur\tCtrl+Enter", ID_INSTALL
+        MENUITEM "K&aldır\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Değiştir", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "&Girişi Değer Defteri'nden Kaldır", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Yenile", ID_REFRESH
+        MENUITEM "&Yenile\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Ya&zılım Veri Tabanını Yenile", ID_RESETDB
+        MENUITEM "Ya&zılım Veri Tabanını Yenile\tCtrl+F5", ID_RESETDB
     END
 END
 
index e91dc4a..07d9241 100644 (file)
@@ -18,19 +18,19 @@ BEGIN
     END
     POPUP "&Програми"
     BEGIN
-        MENUITEM "&Встановити", ID_INSTALL
-        MENUITEM "Вид&алити", ID_UNINSTALL
+        MENUITEM "&Встановити\tCtrl+Enter", ID_INSTALL
+        MENUITEM "Вид&алити\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Змінити", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Вида&лити з реєстру", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Оновити", ID_REFRESH
+        MENUITEM "&Оновити\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
     POPUP "&Довідка"
     BEGIN
-        MENUITEM "Дов&ідка", ID_HELP, GRAYED
+        MENUITEM "Дов&ідка\tF1", ID_HELP, GRAYED
         MENUITEM "Про про&граму...", ID_ABOUT
     END
 END
@@ -48,15 +48,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "&Встановити", ID_INSTALL
-        MENUITEM "В&идалити", ID_UNINSTALL
+        MENUITEM "&Встановити\tCtrl+Enter", ID_INSTALL
+        MENUITEM "В&идалити\tCtrl+Del", ID_UNINSTALL
         MENUITEM "&Змінити", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "Вид&алити з реєстру", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "&Оновити", ID_REFRESH
+        MENUITEM "&Оновити\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "Update Da&tabase", ID_RESETDB
+        MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
     END
 END
 
index a7860cb..32646da 100644 (file)
@@ -12,19 +12,19 @@ BEGIN
     END
     POPUP "程序(&P)"
     BEGIN
-        MENUITEM "安装(&I)", ID_INSTALL
-        MENUITEM "卸载(&U)", ID_UNINSTALL
+        MENUITEM "安装(&I)\tCtrl+Enter", ID_INSTALL
+        MENUITEM "卸载(&U)\tCtrl+Del", ID_UNINSTALL
         MENUITEM "修改(&M)", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "从注册表删除(&E)", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "刷新(&R)", ID_REFRESH
+        MENUITEM "刷新(&R)\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "更新数据库(&A)", ID_RESETDB
+        MENUITEM "更新数据库(&A)\tCtrl+F5", ID_RESETDB
     END
     POPUP "帮助"
     BEGIN
-        MENUITEM "帮助内容", ID_HELP, GRAYED
+        MENUITEM "帮助内容\tF1", ID_HELP, GRAYED
         MENUITEM "关于", ID_ABOUT
     END
 END
@@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "安装(&I)", ID_INSTALL
-        MENUITEM "卸载(&U)", ID_UNINSTALL
+        MENUITEM "安装(&I)\tCtrl+Enter", ID_INSTALL
+        MENUITEM "卸载(&U)\tCtrl+Del", ID_UNINSTALL
         MENUITEM "修改(&M)", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "从注册表删除(&E)", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "刷新(&R)", ID_REFRESH
+        MENUITEM "刷新(&R)\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "更新数据库(&A)", ID_RESETDB
+        MENUITEM "更新数据库(&A)\tCtrl+F5", ID_RESETDB
     END
 END
 
index ff35a06..1f0c600 100644 (file)
@@ -12,19 +12,19 @@ BEGIN
     END
     POPUP "程式(&P)"
     BEGIN
-        MENUITEM "安裝(&I)", ID_INSTALL
-        MENUITEM "解除安裝(&U)", ID_UNINSTALL
+        MENUITEM "安裝(&I)\tCtrl+Enter", ID_INSTALL
+        MENUITEM "解除安裝(&U)\tCtrl+Del", ID_UNINSTALL
         MENUITEM "修改(&M)", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "從登錄檔刪除(&E)", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "重新整理(&R)", ID_REFRESH
+        MENUITEM "重新整理(&R)\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "更新資料庫(&A)", ID_RESETDB
+        MENUITEM "更新資料庫(&A)\tCtrl+F5", ID_RESETDB
     END
     POPUP "幫助"
     BEGIN
-        MENUITEM "幫助內容", ID_HELP, GRAYED
+        MENUITEM "幫助內容\tF1", ID_HELP, GRAYED
         MENUITEM "關於", ID_ABOUT
     END
 END
@@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
 BEGIN
     POPUP "popup"
     BEGIN
-        MENUITEM "安裝(&I)", ID_INSTALL
-        MENUITEM "解除安裝(&U)", ID_UNINSTALL
+        MENUITEM "安裝(&I)\tCtrl+Enter", ID_INSTALL
+        MENUITEM "解除安裝(&U)\tCtrl+Del", ID_UNINSTALL
         MENUITEM "修改(&M)", ID_MODIFY
         MENUITEM SEPARATOR
         MENUITEM "從登錄檔刪除(&E)", ID_REGREMOVE
         MENUITEM SEPARATOR
-        MENUITEM "重新整理(&R)", ID_REFRESH
+        MENUITEM "重新整理(&R)\tF5", ID_REFRESH
         MENUITEM SEPARATOR
-        MENUITEM "更新資料庫(&A)", ID_RESETDB
+        MENUITEM "更新資料庫(&A)\tCtrl+F5", ID_RESETDB
     END
 END
 
index 7f7ba20..f875a86 100644 (file)
@@ -3,9 +3,11 @@
  * LICENSE:         GPL - See COPYING in the top level directory
  * FILE:            base/applications/rapps/misc.c
  * PURPOSE:         Misc functions
- * PROGRAMMERS:     Dmitry Chapyshev (dmitry@reactos.org)
+ * PROGRAMMERS:     Dmitry Chapyshev           (dmitry@reactos.org)
+ *                  Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
  */
 
+#include <ndk/rtlfuncs.h>
 #include "rapps.h"
 
 /* SESSION Operation */
@@ -13,6 +15,9 @@
 #define EXTRACT_EXTRACTFILES  0x00000002
 
 static HANDLE hLog = NULL;
+WCHAR szCachedINISectionLocale[MAX_PATH] = L"Section.";
+WCHAR szCachedINISectionLocaleNeutral[MAX_PATH] = {0};
+BYTE bCachedSectionStatus = FALSE;
 
 typedef struct
 {
@@ -168,6 +173,7 @@ ShowPopupMenu(HWND hwnd, UINT MenuID, UINT DefaultItem)
     mii.cbSize = sizeof(mii);
     mii.fMask = MIIM_STATE;
     GetMenuItemInfo(hPopupMenu, DefaultItem, FALSE, &mii);
+
     if (!(mii.fState & MFS_GRAYED))
         SetMenuDefaultItem(hPopupMenu, DefaultItem, FALSE);
 
@@ -392,3 +398,117 @@ WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg)
 
     return TRUE;
 }
+
+
+LPWSTR GetINIFullPath(LPCWSTR lpFileName)
+{
+           WCHAR szDir[MAX_PATH];
+    static WCHAR szBuffer[MAX_PATH];
+
+    GetStorageDirectory(szDir, _countof(szDir));
+    StringCbPrintfW(szBuffer, sizeof(szBuffer), L"%ls\\rapps\\%ls", szDir, lpFileName);
+
+    return szBuffer;
+}
+
+
+UINT ParserGetString(LPCWSTR lpKeyName, LPWSTR lpReturnedString, UINT nSize, LPCWSTR lpFileName)
+{
+    PWSTR lpFullFileName = GetINIFullPath(lpFileName);
+    LPSTR  lpRequiredBuf = HeapAlloc(GetProcessHeap(), 0, nSize);
+    DWORD dwResult;
+
+    if (!lpRequiredBuf)
+        return FALSE;
+
+    /* we don't have cached section strings for the current system language, create them */
+    if(bCachedSectionStatus == FALSE)
+    {
+        WCHAR szLocale[4 + 1];
+        DWORD len;
+
+        /* find out what is the current system lang code (e.g. "0a") and append it to SectionLocale */
+        GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_ILANGUAGE,
+                       szLocale, _countof(szLocale));
+
+        StringCbCatW(szCachedINISectionLocale, sizeof(szCachedINISectionLocale), szLocale);
+
+        /* copy the locale-dependent string into the buffer of the future neutral one */
+        StringCbCopyW(szCachedINISectionLocaleNeutral,
+                      sizeof(szCachedINISectionLocale),
+                      szCachedINISectionLocale);
+
+        /* turn "Section.0c0a" into "Section.0a", keeping just the neutral lang part */
+        len = wcslen(szCachedINISectionLocale);
+
+        memmove((szCachedINISectionLocaleNeutral + len) - 4,
+                (szCachedINISectionLocaleNeutral + len) - 2,
+                (2 * sizeof(WCHAR)) + sizeof(UNICODE_NULL));
+
+        /* finally, mark us as cache-friendly for the next time */
+        bCachedSectionStatus = TRUE;
+    }
+
+    /* 1st - find localized strings (e.g. "Section.0c0a") */
+    dwResult = GetPrivateProfileStringW(szCachedINISectionLocale,
+                                        lpKeyName,
+                                        NULL,
+                                        lpReturnedString,
+                                        nSize,
+                                        lpFullFileName);
+
+    if (dwResult != 0)
+        goto skip;
+
+    /* 2nd - if they weren't present check for neutral sub-langs/ generic translations (e.g. "Section.0a") */
+    dwResult = GetPrivateProfileStringW(szCachedINISectionLocaleNeutral,
+                                        lpKeyName,
+                                        NULL,
+                                        lpReturnedString,
+                                        nSize,
+                                        lpFullFileName);
+
+    if (dwResult != 0)
+        goto skip;
+
+    /* 3rd - if they weren't present fallback to standard english strings (just "Section") */
+    dwResult = GetPrivateProfileStringW(L"Section",
+                                        lpKeyName,
+                                        NULL,
+                                        lpReturnedString,
+                                        nSize,
+                                        lpFullFileName);
+
+    if (dwResult == 0)
+    {
+        HeapFree(GetProcessHeap(), 0, lpRequiredBuf);
+        return FALSE;
+    }
+
+skip:
+
+    /* get rid of the dynamically allocated ANSI buffer */
+    HeapFree(GetProcessHeap(), 0, lpRequiredBuf);
+
+    return TRUE;
+}
+
+UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName)
+{
+    WCHAR Buffer[30];
+    UNICODE_STRING BufferW;
+    ULONG Result;
+
+    /* grab the text version of our entry */
+    if (!ParserGetString(lpKeyName, Buffer, _countof(Buffer), lpFileName))
+        return FALSE;
+
+    if (!Buffer[0])
+        return FALSE;
+
+    /* convert it to an actual integer */
+    RtlInitUnicodeString(&BufferW, Buffer);
+    RtlUnicodeStringToInteger(&BufferW, 0, &Result);
+
+    return Result;
+}
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/parser.c b/reactos/base/applications/rapps/parser.c
deleted file mode 100644 (file)
index 60a3fb0..0000000
+++ /dev/null
@@ -1,750 +0,0 @@
-/*
- * PROJECT:         ReactOS Applications Manager
- * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            base/applications/rapps/parser.c
- * PURPOSE:         Parser functions
- * PROGRAMMERS:     Dmitry Chapyshev (dmitry@reactos.org)
- */
-
-#include "rapps.h"
-
-typedef LONG NTSTATUS;
-
-typedef struct _UNICODE_STRING {
-  USHORT Length;
-  USHORT MaximumLength;
-  PWSTR  Buffer;
-} UNICODE_STRING, *PUNICODE_STRING;
-
-void WINAPI RtlInitUnicodeString(PUNICODE_STRING,PCWSTR);
-NTSTATUS WINAPI RtlUnicodeStringToInteger(const UNICODE_STRING*,ULONG,ULONG*);
-BOOLEAN WINAPI RtlIsTextUnicode(LPCVOID,INT,INT*);
-
-static const char bom_utf8[] = {0xEF,0xBB,0xBF};
-
-typedef enum
-{
-    ENCODING_UTF8 = 1,
-    ENCODING_UTF16LE,
-    ENCODING_UTF16BE
-} ENCODING;
-
-typedef struct tagSECTIONKEY
-{
-    WCHAR *value;
-    struct tagSECTIONKEY *next;
-    WCHAR name[1];
-} SECTIONKEY;
-
-typedef struct tagSECTION
-{
-    struct tagSECTIONKEY *key;
-    struct tagSECTION *next;
-    WCHAR name[1];
-} SECTION;
-
-typedef struct
-{
-    BOOL changed;
-    SECTION *section;
-    WCHAR *filename;
-    ENCODING encoding;
-} ITEMS;
-
-
-#define N_CACHED_ITEMS 10
-static ITEMS *ItemsArray[N_CACHED_ITEMS] = {NULL};
-#define CurProfile (ItemsArray[0])
-#define IS_ENTRY_COMMENT(str)  ((str)[0] == ';')
-#define ParserIsSpace(c) (iswspace(c) || c == 0x1a)
-
-
-static
-WCHAR*
-memchrW(const WCHAR *ptr, WCHAR ch, size_t n)
-{
-    const WCHAR *end;
-    for (end = ptr + n; ptr < end; ptr++)
-        if (*ptr == ch)
-            return (WCHAR *)(ULONG_PTR)ptr;
-    return NULL;
-}
-
-static
-WCHAR
-*memrchrW(const WCHAR *ptr, WCHAR ch, size_t n)
-{
-    const WCHAR *end;
-    WCHAR *ret = NULL;
-    for (end = ptr + n; ptr < end; ptr++)
-        if (*ptr == ch)
-            ret = (WCHAR *)(ULONG_PTR)ptr;
-    return ret;
-}
-
-static
-void
-ParserCopyEntry(LPWSTR buffer, LPCWSTR value, int len, BOOL strip_quote)
-{
-    WCHAR quote = '\0';
-
-    if (!buffer) return;
-
-    if (strip_quote && ((*value == '\'') || (*value == '\"')))
-    {
-        if (value[1] && (value[wcslen(value)-1] == *value))
-            quote = *value++;
-    }
-
-    lstrcpynW(buffer, value, len);
-    if (quote && (len >= (int)wcslen(value))) buffer[wcslen(buffer)-1] = '\0';
-}
-
-static
-void
-ParserByteSwapShortBuffer(WCHAR * buffer, int len)
-{
-    int i;
-    USHORT * shortbuffer = buffer;
-    for (i = 0; i < len; i++)
-        shortbuffer[i] = (shortbuffer[i] >> 8) | (shortbuffer[i] << 8);
-}
-
-static
-void
-ParserWriteMarker(HANDLE hFile, ENCODING encoding)
-{
-    DWORD dwBytesWritten;
-    WCHAR bom;
-
-    switch (encoding)
-    {
-        case ENCODING_UTF8:
-            WriteFile(hFile, bom_utf8, sizeof(bom_utf8), &dwBytesWritten, NULL);
-            break;
-
-        case ENCODING_UTF16LE:
-            bom = 0xFEFF;
-            WriteFile(hFile, &bom, sizeof(bom), &dwBytesWritten, NULL);
-            break;
-
-        case ENCODING_UTF16BE:
-            bom = 0xFFFE;
-            WriteFile(hFile, &bom, sizeof(bom), &dwBytesWritten, NULL);
-            break;
-    }
-}
-
-static
-void
-ParserWriteLine(HANDLE hFile, WCHAR * szLine, int len, ENCODING encoding)
-{
-    char * write_buffer;
-    int write_buffer_len;
-    DWORD dwBytesWritten;
-
-    switch (encoding)
-    {
-        case ENCODING_UTF8:
-            write_buffer_len = WideCharToMultiByte(CP_UTF8, 0, szLine, len, NULL, 0, NULL, NULL);
-            write_buffer = HeapAlloc(GetProcessHeap(), 0, write_buffer_len);
-            if (!write_buffer) return;
-            len = WideCharToMultiByte(CP_UTF8, 0, szLine, len, write_buffer, write_buffer_len, NULL, NULL);
-            WriteFile(hFile, write_buffer, len, &dwBytesWritten, NULL);
-            HeapFree(GetProcessHeap(), 0, write_buffer);
-            break;
-
-        case ENCODING_UTF16LE:
-            WriteFile(hFile, szLine, len * sizeof(WCHAR), &dwBytesWritten, NULL);
-            break;
-
-        case ENCODING_UTF16BE:
-            ParserByteSwapShortBuffer(szLine, len);
-            WriteFile(hFile, szLine, len * sizeof(WCHAR), &dwBytesWritten, NULL);
-            break;
-    }
-}
-
-static
-void
-ParserSave(HANDLE hFile, const SECTION *section, ENCODING encoding)
-{
-    SECTIONKEY *key;
-    WCHAR *buffer, *p;
-
-    ParserWriteMarker(hFile, encoding);
-
-    for ( ; section; section = section->next)
-    {
-        size_t len = 0;
-        size_t remaining;
-
-        if (section->name[0]) len += wcslen(section->name) + 4;
-
-        for (key = section->key; key; key = key->next)
-        {
-            len += wcslen(key->name) + 2;
-            if (key->value) len += wcslen(key->value) + 1;
-        }
-
-        buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-        if (!buffer) return;
-
-        p = buffer;
-        remaining = len;
-        if (section->name[0])
-        {
-            StringCchPrintfExW(p, remaining, &p, &remaining, 0,
-                               L"[%ls]\r\n",
-                               section->name);
-        }
-
-        for (key = section->key; key; key = key->next)
-        {
-            if (key->value)
-            {
-                StringCchPrintfExW(p, remaining, &p, &remaining, 0,
-                                   L"%ls=%ls\r\n",
-                                   key->name, key->value);
-            }
-            else
-            {
-                StringCchPrintfExW(p, remaining, &p, &remaining, 0,
-                                   L"%ls\r\n",
-                                   key->name);
-            }
-        }
-        ParserWriteLine(hFile, buffer, len, encoding);
-        HeapFree(GetProcessHeap(), 0, buffer);
-    }
-}
-
-static
-void
-ParserFree(SECTION *section)
-{
-    SECTION *next_section;
-    SECTIONKEY *key, *next_key;
-
-    for ( ; section; section = next_section)
-    {
-        for (key = section->key; key; key = next_key)
-        {
-            next_key = key->next;
-            HeapFree(GetProcessHeap(), 0, key->value);
-            HeapFree(GetProcessHeap(), 0, key);
-        }
-        next_section = section->next;
-        HeapFree(GetProcessHeap(), 0, section);
-    }
-}
-
-static
-ENCODING
-ParserDetectTextEncoding(const void * buffer, int * len)
-{
-    INT flags = IS_TEXT_UNICODE_SIGNATURE |
-                IS_TEXT_UNICODE_REVERSE_SIGNATURE |
-                IS_TEXT_UNICODE_ODD_LENGTH;
-
-    if (*len >= sizeof(bom_utf8) && !memcmp(buffer, bom_utf8, sizeof(bom_utf8)))
-    {
-        *len = sizeof(bom_utf8);
-        return ENCODING_UTF8;
-    }
-
-    RtlIsTextUnicode((void *)buffer, *len, &flags);
-
-    if (flags & IS_TEXT_UNICODE_SIGNATURE)
-    {
-        *len = sizeof(WCHAR);
-        return ENCODING_UTF16LE;
-    }
-
-    if (flags & IS_TEXT_UNICODE_REVERSE_SIGNATURE)
-    {
-        *len = sizeof(WCHAR);
-        return ENCODING_UTF16BE;
-    }
-
-    *len = 0;
-
-    return ENCODING_UTF8;
-}
-
-static
-SECTION
-*ParserLoad(HANDLE hFile, ENCODING * pEncoding)
-{
-    void *buffer_base, *pBuffer;
-    WCHAR * szFile;
-    const WCHAR *szLineStart, *szLineEnd;
-    const WCHAR *szValueStart, *szEnd, *next_line;
-    int line = 0, len;
-    SECTION *section, *first_section;
-    SECTION **next_section;
-    SECTIONKEY *key, *prev_key, **next_key;
-    DWORD dwFileSize;
-
-    dwFileSize = GetFileSize(hFile, NULL);
-    if (dwFileSize == INVALID_FILE_SIZE || dwFileSize == 0)
-        return NULL;
-
-    buffer_base = HeapAlloc(GetProcessHeap(), 0 , dwFileSize);
-    if (!buffer_base)
-        return NULL;
-
-    if (!ReadFile(hFile, buffer_base, dwFileSize, &dwFileSize, NULL))
-    {
-        HeapFree(GetProcessHeap(), 0, buffer_base);
-        return NULL;
-    }
-
-    len = dwFileSize;
-    *pEncoding = ParserDetectTextEncoding(buffer_base, &len);
-
-    pBuffer = (char *)buffer_base + len;
-    dwFileSize -= len;
-
-    switch (*pEncoding)
-    {
-        case ENCODING_UTF8:
-            len = MultiByteToWideChar(CP_UTF8, 0, pBuffer, dwFileSize, NULL, 0);
-            szFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-            if (!szFile)
-            {
-                HeapFree(GetProcessHeap(), 0, buffer_base);
-                return NULL;
-            }
-            MultiByteToWideChar(CP_UTF8, 0, pBuffer, dwFileSize, szFile, len);
-            szEnd = szFile + len;
-            break;
-
-        case ENCODING_UTF16LE:
-            szFile = pBuffer;
-            szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
-            break;
-
-        case ENCODING_UTF16BE:
-            szFile = pBuffer;
-            szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
-            ParserByteSwapShortBuffer(szFile, dwFileSize / sizeof(WCHAR));
-            break;
-
-        default:
-            HeapFree(GetProcessHeap(), 0, buffer_base);
-            return NULL;
-    }
-
-    first_section = HeapAlloc(GetProcessHeap(), 0, sizeof(*section));
-    if (first_section == NULL)
-    {
-        if (szFile != pBuffer)
-            HeapFree(GetProcessHeap(), 0, szFile);
-        HeapFree(GetProcessHeap(), 0, buffer_base);
-        return NULL;
-    }
-
-    first_section->name[0] = 0;
-    first_section->key  = NULL;
-    first_section->next = NULL;
-    next_section = &first_section->next;
-    next_key = &first_section->key;
-    prev_key = NULL;
-    next_line = szFile;
-
-    while (next_line < szEnd)
-    {
-        szLineStart = next_line;
-        next_line = memchrW(szLineStart, '\n', szEnd - szLineStart);
-        if (!next_line) next_line = memchrW(szLineStart, '\r', szEnd - szLineStart);
-        if (!next_line) next_line = szEnd;
-        else next_line++;
-        szLineEnd = next_line;
-
-        line++;
-
-        while (szLineStart < szLineEnd && ParserIsSpace(*szLineStart)) szLineStart++;
-        while ((szLineEnd > szLineStart) && ParserIsSpace(szLineEnd[-1])) szLineEnd--;
-
-        if (szLineStart >= szLineEnd)
-            continue;
-
-        if (*szLineStart == '[')
-        {
-            const WCHAR * szSectionEnd;
-            if ((szSectionEnd = memrchrW(szLineStart, ']', szLineEnd - szLineStart)))
-            {
-                szLineStart++;
-                len = (int)(szSectionEnd - szLineStart);
-                if (!(section = HeapAlloc(GetProcessHeap(), 0, sizeof(*section) + len * sizeof(WCHAR))))
-                    break;
-                memcpy(section->name, szLineStart, len * sizeof(WCHAR));
-                section->name[len] = '\0';
-                section->key  = NULL;
-                section->next = NULL;
-                *next_section = section;
-                next_section = &section->next;
-                next_key = &section->key;
-                prev_key = NULL;
-
-                continue;
-            }
-        }
-
-        len = szLineEnd - szLineStart;
-        if ((szValueStart = memchrW(szLineStart, '=', szLineEnd - szLineStart)) != NULL)
-        {
-            const WCHAR *szNameEnd = szValueStart;
-            while ((szNameEnd > szLineStart) && ParserIsSpace(szNameEnd[-1])) szNameEnd--;
-            len = szNameEnd - szLineStart;
-            szValueStart++;
-            while (szValueStart < szLineEnd && ParserIsSpace(*szValueStart)) szValueStart++;
-        }
-
-        if (len || !prev_key || *prev_key->name)
-        {
-            if (!(key = HeapAlloc(GetProcessHeap(), 0, sizeof(*key) + len * sizeof(WCHAR)))) break;
-            memcpy(key->name, szLineStart, len * sizeof(WCHAR));
-            key->name[len] = '\0';
-            if (szValueStart)
-            {
-                len = (int)(szLineEnd - szValueStart);
-                key->value = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
-                memcpy(key->value, szValueStart, len * sizeof(WCHAR));
-                key->value[len] = '\0';
-            }
-            else key->value = NULL;
-
-           key->next  = NULL;
-           *next_key  = key;
-           next_key   = &key->next;
-           prev_key   = key;
-        }
-    }
-
-    if (szFile != pBuffer)
-        HeapFree(GetProcessHeap(), 0, szFile);
-    HeapFree(GetProcessHeap(), 0, buffer_base);
-
-    return first_section;
-}
-
-static
-SECTIONKEY
-*ParserFind(SECTION **section, LPCWSTR section_name, LPCWSTR key_name, BOOL create, BOOL create_always)
-{
-    LPCWSTR p;
-    DWORD cch;
-    int seclen, keylen;
-
-    while (ParserIsSpace(*section_name)) section_name++;
-    if (*section_name)
-        p = section_name + wcslen(section_name) - 1;
-    else
-        p = section_name;
-
-    while ((p > section_name) && ParserIsSpace(*p)) p--;
-    seclen = p - section_name + 1;
-
-    while (ParserIsSpace(*key_name)) key_name++;
-    if (*key_name)
-        p = key_name + wcslen(key_name) - 1;
-    else
-        p = key_name;
-
-    while ((p > key_name) && ParserIsSpace(*p)) p--;
-    keylen = p - key_name + 1;
-
-    while (*section)
-    {
-        if (((*section)->name[0])
-             && (!(_wcsnicmp((*section)->name, section_name, seclen)))
-             && (((*section)->name)[seclen] == '\0'))
-        {
-            SECTIONKEY **key = &(*section)->key;
-
-            while (*key)
-            {
-                if(!create_always)
-                {
-                    if ((!(_wcsnicmp((*key)->name, key_name, keylen)))
-                         && (((*key)->name)[keylen] == '\0'))
-                        return *key;
-                }
-                key = &(*key)->next;
-            }
-            if (!create)
-                return NULL;
-            cch = wcslen(key_name) + 1;
-            if (!(*key = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(SECTIONKEY, name) + cch * sizeof(WCHAR))))
-                return NULL;
-            StringCchCopyW((*key)->name, cch, key_name);
-            (*key)->value = NULL;
-            (*key)->next  = NULL;
-            return *key;
-        }
-        section = &(*section)->next;
-    }
-    if (!create) return NULL;
-    cch = wcslen(section_name) + 1;
-    *section = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(SECTION, name) + cch * sizeof(WCHAR));
-    if (*section == NULL) return NULL;
-    StringCchCopyW((*section)->name, cch, section_name);
-    (*section)->next = NULL;
-    cch = wcslen(key_name) + 1;
-    if (!((*section)->key  = HeapAlloc(GetProcessHeap(), 0,
-                                        FIELD_OFFSET(SECTIONKEY, name) + cch * sizeof(WCHAR))))
-    {
-        HeapFree(GetProcessHeap(), 0, *section);
-        return NULL;
-    }
-    StringCchCopyW((*section)->key->name, cch, key_name);
-    (*section)->key->value = NULL;
-    (*section)->key->next  = NULL;
-    return (*section)->key;
-}
-
-static
-BOOL
-ParserFlushFile(void)
-{
-    HANDLE hFile = NULL;
-
-    if (!CurProfile) return FALSE;
-
-    if (!CurProfile->changed) return TRUE;
-
-    hFile = CreateFileW(CurProfile->filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
-                        NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-
-    if (hFile == INVALID_HANDLE_VALUE) return FALSE;
-
-    ParserSave(hFile, CurProfile->section, CurProfile->encoding);
-
-    CloseHandle(hFile);
-    CurProfile->changed = FALSE;
-    return TRUE;
-}
-
-static
-void
-ParserReleaseFile(void)
-{
-    ParserFlushFile();
-    ParserFree(CurProfile->section);
-    HeapFree(GetProcessHeap(), 0, CurProfile->filename);
-    CurProfile->changed = FALSE;
-    CurProfile->section = NULL;
-    CurProfile->filename = NULL;
-    CurProfile->encoding = ENCODING_UTF8;
-}
-
-static
-BOOL
-ParserOpen(LPCWSTR filename, BOOL write_access)
-{
-    WCHAR szDir[MAX_PATH];
-    WCHAR buffer[MAX_PATH];
-    DWORD cch;
-    HANDLE hFile = INVALID_HANDLE_VALUE;
-    int i, j;
-    ITEMS *tempProfile;
-
-    if (!CurProfile)
-        for (i = 0; i < N_CACHED_ITEMS; i++)
-        {
-            ItemsArray[i] = HeapAlloc(GetProcessHeap(), 0, sizeof(ITEMS));
-            if (ItemsArray[i] == NULL) break;
-            ItemsArray[i]->changed = FALSE;
-            ItemsArray[i]->section = NULL;
-            ItemsArray[i]->filename = NULL;
-            ItemsArray[i]->encoding = ENCODING_UTF8;
-        }
-
-    if (!GetStorageDirectory(szDir, sizeof(szDir) / sizeof(szDir[0])))
-        return FALSE;
-
-    if (FAILED(StringCbPrintfW(buffer, sizeof(buffer),
-                               L"%ls\\rapps\\%ls",
-                               szDir, filename)))
-    {
-        return FALSE;
-    }
-
-    hFile = CreateFileW(buffer, GENERIC_READ | (write_access ? GENERIC_WRITE : 0),
-                        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
-                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-
-    if ((hFile == INVALID_HANDLE_VALUE) && (GetLastError() != ERROR_FILE_NOT_FOUND))
-    {
-        return FALSE;
-    }
-
-    for (i = 0; i < N_CACHED_ITEMS; i++)
-    {
-        if ((ItemsArray[i]->filename && !wcscmp(buffer, ItemsArray[i]->filename)))
-        {
-            if (i)
-            {
-                ParserFlushFile();
-                tempProfile = ItemsArray[i];
-                for (j = i; j > 0; j--)
-                    ItemsArray[j] = ItemsArray[j - 1];
-                CurProfile = tempProfile;
-            }
-            if (hFile != INVALID_HANDLE_VALUE)
-            {
-                CloseHandle(hFile);
-            }
-
-            return TRUE;
-        }
-    }
-
-    ParserFlushFile();
-
-    if (i == N_CACHED_ITEMS)
-    {
-        tempProfile = ItemsArray[N_CACHED_ITEMS - 1];
-        for (i = N_CACHED_ITEMS - 1; i > 0; i--)
-            ItemsArray[i] = ItemsArray[i - 1];
-        CurProfile = tempProfile;
-    }
-
-    if (CurProfile->filename) ParserReleaseFile();
-
-    cch = wcslen(buffer) + 1;
-    CurProfile->filename = HeapAlloc(GetProcessHeap(), 0, cch * sizeof(WCHAR));
-    if (CurProfile->filename == NULL)
-    {
-        if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile);
-        return FALSE;
-    }
-
-    StringCchCopyW(CurProfile->filename, cch, buffer);
-
-    if (hFile != INVALID_HANDLE_VALUE)
-    {
-        CurProfile->section = ParserLoad(hFile, &CurProfile->encoding);
-        CloseHandle(hFile);
-    }
-    return TRUE;
-}
-
-static
-INT
-ParserGetSection(SECTION *section, LPCWSTR section_name, LPWSTR buffer, UINT len, BOOL return_values)
-{
-    SECTIONKEY *key;
-
-    if (!buffer)
-        return 0;
-
-    while (section)
-    {
-        if (section->name[0] && !_wcsicmp(section->name, section_name))
-        {
-            UINT oldlen = len;
-            for (key = section->key; key; key = key->next)
-            {
-                if (len <= 2) break;
-                if (!*key->name) continue;  /* Skip empty lines */
-                if (IS_ENTRY_COMMENT(key->name)) continue;  /* Skip comments */
-                if (!return_values && !key->value) continue;  /* Skip lines w.o. '=' */
-
-                ParserCopyEntry(buffer, key->name, len - 1, 0);
-                len -= wcslen(buffer) + 1;
-                buffer += wcslen(buffer) + 1;
-
-                if (len < 2) break;
-                if (return_values && key->value)
-                {
-                    buffer[-1] = '=';
-                    ParserCopyEntry(buffer, key->value, len - 1, 0);
-                    len -= wcslen(buffer) + 1;
-                    buffer += wcslen(buffer) + 1;
-                }
-            }
-            *buffer = '\0';
-            if (len <= 1)
-            {
-                buffer[-1] = '\0';
-                return oldlen - 2;
-            }
-            return oldlen - len;
-        }
-        section = section->next;
-    }
-    buffer[0] = buffer[1] = '\0';
-    return 0;
-}
-
-static
-INT
-ParserInternalGetString(LPCWSTR section, LPCWSTR key_name, LPWSTR buffer, UINT len)
-{
-    SECTIONKEY *key = NULL;
-    static const WCHAR empty_strW[] = { 0 };
-
-    if (!buffer || !len) return 0;
-
-    if (key_name)
-    {
-        if (!key_name[0])
-        {
-            ParserCopyEntry(buffer, empty_strW, len, TRUE);
-            return wcslen(buffer);
-        }
-        key = ParserFind(&CurProfile->section, section, key_name, FALSE, FALSE);
-        ParserCopyEntry(buffer, (key && key->value) ? key->value : empty_strW,
-                           len, TRUE);
-        return wcslen(buffer);
-    }
-
-    if (section && section[0])
-    {
-        INT ret = ParserGetSection(CurProfile->section, section, buffer, len, FALSE);
-        if (!buffer[0])
-        {
-            ParserCopyEntry(buffer, empty_strW, len, TRUE);
-            ret = wcslen(buffer);
-        }
-        return ret;
-    }
-
-    buffer[0] = '\0';
-    return 0;
-}
-
-INT
-ParserGetString(LPCWSTR Section, LPCWSTR ValueName, LPWSTR Buffer, UINT Len, LPCWSTR FileName)
-{
-    if (Section == NULL) return 0;
-
-    if (ParserOpen(FileName, FALSE))
-        return ParserInternalGetString(Section, ValueName, Buffer, Len);
-
-    return 0;
-}
-
-UINT
-ParserGetInt(LPCWSTR Section, LPCWSTR ValueName, LPCWSTR FileName)
-{
-    WCHAR Buffer[30];
-    UNICODE_STRING BufferW;
-    ULONG Result;
-
-    if (!ParserGetString(Section,
-                         ValueName,
-                         Buffer,
-                         sizeof(Buffer) / sizeof(WCHAR),
-                         FileName))
-        return -1;
-
-    if (!Buffer[0]) return -1;
-
-    RtlInitUnicodeString(&BufferW, Buffer);
-    RtlUnicodeStringToInteger(&BufferW, 0, &Result);
-    return Result;
-}
index 0e2839a..3f0b71f 100644 (file)
@@ -81,6 +81,14 @@ typedef struct
     WCHAR szUrlDownload[MAX_PATH];
     WCHAR szCDPath[MAX_PATH];
 
+    /* caching mechanism related entries */
+    WCHAR cFileName[MAX_PATH];
+    FILETIME ftCacheStamp;
+    LIST_ENTRY List;
+
+    /* optional integrity checks */
+    BYTE MD5Checksum[16];
+
 } APPLICATION_INFO, *PAPPLICATION_INFO;
 
 typedef struct
@@ -166,9 +174,8 @@ VOID InitLogs(VOID);
 VOID FreeLogs(VOID);
 BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg);
 
-/* parser.c */
-INT ParserGetString(LPCWSTR section, LPCWSTR entry, LPWSTR buffer, UINT len, LPCWSTR filename);
-UINT ParserGetInt(LPCWSTR section, LPCWSTR entry, LPCWSTR filename);
+UINT ParserGetString(LPCWSTR lpKeyName, LPWSTR lpReturnedString, UINT nSize, LPCWSTR lpFileName);
+UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName);
 
 /* richedit.c */
 extern HWND hRichEdit;
index 6d9f883..d151ab8 100644 (file)
@@ -39,6 +39,16 @@ IDI_CAT_SCIENCE ICON "res/cats/science.ico"
 IDI_CAT_TOOLS ICON "res/cats/tools.ico"
 IDI_CAT_VIDEO ICON "res/cats/video.ico"
 
+/* Accelerators -- key bindings */
+HOTKEYS ACCELERATORS
+{
+  VK_F1,     ID_HELP,               VIRTKEY
+  VK_F5,     ID_REFRESH,            VIRTKEY
+  VK_F5,     ID_RESETDB,   CONTROL, VIRTKEY
+  VK_DELETE, ID_UNINSTALL, CONTROL, VIRTKEY
+  VK_RETURN, ID_INSTALL,   CONTROL, VIRTKEY
+}
+
 #include <reactos/manifest_exe.rc>
 
 #include <rappsmsg.rc>
index bda33f7..e6070e0 100644 (file)
 #define IDS_CAT_TOOLS            713
 #define IDS_CAT_VIDEO            714
 
+/* Accelerators */
+#define HOTKEYS                  715
+
 /* Other */
 #ifndef IDC_STATIC
 #define IDC_STATIC               -1
index fdbb2a3..2e2c9e8 100644 (file)
@@ -3,12 +3,12 @@
  * LICENSE:         GPL - See COPYING in the top level directory
  * FILE:            base/applications/rapps/winmain.c
  * PURPOSE:         Main program
- * PROGRAMMERS:     Dmitry Chapyshev (dmitry@reactos.org)
+ * PROGRAMMERS:     Dmitry Chapyshev           (dmitry@reactos.org)
+ *                  Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
  */
 
-#include "rapps.h"
-
 #include <shellapi.h>
+#include "rapps.h"
 
 #define SEARCH_TIMER_ID 'SR'
 
@@ -49,7 +49,7 @@ FillDefaultSettings(PSETTINGS_INFO pSettingsInfo)
 
     pSettingsInfo->Proxy = 0;
     StringCbCopyW(pSettingsInfo->szProxyServer, sizeof(pSettingsInfo->szProxyServer), L"");
-    StringCbCopyW(pSettingsInfo->szNoProxyFor, sizeof(pSettingsInfo->szNoProxyFor), L"");
+    StringCbCopyW(pSettingsInfo->szNoProxyFor,  sizeof(pSettingsInfo->szNoProxyFor),  L"");
 }
 
 static BOOL
@@ -138,6 +138,7 @@ EnumInstalledAppProc(INT ItemIndex, LPWSTR lpName, PINSTALLED_INFO Info)
     /* Get version info */
     GetApplicationString(ItemInfo->hSubKey, L"DisplayVersion", szText);
     ListView_SetItemText(hListView, Index, 1, szText);
+
     /* Get comments */
     GetApplicationString(ItemInfo->hSubKey, L"Comments", szText);
     ListView_SetItemText(hListView, Index, 2, szText);
@@ -164,7 +165,6 @@ BOOL
 CALLBACK
 EnumAvailableAppProc(PAPPLICATION_INFO Info)
 {
-    PAPPLICATION_INFO ItemInfo;
     INT Index;
 
     if (!SearchPatternMatch(Info->szName, szSearchPattern) &&
@@ -175,16 +175,12 @@ EnumAvailableAppProc(PAPPLICATION_INFO Info)
 
     /* Only add a ListView entry if...
          - no RegName was supplied (so we cannot determine whether the application is installed or not) or
-         - a RegName was supplied and the application is not installed
+         -  a RegName was supplied and the application is not installed
     */
     if (!*Info->szRegName || (!IsInstalledApplication(Info->szRegName, FALSE) && !IsInstalledApplication(Info->szRegName, TRUE)))
     {
-        ItemInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_INFO));
-        if (!ItemInfo) return FALSE;
-
-        RtlCopyMemory(ItemInfo, Info, sizeof(APPLICATION_INFO));
+        Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM)Info);
 
-        Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM)ItemInfo);
         ListView_SetItemText(hListView, Index, 1, Info->szVersion);
         ListView_SetItemText(hListView, Index, 2, Info->szDesc);
     }
@@ -245,13 +241,17 @@ UpdateApplicationsList(INT EnumType)
 
     SelectedEnumType = EnumType;
 
-    LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR));
+    LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, _countof(szBuffer2));
     StringCbPrintfW(szBuffer1, sizeof(szBuffer1),
                     szBuffer2,
                     ListView_GetItemCount(hListView));
     SetStatusBarText(szBuffer1);
 
     SetWelcomeText();
+
+    /* set automatic column width for program names if the list is not empty */
+    if (ListView_GetItemCount(hListView) > 0)
+        ListView_SetColumnWidth(hListView, 0, LVSCW_AUTOSIZE);
 }
 
 VOID
@@ -260,13 +260,13 @@ InitApplicationsList(VOID)
     WCHAR szText[MAX_STR_LEN];
 
     /* Add columns to ListView */
-    LoadStringW(hInst, IDS_APP_NAME, szText, sizeof(szText) / sizeof(WCHAR));
+    LoadStringW(hInst, IDS_APP_NAME, szText, _countof(szText));
     ListViewAddColumn(0, szText, 200, LVCFMT_LEFT);
 
-    LoadStringW(hInst, IDS_APP_INST_VERSION, szText, sizeof(szText) / sizeof(WCHAR));
+    LoadStringW(hInst, IDS_APP_INST_VERSION, szText, _countof(szText));
     ListViewAddColumn(1, szText, 90, LVCFMT_RIGHT);
 
-    LoadStringW(hInst, IDS_APP_DESCRIPTION, szText, sizeof(szText) / sizeof(WCHAR));
+    LoadStringW(hInst, IDS_APP_DESCRIPTION, szText, _countof(szText));
     ListViewAddColumn(3, szText, 250, LVCFMT_LEFT);
 
     UpdateApplicationsList(ENUM_ALL_COMPONENTS);
@@ -289,7 +289,7 @@ AddCategory(HTREEITEM hRootItem, UINT TextIndex, UINT IconIndex)
     Index = ImageList_AddIcon(hImageTreeView, hIcon);
     DestroyIcon(hIcon);
 
-    LoadStringW(hInst, TextIndex, szText, sizeof(szText) / sizeof(TCHAR));
+    LoadStringW(hInst, TextIndex, szText, _countof(szText));
 
     return TreeViewAddItem(hRootItem, szText, Index, Index, TextIndex);
 }
@@ -352,7 +352,7 @@ InitControls(HWND hwnd)
 
         InitCategoriesList();
 
-        LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR));
+        LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, _countof(szBuffer2));
         StringCbPrintfW(szBuffer1, sizeof(szBuffer1),
                         szBuffer2,
                         ListView_GetItemCount(hListView));
@@ -385,7 +385,7 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
             {
                 WCHAR szWndText[MAX_STR_LEN];
 
-                LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
+                LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf));
                 GetWindowTextW(hSearchBar, szWndText, MAX_STR_LEN);
                 if (wcscmp(szBuf, szWndText) == 0)
                 {
@@ -400,7 +400,7 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
                 GetWindowTextW(hSearchBar, szBuf, MAX_STR_LEN);
                 if (wcslen(szBuf) < 1)
                 {
-                    LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
+                    LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf));
                     SearchEnabled = FALSE;
                     SetWindowTextW(hSearchBar, szBuf);
                 }
@@ -417,7 +417,7 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
                     break;
                 }
 
-                LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
+                LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf));
                 GetWindowTextW(hSearchBar, szWndText, MAX_STR_LEN);
                 if (wcscmp(szBuf, szWndText) != 0)
                 {
@@ -607,12 +607,12 @@ BOOL IsSelectedNodeInstalled(void)
 LRESULT CALLBACK
 MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
 {
+
     switch (Msg)
     {
         case WM_CREATE:
             if (!InitControls(hwnd))
                 PostMessage(hwnd, WM_CLOSE, 0, 0);
-
             break;
 
         case WM_COMMAND:
@@ -801,7 +801,8 @@ MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
                 {
                     if (data->hwndFrom == hListView && ((LPNMLISTVIEW)lParam)->iItem != -1)
                     {
-                        SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0);   //Won't do anything if the program is already installed
+                        /* this won't do anything if the program is already installed */
+                        SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0);
                     }
                 }
                 break;
@@ -902,6 +903,7 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
     WCHAR szWindowClass[] = L"ROSAPPMGR";
     WCHAR szWindowName[MAX_STR_LEN];
     HANDLE hMutex = NULL;
+    HACCEL KeyBrd;
     MSG Msg;
 
     switch (GetUserDefaultUILanguage())
@@ -949,7 +951,7 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
 
     if (RegisterClassExW(&WndClass) == (ATOM)0) goto Exit;
 
-    LoadStringW(hInst, IDS_APPTITLE, szWindowName, sizeof(szWindowName) / sizeof(WCHAR));
+    LoadStringW(hInst, IDS_APPTITLE, szWindowName, _countof(szWindowName));
 
     hMainWnd = CreateWindowExW(WS_EX_WINDOWEDGE,
                                szWindowClass,
@@ -973,15 +975,22 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
     if (SettingsInfo.bUpdateAtStart)
         UpdateAppsDB();
 
+    /* Load the menu hotkeys */
+    KeyBrd = LoadAccelerators(NULL, MAKEINTRESOURCE(HOTKEYS));
+
     /* Message Loop */
     while (GetMessage(&Msg, NULL, 0, 0))
     {
-        TranslateMessage(&Msg);
-        DispatchMessage(&Msg);
+        if (!TranslateAccelerator(hMainWnd, KeyBrd, &Msg))
+        {
+            TranslateMessage(&Msg);
+            DispatchMessage(&Msg);
+        }
     }
 
 Exit:
-    if (hMutex) CloseHandle(hMutex);
+    if (hMutex)
+        CloseHandle(hMutex);
 
     return 0;
 }