michael@0: /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: * vim: sw=2 ts=2 et : michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "PluginScriptableObjectUtils.h" michael@0: michael@0: namespace { michael@0: michael@0: template michael@0: class VariantTraits; michael@0: michael@0: template<> michael@0: class VariantTraits michael@0: { michael@0: public: michael@0: typedef mozilla::plugins::PluginScriptableObjectParent ScriptableObjectType; michael@0: }; michael@0: michael@0: template<> michael@0: class VariantTraits michael@0: { michael@0: public: michael@0: typedef mozilla::plugins::PluginScriptableObjectChild ScriptableObjectType; michael@0: }; michael@0: michael@0: } /* anonymous namespace */ michael@0: michael@0: inline bool michael@0: mozilla::plugins::ConvertToVariant(const Variant& aRemoteVariant, michael@0: NPVariant& aVariant, michael@0: PluginInstanceParent* aInstance) michael@0: { michael@0: switch (aRemoteVariant.type()) { michael@0: case Variant::Tvoid_t: { michael@0: VOID_TO_NPVARIANT(aVariant); michael@0: break; michael@0: } michael@0: michael@0: case Variant::Tnull_t: { michael@0: NULL_TO_NPVARIANT(aVariant); michael@0: break; michael@0: } michael@0: michael@0: case Variant::Tbool: { michael@0: BOOLEAN_TO_NPVARIANT(aRemoteVariant.get_bool(), aVariant); michael@0: break; michael@0: } michael@0: michael@0: case Variant::Tint: { michael@0: INT32_TO_NPVARIANT(aRemoteVariant.get_int(), aVariant); michael@0: break; michael@0: } michael@0: michael@0: case Variant::Tdouble: { michael@0: DOUBLE_TO_NPVARIANT(aRemoteVariant.get_double(), aVariant); michael@0: break; michael@0: } michael@0: michael@0: case Variant::TnsCString: { michael@0: const nsCString& string = aRemoteVariant.get_nsCString(); michael@0: NPUTF8* buffer = reinterpret_cast(strdup(string.get())); michael@0: if (!buffer) { michael@0: NS_ERROR("Out of memory!"); michael@0: return false; michael@0: } michael@0: STRINGN_TO_NPVARIANT(buffer, string.Length(), aVariant); michael@0: break; michael@0: } michael@0: michael@0: case Variant::TPPluginScriptableObjectParent: { michael@0: NS_ASSERTION(aInstance, "Must have an instance!"); michael@0: NPObject* object = NPObjectFromVariant(aRemoteVariant); michael@0: if (!object) { michael@0: NS_ERROR("Er, this shouldn't fail!"); michael@0: return false; michael@0: } michael@0: michael@0: const NPNetscapeFuncs* npn = GetNetscapeFuncs(aInstance); michael@0: if (!npn) { michael@0: NS_ERROR("Null netscape funcs!"); michael@0: return false; michael@0: } michael@0: michael@0: npn->retainobject(object); michael@0: OBJECT_TO_NPVARIANT(object, aVariant); michael@0: break; michael@0: } michael@0: michael@0: case Variant::TPPluginScriptableObjectChild: { michael@0: NS_ASSERTION(!aInstance, "No instance should be given!"); michael@0: NS_ASSERTION(PluginModuleChild::current(), michael@0: "Should be running on child only!"); michael@0: michael@0: NPObject* object = NPObjectFromVariant(aRemoteVariant); michael@0: NS_ASSERTION(object, "Null object?!"); michael@0: michael@0: PluginModuleChild::sBrowserFuncs.retainobject(object); michael@0: OBJECT_TO_NPVARIANT(object, aVariant); michael@0: break; michael@0: } michael@0: michael@0: default: michael@0: NS_NOTREACHED("Shouldn't get here!"); michael@0: return false; michael@0: } michael@0: michael@0: return true; michael@0: } michael@0: michael@0: template michael@0: bool michael@0: mozilla::plugins::ConvertToRemoteVariant(const NPVariant& aVariant, michael@0: Variant& aRemoteVariant, michael@0: InstanceType* aInstance, michael@0: bool aProtectActors) michael@0: { michael@0: if (NPVARIANT_IS_VOID(aVariant)) { michael@0: aRemoteVariant = mozilla::void_t(); michael@0: } michael@0: else if (NPVARIANT_IS_NULL(aVariant)) { michael@0: aRemoteVariant = mozilla::null_t(); michael@0: } michael@0: else if (NPVARIANT_IS_BOOLEAN(aVariant)) { michael@0: aRemoteVariant = NPVARIANT_TO_BOOLEAN(aVariant); michael@0: } michael@0: else if (NPVARIANT_IS_INT32(aVariant)) { michael@0: aRemoteVariant = NPVARIANT_TO_INT32(aVariant); michael@0: } michael@0: else if (NPVARIANT_IS_DOUBLE(aVariant)) { michael@0: aRemoteVariant = NPVARIANT_TO_DOUBLE(aVariant); michael@0: } michael@0: else if (NPVARIANT_IS_STRING(aVariant)) { michael@0: NPString str = NPVARIANT_TO_STRING(aVariant); michael@0: nsCString string(str.UTF8Characters, str.UTF8Length); michael@0: aRemoteVariant = string; michael@0: } michael@0: else if (NPVARIANT_IS_OBJECT(aVariant)) { michael@0: NPObject* object = NPVARIANT_TO_OBJECT(aVariant); michael@0: michael@0: typename VariantTraits::ScriptableObjectType* actor = michael@0: aInstance->GetActorForNPObject(object); michael@0: michael@0: if (!actor) { michael@0: NS_ERROR("Null actor!"); michael@0: return false; michael@0: } michael@0: michael@0: if (aProtectActors) { michael@0: actor->Protect(); michael@0: } michael@0: michael@0: aRemoteVariant = actor; michael@0: } michael@0: else { michael@0: NS_NOTREACHED("Shouldn't get here!"); michael@0: return false; michael@0: } michael@0: michael@0: return true; michael@0: }