Index: o3d/gpu_plugin/np_utils/np_dispatcher.h |
=================================================================== |
--- o3d/gpu_plugin/np_utils/np_dispatcher.h (revision 25135) |
+++ o3d/gpu_plugin/np_utils/np_dispatcher.h (working copy) |
@@ -11,17 +11,38 @@ |
#include "third_party/npapi/bindings/npapi.h" |
#include "third_party/npapi/bindings/npruntime.h" |
-// These macros are used to make dispatcher chains. See the comment for the |
-// DispatchedNPObject class. |
+// Dispatchers make regular member functions available as NPObject methods. |
+// Usage: |
+// |
+// class MyNPObject : public DefaultNPObject<NPObject> { |
+// public: |
+// int MyMethod(bool a, float b); |
+// NP_UTILS_BEGIN_DISPATCHER_CHAIN(MyNPObject, DispatchedNPObject) |
+// NP_UTILS_DISPATCHER(MyMethod, int(bool, float)) |
+// NP_UTILS_END_DISPATCHER_CHAIN |
+// }; |
+// |
+// Multiple member functions may be listed in the dispatcher chain. Inheritance |
+// is supported. The following types are supported as return types and parameter |
+// types: |
+// * bool |
+// * int |
+// * float |
+// * double |
+// * std::string |
+// * NPObject* |
+// |
+ |
+// These macros are used to make dispatcher chains. |
#define NP_UTILS_NP_UTILS_DISPATCHER_JOIN2(a, b) a ## b |
#define NP_UTILS_DISPATCHER_JOIN(a, b) NP_UTILS_NP_UTILS_DISPATCHER_JOIN2(a, b) |
#define NP_UTILS_DISPATCHER_UNIQUE \ |
NP_UTILS_DISPATCHER_JOIN(dispatcher, __LINE__) |
#define NP_UTILS_BEGIN_DISPATCHER_CHAIN(Class, BaseClass) \ |
- static BaseNPDispatcher* GetStaticDispatcherChain() { \ |
+ static BaseNPDispatcher* GetDispatcherChain() { \ |
typedef Class ThisClass; \ |
- BaseNPDispatcher* top_dispatcher = BaseClass::GetStaticDispatcherChain(); \ |
+ BaseNPDispatcher* top_dispatcher = BaseClass::GetDispatcherChain(); \ |
#define NP_UTILS_DISPATCHER(name, Signature) \ |
static NPDispatcher<ThisClass, Signature> \ |
@@ -34,32 +55,36 @@ |
#define NP_UTILS_END_DISPATCHER_CHAIN \ |
return top_dispatcher; \ |
} \ |
- virtual BaseNPDispatcher* GetDynamicDispatcherChain() { \ |
- static BaseNPDispatcher* top_dispatcher = GetStaticDispatcherChain(); \ |
- return top_dispatcher; \ |
+ bool HasMethod(NPIdentifier name) { \ |
+ return DispatcherHasMethodHelper(GetDispatcherChain(), this, name); \ |
} \ |
+ bool Invoke(NPIdentifier name, \ |
+ const NPVariant* args, \ |
+ uint32_t num_args, \ |
+ NPVariant* result) { \ |
+ return DispatcherInvokeHelper(GetDispatcherChain(), \ |
+ this, \ |
+ name, \ |
+ args, \ |
+ num_args, \ |
+ result); \ |
+ } \ |
+ bool Enumerate(NPIdentifier** names, uint32_t* num_names) { \ |
+ return DispatcherEnumerateHelper(GetDispatcherChain(), \ |
+ this, \ |
+ names, \ |
+ num_names); \ |
+ } \ |
namespace o3d { |
namespace gpu_plugin { |
class BaseNPDispatcher { |
public: |
- explicit BaseNPDispatcher(BaseNPDispatcher* next, const NPUTF8* name) |
- : next_(next) { |
- // Convert first character to lower case if it is the ASCII range. |
- // TODO(apatrick): do this correctly for non-ASCII characters. |
- std::string java_script_style_name(name); |
- if (isupper(java_script_style_name[0])) { |
- java_script_style_name[0] = tolower(java_script_style_name[0]); |
- } |
+ BaseNPDispatcher(BaseNPDispatcher* next, const NPUTF8* name); |
- name_ = NPBrowser::get()->GetStringIdentifier( |
- java_script_style_name.c_str()); |
- } |
+ virtual ~BaseNPDispatcher(); |
- virtual ~BaseNPDispatcher() { |
- } |
- |
BaseNPDispatcher* next() const { |
return next_; |
} |
@@ -81,6 +106,22 @@ |
DISALLOW_COPY_AND_ASSIGN(BaseNPDispatcher); |
}; |
+bool DispatcherHasMethodHelper(BaseNPDispatcher* chain, |
+ NPObject* object, |
+ NPIdentifier name); |
+ |
+bool DispatcherInvokeHelper(BaseNPDispatcher* chain, |
+ NPObject* object, |
+ NPIdentifier name, |
+ const NPVariant* args, |
+ uint32_t num_args, |
+ NPVariant* result); |
+ |
+bool DispatcherEnumerateHelper(BaseNPDispatcher* chain, |
+ NPObject* object, |
+ NPIdentifier** names, |
+ uint32_t* num_names); |
+ |
// This class should never be instantiated. It is always specialized. Attempting |
// to instantiate it results in a compilation error. This might mean an |
// attempt to instantiate a dispatcher with more parameters than have been |