blob: 115dc11a1ff3bce15444b402c4b3faaa9ee3f05b [file] [log] [blame]
/*
* Copyright (c) 2024 Project CHIP Authors
* 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.
* 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 <access/SubjectDescriptor.h>
#include <app/ConcreteAttributePath.h>
#include <app/ConcreteCommandPath.h>
#include <lib/support/BitFlags.h>
#include <cstdint>
#include <optional>
namespace chip {
namespace app {
namespace InteractionModel {
/// Contains common flags among all interaction model operations: read/write/invoke
enum class OperationFlags : uint32_t
{
kInternal = 0x0001, // Internal request for data changes (can bypass checks/ACL etc.)
};
/// This information is available for ALL interactions: read/write/invoke
struct OperationRequest
{
OperationFlags operationFlags;
/// Current authentication data EXCEPT for internal requests.
/// - Non-internal requests MUST have this set.
/// - operationFlags.Has(OperationFlags::kInternal) MUST NOT have this set
std::optional<chip::Access::SubjectDescriptor> subjectDescriptor;
};
enum class ReadFlags : uint32_t
{
kFabricFiltered = 0x0001, // reading is performed fabric-filtered
};
struct ReadAttributeRequest : OperationRequest
{
ConcreteAttributePath path;
std::optional<DataVersion> dataVersion;
BitFlags<ReadFlags> readFlags;
};
struct ReadState
{
// When reading lists, reading will start at this index.
// As list data is read, this index is incremented
ListIndex listEncodeStart = kInvalidListIndex;
};
enum class WriteFlags : uint32_t
{
kTimed = 0x0001, // Received as a 2nd command after a timed invoke
kListBegin = 0x0002, // This is the FIRST list data element in a series of data
kListEnd = 0x0004, // This is the LAST list element to write
};
struct WriteAttributeRequest : OperationRequest
{
ConcreteDataAttributePath path; // NOTE: this also contains LIST operation options (i.e. "data" path type)
BitFlags<WriteFlags> writeFlags;
};
enum class InvokeFlags : uint32_t
{
kTimed = 0x0001, // Received as a 2nd command after a timed invoke
};
struct InvokeRequest : OperationRequest
{
ConcreteCommandPath path;
std::optional<GroupId> groupRequestId; // set if and only if this was a group request
BitFlags<InvokeFlags> invokeFlags;
};
} // namespace InteractionModel
} // namespace app
} // namespace chip