/* * * 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 "Types.h" #include #include namespace matter { namespace casting { namespace core { /** * This class contains the optional parameters used in the IdentificationDeclaration Message, sent by the Commissionee to the * Commissioner. The options specify information relating to the requested UDC commissioning session. */ class IdentificationDeclarationOptions { public: /** * Feature: Target Content Application * Flag to instruct the Commissioner not to display a Passcode input dialog, and instead send a CommissionerDeclaration message * if a commissioning Passcode is needed. */ bool mNoPasscode = false; /** * Feature: Coordinate Passcode Dialogs * Flag to instruct the Commissioner to send a CommissionerDeclaration message when the Passcode input dialog on the * Commissioner has been shown to the user. */ bool mCdUponPasscodeDialog = false; /** * Feature: Commissioner-Generated Passcode * Flag to instruct the Commissioner to use the Commissioner-generated Passcode for commissioning. */ bool mCommissionerPasscode = false; /** * Feature: Commissioner-Generated Passcode * Flag to indicate whether or not the Commissionee has obtained the Commissioner Passcode from the user and is therefore ready * for commissioning. */ bool mCommissionerPasscodeReady = false; /** * Feature: Coordinate Passcode Dialogs * Flag to indicate when the Commissionee user has decided to exit the commissioning process. */ bool mCancelPasscode = false; /** * Commissionee's (random) DNS-SD instance name. This field is mandatory and will be auto generated if not provided by the * client. */ char mCommissioneeInstanceName[chip::Dnssd::Commission::kInstanceNameMaxLength + 1] = ""; CHIP_ERROR addTargetAppInfo(const chip::Protocols::UserDirectedCommissioning::TargetAppInfo & targetAppInfo) { ChipLogProgress(AppServer, "IdentificationDeclarationOptions::addTargetAppInfo()"); if (mTargetAppInfos.size() >= CHIP_DEVICE_CONFIG_UDC_MAX_TARGET_APPS) { ChipLogError(AppServer, "IdentificationDeclarationOptions::addTargetAppInfo() failed to add TargetAppInfo, max vector size is %d", CHIP_DEVICE_CONFIG_UDC_MAX_TARGET_APPS); return CHIP_ERROR_NO_MEMORY; } mTargetAppInfos.push_back(targetAppInfo); return CHIP_NO_ERROR; } std::vector getTargetAppInfoList() const { return mTargetAppInfos; } void resetState() { mNoPasscode = false; mCdUponPasscodeDialog = false; mCommissionerPasscode = false; mCommissionerPasscodeReady = false; mCancelPasscode = false; mTargetAppInfos.clear(); } /** * @brief Builds an IdentificationDeclaration message to be sent to a CastingPlayer, given the options state specified in this * object. */ chip::Protocols::UserDirectedCommissioning::IdentificationDeclaration buildIdentificationDeclarationMessage() { ChipLogProgress(AppServer, "IdentificationDeclarationOptions::buildIdentificationDeclarationMessage()"); chip::Protocols::UserDirectedCommissioning::IdentificationDeclaration id; std::vector targetAppInfos = getTargetAppInfoList(); for (size_t i = 0; i < targetAppInfos.size(); i++) { id.AddTargetAppInfo(targetAppInfos[i]); } id.SetNoPasscode(mNoPasscode); id.SetCdUponPasscodeDialog(mCdUponPasscodeDialog); id.SetCancelPasscode(mCancelPasscode); id.SetCommissionerPasscode(mCommissionerPasscode); if (mCommissionerPasscodeReady) { id.SetCommissionerPasscodeReady(true); id.SetInstanceName(mCommissioneeInstanceName); } else { ChipLogProgress(AppServer, "IdentificationDeclarationOptions::buildIdentificationDeclarationMessage() generating InstanceName"); CHIP_ERROR err = chip::app::DnssdServer::Instance().GetCommissionableInstanceName(mCommissioneeInstanceName, sizeof(mCommissioneeInstanceName)); if (err != CHIP_NO_ERROR) { ChipLogError(AppServer, "IdentificationDeclarationOptions::buildIdentificationDeclarationMessage() Failed to get mdns " "instance name error: %" CHIP_ERROR_FORMAT, err.Format()); } else { id.SetInstanceName(mCommissioneeInstanceName); ChipLogProgress(AppServer, "IdentificationDeclarationOptions::buildIdentificationDeclarationMessage() InstanceName set to: %s", mCommissioneeInstanceName); } } LogDetail(); return id; } void LogDetail() { ChipLogDetail(AppServer, "IdentificationDeclarationOptions::LogDetail() - cpp"); ChipLogDetail(AppServer, "IdentificationDeclarationOptions::mNoPasscode: %s", mNoPasscode ? "true" : "false"); ChipLogDetail(AppServer, "IdentificationDeclarationOptions::mCdUponPasscodeDialog: %s", mCdUponPasscodeDialog ? "true" : "false"); ChipLogDetail(AppServer, "IdentificationDeclarationOptions::mCommissionerPasscode: %s", mCommissionerPasscode ? "true" : "false"); ChipLogDetail(AppServer, "IdentificationDeclarationOptions::mCommissionerPasscodeReady: %s", mCommissionerPasscodeReady ? "true" : "false"); ChipLogDetail(AppServer, "IdentificationDeclarationOptions::mCancelPasscode: %s", mCancelPasscode ? "true" : "false"); ChipLogDetail(AppServer, "IdentificationDeclarationOptions::mCommissioneeInstanceName: %s", mCommissioneeInstanceName); ChipLogDetail(AppServer, "IdentificationDeclarationOptions::TargetAppInfos list:"); for (size_t i = 0; i < mTargetAppInfos.size(); i++) { const chip::Protocols::UserDirectedCommissioning::TargetAppInfo & info = mTargetAppInfos[i]; ChipLogDetail(AppServer, "\t\tTargetAppInfo %d, Vendor ID: %u, Product ID: %u", int(i + 1), info.vendorId, info.productId); } } private: /** * Feature: Target Content Application * The set of content app Vendor IDs (and optionally, Product IDs) that can be used for authentication. * Also, if TargetAppInfo is passed in, VerifyOrEstablishConnection() will force User Directed Commissioning, in case the * desired TargetApp is not found in the on-device CastingStore. */ std::vector mTargetAppInfos; }; }; // namespace core }; // namespace casting }; // namespace matter