chromium/components/services/app_service/public/cpp/instance_update.cc

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/services/app_service/public/cpp/instance_update.h"

#include "base/logging.h"
#include "base/strings/string_util.h"
#include "components/services/app_service/public/cpp/instance.h"
#include "components/services/app_service/public/cpp/macros.h"

namespace apps {

// static
void InstanceUpdate::Merge(Instance* state, const Instance* delta) {
  DCHECK(state);
  if (!delta) {
    return;
  }

  if ((delta->AppId() != state->AppId()) ||
      delta->InstanceId() != state->InstanceId()) {
    LOG(ERROR) << "inconsistent (app_id, instance_id): (" << delta->AppId()
               << ", " << delta->InstanceId() << ") vs (" << state->AppId()
               << ", " << state->InstanceId() << ") ";
    DCHECK(false);
    return;
  }

  if (!delta->LaunchId().empty()) {
    state->SetLaunchId(delta->LaunchId());
  }
  if (delta->State() != InstanceState::kUnknown) {
    state->UpdateState(delta->State(), delta->LastUpdatedTime());
  }
  if (delta->BrowserContext()) {
    state->SetBrowserContext(delta->BrowserContext());
  }
  if (delta->Window()) {
    state->SetWindow(delta->Window());
  }
  // When adding new fields to the Instance class, this function should also be
  // updated.
}

// static
bool InstanceUpdate::Equals(const Instance* state, const Instance* delta) {
  if (delta == nullptr) {
    return true;
  }
  if (state == nullptr) {
    if (static_cast<InstanceState>(delta->State() &
                                   InstanceState::kDestroyed) !=
        InstanceState::kUnknown) {
      return true;
    }
    return false;
  }

  if ((delta->AppId() != state->AppId()) ||
      delta->InstanceId() != state->InstanceId()) {
    LOG(ERROR) << "inconsistent (app_id, instance_id): (" << delta->AppId()
               << ", " << delta->InstanceId() << ") vs (" << state->AppId()
               << ", " << state->InstanceId() << ") ";
    DCHECK(false);
    return false;
  }

  if (delta->Window() && delta->Window() != state->Window()) {
    return false;
  }
  if (!delta->LaunchId().empty() && delta->LaunchId() != state->LaunchId()) {
    return false;
  }
  if (delta->State() != InstanceState::kUnknown &&
      (delta->State() != state->State() ||
       delta->LastUpdatedTime() != state->LastUpdatedTime())) {
    return false;
  }
  if (delta->BrowserContext() &&
      delta->BrowserContext() != state->BrowserContext()) {
    return false;
  }
  return true;
  // When adding new fields to the Instance class, this function should also be
  // updated.
}

InstanceUpdate::InstanceUpdate(const Instance* state, const Instance* delta)
    : state_(state), delta_(delta) {
  DCHECK(state_ || delta_);
  if (state_ && delta_) {
    DCHECK(state_->AppId() == delta->AppId());
    DCHECK(state_->InstanceId() == delta->InstanceId());
  }
}

bool InstanceUpdate::StateIsNull() const {
  return state_ == nullptr;
}

bool InstanceUpdate::IsCreation() const {
  return StateIsNull() && (State() & apps::InstanceState::kDestroyed) ==
                              apps::InstanceState::kUnknown;
}

bool InstanceUpdate::IsDestruction() const {
  return StateChanged() && State() == apps::InstanceState::kDestroyed;
}

const std::string& InstanceUpdate::AppId() const {
  return delta_ ? delta_->AppId() : state_->AppId();
}

const base::UnguessableToken& InstanceUpdate::InstanceId() const {
  return delta_ ? delta_->InstanceId() : state_->InstanceId();
}

aura::Window* InstanceUpdate::Window() const {
  GET_VALUE(Window);
}

bool InstanceUpdate::WindowChanged() const {
  IS_VALUE_CHANGED(Window);
}

const std::string& InstanceUpdate::LaunchId() const {
  GET_VALUE_WITH_CHECK_AND_DEFAULT_RETURN(LaunchId(), empty,
                                          base::EmptyString());
}

bool InstanceUpdate::LaunchIdChanged() const {
  IS_VALUE_CHANGED_WITH_CHECK(LaunchId(), empty);
}

InstanceState InstanceUpdate::State() const {
  GET_VALUE_WITH_DEFAULT_VALUE(State(), InstanceState::kUnknown);
}

bool InstanceUpdate::StateChanged() const {
  IS_VALUE_CHANGED_WITH_DEFAULT_VALUE(State(), InstanceState::kUnknown);
}

base::Time InstanceUpdate::LastUpdatedTime() const {
  GET_VALUE_WITH_CHECK_AND_DEFAULT_RETURN(LastUpdatedTime(), is_null,
                                          base::Time());
}

bool InstanceUpdate::LastUpdatedTimeChanged() const {
  IS_VALUE_CHANGED_WITH_CHECK(LastUpdatedTime(), is_null);
}

content::BrowserContext* InstanceUpdate::BrowserContext() const {
  GET_VALUE(BrowserContext);
}

bool InstanceUpdate::BrowserContextChanged() const {
  IS_VALUE_CHANGED(BrowserContext);
}

}  // namespace apps