Line data Source code
1 : /* 2 : * 3 : * Copyright (c) 2021 Project CHIP Authors 4 : * All rights reserved. 5 : * 6 : * Licensed under the Apache License, Version 2.0 (the "License"); 7 : * you may not use this file except in compliance with the License. 8 : * You may obtain a copy of the License at 9 : * 10 : * http://www.apache.org/licenses/LICENSE-2.0 11 : * 12 : * Unless required by applicable law or agreed to in writing, software 13 : * distributed under the License is distributed on an "AS IS" BASIS, 14 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 : * See the License for the specific language governing permissions and 16 : * limitations under the License. 17 : */ 18 : 19 : #pragma once 20 : 21 : #include <app/OperationalSessionSetup.h> 22 : #include <controller/CHIPDeviceController.h> 23 : #include <lib/core/CHIPCallback.h> 24 : 25 : namespace chip { 26 : namespace Controller { 27 : 28 : typedef void (*OnCurrentFabricRemove)(void * context, NodeId remoteNodeId, CHIP_ERROR status); 29 : 30 : /** 31 : * A helper class to remove fabric given some parameters. 32 : */ 33 : class CurrentFabricRemover 34 : { 35 : public: 36 0 : CurrentFabricRemover(DeviceController * controller) : 37 0 : mController(controller), mOnDeviceConnectedCallback(&OnDeviceConnectedFn, this), 38 0 : mOnDeviceConnectionFailureCallback(&OnDeviceConnectionFailureFn, this) 39 0 : {} 40 : 41 : enum class Step : uint8_t 42 : { 43 : // Ready to start removing a fabric. 44 : kAcceptRemoveFabricStart = 0, 45 : // Need to get Current Fabric Index. 46 : kReadCurrentFabricIndex, 47 : // Need to send Remove Fabric Command. 48 : kSendRemoveFabric, 49 : }; 50 : 51 : /* 52 : * @brief 53 : * Try to look up the device attached to our controller with the given 54 : * remote node id and ask it to remove Fabric. 55 : * If function returns an error, callback will never be be executed. Otherwise, callback will always be executed. 56 : * 57 : * @param[in] remoteNodeId The remote device Id 58 : * @param[in] callback The callback to call once the remote fabric is completed or not. 59 : */ 60 : CHIP_ERROR RemoveCurrentFabric(NodeId remoteNodeId, Callback::Callback<OnCurrentFabricRemove> * callback); 61 : 62 : private: 63 : DeviceController * mController; 64 : 65 : chip::Callback::Callback<OnDeviceConnected> mOnDeviceConnectedCallback; 66 : chip::Callback::Callback<OnDeviceConnectionFailure> mOnDeviceConnectionFailureCallback; 67 : chip::Callback::Callback<OnCurrentFabricRemove> * mCurrentFabricRemoveCallback; 68 : 69 : NodeId mRemoteNodeId; 70 : FabricIndex mFabricIndex = kUndefinedFabricIndex; 71 : Step mNextStep = Step::kAcceptRemoveFabricStart; 72 : 73 : CHIP_ERROR ReadCurrentFabricIndex(Messaging::ExchangeManager & exchangeMgr, const SessionHandle & sessionHandle); 74 : CHIP_ERROR SendRemoveFabricIndex(Messaging::ExchangeManager & exchangeMgr, const SessionHandle & sessionHandle); 75 : 76 : static void OnDeviceConnectedFn(void * context, Messaging::ExchangeManager & exchangeMgr, const SessionHandle & sessionHandle); 77 : static void OnDeviceConnectionFailureFn(void * context, const ScopedNodeId & peerId, CHIP_ERROR error); 78 : 79 : static void OnSuccessReadCurrentFabricIndex(void * context, FabricIndex fabricIndex); 80 : static void OnReadAttributeFailure(void * context, CHIP_ERROR error); 81 : 82 : static void 83 : OnSuccessRemoveFabric(void * context, 84 : const chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType & data); 85 : static void OnCommandFailure(void * context, CHIP_ERROR error); 86 : 87 : static void FinishRemoveCurrentFabric(void * context, CHIP_ERROR err); 88 : }; 89 : 90 : /** 91 : * A helper class that can be used by consumers that don't care about the callback from the 92 : * remove fabric process and just want automatic cleanup of the CurrentFabricRemover when done 93 : * with it. 94 : */ 95 : class AutoCurrentFabricRemover : private CurrentFabricRemover 96 : { 97 : public: 98 : // Takes the same arguments as CurrentFabricRemover::RemoveCurrentFabric except without the callback. 99 : static CHIP_ERROR RemoveCurrentFabric(DeviceController * controller, NodeId remoteNodeId); 100 : 101 : private: 102 : AutoCurrentFabricRemover(DeviceController * controller); 103 : static void OnRemoveCurrentFabric(void * context, NodeId remoteNodeId, CHIP_ERROR status); 104 : chip::Callback::Callback<OnCurrentFabricRemove> mOnRemoveCurrentFabricCallback; 105 : }; 106 : 107 : } // namespace Controller 108 : } // namespace chip