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 12 namespace mini_installer { 13 14 Configuration::Configuration() : args_(NULL) { 15 Clear(); 16 } 17 18 Configuration::~Configuration() { 19 Clear(); 20 } 21 22 const wchar_t* Configuration::program() const { 23 return args_ == NULL || argument_count_ < 1 ? NULL : args_[0]; 24 } 25 26 void 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 43 bool 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. 51 bool 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