1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/installer/mini_installer/configuration.h"
6
7#include <windows.h>
8#include <shellapi.h>  // NOLINT
9
10#include "chrome/installer/mini_installer/appid.h"
11
12namespace mini_installer {
13
14Configuration::Configuration() : args_(NULL) {
15  Clear();
16}
17
18Configuration::~Configuration() {
19  Clear();
20}
21
22const wchar_t* Configuration::program() const {
23  return args_ == NULL || argument_count_ < 1 ? NULL : args_[0];
24}
25
26void Configuration::Clear() {
27  if (args_ != NULL) {
28    ::LocalFree(args_);
29    args_ = NULL;
30  }
31  chrome_app_guid_ = google_update::kAppGuid;
32  command_line_ = NULL;
33  operation_ = INSTALL_PRODUCT;
34  argument_count_ = 0;
35  has_chrome_ = false;
36  has_chrome_frame_ = false;
37  has_app_host_ = false;
38  is_multi_install_ = false;
39  is_system_level_ = false;
40  query_component_build_ = false;
41}
42
43bool Configuration::Initialize() {
44  return InitializeFromCommandLine(::GetCommandLine());
45}
46
47// This is its own function so that unit tests can provide their own command
48// lines.  |command_line| is shared with this instance in the sense that this
49// instance may refer to it at will throughout its lifetime, yet it will
50// not release it.
51bool Configuration::InitializeFromCommandLine(const wchar_t* command_line) {
52  Clear();
53
54  command_line_ = command_line;
55  args_ = ::CommandLineToArgvW(command_line_, &argument_count_);
56  if (args_ != NULL) {
57    for (int i = 1; i < argument_count_; ++i) {
58      if (0 == ::lstrcmpi(args_[i], L"--chrome-sxs"))
59        chrome_app_guid_ = google_update::kSxSAppGuid;
60      else if (0 == ::lstrcmpi(args_[i], L"--chrome"))
61        has_chrome_ = true;
62      else if (0 == ::lstrcmpi(args_[i], L"--chrome-frame"))
63        has_chrome_frame_ = true;
64      else if ((0 == ::lstrcmpi(args_[i], L"--app-host")) ||
65               (0 == ::lstrcmpi(args_[i], L"--app-launcher")))
66        has_app_host_ = true;
67      else if (0 == ::lstrcmpi(args_[i], L"--multi-install"))
68        is_multi_install_ = true;
69      else if (0 == ::lstrcmpi(args_[i], L"--system-level"))
70        is_system_level_ = true;
71      else if (0 == ::lstrcmpi(args_[i], L"--cleanup"))
72        operation_ = CLEANUP;
73      else if (0 == ::lstrcmpi(args_[i], L"--query-component-build"))
74        query_component_build_ = true;
75    }
76
77    // Single-install defaults to Chrome.
78    if (!is_multi_install_)
79      has_chrome_ = !(has_chrome_frame_ || has_app_host_);
80  }
81  return args_ != NULL;
82}
83
84}  // namespace mini_installer
85