diff --git a/configstore/Android.bp b/configstore/Android.bp index bbb3e4bac0..79b63f60bc 100644 --- a/configstore/Android.bp +++ b/configstore/Android.bp @@ -1,4 +1,5 @@ // This is an autogenerated file, do not edit. subdirs = [ "1.0", + "utils", ] diff --git a/configstore/utils/Android.bp b/configstore/utils/Android.bp new file mode 100644 index 0000000000..32053a7580 --- /dev/null +++ b/configstore/utils/Android.bp @@ -0,0 +1,28 @@ +// +// 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. +// + +cc_library_static { + name: "android.hardware.configstore-utils", + export_include_dirs: ["include"], + srcs: [], + shared_libs: [ + "android.hardware.configstore@1.0", + ], + export_shared_lib_headers: [ + "android.hardware.configstore@1.0", + ], +} + diff --git a/configstore/utils/include/configstore/Utils.h b/configstore/utils/include/configstore/Utils.h new file mode 100644 index 0000000000..98ccae904f --- /dev/null +++ b/configstore/utils/include/configstore/Utils.h @@ -0,0 +1,94 @@ +// +// 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. +// + +#ifndef ANDROID_HARDWARE_CONFIGSTORE_UTILS_H +#define ANDROID_HARDWARE_CONFIGSTORE_UTILS_H + +#include +#include + +namespace android { +namespace hardware { +namespace configstore { +// arguments V: type for the value (i.e., OptionalXXX) +// I: interface class name +// func: member function pointer +using namespace V1_0; + +template (I::* func) + (std::function)> +decltype(V::value) get(const decltype(V::value) &defValue) { + auto getHelper = []()->V { + V ret; + sp configs = I::getService(); + + if (!configs.get()) { + // fallback to the default value + ret.specified = false; + } else { + (*configs.*func)([&ret](V v) { + ret = v; + }); + } + + return ret; + }; + static V cachedValue = getHelper(); + + return cachedValue.specified ? cachedValue.value : defValue; +} + +template (I::* func) + (std::function)> +bool getBool(const bool defValue) { + return get(defValue); +} + +template (I::* func) + (std::function)> +int32_t getInt32(const int32_t defValue) { + return get(defValue); +} + +template (I::* func) + (std::function)> +uint32_t getUInt32(const uint32_t defValue) { + return get(defValue); +} + +template (I::* func) + (std::function)> +int64_t getInt64(const int64_t defValue) { + return get(defValue); +} + +template (I::* func) + (std::function)> +uint64_t getUInt64(const uint64_t defValue) { + return get(defValue); +} + +template (I::* func) + (std::function)> +std::string getString(const std::string &defValue) { + return get(defValue); +} + +} // namespace configstore +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CONFIGSTORE_UTILS_H