# Upgrading notes ## API changes and code migration ### `CommandHandler` `CommandHandler` ability to directly invoke `Prepare/TLV-Write/Finish` cycles has been changed to only expose `AddResponse/AddStatus/AddClusterSpecific*`. Original versions of `CommandHandler` exposed the following low-level implementation-specific methods: `PrepareCommand`, `PrepareInvokeResponseCommand`, `GetCommandDataIBTLVWriter` and `FinishCommand`. These are not exposed anymore and instead one should use `AddResponse` or `AddResponseData`. When using an `EncodableToTLV` argument, the same functionality should be achievable. Example Before: ```cpp const CommandHandler::InvokeResponseParameters prepareParams(requestPath); ReturnOnFailure(commandHandler->PrepareInvokeResponseCommand(path, prepareParams)); TLV::TLVWriter *writer = commandHandler->GetCommandDataIBTLVWriter(); ReturnOnFailure(writer->Put(chip::TLV::ContextTag(1), 123)); ReturnOnFailure(writer->Put(chip::TLV::ContextTag(2), 234)); return commandHandler->FinishCommand(); ``` After: ```cpp class ReplyEncoder : public DataModel::EncodableToTLV { public: CHIP_ERROR EncodeTo(TLV::TLVWriter & writer, TLV::Tag tag) const override { TLV::TLVType outerType; ReturnErrorOnFailure(writer.StartContainer(tag, TLV::kTLVType_Structure, outerType)); ReturnOnFailure(writer.Put(chip::TLV::ContextTag(1), 123)); ReturnOnFailure(writer.Put(chip::TLV::ContextTag(2), 234)); return writer.EndContainer(outerType); } }; // ... ReplyEncoder replyEncoder; commandHandler->AddResponse(path, kReplyCommandId, replyEncoder); // or if error handling is implemented: // // ReturnErrorOnFailure(commandHandler->AddResponseData(path, kReplyCommandId, replyEncoder)); // // In many cases error recovery from not being able to send a reply is not easy or expected, // so code does AddResponse rather than AddResponseData. ``` ### `CommandHandlerInterface` in `chip::app::InteractionModelEngine` Command handler lists were placed in a separate registry class that is independent of the InteractionModelEngine class. The following replacements exist: - `chip::app::InteractionModelEngine::RegisterCommandHandler` replaced by `chip::app::CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler` - `chip::app::InteractionModelEngine::UnregisterCommandHandler` replaced by `chip::app::CommandHandlerInterfaceRegistry::Instance().UnregisterCommandHandler` - `chip::app::InteractionModelEngine::FindCommandHandler` replaced by `chip::app::CommandHandlerInterfaceRegistry::Instance().GetCommandHandler` - `chip::app::InteractionModelEngine::UnregisterCommandHandlers` replaced by `chip::app::CommandHandlerInterfaceRegistry::Instance().UnregisterAllCommandHandlersForEndpoint` ### AttributeAccessInterface registration and removal A new object exists for the attribute access interface registry, accessible as `chip::app::AttributeHandlerInterfaceRegistry::Instance()` Replacements for methods are: - `registerAttributeAccessOverride` replaced by `chip::app::AttributeAccessInterfaceRegistry::Instance().Register` - `unregisterAttributeAccessOverride` replaced by `chip::app::AttributeAccessInterfaceRegistry::Instance().Unregister` - `unregisterAllAttributeAccessOverridesForEndpoint` replaced by `chip::app::AttributeAccessInterfaceRegistry::Instance().UnregisterAllForEndpoint` - `chip::app::GetAttributeAccessOverride` replaced by `chip::app::AttributeAccessInterfaceRegistry::Instance().Get`