[RAPPS] cmdline enhancement (#3087)

* [RAPPS] now command-line option supports begin with both / and -
* [RAPPS] Add help command with /?
* [RAPPS] add /find command
* [RAPPS] add /info option
* [RAPPS] add copyright and contact e-mail
This commit is contained in:
He Yang 2020-08-25 17:06:30 +08:00 committed by Mark Jansen
parent 997650d424
commit 7a11c65561
No known key found for this signature in database
GPG key ID: B39240EE84BEAE8B
35 changed files with 612 additions and 90 deletions

View file

@ -4,6 +4,7 @@ set_cpp(WITH_RUNTIME)
include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/atl)
include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/cryptlib)
include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/conutils)
include_directories(include)
list(APPEND SOURCE
@ -42,8 +43,8 @@ add_definitions(
file(GLOB_RECURSE rapps_rc_deps res/*.*)
add_rc_deps(rapps.rc ${rapps_rc_deps})
add_executable(rapps ${SOURCE} rapps.rc)
set_module_type(rapps win32gui UNICODE)
target_link_libraries(rapps uuid wine)
set_module_type(rapps win32cui UNICODE)
target_link_libraries(rapps conutils ${PSEH_LIB} uuid wine)
add_importlibs(rapps advapi32 comctl32 gdi32 wininet user32 shell32 shlwapi ole32 setupapi gdiplus msvcrt kernel32 ntdll)
add_pch(rapps include/rapps.h SOURCE)
add_dependencies(rapps rappsmsg)

View file

@ -15,6 +15,7 @@
#include "misc.h"
#include "gui.h"
#include "appview.h"
#include "winmain.h"
#include <shlobj_undoc.h>
#include <shlguid_undoc.h>
@ -51,7 +52,7 @@ HTREEITEM CSideTreeView::AddItem(HTREEITEM hParent, ATL::CStringW &Text, INT Ima
HTREEITEM CSideTreeView::AddCategory(HTREEITEM hRootItem, UINT TextIndex, UINT IconIndex)
{
ATL::CStringW szText;
INT Index;
INT Index = 0;
HICON hIcon;
hIcon = (HICON)LoadImageW(hInst,
@ -613,14 +614,6 @@ VOID CMainWindow::OnCommand(WPARAM wParam, LPARAM lParam)
}
}
BOOL CMainWindow::SearchPatternMatch(LPCWSTR szHaystack, LPCWSTR szNeedle)
{
if (!*szNeedle)
return TRUE;
/* TODO: Improve pattern search beyond a simple case-insensitive substring search. */
return StrStrIW(szHaystack, szNeedle) != NULL;
}
BOOL CALLBACK CMainWindow::EnumInstalledAppProc(CInstalledApplicationInfo *Info)
{
if (!SearchPatternMatch(Info->szDisplayName.GetString(), szSearchPattern))
@ -723,7 +716,7 @@ ATL::CWndClassInfo &CMainWindow::GetWndClassInfo()
LoadCursorW(NULL, IDC_ARROW),
(HBRUSH)(COLOR_BTNFACE + 1),
MAKEINTRESOURCEW(IDR_MAINMENU),
L"RAppsWnd",
szWindowClass,
NULL
},
NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
@ -861,7 +854,7 @@ void CMainWindow::HandleTabOrder(int direction)
VOID ShowMainWindow(INT nShowCmd)
VOID MainWindowLoop(INT nShowCmd)
{
HACCEL KeyBrd;
MSG Msg;

View file

@ -9,7 +9,7 @@
VOID CreateSettingsDlg(HWND hwnd);
//Main window
VOID ShowMainWindow(INT nShowCmd);
VOID MainWindowLoop(INT nShowCmd);
// Download dialogs
VOID DownloadApplicationsDB(LPCWSTR lpUrl, BOOL IsOfficial);

View file

@ -98,8 +98,6 @@ private:
VOID OnCommand(WPARAM wParam, LPARAM lParam);
static BOOL SearchPatternMatch(LPCWSTR szHaystack, LPCWSTR szNeedle);
BOOL CALLBACK EnumInstalledAppProc(CInstalledApplicationInfo *Info);
BOOL CALLBACK EnumAvailableAppProc(CAvailableApplicationInfo *Info, BOOL bInitialCheckState);
@ -134,4 +132,4 @@ public:
};
VOID ShowMainWindow(INT nShowCmd);
VOID MainWindowLoop(INT nShowCmd);

View file

@ -56,3 +56,5 @@ BOOL IsSystem64Bit();
INT GetSystemColorDepth();
void UnixTimeToFileTime(DWORD dwUnixTime, LPFILETIME pFileTime);
BOOL SearchPatternMatch(LPCWSTR szHaystack, LPCWSTR szNeedle);

View file

@ -218,6 +218,16 @@
#define IDS_DL_DIALOG_DB_DOWNLOAD_DISP 951
#define IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP 952
/* Command-line related strings */
#define IDS_CMD_USAGE 953
#define IDS_CMD_NEED_PACKAGE_NAME 954
#define IDS_CMD_NEED_FILE_NAME 955
#define IDS_CMD_NEED_PARAMS 956
#define IDS_CMD_INVALID_OPTION 957
#define IDS_CMD_FIND_RESULT_FOR 958
#define IDS_CMD_PACKAGE_NOT_FOUND 959
#define IDS_CMD_PACKAGE_INFO 960
/* Accelerators */
#define HOTKEYS 715

View file

@ -1,7 +1,11 @@
#pragma once
#define CMD_KEY_INSTALL L"/INSTALL"
#define CMD_KEY_SETUP L"/SETUP"
#define CMD_KEY_INSTALL L"INSTALL"
#define CMD_KEY_SETUP L"SETUP"
#define CMD_KEY_FIND L"FIND"
#define CMD_KEY_INFO L"INFO"
#define CMD_KEY_HELP L"?"
// return TRUE if the SETUP key was valid
BOOL UseCmdParameters(LPWSTR lpCmdLine);
const WCHAR UsageString[] = L"RAPPS [/" CMD_KEY_HELP "] [/" CMD_KEY_INSTALL " packagename] [/" CMD_KEY_SETUP " filename]";
BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL bIsFirstLaunch, int nCmdShow);

View file

@ -2,6 +2,8 @@
#include <windef.h>
#include <wininet.h>
extern LPCWSTR szWindowClass;
//TODO: Separate main and settings related definitions
struct SETTINGS_INFO
{

View file

@ -255,3 +255,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Updating Database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -256,3 +256,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Updating Database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -251,3 +251,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Datenbank-Aktualisierung…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -251,3 +251,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Updating Database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -254,3 +254,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Actualizando listado…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Actualizando listado… (Origen no oficial)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -259,3 +259,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Andmebaasi uuendamine…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -251,3 +251,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Mise à jour de la base de données…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Mise à jour de la base de données… (Non officielle)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -257,3 +257,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "מעדכן את מסד הנתונים..."
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -251,3 +251,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Memperbarui database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -251,3 +251,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Aggiornamento Database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -251,3 +251,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "データベースを更新中..."
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -251,3 +251,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Updating Database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -259,3 +259,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Aktualizowanie bazy programów…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -253,3 +253,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Updating Database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -253,3 +253,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Actualizar base de dados…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "A actualizar Base de dados… (Fonte não oficial)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -260,3 +260,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Actualizare baza de date…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -251,3 +251,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Обновление базы данных…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -256,3 +256,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Updating Database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -255,3 +255,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Updating Database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -258,3 +258,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Updating Database…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -253,3 +253,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Veri Tabanı güncelleniyor…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -259,3 +259,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "Оновлення списку програм…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "Updating Database… (Unofficial source)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -254,3 +254,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "正在更新数据库…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "正在更新数据库… (非官方源)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -253,3 +253,15 @@ BEGIN
IDS_DL_DIALOG_DB_DOWNLOAD_DISP "更新資料庫…"
IDS_DL_DIALOG_DB_UNOFFICIAL_DOWNLOAD_DISP "正在更新資料庫… (非官方源)"
END
STRINGTABLE
BEGIN
IDS_CMD_USAGE "Usage: "
IDS_CMD_NEED_PACKAGE_NAME "Error: option %1 expects one or more package name.\n"
IDS_CMD_NEED_FILE_NAME "Error: option %1 expects a file name.\n"
IDS_CMD_NEED_PARAMS "Error: option %1 expects one or more parameters.\n"
IDS_CMD_INVALID_OPTION "Error: Unknown or invalid command line option specified.\n"
IDS_CMD_FIND_RESULT_FOR "Find result for %1:\n"
IDS_CMD_PACKAGE_NOT_FOUND "Failed to find package %1.\n"
IDS_CMD_PACKAGE_INFO "Information about package %1:\n"
END

View file

@ -522,3 +522,11 @@ void UnixTimeToFileTime(DWORD dwUnixTime, LPFILETIME pFileTime)
pFileTime->dwLowDateTime = (DWORD)ll;
pFileTime->dwHighDateTime = ll >> 32;
}
BOOL SearchPatternMatch(LPCWSTR szHaystack, LPCWSTR szNeedle)
{
if (!*szNeedle)
return TRUE;
/* TODO: Improve pattern search beyond a simple case-insensitive substring search. */
return StrStrIW(szHaystack, szNeedle) != NULL;
}

View file

@ -3,59 +3,53 @@
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Functions to parse command-line flags and process them
* COPYRIGHT: Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org)
* Copyright 2020 He Yang (1160386205@qq.com)
*/
#include "rapps.h"
#include "unattended.h"
#include "winmain.h"
#include <setupapi.h>
#define MIN_ARGS 3
#include <conutils.h>
BOOL UseCmdParameters(LPWSTR lpCmdLine)
BOOL MatchCmdOption(LPWSTR argvOption, LPCWSTR szOptToMacth)
{
INT argc;
LPWSTR* argv = CommandLineToArgvW(lpCmdLine, &argc);
WCHAR FirstCharList[] = { L'-', L'/' };
if (!argv || argc < MIN_ARGS)
for (UINT i = 0; i < _countof(FirstCharList); i++)
{
if (argvOption[0] == FirstCharList[i])
{
if (StrCmpIW(argvOption + 1, szOptToMacth) == 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
}
return FALSE;
}
BOOL HandleInstallCommand(LPWSTR szCommand, int argcLeft, LPWSTR * argvLeft)
{
if (argcLeft == 0)
{
ConResMsgPrintf(StdOut, NULL, IDS_CMD_NEED_PACKAGE_NAME, szCommand);
return FALSE;
}
FreeConsole();
ATL::CSimpleArray<ATL::CStringW> PkgNameList;
if (!StrCmpIW(argv[1], CMD_KEY_INSTALL))
{
for (INT i = 2; i < argc; ++i)
{
PkgNameList.Add(argv[i]);
}
}
else
if (!StrCmpIW(argv[1], CMD_KEY_SETUP))
{
HINF InfHandle = SetupOpenInfFileW(argv[2], NULL, INF_STYLE_WIN4, NULL);
if (InfHandle == INVALID_HANDLE_VALUE)
{
return FALSE;
}
INFCONTEXT Context;
if (SetupFindFirstLineW(InfHandle, L"RAPPS", L"Install", &Context))
{
WCHAR szPkgName[MAX_PATH];
do
{
if (SetupGetStringFieldW(&Context, 1, szPkgName, _countof(szPkgName), NULL))
{
PkgNameList.Add(szPkgName);
}
} while (SetupFindNextLine(&Context, &Context));
}
SetupCloseInfFile(InfHandle);
}
else
for (int i = 0; i < argcLeft; i++)
{
return FALSE;
PkgNameList.Add(argvLeft[i]);
}
CAvailableApps apps;
@ -68,6 +62,244 @@ BOOL UseCmdParameters(LPWSTR lpCmdLine)
DownloadListOfApplications(arrAppInfo, TRUE);
return TRUE;
}
return FALSE;
else
{
return FALSE;
}
}
BOOL HandleSetupCommand(LPWSTR szCommand, int argcLeft, LPWSTR * argvLeft)
{
if (argcLeft != 1)
{
ConResMsgPrintf(StdOut, NULL, IDS_CMD_NEED_FILE_NAME, szCommand);
return FALSE;
}
ATL::CSimpleArray<ATL::CStringW> PkgNameList;
HINF InfHandle = SetupOpenInfFileW(argvLeft[0], NULL, INF_STYLE_WIN4, NULL);
if (InfHandle == INVALID_HANDLE_VALUE)
{
return FALSE;
}
INFCONTEXT Context;
if (SetupFindFirstLineW(InfHandle, L"RAPPS", L"Install", &Context))
{
WCHAR szPkgName[MAX_PATH];
do
{
if (SetupGetStringFieldW(&Context, 1, szPkgName, _countof(szPkgName), NULL))
{
PkgNameList.Add(szPkgName);
}
} while (SetupFindNextLine(&Context, &Context));
}
SetupCloseInfFile(InfHandle);
CAvailableApps apps;
apps.UpdateAppsDB();
apps.Enum(ENUM_ALL_AVAILABLE, NULL, NULL);
ATL::CSimpleArray<CAvailableApplicationInfo> arrAppInfo = apps.FindAppsByPkgNameList(PkgNameList);
if (arrAppInfo.GetSize() > 0)
{
DownloadListOfApplications(arrAppInfo, TRUE);
return TRUE;
}
else
{
return FALSE;
}
}
BOOL CALLBACK CmdFindAppEnum(CAvailableApplicationInfo *Info, BOOL bInitialCheckState, PVOID param)
{
LPCWSTR lpszSearch = (LPCWSTR)param;
if (!SearchPatternMatch(Info->m_szName.GetString(), lpszSearch) &&
!SearchPatternMatch(Info->m_szDesc.GetString(), lpszSearch))
{
return TRUE;
}
ConPrintf(StdOut, (LPWSTR)L"%s (%s)\n", (LPCWSTR)(Info->m_szName), (LPCWSTR)(Info->m_szPkgName));
return TRUE;
}
BOOL HandleFindCommand(LPWSTR szCommand, int argcLeft, LPWSTR *argvLeft)
{
if (argcLeft < 1)
{
ConResMsgPrintf(StdOut, NULL, IDS_CMD_NEED_PARAMS, szCommand);
return FALSE;
}
CAvailableApps apps;
apps.UpdateAppsDB();
for (int i = 0; i < argcLeft; i++)
{
ConResMsgPrintf(StdOut, NULL, IDS_CMD_FIND_RESULT_FOR, argvLeft[i]);
apps.Enum(ENUM_ALL_AVAILABLE, CmdFindAppEnum, argvLeft[i]);
ConPrintf(StdOut, (LPWSTR)L"\n");
}
return TRUE;
}
BOOL HandleInfoCommand(LPWSTR szCommand, int argcLeft, LPWSTR *argvLeft)
{
if (argcLeft < 1)
{
ConResMsgPrintf(StdOut, NULL, IDS_CMD_NEED_PARAMS, szCommand);
return FALSE;
}
CAvailableApps apps;
apps.UpdateAppsDB();
apps.Enum(ENUM_ALL_AVAILABLE, NULL, NULL);
for (int i = 0; i < argcLeft; i++)
{
CAvailableApplicationInfo *AppInfo = apps.FindAppByPkgName(argvLeft[i]);
if (!AppInfo)
{
ConResMsgPrintf(StdOut, NULL, IDS_CMD_PACKAGE_NOT_FOUND, argvLeft[i]);
}
else
{
ConResMsgPrintf(StdOut, NULL, IDS_CMD_PACKAGE_INFO, argvLeft[i]);
// TODO: code about extracting information from CAvailableApplicationInfo (in appview.cpp, class CAppRichEdit)
// is in a mess. It should be refactored, and should not placed in class CAppRichEdit.
// and the code here should reused that code after refactor.
ConPuts(StdOut, (LPWSTR)(LPCWSTR)AppInfo->m_szName);
if (AppInfo->m_szVersion)
{
ConResPrintf(StdOut, IDS_AINFO_VERSION);
ConPuts(StdOut, (LPWSTR)(LPCWSTR)AppInfo->m_szVersion);
}
if (AppInfo->m_szLicense)
{
ConResPrintf(StdOut, IDS_AINFO_LICENSE);
ConPuts(StdOut, (LPWSTR)(LPCWSTR)AppInfo->m_szLicense);
}
if (AppInfo->m_szSize)
{
ConResPrintf(StdOut, IDS_AINFO_SIZE);
ConPuts(StdOut, (LPWSTR)(LPCWSTR)AppInfo->m_szSize);
}
if (AppInfo->m_szUrlSite)
{
ConResPrintf(StdOut, IDS_AINFO_URLSITE);
ConPuts(StdOut, (LPWSTR)(LPCWSTR)AppInfo->m_szUrlSite);
}
if (AppInfo->m_szDesc)
{
ConResPrintf(StdOut, IDS_AINFO_DESCRIPTION);
ConPuts(StdOut, (LPWSTR)(LPCWSTR)AppInfo->m_szDesc);
}
if (AppInfo->m_szUrlDownload)
{
ConResPrintf(StdOut, IDS_AINFO_URLDOWNLOAD);
ConPuts(StdOut, (LPWSTR)(LPCWSTR)AppInfo->m_szUrlDownload);
}
ConPrintf(StdOut, (LPWSTR)L"\n");
}
ConPrintf(StdOut, (LPWSTR)L"\n");
}
return TRUE;
}
BOOL HandleHelpCommand(LPWSTR szCommand, int argcLeft, LPWSTR * argvLeft)
{
if (argcLeft != 0)
{
return FALSE;
}
ConPrintf(StdOut, (LPWSTR)L"\n");
ConResPuts(StdOut, IDS_APPTITLE);
ConPrintf(StdOut, (LPWSTR)L"\n\n");
ConResPuts(StdOut, IDS_CMD_USAGE);
ConPrintf(StdOut, (LPWSTR)L"%ls\n", UsageString);
return TRUE;
}
BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL bIsFirstLaunch, int nCmdShow)
{
INT argc;
LPWSTR *argv = CommandLineToArgvW(lpCmdLine, &argc);
if (!argv)
{
return FALSE;
}
if (argc == 1) // RAPPS is launched without options
{
// Close the console, and open MainWindow
FreeConsole();
// Check for if rapps MainWindow is already launched in another process
HANDLE hMutex;
hMutex = CreateMutexW(NULL, FALSE, szWindowClass);
if ((!hMutex) || (GetLastError() == ERROR_ALREADY_EXISTS))
{
/* If already started, it is found its window */
HWND hWindow = FindWindowW(szWindowClass, NULL);
/* Activate window */
ShowWindow(hWindow, SW_SHOWNORMAL);
SetForegroundWindow(hWindow);
return FALSE;
}
if (SettingsInfo.bUpdateAtStart || bIsFirstLaunch)
CAvailableApps::ForceUpdateAppsDB();
MainWindowLoop(nCmdShow);
if (hMutex)
CloseHandle(hMutex);
}
else if (MatchCmdOption(argv[1], CMD_KEY_INSTALL))
{
return HandleInstallCommand(argv[1], argc - 2, argv + 2);
}
else if (MatchCmdOption(argv[1], CMD_KEY_SETUP))
{
return HandleSetupCommand(argv[1], argc - 2, argv + 2);
}
else if (MatchCmdOption(argv[1], CMD_KEY_FIND))
{
return HandleFindCommand(argv[1], argc - 2, argv + 2);
}
else if (MatchCmdOption(argv[1], CMD_KEY_INFO))
{
return HandleInfoCommand(argv[1], argc - 2, argv + 2);
}
else if (MatchCmdOption(argv[1], CMD_KEY_HELP))
{
return HandleHelpCommand(argv[1], argc - 2, argv + 2);
}
else
{
// unrecognized/invalid options
ConResPuts(StdOut, IDS_CMD_INVALID_OPTION);
return FALSE;
}
return TRUE;
}

