| OLD | NEW |
| (Empty) |
| 1 {%- import "interface_macros.tmpl" as interface_macros %} | |
| 2 {%- set class_name = interface.name %} | |
| 3 {%- set proxy_name = interface.name ~ "Proxy" %} | |
| 4 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} | |
| 5 | |
| 6 {%- macro alloc_params(parameters) %} | |
| 7 {%- for param in parameters %} | |
| 8 {%- if param.kind|is_object_kind %} | |
| 9 {{param.kind|cpp_result_type}} p{{loop.index}}; | |
| 10 Deserialize_(params->{{param.name}}.ptr, &p{{loop.index}}); | |
| 11 {% endif -%} | |
| 12 {%- endfor %} | |
| 13 {%- endmacro %} | |
| 14 | |
| 15 {%- macro pass_params(parameters) %} | |
| 16 {%- for param in parameters %} | |
| 17 {%- if param.kind|is_string_kind -%} | |
| 18 p{{loop.index}} | |
| 19 {%- elif param.kind|is_object_kind -%} | |
| 20 p{{loop.index}}.Pass() | |
| 21 {%- elif param.kind|is_interface_kind -%} | |
| 22 mojo::MakeProxy<{{param.kind|get_name_for_kind}}>(mojo::MakeScopedHandle(mojo::i
nternal::FetchAndReset(¶ms->{{param.name}}))) | |
| 23 {%- elif param.kind|is_interface_request_kind -%} | |
| 24 mojo::MakeRequest<{{param.kind.kind|get_name_for_kind}}>(mojo::MakeScopedHandle(
mojo::internal::FetchAndReset(¶ms->{{param.name}}))) | |
| 25 {%- elif param.kind|is_any_handle_kind -%} | |
| 26 mojo::MakeScopedHandle(mojo::internal::FetchAndReset(¶ms->{{param.name}})) | |
| 27 {%- elif param.kind|is_enum_kind -%} | |
| 28 static_cast<{{param.kind|cpp_wrapper_type}}>(params->{{param.name}}) | |
| 29 {%- else -%} | |
| 30 params->{{param.name}} | |
| 31 {%- endif -%} | |
| 32 {%- if not loop.last %}, {% endif %} | |
| 33 {%- endfor %} | |
| 34 {%- endmacro %} | |
| 35 | |
| 36 {%- macro compute_payload_size(params_name, parameters) -%} | |
| 37 size_t payload_size = | |
| 38 mojo::internal::Align(sizeof({{params_name}})); | |
| 39 {#--- Computes #} | |
| 40 {%- for param in parameters %} | |
| 41 {%- if param.kind|is_object_kind %} | |
| 42 payload_size += GetSerializedSize_(in_{{param.name}}); | |
| 43 {%- endif %} | |
| 44 {%- endfor %} | |
| 45 {%- endmacro %} | |
| 46 | |
| 47 {%- macro build_message(params_name, parameters, params_description) -%} | |
| 48 {# TODO(yzshen): Consider refactoring to share code with | |
| 49 struct_serialization_definition.tmpl #} | |
| 50 {{params_name}}* params = | |
| 51 {{params_name}}::New(builder.buffer()); | |
| 52 {#--- Sets #} | |
| 53 {% for param in parameters %} | |
| 54 {%- if param.kind|is_object_kind %} | |
| 55 {%- if param.kind|is_array_kind %} | |
| 56 mojo::SerializeArray_<{{param.kind|get_array_validate_params|indent(24)}}>( | |
| 57 mojo::internal::Forward(in_{{param.name}}), builder.buffer(), ¶ms->{{p
aram.name}}.ptr); | |
| 58 {%- elif param.kind|is_map_kind %} | |
| 59 mojo::SerializeMap_<{{param.kind.value_kind|get_map_validate_params|indent(24)
}}>( | |
| 60 mojo::internal::Forward(in_{{param.name}}), builder.buffer(), ¶ms->{{p
aram.name}}.ptr); | |
| 61 {%- else %} | |
| 62 Serialize_(mojo::internal::Forward(in_{{param.name}}), builder.buffer(), ¶
ms->{{param.name}}.ptr); | |
| 63 {%- endif %} | |
| 64 {%- if not param.kind|is_nullable_kind %} | |
| 65 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( | |
| 66 !params->{{param.name}}.ptr, | |
| 67 mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, | |
| 68 "null {{param.name}} argument in {{params_description}}"); | |
| 69 {%- endif %} | |
| 70 {%- elif param.kind|is_any_handle_kind %} | |
| 71 {%- if param.kind|is_interface_kind or | |
| 72 param.kind|is_interface_request_kind %} | |
| 73 // Delegate handle. | |
| 74 params->{{param.name}} = in_{{param.name}}.PassMessagePipe().release(); | |
| 75 {%- else %} | |
| 76 params->{{param.name}} = in_{{param.name}}.release(); | |
| 77 {%- endif %} | |
| 78 {%- if not param.kind|is_nullable_kind %} | |
| 79 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( | |
| 80 !params->{{param.name}}.is_valid(), | |
| 81 mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE, | |
| 82 "invalid {{param.name}} argument in {{params_description}}"); | |
| 83 {%- endif %} | |
| 84 {%- else %} | |
| 85 params->{{param.name}} = in_{{param.name}}; | |
| 86 {%- endif %} | |
| 87 {%- endfor %} | |
| 88 mojo::Message message; | |
| 89 params->EncodePointersAndHandles(message.mutable_handles()); | |
| 90 builder.Finish(&message); | |
| 91 {%- endmacro %} | |
| 92 | |
| 93 {#--- Begin #} | |
| 94 const char* {{class_name}}::Name_ = "{{namespace_as_string}}::{{class_name}}"; | |
| 95 {#--- Constants #} | |
| 96 {% for constant in interface.constants %} | |
| 97 const {{constant.kind|cpp_pod_type}} {{interface.name}}::{{constant.name}} = {{c
onstant|constant_value}}; | |
| 98 {%- endfor %} | |
| 99 | |
| 100 {#--- ForwardToCallback definition #} | |
| 101 {%- for method in interface.methods -%} | |
| 102 {%- if method.response_parameters != None %} | |
| 103 class {{class_name}}_{{method.name}}_ForwardToCallback | |
| 104 : public mojo::MessageReceiver { | |
| 105 public: | |
| 106 {{class_name}}_{{method.name}}_ForwardToCallback( | |
| 107 const {{interface_macros.declare_callback(method)}}& callback) | |
| 108 : callback_(callback) { | |
| 109 } | |
| 110 virtual bool Accept(mojo::Message* message) override; | |
| 111 private: | |
| 112 {{interface_macros.declare_callback(method)}} callback_; | |
| 113 MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback
); | |
| 114 }; | |
| 115 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( | |
| 116 mojo::Message* message) { | |
| 117 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = | |
| 118 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D
ata*>( | |
| 119 message->mutable_payload()); | |
| 120 | |
| 121 params->DecodePointersAndHandles(message->mutable_handles()); | |
| 122 {{alloc_params(method.response_parameters)|indent(2)}} | |
| 123 callback_.Run({{pass_params(method.response_parameters)}}); | |
| 124 return true; | |
| 125 } | |
| 126 {%- endif %} | |
| 127 {%- endfor %} | |
| 128 | |
| 129 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver) | |
| 130 : receiver_(receiver) { | |
| 131 } | |
| 132 | |
| 133 {#--- Proxy definitions #} | |
| 134 | |
| 135 {%- for method in interface.methods %} | |
| 136 {%- set message_name = | |
| 137 "internal::k%s_%s_Name"|format(interface.name, method.name) %} | |
| 138 {%- set params_name = | |
| 139 "internal::%s_%s_Params_Data"|format(interface.name, method.name) %} | |
| 140 {%- set params_description = | |
| 141 "%s.%s request"|format(interface.name, method.name) %} | |
| 142 void {{proxy_name}}::{{method.name}}( | |
| 143 {{interface_macros.declare_request_params("in_", method)}}) { | |
| 144 {{compute_payload_size(params_name, method.parameters)}} | |
| 145 | |
| 146 {%- if method.response_parameters != None %} | |
| 147 mojo::internal::RequestMessageBuilder builder({{message_name}}, payload_size); | |
| 148 {%- else %} | |
| 149 mojo::internal::MessageBuilder builder({{message_name}}, payload_size); | |
| 150 {%- endif %} | |
| 151 | |
| 152 {{build_message(params_name, method.parameters, params_description)}} | |
| 153 | |
| 154 {%- if method.response_parameters != None %} | |
| 155 mojo::MessageReceiver* responder = | |
| 156 new {{class_name}}_{{method.name}}_ForwardToCallback(callback); | |
| 157 if (!receiver_->AcceptWithResponder(&message, responder)) | |
| 158 delete responder; | |
| 159 {%- else %} | |
| 160 bool ok = receiver_->Accept(&message); | |
| 161 // This return value may be ignored as !ok implies the Connector has | |
| 162 // encountered an error, which will be visible through other means. | |
| 163 MOJO_ALLOW_UNUSED_LOCAL(ok); | |
| 164 {%- endif %} | |
| 165 } | |
| 166 {%- endfor %} | |
| 167 | |
| 168 {#--- ProxyToResponder definition #} | |
| 169 {%- for method in interface.methods -%} | |
| 170 {%- if method.response_parameters != None %} | |
| 171 {%- set message_name = | |
| 172 "internal::k%s_%s_Name"|format(interface.name, method.name) %} | |
| 173 {%- set params_name = | |
| 174 "internal::%s_%s_ResponseParams_Data"|format(interface.name, method.
name) %} | |
| 175 {%- set params_description = | |
| 176 "%s.%s response"|format(interface.name, method.name) %} | |
| 177 class {{class_name}}_{{method.name}}_ProxyToResponder | |
| 178 : public {{interface_macros.declare_callback(method)}}::Runnable { | |
| 179 public: | |
| 180 virtual ~{{class_name}}_{{method.name}}_ProxyToResponder() { | |
| 181 delete responder_; | |
| 182 } | |
| 183 | |
| 184 {{class_name}}_{{method.name}}_ProxyToResponder( | |
| 185 uint64_t request_id, | |
| 186 mojo::MessageReceiver* responder) | |
| 187 : request_id_(request_id), | |
| 188 responder_(responder) { | |
| 189 } | |
| 190 | |
| 191 virtual void Run({{interface_macros.declare_params("in_", method.response_para
meters)}}) const override; | |
| 192 | |
| 193 private: | |
| 194 uint64_t request_id_; | |
| 195 mutable mojo::MessageReceiver* responder_; | |
| 196 MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder)
; | |
| 197 }; | |
| 198 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( | |
| 199 {{interface_macros.declare_params("in_", method.response_parameters)}}) cons
t { | |
| 200 {{compute_payload_size(params_name, method.response_parameters)}} | |
| 201 mojo::internal::ResponseMessageBuilder builder( | |
| 202 {{message_name}}, payload_size, request_id_); | |
| 203 {{build_message(params_name, method.response_parameters, params_description)}} | |
| 204 bool ok = responder_->Accept(&message); | |
| 205 MOJO_ALLOW_UNUSED_LOCAL(ok); | |
| 206 // TODO(darin): !ok returned here indicates a malformed message, and that may | |
| 207 // be good reason to close the connection. However, we don't have a way to do | |
| 208 // that from here. We should add a way. | |
| 209 delete responder_; | |
| 210 responder_ = nullptr; | |
| 211 } | |
| 212 {%- endif -%} | |
| 213 {%- endfor %} | |
| 214 | |
| 215 {{class_name}}Stub::{{class_name}}Stub() | |
| 216 : sink_(nullptr) { | |
| 217 } | |
| 218 | |
| 219 {#--- Stub definition #} | |
| 220 | |
| 221 bool {{class_name}}Stub::Accept(mojo::Message* message) { | |
| 222 {%- if interface.methods %} | |
| 223 switch (message->header()->name) { | |
| 224 {%- for method in interface.methods %} | |
| 225 case internal::k{{class_name}}_{{method.name}}_Name: { | |
| 226 {%- if method.response_parameters == None %} | |
| 227 internal::{{class_name}}_{{method.name}}_Params_Data* params = | |
| 228 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( | |
| 229 message->mutable_payload()); | |
| 230 | |
| 231 params->DecodePointersAndHandles(message->mutable_handles()); | |
| 232 {{alloc_params(method.parameters)|indent(6)}} | |
| 233 // A null |sink_| typically means there is a missing call to | |
| 234 // InterfacePtr::set_client(). | |
| 235 assert(sink_); | |
| 236 sink_->{{method.name}}({{pass_params(method.parameters)}}); | |
| 237 return true; | |
| 238 {%- else %} | |
| 239 break; | |
| 240 {%- endif %} | |
| 241 } | |
| 242 {%- endfor %} | |
| 243 } | |
| 244 {%- endif %} | |
| 245 return false; | |
| 246 } | |
| 247 | |
| 248 bool {{class_name}}Stub::AcceptWithResponder( | |
| 249 mojo::Message* message, mojo::MessageReceiver* responder) { | |
| 250 {%- if interface.methods %} | |
| 251 switch (message->header()->name) { | |
| 252 {%- for method in interface.methods %} | |
| 253 case internal::k{{class_name}}_{{method.name}}_Name: { | |
| 254 {%- if method.response_parameters != None %} | |
| 255 internal::{{class_name}}_{{method.name}}_Params_Data* params = | |
| 256 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( | |
| 257 message->mutable_payload()); | |
| 258 | |
| 259 params->DecodePointersAndHandles(message->mutable_handles()); | |
| 260 {{interface_macros.declare_callback(method)}}::Runnable* runnable = | |
| 261 new {{class_name}}_{{method.name}}_ProxyToResponder( | |
| 262 message->request_id(), responder); | |
| 263 {{interface_macros.declare_callback(method)}} callback(runnable); | |
| 264 {{alloc_params(method.parameters)|indent(6)}} | |
| 265 // A null |sink_| typically means there is a missing call to | |
| 266 // InterfacePtr::set_client(). | |
| 267 assert(sink_); | |
| 268 sink_->{{method.name}}( | |
| 269 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}call
back); | |
| 270 return true; | |
| 271 {%- else %} | |
| 272 break; | |
| 273 {%- endif %} | |
| 274 } | |
| 275 {%- endfor %} | |
| 276 } | |
| 277 {%- endif %} | |
| 278 return false; | |
| 279 } | |
| 280 | |
| 281 {#--- Request validator definitions #} | |
| 282 | |
| 283 {{class_name}}RequestValidator::{{class_name}}RequestValidator( | |
| 284 mojo::MessageReceiver* sink) : MessageFilter(sink) { | |
| 285 } | |
| 286 | |
| 287 bool {{class_name}}RequestValidator::Accept(mojo::Message* message) { | |
| 288 {%- if interface.methods %} | |
| 289 switch (message->header()->name) { | |
| 290 {%- for method in interface.methods %} | |
| 291 case internal::k{{class_name}}_{{method.name}}_Name: { | |
| 292 {%- if method.response_parameters != None %} | |
| 293 if (!message->has_flag(mojo::internal::kMessageExpectsResponse)) | |
| 294 break; | |
| 295 {%- else %} | |
| 296 if (message->has_flag(mojo::internal::kMessageExpectsResponse) || | |
| 297 message->has_flag(mojo::internal::kMessageIsResponse)) { | |
| 298 break; | |
| 299 } | |
| 300 {%- endif %} | |
| 301 mojo::internal::BoundsChecker bounds_checker( | |
| 302 message->payload(), message->payload_num_bytes(), | |
| 303 message->handles()->size()); | |
| 304 if (!internal::{{class_name}}_{{method.name}}_Params_Data::Validate( | |
| 305 message->payload(), &bounds_checker)) { | |
| 306 return false; | |
| 307 } | |
| 308 break; | |
| 309 } | |
| 310 {%- endfor %} | |
| 311 } | |
| 312 {%- endif %} | |
| 313 | |
| 314 // A null |sink_| typically means there is a missing call to | |
| 315 // InterfacePtr::set_client(). | |
| 316 assert(sink_); | |
| 317 return sink_->Accept(message); | |
| 318 } | |
| 319 | |
| 320 {#--- Response validator definitions #} | |
| 321 {% if interface|has_callbacks %} | |
| 322 {{class_name}}ResponseValidator::{{class_name}}ResponseValidator( | |
| 323 mojo::MessageReceiver* sink) : MessageFilter(sink) { | |
| 324 } | |
| 325 | |
| 326 bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) { | |
| 327 {%- if interface.methods %} | |
| 328 switch (message->header()->name) { | |
| 329 {%- for method in interface.methods if method.response_parameters != None %} | |
| 330 case internal::k{{class_name}}_{{method.name}}_Name: { | |
| 331 if (!message->has_flag(mojo::internal::kMessageIsResponse)) | |
| 332 break; | |
| 333 mojo::internal::BoundsChecker bounds_checker( | |
| 334 message->payload(), message->payload_num_bytes(), | |
| 335 message->handles()->size()); | |
| 336 if (!internal::{{class_name}}_{{method.name}}_ResponseParams_Data::Validat
e( | |
| 337 message->payload(), &bounds_checker)) { | |
| 338 return false; | |
| 339 } | |
| 340 break; | |
| 341 } | |
| 342 {%- endfor %} | |
| 343 } | |
| 344 {%- endif %} | |
| 345 | |
| 346 // A null |sink_| typically means there is a missing call to | |
| 347 // InterfacePtr::set_client(). | |
| 348 assert(sink_); | |
| 349 return sink_->Accept(message); | |
| 350 } | |
| 351 {%- endif -%} | |
| OLD | NEW |