blob: 5c7e3b7921a33b9b5dfd1ab649d63ec29c5cd650 [file] [log] [blame]
// Copyright (c) 2006-2008 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 GPU_NP_UTILS_NP_UTILS_H_
#define GPU_NP_UTILS_NP_UTILS_H_
#include <string>
#include "gpu/np_utils/np_browser.h"
#include "gpu/np_utils/np_class.h"
#include "gpu/np_utils/np_object_pointer.h"
#include "gpu/np_utils/np_headers.h"
namespace np_utils {
// Convert NPVariant to C++ type. Returns whether the conversion was successful.
bool NPVariantToValue(bool* value, const NPVariant& variant);
bool NPVariantToValue(int32* value, const NPVariant& variant);
bool NPVariantToValue(float* value, const NPVariant& variant);
bool NPVariantToValue(double* value, const NPVariant& variant);
bool NPVariantToValue(std::string* value, const NPVariant& variant);
template <typename T>
bool NPVariantToValue(NPObjectPointer<T>* value,
const NPVariant& variant) {
if (NPVARIANT_IS_NULL(variant)) {
*value = NPObjectPointer<T>();
return true;
} else if (NPVARIANT_IS_OBJECT(variant)) {
NPObject* object = NPVARIANT_TO_OBJECT(variant);
if (object->_class == NPGetClass<T>()) {
*value = NPObjectPointer<T>(static_cast<T*>(
NPVARIANT_TO_OBJECT(variant)));
return true;
}
}
return false;
}
// Specialization for NPObject does not check for mismatched NPClass.
template <>
inline bool NPVariantToValue(NPObjectPointer<NPObject>* value,
const NPVariant& variant) {
if (NPVARIANT_IS_NULL(variant)) {
*value = NPObjectPointer<NPObject>();
return true;
} else if (NPVARIANT_IS_OBJECT(variant)) {
*value = NPObjectPointer<NPObject>(NPVARIANT_TO_OBJECT(variant));
return true;
}
return false;
}
// Convert C++ type to NPVariant.
void ValueToNPVariant(bool value, NPVariant* variant);
void ValueToNPVariant(int32 value, NPVariant* variant);
void ValueToNPVariant(float value, NPVariant* variant);
void ValueToNPVariant(double value, NPVariant* variant);
void ValueToNPVariant(const std::string& value, NPVariant* variant);
template <typename T>
void ValueToNPVariant(const NPObjectPointer<T>& value,
NPVariant* variant) {
if (value.Get()) {
NPBrowser::get()->RetainObject(value.Get());
OBJECT_TO_NPVARIANT(value.Get(), *variant);
} else {
NULL_TO_NPVARIANT(*variant);
}
}
// NPVariant that automatically manages lifetime of string and object variants.
class SmartNPVariant : public NPVariant {
public:
SmartNPVariant();
SmartNPVariant(const SmartNPVariant& rhs);
explicit SmartNPVariant(const NPVariant& rhs);
template <typename T>
explicit SmartNPVariant(const T& v) {
ValueToNPVariant(v, this);
}
~SmartNPVariant();
SmartNPVariant& operator=(const SmartNPVariant& rhs);
SmartNPVariant& operator=(const NPVariant& rhs);
template <typename T>
bool GetValue(T* v) const {
return NPVariantToValue(v, *this);
}
bool IsVoid() const;
template <typename T>
void SetValue(const T& v) {
Release();
ValueToNPVariant(v, this);
}
void CopyTo(NPVariant* target) const;
// Sets the variant to void.
void Release();
// Called when an NPObject is invalidated to clear any references to other
// NPObjects. Does not release the object as it might no longer be valid.
void Invalidate();
};
// These allow a method to be invoked with automatic conversion of C++
// types to variants for arguments and return values.
bool NPHasMethod(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name);
inline bool NPInvokeVoid(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name) {
SmartNPVariant result;
return NPBrowser::get()->Invoke(
npp,
object.Get(),
NPBrowser::get()->GetStringIdentifier(name),
NULL, 0,
&result);
}
template<typename R>
bool NPInvoke(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name,
R* r) {
SmartNPVariant result;
if (NPBrowser::get()->Invoke(
npp,
object.Get(),
NPBrowser::get()->GetStringIdentifier(name),
NULL, 0,
&result)) {
return result.GetValue(r);
}
return false;
}
template<typename P0>
bool NPInvokeVoid(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name,
P0 p0) {
SmartNPVariant args[1];
args[0].SetValue(p0);
SmartNPVariant result;
return NPBrowser::get()->Invoke(
npp,
object.Get(),
NPBrowser::get()->GetStringIdentifier(name),
&args[0], 1,
&result);
}
template<typename R, typename P0>
bool NPInvoke(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name,
P0 p0,
R* r) {
SmartNPVariant args[1];
args[0].SetValue(p0);
SmartNPVariant result;
if (NPBrowser::get()->Invoke(
npp,
object.Get(),
NPBrowser::get()->GetStringIdentifier(name),
&args[0], 1,
&result)) {
return result.GetValue(r);
}
return false;
}
template<typename P0, typename P1>
bool NPInvokeVoid(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name,
P0 p0, P1 p1) {
SmartNPVariant args[2];
args[0].SetValue(p0);
args[1].SetValue(p1);
SmartNPVariant result;
return NPBrowser::get()->Invoke(
npp,
object.Get(),
NPBrowser::get()->GetStringIdentifier(name),
&args[0], 2,
&result);
}
template<typename R, typename P0, typename P1>
bool NPInvoke(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name,
P0 p0, P1 p1,
R* r) {
SmartNPVariant args[2];
args[0].SetValue(p0);
args[1].SetValue(p1);
SmartNPVariant result;
if (NPBrowser::get()->Invoke(
npp,
object.Get(),
NPBrowser::get()->GetStringIdentifier(name),
&args[0], 2,
&result)) {
return result.GetValue(r);
}
return false;
}
bool NPHasProperty(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name);
template <typename T>
bool NPGetProperty(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name,
T* value) {
SmartNPVariant result;
if (NPBrowser::get()->GetProperty(npp,
object.Get(),
NPBrowser::get()->GetStringIdentifier(name),
&result)) {
return result.GetValue(value);
}
return false;
}
template <typename T>
bool NPSetProperty(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name,
const T& value) {
SmartNPVariant variant(value);
return NPBrowser::get()->SetProperty(
npp,
object.Get(),
NPBrowser::get()->GetStringIdentifier(name),
&variant);
}
bool NPRemoveProperty(NPP npp,
const NPObjectPointer<NPObject>& object,
const NPUTF8* name);
template <typename NPObjectType>
NPObjectPointer<NPObjectType> NPCreateObject(NPP npp) {
const NPClass* np_class = NPGetClass<NPObjectType>();
NPObjectType* object = static_cast<NPObjectType*>(
NPBrowser::get()->CreateObject(npp, np_class));
return NPObjectPointer<NPObjectType>::FromReturned(object);
}
} // namespace np_utils
#endif // GPU_NP_UTILS_NP_UTILS_H_