OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_CPP_OUTPUT_TRAITS_H_ | 5 #ifndef PPAPI_CPP_OUTPUT_TRAITS_H_ |
6 #define PPAPI_CPP_OUTPUT_TRAITS_H_ | 6 #define PPAPI_CPP_OUTPUT_TRAITS_H_ |
7 | 7 |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "ppapi/c/pp_resource.h" | 10 #include "ppapi/c/pp_resource.h" |
11 #include "ppapi/cpp/array_output.h" | 11 #include "ppapi/cpp/array_output.h" |
| 12 #include "ppapi/cpp/dev/array_dev.h" |
| 13 #include "ppapi/cpp/dev/from_c_type_converter_dev.h" |
| 14 #include "ppapi/cpp/dev/struct_wrapper_base_dev.h" |
12 #include "ppapi/cpp/resource.h" | 15 #include "ppapi/cpp/resource.h" |
13 | 16 |
14 /// @file | 17 /// @file |
15 /// This file defines internal templates for defining how data is passed to the | 18 /// This file defines internal templates for defining how data is passed to the |
16 /// browser via output parameters and how to convert that data to the | 19 /// browser via output parameters and how to convert that data to the |
17 /// corresponding C++ object types. | 20 /// corresponding C++ object types. |
18 /// | 21 /// |
19 /// It is used by the callback system, it should not be necessary for end-users | 22 /// It is used by the callback system, it should not be necessary for end-users |
20 /// to use these templates directly. | 23 /// to use these templates directly. |
21 | 24 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 // resource object type. | 119 // resource object type. |
117 static inline T StorageToPluginArg(StorageType& t) { | 120 static inline T StorageToPluginArg(StorageType& t) { |
118 return T(PASS_REF, t); | 121 return T(PASS_REF, t); |
119 } | 122 } |
120 | 123 |
121 static inline void Initialize(StorageType* t) { | 124 static inline void Initialize(StorageType* t) { |
122 *t = 0; | 125 *t = 0; |
123 } | 126 } |
124 }; | 127 }; |
125 | 128 |
| 129 template<typename T> |
| 130 struct StructWrapperCallbackOutputTraits { |
| 131 typedef typename T::COutputType APIArgType; |
| 132 typedef FromCTypeConverter<T> StorageType; |
| 133 |
| 134 static inline APIArgType StorageToAPIArg(StorageType& t) { |
| 135 return t.StartRawUpdate(); |
| 136 } |
| 137 |
| 138 static inline T& StorageToPluginArg(StorageType& t) { |
| 139 t.EndRawUpdate(); |
| 140 return t.value(); |
| 141 } |
| 142 |
| 143 static inline void Initialize(StorageType* /* t */) {} |
| 144 }; |
| 145 |
126 // The general templatized base class for all CallbackOutputTraits. This class | 146 // The general templatized base class for all CallbackOutputTraits. This class |
127 // covers both resources and POD (ints, structs, etc.) by inheriting from the | 147 // covers resources, struct wrapper objects and POD (ints, structs, etc.) |
128 // appropriate base class depending on whether the given type derives from | 148 // by inheriting from the appropriate base class depending on whether the given |
129 // pp::Resource. This trick allows us to do this once rather than writing | 149 // type derives from pp::Resource or StructWrapperIdentifier. This trick |
130 // specializations for every resource object type. | 150 // allows us to do this once rather than writing specializations for every |
| 151 // object type. |
| 152 // TODO(yzshen): I will need to add specializtion for Optional<T>. Other than |
| 153 // that I think it should be fine. |
131 template<typename T> | 154 template<typename T> |
132 struct CallbackOutputTraits | 155 struct CallbackOutputTraits |
133 : public InheritIf<GenericCallbackOutputTraits<T>, | 156 : public InheritIf<ResourceCallbackOutputTraits<T>, |
134 !IsBaseOf<Resource, T>::value>, | 157 IsBaseOf<Resource, T>::value>, |
135 public InheritIf<ResourceCallbackOutputTraits<T>, | 158 public InheritIf<StructWrapperCallbackOutputTraits<T>, |
136 IsBaseOf<Resource, T>::value> { | 159 IsBaseOf<StructWrapperIdentifier, T>::value>, |
| 160 public InheritIf<GenericCallbackOutputTraits<T>, |
| 161 !IsBaseOf<Resource, T>::value && |
| 162 !IsBaseOf<StructWrapperIdentifier, T>::value> { |
137 }; | 163 }; |
138 | 164 |
139 // A specialization of CallbackOutputTraits for pp::Var output parameters. | 165 // A specialization of CallbackOutputTraits for pp::Var output parameters. |
140 // It passes a PP_Var* to the browser and converts to a pp::Var when passing | 166 // It passes a PP_Var* to the browser and converts to a pp::Var when passing |
141 // to the plugin. | 167 // to the plugin. |
142 template<> | 168 template<> |
143 struct CallbackOutputTraits<Var> { | 169 struct CallbackOutputTraits<Var> { |
144 // To call the browser, we just pass a PP_Var* as an output param. | 170 // To call the browser, we just pass a PP_Var* as an output param. |
145 typedef PP_Var* APIArgType; | 171 typedef PP_Var* APIArgType; |
146 typedef PP_Var StorageType; | 172 typedef PP_Var StorageType; |
(...skipping 30 matching lines...) Expand all Loading... |
177 // Converts the PP_Bool to a bool object. | 203 // Converts the PP_Bool to a bool object. |
178 static inline bool StorageToPluginArg(StorageType& t) { | 204 static inline bool StorageToPluginArg(StorageType& t) { |
179 return PP_ToBool(t); | 205 return PP_ToBool(t); |
180 } | 206 } |
181 | 207 |
182 static inline void Initialize(StorageType* t) { | 208 static inline void Initialize(StorageType* t) { |
183 *t = PP_FALSE; | 209 *t = PP_FALSE; |
184 } | 210 } |
185 }; | 211 }; |
186 | 212 |
| 213 template<typename T> |
| 214 struct CallbackOutputTraits<Array<T> > { |
| 215 typedef typename Array<T>::COutputType APIArgType; |
| 216 typedef Array<T> StorageType; |
| 217 |
| 218 static inline APIArgType StorageToAPIArg(StorageType& t) { |
| 219 return t.StartRawUpdate(); |
| 220 } |
| 221 |
| 222 static inline Array<T>& StorageToPluginArg(StorageType& t) { |
| 223 t.EndRawUpdate(); |
| 224 return t; |
| 225 } |
| 226 |
| 227 static inline void Initialize(StorageType* t) { |
| 228 } |
| 229 }; |
| 230 |
187 // Array output parameters ----------------------------------------------------- | 231 // Array output parameters ----------------------------------------------------- |
188 | 232 |
189 // Output traits for vectors of all "plain old data" (POD) types. It is | 233 // Output traits for vectors of all "plain old data" (POD) types. It is |
190 // implemented to pass a pointer to the browser as an output parameter. | 234 // implemented to pass a pointer to the browser as an output parameter. |
191 // | 235 // |
192 // This is used as a base class for the general vector CallbackOutputTraits | 236 // This is used as a base class for the general vector CallbackOutputTraits |
193 // below in the case where T is not a resource. | 237 // below in the case where T is not a resource. |
194 template<typename T> | 238 template<typename T> |
195 struct GenericVectorCallbackOutputTraits { | 239 struct GenericVectorCallbackOutputTraits { |
196 // All arrays are output via a PP_ArrayOutput type. | 240 // All arrays are output via a PP_ArrayOutput type. |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 return t.output(); | 317 return t.output(); |
274 } | 318 } |
275 | 319 |
276 static inline void Initialize(StorageType* /* t */) {} | 320 static inline void Initialize(StorageType* /* t */) {} |
277 }; | 321 }; |
278 | 322 |
279 } // namespace internal | 323 } // namespace internal |
280 } // namespace pp | 324 } // namespace pp |
281 | 325 |
282 #endif // PPAPI_CPP_OUTPUT_TRAITS_H_ | 326 #endif // PPAPI_CPP_OUTPUT_TRAITS_H_ |
OLD | NEW |