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 #ifndef PPAPI_PROXY_SERIALIZED_VAR_H_ | 5 #ifndef PPAPI_PROXY_SERIALIZED_VAR_H_ |
6 #define PPAPI_PROXY_SERIALIZED_VAR_H_ | 6 #define PPAPI_PROXY_SERIALIZED_VAR_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 13 #include "base/memory/scoped_ptr.h" |
13 #include "ppapi/c/pp_var.h" | 14 #include "ppapi/c/pp_var.h" |
14 #include "ppapi/proxy/ppapi_proxy_export.h" | 15 #include "ppapi/proxy/ppapi_proxy_export.h" |
15 | 16 |
16 namespace IPC { | 17 namespace IPC { |
17 class Message; | 18 class Message; |
18 } | 19 } |
19 | 20 |
20 namespace ppapi { | 21 namespace ppapi { |
21 namespace proxy { | 22 namespace proxy { |
22 | 23 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 friend class SerializedVarReturnValue; | 81 friend class SerializedVarReturnValue; |
81 friend class SerializedVarOutParam; | 82 friend class SerializedVarOutParam; |
82 friend class SerializedVarSendInput; | 83 friend class SerializedVarSendInput; |
83 friend class SerializedVarTestConstructor; | 84 friend class SerializedVarTestConstructor; |
84 friend class SerializedVarVectorReceiveInput; | 85 friend class SerializedVarVectorReceiveInput; |
85 | 86 |
86 class PPAPI_PROXY_EXPORT Inner : public base::RefCounted<Inner> { | 87 class PPAPI_PROXY_EXPORT Inner : public base::RefCounted<Inner> { |
87 public: | 88 public: |
88 Inner(); | 89 Inner(); |
89 Inner(VarSerializationRules* serialization_rules); | 90 Inner(VarSerializationRules* serialization_rules); |
90 Inner(VarSerializationRules* serialization_rules, const PP_Var& var); | |
91 ~Inner(); | 91 ~Inner(); |
92 | 92 |
93 VarSerializationRules* serialization_rules() { | 93 VarSerializationRules* serialization_rules() { |
94 return serialization_rules_; | 94 return serialization_rules_; |
95 } | 95 } |
96 void set_serialization_rules(VarSerializationRules* serialization_rules) { | 96 void set_serialization_rules(VarSerializationRules* serialization_rules) { |
97 serialization_rules_ = serialization_rules; | 97 serialization_rules_ = serialization_rules; |
98 } | 98 } |
99 | 99 |
100 // See outer class's declarations above. | 100 // See outer class's declarations above. |
101 PP_Var GetVar() const; | 101 PP_Var GetVar() const; |
102 PP_Var GetIncompleteVar() const; | 102 PP_Var GetIncompleteVar() const; |
103 void SetVar(PP_Var var); | 103 void SetVar(PP_Var var); |
104 const std::string& GetString() const; | 104 void SetString(scoped_ptr<std::string> str); |
105 std::string* GetStringPtr(); | 105 // Return a new string with the contents of the string referenced by Inner. |
| 106 // The string referenced by the Inner will be empty after this. |
| 107 scoped_ptr<std::string> GetStringDestructive(); |
| 108 // Return a pointer to our internal string pointer. This is so that the |
| 109 // caller will be able to make this Inner point to a string that's owned |
| 110 // elsewhere (i.e., in the tracker). |
| 111 const std::string** GetStringPtrPtr(); |
106 | 112 |
107 // For the SerializedVarTestConstructor, this writes the Var value as if | 113 // For the SerializedVarTestConstructor, this writes the Var value as if |
108 // it was just received off the wire, without any serialization rules. | 114 // it was just received off the wire, without any serialization rules. |
109 void ForceSetVarValueForTest(PP_Var value); | 115 void ForceSetVarValueForTest(PP_Var value); |
110 void ForceSetStringValueForTest(const std::string& str); | 116 void ForceSetStringValueForTest(const std::string& str); |
111 | 117 |
112 void WriteToMessage(IPC::Message* m) const; | 118 void WriteToMessage(IPC::Message* m) const; |
113 bool ReadFromMessage(const IPC::Message* m, void** iter); | 119 bool ReadFromMessage(const IPC::Message* m, void** iter); |
114 | 120 |
115 // Sets the cleanup mode. See the CleanupMode enum below. These functions | 121 // Sets the cleanup mode. See the CleanupMode enum below. These functions |
(...skipping 14 matching lines...) Expand all Loading... |
130 // The serialized var will call EndReceiveCallerOwned in the destructor. | 136 // The serialized var will call EndReceiveCallerOwned in the destructor. |
131 END_RECEIVE_CALLER_OWNED | 137 END_RECEIVE_CALLER_OWNED |
132 }; | 138 }; |
133 | 139 |
134 // Rules for serializing and deserializing vars for this process type. | 140 // Rules for serializing and deserializing vars for this process type. |
135 // This may be NULL, but must be set before trying to serialize to IPC when | 141 // This may be NULL, but must be set before trying to serialize to IPC when |
136 // sending, or before converting back to a PP_Var when receiving. | 142 // sending, or before converting back to a PP_Var when receiving. |
137 VarSerializationRules* serialization_rules_; | 143 VarSerializationRules* serialization_rules_; |
138 | 144 |
139 // If this is set to VARTYPE_STRING and the 'value.id' is 0, then the | 145 // If this is set to VARTYPE_STRING and the 'value.id' is 0, then the |
140 // string_value_ contains the string. This means that the caller hasn't | 146 // string_from_ipc_ holds the string. This means that the caller hasn't |
141 // called Deserialize with a valid Dispatcher yet, which is how we can | 147 // called Deserialize with a valid Dispatcher yet, which is how we can |
142 // convert the serialized string value to a PP_Var string ID. | 148 // convert the serialized string value to a PP_Var string ID. |
143 // | 149 // |
144 // This var may not be complete until the serialization rules are set when | 150 // This var may not be complete until the serialization rules are set when |
145 // reading from IPC since we'll need that to convert the string_value to | 151 // reading from IPC since we'll need that to convert the string_value to |
146 // a string ID. Before this, the as_id will be 0 for VARTYPE_STRING. | 152 // a string ID. Before this, the as_id will be 0 for VARTYPE_STRING. |
147 PP_Var var_; | 153 PP_Var var_; |
148 | 154 |
149 // Holds the literal string value to/from IPC. This will be valid if the | 155 // If valid, this is a pointer to a string owned by the VarTracker. When our |
150 // var_ is VARTYPE_STRING. | 156 // outer SerializedVar gets serialized, it will write the string directly |
151 std::string string_value_; | 157 // from the tracker so we do not need to make any unnecessary copies. This |
| 158 // should only be valid on the sender side. |
| 159 const std::string* tracker_string_ptr_; |
| 160 |
| 161 // If valid, this is a string received from IPC which needs to be inserted |
| 162 // in to the var tracker. When we provide it to the tracker, we pass |
| 163 // ownership so that there are no unnecessary copies. This should only ever |
| 164 // be valid on the receiver side. |
| 165 scoped_ptr<std::string> string_from_ipc_; |
152 | 166 |
153 CleanupMode cleanup_mode_; | 167 CleanupMode cleanup_mode_; |
154 | 168 |
155 // The dispatcher saved for the call to EndSendPassRef for the cleanup. | 169 // The dispatcher saved for the call to EndSendPassRef for the cleanup. |
156 // This is only valid when cleanup_mode == END_SEND_PASS_REF. | 170 // This is only valid when cleanup_mode == END_SEND_PASS_REF. |
157 Dispatcher* dispatcher_for_end_send_pass_ref_; | 171 Dispatcher* dispatcher_for_end_send_pass_ref_; |
158 | 172 |
159 #ifndef NDEBUG | 173 #ifndef NDEBUG |
160 // When being sent or received over IPC, we should only be serialized or | 174 // When being sent or received over IPC, we should only be serialized or |
161 // deserialized once. These flags help us assert this is true. | 175 // deserialized once. These flags help us assert this is true. |
162 mutable bool has_been_serialized_; | 176 mutable bool has_been_serialized_; |
163 mutable bool has_been_deserialized_; | 177 mutable bool has_been_deserialized_; |
164 #endif | 178 #endif |
165 | 179 |
166 DISALLOW_COPY_AND_ASSIGN(Inner); | 180 DISALLOW_COPY_AND_ASSIGN(Inner); |
167 }; | 181 }; |
168 | 182 |
169 SerializedVar(VarSerializationRules* serialization_rules); | 183 SerializedVar(VarSerializationRules* serialization_rules); |
170 SerializedVar(VarSerializationRules* serialization, const PP_Var& var); | |
171 | 184 |
172 mutable scoped_refptr<Inner> inner_; | 185 mutable scoped_refptr<Inner> inner_; |
173 }; | 186 }; |
174 | 187 |
175 // Helpers for message sending side -------------------------------------------- | 188 // Helpers for message sending side -------------------------------------------- |
176 | 189 |
177 // For sending a value to the remote side. | 190 // For sending a value to the remote side. |
178 // | 191 // |
179 // Example for API: | 192 // Example for API: |
180 // void MyFunction(PP_Var) | 193 // void MyFunction(PP_Var) |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 // For tests that want to read what's in a SerializedVar. | 459 // For tests that want to read what's in a SerializedVar. |
447 class PPAPI_PROXY_EXPORT SerializedVarTestReader : public SerializedVar { | 460 class PPAPI_PROXY_EXPORT SerializedVarTestReader : public SerializedVar { |
448 public: | 461 public: |
449 explicit SerializedVarTestReader(const SerializedVar& var); | 462 explicit SerializedVarTestReader(const SerializedVar& var); |
450 | 463 |
451 // The "incomplete" var is the one sent over the wire. Strings and object | 464 // The "incomplete" var is the one sent over the wire. Strings and object |
452 // IDs have not yet been converted, so this is the thing that tests will | 465 // IDs have not yet been converted, so this is the thing that tests will |
453 // actually want to check. | 466 // actually want to check. |
454 PP_Var GetIncompleteVar() const { return inner_->GetIncompleteVar(); } | 467 PP_Var GetIncompleteVar() const { return inner_->GetIncompleteVar(); } |
455 | 468 |
456 const std::string& GetString() const { return inner_->GetString(); } | 469 const std::string* GetTrackerStringPtr() const { |
| 470 return *inner_->GetStringPtrPtr(); |
| 471 } |
457 }; | 472 }; |
458 | 473 |
459 } // namespace proxy | 474 } // namespace proxy |
460 } // namespace ppapi | 475 } // namespace ppapi |
461 | 476 |
462 #endif // PPAPI_PROXY_SERIALIZED_VAR_H_ | 477 #endif // PPAPI_PROXY_SERIALIZED_VAR_H_ |
463 | 478 |
OLD | NEW |