OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #ifndef MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ |
6 #define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ |
7 | 7 |
8 #include <assert.h> | |
9 | |
10 #include <vector> | 8 #include <vector> |
11 | 9 |
12 #include "mojo/public/cpp/bindings/lib/message_internal.h" | 10 #include "mojo/public/cpp/bindings/lib/message_internal.h" |
| 11 #include "mojo/public/cpp/environment/logging.h" |
13 | 12 |
14 namespace mojo { | 13 namespace mojo { |
15 | 14 |
16 // Message is a holder for the data and handles to be sent over a MessagePipe. | 15 // Message is a holder for the data and handles to be sent over a MessagePipe. |
17 // Message owns its data and handles, but a consumer of Message is free to | 16 // Message owns its data and handles, but a consumer of Message is free to |
18 // mutate the data and handles. The message's data is comprised of a header | 17 // mutate the data and handles. The message's data is comprised of a header |
19 // followed by payload. | 18 // followed by payload. |
20 class Message { | 19 class Message { |
21 public: | 20 public: |
22 Message(); | 21 Message(); |
(...skipping 16 matching lines...) Expand all Loading... |
39 | 38 |
40 // Access the header. | 39 // Access the header. |
41 const internal::MessageHeader* header() const { return &data_->header; } | 40 const internal::MessageHeader* header() const { return &data_->header; } |
42 | 41 |
43 uint32_t name() const { return data_->header.name; } | 42 uint32_t name() const { return data_->header.name; } |
44 bool has_flag(uint32_t flag) const { return !!(data_->header.flags & flag); } | 43 bool has_flag(uint32_t flag) const { return !!(data_->header.flags & flag); } |
45 | 44 |
46 // Access the request_id field (if present). | 45 // Access the request_id field (if present). |
47 bool has_request_id() const { return data_->header.num_fields >= 3; } | 46 bool has_request_id() const { return data_->header.num_fields >= 3; } |
48 uint64_t request_id() const { | 47 uint64_t request_id() const { |
49 assert(has_request_id()); | 48 MOJO_DCHECK(has_request_id()); |
50 return static_cast<const internal::MessageHeaderWithRequestID*>( | 49 return static_cast<const internal::MessageHeaderWithRequestID*>( |
51 &data_->header)->request_id; | 50 &data_->header)->request_id; |
52 } | 51 } |
53 void set_request_id(uint64_t request_id) { | 52 void set_request_id(uint64_t request_id) { |
54 assert(has_request_id()); | 53 MOJO_DCHECK(has_request_id()); |
55 static_cast<internal::MessageHeaderWithRequestID*>(&data_->header)-> | 54 static_cast<internal::MessageHeaderWithRequestID*>(&data_->header)-> |
56 request_id = request_id; | 55 request_id = request_id; |
57 } | 56 } |
58 | 57 |
59 // Access the payload. | 58 // Access the payload. |
60 const uint8_t* payload() const { | 59 const uint8_t* payload() const { |
61 return reinterpret_cast<const uint8_t*>(data_) + data_->header.num_bytes; | 60 return reinterpret_cast<const uint8_t*>(data_) + data_->header.num_bytes; |
62 } | 61 } |
63 uint8_t* mutable_payload() { | 62 uint8_t* mutable_payload() { |
64 return reinterpret_cast<uint8_t*>(data_) + data_->header.num_bytes; | 63 return reinterpret_cast<uint8_t*>(data_) + data_->header.num_bytes; |
65 } | 64 } |
66 uint32_t payload_num_bytes() const { | 65 uint32_t payload_num_bytes() const { |
67 assert(data_num_bytes_ >= data_->header.num_bytes); | 66 MOJO_DCHECK(data_num_bytes_ >= data_->header.num_bytes); |
68 return data_num_bytes_ - data_->header.num_bytes; | 67 return data_num_bytes_ - data_->header.num_bytes; |
69 } | 68 } |
70 | 69 |
71 // Access the handles. | 70 // Access the handles. |
72 const std::vector<Handle>* handles() const { return &handles_; } | 71 const std::vector<Handle>* handles() const { return &handles_; } |
73 std::vector<Handle>* mutable_handles() { return &handles_; } | 72 std::vector<Handle>* mutable_handles() { return &handles_; } |
74 | 73 |
75 private: | 74 private: |
76 uint32_t data_num_bytes_; | 75 uint32_t data_num_bytes_; |
77 internal::MessageData* data_; // Heap-allocated using malloc. | 76 internal::MessageData* data_; // Heap-allocated using malloc. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 // otherwise returns an error code if something went wrong. | 113 // otherwise returns an error code if something went wrong. |
115 // | 114 // |
116 // NOTE: The message hasn't been validated and may be malformed! | 115 // NOTE: The message hasn't been validated and may be malformed! |
117 MojoResult ReadAndDispatchMessage(MessagePipeHandle handle, | 116 MojoResult ReadAndDispatchMessage(MessagePipeHandle handle, |
118 MessageReceiver* receiver, | 117 MessageReceiver* receiver, |
119 bool* receiver_result); | 118 bool* receiver_result); |
120 | 119 |
121 } // namespace mojo | 120 } // namespace mojo |
122 | 121 |
123 #endif // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ | 122 #endif // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ |
OLD | NEW |