15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/mini_installer/configuration.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <shellapi.h> // NOLINT 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/mini_installer/appid.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace mini_installer { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Configuration::Configuration() : args_(NULL) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Configuration::~Configuration() { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* Configuration::program() const { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return args_ == NULL || argument_count_ < 1 ? NULL : args_[0]; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Configuration::Clear() { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (args_ != NULL) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::LocalFree(args_); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_ = NULL; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_app_guid_ = google_update::kAppGuid; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line_ = NULL; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operation_ = INSTALL_PRODUCT; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argument_count_ = 0; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_chrome_ = false; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_chrome_frame_ = false; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_app_host_ = false; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_multi_install_ = false; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_system_level_ = false; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Configuration::Initialize() { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InitializeFromCommandLine(::GetCommandLine()); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is its own function so that unit tests can provide their own command 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lines. |command_line| is shared with this instance in the sense that this 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instance may refer to it at will throughout its lifetime, yet it will 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not release it. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Configuration::InitializeFromCommandLine(const wchar_t* command_line) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line_ = command_line; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args_ = ::CommandLineToArgvW(command_line_, &argument_count_); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (args_ != NULL) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < argument_count_; ++i) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (0 == ::lstrcmpi(args_[i], L"--chrome-sxs")) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_app_guid_ = google_update::kSxSAppGuid; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (0 == ::lstrcmpi(args_[i], L"--chrome")) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_chrome_ = true; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (0 == ::lstrcmpi(args_[i], L"--chrome-frame")) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_chrome_frame_ = true; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((0 == ::lstrcmpi(args_[i], L"--app-host")) || 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (0 == ::lstrcmpi(args_[i], L"--app-launcher"))) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_app_host_ = true; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (0 == ::lstrcmpi(args_[i], L"--multi-install")) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_multi_install_ = true; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (0 == ::lstrcmpi(args_[i], L"--system-level")) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_system_level_ = true; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (0 == ::lstrcmpi(args_[i], L"--cleanup")) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operation_ = CLEANUP; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Single-install defaults to Chrome. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_multi_install_) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_chrome_ = !(has_chrome_frame_ || has_app_host_); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return args_ != NULL; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace mini_installer 82