Home | History | Annotate | Download | only in mini_installer
      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 }
     41 
     42 bool Configuration::Initialize() {
     43   return InitializeFromCommandLine(::GetCommandLine());
     44 }
     45 
     46 // This is its own function so that unit tests can provide their own command
     47 // lines.  |command_line| is shared with this instance in the sense that this
     48 // instance may refer to it at will throughout its lifetime, yet it will
     49 // not release it.
     50 bool Configuration::InitializeFromCommandLine(const wchar_t* command_line) {
     51   Clear();
     52 
     53   command_line_ = command_line;
     54   args_ = ::CommandLineToArgvW(command_line_, &argument_count_);
     55   if (args_ != NULL) {
     56     for (int i = 1; i < argument_count_; ++i) {
     57       if (0 == ::lstrcmpi(args_[i], L"--chrome-sxs"))
     58         chrome_app_guid_ = google_update::kSxSAppGuid;
     59       else if (0 == ::lstrcmpi(args_[i], L"--chrome"))
     60         has_chrome_ = true;
     61       else if (0 == ::lstrcmpi(args_[i], L"--chrome-frame"))
     62         has_chrome_frame_ = true;
     63       else if ((0 == ::lstrcmpi(args_[i], L"--app-host")) ||
     64                (0 == ::lstrcmpi(args_[i], L"--app-launcher")))
     65         has_app_host_ = true;
     66       else if (0 == ::lstrcmpi(args_[i], L"--multi-install"))
     67         is_multi_install_ = true;
     68       else if (0 == ::lstrcmpi(args_[i], L"--system-level"))
     69         is_system_level_ = true;
     70       else if (0 == ::lstrcmpi(args_[i], L"--cleanup"))
     71         operation_ = CLEANUP;
     72     }
     73 
     74     // Single-install defaults to Chrome.
     75     if (!is_multi_install_)
     76       has_chrome_ = !(has_chrome_frame_ || has_app_host_);
     77   }
     78   return args_ != NULL;
     79 }
     80 
     81 }  // namespace mini_installer
     82