// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef PPAPI_CPP_PRIVATE_VAR_PRIVATE_H_ #define PPAPI_CPP_PRIVATE_VAR_PRIVATE_H_ #include "ppapi/cpp/var.h" namespace pp { class InstanceHandle; namespace deprecated { class ScriptableObject; } // VarPrivate is a version of Var that exposes the private scripting API. // It's designed to be mostly interchangeable with Var since most callers will // be dealing with Vars from various places. class VarPrivate : public Var { public: VarPrivate() : Var() {} VarPrivate(Null) : Var(Null()) {} VarPrivate(bool b) : Var(b) {} VarPrivate(int32_t i) : Var(i) {} VarPrivate(double d) : Var(d) {} VarPrivate(const char* utf8_str) : Var(utf8_str) {} VarPrivate(const std::string& utf8_str) : Var(utf8_str) {} VarPrivate(PassRef, PP_Var var) : Var(PassRef(), var) {} VarPrivate(DontManage, PP_Var var) : Var(DontManage(), var) {} VarPrivate(const InstanceHandle& instance, deprecated::ScriptableObject* object); VarPrivate(const Var& other) : Var(other) {} virtual ~VarPrivate() {} // This assumes the object is of type object. If it's not, it will assert in // debug mode. If it is not an object or not a ScriptableObject type, returns // NULL. deprecated::ScriptableObject* AsScriptableObject() const; bool HasProperty(const Var& name, Var* exception = NULL) const; bool HasMethod(const Var& name, Var* exception = NULL) const; VarPrivate GetProperty(const Var& name, Var* exception = NULL) const; void GetAllPropertyNames(std::vector<Var>* properties, Var* exception = NULL) const; void SetProperty(const Var& name, const Var& value, Var* exception = NULL); void RemoveProperty(const Var& name, Var* exception = NULL); VarPrivate Call(const Var& method_name, uint32_t argc, Var* argv, Var* exception = NULL); VarPrivate Construct(uint32_t argc, Var* argv, Var* exception = NULL) const; // Convenience functions for calling functions with small # of args. VarPrivate Call(const Var& method_name, Var* exception = NULL); VarPrivate Call(const Var& method_name, const Var& arg1, Var* exception = NULL); VarPrivate Call(const Var& method_name, const Var& arg1, const Var& arg2, Var* exception = NULL); VarPrivate Call(const Var& method_name, const Var& arg1, const Var& arg2, const Var& arg3, Var* exception = NULL); VarPrivate Call(const Var& method_name, const Var& arg1, const Var& arg2, const Var& arg3, const Var& arg4, Var* exception = NULL); // For use when calling the raw C PPAPI when using the C++ Var as a possibly // NULL exception. This will handle getting the address of the internal value // out if it's non-NULL and fixing up the reference count. // // Danger: this will only work for things with exception semantics, i.e. that // the value will not be changed if it's a non-undefined exception. Otherwise, // this class will mess up the refcounting. // // This is a bit subtle: // - If NULL is passed, we return NULL from get() and do nothing. // // - If a undefined value is passed, we return the address of a undefined var // from get and have the output value take ownership of that var. // // - If a non-undefined value is passed, we return the address of that var // from get, and nothing else should change. // // Example: // void FooBar(a, b, Var* exception = NULL) { // foo_interface->Bar(a, b, VarPrivate::OutException(exception).get()); // } class OutException { public: OutException(Var* v) : output_(v), originally_had_exception_(v && !v->is_undefined()) { if (output_) { temp_ = output_->pp_var(); } else { temp_.padding = 0; temp_.type = PP_VARTYPE_UNDEFINED; } } ~OutException() { if (output_ && !originally_had_exception_) *output_ = Var(PassRef(), temp_); } PP_Var* get() { if (output_) return &temp_; return NULL; } private: Var* output_; bool originally_had_exception_; PP_Var temp_; }; private: // Prevent an arbitrary pointer argument from being implicitly converted to // a bool at Var construction. If somebody makes such a mistake, (s)he will // get a compilation error. VarPrivate(void* non_scriptable_object_pointer); }; } // namespace pp #endif // PPAPI_CPP_PRIVATE_VAR_PRIVATE_H_