From c7046c39bc0a518be6ede107ee3e872657d35903 Mon Sep 17 00:00:00 2001 From: Kamil Hornicek Date: Thu, 19 Mar 2015 19:26:14 +0000 Subject: [PATCH] [RAPPS] - 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 --- .../base/applications/rapps/CMakeLists.txt | 1 - .../base/applications/rapps/CreateCabFile.bat | 11 +- .../base/applications/rapps/CreateCabFile.sh | 10 +- reactos/base/applications/rapps/available.c | 167 ++-- reactos/base/applications/rapps/lang/bg-BG.rc | 18 +- reactos/base/applications/rapps/lang/cs-CZ.rc | 18 +- reactos/base/applications/rapps/lang/de-DE.rc | 18 +- reactos/base/applications/rapps/lang/en-US.rc | 18 +- reactos/base/applications/rapps/lang/es-ES.rc | 40 +- reactos/base/applications/rapps/lang/fr-FR.rc | 18 +- reactos/base/applications/rapps/lang/he-IL.rc | 18 +- reactos/base/applications/rapps/lang/it-IT.rc | 16 +- reactos/base/applications/rapps/lang/ja-JP.rc | 18 +- reactos/base/applications/rapps/lang/no-NO.rc | 20 +- reactos/base/applications/rapps/lang/pl-PL.rc | 18 +- reactos/base/applications/rapps/lang/pt-BR.rc | 18 +- reactos/base/applications/rapps/lang/ro-RO.rc | 18 +- reactos/base/applications/rapps/lang/ru-RU.rc | 18 +- reactos/base/applications/rapps/lang/sk-SK.rc | 18 +- reactos/base/applications/rapps/lang/sq-AL.rc | 18 +- reactos/base/applications/rapps/lang/sv-SE.rc | 18 +- reactos/base/applications/rapps/lang/tr-TR.rc | 18 +- reactos/base/applications/rapps/lang/uk-UA.rc | 18 +- reactos/base/applications/rapps/lang/zh-CN.rc | 18 +- reactos/base/applications/rapps/lang/zh-TW.rc | 18 +- reactos/base/applications/rapps/misc.c | 122 ++- reactos/base/applications/rapps/parser.c | 750 ------------------ reactos/base/applications/rapps/rapps.h | 13 +- reactos/base/applications/rapps/rapps.rc | 10 + reactos/base/applications/rapps/resource.h | 3 + reactos/base/applications/rapps/winmain.c | 61 +- 31 files changed, 506 insertions(+), 1042 deletions(-) delete mode 100644 reactos/base/applications/rapps/parser.c diff --git a/reactos/base/applications/rapps/CMakeLists.txt b/reactos/base/applications/rapps/CMakeLists.txt index 03e6c8f321e..25d0bd176c4 100644 --- a/reactos/base/applications/rapps/CMakeLists.txt +++ b/reactos/base/applications/rapps/CMakeLists.txt @@ -7,7 +7,6 @@ list(APPEND SOURCE listview.c loaddlg.c misc.c - parser.c richedit.c settingsdlg.c splitter.c diff --git a/reactos/base/applications/rapps/CreateCabFile.bat b/reactos/base/applications/rapps/CreateCabFile.bat index 34343972cba..b83f7d06d3e 100644 --- a/reactos/base/applications/rapps/CreateCabFile.bat +++ b/reactos/base/applications/rapps/CreateCabFile.bat @@ -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 diff --git a/reactos/base/applications/rapps/CreateCabFile.sh b/reactos/base/applications/rapps/CreateCabFile.sh index d185b447553..5c668551846 100755 --- a/reactos/base/applications/rapps/CreateCabFile.sh +++ b/reactos/base/applications/rapps/CreateCabFile.sh @@ -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 diff --git a/reactos/base/applications/rapps/available.c b/reactos/base/applications/rapps/available.c index ac0b2b5e4df..3920f3f7d48 100644 --- a/reactos/base/applications/rapps/available.c +++ b/reactos/base/applications/rapps/available.c @@ -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 #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 diff --git a/reactos/base/applications/rapps/lang/bg-BG.rc b/reactos/base/applications/rapps/lang/bg-BG.rc index ec1d8ea1599..cacfebbf3bc 100644 --- a/reactos/base/applications/rapps/lang/bg-BG.rc +++ b/reactos/base/applications/rapps/lang/bg-BG.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/cs-CZ.rc b/reactos/base/applications/rapps/lang/cs-CZ.rc index df5abf55f3f..d5354930d9f 100644 --- a/reactos/base/applications/rapps/lang/cs-CZ.rc +++ b/reactos/base/applications/rapps/lang/cs-CZ.rc @@ -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 ®istru", 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 ®istru", 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 diff --git a/reactos/base/applications/rapps/lang/de-DE.rc b/reactos/base/applications/rapps/lang/de-DE.rc index a276044f10a..6ade42d2e63 100644 --- a/reactos/base/applications/rapps/lang/de-DE.rc +++ b/reactos/base/applications/rapps/lang/de-DE.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/en-US.rc b/reactos/base/applications/rapps/lang/en-US.rc index 18c69fa26ce..073446b1d27 100644 --- a/reactos/base/applications/rapps/lang/en-US.rc +++ b/reactos/base/applications/rapps/lang/en-US.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/es-ES.rc b/reactos/base/applications/rapps/lang/es-ES.rc index 38c9c595e9c..2cf408e8348 100644 --- a/reactos/base/applications/rapps/lang/es-ES.rc +++ b/reactos/base/applications/rapps/lang/es-ES.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/fr-FR.rc b/reactos/base/applications/rapps/lang/fr-FR.rc index ef5fda17197..32ebd8f827f 100644 --- a/reactos/base/applications/rapps/lang/fr-FR.rc +++ b/reactos/base/applications/rapps/lang/fr-FR.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/he-IL.rc b/reactos/base/applications/rapps/lang/he-IL.rc index 3992ef4204e..aa99f712fcf 100644 --- a/reactos/base/applications/rapps/lang/he-IL.rc +++ b/reactos/base/applications/rapps/lang/he-IL.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/it-IT.rc b/reactos/base/applications/rapps/lang/it-IT.rc index 983676c7fd6..c72d5047213 100644 --- a/reactos/base/applications/rapps/lang/it-IT.rc +++ b/reactos/base/applications/rapps/lang/it-IT.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/ja-JP.rc b/reactos/base/applications/rapps/lang/ja-JP.rc index a81e4f17109..9e7800763bd 100644 --- a/reactos/base/applications/rapps/lang/ja-JP.rc +++ b/reactos/base/applications/rapps/lang/ja-JP.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/no-NO.rc b/reactos/base/applications/rapps/lang/no-NO.rc index 621f4e4dc68..9c2455ffa63 100644 --- a/reactos/base/applications/rapps/lang/no-NO.rc +++ b/reactos/base/applications/rapps/lang/no-NO.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/pl-PL.rc b/reactos/base/applications/rapps/lang/pl-PL.rc index 41acccd44bb..c9afe6e0697 100644 --- a/reactos/base/applications/rapps/lang/pl-PL.rc +++ b/reactos/base/applications/rapps/lang/pl-PL.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/pt-BR.rc b/reactos/base/applications/rapps/lang/pt-BR.rc index 4aa7a8d8ae6..b70b9739b4c 100644 --- a/reactos/base/applications/rapps/lang/pt-BR.rc +++ b/reactos/base/applications/rapps/lang/pt-BR.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/ro-RO.rc b/reactos/base/applications/rapps/lang/ro-RO.rc index 6df30ed2bb3..9a49ec43e92 100644 --- a/reactos/base/applications/rapps/lang/ro-RO.rc +++ b/reactos/base/applications/rapps/lang/ro-RO.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/ru-RU.rc b/reactos/base/applications/rapps/lang/ru-RU.rc index f8044608077..9f4ba7092e2 100644 --- a/reactos/base/applications/rapps/lang/ru-RU.rc +++ b/reactos/base/applications/rapps/lang/ru-RU.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/sk-SK.rc b/reactos/base/applications/rapps/lang/sk-SK.rc index 695c89b1fca..b25ef953fac 100644 --- a/reactos/base/applications/rapps/lang/sk-SK.rc +++ b/reactos/base/applications/rapps/lang/sk-SK.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/sq-AL.rc b/reactos/base/applications/rapps/lang/sq-AL.rc index 74294f546a6..bfc4193be58 100644 --- a/reactos/base/applications/rapps/lang/sq-AL.rc +++ b/reactos/base/applications/rapps/lang/sq-AL.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/sv-SE.rc b/reactos/base/applications/rapps/lang/sv-SE.rc index a98f7e6a0ad..7d75243327f 100644 --- a/reactos/base/applications/rapps/lang/sv-SE.rc +++ b/reactos/base/applications/rapps/lang/sv-SE.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/tr-TR.rc b/reactos/base/applications/rapps/lang/tr-TR.rc index 4cc2bd6c18e..a8774842764 100644 --- a/reactos/base/applications/rapps/lang/tr-TR.rc +++ b/reactos/base/applications/rapps/lang/tr-TR.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/uk-UA.rc b/reactos/base/applications/rapps/lang/uk-UA.rc index e91dc4a83e3..07d9241a945 100644 --- a/reactos/base/applications/rapps/lang/uk-UA.rc +++ b/reactos/base/applications/rapps/lang/uk-UA.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/zh-CN.rc b/reactos/base/applications/rapps/lang/zh-CN.rc index a7860cb978b..32646da22ae 100644 --- a/reactos/base/applications/rapps/lang/zh-CN.rc +++ b/reactos/base/applications/rapps/lang/zh-CN.rc @@ -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 diff --git a/reactos/base/applications/rapps/lang/zh-TW.rc b/reactos/base/applications/rapps/lang/zh-TW.rc index ff35a062dae..1f0c6009264 100644 --- a/reactos/base/applications/rapps/lang/zh-TW.rc +++ b/reactos/base/applications/rapps/lang/zh-TW.rc @@ -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 diff --git a/reactos/base/applications/rapps/misc.c b/reactos/base/applications/rapps/misc.c index 7f7ba208ac0..f875a86d8b4 100644 --- a/reactos/base/applications/rapps/misc.c +++ b/reactos/base/applications/rapps/misc.c @@ -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 #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 index 60a3fb0b86b..00000000000 --- a/reactos/base/applications/rapps/parser.c +++ /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 = §ion->next; - next_key = §ion->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; -} diff --git a/reactos/base/applications/rapps/rapps.h b/reactos/base/applications/rapps/rapps.h index 0e2839a8d70..3f0b71f48a1 100644 --- a/reactos/base/applications/rapps/rapps.h +++ b/reactos/base/applications/rapps/rapps.h @@ -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; diff --git a/reactos/base/applications/rapps/rapps.rc b/reactos/base/applications/rapps/rapps.rc index 6d9f883aae6..d151ab8610a 100644 --- a/reactos/base/applications/rapps/rapps.rc +++ b/reactos/base/applications/rapps/rapps.rc @@ -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 #include diff --git a/reactos/base/applications/rapps/resource.h b/reactos/base/applications/rapps/resource.h index bda33f71701..e6070e022ab 100644 --- a/reactos/base/applications/rapps/resource.h +++ b/reactos/base/applications/rapps/resource.h @@ -152,6 +152,9 @@ #define IDS_CAT_TOOLS 713 #define IDS_CAT_VIDEO 714 +/* Accelerators */ +#define HOTKEYS 715 + /* Other */ #ifndef IDC_STATIC #define IDC_STATIC -1 diff --git a/reactos/base/applications/rapps/winmain.c b/reactos/base/applications/rapps/winmain.c index fdbb2a346b4..2e2c9e8eaa9 100644 --- a/reactos/base/applications/rapps/winmain.c +++ b/reactos/base/applications/rapps/winmain.c @@ -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 +#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; } -- 2.17.1