OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "dbus/message.h" | 5 #include "dbus/message.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
11 | 11 |
| 12 namespace { |
| 13 |
| 14 // Appends the header name and the value to |output|, if the value is |
| 15 // not empty. |
| 16 static void AppendStringHeader(const std::string& header_name, |
| 17 const std::string& header_value, |
| 18 std::string* output) { |
| 19 if (!header_value.empty()) { |
| 20 *output += header_name + ": " + header_value + "\n"; |
| 21 } |
| 22 } |
| 23 |
| 24 // Appends the header name and the value to |output|, if the value is |
| 25 // nonzero. |
| 26 static void AppendUint32Header(const std::string& header_name, |
| 27 uint32 header_value, |
| 28 std::string* output) { |
| 29 if (header_value != 0) { |
| 30 *output += (header_name + ": " + base::StringPrintf("%u", header_value) + |
| 31 "\n"); |
| 32 } |
| 33 } |
| 34 |
| 35 } // namespace |
| 36 |
12 namespace dbus { | 37 namespace dbus { |
13 | 38 |
14 Message::Message() | 39 Message::Message() |
15 : raw_message_(NULL) { | 40 : raw_message_(NULL) { |
16 } | 41 } |
17 | 42 |
18 Message::~Message() { | 43 Message::~Message() { |
19 if (raw_message_) | 44 if (raw_message_) |
20 dbus_message_unref(raw_message_); | 45 dbus_message_unref(raw_message_); |
21 } | 46 } |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 // member: SomeMethod | 196 // member: SomeMethod |
172 // | 197 // |
173 // string \"payload\" | 198 // string \"payload\" |
174 // ... | 199 // ... |
175 std::string Message::ToString() { | 200 std::string Message::ToString() { |
176 if (!raw_message_) | 201 if (!raw_message_) |
177 return ""; | 202 return ""; |
178 | 203 |
179 // Generate headers first. | 204 // Generate headers first. |
180 std::string headers; | 205 std::string headers; |
181 const char* destination = dbus_message_get_destination(raw_message_); | 206 AppendStringHeader("destination", GetDestination(), &headers); |
182 if (destination) | 207 AppendStringHeader("path", GetPath(), &headers); |
183 headers += base::StringPrintf("destination: %s\n", destination); | 208 AppendStringHeader("interface", GetInterface(), &headers); |
184 const char* path = dbus_message_get_path(raw_message_); | 209 AppendStringHeader("member", GetMember(), &headers); |
185 if (path) | 210 AppendStringHeader("error_name", GetErrorName(), &headers); |
186 headers += base::StringPrintf("path: %s\n", path); | 211 AppendStringHeader("sender", GetSender(), &headers); |
187 const char* interface = dbus_message_get_interface(raw_message_); | 212 AppendStringHeader("signature", GetSignature(), &headers); |
188 if (interface) | 213 AppendUint32Header("serial", GetSerial(), &headers); |
189 headers += base::StringPrintf("interface: %s\n", interface); | 214 AppendUint32Header("reply_serial", GetReplySerial(), &headers); |
190 const char* member = dbus_message_get_member(raw_message_); | |
191 if (member) | |
192 headers += base::StringPrintf("member: %s\n", member); | |
193 const char* error_name = dbus_message_get_error_name(raw_message_); | |
194 if (error_name) | |
195 headers += base::StringPrintf("error_name: %s\n", error_name); | |
196 const char* sender = dbus_message_get_sender(raw_message_); | |
197 if (sender) | |
198 headers += base::StringPrintf("sender: %s\n", sender); | |
199 const char* signature = dbus_message_get_signature(raw_message_); | |
200 if (signature) | |
201 headers += base::StringPrintf("signature: %s\n", signature); | |
202 | 215 |
203 // Generate the payload. | 216 // Generate the payload. |
204 MessageReader reader(this); | 217 MessageReader reader(this); |
205 return headers + "\n" + ToStringInternal("", &reader); | 218 return headers + "\n" + ToStringInternal("", &reader); |
206 } | 219 } |
207 | 220 |
| 221 void Message::SetDestination(const std::string& destination) { |
| 222 const bool success = dbus_message_set_destination(raw_message_, |
| 223 destination.c_str()); |
| 224 CHECK(success) << "Unable to allocate memory"; |
| 225 } |
| 226 |
| 227 void Message::SetPath(const std::string& path) { |
| 228 const bool success = dbus_message_set_path(raw_message_, |
| 229 path.c_str()); |
| 230 CHECK(success) << "Unable to allocate memory"; |
| 231 } |
| 232 |
| 233 void Message::SetInterface(const std::string& interface) { |
| 234 const bool success = dbus_message_set_interface(raw_message_, |
| 235 interface.c_str()); |
| 236 CHECK(success) << "Unable to allocate memory"; |
| 237 } |
| 238 |
| 239 void Message::SetMember(const std::string& member) { |
| 240 const bool success = dbus_message_set_member(raw_message_, |
| 241 member.c_str()); |
| 242 CHECK(success) << "Unable to allocate memory"; |
| 243 } |
| 244 |
| 245 void Message::SetErrorName(const std::string& error_name) { |
| 246 const bool success = dbus_message_set_error_name(raw_message_, |
| 247 error_name.c_str()); |
| 248 CHECK(success) << "Unable to allocate memory"; |
| 249 } |
| 250 |
| 251 void Message::SetSender(const std::string& sender) { |
| 252 const bool success = dbus_message_set_sender(raw_message_, |
| 253 sender.c_str()); |
| 254 CHECK(success) << "Unable to allocate memory"; |
| 255 } |
| 256 |
| 257 void Message::SetSerial(uint32 serial) { |
| 258 dbus_message_set_serial(raw_message_, serial); |
| 259 } |
| 260 |
| 261 void Message::SetReplySerial(uint32 reply_serial) { |
| 262 dbus_message_set_reply_serial(raw_message_, reply_serial); |
| 263 } |
| 264 |
| 265 std::string Message::GetDestination() { |
| 266 const char* destination = dbus_message_get_destination(raw_message_); |
| 267 return destination ? destination : ""; |
| 268 } |
| 269 |
| 270 std::string Message::GetPath() { |
| 271 const char* path = dbus_message_get_path(raw_message_); |
| 272 return path ? path : ""; |
| 273 } |
| 274 |
| 275 std::string Message::GetInterface() { |
| 276 const char* interface = dbus_message_get_interface(raw_message_); |
| 277 return interface ? interface : ""; |
| 278 } |
| 279 |
| 280 std::string Message::GetMember() { |
| 281 const char* member = dbus_message_get_member(raw_message_); |
| 282 return member ? member : ""; |
| 283 } |
| 284 |
| 285 std::string Message::GetErrorName() { |
| 286 const char* error_name = dbus_message_get_error_name(raw_message_); |
| 287 return error_name ? error_name : ""; |
| 288 } |
| 289 |
| 290 std::string Message::GetSender() { |
| 291 const char* sender = dbus_message_get_sender(raw_message_); |
| 292 return sender ? sender : ""; |
| 293 } |
| 294 |
| 295 std::string Message::GetSignature() { |
| 296 const char* signature = dbus_message_get_signature(raw_message_); |
| 297 return signature ? signature : ""; |
| 298 } |
| 299 |
| 300 uint32 Message::GetSerial() { |
| 301 return dbus_message_get_serial(raw_message_); |
| 302 } |
| 303 |
| 304 uint32 Message::GetReplySerial() { |
| 305 return dbus_message_get_reply_serial(raw_message_); |
| 306 } |
| 307 |
208 // | 308 // |
209 // MethodCall implementation. | 309 // MethodCall implementation. |
210 // | 310 // |
211 | 311 |
212 MethodCall::MethodCall(const std::string& interface_name, | 312 MethodCall::MethodCall(const std::string& interface_name, |
213 const std::string& method_name) | 313 const std::string& method_name) |
214 : Message(), | 314 : Message() { |
215 interface_name_(interface_name), | |
216 method_name_(method_name) { | |
217 reset_raw_message(dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL)); | 315 reset_raw_message(dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL)); |
218 | 316 |
219 bool success = dbus_message_set_interface(raw_message(), | 317 SetInterface(interface_name); |
220 interface_name.c_str()); | 318 SetMember(method_name); |
221 CHECK(success) << "Unable to allocate memory"; | |
222 | |
223 success = dbus_message_set_member(raw_message(), method_name.c_str()); | |
224 CHECK(success) << "Unable to allocate memory"; | |
225 } | 319 } |
226 | 320 |
227 void MethodCall::SetServiceName(const std::string& service_name) { | 321 MethodCall* MethodCall::FromRawMessage(DBusMessage* raw_message) { |
228 const bool success = dbus_message_set_destination(raw_message(), | 322 DCHECK_EQ(DBUS_MESSAGE_TYPE_METHOD_CALL, dbus_message_get_type(raw_message)); |
229 service_name.c_str()); | |
230 CHECK(success) << "Unable to allocate memory"; | |
231 } | |
232 | 323 |
233 void MethodCall::SetObjectPath(const std::string& object_path) { | 324 const char* interface = dbus_message_get_interface(raw_message); |
234 const bool success = dbus_message_set_path(raw_message(), | 325 const char* member = dbus_message_get_member(raw_message); |
235 object_path.c_str()); | 326 std::string interface_string = interface ? interface : ""; |
236 CHECK(success) << "Unable to allocate memory"; | 327 std::string member_string = member ? member : ""; |
| 328 |
| 329 MethodCall* method_call = new MethodCall(interface_string, member_string); |
| 330 method_call->reset_raw_message(raw_message); |
| 331 return method_call; |
237 } | 332 } |
238 | 333 |
239 // | 334 // |
240 // Response implementation. | 335 // Response implementation. |
241 // | 336 // |
242 | 337 |
243 Response::Response() : Message() { | 338 Response::Response() : Message() { |
244 } | 339 } |
245 | 340 |
| 341 Response* Response::FromMethodCall(MethodCall* method_call) { |
| 342 Response* response = new Response; |
| 343 response->reset_raw_message( |
| 344 dbus_message_new_method_return(method_call->raw_message())); |
| 345 return response; |
| 346 } |
| 347 |
| 348 // |
| 349 // ErrorResponse implementation. |
| 350 // |
| 351 |
| 352 ErrorResponse::ErrorResponse() : Message() { |
| 353 } |
| 354 |
| 355 ErrorResponse* ErrorResponse::FromMethodCall( |
| 356 MethodCall* method_call, |
| 357 const std::string& error_name, |
| 358 const std::string& error_message) { |
| 359 ErrorResponse* response = new ErrorResponse; |
| 360 response->reset_raw_message( |
| 361 dbus_message_new_error(method_call->raw_message(), |
| 362 error_name.c_str(), |
| 363 error_message.c_str())); |
| 364 return response; |
| 365 } |
| 366 |
246 // | 367 // |
247 // MessageWriter implementation. | 368 // MessageWriter implementation. |
248 // | 369 // |
249 | 370 |
250 MessageWriter::MessageWriter(Message* message) : | 371 MessageWriter::MessageWriter(Message* message) : |
251 message_(message), | 372 message_(message), |
252 container_is_open_(false) { | 373 container_is_open_(false) { |
253 dbus_message_iter_init_append(message_->raw_message(), &raw_message_iter_); | 374 dbus_message_iter_init_append(message_->raw_message(), &raw_message_iter_); |
254 } | 375 } |
255 | 376 |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 } | 794 } |
674 | 795 |
675 bool MessageReader::PopVariantOfBasic(int dbus_type, void* value) { | 796 bool MessageReader::PopVariantOfBasic(int dbus_type, void* value) { |
676 dbus::MessageReader variant_reader(message_); | 797 dbus::MessageReader variant_reader(message_); |
677 if (!PopVariant(&variant_reader)) | 798 if (!PopVariant(&variant_reader)) |
678 return false; | 799 return false; |
679 return variant_reader.PopBasic(dbus_type, value); | 800 return variant_reader.PopBasic(dbus_type, value); |
680 } | 801 } |
681 | 802 |
682 } // namespace dbus | 803 } // namespace dbus |
OLD | NEW |