|  | /* | 
|  | * | 
|  | *    Copyright (c) 2021 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. | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * @file | 
|  | *   API for managing a programmable NFC Tag. | 
|  | */ | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #include <lib/core/CHIPError.h> | 
|  |  | 
|  | #include <cstddef> | 
|  |  | 
|  | namespace chip { | 
|  | namespace DeviceLayer { | 
|  |  | 
|  | class NFCOnboardingPayloadManagerImpl; | 
|  |  | 
|  | /** | 
|  | * @brief Defines an abstract interface for programming an NFC Tag with onboarding payload. | 
|  | * | 
|  | * NFC Tag can be used in Project CHIP to share the onboarding payload, including | 
|  | * the device discriminator and PIN code, with a commissioner. This class | 
|  | * provides an interface to set contents of a programmable NFC Tag. | 
|  | */ | 
|  | class NFCOnboardingPayloadManager | 
|  | { | 
|  | public: | 
|  | /** | 
|  | * Initializes the NFCOnboardingPayloadManager singleton object. | 
|  | * | 
|  | * @return CHIP_NO_ERROR On success. | 
|  | */ | 
|  | CHIP_ERROR Init(); | 
|  |  | 
|  | /** | 
|  | * Starts NFC Tag emulation using the specified payload. | 
|  | * | 
|  | * @param[in] payload       Address of the payload to be written to the NFC Tag. | 
|  | * @param[in] payloadLength Length of the payload. | 
|  | * | 
|  | * @return CHIP_NO_ERROR On success. | 
|  | *         CHIP_ERROR_BUFFER_TOO_SMALL Payload could not fit in an internal buffer. | 
|  | */ | 
|  | CHIP_ERROR StartTagEmulation(const char * payload, size_t payloadLength); | 
|  |  | 
|  | /** | 
|  | * Stops NFC Tag emulation. | 
|  | * | 
|  | * @return CHIP_NO_ERROR On success. | 
|  | */ | 
|  | CHIP_ERROR StopTagEmulation(); | 
|  |  | 
|  | /** Determines whether NFC Tag emulation is started | 
|  | * | 
|  | * @return true NFC Tag is enabled. | 
|  | *         false NFC Tag is disabled. | 
|  | */ | 
|  | bool IsTagEmulationStarted() const; | 
|  |  | 
|  | protected: | 
|  | // Construction/destruction limited to subclasses. | 
|  | NFCOnboardingPayloadManager()  = default; | 
|  | ~NFCOnboardingPayloadManager() = default; | 
|  |  | 
|  | // No copy, move or assignment. | 
|  | NFCOnboardingPayloadManager(const NFCOnboardingPayloadManager &) = delete; | 
|  | NFCOnboardingPayloadManager(NFCOnboardingPayloadManager &&)      = delete; | 
|  | void operator=(const NFCOnboardingPayloadManager &)              = delete; | 
|  |  | 
|  | // NFCOnboardingPayloadManager implementation getters. | 
|  | NFCOnboardingPayloadManagerImpl * Impl(); | 
|  | const NFCOnboardingPayloadManagerImpl * Impl() const; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Returns a reference to the public interface of the NFCOnboardingPayloadManager singleton object. | 
|  | */ | 
|  | extern NFCOnboardingPayloadManager & NFCOnboardingPayloadMgr(); | 
|  |  | 
|  | /** | 
|  | * Returns a reference to the platform-specific NFCOnboardingPayloadManager singleton object. | 
|  | */ | 
|  | extern NFCOnboardingPayloadManagerImpl & NFCOnboardingPayloadMgrImpl(); | 
|  |  | 
|  | } // namespace DeviceLayer | 
|  | } // namespace chip | 
|  |  | 
|  | #ifdef EXTERNAL_NFC_ONBOARDING_PAYLOAD_MANAGER_IMPL_HEADER | 
|  | #include EXTERNAL_NFC_ONBOARDING_PAYLOAD_MANAGER_IMPL_HEADER | 
|  | #elif defined(CHIP_DEVICE_LAYER_TARGET) | 
|  | #define NFC_ONBOARDING_PAYLOAD_MANAGER_IMPL_HEADER <platform/CHIP_DEVICE_LAYER_TARGET/NFCOnboardingPayloadManagerImpl.h> | 
|  | #include NFC_ONBOARDING_PAYLOAD_MANAGER_IMPL_HEADER | 
|  | #endif // defined(CHIP_DEVICE_LAYER_TARGET) | 
|  |  | 
|  | namespace chip { | 
|  | namespace DeviceLayer { | 
|  |  | 
|  | inline CHIP_ERROR NFCOnboardingPayloadManager::Init() | 
|  | { | 
|  | return Impl()->_Init(); | 
|  | } | 
|  |  | 
|  | inline CHIP_ERROR NFCOnboardingPayloadManager::StartTagEmulation(const char * payload, size_t payloadLength) | 
|  | { | 
|  | return Impl()->_StartTagEmulation(payload, payloadLength); | 
|  | } | 
|  |  | 
|  | inline CHIP_ERROR NFCOnboardingPayloadManager::StopTagEmulation() | 
|  | { | 
|  | return Impl()->_StopTagEmulation(); | 
|  | } | 
|  |  | 
|  | inline bool NFCOnboardingPayloadManager::IsTagEmulationStarted() const | 
|  | { | 
|  | return Impl()->_IsTagEmulationStarted(); | 
|  | } | 
|  |  | 
|  | inline NFCOnboardingPayloadManagerImpl * NFCOnboardingPayloadManager::Impl() | 
|  | { | 
|  | return static_cast<NFCOnboardingPayloadManagerImpl *>(this); | 
|  | } | 
|  |  | 
|  | inline const NFCOnboardingPayloadManagerImpl * NFCOnboardingPayloadManager::Impl() const | 
|  | { | 
|  | return static_cast<const NFCOnboardingPayloadManagerImpl *>(this); | 
|  | } | 
|  |  | 
|  | } // namespace DeviceLayer | 
|  | } // namespace chip |