avs-device-sdk/Settings/include/Settings/SettingProtocolInterface.h

120 lines
4.8 KiB
C++

/*
* Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0/
*
* or in the "license" file accompanying this file. This file 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 ALEXA_CLIENT_SDK_SETTINGS_INCLUDE_SETTINGS_SETTINGPROTOCOLINTERFACE_H_
#define ALEXA_CLIENT_SDK_SETTINGS_INCLUDE_SETTINGS_SETTINGPROTOCOLINTERFACE_H_
#include <functional>
#include <memory>
#include <string>
#include <utility>
#include <AVSCommon/Utils/Threading/Executor.h>
#include "Settings/SetSettingResult.h"
#include "Settings/SettingObserverInterface.h"
namespace alexaClientSDK {
namespace settings {
/**
* Interface for the multiple setting management protocols.
*
* The setting protocol should ensure that events are sent to AVS as expected and the setting value is persisted. The
* setting protocol also MUST only execute one request at a time.
*/
class SettingProtocolInterface {
public:
/**
* Callback function type used for applying new values.
*
* @return A pair where the first element indicates if the operation succeeded or not, and the second element is
* a string representation of the final value.
*/
using ApplyChangeFunction = std::function<std::pair<bool, std::string>()>;
/**
* Callback function type used for applying value retrieved from the database.
*
* @param dbValue A string representation of the value retrieved from the database. An empty string will be used
* to indicate that no value was found in the database.
* @return A pair where the first element indicates if the operation succeeded or not, and the second element is
* a string representation of the final value.
*/
using ApplyDbChangeFunction = std::function<std::pair<bool, std::string>(const std::string& dbValue)>;
/**
* Callback function type used to notify observers of whether the request succeeded or failed.
*
* @param notification The operation result.
*/
using SettingNotificationFunction = std::function<void(SettingNotifications notification)>;
/**
* Callback function type used to revert the last value change.
*
* @return A string representation of the setting value after the revert operation.
*/
using RevertChangeFunction = std::function<std::string()>;
/**
* Implements the protocol for changing a setting value through local UI.
*
* @param applyChange Function that can be used to apply the new value.
* @param revertChange Function that can be used to revert the change. This function should only be called if the
* apply change succeeded but some other part of the protocol has failed.
* @param notifyObservers Function used to notify the observers of the protocol result.
* @return Returns what was the set result.
*/
virtual SetSettingResult localChange(
ApplyChangeFunction applyChange,
RevertChangeFunction revertChange,
SettingNotificationFunction notifyObservers) = 0;
/**
* Implements the protocol for changing a setting value triggered by an AVS directive.
*
* @param applyChange Function that can be used to apply the new value.
* @param revertChange Function that can be used to revert the change. This function should only be called if the
* apply change succeeded but some other part of the protocol has failed.
* @param notifyObservers Function used to notify the observers of the protocol result.
* @return @c true if the directive was enqueued correctly; @c false otherwise.
*/
virtual bool avsChange(
ApplyChangeFunction applyChange,
RevertChangeFunction revertChange,
SettingNotificationFunction notifyObservers) = 0;
/**
* Implements the protocol for restoring a value from the storage.
*
* @param applyChange Function that can be used to apply the value restored from the storage. This function will
* be called with empty string if no value was found in the database.
* @param notifyObservers Function used to notify the observers of the protocol result.
* @return @c true if the directive was enqueued correctly; @c false otherwise.
*/
virtual bool restoreValue(ApplyDbChangeFunction applyChange, SettingNotificationFunction notifyObservers) = 0;
/**
* Destructor.
*/
virtual ~SettingProtocolInterface() = default;
};
} // namespace settings
} // namespace alexaClientSDK
#endif // ALEXA_CLIENT_SDK_SETTINGS_INCLUDE_SETTINGS_SETTINGPROTOCOLINTERFACE_H_