/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <memory>
#include "SchemaType.h"
#include "VintfObject.h"
namespace android {
namespace vintf {
namespace details {
/**
* Simulate the state of VintfObject after an update.
*
* - Old metadata is stored in parent VintfObject.
* - New (updated) metadata is stored in this VintfObjectAfterUpdate
* - Dependencies are from the given VintfObject (dep) before construction.
*/
class VintfObjectAfterUpdate : public VintfObject {
public:
/* Use dependencies from the object dep. */
VintfObjectAfterUpdate(VintfObject* dep) : mDependency(dep) {}
std::shared_ptr<const HalManifest> getDeviceHalManifest(bool skipCache = false) override {
if (mDeviceManifest != nullptr) return mDeviceManifest;
return VintfObject::getDeviceHalManifest(skipCache);
}
std::shared_ptr<const HalManifest> getFrameworkHalManifest(bool skipCache = false) override {
if (mFrameworkManifest != nullptr) return mFrameworkManifest;
return VintfObject::getFrameworkHalManifest(skipCache);
}
std::shared_ptr<const CompatibilityMatrix> getDeviceCompatibilityMatrix(
bool skipCache = false) override {
if (mDeviceMatrix != nullptr) return mDeviceMatrix;
return VintfObject::getDeviceCompatibilityMatrix(skipCache);
}
std::shared_ptr<const CompatibilityMatrix> getFrameworkCompatibilityMatrix(
bool skipCache = false) override {
if (mFrameworkMatrix != nullptr) return mFrameworkMatrix;
return VintfObject::getFrameworkCompatibilityMatrix(skipCache);
}
const std::unique_ptr<FileSystem>& getFileSystem() override {
return mDependency->getFileSystem();
}
const std::unique_ptr<PropertyFetcher>& getPropertyFetcher() override {
return mDependency->getPropertyFetcher();
}
const std::unique_ptr<ObjectFactory<RuntimeInfo>>& getRuntimeInfoFactory() override {
return mDependency->getRuntimeInfoFactory();
}
bool set(const std::shared_ptr<HalManifest>& o) {
return set(o, &mDeviceManifest, &mFrameworkManifest);
}
bool set(const std::shared_ptr<CompatibilityMatrix>& o) {
return set(o, &mDeviceMatrix, &mFrameworkMatrix);
}
private:
VintfObject* mDependency = nullptr;
std::shared_ptr<HalManifest> mDeviceManifest;
std::shared_ptr<HalManifest> mFrameworkManifest;
std::shared_ptr<CompatibilityMatrix> mDeviceMatrix;
std::shared_ptr<CompatibilityMatrix> mFrameworkMatrix;
template <typename T>
bool set(const std::shared_ptr<T>& o, std::shared_ptr<T>* dev, std::shared_ptr<T>* fwk) {
if (o->type() == SchemaType::DEVICE) {
if (*dev != nullptr) return false;
*dev = o;
return true;
} else if (o->type() == SchemaType::FRAMEWORK) {
if (*fwk != nullptr) return false;
*fwk = o;
return true;
}
return false;
}
};
} // namespace details
} // namespace vintf
} // namespace android