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   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