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