OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 O3D_GPU_PLUGIN_NP_UTILS_NP_DISPATCHER_H_ | 5 #ifndef O3D_GPU_PLUGIN_NP_UTILS_NP_DISPATCHER_H_ |
6 #define O3D_GPU_PLUGIN_NP_UTILS_NP_DISPATCHER_H_ | 6 #define O3D_GPU_PLUGIN_NP_UTILS_NP_DISPATCHER_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "o3d/gpu_plugin/np_utils/np_utils.h" | 10 #include "o3d/gpu_plugin/np_utils/np_utils.h" |
11 #include "third_party/npapi/bindings/npapi.h" | 11 #include "third_party/npapi/bindings/npapi.h" |
12 #include "third_party/npapi/bindings/npruntime.h" | 12 #include "third_party/npapi/bindings/npruntime.h" |
13 | 13 |
14 // These macros are used to make dispatcher chains. See the comment for the | 14 // Dispatchers make regular member functions available as NPObject methods. |
15 // DispatchedNPObject class. | 15 // Usage: |
| 16 // |
| 17 // class MyNPObject : public DefaultNPObject<NPObject> { |
| 18 // public: |
| 19 // int MyMethod(bool a, float b); |
| 20 // NP_UTILS_BEGIN_DISPATCHER_CHAIN(MyNPObject, DispatchedNPObject) |
| 21 // NP_UTILS_DISPATCHER(MyMethod, int(bool, float)) |
| 22 // NP_UTILS_END_DISPATCHER_CHAIN |
| 23 // }; |
| 24 // |
| 25 // Multiple member functions may be listed in the dispatcher chain. Inheritance |
| 26 // is supported. The following types are supported as return types and parameter |
| 27 // types: |
| 28 // * bool |
| 29 // * int |
| 30 // * float |
| 31 // * double |
| 32 // * std::string |
| 33 // * NPObject* |
| 34 // |
| 35 |
| 36 // These macros are used to make dispatcher chains. |
16 #define NP_UTILS_NP_UTILS_DISPATCHER_JOIN2(a, b) a ## b | 37 #define NP_UTILS_NP_UTILS_DISPATCHER_JOIN2(a, b) a ## b |
17 #define NP_UTILS_DISPATCHER_JOIN(a, b) NP_UTILS_NP_UTILS_DISPATCHER_JOIN2(a, b) | 38 #define NP_UTILS_DISPATCHER_JOIN(a, b) NP_UTILS_NP_UTILS_DISPATCHER_JOIN2(a, b) |
18 #define NP_UTILS_DISPATCHER_UNIQUE \ | 39 #define NP_UTILS_DISPATCHER_UNIQUE \ |
19 NP_UTILS_DISPATCHER_JOIN(dispatcher, __LINE__) | 40 NP_UTILS_DISPATCHER_JOIN(dispatcher, __LINE__) |
20 | 41 |
21 #define NP_UTILS_BEGIN_DISPATCHER_CHAIN(Class, BaseClass) \ | 42 #define NP_UTILS_BEGIN_DISPATCHER_CHAIN(Class, BaseClass) \ |
22 static BaseNPDispatcher* GetStaticDispatcherChain() { \ | 43 static BaseNPDispatcher* GetDispatcherChain() { \ |
23 typedef Class ThisClass; \ | 44 typedef Class ThisClass; \ |
24 BaseNPDispatcher* top_dispatcher = BaseClass::GetStaticDispatcherChain(); \ | 45 BaseNPDispatcher* top_dispatcher = BaseClass::GetDispatcherChain(); \ |
25 | 46 |
26 #define NP_UTILS_DISPATCHER(name, Signature) \ | 47 #define NP_UTILS_DISPATCHER(name, Signature) \ |
27 static NPDispatcher<ThisClass, Signature> \ | 48 static NPDispatcher<ThisClass, Signature> \ |
28 NP_UTILS_DISPATCHER_UNIQUE( \ | 49 NP_UTILS_DISPATCHER_UNIQUE( \ |
29 top_dispatcher, \ | 50 top_dispatcher, \ |
30 #name, \ | 51 #name, \ |
31 &ThisClass::name); \ | 52 &ThisClass::name); \ |
32 top_dispatcher = &NP_UTILS_DISPATCHER_UNIQUE; \ | 53 top_dispatcher = &NP_UTILS_DISPATCHER_UNIQUE; \ |
33 | 54 |
34 #define NP_UTILS_END_DISPATCHER_CHAIN \ | 55 #define NP_UTILS_END_DISPATCHER_CHAIN \ |
35 return top_dispatcher; \ | 56 return top_dispatcher; \ |
36 } \ | 57 } \ |
37 virtual BaseNPDispatcher* GetDynamicDispatcherChain() { \ | 58 bool HasMethod(NPIdentifier name) { \ |
38 static BaseNPDispatcher* top_dispatcher = GetStaticDispatcherChain(); \ | 59 return DispatcherHasMethodHelper(GetDispatcherChain(), this, name); \ |
39 return top_dispatcher; \ | 60 } \ |
| 61 bool Invoke(NPIdentifier name, \ |
| 62 const NPVariant* args, \ |
| 63 uint32_t num_args, \ |
| 64 NPVariant* result) { \ |
| 65 return DispatcherInvokeHelper(GetDispatcherChain(), \ |
| 66 this, \ |
| 67 name, \ |
| 68 args, \ |
| 69 num_args, \ |
| 70 result); \ |
| 71 } \ |
| 72 bool Enumerate(NPIdentifier** names, uint32_t* num_names) { \ |
| 73 return DispatcherEnumerateHelper(GetDispatcherChain(), \ |
| 74 this, \ |
| 75 names, \ |
| 76 num_names); \ |
40 } \ | 77 } \ |
41 | 78 |
42 namespace o3d { | 79 namespace o3d { |
43 namespace gpu_plugin { | 80 namespace gpu_plugin { |
44 | 81 |
45 class BaseNPDispatcher { | 82 class BaseNPDispatcher { |
46 public: | 83 public: |
47 explicit BaseNPDispatcher(BaseNPDispatcher* next, const NPUTF8* name) | 84 BaseNPDispatcher(BaseNPDispatcher* next, const NPUTF8* name); |
48 : next_(next) { | |
49 // Convert first character to lower case if it is the ASCII range. | |
50 // TODO(apatrick): do this correctly for non-ASCII characters. | |
51 std::string java_script_style_name(name); | |
52 if (isupper(java_script_style_name[0])) { | |
53 java_script_style_name[0] = tolower(java_script_style_name[0]); | |
54 } | |
55 | 85 |
56 name_ = NPBrowser::get()->GetStringIdentifier( | 86 virtual ~BaseNPDispatcher(); |
57 java_script_style_name.c_str()); | |
58 } | |
59 | |
60 virtual ~BaseNPDispatcher() { | |
61 } | |
62 | 87 |
63 BaseNPDispatcher* next() const { | 88 BaseNPDispatcher* next() const { |
64 return next_; | 89 return next_; |
65 } | 90 } |
66 | 91 |
67 NPIdentifier name() const { | 92 NPIdentifier name() const { |
68 return name_; | 93 return name_; |
69 } | 94 } |
70 | 95 |
71 virtual int num_args() const = 0; | 96 virtual int num_args() const = 0; |
72 | 97 |
73 virtual bool Invoke(NPObject* object, | 98 virtual bool Invoke(NPObject* object, |
74 const NPVariant* args, | 99 const NPVariant* args, |
75 uint32_t num_args, | 100 uint32_t num_args, |
76 NPVariant* result) = 0; | 101 NPVariant* result) = 0; |
77 | 102 |
78 private: | 103 private: |
79 BaseNPDispatcher* next_; | 104 BaseNPDispatcher* next_; |
80 NPIdentifier name_; | 105 NPIdentifier name_; |
81 DISALLOW_COPY_AND_ASSIGN(BaseNPDispatcher); | 106 DISALLOW_COPY_AND_ASSIGN(BaseNPDispatcher); |
82 }; | 107 }; |
83 | 108 |
| 109 bool DispatcherHasMethodHelper(BaseNPDispatcher* chain, |
| 110 NPObject* object, |
| 111 NPIdentifier name); |
| 112 |
| 113 bool DispatcherInvokeHelper(BaseNPDispatcher* chain, |
| 114 NPObject* object, |
| 115 NPIdentifier name, |
| 116 const NPVariant* args, |
| 117 uint32_t num_args, |
| 118 NPVariant* result); |
| 119 |
| 120 bool DispatcherEnumerateHelper(BaseNPDispatcher* chain, |
| 121 NPObject* object, |
| 122 NPIdentifier** names, |
| 123 uint32_t* num_names); |
| 124 |
84 // This class should never be instantiated. It is always specialized. Attempting | 125 // This class should never be instantiated. It is always specialized. Attempting |
85 // to instantiate it results in a compilation error. This might mean an | 126 // to instantiate it results in a compilation error. This might mean an |
86 // attempt to instantiate a dispatcher with more parameters than have been | 127 // attempt to instantiate a dispatcher with more parameters than have been |
87 // specialized for. See the specialization code below. | 128 // specialized for. See the specialization code below. |
88 template <typename NPObjectType, typename FunctionType> | 129 template <typename NPObjectType, typename FunctionType> |
89 struct NPDispatcher { | 130 struct NPDispatcher { |
90 }; | 131 }; |
91 | 132 |
92 #define TO_NPVARIANT(index) \ | 133 #define TO_NPVARIANT(index) \ |
93 T##index n##index; \ | 134 T##index n##index; \ |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 | 216 |
176 #include "o3d/gpu_plugin/np_utils/np_dispatcher_specializations.h" // NOLINT | 217 #include "o3d/gpu_plugin/np_utils/np_dispatcher_specializations.h" // NOLINT |
177 | 218 |
178 | 219 |
179 #undef TO_NPVARIANT | 220 #undef TO_NPVARIANT |
180 | 221 |
181 } // namespace gpu_plugin | 222 } // namespace gpu_plugin |
182 } // namespace o3d | 223 } // namespace o3d |
183 | 224 |
184 #endif // O3D_GPU_PLUGIN_NP_UTILS_NP_DISPATCHER_H_ | 225 #endif // O3D_GPU_PLUGIN_NP_UTILS_NP_DISPATCHER_H_ |
OLD | NEW |