| Index: templates/TypeBuilder_cpp.template
|
| diff --git a/templates/TypeBuilder_cpp.template b/templates/TypeBuilder_cpp.template
|
| index 394d0ccaf64b57024bbb9a71fc431b5cea1a778a..b63a0e880ddc502d68ca0be325907cf8d33750f2 100644
|
| --- a/templates/TypeBuilder_cpp.template
|
| +++ b/templates/TypeBuilder_cpp.template
|
| @@ -178,13 +178,19 @@ void Frontend::flush()
|
| m_frontendChannel->flushProtocolNotifications();
|
| }
|
|
|
| +void Frontend::sendRawNotification(const String& notification)
|
| +{
|
| + m_frontendChannel->sendProtocolNotification(notification);
|
| +}
|
| +
|
| // --------------------- Dispatcher.
|
|
|
| class DispatcherImpl : public protocol::DispatcherBase {
|
| public:
|
| - DispatcherImpl(FrontendChannel* frontendChannel, Backend* backend)
|
| + DispatcherImpl(FrontendChannel* frontendChannel, Backend* backend, bool fallThroughForNotFound)
|
| : DispatcherBase(frontendChannel)
|
| - , m_backend(backend) {
|
| + , m_backend(backend)
|
| + , m_fallThroughForNotFound(fallThroughForNotFound) {
|
| {% for command in domain.commands %}
|
| {% if "redirect" in command %}{% continue %}{% endif %}
|
| {% if not generate_command(domain.domain, command.name) %}{% continue %}{% endif %}
|
| @@ -206,12 +212,15 @@ protected:
|
| {% endfor %}
|
|
|
| Backend* m_backend;
|
| + bool m_fallThroughForNotFound;
|
| };
|
|
|
| DispatchResponse::Status DispatcherImpl::dispatch(int callId, const String& method, std::unique_ptr<protocol::DictionaryValue> messageObject)
|
| {
|
| protocol::HashMap<String, CallHandler>::iterator it = m_dispatchMap.find(method);
|
| if (it == m_dispatchMap.end()) {
|
| + if (m_fallThroughForNotFound)
|
| + return DispatchResponse::kFallThrough;
|
| reportProtocolError(callId, DispatchResponse::kMethodNotFound, "'" + method + "' wasn't found", nullptr);
|
| return DispatchResponse::kError;
|
| }
|
| @@ -227,8 +236,8 @@ DispatchResponse::Status DispatcherImpl::dispatch(int callId, const String& meth
|
|
|
| class {{command.name | to_title_case}}CallbackImpl : public Backend::{{command.name | to_title_case}}Callback, public DispatcherBase::Callback {
|
| public:
|
| - {{command.name | to_title_case}}CallbackImpl(std::unique_ptr<DispatcherBase::WeakPtr> backendImpl, int callId)
|
| - : DispatcherBase::Callback(std::move(backendImpl), callId) { }
|
| + {{command.name | to_title_case}}CallbackImpl(std::unique_ptr<DispatcherBase::WeakPtr> backendImpl, int callId, int callbackId)
|
| + : DispatcherBase::Callback(std::move(backendImpl), callId, callbackId) { }
|
|
|
| void sendSuccess(
|
| {%- for parameter in command.returns -%}
|
| @@ -252,6 +261,11 @@ public:
|
| sendIfActive(std::move(resultObject), DispatchResponse::OK());
|
| }
|
|
|
| + void fallThrough() override
|
| + {
|
| + fallThroughIfActive();
|
| + }
|
| +
|
| void sendFailure(const DispatchResponse& response) override
|
| {
|
| DCHECK(response.status() == DispatchResponse::kError);
|
| @@ -335,7 +349,7 @@ DispatchResponse::Status DispatcherImpl::{{command.name}}(int callId, std::uniqu
|
| {% endif %}
|
| return response.status();
|
| {% else %}
|
| - std::unique_ptr<{{command.name | to_title_case}}CallbackImpl> callback(new {{command.name | to_title_case}}CallbackImpl(weakPtr(), callId));
|
| + std::unique_ptr<{{command.name | to_title_case}}CallbackImpl> callback(new {{command.name | to_title_case}}CallbackImpl(weakPtr(), callId, nextCallbackId()));
|
| m_backend->{{command.name | to_method_case}}(
|
| {%- for property in command.parameters -%}
|
| {%- if not loop.first -%}, {% endif -%}
|
| @@ -347,7 +361,7 @@ DispatchResponse::Status DispatcherImpl::{{command.name}}(int callId, std::uniqu
|
| {%- endfor -%}
|
| {%- if command.parameters -%}, {% endif -%}
|
| std::move(callback));
|
| - return DispatchResponse::kAsync;
|
| + return lastCallbackFallThrough() ? DispatchResponse::kFallThrough : DispatchResponse::kAsync;
|
| {% endif %}
|
| }
|
| {% endfor %}
|
| @@ -355,7 +369,7 @@ DispatchResponse::Status DispatcherImpl::{{command.name}}(int callId, std::uniqu
|
| // static
|
| void Dispatcher::wire(UberDispatcher* dispatcher, Backend* backend)
|
| {
|
| - dispatcher->registerBackend("{{domain.domain}}", std::unique_ptr<protocol::DispatcherBase>(new DispatcherImpl(dispatcher->channel(), backend)));
|
| + dispatcher->registerBackend("{{domain.domain}}", std::unique_ptr<protocol::DispatcherBase>(new DispatcherImpl(dispatcher->channel(), backend, dispatcher->fallThroughForNotFound())));
|
| }
|
|
|
| } // {{domain.domain}}
|
|
|