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 {%- set class_name = interface.name %} | 3 {%- set class_name = interface.name %} |
4 {%- set proxy_name = interface.name ~ "Proxy" %} | 4 {%- set proxy_name = interface.name ~ "Proxy" %} |
5 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} | 5 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} |
6 | 6 |
7 {%- macro alloc_params(struct) %} | 7 {%- macro alloc_params(struct) %} |
8 {%- for param in struct.packed.packed_fields_in_ordinal_order %} | 8 {%- for param in struct.packed.packed_fields_in_ordinal_order %} |
9 {{param.field.kind|cpp_result_type}} p_{{param.field.name}}{}; | 9 {{param.field.kind|cpp_result_type}} p_{{param.field.name}}{}; |
10 {%- endfor %} | 10 {%- endfor %} |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 {%- set message_name = | 109 {%- set message_name = |
110 "internal::k%s_%s_Name"|format(interface.name, method.name) %} | 110 "internal::k%s_%s_Name"|format(interface.name, method.name) %} |
111 {%- set response_params_struct = method|response_struct_from_method %} | 111 {%- set response_params_struct = method|response_struct_from_method %} |
112 {%- set params_description = | 112 {%- set params_description = |
113 "%s.%s response"|format(interface.name, method.name) %} | 113 "%s.%s response"|format(interface.name, method.name) %} |
114 class {{class_name}}_{{method.name}}_ProxyToResponder | 114 class {{class_name}}_{{method.name}}_ProxyToResponder |
115 : public {{class_name}}::{{method.name}}Callback::Runnable { | 115 : public {{class_name}}::{{method.name}}Callback::Runnable { |
116 public: | 116 public: |
117 virtual ~{{class_name}}_{{method.name}}_ProxyToResponder() { | 117 virtual ~{{class_name}}_{{method.name}}_ProxyToResponder() { |
118 delete responder_; | 118 delete responder_; |
119 // TODO(rudominer) DCHECK if |was_run_| is false and we don't have evidence | 119 {{class_name}}Stub* stub = associated_stub_.value(); |
120 // that we are in a legitamte shutdown case such as the Connector detected | 120 if (stub && !stub->connection_error_occurred() && !stub->closed()) { |
121 // an error or Close() was invoked. | 121 MOJO_DCHECK(was_run_) << "The callback passed to " |
| 122 "{{class_name}}::{{method.name}}({%- if method.parameters -%}{{pass_pa
rams(method.parameters)}}, {% endif -%}callback) " |
| 123 "was never run."; |
| 124 } |
122 } | 125 } |
123 | 126 |
124 {{class_name}}_{{method.name}}_ProxyToResponder( | 127 {{class_name}}_{{method.name}}_ProxyToResponder( |
125 uint64_t request_id, | 128 uint64_t request_id, |
126 mojo::MessageReceiver* responder) | 129 mojo::MessageReceiver* responder, |
| 130 const ::mojo::internal::SharedData<{{class_name}}Stub*>& stub) |
127 : request_id_(request_id), | 131 : request_id_(request_id), |
128 responder_(responder), | 132 responder_(responder), |
| 133 associated_stub_(stub), |
129 was_run_(false) { | 134 was_run_(false) { |
130 } | 135 } |
131 | 136 |
132 virtual void Run({{interface_macros.declare_params("in_", method.response_para
meters)}}) const override; | 137 virtual void Run({{interface_macros.declare_params("in_", method.response_para
meters)}}) const override; |
133 | 138 |
134 private: | 139 private: |
135 uint64_t request_id_; | 140 uint64_t request_id_; |
136 mutable mojo::MessageReceiver* responder_; | 141 mutable mojo::MessageReceiver* responder_; |
| 142 ::mojo::internal::SharedData<{{class_name}}Stub*> associated_stub_; |
137 mutable bool was_run_; | 143 mutable bool was_run_; |
138 MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder)
; | 144 MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder)
; |
139 }; | 145 }; |
140 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( | 146 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( |
141 {{interface_macros.declare_params("in_", method.response_parameters)}}) cons
t { | 147 {{interface_macros.declare_params("in_", method.response_parameters)}}) cons
t { |
142 was_run_ = true; | 148 was_run_ = true; |
143 {{struct_macros.get_serialized_size(response_params_struct, "in_%s")}} | 149 {{struct_macros.get_serialized_size(response_params_struct, "in_%s")}} |
144 mojo::internal::ResponseMessageBuilder builder( | 150 mojo::internal::ResponseMessageBuilder builder( |
145 {{message_name}}, size, request_id_); | 151 {{message_name}}, size, request_id_); |
146 {{build_message(response_params_struct, params_description)}} | 152 {{build_message(response_params_struct, params_description)}} |
147 bool ok = responder_->Accept(&message); | 153 bool ok = responder_->Accept(&message); |
148 MOJO_ALLOW_UNUSED_LOCAL(ok); | 154 MOJO_ALLOW_UNUSED_LOCAL(ok); |
149 // TODO(darin): !ok returned here indicates a malformed message, and that may | 155 // TODO(darin): !ok returned here indicates a malformed message, and that may |
150 // be good reason to close the connection. However, we don't have a way to do | 156 // be good reason to close the connection. However, we don't have a way to do |
151 // that from here. We should add a way. | 157 // that from here. We should add a way. |
152 delete responder_; | 158 delete responder_; |
153 responder_ = nullptr; | 159 responder_ = nullptr; |
154 } | 160 } |
155 {%- endif -%} | 161 {%- endif -%} |
156 {%- endfor %} | 162 {%- endfor %} |
157 | 163 |
158 {{class_name}}Stub::{{class_name}}Stub() | 164 {{class_name}}Stub::{{class_name}}Stub() |
159 : sink_(nullptr) { | 165 : sink_(nullptr), weak_self_(this), connection_error_occurred_(false), |
| 166 closed_(false) { |
| 167 } |
| 168 |
| 169 {{class_name}}Stub::~{{interface.name}}Stub() { |
| 170 weak_self_.set_value(nullptr); |
160 } | 171 } |
161 | 172 |
162 {#--- Stub definition #} | 173 {#--- Stub definition #} |
163 | 174 |
164 bool {{class_name}}Stub::Accept(mojo::Message* message) { | 175 bool {{class_name}}Stub::Accept(mojo::Message* message) { |
165 {%- if interface.methods %} | 176 {%- if interface.methods %} |
166 switch (message->header()->name) { | 177 switch (message->header()->name) { |
167 {%- for method in interface.methods %} | 178 {%- for method in interface.methods %} |
168 case internal::k{{class_name}}_{{method.name}}_Name: { | 179 case internal::k{{class_name}}_{{method.name}}_Name: { |
169 {%- if method.response_parameters == None %} | 180 {%- if method.response_parameters == None %} |
(...skipping 24 matching lines...) Expand all Loading... |
194 {%- for method in interface.methods %} | 205 {%- for method in interface.methods %} |
195 case internal::k{{class_name}}_{{method.name}}_Name: { | 206 case internal::k{{class_name}}_{{method.name}}_Name: { |
196 {%- if method.response_parameters != None %} | 207 {%- if method.response_parameters != None %} |
197 internal::{{class_name}}_{{method.name}}_Params_Data* params = | 208 internal::{{class_name}}_{{method.name}}_Params_Data* params = |
198 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( | 209 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( |
199 message->mutable_payload()); | 210 message->mutable_payload()); |
200 | 211 |
201 params->DecodePointersAndHandles(message->mutable_handles()); | 212 params->DecodePointersAndHandles(message->mutable_handles()); |
202 {{class_name}}::{{method.name}}Callback::Runnable* runnable = | 213 {{class_name}}::{{method.name}}Callback::Runnable* runnable = |
203 new {{class_name}}_{{method.name}}_ProxyToResponder( | 214 new {{class_name}}_{{method.name}}_ProxyToResponder( |
204 message->request_id(), responder); | 215 message->request_id(), responder, weak_self_); |
205 {{class_name}}::{{method.name}}Callback callback(runnable); | 216 {{class_name}}::{{method.name}}Callback callback(runnable); |
206 {{alloc_params(method|struct_from_method)|indent(4)}} | 217 {{alloc_params(method|struct_from_method)|indent(4)}} |
207 // A null |sink_| means no implementation was bound. | 218 // A null |sink_| means no implementation was bound. |
208 assert(sink_); | 219 assert(sink_); |
209 sink_->{{method.name}}( | 220 sink_->{{method.name}}( |
210 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}call
back); | 221 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}call
back); |
211 return true; | 222 return true; |
212 {%- else %} | 223 {%- else %} |
213 break; | 224 break; |
214 {%- endif %} | 225 {%- endif %} |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 break; | 290 break; |
280 } | 291 } |
281 {%- endfor %} | 292 {%- endfor %} |
282 } | 293 } |
283 {%- endif %} | 294 {%- endif %} |
284 | 295 |
285 assert(sink_); | 296 assert(sink_); |
286 return sink_->Accept(message); | 297 return sink_->Accept(message); |
287 } | 298 } |
288 {%- endif -%} | 299 {%- endif -%} |
OLD | NEW |