- 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
This commit is contained in:
Kamil Hornicek 2015-03-19 19:26:14 +00:00
parent 631b0ae9a1
commit c7046c39bc
31 changed files with 508 additions and 1044 deletions

View file

@ -7,7 +7,6 @@ list(APPEND SOURCE
listview.c
loaddlg.c
misc.c
parser.c
richedit.c
settingsdlg.c
splitter.c

View 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

View file

@ -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

View 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)))
{
FindClose(hFind);
return FALSE;
}
hr = StringCbCatW(szSectionLocale, sizeof(szSectionLocale), szLocale);
if (FAILED(hr))
{
FindClose(hFind);
return FALSE;
}
#define GET_STRING1(a, b) \
if (!ParserGetString(szSectionLocale, a, b, MAX_PATH, FindFileData.cFileName)) \
if (!ParserGetString(L"Section", a, b, MAX_PATH, FindFileData.cFileName)) \
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';
do
{
Info.Category = ParserGetInt(szSectionLocale, L"Category", FindFileData.cFileName);
if (Info.Category == -1)
/* loop for all the cached entries */
for (pCachedEntry = CachedEntriesHead.Flink; pCachedEntry != &CachedEntriesHead; pCachedEntry = pCachedEntry->Flink)
{
Info.Category = ParserGetInt(L"Section", L"Category", FindFileData.cFileName);
if (Info.Category == -1)
continue;
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;
}
}
if (EnumType != Info.Category && EnumType != ENUM_ALL_AVAILABLE) continue;
/* create a new entry */
Info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(APPLICATION_INFO));
GET_STRING1(L"Name", Info.szName);
GET_STRING1(L"URLDownload", Info.szUrlDownload);
if(!Info)
break;
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);
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;
if (EnumType != Info->Category && EnumType != ENUM_ALL_AVAILABLE)
continue;
/* 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)
{
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;
if (!lpEnumProc(&Info)) break;
} while (FindNextFileW(hFind, &FindFileData) != 0);
FindClose(hFind);
return TRUE;
}
}

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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;
}

View file

@ -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;
}

View 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;

View 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>

View file

@ -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

View 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;
Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM)Info);
RtlCopyMemory(ItemInfo, Info, sizeof(APPLICATION_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;
}