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;
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  query_component_build_ = false;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Configuration::Initialize() {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return InitializeFromCommandLine(::GetCommandLine());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is its own function so that unit tests can provide their own command
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lines.  |command_line| is shared with this instance in the sense that this
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instance may refer to it at will throughout its lifetime, yet it will
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not release it.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Configuration::InitializeFromCommandLine(const wchar_t* command_line) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Clear();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line_ = command_line;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args_ = ::CommandLineToArgvW(command_line_, &argument_count_);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args_ != NULL) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 1; i < argument_count_; ++i) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (0 == ::lstrcmpi(args_[i], L"--chrome-sxs"))
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome_app_guid_ = google_update::kSxSAppGuid;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (0 == ::lstrcmpi(args_[i], L"--chrome"))
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        has_chrome_ = true;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (0 == ::lstrcmpi(args_[i], L"--chrome-frame"))
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        has_chrome_frame_ = true;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if ((0 == ::lstrcmpi(args_[i], L"--app-host")) ||
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (0 == ::lstrcmpi(args_[i], L"--app-launcher")))
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        has_app_host_ = true;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (0 == ::lstrcmpi(args_[i], L"--multi-install"))
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_multi_install_ = true;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (0 == ::lstrcmpi(args_[i], L"--system-level"))
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_system_level_ = true;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (0 == ::lstrcmpi(args_[i], L"--cleanup"))
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        operation_ = CLEANUP;
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      else if (0 == ::lstrcmpi(args_[i], L"--query-component-build"))
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        query_component_build_ = true;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Single-install defaults to Chrome.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!is_multi_install_)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_chrome_ = !(has_chrome_frame_ || has_app_host_);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return args_ != NULL;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace mini_installer
85