| OLD | NEW |
| 1 {%- import "interface_macros.tmpl" as interface_macros %} | 1 {%- import "interface_macros.tmpl" as interface_macros %} |
| 2 {%- import "struct_macros.tmpl" as struct_macros %} | 2 {%- import "struct_macros.tmpl" as struct_macros %} |
| 3 | 3 |
| 4 {%- set class_name = interface.name %} | 4 {%- set class_name = interface.name %} |
| 5 {%- set proxy_name = interface.name ~ "Proxy" %} | 5 {%- set proxy_name = interface.name ~ "Proxy" %} |
| 6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} | 6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} |
| 7 | 7 |
| 8 {%- macro alloc_params(struct, params, message, serialization_context, | 8 {%- macro alloc_params(struct, params, message, description) %} |
| 9 description) %} | 9 mojo::internal::SerializationContext serialization_context; |
| 10 ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles()); | 10 serialization_context.handles.Swap(({{message}})->mutable_handles()); |
| 11 serialization_context.associated_endpoint_handles.swap( |
| 12 *({{message}})->mutable_associated_endpoint_handles()); |
| 11 bool success = true; | 13 bool success = true; |
| 12 {%- for param in struct.packed.packed_fields_in_ordinal_order %} | 14 {%- for param in struct.packed.packed_fields_in_ordinal_order %} |
| 13 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{}; | 15 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{}; |
| 14 {%- endfor %} | 16 {%- endfor %} |
| 15 {{struct.name}}DataView input_data_view({{params}}, | 17 {{struct.name}}DataView input_data_view({{params}}, &serialization_context); |
| 16 {{serialization_context}}); | |
| 17 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}} | 18 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}} |
| 18 if (!success) { | 19 if (!success) { |
| 19 ReportValidationErrorForMessage( | 20 ReportValidationErrorForMessage( |
| 20 {{message}}, | 21 {{message}}, |
| 21 mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED, | 22 mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED, |
| 22 "{{description}} deserializer"); | 23 "{{description}} deserializer"); |
| 23 return false; | 24 return false; |
| 24 } | 25 } |
| 25 {%- endmacro %} | 26 {%- endmacro %} |
| 26 | 27 |
| 27 {%- macro pass_params(parameters) %} | 28 {%- macro pass_params(parameters) %} |
| 28 {%- for param in parameters %} | 29 {%- for param in parameters %} |
| 29 std::move(p_{{param.name}}) | 30 std::move(p_{{param.name}}) |
| 30 {%- if not loop.last %}, {% endif %} | 31 {%- if not loop.last %}, {% endif %} |
| 31 {%- endfor %} | 32 {%- endfor %} |
| 32 {%- endmacro %} | 33 {%- endmacro %} |
| 33 | 34 |
| 34 {%- macro build_message(struct, input_pattern, struct_display_name, | 35 {%- macro build_message(struct, input_pattern, struct_display_name, |
| 35 serialization_context) -%} | 36 serialization_context) -%} |
| 36 {{struct_macros.serialize(struct, struct_display_name, input_pattern, | 37 {{struct_macros.serialize(struct, struct_display_name, input_pattern, |
| 37 "params", "builder.buffer()", | 38 "params", "builder.buffer()", |
| 38 serialization_context)}} | 39 serialization_context)}} |
| 39 ({{serialization_context}})->handles.Swap( | 40 ({{serialization_context}})->handles.Swap( |
| 40 builder.message()->mutable_handles()); | 41 builder.message()->mutable_handles()); |
| 42 ({{serialization_context}})->associated_endpoint_handles.swap( |
| 43 *builder.message()->mutable_associated_endpoint_handles()); |
| 41 {%- endmacro %} | 44 {%- endmacro %} |
| 42 | 45 |
| 43 {#--- Begin #} | 46 {#--- Begin #} |
| 44 const char {{class_name}}::Name_[] = "{{namespace_as_string}}::{{class_name}}"; | 47 const char {{class_name}}::Name_[] = "{{namespace_as_string}}::{{class_name}}"; |
| 45 | 48 |
| 46 {#--- Constants #} | 49 {#--- Constants #} |
| 47 {%- for constant in interface.constants %} | 50 {%- for constant in interface.constants %} |
| 48 {%- if constant.kind|is_string_kind %} | 51 {%- if constant.kind|is_string_kind %} |
| 49 const char {{interface.name}}::{{constant.name}}[] = {{constant|constant_value}}
; | 52 const char {{interface.name}}::{{constant.name}}[] = {{constant|constant_value}}
; |
| 50 {%- endif %} | 53 {%- endif %} |
| (...skipping 10 matching lines...) Expand all Loading... |
| 61 {%- endfor %} | 64 {%- endfor %} |
| 62 | 65 |
| 63 {#--- ForwardToCallback definition #} | 66 {#--- ForwardToCallback definition #} |
| 64 {%- for method in interface.methods -%} | 67 {%- for method in interface.methods -%} |
| 65 {%- if method.response_parameters != None %} | 68 {%- if method.response_parameters != None %} |
| 66 {%- if method.sync %} | 69 {%- if method.sync %} |
| 67 class {{class_name}}_{{method.name}}_HandleSyncResponse | 70 class {{class_name}}_{{method.name}}_HandleSyncResponse |
| 68 : public mojo::MessageReceiver { | 71 : public mojo::MessageReceiver { |
| 69 public: | 72 public: |
| 70 {{class_name}}_{{method.name}}_HandleSyncResponse( | 73 {{class_name}}_{{method.name}}_HandleSyncResponse( |
| 71 scoped_refptr<mojo::AssociatedGroupController> group_controller, | |
| 72 bool* result | 74 bool* result |
| 73 {%- for param in method.response_parameters -%} | 75 {%- for param in method.response_parameters -%} |
| 74 , {{param.kind|cpp_wrapper_type}}* out_{{param.name}} | 76 , {{param.kind|cpp_wrapper_type}}* out_{{param.name}} |
| 75 {%- endfor %}) | 77 {%- endfor %}) |
| 76 : serialization_context_(std::move(group_controller)), result_(result) | 78 : result_(result) |
| 77 {%- for param in method.response_parameters -%} | 79 {%- for param in method.response_parameters -%} |
| 78 , out_{{param.name}}_(out_{{param.name}}) | 80 , out_{{param.name}}_(out_{{param.name}}) |
| 79 {%- endfor %} { | 81 {%- endfor %} { |
| 80 DCHECK(!*result_); | 82 DCHECK(!*result_); |
| 81 } | 83 } |
| 82 bool Accept(mojo::Message* message) override; | 84 bool Accept(mojo::Message* message) override; |
| 83 private: | 85 private: |
| 84 mojo::internal::SerializationContext serialization_context_; | |
| 85 bool* result_; | 86 bool* result_; |
| 86 {%- for param in method.response_parameters %} | 87 {%- for param in method.response_parameters %} |
| 87 {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_; | 88 {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_; |
| 88 {%- endfor -%} | 89 {%- endfor -%} |
| 89 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse); | 90 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse); |
| 90 }; | 91 }; |
| 91 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept( | 92 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept( |
| 92 mojo::Message* message) { | 93 mojo::Message* message) { |
| 93 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = | 94 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = |
| 94 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D
ata*>( | 95 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D
ata*>( |
| 95 message->mutable_payload()); | 96 message->mutable_payload()); |
| 96 | 97 |
| 97 {%- set desc = class_name~"::"~method.name~" response" %} | 98 {%- set desc = class_name~"::"~method.name~" response" %} |
| 98 {{alloc_params(method.response_param_struct, "params", "message", | 99 {{alloc_params(method.response_param_struct, "params", "message", desc)}} |
| 99 "&serialization_context_", desc)}} | |
| 100 | 100 |
| 101 {%- for param in method.response_parameters %} | 101 {%- for param in method.response_parameters %} |
| 102 *out_{{param.name}}_ = std::move(p_{{param.name}}); | 102 *out_{{param.name}}_ = std::move(p_{{param.name}}); |
| 103 {%- endfor %} | 103 {%- endfor %} |
| 104 mojo::internal::SyncMessageResponseSetup::SetCurrentSyncResponseMessage( | 104 mojo::internal::SyncMessageResponseSetup::SetCurrentSyncResponseMessage( |
| 105 message); | 105 message); |
| 106 *result_ = true; | 106 *result_ = true; |
| 107 return true; | 107 return true; |
| 108 } | 108 } |
| 109 {%- endif %} | 109 {%- endif %} |
| 110 | 110 |
| 111 class {{class_name}}_{{method.name}}_ForwardToCallback | 111 class {{class_name}}_{{method.name}}_ForwardToCallback |
| 112 : public mojo::MessageReceiver { | 112 : public mojo::MessageReceiver { |
| 113 public: | 113 public: |
| 114 {{class_name}}_{{method.name}}_ForwardToCallback( | 114 {{class_name}}_{{method.name}}_ForwardToCallback( |
| 115 {%- if use_once_callback %} | 115 {%- if use_once_callback %} |
| 116 {{class_name}}::{{method.name}}Callback callback, | 116 {{class_name}}::{{method.name}}Callback callback |
| 117 {%- else %} | 117 {%- else %} |
| 118 const {{class_name}}::{{method.name}}Callback& callback, | 118 const {{class_name}}::{{method.name}}Callback& callback |
| 119 {%- endif %} | 119 {%- endif %} |
| 120 scoped_refptr<mojo::AssociatedGroupController> group_controller) | 120 ) : callback_(std::move(callback)) { |
| 121 : callback_(std::move(callback)), | |
| 122 serialization_context_(std::move(group_controller)) { | |
| 123 } | 121 } |
| 124 bool Accept(mojo::Message* message) override; | 122 bool Accept(mojo::Message* message) override; |
| 125 private: | 123 private: |
| 126 {{class_name}}::{{method.name}}Callback callback_; | 124 {{class_name}}::{{method.name}}Callback callback_; |
| 127 mojo::internal::SerializationContext serialization_context_; | |
| 128 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback); | 125 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback); |
| 129 }; | 126 }; |
| 130 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( | 127 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( |
| 131 mojo::Message* message) { | 128 mojo::Message* message) { |
| 132 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = | 129 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = |
| 133 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D
ata*>( | 130 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D
ata*>( |
| 134 message->mutable_payload()); | 131 message->mutable_payload()); |
| 135 | 132 |
| 136 {%- set desc = class_name~"::"~method.name~" response" %} | 133 {%- set desc = class_name~"::"~method.name~" response" %} |
| 137 {{alloc_params(method.response_param_struct, "params", "message", | 134 {{alloc_params(method.response_param_struct, "params", "message", desc)}} |
| 138 "&serialization_context_", desc)}} | |
| 139 if (!callback_.is_null()) { | 135 if (!callback_.is_null()) { |
| 140 mojo::internal::MessageDispatchContext context(message); | 136 mojo::internal::MessageDispatchContext context(message); |
| 141 std::move(callback_).Run({{pass_params(method.response_parameters)}}); | 137 std::move(callback_).Run({{pass_params(method.response_parameters)}}); |
| 142 } | 138 } |
| 143 return true; | 139 return true; |
| 144 } | 140 } |
| 145 {%- endif %} | 141 {%- endif %} |
| 146 {%- endfor %} | 142 {%- endfor %} |
| 147 | 143 |
| 148 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver) | 144 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver) |
| 149 : receiver_(receiver) { | 145 : receiver_(receiver) { |
| 150 } | 146 } |
| 151 | 147 |
| 152 {#--- Proxy definitions #} | 148 {#--- Proxy definitions #} |
| 153 | 149 |
| 154 {%- for method in interface.methods %} | 150 {%- for method in interface.methods %} |
| 155 {%- set message_name = | 151 {%- set message_name = |
| 156 "internal::k%s_%s_Name"|format(interface.name, method.name) %} | 152 "internal::k%s_%s_Name"|format(interface.name, method.name) %} |
| 157 {%- set params_struct = method.param_struct %} | 153 {%- set params_struct = method.param_struct %} |
| 158 {%- set params_description = | 154 {%- set params_description = |
| 159 "%s.%s request"|format(interface.name, method.name) %} | 155 "%s.%s request"|format(interface.name, method.name) %} |
| 160 {%- if method.sync %} | 156 {%- if method.sync %} |
| 161 bool {{proxy_name}}::{{method.name}}( | 157 bool {{proxy_name}}::{{method.name}}( |
| 162 {{interface_macros.declare_sync_method_params("param_", method)}}) { | 158 {{interface_macros.declare_sync_method_params("param_", method)}}) { |
| 163 mojo::internal::SerializationContext serialization_context( | 159 mojo::internal::SerializationContext serialization_context; |
| 164 group_controller_); | |
| 165 {{struct_macros.get_serialized_size(params_struct, "param_%s", | 160 {{struct_macros.get_serialized_size(params_struct, "param_%s", |
| 166 "&serialization_context")}} | 161 "&serialization_context")}} |
| 167 | 162 |
| 168 mojo::internal::RequestMessageBuilder builder({{message_name}}, size, | 163 mojo::internal::MessageBuilder builder( |
| 169 mojo::Message::kFlagIsSync); | 164 {{message_name}}, |
| 165 mojo::Message::kFlagIsSync | mojo::Message::kFlagExpectsResponse, |
| 166 size, serialization_context.associated_endpoint_count); |
| 170 | 167 |
| 171 {{build_message(params_struct, "param_%s", params_description, | 168 {{build_message(params_struct, "param_%s", params_description, |
| 172 "&serialization_context")}} | 169 "&serialization_context")}} |
| 173 | 170 |
| 174 bool result = false; | 171 bool result = false; |
| 175 mojo::MessageReceiver* responder = | 172 mojo::MessageReceiver* responder = |
| 176 new {{class_name}}_{{method.name}}_HandleSyncResponse( | 173 new {{class_name}}_{{method.name}}_HandleSyncResponse( |
| 177 group_controller_, &result | 174 &result |
| 178 {%- for param in method.response_parameters -%} | 175 {%- for param in method.response_parameters -%} |
| 179 , param_{{param.name}} | 176 , param_{{param.name}} |
| 180 {%- endfor %}); | 177 {%- endfor %}); |
| 181 if (!receiver_->AcceptWithResponder(builder.message(), responder)) | 178 if (!receiver_->AcceptWithResponder(builder.message(), responder)) |
| 182 delete responder; | 179 delete responder; |
| 183 return result; | 180 return result; |
| 184 } | 181 } |
| 185 {%- endif %} | 182 {%- endif %} |
| 186 | 183 |
| 187 void {{proxy_name}}::{{method.name}}( | 184 void {{proxy_name}}::{{method.name}}( |
| 188 {{interface_macros.declare_request_params("in_", method, use_once_callback)}
}) { | 185 {{interface_macros.declare_request_params("in_", method, use_once_callback)}
}) { |
| 189 mojo::internal::SerializationContext serialization_context( | 186 mojo::internal::SerializationContext serialization_context; |
| 190 group_controller_); | |
| 191 {{struct_macros.get_serialized_size(params_struct, "in_%s", | 187 {{struct_macros.get_serialized_size(params_struct, "in_%s", |
| 192 "&serialization_context")}} | 188 "&serialization_context")}} |
| 193 | 189 |
| 194 {%- if method.response_parameters != None %} | 190 {%- if method.response_parameters != None %} |
| 195 mojo::internal::RequestMessageBuilder builder({{message_name}}, size); | 191 constexpr uint32_t kFlags = mojo::Message::kFlagExpectsResponse; |
| 196 {%- else %} | 192 {%- else %} |
| 197 mojo::internal::MessageBuilder builder({{message_name}}, size); | 193 constexpr uint32_t kFlags = 0; |
| 198 {%- endif %} | 194 {%- endif %} |
| 195 mojo::internal::MessageBuilder builder( |
| 196 {{message_name}}, kFlags, size, |
| 197 serialization_context.associated_endpoint_count); |
| 199 | 198 |
| 200 {{build_message(params_struct, "in_%s", params_description, | 199 {{build_message(params_struct, "in_%s", params_description, |
| 201 "&serialization_context")}} | 200 "&serialization_context")}} |
| 202 | 201 |
| 203 {%- if method.response_parameters != None %} | 202 {%- if method.response_parameters != None %} |
| 204 mojo::MessageReceiver* responder = | 203 mojo::MessageReceiver* responder = |
| 205 new {{class_name}}_{{method.name}}_ForwardToCallback( | 204 new {{class_name}}_{{method.name}}_ForwardToCallback(std::move(callback)); |
| 206 std::move(callback), group_controller_); | |
| 207 if (!receiver_->AcceptWithResponder(builder.message(), responder)) | 205 if (!receiver_->AcceptWithResponder(builder.message(), responder)) |
| 208 delete responder; | 206 delete responder; |
| 209 {%- else %} | 207 {%- else %} |
| 210 bool ok = receiver_->Accept(builder.message()); | 208 bool ok = receiver_->Accept(builder.message()); |
| 211 // This return value may be ignored as !ok implies the Connector has | 209 // This return value may be ignored as !ok implies the Connector has |
| 212 // encountered an error, which will be visible through other means. | 210 // encountered an error, which will be visible through other means. |
| 213 ALLOW_UNUSED_LOCAL(ok); | 211 ALLOW_UNUSED_LOCAL(ok); |
| 214 {%- endif %} | 212 {%- endif %} |
| 215 } | 213 } |
| 216 {%- endfor %} | 214 {%- endfor %} |
| 217 | 215 |
| 218 {#--- ProxyToResponder definition #} | 216 {#--- ProxyToResponder definition #} |
| 219 {%- for method in interface.methods -%} | 217 {%- for method in interface.methods -%} |
| 220 {%- if method.response_parameters != None %} | 218 {%- if method.response_parameters != None %} |
| 221 {%- set message_name = | 219 {%- set message_name = |
| 222 "internal::k%s_%s_Name"|format(interface.name, method.name) %} | 220 "internal::k%s_%s_Name"|format(interface.name, method.name) %} |
| 223 {%- set response_params_struct = method.response_param_struct %} | 221 {%- set response_params_struct = method.response_param_struct %} |
| 224 {%- set params_description = | 222 {%- set params_description = |
| 225 "%s.%s response"|format(interface.name, method.name) %} | 223 "%s.%s response"|format(interface.name, method.name) %} |
| 226 class {{class_name}}_{{method.name}}_ProxyToResponder { | 224 class {{class_name}}_{{method.name}}_ProxyToResponder { |
| 227 public: | 225 public: |
| 228 static {{class_name}}::{{method.name}}Callback CreateCallback( | 226 static {{class_name}}::{{method.name}}Callback CreateCallback( |
| 229 uint64_t request_id, | 227 uint64_t request_id, |
| 230 bool is_sync, | 228 bool is_sync, |
| 231 mojo::MessageReceiverWithStatus* responder, | 229 mojo::MessageReceiverWithStatus* responder) { |
| 232 scoped_refptr<mojo::AssociatedGroupController> | |
| 233 group_controller) { | |
| 234 std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy( | 230 std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy( |
| 235 new {{class_name}}_{{method.name}}_ProxyToResponder( | 231 new {{class_name}}_{{method.name}}_ProxyToResponder( |
| 236 request_id, is_sync, responder, group_controller)); | 232 request_id, is_sync, responder)); |
| 237 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, | 233 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, |
| 238 base::Passed(&proxy)); | 234 base::Passed(&proxy)); |
| 239 } | 235 } |
| 240 | 236 |
| 241 ~{{class_name}}_{{method.name}}_ProxyToResponder() { | 237 ~{{class_name}}_{{method.name}}_ProxyToResponder() { |
| 242 #if DCHECK_IS_ON() | 238 #if DCHECK_IS_ON() |
| 243 if (responder_) { | 239 if (responder_) { |
| 244 // Is the Service destroying the callback without running it | 240 // Is the Service destroying the callback without running it |
| 245 // and without first closing the pipe? | 241 // and without first closing the pipe? |
| 246 responder_->DCheckInvalid("The callback passed to " | 242 responder_->DCheckInvalid("The callback passed to " |
| 247 "{{class_name}}::{{method.name}}() was never run."); | 243 "{{class_name}}::{{method.name}}() was never run."); |
| 248 } | 244 } |
| 249 #endif | 245 #endif |
| 250 // If the Callback was dropped then deleting the responder will close | 246 // If the Callback was dropped then deleting the responder will close |
| 251 // the pipe so the calling application knows to stop waiting for a reply. | 247 // the pipe so the calling application knows to stop waiting for a reply. |
| 252 delete responder_; | 248 delete responder_; |
| 253 } | 249 } |
| 254 | 250 |
| 255 private: | 251 private: |
| 256 {{class_name}}_{{method.name}}_ProxyToResponder( | 252 {{class_name}}_{{method.name}}_ProxyToResponder( |
| 257 uint64_t request_id, | 253 uint64_t request_id, |
| 258 bool is_sync, | 254 bool is_sync, |
| 259 mojo::MessageReceiverWithStatus* responder, | 255 mojo::MessageReceiverWithStatus* responder) |
| 260 scoped_refptr<mojo::AssociatedGroupController> group_controller) | |
| 261 : request_id_(request_id), | 256 : request_id_(request_id), |
| 262 is_sync_(is_sync), | 257 is_sync_(is_sync), |
| 263 responder_(responder), | 258 responder_(responder) { |
| 264 serialization_context_(std::move(group_controller)) { | |
| 265 } | 259 } |
| 266 | 260 |
| 267 void Run( | 261 void Run( |
| 268 {{interface_macros.declare_responder_params( | 262 {{interface_macros.declare_responder_params( |
| 269 "in_", method.response_parameters, for_blink)}}); | 263 "in_", method.response_parameters, for_blink)}}); |
| 270 | 264 |
| 271 uint64_t request_id_; | 265 uint64_t request_id_; |
| 272 bool is_sync_; | 266 bool is_sync_; |
| 273 mojo::MessageReceiverWithStatus* responder_; | 267 mojo::MessageReceiverWithStatus* responder_; |
| 274 // TODO(yzshen): maybe I should use a ref to the original one? | |
| 275 mojo::internal::SerializationContext serialization_context_; | |
| 276 | 268 |
| 277 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder); | 269 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder); |
| 278 }; | 270 }; |
| 279 | 271 |
| 280 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( | 272 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( |
| 281 {{interface_macros.declare_responder_params( | 273 {{interface_macros.declare_responder_params( |
| 282 "in_", method.response_parameters, for_blink)}}) { | 274 "in_", method.response_parameters, for_blink)}}) { |
| 275 mojo::internal::SerializationContext serialization_context; |
| 283 {{struct_macros.get_serialized_size(response_params_struct, "in_%s", | 276 {{struct_macros.get_serialized_size(response_params_struct, "in_%s", |
| 284 "&serialization_context_")}} | 277 "&serialization_context")}} |
| 285 mojo::internal::ResponseMessageBuilder builder( | 278 |
| 286 {{message_name}}, size, request_id_, | 279 uint32_t flags = (is_sync_ ? mojo::Message::kFlagIsSync : 0) | |
| 287 is_sync_ ? mojo::Message::kFlagIsSync : 0); | 280 mojo::Message::kFlagIsResponse; |
| 281 mojo::internal::MessageBuilder builder( |
| 282 {{message_name}}, flags, size, |
| 283 serialization_context.associated_endpoint_count); |
| 284 builder.message()->set_request_id(request_id_); |
| 285 |
| 288 {{build_message(response_params_struct, "in_%s", params_description, | 286 {{build_message(response_params_struct, "in_%s", params_description, |
| 289 "&serialization_context_")}} | 287 "&serialization_context")}} |
| 290 bool ok = responder_->Accept(builder.message()); | 288 bool ok = responder_->Accept(builder.message()); |
| 291 ALLOW_UNUSED_LOCAL(ok); | 289 ALLOW_UNUSED_LOCAL(ok); |
| 292 // TODO(darin): !ok returned here indicates a malformed message, and that may | 290 // TODO(darin): !ok returned here indicates a malformed message, and that may |
| 293 // be good reason to close the connection. However, we don't have a way to do | 291 // be good reason to close the connection. However, we don't have a way to do |
| 294 // that from here. We should add a way. | 292 // that from here. We should add a way. |
| 295 delete responder_; | 293 delete responder_; |
| 296 responder_ = nullptr; | 294 responder_ = nullptr; |
| 297 } | 295 } |
| 298 {%- endif -%} | 296 {%- endif -%} |
| 299 {%- endfor %} | 297 {%- endfor %} |
| 300 | 298 |
| 301 {#--- StubDispatch definition #} | 299 {#--- StubDispatch definition #} |
| 302 | 300 |
| 303 // static | 301 // static |
| 304 bool {{class_name}}StubDispatch::Accept( | 302 bool {{class_name}}StubDispatch::Accept( |
| 305 {{interface.name}}* impl, | 303 {{interface.name}}* impl, |
| 306 mojo::internal::SerializationContext* context, | |
| 307 mojo::Message* message) { | 304 mojo::Message* message) { |
| 308 {%- if interface.methods %} | 305 {%- if interface.methods %} |
| 309 switch (message->header()->name) { | 306 switch (message->header()->name) { |
| 310 {%- for method in interface.methods %} | 307 {%- for method in interface.methods %} |
| 311 case internal::k{{class_name}}_{{method.name}}_Name: { | 308 case internal::k{{class_name}}_{{method.name}}_Name: { |
| 312 {%- if method.response_parameters == None %} | 309 {%- if method.response_parameters == None %} |
| 313 internal::{{class_name}}_{{method.name}}_Params_Data* params = | 310 internal::{{class_name}}_{{method.name}}_Params_Data* params = |
| 314 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( | 311 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( |
| 315 message->mutable_payload()); | 312 message->mutable_payload()); |
| 316 | 313 |
| 317 {%- set desc = class_name~"::"~method.name %} | 314 {%- set desc = class_name~"::"~method.name %} |
| 318 {{alloc_params(method.param_struct, "params", "message", "context", desc)| | 315 {{alloc_params(method.param_struct, "params", "message", desc)| |
| 319 indent(4)}} | 316 indent(4)}} |
| 320 // A null |impl| means no implementation was bound. | 317 // A null |impl| means no implementation was bound. |
| 321 assert(impl); | 318 assert(impl); |
| 322 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); | 319 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); |
| 323 mojo::internal::MessageDispatchContext context(message); | 320 mojo::internal::MessageDispatchContext context(message); |
| 324 impl->{{method.name}}({{pass_params(method.parameters)}}); | 321 impl->{{method.name}}({{pass_params(method.parameters)}}); |
| 325 return true; | 322 return true; |
| 326 {%- else %} | 323 {%- else %} |
| 327 break; | 324 break; |
| 328 {%- endif %} | 325 {%- endif %} |
| 329 } | 326 } |
| 330 {%- endfor %} | 327 {%- endfor %} |
| 331 } | 328 } |
| 332 {%- endif %} | 329 {%- endif %} |
| 333 return false; | 330 return false; |
| 334 } | 331 } |
| 335 | 332 |
| 336 // static | 333 // static |
| 337 bool {{class_name}}StubDispatch::AcceptWithResponder( | 334 bool {{class_name}}StubDispatch::AcceptWithResponder( |
| 338 {{interface.name}}* impl, | 335 {{interface.name}}* impl, |
| 339 mojo::internal::SerializationContext* context, | |
| 340 mojo::Message* message, | 336 mojo::Message* message, |
| 341 mojo::MessageReceiverWithStatus* responder) { | 337 mojo::MessageReceiverWithStatus* responder) { |
| 342 {%- if interface.methods %} | 338 {%- if interface.methods %} |
| 343 switch (message->header()->name) { | 339 switch (message->header()->name) { |
| 344 {%- for method in interface.methods %} | 340 {%- for method in interface.methods %} |
| 345 case internal::k{{class_name}}_{{method.name}}_Name: { | 341 case internal::k{{class_name}}_{{method.name}}_Name: { |
| 346 {%- if method.response_parameters != None %} | 342 {%- if method.response_parameters != None %} |
| 347 internal::{{class_name}}_{{method.name}}_Params_Data* params = | 343 internal::{{class_name}}_{{method.name}}_Params_Data* params = |
| 348 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( | 344 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( |
| 349 message->mutable_payload()); | 345 message->mutable_payload()); |
| 350 | 346 |
| 351 {%- set desc = class_name~"::"~method.name %} | 347 {%- set desc = class_name~"::"~method.name %} |
| 352 {{alloc_params(method.param_struct, "params", "message", "context", desc)| | 348 {{alloc_params(method.param_struct, "params", "message", desc)| |
| 353 indent(4)}} | 349 indent(4)}} |
| 354 {{class_name}}::{{method.name}}Callback callback = | 350 {{class_name}}::{{method.name}}Callback callback = |
| 355 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( | 351 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( |
| 356 message->request_id(), | 352 message->request_id(), |
| 357 message->has_flag(mojo::Message::kFlagIsSync), responder, | 353 message->has_flag(mojo::Message::kFlagIsSync), responder); |
| 358 context->group_controller); | |
| 359 // A null |impl| means no implementation was bound. | 354 // A null |impl| means no implementation was bound. |
| 360 assert(impl); | 355 assert(impl); |
| 361 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); | 356 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); |
| 362 mojo::internal::MessageDispatchContext context(message); | 357 mojo::internal::MessageDispatchContext context(message); |
| 363 impl->{{method.name}}( | 358 impl->{{method.name}}( |
| 364 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}std:
:move(callback)); | 359 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}std:
:move(callback)); |
| 365 return true; | 360 return true; |
| 366 {%- else %} | 361 {%- else %} |
| 367 break; | 362 break; |
| 368 {%- endif %} | 363 {%- endif %} |
| 369 } | 364 } |
| 370 {%- endfor %} | 365 {%- endfor %} |
| 371 } | 366 } |
| 372 {%- endif %} | 367 {%- endif %} |
| 373 return false; | 368 return false; |
| 374 } | 369 } |
| 375 | 370 |
| 376 {#--- Request validator definitions #} | 371 {#--- Request validator definitions #} |
| 377 | 372 |
| 378 bool {{class_name}}RequestValidator::Accept(mojo::Message* message) { | 373 bool {{class_name}}RequestValidator::Accept(mojo::Message* message) { |
| 379 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) | 374 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) |
| 380 return true; | 375 return true; |
| 381 | 376 |
| 382 mojo::internal::ValidationContext validation_context( | 377 mojo::internal::ValidationContext validation_context( |
| 383 message->data(), message->data_num_bytes(), message->handles()->size(), | 378 message->payload(), message->payload_num_bytes(), |
| 384 message, "{{class_name}} RequestValidator"); | 379 message->handles()->size(), message->payload_num_interface_ids(), message, |
| 380 "{{class_name}} RequestValidator"); |
| 385 | 381 |
| 386 switch (message->header()->name) { | 382 switch (message->header()->name) { |
| 387 {%- for method in interface.methods %} | 383 {%- for method in interface.methods %} |
| 388 case internal::k{{class_name}}_{{method.name}}_Name: { | 384 case internal::k{{class_name}}_{{method.name}}_Name: { |
| 389 {%- if method.response_parameters != None %} | 385 {%- if method.response_parameters != None %} |
| 390 if (!mojo::internal::ValidateMessageIsRequestExpectingResponse( | 386 if (!mojo::internal::ValidateMessageIsRequestExpectingResponse( |
| 391 message, &validation_context)) { | 387 message, &validation_context)) { |
| 392 return false; | 388 return false; |
| 393 } | 389 } |
| 394 {%- else %} | 390 {%- else %} |
| (...skipping 21 matching lines...) Expand all Loading... |
| 416 return false; | 412 return false; |
| 417 } | 413 } |
| 418 | 414 |
| 419 {#--- Response validator definitions #} | 415 {#--- Response validator definitions #} |
| 420 {% if interface|has_callbacks %} | 416 {% if interface|has_callbacks %} |
| 421 bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) { | 417 bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) { |
| 422 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) | 418 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) |
| 423 return true; | 419 return true; |
| 424 | 420 |
| 425 mojo::internal::ValidationContext validation_context( | 421 mojo::internal::ValidationContext validation_context( |
| 426 message->data(), message->data_num_bytes(), message->handles()->size(), | 422 message->payload(), message->payload_num_bytes(), |
| 427 message, "{{class_name}} ResponseValidator"); | 423 message->handles()->size(), message->payload_num_interface_ids(), message, |
| 424 "{{class_name}} ResponseValidator"); |
| 428 | 425 |
| 429 if (!mojo::internal::ValidateMessageIsResponse(message, &validation_context)) | 426 if (!mojo::internal::ValidateMessageIsResponse(message, &validation_context)) |
| 430 return false; | 427 return false; |
| 431 switch (message->header()->name) { | 428 switch (message->header()->name) { |
| 432 {%- for method in interface.methods if method.response_parameters != None %} | 429 {%- for method in interface.methods if method.response_parameters != None %} |
| 433 case internal::k{{class_name}}_{{method.name}}_Name: { | 430 case internal::k{{class_name}}_{{method.name}}_Name: { |
| 434 if (!mojo::internal::ValidateMessagePayload< | 431 if (!mojo::internal::ValidateMessagePayload< |
| 435 internal::{{class_name}}_{{method.name}}_ResponseParams_Data>( | 432 internal::{{class_name}}_{{method.name}}_ResponseParams_Data>( |
| 436 message, &validation_context)) { | 433 message, &validation_context)) { |
| 437 return false; | 434 return false; |
| 438 } | 435 } |
| 439 return true; | 436 return true; |
| 440 } | 437 } |
| 441 {%- endfor %} | 438 {%- endfor %} |
| 442 default: | 439 default: |
| 443 break; | 440 break; |
| 444 } | 441 } |
| 445 | 442 |
| 446 // Unrecognized message. | 443 // Unrecognized message. |
| 447 ReportValidationError( | 444 ReportValidationError( |
| 448 &validation_context, | 445 &validation_context, |
| 449 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); | 446 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); |
| 450 return false; | 447 return false; |
| 451 } | 448 } |
| 452 {%- endif -%} | 449 {%- endif -%} |
| OLD | NEW |