Pepper_47_C++_interfaces
var_private.h
Go to the documentation of this file.
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
3 // found in the LICENSE file.
4 
5 #ifndef PPAPI_CPP_PRIVATE_VAR_PRIVATE_H_
6 #define PPAPI_CPP_PRIVATE_VAR_PRIVATE_H_
7 
8 #include "ppapi/cpp/var.h"
9 
10 namespace pp {
11 
12 class InstanceHandle;
13 
14 namespace deprecated {
15 class ScriptableObject;
16 }
17 
18 // VarPrivate is a version of Var that exposes the private scripting API.
19 // It's designed to be mostly interchangeable with Var since most callers will
20 // be dealing with Vars from various places.
21 class VarPrivate : public Var {
22  public:
23  VarPrivate() : Var() {}
25  VarPrivate(bool b) : Var(b) {}
26  VarPrivate(int32_t i) : Var(i) {}
27  VarPrivate(double d) : Var(d) {}
28  VarPrivate(const char* utf8_str) : Var(utf8_str) {}
29  VarPrivate(const std::string& utf8_str) : Var(utf8_str) {}
30  VarPrivate(PassRef, PP_Var var) : Var(PassRef(), var) {}
32  VarPrivate(const InstanceHandle& instance,
34  VarPrivate(const Var& other) : Var(other) {}
35 
36  virtual ~VarPrivate() {}
37 
38  // This assumes the object is of type object. If it's not, it will assert in
39  // debug mode. If it is not an object or not a ScriptableObject type, returns
40  // NULL.
42 
43  bool HasProperty(const Var& name, Var* exception = NULL) const;
44  bool HasMethod(const Var& name, Var* exception = NULL) const;
45  VarPrivate GetProperty(const Var& name, Var* exception = NULL) const;
46  void GetAllPropertyNames(std::vector<Var>* properties,
47  Var* exception = NULL) const;
48  void SetProperty(const Var& name, const Var& value, Var* exception = NULL);
49  void RemoveProperty(const Var& name, Var* exception = NULL);
50  VarPrivate Call(const Var& method_name, uint32_t argc, Var* argv,
51  Var* exception = NULL);
52  VarPrivate Construct(uint32_t argc, Var* argv, Var* exception = NULL) const;
53 
54  // Convenience functions for calling functions with small # of args.
55  VarPrivate Call(const Var& method_name, Var* exception = NULL);
56  VarPrivate Call(const Var& method_name, const Var& arg1,
57  Var* exception = NULL);
58  VarPrivate Call(const Var& method_name, const Var& arg1, const Var& arg2,
59  Var* exception = NULL);
60  VarPrivate Call(const Var& method_name, const Var& arg1, const Var& arg2,
61  const Var& arg3, Var* exception = NULL);
62  VarPrivate Call(const Var& method_name, const Var& arg1, const Var& arg2,
63  const Var& arg3, const Var& arg4, Var* exception = NULL);
64 
65  // For use when calling the raw C PPAPI when using the C++ Var as a possibly
66  // NULL exception. This will handle getting the address of the internal value
67  // out if it's non-NULL and fixing up the reference count.
68  //
69  // Danger: this will only work for things with exception semantics, i.e. that
70  // the value will not be changed if it's a non-undefined exception. Otherwise,
71  // this class will mess up the refcounting.
72  //
73  // This is a bit subtle:
74  // - If NULL is passed, we return NULL from get() and do nothing.
75  //
76  // - If a undefined value is passed, we return the address of a undefined var
77  // from get and have the output value take ownership of that var.
78  //
79  // - If a non-undefined value is passed, we return the address of that var
80  // from get, and nothing else should change.
81  //
82  // Example:
83  // void FooBar(a, b, Var* exception = NULL) {
84  // foo_interface->Bar(a, b, VarPrivate::OutException(exception).get());
85  // }
86  class OutException {
87  public:
89  : output_(v),
90  originally_had_exception_(v && !v->is_undefined()) {
91  if (output_) {
92  temp_ = output_->pp_var();
93  } else {
94  temp_.padding = 0;
95  temp_.type = PP_VARTYPE_UNDEFINED;
96  }
97  }
99  if (output_ && !originally_had_exception_)
100  *output_ = Var(PassRef(), temp_);
101  }
102 
103  PP_Var* get() {
104  if (output_)
105  return &temp_;
106  return NULL;
107  }
108 
109  private:
110  Var* output_;
111  bool originally_had_exception_;
112  PP_Var temp_;
113  };
114 
115  private:
116  // Prevent an arbitrary pointer argument from being implicitly converted to
117  // a bool at Var construction. If somebody makes such a mistake, (s)he will
118  // get a compilation error.
119  VarPrivate(void* non_scriptable_object_pointer);
120 };
121 
122 } // namespace pp
123 
124 #endif // PPAPI_CPP_PRIVATE_VAR_PRIVATE_H_
VarPrivate GetProperty(const Var &name, Var *exception=NULL) const
Definition: var_private.cc:66
VarPrivate(const char *utf8_str)
Definition: var_private.h:28
VarPrivate(bool b)
Definition: var_private.h:25
void RemoveProperty(const Var &name, Var *exception=NULL)
Definition: var_private.cc:101
VarPrivate(const Var &other)
Definition: var_private.h:34
VarPrivate(double d)
Definition: var_private.h:27
virtual ~VarPrivate()
Definition: var_private.h:36
bool HasProperty(const Var &name, Var *exception=NULL) const
Definition: var_private.cc:52
Special value passed to constructor to make NULL.
Definition: var.h:24
VarPrivate(PassRef, PP_Var var)
Definition: var_private.h:30
VarPrivate(Null)
Definition: var_private.h:24
deprecated::ScriptableObject * AsScriptableObject() const
Definition: var_private.cc:39
void SetProperty(const Var &name, const Var &value, Var *exception=NULL)
Definition: var_private.cc:93
bool HasMethod(const Var &name, Var *exception=NULL) const
Definition: var_private.cc:59
bool is_undefined() const
Definition: var.h:108
const PP_Var & pp_var() const
Definition: var.h:226
Var()
Definition: var.cc:94
PassRef
Definition: pass_ref.h:17
VarPrivate Construct(uint32_t argc, Var *argv, Var *exception=NULL) const
Definition: var_private.cc:128
VarPrivate(int32_t i)
Definition: var_private.h:26
VarPrivate Call(const Var &method_name, uint32_t argc, Var *argv, Var *exception=NULL)
Definition: var_private.cc:108
VarPrivate(DontManage, PP_Var var)
Definition: var_private.h:31
A generic type used for passing data types between the module and the page.
Definition: var.h:21
VarPrivate(const std::string &utf8_str)
Definition: var_private.h:29
void GetAllPropertyNames(std::vector< Var > *properties, Var *exception=NULL) const
Definition: var_private.cc:73