| Index: chrome/install_static/install_details.cc
|
| diff --git a/chrome/install_static/install_details.cc b/chrome/install_static/install_details.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c4d96a289a58b09c7a3817848e7346e7da4310e4
|
| --- /dev/null
|
| +++ b/chrome/install_static/install_details.cc
|
| @@ -0,0 +1,91 @@
|
| +// 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.
|
| +
|
| +#include "chrome/install_static/install_details.h"
|
| +
|
| +#include <assert.h>
|
| +#include <string.h>
|
| +
|
| +#include <type_traits>
|
| +
|
| +#include "chrome/install_static/install_modes.h"
|
| +#include "chrome/install_static/install_util.h"
|
| +#include "chrome_elf/nt_registry/nt_registry.h"
|
| +#include "components/version_info/version_info_values.h"
|
| +
|
| +namespace install_static {
|
| +
|
| +namespace {
|
| +
|
| +// The version is set at compile-time to a W.X.Y.Z value.
|
| +constexpr char kProductVersion[] = PRODUCT_VERSION;
|
| +
|
| +// This module's instance (intentionally leaked at shutdown).
|
| +InstallDetails* g_module_details = nullptr;
|
| +
|
| +} // namespace
|
| +
|
| +std::wstring InstallDetails::GetClientStateKeyPath(bool binaries) const {
|
| + return binaries && multi_install()
|
| + ? GetBinariesClientStateKeyPath()
|
| + : install_static::GetClientStateKeyPath(app_guid());
|
| +}
|
| +
|
| +std::wstring InstallDetails::GetClientStateMediumKeyPath(bool binaries) const {
|
| + return binaries && multi_install()
|
| + ? GetBinariesClientStateMediumKeyPath()
|
| + : install_static::GetClientStateMediumKeyPath(app_guid());
|
| +}
|
| +
|
| +bool InstallDetails::VersionMismatch() const {
|
| + // Check the product version and the size of the mode structure.
|
| + return payload_->size != sizeof(Payload) ||
|
| + strcmp(payload_->product_version, &kProductVersion[0]) != 0 ||
|
| + payload_->mode->size != sizeof(InstallConstants);
|
| +}
|
| +
|
| +// static
|
| +const InstallDetails& InstallDetails::Get() {
|
| + assert(g_module_details);
|
| + return *g_module_details;
|
| +}
|
| +
|
| +// static
|
| +void InstallDetails::SetForProcess(
|
| + std::unique_ptr<PrimaryInstallDetails> details) {
|
| + assert(!details || !g_module_details);
|
| + // Tests may set then reset via null. In this case, delete the old instance.
|
| + delete g_module_details;
|
| + // Intentionally leaked at shutdown.
|
| + g_module_details = details.release();
|
| +}
|
| +
|
| +// static
|
| +const InstallDetails::Payload* InstallDetails::GetPayload() {
|
| + assert(g_module_details);
|
| + static_assert(std::is_pod<Payload>::value, "Payload must be a POD-struct");
|
| + static_assert(std::is_pod<InstallConstants>::value,
|
| + "InstallConstants must be a POD-struct");
|
| + return g_module_details->payload_;
|
| +}
|
| +
|
| +// static
|
| +void InstallDetails::InitializeFromPrimaryModule(
|
| + const wchar_t* primary_module_name) {
|
| + assert(!g_module_details);
|
| + using GetInstallDetailsPayloadFunction = const Payload*(__cdecl*)();
|
| + GetInstallDetailsPayloadFunction payload_getter =
|
| + reinterpret_cast<GetInstallDetailsPayloadFunction>(::GetProcAddress(
|
| + ::GetModuleHandle(primary_module_name), "GetInstallDetailsPayload"));
|
| + assert(payload_getter);
|
| + // Intentionally leaked at shutdown.
|
| + g_module_details = new InstallDetails(payload_getter());
|
| +}
|
| +
|
| +PrimaryInstallDetails::PrimaryInstallDetails() : InstallDetails(&payload_) {
|
| + payload_.size = sizeof(payload_);
|
| + payload_.product_version = &kProductVersion[0];
|
| +}
|
| +
|
| +} // namespace install_static
|
|
|