/*
 * Copyright (C) 2017 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.
 */

#include "utils.h"

#ifdef LIBVINTF_TARGET
#include <android-base/logging.h>
#include <android-base/properties.h>
#endif

namespace android {
namespace vintf {
namespace details {

static PartitionMounter partitionMounter;
PartitionMounter* gPartitionMounter = &partitionMounter;

static ObjectFactory<RuntimeInfo> runtimeInfoFactory;
ObjectFactory<RuntimeInfo>* gRuntimeInfoFactory = &runtimeInfoFactory;

#ifdef LIBVINTF_TARGET
class DevicePropertyFetcher : public PropertyFetcher {
   public:
    std::string getProperty(const std::string& key,
                            const std::string& defaultValue) const override {
        return android::base::GetProperty(key, defaultValue);
    }
    uint64_t getUintProperty(const std::string& key, uint64_t defaultValue,
                             uint64_t max) const override {
        return android::base::GetUintProperty(key, defaultValue, max);
    }
    bool getBoolProperty(const std::string& key, bool defaultValue) const override {
        return android::base::GetBoolProperty(key, defaultValue);
    }
};
const PropertyFetcher& getPropertyFetcher() {
    static DevicePropertyFetcher fetcher;
    return fetcher;
}
#else
const PropertyFetcher& getPropertyFetcher() {
    static PropertyFetcher fetcher;
    return fetcher;
}
#endif

}  // namespace details
}  // namespace vintf
}  // namespace android
