blob: 50c2467b85be3ff5f5789e550259e16336babd1a [file] [log] [blame]
/**
*
* Copyright (c) 2020-2023 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.
*/
#import "CastingServerBridge.h"
#import "CastingServer.h"
#import "CommissionableDataProviderImpl.hpp"
#import "CommissionerDiscoveryDelegateImpl.h"
#import "ConversionUtils.hpp"
#import "DeviceAttestationCredentialsProviderImpl.hpp"
#import "MatterCallbacks.h"
#import "OnboardingPayload.h"
#include <credentials/DeviceAttestationCredsProvider.h>
#include <credentials/attestation_verifier/DefaultDeviceAttestationVerifier.h>
#include <credentials/attestation_verifier/DeviceAttestationVerifier.h>
#include <lib/support/CHIPListUtils.h>
#include <lib/support/CHIPMem.h>
#include <platform/PlatformManager.h>
#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE
#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021
#endif
#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR
#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00
#endif
@interface CastingServerBridge ()
@property AppParameters * appParameters;
@property OnboardingPayload * _Nonnull onboardingPayload;
@property CommissionableDataProviderImpl * commissionableDataProvider;
@property chip::Credentials::DeviceAttestationCredentialsProvider * deviceAttestationCredentialsProvider;
@property chip::CommonCaseDeviceServerInitParams * serverInitParams;
@property CommissionerDiscoveryDelegateImpl * commissionerDiscoveryDelegate;
@property TargetVideoPlayerInfo * previouslyConnectedVideoPlayer;
// queue used to serialize all work performed by the CastingServerBridge
@property (atomic) dispatch_queue_t chipWorkQueue;
@property NSMutableDictionary * subscriptionEstablishedCallbacks;
@property NSMutableDictionary * subscriptionReadSuccessCallbacks;
@property NSMutableDictionary * subscriptionReadFailureCallbacks;
@property NSMutableDictionary * readSuccessCallbacks;
@property NSMutableDictionary * readFailureCallbacks;
@end
@implementation CastingServerBridge
+ (CastingServerBridge * _Nullable)getSharedInstance
{
static CastingServerBridge * instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
- (instancetype)init
{
if (self = [super init]) {
CHIP_ERROR err = chip::Platform::MemoryInit();
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "MemoryInit failed: %s", ErrorStr(err));
return nil;
}
// TODO: Constructors should not perform heavy work like initializing the Matter SDK. This should
// be moved to initializeApp or another suitable location.
err = chip::DeviceLayer::PlatformMgr().InitChipStack();
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "InitChipStack failed: %s", ErrorStr(err));
return nil;
}
_commissionerDiscoveryDelegate = new CommissionerDiscoveryDelegateImpl();
_subscriptionEstablishedCallbacks = [NSMutableDictionary dictionary];
_subscriptionReadSuccessCallbacks = [NSMutableDictionary dictionary];
_subscriptionReadFailureCallbacks = [NSMutableDictionary dictionary];
_readSuccessCallbacks = [NSMutableDictionary dictionary];
_readFailureCallbacks = [NSMutableDictionary dictionary];
}
return self;
}
/**
Dispatches the block on the Matter SDK dispatch queue.
@param description Optional. A description of the callback to be dispatched for diagnostic purposes.
@param block The Block to be dispatched.
*/
- (void)dispatchOnMatterSDKQueue:(const NSString * _Nullable)description block:(dispatch_block_t)block
{
if (nil != description) {
ChipLogProgress(AppServer, "[SYNC] CastingServerBridge %s", [description UTF8String]);
}
dispatch_async(_chipWorkQueue, ^{
// The Matter SDK is not, generally, internally thread-safe. It relies upon the client to lock
// the SDK prior to any interactions after chip::DeviceLayer::PlatformMgr().InitChipStack()
//
// Note that it is presently safe to do at this point because InitChipStack is called in the
// constructor for the CastingServerBridge.
chip::DeviceLayer::StackLock lock;
if (nil != description) {
ChipLogProgress(AppServer, "[ASYNC (CHIP)] CastingServerBridge BEGIN %s", [description UTF8String]);
}
block();
if (nil != description) {
ChipLogProgress(AppServer, "[ASYNC (CHIP)] CastingServerBridge END %s", [description UTF8String]);
}
});
}
/**
Dispatches a client callback via a `dispatch_block_t` to be run on the client's `dispatch_queue_t`.
@param queue The client's Dispatch Queue.
@param description Optional. A description of the callback to be dispatched for diagnostic purposes.
@param block The Block to be invoked to invoke the client callback.
*/
- (void)dispatchOnClientQueue:(dispatch_queue_t)queue
description:(const NSString * _Nullable)description
block:(dispatch_block_t)block
{
// Within the CastingServerBridge, the usage pattern is typically to expose asynchronous public APIs that
// take a callback to indicate that the low-level SDK operation has been initiated (the "started"
// callback), and a separate set of result callbacks to be invoked when the low-level SDK operation
// has been completed (the "result" callbacks).
//
// All of the work is serialized on the _chipWorkQueue, with the started callback being invoked after the
// Matter SDK is called with the result callbacks. This poses a challenge because we don't have a strong
// guarantee that the Matter SDK will not complete its work and invoke the result callback before control
// is returning to the _chipWorkQueue thread; this can cause callbacks to be received in an unexpected
// order, where the result might arrive before the client knows that the call was started.
//
// To avoid this confusion, we perform a "double async" dispatch to ensure that events are delivered in a
// sensible order. First, we schedule the result callback to run on the _chipWorkQueue (so it *must* run
// after the end of the CastingServerBridge's wrapper logic that already started on the _chipWorkQueue)
// and then immediately, asynchronously dispatch the callback onto the provided client queue.
dispatch_async(_chipWorkQueue, ^{
if (nil != description) {
ChipLogProgress(AppServer, "[ASYNC (CHIP)] CastingServerBridge dispatching %s", [description UTF8String]);
}
dispatch_async(queue, ^{
if (nil != description) {
ChipLogProgress(AppServer, "[ASYNC (CLIENT)] CastingServerBridge BEGIN %s", [description UTF8String]);
}
block();
if (nil != description) {
ChipLogProgress(AppServer, "[ASYNC (CLIENT)] CastingServerBridge END %s", [description UTF8String]);
}
});
});
}
/**
A utility function that invokes an Objective C Block on the Matter Dispatch Queue in a thread-safe manner.
The result of the Objective C Block will be relayed to the `blockCompleteCallback`.
@param description Optional. A description of the Objective C Block to be invoked for diagnostic purposes.
@param callbackQueue The Dispatch Queue on which the callback shall be invoked.
@param blockCompleteCallback The callback to be invoked with the result of the Objective C Block.
@param block The Objective C Block to dispatch.
*/
- (void)withCastingServerInvokeBlock:(const NSString * _Nullable)description
callbackQueue:(dispatch_queue_t)callbackQueue
onBlockComplete:(void (^_Nonnull)(bool))blockCompleteCallback
block:(CHIP_ERROR (^_Nonnull)(CastingServer *))block
{
[self dispatchOnMatterSDKQueue:description
block:^{
CastingServer * castingServer = CastingServer::GetInstance();
// We invoke the block and capture the result on the Matter Dispatch Queue with the stack lock
// held, then use the result snapshot in the subsequent block to be asynchronously dispatched on
// the client's callback Dispatch Queue.
const CHIP_ERROR result = block(castingServer);
dispatch_async(callbackQueue, ^{
if (nil != description) {
ChipLogProgress(AppServer,
"[ASYNC (CLIENT)] CastingServerBridge invoking %s Started Callback",
[description UTF8String]);
}
blockCompleteCallback(
[[MatterError alloc] initWithCode:result.AsInteger()
message:[NSString stringWithUTF8String:result.AsString()]]);
if (nil != description) {
ChipLogProgress(AppServer,
"[ASYNC (CLIENT)] CastingServerBridge invoked %s Started Callback",
[description UTF8String]);
}
});
}];
}
/**
A utility function that invokes an Objective C Block on the Matter Dispatch Queue in a thread-safe manner.
The result of the Objective C Block will be relayed to the `blockCompleteCallback`. The response callback is expected to be called
at a later time with the asynchronous result of the Casting Server operation (by the Casting Server).
@param description Optional. A description of the Objective C Block to be invoked for diagnostic purposes.
@param blockCompleteCallback The callback to be invoked with the result of the Objective C Block.
@param responseCallback The callback that will eventually be invoked by the Casting Server when the operation has completed on the
remote end.
@param callbackQueue The Dispatch Queue on which the callbacks shall be invoked.
@param block The Objective C Block to dispatch.
*/
- (void)withCastingServerInvokeBlock:(const NSString * _Nullable)description
callbackQueue:(dispatch_queue_t)callbackQueue
onBlockComplete:(void (^_Nonnull)(bool))blockCompleteCallback
onResponse:(void (^_Nonnull)(bool))responseCallback
block:(CHIP_ERROR (^_Nonnull)(CastingServer *, std::function<void(CHIP_ERROR)>))block
{
[self withCastingServerInvokeBlock:description
callbackQueue:callbackQueue
onBlockComplete:blockCompleteCallback
block:^(CastingServer * castingServer) {
return block(castingServer, [description, responseCallback, callbackQueue](CHIP_ERROR err) {
NSString * _description = description == nil
? nil
: [NSString stringWithFormat:@"%@ Response Callback", description];
[[CastingServerBridge getSharedInstance]
dispatchOnClientQueue:callbackQueue
description:_description
block:^{
responseCallback(CHIP_NO_ERROR == err);
}];
});
}];
}
- (MatterError *)initializeApp:(AppParameters * _Nullable)appParameters
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
initAppStatusHandler:(nullable void (^)(bool))initAppStatusHandler
{
// The Matter SDK is not, generally, internally thread-safe. It relies upon the client to lock
// the SDK prior to any interactions after chip::DeviceLayer::PlatformMgr().InitChipStack()
//
// Note that it is presently safe to do at this point because InitChipStack is called in the
// constructor for the CastingServerBridge.
chip::DeviceLayer::StackLock lock;
ChipLogProgress(AppServer, "CastingServerBridge().initApp() called");
CHIP_ERROR err = CHIP_NO_ERROR;
_commissionableDataProvider = new CommissionableDataProviderImpl();
_appParameters = appParameters;
AppParams cppAppParams;
uint32_t setupPasscode = CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE;
uint16_t setupDiscriminator = CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR;
uint32_t spake2pIterationCount;
chip::ByteSpan spake2pSaltSpan, spake2pVerifierSpan;
if (_appParameters != nil) {
err = [ConversionUtils convertToCppAppParamsInfoFrom:_appParameters outAppParams:cppAppParams];
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "AppParameters conversion failed: %s", ErrorStr(err));
return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
}
// set fields in commissionableDataProvider
if (_appParameters.onboardingPayload != nil) {
setupPasscode = _appParameters.onboardingPayload.setupPasscode > 0 ? _appParameters.onboardingPayload.setupPasscode
: CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE;
setupDiscriminator = _appParameters.onboardingPayload.setupDiscriminator > 0
? _appParameters.onboardingPayload.setupDiscriminator
: CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR;
}
spake2pIterationCount = _appParameters.spake2pIterationCount;
if (_appParameters.spake2pSaltBase64 != nil) {
spake2pSaltSpan = chip::ByteSpan(
static_cast<const uint8_t *>(_appParameters.spake2pSaltBase64.bytes), _appParameters.spake2pSaltBase64.length);
}
if (_appParameters.spake2pVerifierBase64 != nil) {
chip::ByteSpan spake2pVerifierSpan
= chip::ByteSpan(static_cast<const uint8_t *>(_appParameters.spake2pVerifierBase64.bytes),
_appParameters.spake2pVerifierBase64.length);
}
err = _commissionableDataProvider->Initialize(_appParameters.spake2pVerifierBase64 != nil ? &spake2pVerifierSpan : nil,
_appParameters.spake2pSaltBase64 != nil ? &spake2pSaltSpan : nil, spake2pIterationCount, setupPasscode,
setupDiscriminator);
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "Failed to initialize CommissionableDataProvider: %s", ErrorStr(err));
return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
}
}
chip::DeviceLayer::SetCommissionableDataProvider(_commissionableDataProvider);
_commissionableDataProvider->GetSetupPasscode(setupPasscode);
_commissionableDataProvider->GetSetupDiscriminator(setupDiscriminator);
_onboardingPayload = [[OnboardingPayload alloc] initWithSetupPasscode:setupPasscode setupDiscriminator:setupDiscriminator];
// Initialize device attestation verifier from a constant version
{
// TODO: Replace testingRootStore with a AttestationTrustStore that has the necessary official PAA roots available
const chip::Credentials::AttestationTrustStore * testingRootStore = chip::Credentials::GetTestAttestationTrustStore();
SetDeviceAttestationVerifier(GetDefaultDACVerifier(testingRootStore));
}
// init app Server
_serverInitParams = new chip::CommonCaseDeviceServerInitParams();
err = _serverInitParams->InitializeStaticResourcesBeforeServerInit();
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "InitializeStaticResourcesBeforeServerInit failed: %s", ErrorStr(err));
return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
}
AppParams appParam;
if (appParameters == nil) {
err = CastingServer::GetInstance()->PreInit();
} else if ((err = [ConversionUtils convertToCppAppParamsInfoFrom:appParameters outAppParams:appParam]) == CHIP_NO_ERROR) {
err = CastingServer::GetInstance()->PreInit(&appParam);
}
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "CastingServer PreInit failed: %s", ErrorStr(err));
return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
}
err = chip::Server::GetInstance().Init(*_serverInitParams);
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "chip::Server init failed: %s", ErrorStr(err));
return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
}
_chipWorkQueue = chip::DeviceLayer::PlatformMgrImpl().GetWorkQueue();
chip::DeviceLayer::PlatformMgrImpl().StartEventLoopTask();
dispatch_async(_chipWorkQueue, ^{
CHIP_ERROR err = CHIP_NO_ERROR;
AppParams appParam;
if (appParameters == nil) {
err = CastingServer::GetInstance()->Init();
} else if ((err = [ConversionUtils convertToCppAppParamsInfoFrom:appParameters outAppParams:appParam]) == CHIP_NO_ERROR) {
err = CastingServer::GetInstance()->Init(&appParam);
}
Boolean initAppStatus = true;
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "CastingServerBridge().initApp() failed: %" CHIP_ERROR_FORMAT, err.Format());
initAppStatus = false;
}
dispatch_async(clientQueue, ^{
initAppStatusHandler(initAppStatus);
});
});
return [[MatterError alloc] initWithCode:CHIP_NO_ERROR.AsInteger()
message:[NSString stringWithUTF8String:CHIP_NO_ERROR.AsString()]];
}
- (void)setDacHolder:(DeviceAttestationCredentialsHolder * _Nonnull)deviceAttestationCredentials
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
setDacHolderStatus:(void (^_Nonnull)(MatterError * _Nonnull))setDacHolderStatus
{
dispatch_sync(_chipWorkQueue, ^{
NSData * certificationDeclarationNsData = deviceAttestationCredentials.getCertificationDeclaration;
chip::MutableByteSpan certificationDeclaration
= chip::MutableByteSpan(const_cast<uint8_t *>(static_cast<const uint8_t *>(certificationDeclarationNsData.bytes)),
certificationDeclarationNsData.length);
NSData * firmwareInformationNsData = deviceAttestationCredentials.getFirmwareInformation;
chip::MutableByteSpan firmwareInformation = chip::MutableByteSpan(
const_cast<uint8_t *>(static_cast<const uint8_t *>(firmwareInformationNsData.bytes)), firmwareInformationNsData.length);
NSData * deviceAttestationCertNsData = deviceAttestationCredentials.getDeviceAttestationCert;
chip::MutableByteSpan deviceAttestationCert
= chip::MutableByteSpan(const_cast<uint8_t *>(static_cast<const uint8_t *>(deviceAttestationCertNsData.bytes)),
deviceAttestationCertNsData.length);
NSData * productAttestationIntermediateCertNsData = deviceAttestationCredentials.getProductAttestationIntermediateCert;
chip::MutableByteSpan productAttestationIntermediateCert = chip::MutableByteSpan(
const_cast<uint8_t *>(static_cast<const uint8_t *>(productAttestationIntermediateCertNsData.bytes)),
productAttestationIntermediateCertNsData.length);
self->_deviceAttestationCredentialsProvider
= new DeviceAttestationCredentialsProviderImpl(&certificationDeclaration, &firmwareInformation, &deviceAttestationCert,
&productAttestationIntermediateCert, deviceAttestationCredentials.getDeviceAttestationCertPrivateKeyRef);
SetDeviceAttestationCredentialsProvider(self->_deviceAttestationCredentialsProvider);
dispatch_async(clientQueue, ^{
setDacHolderStatus([[MatterError alloc] initWithCode:CHIP_NO_ERROR.AsInteger()
message:[NSString stringWithUTF8String:CHIP_NO_ERROR.AsString()]]);
});
});
}
- (void)discoverCommissioners:(dispatch_queue_t _Nonnull)clientQueue
discoveryRequestSentHandler:(nullable void (^)(bool))discoveryRequestSentHandler
discoveredCommissionerHandler:(nullable void (^)(DiscoveredNodeData *))discoveredCommissionerHandler
{
[self dispatchOnMatterSDKQueue:@"discoverCommissioners(...)"
block:^{
bool discoveryRequestStatus = true;
if (discoveredCommissionerHandler != nil) {
TargetVideoPlayerInfo * cachedTargetVideoPlayerInfos
= CastingServer::GetInstance()->ReadCachedTargetVideoPlayerInfos();
self->_commissionerDiscoveryDelegate->SetUp(
clientQueue, discoveredCommissionerHandler, cachedTargetVideoPlayerInfos);
}
CHIP_ERROR err = CastingServer::GetInstance()->DiscoverCommissioners(
discoveredCommissionerHandler != nil ? self->_commissionerDiscoveryDelegate : nullptr);
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer,
"CastingServerBridge().discoverCommissioners() failed: %" CHIP_ERROR_FORMAT, err.Format());
discoveryRequestStatus = false;
}
dispatch_async(clientQueue, ^{
discoveryRequestSentHandler(discoveryRequestStatus);
});
}];
}
- (void)getDiscoveredCommissioner:(int)index
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
discoveredCommissionerHandler:(nullable void (^)(DiscoveredNodeData * _Nullable))discoveredCommissionerHandler
{
[self dispatchOnMatterSDKQueue:@"getDiscoveredCommissioner(...)"
block:^{
chip::Optional<TargetVideoPlayerInfo *> associatedConnectableVideoPlayer;
DiscoveredNodeData * commissioner = nil;
const chip::Dnssd::DiscoveredNodeData * cppDiscoveredNodeData
= CastingServer::GetInstance()->GetDiscoveredCommissioner(
index, associatedConnectableVideoPlayer);
if (cppDiscoveredNodeData != nullptr) {
commissioner = [ConversionUtils convertToObjCDiscoveredNodeDataFrom:cppDiscoveredNodeData];
if (associatedConnectableVideoPlayer.HasValue()) {
VideoPlayer * connectableVideoPlayer = [ConversionUtils
convertToObjCVideoPlayerFrom:associatedConnectableVideoPlayer.Value()];
[commissioner setConnectableVideoPlayer:connectableVideoPlayer];
}
}
dispatch_async(clientQueue, ^{
discoveredCommissionerHandler(commissioner);
});
}];
}
- (void)sendUserDirectedCommissioningRequest:(NSString * _Nonnull)commissionerIpAddress
commissionerPort:(uint16_t)commissionerPort
platformInterface:(unsigned int)platformInterface
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
udcRequestSentHandler:(nullable void (^)(bool))udcRequestSentHandler
{
const NSString * description =
[NSString stringWithFormat:@"sendUserDirectedCommissioningRequest() IP %s port %d platformInterface %d",
[commissionerIpAddress UTF8String], commissionerPort, platformInterface];
[self dispatchOnMatterSDKQueue:description
block:^{
bool udcRequestStatus;
chip::Inet::IPAddress commissionerAddrInet;
if (chip::Inet::IPAddress::FromString([commissionerIpAddress UTF8String], commissionerAddrInet)
== false) {
ChipLogError(AppServer,
"CastingServerBridge().sendUserDirectedCommissioningRequest() failed to parse IP address");
udcRequestStatus = false;
} else {
chip::Inet::InterfaceId interfaceId = chip::Inet::InterfaceId(platformInterface);
chip::Transport::PeerAddress commissionerPeerAddress
= chip::Transport::PeerAddress::UDP(commissionerAddrInet, commissionerPort, interfaceId);
CHIP_ERROR err = CastingServer::GetInstance()->SendUserDirectedCommissioningRequest(
commissionerPeerAddress);
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer,
"CastingServerBridge().sendUserDirectedCommissioningRequest() failed: "
"%" CHIP_ERROR_FORMAT,
err.Format());
udcRequestStatus = false;
} else {
udcRequestStatus = true;
}
}
dispatch_async(clientQueue, ^{
udcRequestSentHandler(udcRequestStatus);
});
}];
}
- (void)sendUserDirectedCommissioningRequest:(DiscoveredNodeData * _Nonnull)commissioner
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
udcRequestSentHandler:(nullable void (^)(bool))udcRequestSentHandler
{
const NSString * description =
[NSString stringWithFormat:@"sendUserDirectedCommissioningRequest(...) IP %s port %d platformInterface %d deviceName %s",
[commissioner.ipAddresses[0] UTF8String], commissioner.port, commissioner.platformInterface,
[commissioner.deviceName UTF8String]];
[self dispatchOnMatterSDKQueue:description
block:^{
bool udcRequestStatus;
chip::Dnssd::DiscoveredNodeData cppCommissioner;
if ([ConversionUtils convertToCppDiscoveredNodeDataFrom:commissioner
outDiscoveredNodeData:cppCommissioner]
!= CHIP_NO_ERROR) {
ChipLogError(AppServer,
"CastingServerBridge().sendUserDirectedCommissioningRequest() failed to convert "
"Commissioner(DiscoveredNodeData) "
"to Cpp type");
udcRequestStatus = false;
} else {
CHIP_ERROR err
= CastingServer::GetInstance()->SendUserDirectedCommissioningRequest(&cppCommissioner);
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer,
"CastingServerBridge().sendUserDirectedCommissioningRequest() failed: "
"%" CHIP_ERROR_FORMAT,
err.Format());
udcRequestStatus = false;
} else {
udcRequestStatus = true;
}
}
dispatch_async(clientQueue, ^{
udcRequestSentHandler(udcRequestStatus);
});
}];
}
- (OnboardingPayload *)getOnboardingPayload
{
return _onboardingPayload;
}
- (void)openBasicCommissioningWindow:(dispatch_queue_t _Nonnull)clientQueue
commissioningWindowRequestedHandler:(void (^_Nonnull)(bool))commissioningWindowRequestedHandler
commissioningCompleteCallback:(void (^_Nonnull)(bool))commissioningCompleteCallback
onConnectionSuccessCallback:(void (^_Nonnull)(VideoPlayer * _Nonnull))onConnectionSuccessCallback
onConnectionFailureCallback:(void (^_Nonnull)(MatterError * _Nonnull))onConnectionFailureCallback
onNewOrUpdatedEndpointCallback:(void (^_Nonnull)(ContentApp * _Nonnull))onNewOrUpdatedEndpointCallback
{
[self
dispatchOnMatterSDKQueue:@"openBasicCommissioningWindow(...)"
block:^{
CHIP_ERROR err = CastingServer::GetInstance()->OpenBasicCommissioningWindow(
[clientQueue, commissioningCompleteCallback](CHIP_ERROR err) {
[[CastingServerBridge getSharedInstance]
dispatchOnClientQueue:clientQueue
description:@"openBasicCommissioningWindow(...) commissioningCompleteCallback"
block:^{
commissioningCompleteCallback(CHIP_NO_ERROR == err);
}];
},
[clientQueue, onConnectionSuccessCallback](TargetVideoPlayerInfo * cppTargetVideoPlayerInfo) {
VideoPlayer * videoPlayer =
[ConversionUtils convertToObjCVideoPlayerFrom:cppTargetVideoPlayerInfo];
[[CastingServerBridge getSharedInstance]
dispatchOnClientQueue:clientQueue
description:@"openBasicCommissioningWindow(...) onConnectionSuccessCallback"
block:^{
onConnectionSuccessCallback(videoPlayer);
}];
},
[clientQueue, onConnectionFailureCallback](CHIP_ERROR err) {
[[CastingServerBridge getSharedInstance]
dispatchOnClientQueue:clientQueue
description:@"openBasicCommissioningWindow(...) onConnectionFailureCallback"
block:^{
onConnectionFailureCallback([[MatterError alloc]
initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
}];
},
[clientQueue, onNewOrUpdatedEndpointCallback](TargetEndpointInfo * cppTargetEndpointInfo) {
ContentApp * contentApp =
[ConversionUtils convertToObjCContentAppFrom:cppTargetEndpointInfo];
[[CastingServerBridge getSharedInstance]
dispatchOnClientQueue:clientQueue
description:@"openBasicCommissioningWindow(...) onNewOrUpdatedEndpointCallback"
block:^{
onNewOrUpdatedEndpointCallback(contentApp);
}];
});
dispatch_async(clientQueue, ^{
ChipLogProgress(AppServer, "[async] Dispatching commissioningWindowRequestedHandler");
commissioningWindowRequestedHandler(CHIP_NO_ERROR == err);
});
}];
}
- (void)getActiveTargetVideoPlayers:(dispatch_queue_t _Nonnull)clientQueue
activeTargetVideoPlayersHandler:(nullable void (^)(NSMutableArray * _Nullable))activeTargetVideoPlayersHandler
{
[self dispatchOnMatterSDKQueue:@"getActiveTargetVideoPlayers(...)"
block:^{
NSMutableArray * videoPlayers = [NSMutableArray new];
TargetVideoPlayerInfo * cppTargetVideoPlayerInfo
= CastingServer::GetInstance()->GetActiveTargetVideoPlayer();
if (cppTargetVideoPlayerInfo != nullptr && cppTargetVideoPlayerInfo->IsInitialized()) {
videoPlayers[0] = [ConversionUtils convertToObjCVideoPlayerFrom:cppTargetVideoPlayerInfo];
}
dispatch_async(clientQueue, ^{
activeTargetVideoPlayersHandler(videoPlayers);
});
}];
}
- (void)readCachedVideoPlayers:(dispatch_queue_t _Nonnull)clientQueue
readCachedVideoPlayersHandler:(nullable void (^)(NSMutableArray * _Nullable))readCachedVideoPlayersHandler
{
[self dispatchOnMatterSDKQueue:@"readCachedVideoPlayers(...)"
block:^{
NSMutableArray * videoPlayers = nil;
TargetVideoPlayerInfo * cppTargetVideoPlayerInfos
= CastingServer::GetInstance()->ReadCachedTargetVideoPlayerInfos();
if (cppTargetVideoPlayerInfos != nullptr) {
videoPlayers = [NSMutableArray new];
for (size_t i = 0; cppTargetVideoPlayerInfos[i].IsInitialized(); i++) {
ChipLogProgress(AppServer,
"CastingServerBridge().readCachedVideoPlayers() with nodeId: 0x" ChipLogFormatX64
" fabricIndex: %d deviceName: %s vendorId: %d",
ChipLogValueX64(cppTargetVideoPlayerInfos[i].GetNodeId()),
cppTargetVideoPlayerInfos[i].GetFabricIndex(),
cppTargetVideoPlayerInfos[i].GetDeviceName(),
cppTargetVideoPlayerInfos[i].GetVendorId());
videoPlayers[i] =
[ConversionUtils convertToObjCVideoPlayerFrom:&cppTargetVideoPlayerInfos[i]];
}
}
dispatch_async(clientQueue, ^{
readCachedVideoPlayersHandler(videoPlayers);
});
}];
}
- (void)verifyOrEstablishConnection:(VideoPlayer * _Nonnull)videoPlayer
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(nullable void (^)(MatterError * _Nonnull))requestSentHandler
onConnectionSuccessCallback:(void (^_Nonnull)(VideoPlayer * _Nonnull))onConnectionSuccessCallback
onConnectionFailureCallback:(void (^_Nonnull)(MatterError * _Nonnull))onConnectionFailureCallback
onNewOrUpdatedEndpointCallback:(void (^_Nonnull)(ContentApp * _Nonnull))onNewOrUpdatedEndpointCallback
{
[self dispatchOnMatterSDKQueue:@"verifyOrEstablishConnection(...)"
block:^{
TargetVideoPlayerInfo targetVideoPlayerInfo;
[ConversionUtils convertToCppTargetVideoPlayerInfoFrom:videoPlayer
outTargetVideoPlayerInfo:targetVideoPlayerInfo];
CHIP_ERROR err = CastingServer::GetInstance()->VerifyOrEstablishConnection(
targetVideoPlayerInfo,
[clientQueue, onConnectionSuccessCallback](TargetVideoPlayerInfo * cppTargetVideoPlayerInfo) {
VideoPlayer * videoPlayer =
[ConversionUtils convertToObjCVideoPlayerFrom:cppTargetVideoPlayerInfo];
[[CastingServerBridge getSharedInstance]
dispatchOnClientQueue:clientQueue
description:@"onConnectionSuccessCallback"
block:^{
onConnectionSuccessCallback(videoPlayer);
}];
},
[clientQueue, onConnectionFailureCallback](CHIP_ERROR err) {
[[CastingServerBridge getSharedInstance]
dispatchOnClientQueue:clientQueue
description:@"onConnectionFailureCallback"
block:^{
onConnectionFailureCallback([[MatterError alloc]
initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
}];
},
[clientQueue, onNewOrUpdatedEndpointCallback](TargetEndpointInfo * cppTargetEndpointInfo) {
ContentApp * contentApp =
[ConversionUtils convertToObjCContentAppFrom:cppTargetEndpointInfo];
[[CastingServerBridge getSharedInstance]
dispatchOnClientQueue:clientQueue
description:@"onNewOrUpdatedEndpointCallback"
block:^{
onNewOrUpdatedEndpointCallback(contentApp);
}];
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)shutdownAllSubscriptions:(dispatch_queue_t _Nonnull)clientQueue requestSentHandler:(nullable void (^)())requestSentHandler
{
[self dispatchOnMatterSDKQueue:@"shutdownAllSubscriptions(...)"
block:^{
CastingServer::GetInstance()->ShutdownAllSubscriptions();
dispatch_async(clientQueue, ^{
requestSentHandler();
});
}];
}
- (void)startMatterServer:(dispatch_queue_t _Nonnull)clientQueue
startMatterServerCompletionCallback:(nullable void (^)(MatterError * _Nonnull))startMatterServerCompletionCallback
{
[self dispatchOnMatterSDKQueue:@"startMatterServer(...)"
block:^{
// Initialize the Matter server
CHIP_ERROR err = chip::Server::GetInstance().Init(*self->_serverInitParams);
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "chip::Server init failed: %s", ErrorStr(err));
dispatch_async(clientQueue, ^{
startMatterServerCompletionCallback(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
return;
}
// Initialize binding handlers
err = CastingServer::GetInstance()->InitBindingHandlers();
if (err != CHIP_NO_ERROR) {
ChipLogError(AppServer, "Binding init failed: %s", ErrorStr(err));
dispatch_async(clientQueue, ^{
startMatterServerCompletionCallback(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
return;
}
// Now reconnect to the VideoPlayer the casting app was previously connected to (if any)
if (self->_previouslyConnectedVideoPlayer != nil) {
ChipLogProgress(AppServer,
"CastingServerBridge().startMatterServer() reconnecting to previously connected "
"VideoPlayer...");
err = CastingServer::GetInstance()->VerifyOrEstablishConnection(
*(self->_previouslyConnectedVideoPlayer),
[clientQueue, startMatterServerCompletionCallback](
TargetVideoPlayerInfo * cppTargetVideoPlayerInfo) {
dispatch_async(clientQueue, ^{
startMatterServerCompletionCallback([[MatterError alloc]
initWithCode:CHIP_NO_ERROR.AsInteger()
message:[NSString stringWithUTF8String:CHIP_NO_ERROR.AsString()]]);
});
},
[clientQueue, startMatterServerCompletionCallback](CHIP_ERROR err) {
dispatch_async(clientQueue, ^{
startMatterServerCompletionCallback([[MatterError alloc]
initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
},
[](TargetEndpointInfo * cppTargetEndpointInfo) {});
} else {
dispatch_async(clientQueue, ^{
startMatterServerCompletionCallback([[MatterError alloc]
initWithCode:CHIP_NO_ERROR.AsInteger()
message:[NSString stringWithUTF8String:CHIP_NO_ERROR.AsString()]]);
});
}
}];
}
- (void)stopMatterServer
{
[self
dispatchOnMatterSDKQueue:@"stopMatterServer(...)"
block:^{
// capture pointer to previouslyConnectedVideoPlayer, to be deleted
TargetVideoPlayerInfo * videoPlayerForDeletion
= self->_previouslyConnectedVideoPlayer == nil ? nil : self->_previouslyConnectedVideoPlayer;
// On shutting down the Matter server, the casting app will be automatically disconnected from any
// Video Players it was connected to. Save the VideoPlayer that the casting app was targetting and
// connected to, so we can reconnect to it on re-starting the Matter server.
TargetVideoPlayerInfo * currentTargetVideoPlayerInfo
= CastingServer::GetInstance()->GetActiveTargetVideoPlayer();
if (currentTargetVideoPlayerInfo != nil && currentTargetVideoPlayerInfo->IsInitialized()
&& currentTargetVideoPlayerInfo->GetOperationalDeviceProxy() != nil) {
self->_previouslyConnectedVideoPlayer = new TargetVideoPlayerInfo();
self->_previouslyConnectedVideoPlayer->Initialize(currentTargetVideoPlayerInfo->GetNodeId(),
currentTargetVideoPlayerInfo->GetFabricIndex(), nullptr, nullptr,
currentTargetVideoPlayerInfo->GetVendorId(), currentTargetVideoPlayerInfo->GetProductId(),
currentTargetVideoPlayerInfo->GetDeviceType(), currentTargetVideoPlayerInfo->GetDeviceName(),
currentTargetVideoPlayerInfo->GetHostName(), currentTargetVideoPlayerInfo->GetNumIPs(),
const_cast<chip::Inet::IPAddress *>(currentTargetVideoPlayerInfo->GetIpAddresses()));
TargetEndpointInfo * prevEndpoints = self->_previouslyConnectedVideoPlayer->GetEndpoints();
if (prevEndpoints != nullptr) {
for (size_t i = 0; i < kMaxNumberOfEndpoints; i++) {
prevEndpoints[i].Reset();
}
}
TargetEndpointInfo * currentEndpoints = currentTargetVideoPlayerInfo->GetEndpoints();
for (size_t i = 0; i < kMaxNumberOfEndpoints && currentEndpoints[i].IsInitialized(); i++) {
prevEndpoints[i].Initialize(currentEndpoints[i].GetEndpointId());
chip::ClusterId * currentClusters = currentEndpoints[i].GetClusters();
for (size_t j = 0;
j < kMaxNumberOfClustersPerEndpoint && currentClusters[j] != chip::kInvalidClusterId;
j++) {
prevEndpoints[i].AddCluster(currentClusters[j]);
}
}
} else {
self->_previouslyConnectedVideoPlayer = nil;
}
// Now shutdown the Matter server
chip::Server::GetInstance().Shutdown();
// Delete the old previouslyConnectedVideoPlayer, if non-nil
if (videoPlayerForDeletion != nil) {
delete videoPlayerForDeletion;
}
}];
}
- (void)disconnect:(dispatch_queue_t _Nonnull)clientQueue requestSentHandler:(nullable void (^)())requestSentHandler
{
[self dispatchOnMatterSDKQueue:@"disconnect(...)"
block:^{
CastingServer::GetInstance()->Disconnect();
dispatch_async(clientQueue, ^{
requestSentHandler();
});
}];
}
- (void)purgeCache:(dispatch_queue_t _Nonnull)clientQueue responseHandler:(void (^)(MatterError * _Nonnull))responseHandler
{
dispatch_sync(_chipWorkQueue, ^{
CHIP_ERROR err = CastingServer::GetInstance()->PurgeCache();
dispatch_async(clientQueue, ^{
responseHandler([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
});
}
- (void)contentLauncher_launchUrl:(ContentApp * _Nonnull)contentApp
contentUrl:(NSString * _Nonnull)contentUrl
contentDisplayStr:(NSString * _Nonnull)contentDisplayStr
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->ContentLauncherLaunchURL(
&endpoint, [contentUrl UTF8String], [contentDisplayStr UTF8String], responseFunction);
}];
}
- (void)contentLauncher_launchContent:(ContentApp * _Nonnull)contentApp
contentSearch:(ContentLauncher_ContentSearch * _Nonnull)contentSearch
autoPlay:(bool)autoPlay
data:(NSString * _Nullable)data
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description =
[NSString stringWithFormat:@"contentLauncher_launchContent(...) with Content App endpoint ID %d", contentApp.endpointId];
// Make a copy of params before we go async.
contentSearch = [contentSearch copy];
data = [data copy];
[self
dispatchOnMatterSDKQueue:description
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
ListFreer listFreer;
chip::app::Clusters::ContentLauncher::Structs::ContentSearchStruct::Type cppSearch;
if (contentSearch.parameterList.count > 0) {
auto * parameterListHolder
= new ListHolder<chip::app::Clusters::ContentLauncher::Structs::ParameterStruct::Type>(
contentSearch.parameterList.count);
listFreer.add(parameterListHolder);
int parameterIndex = 0;
for (ContentLauncher_Parameter * parameter in contentSearch.parameterList) {
int externalIdListIndex = 0;
if (parameter.externalIDList != nil) {
auto * externalIdListHolder = new ListHolder<
chip::app::Clusters::ContentLauncher::Structs::AdditionalInfoStruct::Type>(
parameter.externalIDList.count);
listFreer.add(externalIdListHolder);
for (ContentLauncher_AdditionalInfo * additionalInfo in parameter.externalIDList) {
externalIdListHolder->mList[externalIdListIndex].value
= chip::CharSpan([additionalInfo.value UTF8String],
[additionalInfo.value lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
externalIdListHolder->mList[externalIdListIndex].name
= chip::CharSpan([additionalInfo.name UTF8String],
[additionalInfo.name lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
externalIdListIndex++;
}
parameterListHolder->mList[parameterIndex].externalIDList
= MakeOptional(chip::app::DataModel::List<
const chip::app::Clusters::ContentLauncher::Structs::AdditionalInfoStruct::Type>(
externalIdListHolder->mList, parameter.externalIDList.count));
} else {
parameterListHolder->mList[parameterIndex].externalIDList
= chip::Optional<chip::app::DataModel::List<const chip::app::Clusters::
ContentLauncher::Structs::AdditionalInfoStruct::Type>>::Missing();
}
parameterListHolder->mList[parameterIndex].type
= static_cast<chip::app::Clusters::ContentLauncher::ParameterEnum>(parameter.type);
parameterListHolder->mList[parameterIndex].value
= chip::CharSpan([parameter.value UTF8String],
[parameter.value lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
parameterIndex++;
cppSearch.parameterList = chip::app::DataModel::List<
chip::app::Clusters::ContentLauncher::Structs::ParameterStruct::Type>(
parameterListHolder->mList, contentSearch.parameterList.count);
}
}
CHIP_ERROR err = CastingServer::GetInstance()->ContentLauncher_LaunchContent(&endpoint, cppSearch,
autoPlay,
MakeOptional(
chip::CharSpan([data UTF8String], [data lengthOfBytesUsingEncoding:NSUTF8StringEncoding])),
[clientQueue, responseCallback](CHIP_ERROR err) {
[[CastingServerBridge getSharedInstance]
dispatchOnClientQueue:clientQueue
description:@"contentLauncher_launchContent(...) responseCallback"
block:^{
responseCallback(CHIP_NO_ERROR == err);
}];
});
dispatch_async(clientQueue, ^{
requestSentHandler(CHIP_NO_ERROR == err);
});
}];
}
- (void)contentLauncher_subscribeSupportedStreamingProtocols:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(uint32_t))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
const NSString * description =
[NSString stringWithFormat:@"contentLauncher_subscribeSupportedStreamingProtocols(...) with Content App endpoint ID %d",
contentApp.endpointId];
[self dispatchOnMatterSDKQueue:description
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err
= CastingServer::GetInstance()->ContentLauncher_SubscribeToSupportedStreamingProtocols(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ContentLauncher::Attributes::SupportedStreamingProtocols::
TypeInfo::DecodableArgType supportedStreamingProtocols) {
void (^callback)(uint32_t) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"contentLauncher_subscribeSupportedStreamingProtocols"];
callback(supportedStreamingProtocols);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"contentLauncher_subscribeSupportedStreamingProtocols"];
callback(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"contentLauncher_subscribeSupportedStreamingProtocols"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)levelControl_step:(ContentApp * _Nonnull)contentApp
stepMode:(uint8_t)stepMode
stepSize:(uint8_t)stepSize
transitionTime:(uint16_t)transitionTime
optionMask:(uint8_t)optionMask
optionOverride:(uint8_t)optionOverride
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->LevelControl_Step(&endpoint,
static_cast<chip::app::Clusters::LevelControl::StepMode>(stepMode), stepSize,
transitionTime, optionMask, optionOverride, responseFunction);
}];
}
- (void)levelControl_moveToLevel:(ContentApp * _Nonnull)contentApp
level:(uint8_t)level
transitionTime:(uint16_t)transitionTime
optionMask:(uint8_t)optionMask
optionOverride:(uint8_t)optionOverride
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description =
[NSString stringWithFormat:@"levelControl_moveToLevel(...) with Content App endpoint ID %d", contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->LevelControl_MoveToLevel(
&endpoint, level, transitionTime, optionMask, optionOverride, responseFunction);
}];
}
- (void)levelControl_subscribeCurrentLevel:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSNumber * _Nullable))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().levelControl_subscribeCurrentLevel() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"levelControl_subscribeCurrentLevel"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"levelControl_subscribeCurrentLevel"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"levelControl_subscribeCurrentLevel"];
[self
dispatchOnMatterSDKQueue:@"levelControl_subscribeCurrentLevel(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->LevelControl_SubscribeToCurrentLevel(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::LevelControl::Attributes::CurrentLevel::TypeInfo::DecodableArgType
currentLevel) {
void (^callback)(NSNumber * _Nullable) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"levelControl_subscribeCurrentLevel"];
callback(@(currentLevel.Value()));
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"levelControl_subscribeCurrentLevel"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"levelControl_subscribeCurrentLevel"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)levelControl_subscribeMinLevel:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(uint8_t))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer, "CastingServerBridge().levelControl_subscribeMinLevel() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"levelControl_subscribeMinLevel"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"levelControl_subscribeMinLevel"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"levelControl_subscribeMinLevel"];
[self
dispatchOnMatterSDKQueue:@"levelControl_subscribeMinLevel(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->LevelControl_SubscribeToMinLevel(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::LevelControl::Attributes::MinLevel::TypeInfo::DecodableArgType
minLevel) {
void (^callback)(uint8_t) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"levelControl_subscribeMinLevel"];
callback(minLevel);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"levelControl_subscribeMinLevel"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"levelControl_subscribeMinLevel"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)levelControl_subscribeMaxLevel:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(uint8_t))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer, "CastingServerBridge().levelControl_subscribeMaxLevel() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"levelControl_subscribeMaxLevel"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"levelControl_subscribeMaxLevel"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"levelControl_subscribeMaxLevel"];
[self
dispatchOnMatterSDKQueue:@"levelControl_subscribeMaxLevel(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->LevelControl_SubscribeToMaxLevel(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::LevelControl::Attributes::MaxLevel::TypeInfo::DecodableArgType
maxLevel) {
void (^callback)(uint8_t) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"levelControl_subscribeMaxLevel"];
callback(maxLevel);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"levelControl_subscribeMaxLevel"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"levelControl_subscribeMaxLevel"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)mediaPlayback_play:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_Play(&endpoint, responseFunction);
}];
}
- (void)mediaPlayback_pause:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_Pause(&endpoint, responseFunction);
}];
}
- (void)mediaPlayback_stopPlayback:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_StopPlayback(&endpoint, responseFunction);
}];
}
- (void)mediaPlayback_next:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_Next(&endpoint, responseFunction);
}];
}
- (void)mediaPlayback_seek:(ContentApp * _Nonnull)contentApp
position:(uint64_t)position
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_Seek(&endpoint, position, responseFunction);
}];
}
- (void)mediaPlayback_skipForward:(ContentApp * _Nonnull)contentApp
deltaPositionMilliseconds:(uint64_t)deltaPositionMilliseconds
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_SkipForward(
&endpoint, deltaPositionMilliseconds, responseFunction);
}];
}
- (void)mediaPlayback_skipBackward:(ContentApp * _Nonnull)contentApp
deltaPositionMilliseconds:(uint64_t)deltaPositionMilliseconds
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_SkipBackward(
&endpoint, deltaPositionMilliseconds, responseFunction);
}];
}
- (void)mediaPlayback_previous:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_Previous(&endpoint, responseFunction);
}];
}
- (void)mediaPlayback_rewind:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_Rewind(&endpoint, responseFunction);
}];
}
- (void)mediaPlayback_fastForward:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_FastForward(&endpoint, responseFunction);
}];
}
- (void)mediaPlayback_startOver:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->MediaPlayback_StartOver(&endpoint, responseFunction);
}];
}
- (void)mediaPlayback_subscribeCurrentState:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(MediaPlayback_PlaybackState))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().mediaPlayback_subscribeCurrentState() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"mediaPlayback_subscribeCurrentState"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"mediaPlayback_subscribeCurrentState"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"mediaPlayback_subscribeCurrentState"];
[self
dispatchOnMatterSDKQueue:@"mediaPlayback_subscribeCurrentState(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->MediaPlayback_SubscribeToCurrentState(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::MediaPlayback::Attributes::CurrentState::TypeInfo::DecodableArgType
currentState) {
void (^callback)(MediaPlayback_PlaybackState) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"mediaPlayback_subscribeCurrentState"];
callback(MediaPlayback_PlaybackState(currentState));
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"mediaPlayback_subscribeCurrentState"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"mediaPlayback_subscribeCurrentState"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)mediaPlayback_subscribeStartTime:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSNumber * _Nullable))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer, "CastingServerBridge().mediaPlayback_subscribeStartTime() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"mediaPlayback_subscribeStartTime"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"mediaPlayback_subscribeStartTime"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"mediaPlayback_subscribeStartTime"];
[self
dispatchOnMatterSDKQueue:@"mediaPlayback_subscribeStartTime(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->MediaPlayback_SubscribeToStartTime(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::MediaPlayback::Attributes::StartTime::TypeInfo::DecodableArgType
startTime) {
void (^callback)(NSNumber * _Nullable) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"mediaPlayback_subscribeStartTime"];
callback(@(startTime.Value()));
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"mediaPlayback_subscribeStartTime"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"mediaPlayback_subscribeStartTime"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)mediaPlayback_subscribeDuration:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSNumber * _Nullable))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer, "CastingServerBridge().mediaPlayback_subscribeDuration() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"mediaPlayback_subscribeDuration"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"mediaPlayback_subscribeDuration"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"mediaPlayback_subscribeDuration"];
[self
dispatchOnMatterSDKQueue:@"mediaPlayback_subscribeDuration(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->MediaPlayback_SubscribeToDuration(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::MediaPlayback::Attributes::Duration::TypeInfo::DecodableArgType
startTime) {
void (^callback)(NSNumber * _Nullable) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"mediaPlayback_subscribeDuration"];
callback(@(startTime.Value()));
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"mediaPlayback_subscribeDuration"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"mediaPlayback_subscribeDuration"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)mediaPlayback_subscribeSampledPosition:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(MediaPlayback_PlaybackPosition * _Nullable))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().mediaPlayback_subscribeSampledPosition() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"mediaPlayback_subscribeSampledPosition"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"mediaPlayback_subscribeSampledPosition"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"mediaPlayback_subscribeSampledPosition"];
[self
dispatchOnMatterSDKQueue:@"mediaPlayback_subscribeSampledPosition(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->MediaPlayback_SubscribeToSampledPosition(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::MediaPlayback::Attributes::SampledPosition::TypeInfo::DecodableArgType
playbackPosition) {
void (^callback)(MediaPlayback_PlaybackPosition * _Nullable) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"mediaPlayback_subscribeSampledPosition"];
MediaPlayback_PlaybackPosition * objCPlaybackPosition = nil;
if (!playbackPosition.IsNull()) {
if (playbackPosition.Value().position.IsNull()) {
objCPlaybackPosition = [[MediaPlayback_PlaybackPosition alloc]
initWithUpdatedAt:@(playbackPosition.Value().updatedAt)
position:nil];
} else {
objCPlaybackPosition = [[MediaPlayback_PlaybackPosition alloc]
initWithUpdatedAt:@(playbackPosition.Value().updatedAt)
position:@(playbackPosition.Value().position.Value())];
}
callback(objCPlaybackPosition);
}
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"mediaPlayback_subscribeSampledPosition"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"mediaPlayback_subscribeSampledPosition"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)mediaPlayback_subscribePlaybackSpeed:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(float))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().mediaPlayback_subscribePlaybackSpeed() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"mediaPlayback_subscribePlaybackSpeed"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"mediaPlayback_subscribePlaybackSpeed"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"mediaPlayback_subscribePlaybackSpeed"];
[self
dispatchOnMatterSDKQueue:@"mediaPlayback_subscribePlaybackSpeed(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->MediaPlayback_SubscribeToPlaybackSpeed(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::MediaPlayback::Attributes::PlaybackSpeed::TypeInfo::DecodableArgType
playbackSpeed) {
void (^callback)(float) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"mediaPlayback_subscribePlaybackSpeed"];
callback(playbackSpeed);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"mediaPlayback_subscribePlaybackSpeed"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"mediaPlayback_subscribePlaybackSpeed"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)mediaPlayback_subscribeSeekRangeEnd:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSNumber * _Nullable))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().mediaPlayback_subscribeSeekRangeEnd() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"mediaPlayback_subscribeSeekRangeEnd"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"mediaPlayback_subscribeSeekRangeEnd"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"mediaPlayback_subscribeSeekRangeEnd"];
[self
dispatchOnMatterSDKQueue:@"mediaPlayback_subscribeSeekRangeEnd(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->MediaPlayback_SubscribeToDuration(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::MediaPlayback::Attributes::SeekRangeEnd::TypeInfo::DecodableArgType
seekRangeEnd) {
void (^callback)(NSNumber * _Nullable) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"mediaPlayback_subscribeSeekRangeEnd"];
callback(@(seekRangeEnd.Value()));
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"mediaPlayback_subscribeSeekRangeEnd"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"mediaPlayback_subscribeSeekRangeEnd"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)mediaPlayback_subscribeSeekRangeStart:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSNumber * _Nullable))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().mediaPlayback_subscribeSeekRangeStart() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"mediaPlayback_subscribeSeekRangeStart"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"mediaPlayback_subscribeSeekRangeStart"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"mediaPlayback_subscribeSeekRangeStart"];
[self
dispatchOnMatterSDKQueue:@"mediaPlayback_subscribeSeekRangeStart(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->MediaPlayback_SubscribeToDuration(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::MediaPlayback::Attributes::SeekRangeEnd::TypeInfo::DecodableArgType
seekRangeStart) {
void (^callback)(NSNumber * _Nullable) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"mediaPlayback_subscribeSeekRangeStart"];
callback(@(seekRangeStart.Value()));
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"mediaPlayback_subscribeSeekRangeStart"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"mediaPlayback_subscribeSeekRangeStart"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationLauncher_launchApp:(ContentApp * _Nonnull)contentApp
catalogVendorId:(uint16_t)catalogVendorId
applicationId:(NSString * _Nonnull)applicationId
data:(NSData * _Nullable)data
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
chip::app::Clusters::ApplicationLauncher::Structs::ApplicationStruct::Type application;
application.catalogVendorID = catalogVendorId;
application.applicationID = chip::CharSpan::fromCharString([applicationId UTF8String]);
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->ApplicationLauncher_LaunchApp(&endpoint, application,
chip::MakeOptional(chip::ByteSpan(static_cast<const uint8_t *>(data.bytes), data.length)),
responseFunction);
}];
}
- (void)applicationLauncher_stopApp:(ContentApp * _Nonnull)contentApp
catalogVendorId:(uint16_t)catalogVendorId
applicationId:(NSString * _Nonnull)applicationId
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
chip::app::Clusters::ApplicationLauncher::Structs::ApplicationStruct::Type application;
application.catalogVendorID = catalogVendorId;
application.applicationID = chip::CharSpan::fromCharString([applicationId UTF8String]);
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->ApplicationLauncher_StopApp(&endpoint, application, responseFunction);
}];
}
- (void)applicationLauncher_hideApp:(ContentApp * _Nonnull)contentApp
catalogVendorId:(uint16_t)catalogVendorId
applicationId:(NSString * _Nonnull)applicationId
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
chip::app::Clusters::ApplicationLauncher::Structs::ApplicationStruct::Type application;
application.catalogVendorID = catalogVendorId;
application.applicationID = chip::CharSpan::fromCharString([applicationId UTF8String]);
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->ApplicationLauncher_HideApp(&endpoint, application, responseFunction);
}];
}
- (void)targetNavigator_navigateTarget:(ContentApp * _Nonnull)contentApp
target:(uint8_t)target
data:(NSString * _Nullable)data
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->TargetNavigator_NavigateTarget(&endpoint, target,
chip::MakeOptional(chip::CharSpan::fromCharString([data UTF8String])), responseFunction);
}];
}
- (void)targetNavigator_subscribeTargetList:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSMutableArray *))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().targetNavigator_subscribeTargetList() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"targetNavigator_subscribeTargetList"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"targetNavigator_subscribeTargetList"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"targetNavigator_subscribeTargetList"];
[self
dispatchOnMatterSDKQueue:@"targetNavigator_subscribeTargetList(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->TargetNavigator_SubscribeToTargetList(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::TargetNavigator::Attributes::TargetList::TypeInfo::DecodableArgType
targetList) {
void (^callback)(NSMutableArray *) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"targetNavigator_subscribeTargetList"];
NSMutableArray * objCTargetList = nil;
size_t targetInfoCount;
targetList.ComputeSize(&targetInfoCount);
if (targetInfoCount > 0) {
objCTargetList = [NSMutableArray arrayWithCapacity:targetInfoCount];
auto iter = targetList.begin();
while (iter.Next()) {
const chip::app::Clusters::TargetNavigator::Structs::TargetInfoStruct::
DecodableType & targetInfo
= iter.GetValue();
TargetNavigator_TargetInfoStruct * objCTargetInfoStruct =
[[TargetNavigator_TargetInfoStruct alloc]
initWithIdentifier:@(targetInfo.identifier)
name:[NSString stringWithUTF8String:targetInfo.name.data()]];
[objCTargetList addObject:objCTargetInfoStruct];
}
}
callback(objCTargetList);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"targetNavigator_subscribeTargetList"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"targetNavigator_subscribeTargetList"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)targetNavigator_subscribeCurrentTarget:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(uint8_t))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().targetNavigator_subscribeCurrentTarget() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"targetNavigator_subscribeCurrentTarget"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"targetNavigator_subscribeCurrentTarget"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"targetNavigator_subscribeCurrentTarget"];
[self
dispatchOnMatterSDKQueue:@"targetNavigator_subscribeCurrentTarget(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->TargetNavigator_SubscribeToCurrentTarget(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::TargetNavigator::Attributes::CurrentTarget::TypeInfo::DecodableArgType
currentTarget) {
void (^callback)(uint8_t) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"targetNavigator_subscribeCurrentTarget"];
callback(currentTarget);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"targetNavigator_subscribeCurrentTarget"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"targetNavigator_subscribeCurrentTarget"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)keypadInput_sendKey:(ContentApp * _Nonnull)contentApp
keyCode:(uint8_t)keyCode
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->KeypadInput_SendKey(&endpoint,
static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(keyCode), responseFunction);
}];
}
- (void)applicationBasic_subscribeVendorName:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSString * _Nonnull))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().applicationBasic_subscribeVendorName() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_subscribeVendorName"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_subscribeVendorName"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"applicationBasic_subscribeVendorName"];
[self
dispatchOnMatterSDKQueue:@"applicationBasic_subscribeVendorName(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_SubscribeToVendorName(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::VendorName::TypeInfo::DecodableArgType
vendorName) {
void (^callback)(NSString * _Nonnull) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"applicationBasic_subscribeVendorName"];
callback(vendorName.data() != nil ? [NSString stringWithUTF8String:vendorName.data()] : nil);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"applicationBasic_subscribeVendorName"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"applicationBasic_subscribeVendorName"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationBasic_subscribeVendorID:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSNumber * _Nonnull))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().applicationBasic_subscribeVendorID() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_subscribeVendorID"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_subscribeVendorID"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"applicationBasic_subscribeVendorID"];
[self
dispatchOnMatterSDKQueue:@"applicationBasic_subscribeVendorID(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_SubscribeToVendorID(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::VendorID::TypeInfo::DecodableArgType
vendorID) {
void (^callback)(NSNumber * _Nonnull) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"applicationBasic_subscribeVendorID"];
callback(@(vendorID));
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"applicationBasic_subscribeVendorID"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"applicationBasic_subscribeVendorID"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationBasic_subscribeApplicationName:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSString * _Nonnull))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().applicationBasic_subscribeApplicationName() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_subscribeApplicationName"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_subscribeApplicationName"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback
forKey:@"applicationBasic_subscribeApplicationName"];
[self
dispatchOnMatterSDKQueue:@"applicationBasic_subscribeApplicationName(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_SubscribeToApplicationName(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::ApplicationName::TypeInfo::
DecodableArgType applicationName) {
void (^callback)(NSString * _Nonnull) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"applicationBasic_subscribeApplicationName"];
callback([NSString stringWithUTF8String:applicationName.data()]);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"applicationBasic_subscribeApplicationName"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"applicationBasic_subscribeApplicationName"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationBasic_subscribeProductID:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(uint16_t))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().applicationBasic_subscribeProductID() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_subscribeProductID"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_subscribeProductID"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback forKey:@"applicationBasic_subscribeProductID"];
[self
dispatchOnMatterSDKQueue:@"applicationBasic_subscribeProductID(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_SubscribeToProductID(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::ProductID::TypeInfo::DecodableArgType
productID) {
void (^callback)(uint16_t) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"applicationBasic_subscribeProductID"];
callback(productID);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"applicationBasic_subscribeProductID"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"applicationBasic_subscribeProductID"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationBasic_subscribeApplicationVersion:(ContentApp * _Nonnull)contentApp
minInterval:(uint16_t)minInterval
maxInterval:(uint16_t)maxInterval
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSString * _Nonnull))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
subscriptionEstablishedCallback:(void (^_Nonnull)())subscriptionEstablishedCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().applicationBasic_subscribeApplicationVersion() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_subscriptionReadSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_subscribeApplicationVersion"];
[_subscriptionReadFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_subscribeApplicationVersion"];
[_subscriptionEstablishedCallbacks setObject:subscriptionEstablishedCallback
forKey:@"applicationBasic_subscribeApplicationVersion"];
[self
dispatchOnMatterSDKQueue:@"applicationBasic_subscribeApplicationVersion(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_SubscribeToApplicationVersion(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::ApplicationVersion::TypeInfo::
DecodableArgType applicationVersion) {
void (^callback)(NSString * _Nonnull) =
[[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks
objectForKey:@"applicationBasic_subscribeApplicationVersion"];
callback([NSString stringWithUTF8String:applicationVersion.data()]);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks
objectForKey:@"applicationBasic_subscribeApplicationVersion"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
},
minInterval, maxInterval,
[](void * context, chip::SubscriptionId subscriptionId) {
void (^callback)() =
[[CastingServerBridge getSharedInstance].subscriptionEstablishedCallbacks
objectForKey:@"applicationBasic_subscribeApplicationVersion"];
callback();
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationBasic_readVendorName:(ContentApp * _Nonnull)contentApp
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSString * _Nonnull))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
{
ChipLogProgress(AppServer, "CastingServerBridge().applicationBasic_readVendorName() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_readSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_readVendorName"];
[_readFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_readVendorName"];
[self
dispatchOnMatterSDKQueue:[NSString stringWithFormat:@"%s(...)", __func__]
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_ReadVendorName(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::VendorName::TypeInfo::DecodableArgType
vendorName) {
void (^callback)(NSString * _Nonnull) =
[[CastingServerBridge getSharedInstance].readSuccessCallbacks
objectForKey:@"applicationBasic_readVendorName"];
callback([NSString stringWithUTF8String:vendorName.data()]);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].readFailureCallbacks
objectForKey:@"applicationBasic_readVendorName"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationBasic_readVendorID:(ContentApp * _Nonnull)contentApp
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSNumber * _Nonnull))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
{
ChipLogProgress(AppServer, "CastingServerBridge().applicationBasic_readVendorID() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_readSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_readVendorID"];
[_readFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_readVendorID"];
[self
dispatchOnMatterSDKQueue:@"applicationBasic_readVendorID(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_ReadVendorID(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::VendorID::TypeInfo::DecodableArgType
vendorID) {
void (^callback)(NSNumber * _Nonnull) =
[[CastingServerBridge getSharedInstance].readSuccessCallbacks
objectForKey:@"applicationBasic_readVendorID"];
callback(@(vendorID));
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].readFailureCallbacks
objectForKey:@"applicationBasic_readVendorID"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationBasic_readApplicationName:(ContentApp * _Nonnull)contentApp
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSString * _Nonnull))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().applicationBasic_readApplicationName() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_readSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_readApplicationName"];
[_readFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_readApplicationName"];
[self
dispatchOnMatterSDKQueue:@"applicationBasic_readApplicationName(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_ReadApplicationName(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::ApplicationName::TypeInfo::
DecodableArgType applicationName) {
void (^callback)(NSString * _Nonnull) =
[[CastingServerBridge getSharedInstance].readSuccessCallbacks
objectForKey:@"applicationBasic_readApplicationName"];
callback([NSString stringWithUTF8String:applicationName.data()]);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].readFailureCallbacks
objectForKey:@"applicationBasic_readApplicationName"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationBasic_readProductID:(ContentApp * _Nonnull)contentApp
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(uint16_t))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
{
ChipLogProgress(AppServer, "CastingServerBridge().applicationBasic_readProductID() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_readSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_readProductID"];
[_readFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_readProductID"];
[self
dispatchOnMatterSDKQueue:@"applicationBasic_readProductID(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_ReadProductID(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::ProductID::TypeInfo::DecodableArgType
productID) {
void (^callback)(uint16_t) = [[CastingServerBridge getSharedInstance].readSuccessCallbacks
objectForKey:@"applicationBasic_readProductID"];
callback(productID);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].readFailureCallbacks
objectForKey:@"applicationBasic_readProductID"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)applicationBasic_readApplicationVersion:(ContentApp * _Nonnull)contentApp
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(MatterError * _Nonnull))requestSentHandler
successCallback:(void (^_Nonnull)(NSString * _Nonnull))successCallback
failureCallback:(void (^_Nonnull)(MatterError * _Nonnull))failureCallback
{
ChipLogProgress(AppServer,
"CastingServerBridge().applicationBasic_readApplicationVersion() called on Content App with endpoint ID %d",
contentApp.endpointId);
[_readSuccessCallbacks setObject:successCallback forKey:@"applicationBasic_readApplicationVersion"];
[_readFailureCallbacks setObject:failureCallback forKey:@"applicationBasic_readApplicationVersion"];
[self
dispatchOnMatterSDKQueue:@"applicationBasic_readApplicationVersion(...)"
block:^{
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_ReadApplicationVersion(
&endpoint, nullptr,
[](void * context,
chip::app::Clusters::ApplicationBasic::Attributes::ApplicationVersion::TypeInfo::
DecodableArgType applicationVersion) {
void (^callback)(NSString * _Nonnull) =
[[CastingServerBridge getSharedInstance].readSuccessCallbacks
objectForKey:@"applicationBasic_readApplicationVersion"];
callback([NSString stringWithUTF8String:applicationVersion.data()]);
},
[](void * context, CHIP_ERROR err) {
void (^callback)(MatterError *) =
[[CastingServerBridge getSharedInstance].readFailureCallbacks
objectForKey:@"applicationBasic_readApplicationVersion"];
callback([[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
dispatch_async(clientQueue, ^{
requestSentHandler(
[[MatterError alloc] initWithCode:err.AsInteger()
message:[NSString stringWithUTF8String:err.AsString()]]);
});
}];
}
- (void)onOff_on:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->OnOff_On(&endpoint, responseFunction);
}];
}
- (void)onOff_off:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->OnOff_Off(&endpoint, responseFunction);
}];
}
- (void)onOff_toggle:(ContentApp * _Nonnull)contentApp
responseCallback:(void (^_Nonnull)(bool))responseCallback
clientQueue:(dispatch_queue_t _Nonnull)clientQueue
requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler
{
const NSString * description = [NSString stringWithFormat:@"%s(...) (Content App %d)", __func__, contentApp.endpointId];
[self withCastingServerInvokeBlock:description
callbackQueue:clientQueue
onBlockComplete:requestSentHandler
onResponse:responseCallback
block:^(CastingServer * castingServer, std::function<void(CHIP_ERROR)> responseFunction) {
TargetEndpointInfo endpoint;
[ConversionUtils convertToCppTargetEndpointInfoFrom:contentApp outTargetEndpointInfo:endpoint];
return castingServer->OnOff_Toggle(&endpoint, responseFunction);
}];
}
@end