blob: 91e913926505ded394461e558e9ca73643c31cb6 [file] [log] [blame]
{{#if header}}
{{#*inline "callbackType"}}
{{#if partial-type}}
{{#if (isStrEqual partial-type "Command")}}
{{> @partial-block}}Type
{{else}}
{{> @partial-block}}
{{/if}}
{{else}}
{{> @partial-block}}
{{/if}}
{{/inline}}
class MTR{{> @partial-block}}Bridge : public MTRCallbackBridge<{{>callbackType}}>
{
public:
MTR{{> @partial-block}}Bridge(dispatch_queue_t queue, ResponseHandler handler)
: MTRCallbackBridge<{{>callbackType}}>(queue, handler, OnSuccessFn)
{};
MTR{{> @partial-block}}Bridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action)
: MTRCallbackBridge<{{>callbackType}}>(queue, handler, action, OnSuccessFn)
{};
static void OnSuccessFn(void * context
{{#if partial-type}}
{{#if (isStrEqual partial-type "Status")}}
{{! No more args in this case }}
{{else if (isStrEqual partial-type "Command")}}
, const chip::app::Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase name}}::DecodableType & data
{{else if (isStrEqual partial-type "CommandStatus")}}
, const chip::app::DataModel::NullObjectType &
{{else}}
UNEXPECTED PARTIAL TYPE
{{/if}}
{{else}}
, {{zapTypeToDecodableClusterObjectType type ns=ns isArgument=true}} value
{{/if}}
);
};
{{#unless partial-type}}
class MTR{{> @partial-block}}SubscriptionBridge : public MTR{{> @partial-block}}Bridge
{
public:
MTR{{> @partial-block}}SubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action, MTRSubscriptionEstablishedHandler establishedHandler)
: MTR{{> @partial-block}}Bridge(queue, handler, action),
mEstablishedHandler(establishedHandler)
{}
void OnSubscriptionEstablished();
using MTR{{> @partial-block}}Bridge::OnDone;
using MTR{{> @partial-block}}Bridge::KeepAliveOnCallback;
private:
MTRSubscriptionEstablishedHandler mEstablishedHandler;
};
{{/unless}}
{{else}}
void MTR{{> @partial-block}}Bridge::OnSuccessFn(void * context
{{#if partial-type}}
{{#if (isStrEqual partial-type "Status")}}
{{! No more args in this case }}
{{else if (isStrEqual partial-type "Command")}}
, const chip::app::Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase name}}::DecodableType & data
{{else if (isStrEqual partial-type "CommandStatus")}}
, const chip::app::DataModel::NullObjectType &
{{else}}
UNEXPECTED PARTIAL TYPE
{{/if}}
{{else}}
, {{zapTypeToDecodableClusterObjectType type ns=ns isArgument=true}} value
{{/if}}
)
{
{{#if partial-type}}
{{#if (isStrEqual partial-type "Status")}}
DispatchSuccess(context, nil);
{{else if (isStrEqual partial-type "Command")}}
auto * response = [MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Params new];
{{#chip_cluster_response_arguments}}
{
{{>decode_value target=(concat "response." (asStructPropertyName label)) source=(concat "data." (asLowerCamelCase label)) cluster=parent.parent.name errorCode="OnFailureFn(context, err); return;" depth=0}}
}
{{/chip_cluster_response_arguments}}
DispatchSuccess(context, response);
{{else if (isStrEqual partial-type "CommandStatus")}}
DispatchSuccess(context, nil);
{{else}}
UNEXPECTED PARTIAL TYPE
{{/if}}
{{else}}
{{asObjectiveCType type ns}} objCValue;
{{>decode_value target="objCValue" source="value" cluster=ns errorCode="OnFailureFn(context, err); return;" depth=0}}
DispatchSuccess(context, objCValue);
{{/if}}
};
{{#unless partial-type}}
void MTR{{> @partial-block}}SubscriptionBridge::OnSubscriptionEstablished()
{
if (!mQueue) {
return;
}
if (mEstablishedHandler != nil) {
dispatch_async(mQueue, mEstablishedHandler);
// On failure, mEstablishedHandler will be cleaned up by our destructor,
// but we can clean it up earlier on successful subscription
// establishment.
mEstablishedHandler = nil;
}
}
{{/unless}}
{{/if}}