View file

@ -14,6 +14,10 @@
#include <gdiplus.h>
#include <conutils.h>
LPCWSTR szWindowClass = L"ROSAPPMGR";
HWND hMainWnd;
HINSTANCE hInst;
SETTINGS_INFO SettingsInfo;
@ -139,13 +143,13 @@ VOID SaveSettings(HWND hwnd)
}
}
INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, INT nShowCmd)
int wmain(int argc, wchar_t *argv[])
{
LPCWSTR szWindowClass = L"ROSAPPMGR";
HANDLE hMutex;
BOOL bIsFirstLaunch;
ConInitStdStreams(); // Initialize the Console Standard Streams
InitializeAtlModule(hInstance, TRUE);
BOOL bIsFirstLaunch;
InitializeAtlModule(GetModuleHandle(NULL), TRUE);
InitializeGDIPlus(TRUE);
if (GetUserDefaultUILanguage() == MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT))
@ -153,19 +157,8 @@ INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
SetProcessDefaultLayout(LAYOUT_RTL);
}
hInst = hInstance;
hInst = GetModuleHandle(NULL);
hMutex = CreateMutexW(NULL, FALSE, szWindowClass);
if ((!hMutex) || (GetLastError() == ERROR_ALREADY_EXISTS))
{
/* If already started, it is found its window */
HWND hWindow = FindWindowW(szWindowClass, NULL);
/* Activate window */
ShowWindow(hWindow, SW_SHOWNORMAL);
SetForegroundWindow(hWindow);
return 1;
}
bIsFirstLaunch = !LoadSettings();
if (bIsFirstLaunch)
{
@ -175,20 +168,11 @@ INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
InitLogs();
InitCommonControls();
// skip window creation if there were some keys
if (!UseCmdParameters(GetCommandLineW()))
{
if (SettingsInfo.bUpdateAtStart || bIsFirstLaunch)
CAvailableApps::ForceUpdateAppsDB();
ShowMainWindow(nShowCmd);
}
if (hMutex)
CloseHandle(hMutex);
// parse cmd-line and perform the corresponding operation
BOOL bSuccess = ParseCmdAndExecute(GetCommandLineW(), bIsFirstLaunch, SW_SHOWNORMAL);
InitializeGDIPlus(FALSE);
InitializeAtlModule(hInstance, FALSE);
InitializeAtlModule(GetModuleHandle(NULL), FALSE);
return 0;
return bSuccess ? 0 : 1;
}