open_toontown_panda3d/direct/src/plugin_npapi/ppToplevelObject.cxx

277 lines
9.5 KiB
C++

// Filename: ppToplevelObject.cxx
// Created by: drose (21Aug09)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) Carnegie Mellon University. All rights reserved.
//
// All use of this software is subject to the terms of the revised BSD
// license. You should have received a copy of this license along
// with this source code in a file named "LICENSE."
//
////////////////////////////////////////////////////////////////////
#include "ppToplevelObject.h"
NPClass PPToplevelObject::_object_class = {
NP_CLASS_STRUCT_VERSION,
&PPToplevelObject::NPAllocate,
&PPToplevelObject::NPDeallocate,
&PPToplevelObject::NPInvalidate,
&PPToplevelObject::NPHasMethod,
&PPToplevelObject::NPInvoke,
&PPToplevelObject::NPInvokeDefault,
&PPToplevelObject::NPHasProperty,
&PPToplevelObject::NPGetProperty,
&PPToplevelObject::NPSetProperty,
&PPToplevelObject::NPRemoveProperty,
#if defined(NP_CLASS_STRUCT_VERSION_ENUM) && NP_CLASS_STRUCT_VERSION >= NP_CLASS_STRUCT_VERSION_ENUM
&PPToplevelObject::NPEnumerate,
#endif
#if defined(NP_CLASS_STRUCT_VERSION_CTOR) && NP_CLASS_STRUCT_VERSION >= NP_CLASS_STRUCT_VERSION_CTOR
&PPToplevelObject::NPConstruct,
#endif
};
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::make_new
// Access: Public, Static
// Description: Use this call to construct a new PPToplevelObject.
////////////////////////////////////////////////////////////////////
PPToplevelObject *PPToplevelObject::
make_new(PPInstance *inst) {
NPObject *npobj =
browser->createobject(inst->get_npp_instance(), &_object_class);
PPToplevelObject *ppobj = (PPToplevelObject *)npobj;
ppobj->construct(inst);
return ppobj;
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::set_main
// Access: Public
// Description: Changes the "main" object this PPToplevelObject maps
// to. The new object's reference count is incremented,
// and the previous object's is decremented.
////////////////////////////////////////////////////////////////////
void PPToplevelObject::
set_main(P3D_object *p3d_object) {
if (p3d_object != NULL) {
P3D_OBJECT_INCREF(p3d_object);
}
P3D_OBJECT_XDECREF(_main);
_main = p3d_object;
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::construct
// Access: Private
// Description: Stands in for the C++ constructor. We can't have a
// true constructor because of the C-style interface in
// NPN_CreateObject(). This must be called explicitly
// following NPN_CreateObject().
////////////////////////////////////////////////////////////////////
void PPToplevelObject::
construct(PPInstance *inst) {
_instance = inst;
_main = NULL;
// Get our one property name as an identifier, so we can look for
// it.
_main_id = browser->getstringidentifier("main");
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::invalidate
// Access: Private
// Description: This "destructor" is called by NPInvalidate().
////////////////////////////////////////////////////////////////////
void PPToplevelObject::
invalidate() {
_instance = NULL;
set_main(NULL);
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::has_property
// Access: Private
// Description: Returns true if the object has the named property,
// false otherwise.
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
has_property(NPIdentifier name) {
if (_main == NULL) {
// Not powered up yet.
return false;
}
if (name == _main_id) {
return true;
}
return false;
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::get_property
// Access: Private
// Description: Retrieves the named property value from the object
// and stores it in result. Returns true on success,
// false on failure.
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
get_property(NPIdentifier name, NPVariant *result) {
if (_main == NULL) {
// Not powered up yet.
return false;
}
if (name == _main_id) {
_instance->p3dobj_to_variant(result, _main);
return true;
}
return false;
}
// The remaining function bodies are the C-style function wrappers
// that are called directly by NPAPI, and which redirect into the
// above C++-style methods.
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPAllocate
// Access: Private, Static
// Description: Called by NPN_CreateObject() to allocate space for
// this object.
////////////////////////////////////////////////////////////////////
NPObject *PPToplevelObject::
NPAllocate(NPP npp, NPClass *aClass) {
assert(aClass == &_object_class);
return (PPToplevelObject *)malloc(sizeof(PPToplevelObject));
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::Deallocate
// Access: Private, Static
// Description: Called to delete the space allocated by NPAllocate,
// above.
////////////////////////////////////////////////////////////////////
void PPToplevelObject::
NPDeallocate(NPObject *npobj) {
((PPToplevelObject *)npobj)->invalidate();
free(npobj);
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::Deallocate
// Access: Private, Static
// Description: Called to destruct the object.
////////////////////////////////////////////////////////////////////
void PPToplevelObject::
NPInvalidate(NPObject *npobj) {
// It turns out that this method isn't actually called by Safari's
// implementation of NPAPI, so we'll move the actual destructor call
// into NPDeallocate, above.
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPHasMethod
// Access: Private, Static
// Description:
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
NPHasMethod(NPObject *npobj, NPIdentifier name) {
return false;
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPInvoke
// Access: Private, Static
// Description:
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
NPInvoke(NPObject *npobj, NPIdentifier name,
const NPVariant *args, uint32_t argCount,
NPVariant *result) {
return false;
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPInvokeDefault
// Access: Private, Static
// Description:
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
NPInvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount,
NPVariant *result) {
return false;
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPHasProperty
// Access: Private, Static
// Description:
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
NPHasProperty(NPObject *npobj, NPIdentifier name) {
return ((PPToplevelObject *)npobj)->has_property(name);
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPGetProperty
// Access: Private, Static
// Description:
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
NPGetProperty(NPObject *npobj, NPIdentifier name, NPVariant *result) {
return ((PPToplevelObject *)npobj)->get_property(name, result);
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPSetProperty
// Access: Private, Static
// Description:
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
NPSetProperty(NPObject *npobj, NPIdentifier name, const NPVariant *value) {
return false;
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPRemoveProperty
// Access: Private, Static
// Description:
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
NPRemoveProperty(NPObject *npobj, NPIdentifier name) {
return false;
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPEnumerate
// Access: Private, Static
// Description:
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
NPEnumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) {
return false;
}
////////////////////////////////////////////////////////////////////
// Function: PPToplevelObject::NPConstruct
// Access: Private, Static
// Description:
////////////////////////////////////////////////////////////////////
bool PPToplevelObject::
NPConstruct(NPObject *npobj, const NPVariant *args,
uint32_t argCount, NPVariant *result) {
// Not implemented. We don't use this constructor mechanism because
// it wasn't supported on earlier versions of Gecko. Instead, we
// use make_new() to construct PPToplevelObjects via an explicit call to
// construct().
return true;
}