- 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 listview.c
loaddlg.c loaddlg.c
misc.c misc.c
parser.c
richedit.c richedit.c
settingsdlg.c settingsdlg.c
splitter.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

@ -4,10 +4,31 @@
* FILE: base/applications/rapps/available.c * FILE: base/applications/rapps/available.c
* PURPOSE: Functions for working with availabled applications * 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" #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 BOOL
ShowAvailableAppInfo(INT Index) ShowAvailableAppInfo(INT Index)
{ {
@ -20,14 +41,6 @@ ShowAvailableAppInfo(INT Index)
InsertRichEditText(L"\n", 0); 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_VERSION, Info->szVersion, CFE_BOLD, 0);
ADD_TEXT(IDS_AINFO_LICENSE, Info->szLicense, 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_SIZE, Info->szSize, CFE_BOLD, 0);
@ -49,7 +62,7 @@ DeleteCurrentAppsDB(VOID)
HRESULT hr; HRESULT hr;
BOOL result = TRUE; BOOL result = TRUE;
if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0]))) if (!GetStorageDirectory(szPath, _countof(szPath)))
return FALSE; return FALSE;
hr = StringCbPrintfW(szCabPath, sizeof(szCabPath), hr = StringCbPrintfW(szCabPath, sizeof(szCabPath),
@ -61,6 +74,7 @@ DeleteCurrentAppsDB(VOID)
result = result && DeleteFileW(szCabPath); result = result && DeleteFileW(szCabPath);
hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\"); hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\");
if (FAILED(hr)) if (FAILED(hr))
return FALSE; return FALSE;
@ -71,6 +85,7 @@ DeleteCurrentAppsDB(VOID)
return FALSE; return FALSE;
hFind = FindFirstFileW(szSearchPath, &FindFileData); hFind = FindFirstFileW(szSearchPath, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) if (hFind == INVALID_HANDLE_VALUE)
return result; return result;
@ -82,6 +97,7 @@ DeleteCurrentAppsDB(VOID)
if (FAILED(hr)) if (FAILED(hr))
continue; continue;
result = result && DeleteFileW(szTmp); result = result && DeleteFileW(szTmp);
} while (FindNextFileW(hFind, &FindFileData) != 0); } while (FindNextFileW(hFind, &FindFileData) != 0);
FindClose(hFind); FindClose(hFind);
@ -102,7 +118,7 @@ UpdateAppsDB(VOID)
DownloadApplicationsDB(APPLICATION_DATABASE_URL); DownloadApplicationsDB(APPLICATION_DATABASE_URL);
if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0]))) if (!GetStorageDirectory(szPath, _countof(szPath)))
return FALSE; return FALSE;
if (FAILED(StringCbPrintfW(szCabPath, sizeof(szCabPath), if (FAILED(StringCbPrintfW(szCabPath, sizeof(szCabPath),
@ -132,13 +148,18 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
WIN32_FIND_DATAW FindFileData; WIN32_FIND_DATAW FindFileData;
WCHAR szPath[MAX_PATH]; WCHAR szPath[MAX_PATH];
WCHAR szAppsPath[MAX_PATH]; WCHAR szAppsPath[MAX_PATH];
WCHAR szSectionLocale[MAX_PATH] = L"Section.";
WCHAR szCabPath[MAX_PATH]; WCHAR szCabPath[MAX_PATH];
WCHAR szLocale[4 + 1]; PAPPLICATION_INFO Info;
APPLICATION_INFO Info;
HRESULT hr; 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; return FALSE;
hr = StringCbPrintfW(szCabPath, sizeof(szCabPath), hr = StringCbPrintfW(szCabPath, sizeof(szCabPath),
@ -148,9 +169,12 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
return FALSE; return FALSE;
hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\"); hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\");
if (FAILED(hr)) if (FAILED(hr))
return FALSE; return FALSE;
hr = StringCbCopyW(szAppsPath, sizeof(szAppsPath), szPath); hr = StringCbCopyW(szAppsPath, sizeof(szAppsPath), szPath);
if (FAILED(hr)) if (FAILED(hr))
return FALSE; return FALSE;
@ -161,10 +185,12 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
} }
hr = StringCbCatW(szPath, sizeof(szPath), L"*.txt"); hr = StringCbCatW(szPath, sizeof(szPath), L"*.txt");
if (FAILED(hr)) if (FAILED(hr))
return FALSE; return FALSE;
hFind = FindFirstFileW(szPath, &FindFileData); hFind = FindFirstFileW(szPath, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) if (hFind == INVALID_HANDLE_VALUE)
{ {
if (GetFileAttributesW(szCabPath) == INVALID_FILE_ATTRIBUTES) if (GetFileAttributesW(szCabPath) == INVALID_FILE_ATTRIBUTES)
@ -172,58 +198,81 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
ExtractFilesFromCab(szCabPath, szAppsPath); ExtractFilesFromCab(szCabPath, szAppsPath);
hFind = FindFirstFileW(szPath, &FindFileData); hFind = FindFirstFileW(szPath, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) if (hFind == INVALID_HANDLE_VALUE)
return FALSE; 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 do
{ {
Info.Category = ParserGetInt(szSectionLocale, L"Category", FindFileData.cFileName); /* loop for all the cached entries */
if (Info.Category == -1) for (pCachedEntry = CachedEntriesHead.Flink; pCachedEntry != &CachedEntriesHead; pCachedEntry = pCachedEntry->Flink)
{ {
Info.Category = ParserGetInt(L"Section", L"Category", FindFileData.cFileName); Info = CONTAINING_RECORD(pCachedEntry, APPLICATION_INFO, List);
if (Info.Category == -1)
continue; /* 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;
} }
if (EnumType != Info.Category && EnumType != ENUM_ALL_AVAILABLE) continue; break;
}
}
GET_STRING1(L"Name", Info.szName); /* create a new entry */
GET_STRING1(L"URLDownload", Info.szUrlDownload); Info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(APPLICATION_INFO));
GET_STRING2(L"RegName", Info.szRegName); if(!Info)
GET_STRING2(L"Version", Info.szVersion); break;
GET_STRING2(L"License", Info.szLicense);
GET_STRING2(L"Description", Info.szDesc); Info->Category = ParserGetInt(L"Category", FindFileData.cFileName);
GET_STRING2(L"Size", Info.szSize);
GET_STRING2(L"URLSite", Info.szUrlSite); /* copy the cache-related fields for the next time */
GET_STRING2(L"CDPath", Info.szCDPath); 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); } while (FindNextFileW(hFind, &FindFileData) != 0);
FindClose(hFind); FindClose(hFind);

View file

@ -14,19 +14,19 @@ BEGIN
END END
POPUP "&Приложения" POPUP "&Приложения"
BEGIN BEGIN
MENUITEM "&Слагане", ID_INSTALL MENUITEM "&Слагане\tCtrl+Enter", ID_INSTALL
MENUITEM "&Махане", ID_UNINSTALL MENUITEM "&Махане\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Промяна", ID_MODIFY MENUITEM "&Промяна", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Пре&махване от регистъра", ID_REGREMOVE MENUITEM "Пре&махване от регистъра", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "О&пресняване", ID_REFRESH MENUITEM "О&пресняване\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
POPUP "Помощ" POPUP "Помощ"
BEGIN BEGIN
MENUITEM "Помощ", ID_HELP, GRAYED MENUITEM "Помощ\tF1", ID_HELP, GRAYED
MENUITEM "За", ID_ABOUT MENUITEM "За", ID_ABOUT
END END
END END
@ -44,15 +44,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Слагане", ID_INSTALL MENUITEM "&Слагане\tCtrl+Enter", ID_INSTALL
MENUITEM "&Махане", ID_UNINSTALL MENUITEM "&Махане\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Промяна", ID_MODIFY MENUITEM "&Промяна", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Пре&махване от регистъра", ID_REGREMOVE MENUITEM "Пре&махване от регистъра", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "О&пресняване", ID_REFRESH MENUITEM "О&пресняване\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -15,19 +15,19 @@ BEGIN
END END
POPUP "&Programy" POPUP "&Programy"
BEGIN BEGIN
MENUITEM "&Instalovat", ID_INSTALL MENUITEM "&Instalovat\tCtrl+Enter", ID_INSTALL
MENUITEM "&Odinstalovat", ID_UNINSTALL MENUITEM "&Odinstalovat\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Změnit", ID_MODIFY MENUITEM "&Změnit", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Odstranit z &registru", ID_REGREMOVE MENUITEM "Odstranit z &registru", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Ob&novit", ID_REFRESH MENUITEM "Ob&novit\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Aktualizovat databázi", ID_RESETDB MENUITEM "&Aktualizovat databázi\tCtrl+F5", ID_RESETDB
END END
POPUP "Nápověda" POPUP "Nápověda"
BEGIN BEGIN
MENUITEM "Nápověda", ID_HELP, GRAYED MENUITEM "Nápověda\tF1", ID_HELP, GRAYED
MENUITEM "O programu...", ID_ABOUT MENUITEM "O programu...", ID_ABOUT
END END
END END
@ -45,15 +45,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Instalovat", ID_INSTALL MENUITEM "&Instalovat\tCtrl+Enter", ID_INSTALL
MENUITEM "&Odinstalovat", ID_UNINSTALL MENUITEM "&Odinstalovat\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Změnit", ID_MODIFY MENUITEM "&Změnit", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Odstranit z &registru", ID_REGREMOVE MENUITEM "Odstranit z &registru", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Ob&novit", ID_REFRESH MENUITEM "Ob&novit\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Aktualizovat databázi", ID_RESETDB MENUITEM "&Aktualizovat databázi\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -10,19 +10,19 @@ BEGIN
END END
POPUP "&Programme" POPUP "&Programme"
BEGIN BEGIN
MENUITEM "&Installieren", ID_INSTALL MENUITEM "&Installieren\tCtrl+Enter", ID_INSTALL
MENUITEM "&Deinstallieren", ID_UNINSTALL MENUITEM "&Deinstallieren\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Ändern", ID_MODIFY MENUITEM "&Ändern", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Aus &Registry entfernen", ID_REGREMOVE MENUITEM "Aus &Registry entfernen", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Aktualisieren", ID_REFRESH MENUITEM "&Aktualisieren\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Da&tenbank aktualisieren", ID_RESETDB MENUITEM "Da&tenbank aktualisieren\tCtrl+F5", ID_RESETDB
END END
POPUP "Hilfe" POPUP "Hilfe"
BEGIN BEGIN
MENUITEM "Hilfe", ID_HELP, GRAYED MENUITEM "Hilfe\tF1", ID_HELP, GRAYED
MENUITEM "Über", ID_ABOUT MENUITEM "Über", ID_ABOUT
END END
END END
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Installieren", ID_INSTALL MENUITEM "&Installieren\tCtrl+Enter", ID_INSTALL
MENUITEM "&Deinstallieren", ID_UNINSTALL MENUITEM "&Deinstallieren\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Ändern", ID_MODIFY MENUITEM "&Ändern", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Aus &Registry entfernen", ID_REGREMOVE MENUITEM "Aus &Registry entfernen", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Aktualisieren", ID_REFRESH MENUITEM "&Aktualisieren\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Da&tenbank aktualisieren", ID_RESETDB MENUITEM "Da&tenbank aktualisieren\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -10,19 +10,19 @@ BEGIN
END END
POPUP "&Programs" POPUP "&Programs"
BEGIN BEGIN
MENUITEM "&Install", ID_INSTALL MENUITEM "&Install\tCtrl+Enter", ID_INSTALL
MENUITEM "&Uninstall", ID_UNINSTALL MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modify", ID_MODIFY MENUITEM "&Modify", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Remove from Registry", ID_REGREMOVE MENUITEM "&Remove from Registry", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Refresh", ID_REFRESH MENUITEM "&Refresh\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
POPUP "Help" POPUP "Help"
BEGIN BEGIN
MENUITEM "Help", ID_HELP, GRAYED MENUITEM "Help\tF1", ID_HELP, GRAYED
MENUITEM "About", ID_ABOUT MENUITEM "About", ID_ABOUT
END END
END END
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Install", ID_INSTALL MENUITEM "&Install\tCtrl+Enter", ID_INSTALL
MENUITEM "&Uninstall", ID_UNINSTALL MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modify", ID_MODIFY MENUITEM "&Modify", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Remove from Registry", ID_REGREMOVE MENUITEM "&Remove from Registry", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Refresh", ID_REFRESH MENUITEM "&Refresh\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -13,19 +13,19 @@ BEGIN
END END
POPUP "&Programas" POPUP "&Programas"
BEGIN BEGIN
MENUITEM "&Instalar", ID_INSTALL MENUITEM "&Instalar\tCtrl+Intro", ID_INSTALL
MENUITEM "&Desinstalar", ID_UNINSTALL MENUITEM "&Desinstalar\tCtrl+Supr", ID_UNINSTALL
MENUITEM "&Modificar", ID_MODIFY MENUITEM "&Modificar", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Eliminar del Registro", ID_REGREMOVE MENUITEM "&Eliminar del Registro", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Recargar", ID_REFRESH MENUITEM "&Recargar\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Actualizar el listado desde Internet", ID_RESETDB MENUITEM "&Actualizar el listado desde Internet\tCtrl+F5", ID_RESETDB
END END
POPUP "Ayuda" POPUP "Ayuda"
BEGIN BEGIN
MENUITEM "Ayuda", ID_HELP, GRAYED MENUITEM "Ayuda\tF1", ID_HELP, GRAYED
MENUITEM "Acerca de", ID_ABOUT MENUITEM "Acerca de", ID_ABOUT
END END
END END
@ -43,19 +43,19 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Instalar", ID_INSTALL MENUITEM "&Instalar\tCtrl+Intro", ID_INSTALL
MENUITEM "&Desinstalar", ID_UNINSTALL MENUITEM "&Desinstalar\tCtrl+Supr", ID_UNINSTALL
MENUITEM "&Modificar", ID_MODIFY MENUITEM "&Modificar", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Eliminar del Registro", ID_REGREMOVE MENUITEM "&Eliminar del Registro", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Recargar", ID_REFRESH MENUITEM "&Recargar\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Actualizar listado desde Internet", ID_RESETDB MENUITEM "&Actualizar listado desde Internet\tCtrl+F5", ID_RESETDB
END END
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 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Ajustes" CAPTION "Ajustes"
FONT 8, "MS Shell Dlg" 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 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 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 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 GROUPBOX "Proxy", -1, 4, 116, 240, 61
CONTROL "System proxy settings", IDC_PROXY_DEFAULT, "Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 130, 210, 10 CONTROL "Utilizar el proxy del sistema", IDC_PROXY_DEFAULT, "Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 128, 218, 10
CONTROL "Direct (No proxy)", IDC_NO_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 145, 210, 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, 160, 74, 10 CONTROL "Proxy:", IDC_USE_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 154, 35, 10
EDITTEXT IDC_PROXY_SERVER, 90, 160, 147, 12, ES_AUTOHSCROLL | WS_DISABLED EDITTEXT IDC_PROXY_SERVER, 51, 153, 70, 14, ES_AUTOHSCROLL
LTEXT "No proxy for", -1, 27, 175, 64, 10 LTEXT "Sin proxy para:", -1, 125, 154, 50, 8, SS_RIGHT
EDITTEXT IDC_NO_PROXY_FOR, 90, 175, 147, 12, ES_AUTOHSCROLL | WS_DISABLED EDITTEXT IDC_NO_PROXY_FOR, 177, 153, 61, 14, ES_AUTOHSCROLL
PUSHBUTTON "Por defecto", IDC_DEFAULT_SETTINGS, 8, 195, 60, 14 PUSHBUTTON "Por defecto", IDC_DEFAULT_SETTINGS, 8, 180, 60, 14
PUSHBUTTON "Aceptar", IDOK, 116, 195, 60, 14 PUSHBUTTON "Aceptar", IDOK, 116, 180, 60, 14
PUSHBUTTON "Cancelar", IDCANCEL, 181, 195, 60, 14 PUSHBUTTON "Cancelar", IDCANCEL, 181, 180, 60, 14
END END
IDD_INSTALL_DIALOG DIALOGEX 0, 0, 216, 97 IDD_INSTALL_DIALOG DIALOGEX 0, 0, 216, 97

View file

@ -10,19 +10,19 @@ BEGIN
END END
POPUP "&Programmes" POPUP "&Programmes"
BEGIN BEGIN
MENUITEM "&Installer", ID_INSTALL MENUITEM "&Installer\tCtrl+Enter", ID_INSTALL
MENUITEM "&Désinstaller", ID_UNINSTALL MENUITEM "&Désinstaller\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modifier", ID_MODIFY MENUITEM "&Modifier", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Supprimer du registre", ID_REGREMOVE MENUITEM "&Supprimer du registre", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Rafraîchir", ID_REFRESH MENUITEM "&Rafraîchir\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Me&ttre à jour la base", ID_RESETDB MENUITEM "Me&ttre à jour la base\tCtrl+F5", ID_RESETDB
END END
POPUP "Aide" POPUP "Aide"
BEGIN BEGIN
MENUITEM "Aide", ID_HELP, GRAYED MENUITEM "Aide\tF1", ID_HELP, GRAYED
MENUITEM "À propos", ID_ABOUT MENUITEM "À propos", ID_ABOUT
END END
END END
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Installer", ID_INSTALL MENUITEM "&Installer\tCtrl+Enter", ID_INSTALL
MENUITEM "&Désinstaller", ID_UNINSTALL MENUITEM "&Désinstaller\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modifier", ID_MODIFY MENUITEM "&Modifier", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Supprimer du registre", ID_REGREMOVE MENUITEM "&Supprimer du registre", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Rafraîchir", ID_REFRESH MENUITEM "&Rafraîchir\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Me&ttre à jour la base", ID_RESETDB MENUITEM "Me&ttre à jour la base\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -12,19 +12,19 @@ BEGIN
END END
POPUP "&תכניות" POPUP "&תכניות"
BEGIN BEGIN
MENUITEM "התקנה", ID_INSTALL MENUITEM "התקנה\tCtrl+Enter", ID_INSTALL
MENUITEM "הסרה", ID_UNINSTALL MENUITEM "הסרה\tCtrl+Del", ID_UNINSTALL
MENUITEM "שינוי", ID_MODIFY MENUITEM "שינוי", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "הסרה מהרשום", ID_REGREMOVE MENUITEM "הסרה מהרשום", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "רענון", ID_REFRESH MENUITEM "רענון\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
POPUP "עזרה" POPUP "עזרה"
BEGIN BEGIN
MENUITEM "עזרה", ID_HELP, GRAYED MENUITEM "עזרה\tF1", ID_HELP, GRAYED
MENUITEM "אודות", ID_ABOUT MENUITEM "אודות", ID_ABOUT
END END
END END
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "התקנה", ID_INSTALL MENUITEM "התקנה\tCtrl+Enter", ID_INSTALL
MENUITEM "הסרה", ID_UNINSTALL MENUITEM "הסרה\tCtrl+Del", ID_UNINSTALL
MENUITEM "שינוי", ID_MODIFY MENUITEM "שינוי", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "הסרה מהרשום", ID_REGREMOVE MENUITEM "הסרה מהרשום", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "רענן", ID_REFRESH MENUITEM "רענן\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -10,19 +10,19 @@ BEGIN
END END
POPUP "&Programmi" POPUP "&Programmi"
BEGIN BEGIN
MENUITEM "&Installa", ID_INSTALL MENUITEM "&Installa\tCtrl+Enter", ID_INSTALL
MENUITEM "&Disinstalla", ID_UNINSTALL MENUITEM "&Disinstalla\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modifica", ID_MODIFY MENUITEM "&Modifica", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Remuovi da Registry", ID_REGREMOVE MENUITEM "&Remuovi da Registry", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Aggiorna", ID_REFRESH MENUITEM "&Aggiorna\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase", ID_RESETDB
END END
POPUP "?" POPUP "?"
BEGIN BEGIN
MENUITEM "Guida", ID_HELP, GRAYED MENUITEM "Guida\tF1", ID_HELP, GRAYED
MENUITEM "Informazioni", ID_ABOUT MENUITEM "Informazioni", ID_ABOUT
END END
END END
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Installa", ID_INSTALL MENUITEM "&Installa\tCtrl+Enter", ID_INSTALL
MENUITEM "&Disinstalla", ID_UNINSTALL MENUITEM "&Disinstalla\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modifica", ID_MODIFY MENUITEM "&Modifica", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Rimuovi da Registry", ID_REGREMOVE MENUITEM "&Rimuovi da Registry", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Aggiorna", ID_REFRESH MENUITEM "&Aggiorna\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -10,19 +10,19 @@ BEGIN
END END
POPUP "プログラム(&P)" POPUP "プログラム(&P)"
BEGIN BEGIN
MENUITEM "インストール(&I)", ID_INSTALL MENUITEM "インストール(&I)\tCtrl+Enter", ID_INSTALL
MENUITEM "アンインストール(&U)", ID_UNINSTALL MENUITEM "アンインストール(&U)\tCtrl+Del", ID_UNINSTALL
MENUITEM "変更(&M)", ID_MODIFY MENUITEM "変更(&M)", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "レジストリから削除(&R)", ID_REGREMOVE MENUITEM "レジストリから削除(&R)\tF5", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "更新(&R)", ID_REFRESH MENUITEM "更新(&R)", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "アップデート データベース(&T)", ID_RESETDB MENUITEM "アップデート データベース(&T)\tCtrl+F5", ID_RESETDB
END END
POPUP "ヘルプ" POPUP "ヘルプ"
BEGIN BEGIN
MENUITEM "ヘルプ", ID_HELP, GRAYED MENUITEM "ヘルプ\tF1", ID_HELP, GRAYED
MENUITEM "バージョン情報", ID_ABOUT MENUITEM "バージョン情報", ID_ABOUT
END END
END END
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "インストール(&I)", ID_INSTALL MENUITEM "インストール(&I)\tCtrl+Enter", ID_INSTALL
MENUITEM "アンインストール(&U)", ID_UNINSTALL MENUITEM "アンインストール(&U)\tCtrl+Del", ID_UNINSTALL
MENUITEM "変更(&M)", ID_MODIFY MENUITEM "変更(&M)", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "レジストリから削除(&R)", ID_REGREMOVE MENUITEM "レジストリから削除(&R)\tF5", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "更新(&R)", ID_REFRESH MENUITEM "更新(&R)", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "アップデート データベース(&T)", ID_RESETDB MENUITEM "アップデート データベース(&T)\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -10,19 +10,19 @@ BEGIN
END END
POPUP "&Programmer" POPUP "&Programmer"
BEGIN BEGIN
MENUITEM "&Installere", ID_INSTALL MENUITEM "&Installere\tCtrl+Enter", ID_INSTALL
MENUITEM "&Avinstallere", ID_UNINSTALL MENUITEM "&Avinstallere\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Endre", ID_MODIFY MENUITEM "&Endre", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Remove from Registry", ID_REGREMOVE MENUITEM "&Remove from Registry", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Oppdatere", ID_REFRESH MENUITEM "&Oppdatere\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
POPUP "Hjelp" POPUP "Hjelp"
BEGIN BEGIN
MENUITEM "Hjelp", ID_HELP, GRAYED MENUITEM "Hjelp\tF1", ID_HELP, GRAYED
MENUITEM "Om", ID_ABOUT MENUITEM "Om", ID_ABOUT
END END
END END
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Installere", ID_INSTALL MENUITEM "&Installere\tCtrl+Enter", ID_INSTALL
MENUITEM "&Avinstallere", ID_UNINSTALL MENUITEM "&Avinstallere\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Endre", ID_MODIFY MENUITEM "&Endre", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Remove from Registry", ID_REGREMOVE MENUITEM "&Remove from Registry", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Oppdater", ID_REFRESH MENUITEM "&Oppdater\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -18,19 +18,19 @@ BEGIN
END END
POPUP "&Programy" POPUP "&Programy"
BEGIN BEGIN
MENUITEM "&Instaluj", ID_INSTALL MENUITEM "&Instaluj\tCtrl+Enter", ID_INSTALL
MENUITEM "&Odinstaluj", ID_UNINSTALL MENUITEM "&Odinstaluj\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modyfikuj", ID_MODIFY MENUITEM "&Modyfikuj", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Usuń z rejestru", ID_REGREMOVE MENUITEM "&Usuń z rejestru", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "O&dśwież", ID_REFRESH MENUITEM "O&dśwież\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Ak&tualizuj bazę programów", ID_RESETDB MENUITEM "Ak&tualizuj bazę programów\tCtrl+F5", ID_RESETDB
END END
POPUP "Pomoc" POPUP "Pomoc"
BEGIN BEGIN
MENUITEM "Pomoc", ID_HELP, GRAYED MENUITEM "Pomoc\tF1", ID_HELP, GRAYED
MENUITEM "O programie", ID_ABOUT MENUITEM "O programie", ID_ABOUT
END END
END END
@ -48,15 +48,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Instaluj", ID_INSTALL MENUITEM "&Instaluj\tCtrl+Enter", ID_INSTALL
MENUITEM "&Odinstaluj", ID_UNINSTALL MENUITEM "&Odinstaluj\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modyfikuj", ID_MODIFY MENUITEM "&Modyfikuj", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Usuń z rejestru", ID_REGREMOVE MENUITEM "&Usuń z rejestru", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Odśwież", ID_REFRESH MENUITEM "&Odśwież\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Ak&tualizuj bazę programów", ID_RESETDB MENUITEM "Ak&tualizuj bazę programów\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -12,19 +12,19 @@ BEGIN
END END
POPUP "&Programas" POPUP "&Programas"
BEGIN BEGIN
MENUITEM "I&nstalar", ID_INSTALL MENUITEM "I&nstalar\tCtrl+Enter", ID_INSTALL
MENUITEM "&Desinstalar", ID_UNINSTALL MENUITEM "&Desinstalar\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modificar", ID_MODIFY MENUITEM "&Modificar", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Remover do Registro", ID_REGREMOVE MENUITEM "&Remover do Registro", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "A&tualizar", ID_REFRESH MENUITEM "A&tualizar\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
POPUP "Aj&uda" POPUP "Aj&uda"
BEGIN BEGIN
MENUITEM "Aj&uda", ID_HELP, GRAYED MENUITEM "Aj&uda\tF1", ID_HELP, GRAYED
MENUITEM "&Sobre", ID_ABOUT MENUITEM "&Sobre", ID_ABOUT
END END
END END
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Instalar", ID_INSTALL MENUITEM "&Instalar\tCtrl+Enter", ID_INSTALL
MENUITEM "&Desinstalar", ID_UNINSTALL MENUITEM "&Desinstalar\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modificar", ID_MODIFY MENUITEM "&Modificar", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Remover do Registro", ID_REGREMOVE MENUITEM "&Remover do Registro", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Atualizar", ID_REFRESH MENUITEM "&Atualizar\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -16,19 +16,19 @@ BEGIN
END END
POPUP "&Programe" POPUP "&Programe"
BEGIN BEGIN
MENUITEM "&Instalează", ID_INSTALL MENUITEM "&Instalează\tCtrl+Enter", ID_INSTALL
MENUITEM "&Dezinstalează", ID_UNINSTALL MENUITEM "&Dezinstalează\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modifică", ID_MODIFY MENUITEM "&Modifică", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Elimină din registru", ID_REGREMOVE MENUITEM "&Elimină din registru", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Împ&rospătează", ID_REFRESH MENUITEM "Împ&rospătează\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Actualizează baza de date", ID_RESETDB MENUITEM "&Actualizează baza de date\tCtrl+F5", ID_RESETDB
END END
POPUP "Aj&utor" POPUP "Aj&utor"
BEGIN BEGIN
MENUITEM "&Manual…", ID_HELP, GRAYED MENUITEM "&Manual…\tF1", ID_HELP, GRAYED
MENUITEM "&Despre…", ID_ABOUT MENUITEM "&Despre…", ID_ABOUT
END END
END END
@ -46,15 +46,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Instalează", ID_INSTALL MENUITEM "&Instalează\tCtrl+Enter", ID_INSTALL
MENUITEM "&Dezinstalează", ID_UNINSTALL MENUITEM "&Dezinstalează\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modifică", ID_MODIFY MENUITEM "&Modifică", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Elimină din registru", ID_REGREMOVE MENUITEM "&Elimină din registru", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Împ&rospătează", ID_REFRESH MENUITEM "Împ&rospătează\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Actualizează baza de date", ID_RESETDB MENUITEM "&Actualizează baza de date\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -10,19 +10,19 @@ BEGIN
END END
POPUP "&Программы" POPUP "&Программы"
BEGIN BEGIN
MENUITEM "У&становить", ID_INSTALL MENUITEM "У&становить\tCtrl+Enter", ID_INSTALL
MENUITEM "&Удалить", ID_UNINSTALL MENUITEM "&Удалить\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Изменить", ID_MODIFY MENUITEM "&Изменить", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "У&далить из реестра", ID_REGREMOVE MENUITEM "У&далить из реестра", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Обновить", ID_REFRESH MENUITEM "&Обновить\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Обновить &базу данных", ID_RESETDB MENUITEM "Обновить &базу данных\tCtrl+F5", ID_RESETDB
END END
POPUP "Справка" POPUP "Справка"
BEGIN BEGIN
MENUITEM "Содержание", ID_HELP, GRAYED MENUITEM "Содержание\tF1", ID_HELP, GRAYED
MENUITEM "О программе", ID_ABOUT MENUITEM "О программе", ID_ABOUT
END END
END END
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Установить", ID_INSTALL MENUITEM "&Установить\tCtrl+Enter", ID_INSTALL
MENUITEM "&Удалить", ID_UNINSTALL MENUITEM "&Удалить\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Изменить", ID_MODIFY MENUITEM "&Изменить", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "У&далить из реестра", ID_REGREMOVE MENUITEM "У&далить из реестра", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Обновить", ID_REFRESH MENUITEM "&Обновить\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Обновить &базу данных", ID_RESETDB MENUITEM "Обновить &базу данных\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -15,19 +15,19 @@ BEGIN
END END
POPUP "&Programy" POPUP "&Programy"
BEGIN BEGIN
MENUITEM "&Inštalovať", ID_INSTALL MENUITEM "&Inštalovať\tCtrl+Enter", ID_INSTALL
MENUITEM "O&dinštalovať", ID_UNINSTALL MENUITEM "O&dinštalovať\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Zmeniť", ID_MODIFY MENUITEM "&Zmeniť", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Odst&rániť z Registrov", ID_REGREMOVE MENUITEM "Odst&rániť z Registrov", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Obnoviť", ID_REFRESH MENUITEM "&Obnoviť\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
POPUP "Pomocník" POPUP "Pomocník"
BEGIN BEGIN
MENUITEM "Pomocník", ID_HELP, GRAYED MENUITEM "Pomocník\tF1", ID_HELP, GRAYED
MENUITEM "Čo je ...", ID_ABOUT MENUITEM "Čo je ...", ID_ABOUT
END END
END END
@ -45,15 +45,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Inštalovať", ID_INSTALL MENUITEM "&Inštalovať\tCtrl+Enter", ID_INSTALL
MENUITEM "O&dinštalovať", ID_UNINSTALL MENUITEM "O&dinštalovať\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Zmeniť", ID_MODIFY MENUITEM "&Zmeniť", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Odst&rániť z Registrov", ID_REGREMOVE MENUITEM "Odst&rániť z Registrov", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Obnoviť", ID_REFRESH MENUITEM "&Obnoviť\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -14,19 +14,19 @@ BEGIN
END END
POPUP "&Programe" POPUP "&Programe"
BEGIN BEGIN
MENUITEM "&Instalo", ID_INSTALL MENUITEM "&Instalo\tCtrl+Enter", ID_INSTALL
MENUITEM "&Uninstall", ID_UNINSTALL MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modifiko", ID_MODIFY MENUITEM "&Modifiko", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Hiq nga Regjistri", ID_REGREMOVE MENUITEM "Hiq nga Regjistri", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Rifresko", ID_REFRESH MENUITEM "&Rifresko\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
POPUP "Ndihmë" POPUP "Ndihmë"
BEGIN BEGIN
MENUITEM "Ndihmë", ID_HELP, GRAYED MENUITEM "Ndihmë\tF1", ID_HELP, GRAYED
MENUITEM "Rreth", ID_ABOUT MENUITEM "Rreth", ID_ABOUT
END END
END END
@ -44,15 +44,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Instalo", ID_INSTALL MENUITEM "&Instalo\tCtrl+Enter", ID_INSTALL
MENUITEM "&Uninstall", ID_UNINSTALL MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Modifiko", ID_MODIFY MENUITEM "&Modifiko", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Hiq nga Regjistri", ID_REGREMOVE MENUITEM "Hiq nga Regjistri", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Rifresko", ID_REFRESH MENUITEM "&Rifresko\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -17,19 +17,19 @@ BEGIN
END END
POPUP "&Program" POPUP "&Program"
BEGIN BEGIN
MENUITEM "&Installera", ID_INSTALL MENUITEM "&Installera\tCtrl+Enter", ID_INSTALL
MENUITEM "&Avinstallera", ID_UNINSTALL MENUITEM "&Avinstallera\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Ändra", ID_MODIFY MENUITEM "&Ändra", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Ta bort från Registret", ID_REGREMOVE MENUITEM "&Ta bort från Registret", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Uppdatera", ID_REFRESH MENUITEM "&Uppdatera\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
POPUP "Hjälp" POPUP "Hjälp"
BEGIN BEGIN
MENUITEM "Hjälp", ID_HELP, GRAYED MENUITEM "Hjälp\tF1", ID_HELP, GRAYED
MENUITEM "Om...", ID_ABOUT MENUITEM "Om...", ID_ABOUT
END END
END END
@ -47,15 +47,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Installera", ID_INSTALL MENUITEM "&Installera\tCtrl+Enter", ID_INSTALL
MENUITEM "&Avinstallera", ID_UNINSTALL MENUITEM "&Avinstallera\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Ändra", ID_MODIFY MENUITEM "&Ändra", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Ta bort från Registret", ID_REGREMOVE MENUITEM "&Ta bort från Registret", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Uppdatera", ID_REFRESH MENUITEM "&Uppdatera\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -12,19 +12,19 @@ BEGIN
END END
POPUP "Y&azılım" POPUP "Y&azılım"
BEGIN BEGIN
MENUITEM "&Kur", ID_INSTALL MENUITEM "&Kur\tCtrl+Enter", ID_INSTALL
MENUITEM "K&aldır", ID_UNINSTALL MENUITEM "K&aldır\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Değiştir", ID_MODIFY MENUITEM "&Değiştir", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Girişi Değer Defteri'nden Kaldır", ID_REGREMOVE MENUITEM "&Girişi Değer Defteri'nden Kaldır", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Yenile", ID_REFRESH MENUITEM "&Yenile\tF5", ID_REFRESH
MENUITEM SEPARATOR 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
POPUP "&Yardım" POPUP "&Yardım"
BEGIN BEGIN
MENUITEM "&Yardım", ID_HELP, GRAYED MENUITEM "&Yardım\tF1", ID_HELP, GRAYED
MENUITEM "&Üzerine...", ID_ABOUT MENUITEM "&Üzerine...", ID_ABOUT
END END
END END
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Kur", ID_INSTALL MENUITEM "&Kur\tCtrl+Enter", ID_INSTALL
MENUITEM "K&aldır", ID_UNINSTALL MENUITEM "K&aldır\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Değiştir", ID_MODIFY MENUITEM "&Değiştir", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Girişi Değer Defteri'nden Kaldır", ID_REGREMOVE MENUITEM "&Girişi Değer Defteri'nden Kaldır", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Yenile", ID_REFRESH MENUITEM "&Yenile\tF5", ID_REFRESH
MENUITEM SEPARATOR 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
END END

View file

@ -18,19 +18,19 @@ BEGIN
END END
POPUP "&Програми" POPUP "&Програми"
BEGIN BEGIN
MENUITEM "&Встановити", ID_INSTALL MENUITEM "&Встановити\tCtrl+Enter", ID_INSTALL
MENUITEM "Вид&алити", ID_UNINSTALL MENUITEM "Вид&алити\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Змінити", ID_MODIFY MENUITEM "&Змінити", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Вида&лити з реєстру", ID_REGREMOVE MENUITEM "Вида&лити з реєстру", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Оновити", ID_REFRESH MENUITEM "&Оновити\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
POPUP "&Довідка" POPUP "&Довідка"
BEGIN BEGIN
MENUITEM "Дов&ідка", ID_HELP, GRAYED MENUITEM "Дов&ідка\tF1", ID_HELP, GRAYED
MENUITEM "Про про&граму...", ID_ABOUT MENUITEM "Про про&граму...", ID_ABOUT
END END
END END
@ -48,15 +48,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "&Встановити", ID_INSTALL MENUITEM "&Встановити\tCtrl+Enter", ID_INSTALL
MENUITEM "В&идалити", ID_UNINSTALL MENUITEM "В&идалити\tCtrl+Del", ID_UNINSTALL
MENUITEM "&Змінити", ID_MODIFY MENUITEM "&Змінити", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Вид&алити з реєстру", ID_REGREMOVE MENUITEM "Вид&алити з реєстру", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Оновити", ID_REFRESH MENUITEM "&Оновити\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Update Da&tabase", ID_RESETDB MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -12,19 +12,19 @@ BEGIN
END END
POPUP "程序(&P)" POPUP "程序(&P)"
BEGIN BEGIN
MENUITEM "安装(&I)", ID_INSTALL MENUITEM "安装(&I)\tCtrl+Enter", ID_INSTALL
MENUITEM "卸载(&U)", ID_UNINSTALL MENUITEM "卸载(&U)\tCtrl+Del", ID_UNINSTALL
MENUITEM "修改(&M)", ID_MODIFY MENUITEM "修改(&M)", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "从注册表删除(&E)", ID_REGREMOVE MENUITEM "从注册表删除(&E)", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "刷新(&R)", ID_REFRESH MENUITEM "刷新(&R)\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "更新数据库(&A)", ID_RESETDB MENUITEM "更新数据库(&A)\tCtrl+F5", ID_RESETDB
END END
POPUP "帮助" POPUP "帮助"
BEGIN BEGIN
MENUITEM "帮助内容", ID_HELP, GRAYED MENUITEM "帮助内容\tF1", ID_HELP, GRAYED
MENUITEM "关于", ID_ABOUT MENUITEM "关于", ID_ABOUT
END END
END END
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "安装(&I)", ID_INSTALL MENUITEM "安装(&I)\tCtrl+Enter", ID_INSTALL
MENUITEM "卸载(&U)", ID_UNINSTALL MENUITEM "卸载(&U)\tCtrl+Del", ID_UNINSTALL
MENUITEM "修改(&M)", ID_MODIFY MENUITEM "修改(&M)", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "从注册表删除(&E)", ID_REGREMOVE MENUITEM "从注册表删除(&E)", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "刷新(&R)", ID_REFRESH MENUITEM "刷新(&R)\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "更新数据库(&A)", ID_RESETDB MENUITEM "更新数据库(&A)\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -12,19 +12,19 @@ BEGIN
END END
POPUP "程式(&P)" POPUP "程式(&P)"
BEGIN BEGIN
MENUITEM "安裝(&I)", ID_INSTALL MENUITEM "安裝(&I)\tCtrl+Enter", ID_INSTALL
MENUITEM "解除安裝(&U)", ID_UNINSTALL MENUITEM "解除安裝(&U)\tCtrl+Del", ID_UNINSTALL
MENUITEM "修改(&M)", ID_MODIFY MENUITEM "修改(&M)", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "從登錄檔刪除(&E)", ID_REGREMOVE MENUITEM "從登錄檔刪除(&E)", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "重新整理(&R)", ID_REFRESH MENUITEM "重新整理(&R)\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "更新資料庫(&A)", ID_RESETDB MENUITEM "更新資料庫(&A)\tCtrl+F5", ID_RESETDB
END END
POPUP "幫助" POPUP "幫助"
BEGIN BEGIN
MENUITEM "幫助內容", ID_HELP, GRAYED MENUITEM "幫助內容\tF1", ID_HELP, GRAYED
MENUITEM "關於", ID_ABOUT MENUITEM "關於", ID_ABOUT
END END
END END
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
BEGIN BEGIN
POPUP "popup" POPUP "popup"
BEGIN BEGIN
MENUITEM "安裝(&I)", ID_INSTALL MENUITEM "安裝(&I)\tCtrl+Enter", ID_INSTALL
MENUITEM "解除安裝(&U)", ID_UNINSTALL MENUITEM "解除安裝(&U)\tCtrl+Del", ID_UNINSTALL
MENUITEM "修改(&M)", ID_MODIFY MENUITEM "修改(&M)", ID_MODIFY
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "從登錄檔刪除(&E)", ID_REGREMOVE MENUITEM "從登錄檔刪除(&E)", ID_REGREMOVE
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "重新整理(&R)", ID_REFRESH MENUITEM "重新整理(&R)\tF5", ID_REFRESH
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "更新資料庫(&A)", ID_RESETDB MENUITEM "更新資料庫(&A)\tCtrl+F5", ID_RESETDB
END END
END END

View file

@ -4,8 +4,10 @@
* FILE: base/applications/rapps/misc.c * FILE: base/applications/rapps/misc.c
* PURPOSE: Misc functions * 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" #include "rapps.h"
/* SESSION Operation */ /* SESSION Operation */
@ -13,6 +15,9 @@
#define EXTRACT_EXTRACTFILES 0x00000002 #define EXTRACT_EXTRACTFILES 0x00000002
static HANDLE hLog = NULL; static HANDLE hLog = NULL;
WCHAR szCachedINISectionLocale[MAX_PATH] = L"Section.";
WCHAR szCachedINISectionLocaleNeutral[MAX_PATH] = {0};
BYTE bCachedSectionStatus = FALSE;
typedef struct typedef struct
{ {
@ -168,6 +173,7 @@ ShowPopupMenu(HWND hwnd, UINT MenuID, UINT DefaultItem)
mii.cbSize = sizeof(mii); mii.cbSize = sizeof(mii);
mii.fMask = MIIM_STATE; mii.fMask = MIIM_STATE;
GetMenuItemInfo(hPopupMenu, DefaultItem, FALSE, &mii); GetMenuItemInfo(hPopupMenu, DefaultItem, FALSE, &mii);
if (!(mii.fState & MFS_GRAYED)) if (!(mii.fState & MFS_GRAYED))
SetMenuDefaultItem(hPopupMenu, DefaultItem, FALSE); SetMenuDefaultItem(hPopupMenu, DefaultItem, FALSE);
@ -392,3 +398,117 @@ WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg)
return TRUE; 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 szUrlDownload[MAX_PATH];
WCHAR szCDPath[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; } APPLICATION_INFO, *PAPPLICATION_INFO;
typedef struct typedef struct
@ -166,9 +174,8 @@ VOID InitLogs(VOID);
VOID FreeLogs(VOID); VOID FreeLogs(VOID);
BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg); BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg);
/* parser.c */ UINT ParserGetString(LPCWSTR lpKeyName, LPWSTR lpReturnedString, UINT nSize, LPCWSTR lpFileName);
INT ParserGetString(LPCWSTR section, LPCWSTR entry, LPWSTR buffer, UINT len, LPCWSTR filename); UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName);
UINT ParserGetInt(LPCWSTR section, LPCWSTR entry, LPCWSTR filename);
/* richedit.c */ /* richedit.c */
extern HWND hRichEdit; 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_TOOLS ICON "res/cats/tools.ico"
IDI_CAT_VIDEO ICON "res/cats/video.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 <reactos/manifest_exe.rc>
#include <rappsmsg.rc> #include <rappsmsg.rc>

View file

@ -152,6 +152,9 @@
#define IDS_CAT_TOOLS 713 #define IDS_CAT_TOOLS 713
#define IDS_CAT_VIDEO 714 #define IDS_CAT_VIDEO 714
/* Accelerators */
#define HOTKEYS 715
/* Other */ /* Other */
#ifndef IDC_STATIC #ifndef IDC_STATIC
#define IDC_STATIC -1 #define IDC_STATIC -1

View file

@ -4,11 +4,11 @@
* FILE: base/applications/rapps/winmain.c * FILE: base/applications/rapps/winmain.c
* PURPOSE: Main program * 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 <shellapi.h>
#include "rapps.h"
#define SEARCH_TIMER_ID 'SR' #define SEARCH_TIMER_ID 'SR'
@ -138,6 +138,7 @@ EnumInstalledAppProc(INT ItemIndex, LPWSTR lpName, PINSTALLED_INFO Info)
/* Get version info */ /* Get version info */
GetApplicationString(ItemInfo->hSubKey, L"DisplayVersion", szText); GetApplicationString(ItemInfo->hSubKey, L"DisplayVersion", szText);
ListView_SetItemText(hListView, Index, 1, szText); ListView_SetItemText(hListView, Index, 1, szText);
/* Get comments */ /* Get comments */
GetApplicationString(ItemInfo->hSubKey, L"Comments", szText); GetApplicationString(ItemInfo->hSubKey, L"Comments", szText);
ListView_SetItemText(hListView, Index, 2, szText); ListView_SetItemText(hListView, Index, 2, szText);
@ -164,7 +165,6 @@ BOOL
CALLBACK CALLBACK
EnumAvailableAppProc(PAPPLICATION_INFO Info) EnumAvailableAppProc(PAPPLICATION_INFO Info)
{ {
PAPPLICATION_INFO ItemInfo;
INT Index; INT Index;
if (!SearchPatternMatch(Info->szName, szSearchPattern) && if (!SearchPatternMatch(Info->szName, szSearchPattern) &&
@ -179,12 +179,8 @@ EnumAvailableAppProc(PAPPLICATION_INFO Info)
*/ */
if (!*Info->szRegName || (!IsInstalledApplication(Info->szRegName, FALSE) && !IsInstalledApplication(Info->szRegName, TRUE))) if (!*Info->szRegName || (!IsInstalledApplication(Info->szRegName, FALSE) && !IsInstalledApplication(Info->szRegName, TRUE)))
{ {
ItemInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_INFO)); Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM)Info);
if (!ItemInfo) return FALSE;
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, 1, Info->szVersion);
ListView_SetItemText(hListView, Index, 2, Info->szDesc); ListView_SetItemText(hListView, Index, 2, Info->szDesc);
} }
@ -245,13 +241,17 @@ UpdateApplicationsList(INT EnumType)
SelectedEnumType = 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), StringCbPrintfW(szBuffer1, sizeof(szBuffer1),
szBuffer2, szBuffer2,
ListView_GetItemCount(hListView)); ListView_GetItemCount(hListView));
SetStatusBarText(szBuffer1); SetStatusBarText(szBuffer1);
SetWelcomeText(); 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 VOID
@ -260,13 +260,13 @@ InitApplicationsList(VOID)
WCHAR szText[MAX_STR_LEN]; WCHAR szText[MAX_STR_LEN];
/* Add columns to ListView */ /* 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); 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); 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); ListViewAddColumn(3, szText, 250, LVCFMT_LEFT);
UpdateApplicationsList(ENUM_ALL_COMPONENTS); UpdateApplicationsList(ENUM_ALL_COMPONENTS);
@ -289,7 +289,7 @@ AddCategory(HTREEITEM hRootItem, UINT TextIndex, UINT IconIndex)
Index = ImageList_AddIcon(hImageTreeView, hIcon); Index = ImageList_AddIcon(hImageTreeView, hIcon);
DestroyIcon(hIcon); DestroyIcon(hIcon);
LoadStringW(hInst, TextIndex, szText, sizeof(szText) / sizeof(TCHAR)); LoadStringW(hInst, TextIndex, szText, _countof(szText));
return TreeViewAddItem(hRootItem, szText, Index, Index, TextIndex); return TreeViewAddItem(hRootItem, szText, Index, Index, TextIndex);
} }
@ -352,7 +352,7 @@ InitControls(HWND hwnd)
InitCategoriesList(); InitCategoriesList();
LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR)); LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, _countof(szBuffer2));
StringCbPrintfW(szBuffer1, sizeof(szBuffer1), StringCbPrintfW(szBuffer1, sizeof(szBuffer1),
szBuffer2, szBuffer2,
ListView_GetItemCount(hListView)); ListView_GetItemCount(hListView));
@ -385,7 +385,7 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
{ {
WCHAR szWndText[MAX_STR_LEN]; 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); GetWindowTextW(hSearchBar, szWndText, MAX_STR_LEN);
if (wcscmp(szBuf, szWndText) == 0) if (wcscmp(szBuf, szWndText) == 0)
{ {
@ -400,7 +400,7 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
GetWindowTextW(hSearchBar, szBuf, MAX_STR_LEN); GetWindowTextW(hSearchBar, szBuf, MAX_STR_LEN);
if (wcslen(szBuf) < 1) if (wcslen(szBuf) < 1)
{ {
LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR)); LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf));
SearchEnabled = FALSE; SearchEnabled = FALSE;
SetWindowTextW(hSearchBar, szBuf); SetWindowTextW(hSearchBar, szBuf);
} }
@ -417,7 +417,7 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
break; 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); GetWindowTextW(hSearchBar, szWndText, MAX_STR_LEN);
if (wcscmp(szBuf, szWndText) != 0) if (wcscmp(szBuf, szWndText) != 0)
{ {
@ -607,12 +607,12 @@ BOOL IsSelectedNodeInstalled(void)
LRESULT CALLBACK LRESULT CALLBACK
MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{ {
switch (Msg) switch (Msg)
{ {
case WM_CREATE: case WM_CREATE:
if (!InitControls(hwnd)) if (!InitControls(hwnd))
PostMessage(hwnd, WM_CLOSE, 0, 0); PostMessage(hwnd, WM_CLOSE, 0, 0);
break; break;
case WM_COMMAND: case WM_COMMAND:
@ -801,7 +801,8 @@ MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{ {
if (data->hwndFrom == hListView && ((LPNMLISTVIEW)lParam)->iItem != -1) 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; break;
@ -902,6 +903,7 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
WCHAR szWindowClass[] = L"ROSAPPMGR"; WCHAR szWindowClass[] = L"ROSAPPMGR";
WCHAR szWindowName[MAX_STR_LEN]; WCHAR szWindowName[MAX_STR_LEN];
HANDLE hMutex = NULL; HANDLE hMutex = NULL;
HACCEL KeyBrd;
MSG Msg; MSG Msg;
switch (GetUserDefaultUILanguage()) switch (GetUserDefaultUILanguage())
@ -949,7 +951,7 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
if (RegisterClassExW(&WndClass) == (ATOM)0) goto Exit; 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, hMainWnd = CreateWindowExW(WS_EX_WINDOWEDGE,
szWindowClass, szWindowClass,
@ -973,15 +975,22 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
if (SettingsInfo.bUpdateAtStart) if (SettingsInfo.bUpdateAtStart)
UpdateAppsDB(); UpdateAppsDB();
/* Load the menu hotkeys */
KeyBrd = LoadAccelerators(NULL, MAKEINTRESOURCE(HOTKEYS));
/* Message Loop */ /* Message Loop */
while (GetMessage(&Msg, NULL, 0, 0)) while (GetMessage(&Msg, NULL, 0, 0))
{
if (!TranslateAccelerator(hMainWnd, KeyBrd, &Msg))
{ {
TranslateMessage(&Msg); TranslateMessage(&Msg);
DispatchMessage(&Msg); DispatchMessage(&Msg);
} }
}
Exit: Exit:
if (hMutex) CloseHandle(hMutex); if (hMutex)
CloseHandle(hMutex);
return 0; return 0;
} }