Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3323)

Unified Diff: chrome/install_static/install_details.cc

Issue 2422643002: Windows install_static refactor. (Closed)
Patch Set: sync to position 431863 Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698