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