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)#ifndef CHROME_INSTALLER_UTIL_PRODUCT_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_INSTALLER_UTIL_PRODUCT_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/browser_distribution.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/shell_util.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/installer/util/util_constants.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandLine; 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace installer { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChannelInfo; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MasterPreferences; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Product; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProductOperations; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents an installation of a specific product which has a one-to-one 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// relation to a BrowserDistribution. A product has registry settings, related 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installation/uninstallation actions and exactly one Package that represents 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the files on disk. The Package may be shared with other Product instances, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so only the last Product to be uninstalled should remove the package. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Right now there are no classes that derive from Product, but in 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the future, as we move away from global functions and towards a data driven 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installation, each distribution could derive from this class and provide 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution specific functionality. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Product { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Product(BrowserDistribution* distribution); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Product(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitializeFromPreferences(const MasterPreferences& prefs); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void InitializeFromUninstallCommand( 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::CommandLine& uninstall_command); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* distribution() const { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return distribution_; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_type(BrowserDistribution::Type type) const { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return distribution_->GetType() == type; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_chrome() const { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return distribution_->GetType() == BrowserDistribution::CHROME_BROWSER; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_chrome_frame() const { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return distribution_->GetType() == BrowserDistribution::CHROME_FRAME; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_chrome_app_host() const { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return distribution_->GetType() == BrowserDistribution::CHROME_APP_HOST; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_chrome_binaries() const { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return distribution_->GetType() == BrowserDistribution::CHROME_BINARIES; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasOption(const std::wstring& option) const { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return options_.find(option) != options_.end(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the set of options is mutated by this operation. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool SetOption(const std::wstring& option, bool set) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (set) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return options_.insert(option).second; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return options_.erase(option) != 0; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Launches Chrome without waiting for it to exit. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool LaunchChrome(const base::FilePath& application_path) const; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Launches Chrome with given command line, waits for Chrome indefinitely 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (until it terminates), and gets the process exit code if available. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The function returns true as long as Chrome is successfully launched. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The status of Chrome at the return of the function is given by exit_code. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: The 'options' CommandLine object should only contain parameters. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The program part will be ignored. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool LaunchChromeAndWait(const base::FilePath& application_path, 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::CommandLine& options, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32* exit_code) const; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the boolean MSI marker for this installation if set is true or clears 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it otherwise. The MSI marker is stored in the registry under the 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ClientState key. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool SetMsiMarker(bool system_install, bool set) const; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if setup should create an entry in the Add/Remove list 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of installed applications. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ShouldCreateUninstallEntry() const; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See ProductOperations::AddKeyFiles. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddKeyFiles(std::vector<base::FilePath>* key_files) const; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See ProductOperations::AddComDllList. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddComDllList(std::vector<base::FilePath>* com_dll_list) const; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See ProductOperations::AppendProductFlags. 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void AppendProductFlags(base::CommandLine* command_line) const; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See ProductOperations::AppendRenameFlags. 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void AppendRenameFlags(base::CommandLine* command_line) const; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See Productoperations::SetChannelFlags. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool SetChannelFlags(bool set, ChannelInfo* channel_info) const; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See ProductOperations::AddDefaultShortcutProperties. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddDefaultShortcutProperties( 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& target_exe, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellUtil::ShortcutProperties* properties) const; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LaunchUserExperiment(const base::FilePath& setup_path, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallStatus status, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool system_level) const; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum CacheStateFlags { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MSI_STATE = 0x01 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserDistribution* distribution_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ProductOperations> operations_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::wstring> options_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Product); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace installer 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_INSTALLER_UTIL_PRODUCT_H_ 146