1 /*
2 * PROJECT:      ReactOS Applications Manager
3 * LICENSE:      GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * FILE:         base/applications/rapps/unattended.cpp
5 * PURPOSE:      Functions to parse command-line flags and process them
6 * COPYRIGHT:    Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org)
7 */
8 #include "rapps.h"
9 
10 #include "unattended.h"
11 
12 #include <setupapi.h>
13 
14 #define MIN_ARGS 2
15 
16 BOOL UseCmdParameters(LPWSTR lpCmdLine)
17 {
18     INT argc;
19     LPWSTR* argv = CommandLineToArgvW(lpCmdLine, &argc);
20 
21     if (!argv || argc < MIN_ARGS)
22     {
23         return FALSE;
24     }
25 
26     // TODO: use DB filenames as names because they're shorter
27     ATL::CSimpleArray<ATL::CStringW> arrNames;
28     if (!StrCmpW(argv[0], CMD_KEY_INSTALL))
29     {
30         for (INT i = 1; i < argc; ++i)
31         {
32             arrNames.Add(argv[i]);
33         }
34     }
35     else
36     if (!StrCmpW(argv[0], CMD_KEY_SETUP))
37     {
38         HINF InfHandle = SetupOpenInfFileW(argv[1], NULL, INF_STYLE_WIN4, NULL);
39         if (InfHandle == INVALID_HANDLE_VALUE)
40         {
41             return FALSE;
42         }
43 
44         INFCONTEXT Context;
45         if (SetupFindFirstLineW(InfHandle, L"RAPPS", L"Install", &Context))
46         {
47             WCHAR szName[MAX_PATH];
48             do
49             {
50                 if (SetupGetStringFieldW(&Context, 1, szName, _countof(szName), NULL))
51                 {
52                     arrNames.Add(szName);
53                 }
54             } while (SetupFindNextLine(&Context, &Context));
55         }
56         SetupCloseInfFile(InfHandle);
57     }
58     else
59     {
60         return FALSE;
61     }
62 
63     CAvailableApps apps;
64     apps.UpdateAppsDB();
65     apps.Enum(ENUM_ALL_AVAILABLE, NULL);
66 
67     ATL::CSimpleArray<CAvailableApplicationInfo> arrAppInfo = apps.FindInfoList(arrNames);
68     if (arrAppInfo.GetSize() > 0)
69     {
70         CDownloadManager::DownloadListOfApplications(arrAppInfo, TRUE);
71         return TRUE;
72     }
73 
74     return FALSE;
75 }
76