blob: 7b3206eb5c5aadc843e1170c077fd8899165abde [file] [log] [blame]
/*
*
* Copyright (c) 2022 Project CHIP Authors
*
* 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 <algorithm>
#include <stdint.h>
#include <sys/types.h>
#include <app-common/zap-generated/cluster-objects.h>
#include <app/util/basic-types.h>
#include <lib/core/CHIPError.h>
#include <lib/core/CHIPPersistentStorageDelegate.h>
#include <platform/AttributeList.h>
namespace chip {
namespace DeviceLayer {
static constexpr size_t kMaxUserLabelListLength = 10;
static constexpr size_t kMaxLabelNameLength = 16;
static constexpr size_t kMaxLabelValueLength = 16;
static constexpr size_t kMaxActiveLocaleLength = 35;
class DeviceInfoProvider
{
public:
/**
* Template used to iterate the stored group data
*/
template <typename T>
class Iterator
{
public:
virtual ~Iterator() = default;
/**
* @retval The number of entries in total that will be iterated.
*/
virtual size_t Count() = 0;
/**
* @param[out] item Value associated with the next element in the iteration.
* @retval true if the next entry is successfully retrieved.
* @retval false if no more entries can be found.
*/
virtual bool Next(T & item) = 0;
/**
* Release the memory allocated by this iterator.
* Must be called before the pointer goes out of scope.
*/
virtual void Release() = 0;
protected:
Iterator() = default;
};
using FixedLabelType = app::Clusters::FixedLabel::Structs::LabelStruct::Type;
using UserLabelType = app::Clusters::UserLabel::Structs::LabelStruct::Type;
using CalendarType = app::Clusters::TimeFormatLocalization::CalendarTypeEnum;
using FixedLabelIterator = Iterator<FixedLabelType>;
using UserLabelIterator = Iterator<UserLabelType>;
using SupportedLocalesIterator = Iterator<CharSpan>;
using SupportedCalendarTypesIterator = Iterator<CalendarType>;
DeviceInfoProvider() = default;
virtual ~DeviceInfoProvider() = default;
// Not copyable
DeviceInfoProvider(const DeviceInfoProvider &) = delete;
DeviceInfoProvider & operator=(const DeviceInfoProvider &) = delete;
/**
* @brief Set the storage implementation used for non-volatile storage of device information data.
*
* @param storage Pointer to storage instance to set. Cannot be nullptr, will assert.
*/
void SetStorageDelegate(PersistentStorageDelegate * storage);
CHIP_ERROR SetUserLabelList(EndpointId endpoint, const AttributeList<UserLabelType, kMaxUserLabelListLength> & labelList);
CHIP_ERROR ClearUserLabelList(EndpointId endpoint);
CHIP_ERROR AppendUserLabel(EndpointId endpoint, const UserLabelType & label);
// Iterators
/**
* Creates an iterator that may be used to obtain the list of labels associated with the given endpoint.
* In order to release the allocated memory, the Release() method must be called after the iteration is finished.
* Modifying the label during the iteration is currently not supported, and may yield unexpected behaviour.
* @retval An instance of EndpointIterator on success
* @retval nullptr if no iterator instances are available.
*/
virtual FixedLabelIterator * IterateFixedLabel(EndpointId endpoint) = 0;
virtual UserLabelIterator * IterateUserLabel(EndpointId endpoint) = 0;
/**
* Creates an iterator that may be used to obtain the list of supported locales of the device.
* In order to release the allocated memory, the Release() method must be called after the iteration is finished.
* @retval An instance of EndpointIterator on success
* @retval nullptr if no iterator instances are available.
*/
virtual SupportedLocalesIterator * IterateSupportedLocales() = 0;
/**
* Creates an iterator that may be used to obtain the list of supported calendar types of the device.
* In order to release the allocated memory, the Release() method must be called after the iteration is finished.
* @retval An instance of EndpointIterator on success
* @retval nullptr if no iterator instances are available.
*/
virtual SupportedCalendarTypesIterator * IterateSupportedCalendarTypes() = 0;
protected:
PersistentStorageDelegate * mStorage = nullptr;
/**
* @brief Set the UserLabel at the specified index of the UserLabelList on a given endpoint
*
* @param endpoint - id to UserLabelList on which to set the UserLabel.
* @param index - index within the UserLabelList for which to set the UserLabel.
* @param userLabel - user label to set.
* @return CHIP_NO_ERROR on success, CHIP_ERROR_INVALID_KEY_ID if index exceed the range (Total length - 1),
* or other CHIP_ERROR values from implementation on other errors.
*/
virtual CHIP_ERROR SetUserLabelAt(EndpointId endpoint, size_t index, const UserLabelType & userLabel) = 0;
/**
* @brief Delete the UserLabel at the specified index of the UserLabelList on a given endpoint
*
* @param endpoint - id to UserLabelList on which to delete the UserLabel.
* @param index - index within the UserLabelList for which to remove the UserLabel.
* @return CHIP_NO_ERROR on success, CHIP_ERROR_INVALID_KEY_ID if index exceed the range (Total length - 1),
* or other CHIP_ERROR values from implementation on other errors.
*/
virtual CHIP_ERROR DeleteUserLabelAt(EndpointId endpoint, size_t index) = 0;
/**
* @brief Set the total length of the UserLabelList on a given endpoint
*
* @param endpoint - id of the UserLabelList.
* @param val - total count of the UserLabelList.
* @return CHIP_NO_ERROR on success, other CHIP_ERROR values from implementation on other errors.
*/
virtual CHIP_ERROR SetUserLabelLength(EndpointId endpoint, size_t val) = 0;
/**
* @brief Get the total length of the UserLabelList on a given endpoint
*
* @param endpoint - id of the UserLabelList.
* @param val - output of the total count of the UserLabelList.
* @return CHIP_NO_ERROR on success, other CHIP_ERROR values from implementation on other errors.
*/
virtual CHIP_ERROR GetUserLabelLength(EndpointId endpoint, size_t & val) = 0;
};
/**
* Instance getter for the global DeviceInfoProvider.
*
* Callers have to externally synchronize usage of this function.
*
* @return The global Device Info Provider. Assume never null.
*/
DeviceInfoProvider * GetDeviceInfoProvider();
/**
* Instance setter for the global DeviceInfoProvider.
*
* Callers have to externally synchronize usage of this function.
*
* If the `provider` is nullptr, no change is done.
*
* @param[in] provider the Device Info Provider
*/
void SetDeviceInfoProvider(DeviceInfoProvider * provider);
} // namespace DeviceLayer
} // namespace chip