| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_INSTALL_STATIC_INSTALL_DETAILS_H_ |
| #define CHROME_INSTALL_STATIC_INSTALL_DETAILS_H_ |
| |
| #include <windows.h> |
| |
| #include <memory> |
| #include <string> |
| |
| #include "chrome/install_static/install_constants.h" |
| #include "chrome/install_static/install_modes.h" |
| |
| namespace install_static { |
| |
| class PrimaryInstallDetails; |
| class ScopedInstallDetails; |
| |
| // Details relating to how Chrome is installed. This class and |
| // PrimaryInstallDetails (below) are used in tandem so that one instance of the |
| // latter may be initialized early during process startup and then shared with |
| // other modules in the process. For example, chrome_elf creates the instance |
| // for a Chrome process and exports a GetInstallDetailsPayload function used by |
| // chrome.exe and chrome.dll to create their own module-specific instances |
| // referring to the same underlying payload. See install_modes.h for a gentle |
| // introduction to such terms as "brand" and "mode". |
| class InstallDetails { |
| public: |
| // A POD-struct containing the underlying data for an InstallDetails |
| // instance. Multiple InstallDetails instances (e.g., one per module in a |
| // process) share a single underlying Payload. |
| struct Payload { |
| // The size (in bytes) of this structure. This serves to verify that all |
| // modules in a process have the same definition of the struct. |
| size_t size; |
| |
| // The compile-time version of the product at the time that the process's |
| // primary module was built. This is used to detect version skew across |
| // modules in the process. |
| const char* product_version; |
| |
| // The brand-specific install mode for this install; see kInstallModes. |
| const InstallConstants* mode; |
| |
| // The friendly name of this Chrome's channel, or an empty string if the |
| // brand does not integrate with Google Update. |
| const wchar_t* channel; |
| |
| // The string length of |channel| (not including the string terminator). |
| size_t channel_length; |
| |
| // The "ap" (additional parameters) value read from Chrome's ClientState key |
| // during process startup. |
| const wchar_t* update_ap; |
| |
| // The "name" value read from Chrome's ClientState\cohort key during process |
| // startup. |
| const wchar_t* update_cohort_name; |
| |
| // True if installed in C:\Program Files{, {x86)}; otherwise, false. |
| bool system_level; |
| }; |
| |
| InstallDetails(const InstallDetails&) = delete; |
| InstallDetails(InstallDetails&&) = delete; |
| InstallDetails& operator=(const InstallDetails&) = delete; |
| virtual ~InstallDetails() = default; |
| |
| // Returns the instance for this module. |
| static const InstallDetails& Get(); |
| |
| // This mode's index into the brand's array of install modes. This will match |
| // a brand-specific InstallConstantIndex enumerator. |
| int install_mode_index() const { return payload_->mode->index; } |
| |
| // Returns true if the current mode is the brand's primary install mode rather |
| // than one of its secondary modes (e.g., canary Chrome). |
| bool is_primary_mode() const { return install_mode_index() == 0; } |
| |
| // Returns the installer command-line switch that selects the current mode. |
| const char* install_switch() const { return payload_->mode->install_switch; } |
| |
| // The mode's install suffix (e.g., " SxS" for canary Chrome), or an empty |
| // string for a brand's primary install mode. |
| const wchar_t* install_suffix() const { |
| return payload_->mode->install_suffix; |
| } |
| |
| // The mode's logo suffix (e.g., "Canary" for canary Chrome), or an empty |
| // string for a brand's primary install mode. |
| const wchar_t* logo_suffix() const { return payload_->mode->logo_suffix; } |
| |
| // Returns the full name of the installed product (e.g. "Chrome SxS" for |
| // canary chrome). |
| std::wstring install_full_name() const { |
| return std::wstring(kProductPathName, kProductPathNameLength) |
| .append(install_suffix()); |
| } |
| |
| const InstallConstants& mode() const { return *payload_->mode; } |
| |
| // The app GUID with which this mode is registered with Google Update, or an |
| // empty string if this brand does not integrate with Google Update. |
| const wchar_t* app_guid() const { return payload_->mode->app_guid; } |
| |
| // The toast activator CLSID with which Chrome is registered with the Windows |
| // OS. |
| const CLSID& toast_activator_clsid() const { |
| return payload_->mode->toast_activator_clsid; |
| } |
| |
| // The CLSID of the COM server that provides silent elevation functionality. |
| const CLSID& elevator_clsid() const { return payload_->mode->elevator_clsid; } |
| |
| // The IID and the TypeLib of the IElevator interface that provides silent |
| // elevation functionality. |
| const IID& elevator_iid() const { return payload_->mode->elevator_iid; } |
| |
| // Returns the unsuffixed portion of the AppUserModelId. The AppUserModelId is |
| // used to group an app's windows together on the Windows taskbar along with |
| // its corresponding shortcuts; see |
| // https://msdn.microsoft.com/library/windows/desktop/dd378459.aspx for more |
| // information. Use ShellUtil::GetBrowserModelId to get the suffixed value -- |
| // it is almost never correct to use the unsuffixed (base) portion of this id |
| // directly. |
| const wchar_t* base_app_id() const { return payload_->mode->base_app_id; } |
| |
| // True if the mode supports installation at system-level. |
| bool supports_system_level() const { |
| return payload_->mode->supports_system_level; |
| } |
| |
| // True if the mode once supported multi-install, a legacy mode of |
| // installation. This exists to provide migration and cleanup for older |
| // installs. |
| bool supported_multi_install() const { |
| return payload_->mode->supported_multi_install; |
| } |
| |
| // Returns the resource id of this mode's main application icon. |
| int32_t app_icon_resource_id() const { |
| return payload_->mode->app_icon_resource_id; |
| } |
| |
| // The install's update channel, or an empty string if the brand does not |
| // integrate with Google Update. |
| std::wstring channel() const { |
| return std::wstring(payload_->channel, payload_->channel_length); |
| } |
| |
| // Returns the "ap" (additional parameters) value read from Chrome's |
| // ClientState key during process startup. |
| std::wstring update_ap() const { |
| return payload_->update_ap ? std::wstring(payload_->update_ap) |
| : std::wstring(); |
| } |
| |
| // Returns the "name" value read from Chrome's ClientState\cohort key during |
| // process startup. |
| std::wstring update_cohort_name() const { |
| return payload_->update_cohort_name |
| ? std::wstring(payload_->update_cohort_name) |
| : std::wstring(); |
| } |
| |
| bool system_level() const { return payload_->system_level; } |
| |
| // Returns the path to the installation's ClientState registry key. This |
| // registry key is used to hold various installation-related values, including |
| // an indication of consent for usage stats. |
| std::wstring GetClientStateKeyPath() const; |
| |
| // Returns the path to the installation's ClientStateMedium registry key. This |
| // registry key is used to hold various installation-related values, including |
| // an indication of consent for usage stats for a system-level install. |
| std::wstring GetClientStateMediumKeyPath() const; |
| |
| // Returns true if there is an indication of a mismatch between the primary |
| // module and this module. |
| bool VersionMismatch() const; |
| |
| // Sets the instance for the process. This must be called only once per |
| // process during startup. |
| static void SetForProcess(std::unique_ptr<PrimaryInstallDetails> details); |
| |
| // Returns a pointer to the module's payload so that it may be shared with |
| // other modules in the process. |
| static const Payload* GetPayload(); |
| |
| // Initializes this module's instance with the payload from the process's |
| // primary module (the one that used SetForProcess). |
| static void InitializeFromPayload(const Payload* payload); |
| |
| protected: |
| explicit InstallDetails(const Payload* payload) : payload_(payload) {} |
| const wchar_t* default_channel_name() const { |
| return payload_->mode->default_channel_name; |
| } |
| |
| private: |
| friend class ScopedInstallDetails; |
| |
| // Swaps this module's instance with a provided instance, returning the |
| // module's previous instance. |
| static std::unique_ptr<const InstallDetails> Swap( |
| std::unique_ptr<const InstallDetails> install_details); |
| |
| const Payload* const payload_; |
| }; |
| |
| // A kind of InstallDetails that owns its payload. A single instance of this |
| // class is initialized early on in process startup (e.g., in chrome_elf for the |
| // case of chrome.exe; see InitializeProductDetailsForPrimaryModule). Its |
| // underlying data (its "payload") is shared with other interested modules in |
| // the process. |
| class PrimaryInstallDetails : public InstallDetails { |
| public: |
| PrimaryInstallDetails(); |
| PrimaryInstallDetails(const PrimaryInstallDetails&) = delete; |
| PrimaryInstallDetails(PrimaryInstallDetails&&) = delete; |
| PrimaryInstallDetails& operator=(const PrimaryInstallDetails&) = delete; |
| |
| void set_mode(const InstallConstants* mode) { payload_.mode = mode; } |
| void set_channel(const std::wstring& channel) { |
| channel_ = channel; |
| payload_.channel = channel_.c_str(); |
| payload_.channel_length = channel_.size(); |
| } |
| void set_update_ap(const std::wstring& update_ap) { |
| update_ap_ = update_ap; |
| payload_.update_ap = update_ap_.c_str(); |
| } |
| void set_update_cohort_name(const std::wstring& update_cohort_name) { |
| update_cohort_name_ = update_cohort_name; |
| payload_.update_cohort_name = update_cohort_name_.c_str(); |
| } |
| void set_system_level(bool system_level) { |
| payload_.system_level = system_level; |
| } |
| |
| private: |
| std::wstring channel_; |
| std::wstring update_ap_; |
| std::wstring update_cohort_name_; |
| Payload payload_ = Payload(); |
| }; |
| |
| } // namespace install_static |
| |
| #endif // CHROME_INSTALL_STATIC_INSTALL_DETAILS_H_ |