mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
little refinements
This commit is contained in:
parent
2e9355b9bf
commit
63160f0c1f
@ -17,6 +17,7 @@
|
|||||||
p3d_plugin_common.h \
|
p3d_plugin_common.h \
|
||||||
p3dDownload.h p3dDownload.I \
|
p3dDownload.h p3dDownload.I \
|
||||||
p3dFileDownload.h p3dFileDownload.I \
|
p3dFileDownload.h p3dFileDownload.I \
|
||||||
|
p3dFileParams.h p3dFileParams.I \
|
||||||
p3dInstance.h p3dInstance.I \
|
p3dInstance.h p3dInstance.I \
|
||||||
p3dInstanceManager.h p3dInstanceManager.I \
|
p3dInstanceManager.h p3dInstanceManager.I \
|
||||||
p3dMultifileReader.h p3dMultifileReader.I \
|
p3dMultifileReader.h p3dMultifileReader.I \
|
||||||
@ -30,6 +31,7 @@
|
|||||||
p3d_plugin.cxx \
|
p3d_plugin.cxx \
|
||||||
p3dDownload.cxx \
|
p3dDownload.cxx \
|
||||||
p3dFileDownload.cxx \
|
p3dFileDownload.cxx \
|
||||||
|
p3dFileParams.cxx \
|
||||||
p3dInstance.cxx \
|
p3dInstance.cxx \
|
||||||
p3dInstanceManager.cxx \
|
p3dInstanceManager.cxx \
|
||||||
p3dMultifileReader.cxx \
|
p3dMultifileReader.cxx \
|
||||||
@ -67,3 +69,11 @@
|
|||||||
p3dPythonRun.cxx p3dPythonRun.h p3dPythonRun.I
|
p3dPythonRun.cxx p3dPythonRun.h p3dPythonRun.I
|
||||||
|
|
||||||
#end bin_target
|
#end bin_target
|
||||||
|
|
||||||
|
#begin static_lib_target
|
||||||
|
#define TARGET plugin_common
|
||||||
|
|
||||||
|
#define SOURCES \
|
||||||
|
load_plugin.cxx load_plugin.h
|
||||||
|
|
||||||
|
#end static_lib_target
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Filename: load_plugin_src.cxx
|
// Filename: load_plugin.cxx
|
||||||
// Created by: drose (19Jun09)
|
// Created by: drose (19Jun09)
|
||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -12,11 +12,7 @@
|
|||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "load_plugin.h"
|
||||||
// This code is used in the plugin_standalone directory, and also in
|
|
||||||
// the plugin_npapi directory. To facilitate that code re-use with
|
|
||||||
// minimal structural overhead, it is designed to be simply #included
|
|
||||||
// into the different source files.
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
@ -46,42 +42,46 @@ P3D_request_finish_func *P3D_request_finish;
|
|||||||
P3D_instance_feed_url_stream_func *P3D_instance_feed_url_stream;
|
P3D_instance_feed_url_stream_func *P3D_instance_feed_url_stream;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static HMODULE module;
|
static HMODULE module = NULL;
|
||||||
|
#else
|
||||||
|
static void *module = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static bool plugin_loaded = false;
|
||||||
|
|
||||||
|
|
||||||
static void
|
////////////////////////////////////////////////////////////////////
|
||||||
unload_plugin() {
|
// Function: get_plugin_basename
|
||||||
#ifdef _WIN32
|
// Description: Returns the default plugin filename, without any
|
||||||
FreeLibrary(module);
|
// directory path (but including the extension
|
||||||
module = NULL;
|
// appropriate to this platform).
|
||||||
#else
|
////////////////////////////////////////////////////////////////////
|
||||||
// TODO: unload_dso
|
string
|
||||||
#endif
|
get_plugin_basename() {
|
||||||
|
return default_plugin_filename + dll_ext;
|
||||||
P3D_initialize = NULL;
|
|
||||||
P3D_free_string = NULL;
|
|
||||||
P3D_create_instance = NULL;
|
|
||||||
P3D_instance_finish = NULL;
|
|
||||||
P3D_instance_has_property = NULL;
|
|
||||||
P3D_instance_get_property = NULL;
|
|
||||||
P3D_instance_set_property = NULL;
|
|
||||||
P3D_instance_get_request = NULL;
|
|
||||||
P3D_check_request = NULL;
|
|
||||||
P3D_request_finish = NULL;
|
|
||||||
P3D_instance_feed_url_stream = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: load_plugin
|
||||||
|
// Description: Loads the plugin and assigns all of the function
|
||||||
|
// pointers. Returns true on success, false on failure.
|
||||||
|
// If the filename is empty, it is searched along the
|
||||||
|
// path.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool
|
||||||
load_plugin(const string &p3d_plugin_filename) {
|
load_plugin(const string &p3d_plugin_filename) {
|
||||||
string filename = p3d_plugin_filename;
|
string filename = p3d_plugin_filename;
|
||||||
if (filename.empty()) {
|
if (filename.empty()) {
|
||||||
// Look for the plugin along the path.
|
// Look for the plugin along the path.
|
||||||
filename = default_plugin_filename + dll_ext;
|
filename = get_plugin_basename();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin_loaded) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
assert(module == NULL);
|
||||||
module = LoadLibrary(filename.c_str());
|
module = LoadLibrary(filename.c_str());
|
||||||
if (module == NULL) {
|
if (module == NULL) {
|
||||||
// Couldn't load the DLL.
|
// Couldn't load the DLL.
|
||||||
@ -104,7 +104,8 @@ load_plugin(const string &p3d_plugin_filename) {
|
|||||||
|
|
||||||
#else // _WIN32
|
#else // _WIN32
|
||||||
// Posix case.
|
// Posix case.
|
||||||
void *module = dlopen(filename.c_str(), RTLD_NOW | RTLD_LOCAL);
|
assert(module == NULL);
|
||||||
|
module = dlopen(filename.c_str(), RTLD_NOW | RTLD_LOCAL);
|
||||||
if (module == NULL) {
|
if (module == NULL) {
|
||||||
// Couldn't load the .so.
|
// Couldn't load the .so.
|
||||||
return false;
|
return false;
|
||||||
@ -143,6 +144,8 @@ load_plugin(const string &p3d_plugin_filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Successfully loaded.
|
// Successfully loaded.
|
||||||
|
plugin_loaded = true;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
string logfilename = "c:/cygwin/home/drose/t0.log";
|
string logfilename = "c:/cygwin/home/drose/t0.log";
|
||||||
#else
|
#else
|
||||||
@ -157,3 +160,50 @@ load_plugin(const string &p3d_plugin_filename) {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: unload_plugin
|
||||||
|
// Description: Removes the plugin from memory space and clears all
|
||||||
|
// of the pointers.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
unload_plugin() {
|
||||||
|
if (!plugin_loaded) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
assert(module != NULL);
|
||||||
|
FreeLibrary(module);
|
||||||
|
module = NULL;
|
||||||
|
#else
|
||||||
|
assert(module != NULL);
|
||||||
|
dlclose(module);
|
||||||
|
module = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
P3D_initialize = NULL;
|
||||||
|
P3D_free_string = NULL;
|
||||||
|
P3D_create_instance = NULL;
|
||||||
|
P3D_instance_finish = NULL;
|
||||||
|
P3D_instance_has_property = NULL;
|
||||||
|
P3D_instance_get_property = NULL;
|
||||||
|
P3D_instance_set_property = NULL;
|
||||||
|
P3D_instance_get_request = NULL;
|
||||||
|
P3D_check_request = NULL;
|
||||||
|
P3D_request_finish = NULL;
|
||||||
|
P3D_instance_feed_url_stream = NULL;
|
||||||
|
|
||||||
|
plugin_loaded = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: is_plugin_loaded
|
||||||
|
// Description: Returns true if the plugin has been loaded
|
||||||
|
// successfully by a previous call to load_plugin(),
|
||||||
|
// false otherwise.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool
|
||||||
|
is_plugin_loaded() {
|
||||||
|
return plugin_loaded;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
// Filename: load_plugin_src.h
|
// Filename: load_plugin.h
|
||||||
// Created by: drose (19Jun09)
|
// Created by: drose (19Jun09)
|
||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -12,11 +12,13 @@
|
|||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef LOAD_PLUGIN_H
|
||||||
|
#define LOAD_PLUGIN_H
|
||||||
|
|
||||||
// This code is used in the plugin_standalone directory, and also in
|
#include "p3d_plugin.h"
|
||||||
// the plugin_npapi directory. To facilitate that code re-use with
|
|
||||||
// minimal structural overhead, it is designed to be simply #included
|
#include <string>
|
||||||
// into the different source files.
|
using namespace std;
|
||||||
|
|
||||||
extern P3D_initialize_func *P3D_initialize;
|
extern P3D_initialize_func *P3D_initialize;
|
||||||
extern P3D_free_string_func *P3D_free_string;
|
extern P3D_free_string_func *P3D_free_string;
|
||||||
@ -30,3 +32,10 @@ extern P3D_instance_get_request_func *P3D_instance_get_request;
|
|||||||
extern P3D_check_request_func *P3D_check_request;
|
extern P3D_check_request_func *P3D_check_request;
|
||||||
extern P3D_request_finish_func *P3D_request_finish;
|
extern P3D_request_finish_func *P3D_request_finish;
|
||||||
extern P3D_instance_feed_url_stream_func *P3D_instance_feed_url_stream;
|
extern P3D_instance_feed_url_stream_func *P3D_instance_feed_url_stream;
|
||||||
|
|
||||||
|
string get_plugin_basename();
|
||||||
|
bool load_plugin(const string &p3d_plugin_filename);
|
||||||
|
void unload_plugin();
|
||||||
|
bool is_plugin_loaded();
|
||||||
|
|
||||||
|
#endif
|
@ -13,17 +13,6 @@
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: P3DCInstance::get_p3d_filename
|
|
||||||
// Access: Public
|
|
||||||
// Description: Returns the p3d filename that was passed to the
|
|
||||||
// constructor.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
inline const string &P3DCInstance::
|
|
||||||
get_p3d_filename() const {
|
|
||||||
return _p3d_filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: P3DCInstance::get_instance_id
|
// Function: P3DCInstance::get_instance_id
|
||||||
// Access: Public
|
// Access: Public
|
||||||
|
@ -25,28 +25,6 @@ P3DCInstance(TiXmlElement *xinstance) :
|
|||||||
_func(NULL)
|
_func(NULL)
|
||||||
{
|
{
|
||||||
xinstance->Attribute("id", &_instance_id);
|
xinstance->Attribute("id", &_instance_id);
|
||||||
|
|
||||||
const char *p3d_filename = xinstance->Attribute("p3d_filename");
|
|
||||||
if (p3d_filename != NULL) {
|
|
||||||
_p3d_filename = p3d_filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
TiXmlElement *xtoken = xinstance->FirstChildElement("token");
|
|
||||||
while (xtoken != NULL) {
|
|
||||||
Token token;
|
|
||||||
const char *keyword = xtoken->Attribute("keyword");
|
|
||||||
if (keyword != NULL) {
|
|
||||||
token._keyword = keyword;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *value = xtoken->Attribute("value");
|
|
||||||
if (value != NULL) {
|
|
||||||
token._value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
_tokens.push_back(token);
|
|
||||||
xtoken = xtoken->NextSiblingElement("token");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -57,24 +35,3 @@ P3DCInstance(TiXmlElement *xinstance) :
|
|||||||
P3DCInstance::
|
P3DCInstance::
|
||||||
~P3DCInstance() {
|
~P3DCInstance() {
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: P3DCInstance::get_py_tokens
|
|
||||||
// Access: Public
|
|
||||||
// Description: Returns a Python list object that corresponds to the
|
|
||||||
// tokens passed to this instance, expressed as a list
|
|
||||||
// of 2-tuples. New instance.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
PyObject *P3DCInstance::
|
|
||||||
get_py_tokens() const {
|
|
||||||
PyObject *list = PyList_New(_tokens.size());
|
|
||||||
|
|
||||||
for (size_t i = 0; i < _tokens.size(); ++i) {
|
|
||||||
const Token &token = _tokens[i];
|
|
||||||
PyObject *tuple = Py_BuildValue("(ss)", token._keyword.c_str(),
|
|
||||||
token._value.c_str());
|
|
||||||
PyList_SetItem(list, i, tuple);
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
@ -35,23 +35,10 @@ public:
|
|||||||
P3DCInstance(TiXmlElement *xinstance);
|
P3DCInstance(TiXmlElement *xinstance);
|
||||||
~P3DCInstance();
|
~P3DCInstance();
|
||||||
|
|
||||||
inline const string &get_p3d_filename() const;
|
|
||||||
inline int get_instance_id() const;
|
inline int get_instance_id() const;
|
||||||
|
|
||||||
PyObject *get_py_tokens() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Token {
|
|
||||||
public:
|
|
||||||
string _keyword;
|
|
||||||
string _value;
|
|
||||||
};
|
|
||||||
typedef pvector<Token> Tokens;
|
|
||||||
|
|
||||||
P3D_request_ready_func *_func;
|
P3D_request_ready_func *_func;
|
||||||
string _p3d_filename;
|
|
||||||
|
|
||||||
Tokens _tokens;
|
|
||||||
|
|
||||||
int _instance_id;
|
int _instance_id;
|
||||||
|
|
||||||
|
25
direct/src/plugin/p3dFileParams.I
Normal file
25
direct/src/plugin/p3dFileParams.I
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Filename: p3dFileParams.I
|
||||||
|
// Created by: drose (23Jun09)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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."
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: P3DFileParams::get_p3d_filename
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the p3d filename that was passed to the
|
||||||
|
// constructor.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
inline const string &P3DFileParams::
|
||||||
|
get_p3d_filename() const {
|
||||||
|
return _p3d_filename;
|
||||||
|
}
|
102
direct/src/plugin/p3dFileParams.cxx
Normal file
102
direct/src/plugin/p3dFileParams.cxx
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
// Filename: p3dFileParams.cxx
|
||||||
|
// Created by: drose (23Jun09)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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 "p3dFileParams.h"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: P3DFileParams::Default Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
P3DFileParams::
|
||||||
|
P3DFileParams() {
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: P3DFileParams::Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
P3DFileParams::
|
||||||
|
P3DFileParams(const string &p3d_filename,
|
||||||
|
const P3D_token tokens[], size_t num_tokens) :
|
||||||
|
_p3d_filename(p3d_filename)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < num_tokens; ++i) {
|
||||||
|
Token token;
|
||||||
|
if (tokens[i]._keyword != NULL) {
|
||||||
|
token._keyword = tokens[i]._keyword;
|
||||||
|
}
|
||||||
|
if (tokens[i]._value != NULL) {
|
||||||
|
token._value = tokens[i]._value;
|
||||||
|
}
|
||||||
|
_tokens.push_back(token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: P3DFileParams::Copy Assignment
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void P3DFileParams::
|
||||||
|
operator = (const P3DFileParams &other) {
|
||||||
|
_p3d_filename = other._p3d_filename;
|
||||||
|
_tokens = other._tokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: P3DFileParams::lookup_token
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the value associated with the first
|
||||||
|
// appearance of the named token, or empty string if the
|
||||||
|
// token does not appear.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
string P3DFileParams::
|
||||||
|
lookup_token(const string &keyword) const {
|
||||||
|
Tokens::const_iterator ti;
|
||||||
|
for (ti = _tokens.begin(); ti != _tokens.end(); ++ti) {
|
||||||
|
if ((*ti)._keyword == keyword) {
|
||||||
|
return (*ti)._value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return string();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: P3DFileParams::make_xml
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns a newly-allocated XML structure that
|
||||||
|
// corresponds to the file parameter data within this
|
||||||
|
// instance.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
TiXmlElement *P3DFileParams::
|
||||||
|
make_xml() {
|
||||||
|
TiXmlElement *xfparams = new TiXmlElement("fparams");
|
||||||
|
|
||||||
|
xfparams->SetAttribute("p3d_filename", _p3d_filename.c_str());
|
||||||
|
|
||||||
|
Tokens::const_iterator ti;
|
||||||
|
for (ti = _tokens.begin(); ti != _tokens.end(); ++ti) {
|
||||||
|
const Token &token = (*ti);
|
||||||
|
TiXmlElement *xtoken = new TiXmlElement("token");
|
||||||
|
xtoken->SetAttribute("keyword", token._keyword.c_str());
|
||||||
|
xtoken->SetAttribute("value", token._value.c_str());
|
||||||
|
xfparams->LinkEndChild(xtoken);
|
||||||
|
}
|
||||||
|
|
||||||
|
return xfparams;
|
||||||
|
}
|
55
direct/src/plugin/p3dFileParams.h
Normal file
55
direct/src/plugin/p3dFileParams.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// Filename: p3dFileParams.h
|
||||||
|
// Created by: drose (23Jun09)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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."
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef P3DFILEPARAMS_H
|
||||||
|
#define P3DFILEPARAMS_H
|
||||||
|
|
||||||
|
#include "p3d_plugin_common.h"
|
||||||
|
|
||||||
|
#include <tinyxml.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Class : P3DFileParams
|
||||||
|
// Description : Encapsulates the file parameters: the p3d_filename,
|
||||||
|
// and extra tokens.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
class P3DFileParams {
|
||||||
|
public:
|
||||||
|
P3DFileParams();
|
||||||
|
P3DFileParams(const string &p3d_filename,
|
||||||
|
const P3D_token tokens[], size_t num_tokens);
|
||||||
|
|
||||||
|
void operator = (const P3DFileParams &other);
|
||||||
|
|
||||||
|
inline const string &get_p3d_filename() const;
|
||||||
|
string lookup_token(const string &keyword) const;
|
||||||
|
|
||||||
|
TiXmlElement *make_xml();
|
||||||
|
|
||||||
|
private:
|
||||||
|
class Token {
|
||||||
|
public:
|
||||||
|
string _keyword;
|
||||||
|
string _value;
|
||||||
|
};
|
||||||
|
typedef vector<Token> Tokens;
|
||||||
|
|
||||||
|
string _p3d_filename;
|
||||||
|
Tokens _tokens;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "p3dFileParams.I"
|
||||||
|
|
||||||
|
#endif
|
@ -13,6 +13,16 @@
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: P3DInstance::get_fparams
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the current file parameters.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
inline const P3DFileParams &P3DInstance::
|
||||||
|
get_fparams() const {
|
||||||
|
return _fparams;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: P3DInstance::get_wparams
|
// Function: P3DInstance::get_wparams
|
||||||
// Access: Public
|
// Access: Public
|
||||||
@ -23,17 +33,6 @@ get_wparams() const {
|
|||||||
return _wparams;
|
return _wparams;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: P3DInstance::get_p3d_filename
|
|
||||||
// Access: Public
|
|
||||||
// Description: Returns the p3d filename that was passed to the
|
|
||||||
// constructor.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
inline const string &P3DInstance::
|
|
||||||
get_p3d_filename() const {
|
|
||||||
return _p3d_filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: P3DInstance::get_instance_id
|
// Function: P3DInstance::get_instance_id
|
||||||
// Access: Public
|
// Access: Public
|
||||||
|
@ -31,10 +31,8 @@ P3DInstance(P3D_request_ready_func *func,
|
|||||||
const string &p3d_filename,
|
const string &p3d_filename,
|
||||||
const P3D_token tokens[], size_t num_tokens) :
|
const P3D_token tokens[], size_t num_tokens) :
|
||||||
_func(func),
|
_func(func),
|
||||||
_p3d_filename(p3d_filename)
|
_fparams(p3d_filename, tokens, num_tokens)
|
||||||
{
|
{
|
||||||
fill_tokens(tokens, num_tokens);
|
|
||||||
|
|
||||||
_instance_id = _next_instance_id;
|
_instance_id = _next_instance_id;
|
||||||
++_next_instance_id;
|
++_next_instance_id;
|
||||||
|
|
||||||
@ -241,25 +239,6 @@ feed_url_stream(int unique_id,
|
|||||||
return download_ok;
|
return download_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: P3DInstance::lookup_token
|
|
||||||
// Access: Public
|
|
||||||
// Description: Returns the value associated with the first
|
|
||||||
// appearance of the named token, or empty string if the
|
|
||||||
// token does not appear.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
string P3DInstance::
|
|
||||||
lookup_token(const string &keyword) const {
|
|
||||||
Tokens::const_iterator ti;
|
|
||||||
for (ti = _tokens.begin(); ti != _tokens.end(); ++ti) {
|
|
||||||
if ((*ti)._keyword == keyword) {
|
|
||||||
return (*ti)._value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return string();
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: P3DInstance::start_download
|
// Function: P3DInstance::start_download
|
||||||
// Access: Public
|
// Access: Public
|
||||||
@ -321,36 +300,9 @@ TiXmlElement *P3DInstance::
|
|||||||
make_xml() {
|
make_xml() {
|
||||||
TiXmlElement *xinstance = new TiXmlElement("instance");
|
TiXmlElement *xinstance = new TiXmlElement("instance");
|
||||||
xinstance->SetAttribute("id", _instance_id);
|
xinstance->SetAttribute("id", _instance_id);
|
||||||
xinstance->SetAttribute("p3d_filename", _p3d_filename.c_str());
|
|
||||||
|
|
||||||
Tokens::const_iterator ti;
|
TiXmlElement *xfparams = _fparams.make_xml();
|
||||||
for (ti = _tokens.begin(); ti != _tokens.end(); ++ti) {
|
xinstance->LinkEndChild(xfparams);
|
||||||
const Token &token = (*ti);
|
|
||||||
TiXmlElement *xtoken = new TiXmlElement("token");
|
|
||||||
xtoken->SetAttribute("keyword", token._keyword.c_str());
|
|
||||||
xtoken->SetAttribute("value", token._value.c_str());
|
|
||||||
xinstance->LinkEndChild(xtoken);
|
|
||||||
}
|
|
||||||
|
|
||||||
return xinstance;
|
return xinstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: P3DInstance::fill_tokens
|
|
||||||
// Access: Private
|
|
||||||
// Description: Copies the C-style tokens array into the internal
|
|
||||||
// C++-style _tokens vector.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
void P3DInstance::
|
|
||||||
fill_tokens(const P3D_token tokens[], size_t num_tokens) {
|
|
||||||
for (size_t i = 0; i < num_tokens; ++i) {
|
|
||||||
Token token;
|
|
||||||
if (tokens[i]._keyword != NULL) {
|
|
||||||
token._keyword = tokens[i]._keyword;
|
|
||||||
}
|
|
||||||
if (tokens[i]._value != NULL) {
|
|
||||||
token._value = tokens[i]._value;
|
|
||||||
}
|
|
||||||
_tokens.push_back(token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
#include "p3d_plugin_common.h"
|
#include "p3d_plugin_common.h"
|
||||||
#include "p3dFileDownload.h"
|
#include "p3dFileDownload.h"
|
||||||
|
#include "p3dFileParams.h"
|
||||||
#include "p3dWindowParams.h"
|
#include "p3dWindowParams.h"
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <tinyxml.h>
|
#include <tinyxml.h>
|
||||||
@ -39,6 +39,8 @@ public:
|
|||||||
const P3D_token tokens[], size_t num_tokens);
|
const P3D_token tokens[], size_t num_tokens);
|
||||||
~P3DInstance();
|
~P3DInstance();
|
||||||
|
|
||||||
|
inline const P3DFileParams &get_fparams() const;
|
||||||
|
|
||||||
void set_wparams(const P3DWindowParams &wparams);
|
void set_wparams(const P3DWindowParams &wparams);
|
||||||
inline const P3DWindowParams &get_wparams() const;
|
inline const P3DWindowParams &get_wparams() const;
|
||||||
|
|
||||||
@ -58,12 +60,9 @@ public:
|
|||||||
const unsigned char *this_data,
|
const unsigned char *this_data,
|
||||||
size_t this_data_size);
|
size_t this_data_size);
|
||||||
|
|
||||||
inline const string &get_p3d_filename() const;
|
|
||||||
|
|
||||||
inline int get_instance_id() const;
|
inline int get_instance_id() const;
|
||||||
inline const string &get_session_key() const;
|
inline const string &get_session_key() const;
|
||||||
inline const string &get_python_version() const;
|
inline const string &get_python_version() const;
|
||||||
string lookup_token(const string &keyword) const;
|
|
||||||
|
|
||||||
void start_download(P3DDownload *download);
|
void start_download(P3DDownload *download);
|
||||||
void request_stop();
|
void request_stop();
|
||||||
@ -71,19 +70,9 @@ public:
|
|||||||
TiXmlElement *make_xml();
|
TiXmlElement *make_xml();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void fill_tokens(const P3D_token tokens[], size_t num_tokens);
|
|
||||||
|
|
||||||
class Token {
|
|
||||||
public:
|
|
||||||
string _keyword;
|
|
||||||
string _value;
|
|
||||||
};
|
|
||||||
typedef vector<Token> Tokens;
|
|
||||||
|
|
||||||
P3D_request_ready_func *_func;
|
P3D_request_ready_func *_func;
|
||||||
string _p3d_filename;
|
|
||||||
Tokens _tokens;
|
|
||||||
|
|
||||||
|
P3DFileParams _fparams;
|
||||||
P3DWindowParams _wparams;
|
P3DWindowParams _wparams;
|
||||||
|
|
||||||
int _instance_id;
|
int _instance_id;
|
||||||
|
@ -102,8 +102,8 @@ run_python() {
|
|||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_runPackedApp = PyObject_GetAttrString(appmf, "runPackedApp");
|
_setP3DFilename = PyObject_GetAttrString(appmf, "setP3DFilename");
|
||||||
if (_runPackedApp == NULL) {
|
if (_setP3DFilename == NULL) {
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -155,7 +155,7 @@ handle_command(TiXmlDocument *doc) {
|
|||||||
TiXmlElement *xinstance = xcommand->FirstChildElement("instance");
|
TiXmlElement *xinstance = xcommand->FirstChildElement("instance");
|
||||||
if (xinstance != (TiXmlElement *)NULL) {
|
if (xinstance != (TiXmlElement *)NULL) {
|
||||||
P3DCInstance *inst = new P3DCInstance(xinstance);
|
P3DCInstance *inst = new P3DCInstance(xinstance);
|
||||||
start_instance(inst);
|
start_instance(inst, xinstance);
|
||||||
}
|
}
|
||||||
} else if (strcmp(cmd, "terminate_instance") == 0) {
|
} else if (strcmp(cmd, "terminate_instance") == 0) {
|
||||||
int id;
|
int id;
|
||||||
@ -284,20 +284,14 @@ join_read_thread() {
|
|||||||
// Python process.
|
// Python process.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void P3DPythonRun::
|
void P3DPythonRun::
|
||||||
start_instance(P3DCInstance *inst) {
|
start_instance(P3DCInstance *inst, TiXmlElement *xinstance) {
|
||||||
nout << "starting instance " << inst->get_p3d_filename() << "\n";
|
nout << "starting instance " << inst << "\n";
|
||||||
_instances[inst->get_instance_id()] = inst;
|
_instances[inst->get_instance_id()] = inst;
|
||||||
|
|
||||||
PyObject *tokens = inst->get_py_tokens();
|
TiXmlElement *xfparams = xinstance->FirstChildElement("fparams");
|
||||||
|
if (xfparams != (TiXmlElement *)NULL) {
|
||||||
PyObject *result = PyObject_CallFunction
|
set_p3d_filename(inst, xfparams);
|
||||||
(_runPackedApp, "sO", inst->get_p3d_filename().c_str(), tokens);
|
|
||||||
Py_DECREF(tokens);
|
|
||||||
|
|
||||||
if (result == NULL) {
|
|
||||||
PyErr_Print();
|
|
||||||
}
|
}
|
||||||
Py_XDECREF(result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -323,6 +317,53 @@ terminate_instance(int id) {
|
|||||||
terminate_session();
|
terminate_session();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: P3DPythonRun::set_p3d_filename
|
||||||
|
// Access: Private
|
||||||
|
// Description: Sets the startup filename and tokens for the
|
||||||
|
// indicated instance.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void P3DPythonRun::
|
||||||
|
set_p3d_filename(P3DCInstance *inst, TiXmlElement *xfparams) {
|
||||||
|
string p3d_filename;
|
||||||
|
const char *p3d_filename_c = xfparams->Attribute("p3d_filename");
|
||||||
|
if (p3d_filename_c != NULL) {
|
||||||
|
p3d_filename = p3d_filename_c;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *token_list = PyList_New(0);
|
||||||
|
|
||||||
|
TiXmlElement *xtoken = xfparams->FirstChildElement("token");
|
||||||
|
while (xtoken != NULL) {
|
||||||
|
string keyword, value;
|
||||||
|
const char *keyword_c = xtoken->Attribute("keyword");
|
||||||
|
if (keyword_c != NULL) {
|
||||||
|
keyword = keyword_c;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *value_c = xtoken->Attribute("value");
|
||||||
|
if (value_c != NULL) {
|
||||||
|
value = value_c;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *tuple = Py_BuildValue("(ss)", keyword.c_str(),
|
||||||
|
value.c_str());
|
||||||
|
PyList_Append(token_list, tuple);
|
||||||
|
Py_DECREF(tuple);
|
||||||
|
|
||||||
|
xtoken = xtoken->NextSiblingElement("token");
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *result = PyObject_CallFunction
|
||||||
|
(_setP3DFilename, "sO", p3d_filename.c_str(), token_list);
|
||||||
|
Py_DECREF(token_list);
|
||||||
|
|
||||||
|
if (result == NULL) {
|
||||||
|
PyErr_Print();
|
||||||
|
}
|
||||||
|
Py_XDECREF(result);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: P3DPythonRun::setup_window
|
// Function: P3DPythonRun::setup_window
|
||||||
// Access: Private
|
// Access: Private
|
||||||
|
@ -69,10 +69,11 @@ private:
|
|||||||
void spawn_read_thread();
|
void spawn_read_thread();
|
||||||
void join_read_thread();
|
void join_read_thread();
|
||||||
|
|
||||||
void start_instance(P3DCInstance *inst);
|
void start_instance(P3DCInstance *inst, TiXmlElement *xinstance);
|
||||||
void terminate_instance(int id);
|
void terminate_instance(int id);
|
||||||
|
void set_p3d_filename(P3DCInstance *inst, TiXmlElement *xfparams);
|
||||||
void setup_window(int id, TiXmlElement *xwparams);
|
void setup_window(int id, TiXmlElement *xwparams);
|
||||||
|
|
||||||
void terminate_session();
|
void terminate_session();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -93,7 +94,7 @@ private:
|
|||||||
int _py_argc;
|
int _py_argc;
|
||||||
char **_py_argv;
|
char **_py_argv;
|
||||||
|
|
||||||
PyObject *_runPackedApp;
|
PyObject *_setP3DFilename;
|
||||||
PyObject *_setupWindow;
|
PyObject *_setupWindow;
|
||||||
PyObject *_taskMgr;
|
PyObject *_taskMgr;
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ P3DSession(P3DInstance *inst) {
|
|||||||
_started_read_thread = false;
|
_started_read_thread = false;
|
||||||
_read_thread_continue = false;
|
_read_thread_continue = false;
|
||||||
|
|
||||||
_output_filename = inst->lookup_token("output_filename");
|
_output_filename = inst->get_fparams().lookup_token("output_filename");
|
||||||
|
|
||||||
P3DInstanceManager *inst_mgr = P3DInstanceManager::get_global_ptr();
|
P3DInstanceManager *inst_mgr = P3DInstanceManager::get_global_ptr();
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "p3d_plugin.cxx"
|
#include "p3d_plugin.cxx"
|
||||||
#include "p3dDownload.cxx"
|
#include "p3dDownload.cxx"
|
||||||
#include "p3dFileDownload.cxx"
|
#include "p3dFileDownload.cxx"
|
||||||
|
#include "p3dFileParams.cxx"
|
||||||
#include "p3dInstance.cxx"
|
#include "p3dInstance.cxx"
|
||||||
#include "p3dInstanceManager.cxx"
|
#include "p3dInstanceManager.cxx"
|
||||||
#include "p3dMultifileReader.cxx"
|
#include "p3dMultifileReader.cxx"
|
||||||
|
@ -10,15 +10,19 @@
|
|||||||
#define TARGET nppanda3d
|
#define TARGET nppanda3d
|
||||||
#define LIB_PREFIX
|
#define LIB_PREFIX
|
||||||
|
|
||||||
|
#define LOCAL_LIBS plugin_common
|
||||||
|
|
||||||
#define COMBINED_SOURCES \
|
#define COMBINED_SOURCES \
|
||||||
$[TARGET]_composite1.cxx
|
$[TARGET]_composite1.cxx
|
||||||
|
|
||||||
#define SOURCES \
|
#define SOURCES \
|
||||||
nppanda3d_common.h \
|
nppanda3d_common.h \
|
||||||
nppanda3d_startup.h
|
ppInstance.h ppInstance.I \
|
||||||
|
startup.h
|
||||||
|
|
||||||
#define INCLUDED_SOURCES \
|
#define INCLUDED_SOURCES \
|
||||||
nppanda3d_startup.cxx
|
ppInstance.cxx \
|
||||||
|
startup.cxx
|
||||||
|
|
||||||
// Windows-specific options.
|
// Windows-specific options.
|
||||||
#if $[WINDOWS_PLATFORM]
|
#if $[WINDOWS_PLATFORM]
|
||||||
|
@ -54,10 +54,11 @@ extern ofstream logfile;
|
|||||||
#endif // _WIN32, __APPLE__
|
#endif // _WIN32, __APPLE__
|
||||||
|
|
||||||
#include "npapi.h"
|
#include "npapi.h"
|
||||||
//#include "npfunctions.h"
|
|
||||||
#include "npupp.h"
|
#include "npupp.h"
|
||||||
|
|
||||||
// Appears in nppanda3d_startup.cxx.
|
#include "load_plugin.h"
|
||||||
|
|
||||||
|
// Appears in startup.cxx.
|
||||||
extern NPNetscapeFuncs *browser;
|
extern NPNetscapeFuncs *browser;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
#include "nppanda3d_startup.cxx"
|
#include "ppInstance.cxx"
|
||||||
|
#include "startup.cxx"
|
||||||
|
|
||||||
|
|
||||||
|
14
direct/src/plugin_npapi/ppInstance.I
Normal file
14
direct/src/plugin_npapi/ppInstance.I
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Filename: ppInstance.I
|
||||||
|
// Created by: drose (19Jun09)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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."
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
134
direct/src/plugin_npapi/ppInstance.cxx
Normal file
134
direct/src/plugin_npapi/ppInstance.cxx
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
// Filename: ppInstance.cxx
|
||||||
|
// Created by: drose (19Jun09)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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 "ppInstance.h"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PPInstance::Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description: Creates a new instance of a Panda3D plugin window.
|
||||||
|
// The create_data structure is supplied from NPAPI, and
|
||||||
|
// defines the initial parameters specified in the HTML
|
||||||
|
// document.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
PPInstance::
|
||||||
|
PPInstance(NPMIMEType pluginType, NPP instance, uint16 mode,
|
||||||
|
int16 argc, char *argn[], char *argv[], NPSavedData *saved) {
|
||||||
|
logfile << "constructing " << this << "\n" << flush;
|
||||||
|
_inst = NULL;
|
||||||
|
|
||||||
|
// Copy the tokens and save them within this object.
|
||||||
|
_tokens.reserve(argc);
|
||||||
|
for (int i = 0; i < argc; ++i) {
|
||||||
|
P3D_token token;
|
||||||
|
token._keyword = strdup(argn[i]);
|
||||||
|
token._value = strdup(argv[i]);
|
||||||
|
logfile
|
||||||
|
<< " " << i << ": " << token._keyword << " = " << token._value << "\n";
|
||||||
|
_tokens.push_back(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
_npp_mode = mode;
|
||||||
|
_got_window = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PPInstance::Destructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
PPInstance::
|
||||||
|
~PPInstance() {
|
||||||
|
logfile
|
||||||
|
<< "destructing " << this << "\n" << flush;
|
||||||
|
|
||||||
|
if (_inst != NULL) {
|
||||||
|
P3D_instance_finish(_inst);
|
||||||
|
_inst = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free the tokens we allocated.
|
||||||
|
Tokens::iterator ti;
|
||||||
|
for (ti = _tokens.begin(); ti != _tokens.end(); ++ti) {
|
||||||
|
free((char *)(*ti)._keyword);
|
||||||
|
free((char *)(*ti)._value);
|
||||||
|
}
|
||||||
|
_tokens.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PPInstance::set_window
|
||||||
|
// Access: Public
|
||||||
|
// Description: Stores or updates the window parameters.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void PPInstance::
|
||||||
|
set_window(NPWindow *window) {
|
||||||
|
if (window->x == _window.x &&
|
||||||
|
window->y == _window.y &&
|
||||||
|
window->width == _window.width &&
|
||||||
|
window->height == _window.height) {
|
||||||
|
// No changes.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_window = *window;
|
||||||
|
_got_window = true;
|
||||||
|
|
||||||
|
if (_inst != NULL) {
|
||||||
|
send_window();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PPInstance::create_instance
|
||||||
|
// Access: Private
|
||||||
|
// Description: Actually creates the internal P3D_instance object.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void PPInstance::
|
||||||
|
create_instance() {
|
||||||
|
assert(_inst == NULL);
|
||||||
|
const P3D_token *tokens = NULL;
|
||||||
|
if (!_tokens.empty()) {
|
||||||
|
tokens = &_tokens[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
_inst = P3D_create_instance
|
||||||
|
(NULL, NULL, tokens, _tokens.size());
|
||||||
|
|
||||||
|
if (_inst != NULL && _got_window) {
|
||||||
|
send_window();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PPInstance::send_window
|
||||||
|
// Access: Private
|
||||||
|
// Description: Actually issues the window parameters to the internal
|
||||||
|
// P3D_instance object.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void PPInstance::
|
||||||
|
send_window() {
|
||||||
|
assert(_inst != NULL);
|
||||||
|
|
||||||
|
P3D_window_handle parent_window;
|
||||||
|
#ifdef _WIN32
|
||||||
|
parent_window._hwnd = (HWND)(_window.window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
P3D_instance_setup_window
|
||||||
|
(_inst, P3D_WT_embedded,
|
||||||
|
_window.x, _window.y, _window.width, _window.height,
|
||||||
|
parent_window);
|
||||||
|
}
|
54
direct/src/plugin_npapi/ppInstance.h
Normal file
54
direct/src/plugin_npapi/ppInstance.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
// Filename: ppInstance.h
|
||||||
|
// Created by: drose (19Jun09)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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."
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef PPINSTANCE_H
|
||||||
|
#define PPINSTANCE_H
|
||||||
|
|
||||||
|
#include "nppanda3d_common.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Class : PPInstance
|
||||||
|
// Description : This represents a single instance of the Panda3D
|
||||||
|
// plugin, via the NPAPI interface. This instance
|
||||||
|
// brokers the communication with the P3D Core API, as
|
||||||
|
// defined in the plugin directory.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
class PPInstance {
|
||||||
|
public:
|
||||||
|
PPInstance(NPMIMEType pluginType, NPP instance, uint16 mode,
|
||||||
|
int16 argc, char *argn[], char *argv[], NPSavedData *saved);
|
||||||
|
~PPInstance();
|
||||||
|
|
||||||
|
void set_window(NPWindow *window);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void create_instance();
|
||||||
|
void send_window();
|
||||||
|
|
||||||
|
private:
|
||||||
|
typedef vector<P3D_token> Tokens;
|
||||||
|
Tokens _tokens;
|
||||||
|
unsigned int _npp_mode;
|
||||||
|
|
||||||
|
bool _got_window;
|
||||||
|
NPWindow _window;
|
||||||
|
|
||||||
|
P3D_instance *_inst;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "ppInstance.I"
|
||||||
|
|
||||||
|
#endif
|
@ -1,4 +1,4 @@
|
|||||||
// Filename: nppanda3d_startup.cxx
|
// Filename: startup.cxx
|
||||||
// Created by: drose (17Jun09)
|
// Created by: drose (17Jun09)
|
||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -12,9 +12,7 @@
|
|||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "nppanda3d_startup.h"
|
#include "startup.h"
|
||||||
|
|
||||||
#include "../plugin/load_plugin_src.cxx"
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
@ -70,7 +68,7 @@ NP_Initialize(NPNetscapeFuncs *browserFuncs,
|
|||||||
string plugin_location = "/Users/drose/player/direct/built/lib/p3d_plugin.dylib";
|
string plugin_location = "/Users/drose/player/direct/built/lib/p3d_plugin.dylib";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!load_plugin(plugin_location.c_str())) {
|
if (!load_plugin(plugin_location)) {
|
||||||
logfile << "couldn't load plugin\n" << flush;
|
logfile << "couldn't load plugin\n" << flush;
|
||||||
return NPERR_INVALID_PLUGIN_ERROR;
|
return NPERR_INVALID_PLUGIN_ERROR;
|
||||||
}
|
}
|
||||||
@ -136,16 +134,8 @@ NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode,
|
|||||||
int16 argc, char *argn[], char *argv[], NPSavedData *saved) {
|
int16 argc, char *argn[], char *argv[], NPSavedData *saved) {
|
||||||
logfile << "new instance\n" << flush;
|
logfile << "new instance\n" << flush;
|
||||||
|
|
||||||
// Copy the tokens into a temporary array of P3D_token objects.
|
instance->pdata = new PPInstance(pluginType, instance, mode,
|
||||||
P3D_token *tokens = (P3D_token *)alloca(sizeof(P3D_token) * argc);
|
argc, argn, argv, saved);
|
||||||
for (int i = 0; i < argc; ++i) {
|
|
||||||
P3D_token &token = tokens[i];
|
|
||||||
token._keyword = argn[i];
|
|
||||||
token._value = argv[i];
|
|
||||||
logfile << " " << i << ": " << token._keyword << " = " << token._value << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
instance->pdata = P3D_create_instance(NULL, NULL, tokens, argc);
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
return NPERR_NO_ERROR;
|
||||||
}
|
}
|
||||||
@ -159,7 +149,7 @@ NPError
|
|||||||
NPP_Destroy(NPP instance, NPSavedData **save) {
|
NPP_Destroy(NPP instance, NPSavedData **save) {
|
||||||
logfile << "destroy instance\n" << flush;
|
logfile << "destroy instance\n" << flush;
|
||||||
(*save) = NULL;
|
(*save) = NULL;
|
||||||
P3D_instance_finish((P3D_instance *)(instance->pdata));
|
delete (PPInstance *)(instance->pdata);
|
||||||
instance->pdata = NULL;
|
instance->pdata = NULL;
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
return NPERR_NO_ERROR;
|
||||||
@ -179,20 +169,9 @@ NPP_SetWindow(NPP instance, NPWindow *window) {
|
|||||||
<< ", " << window->width << ", " << window->height
|
<< ", " << window->width << ", " << window->height
|
||||||
<< "\n" << flush;
|
<< "\n" << flush;
|
||||||
|
|
||||||
P3D_instance *inst = (P3D_instance *)(instance->pdata);
|
PPInstance *inst = (PPInstance *)(instance->pdata);
|
||||||
assert(inst != NULL);
|
assert(inst != NULL);
|
||||||
|
inst->set_window(window);
|
||||||
P3D_window_handle parent_window;
|
|
||||||
#ifdef _WIN32
|
|
||||||
parent_window._hwnd = (HWND)(window->window);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
P3D_instance_setup_window
|
|
||||||
(inst, P3D_WT_embedded,
|
|
||||||
window->x, window->y, window->width, window->height,
|
|
||||||
parent_window);
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -208,8 +187,17 @@ NPP_NewStream(NPP instance, NPMIMEType type, NPStream *stream,
|
|||||||
NPBool seekable, uint16 *stype) {
|
NPBool seekable, uint16 *stype) {
|
||||||
logfile << "NewStream " << type << ", " << stream->url
|
logfile << "NewStream " << type << ", " << stream->url
|
||||||
<< ", " << stream->end << "\n" << flush;
|
<< ", " << stream->end << "\n" << flush;
|
||||||
|
PPInstance *inst = (PPInstance *)(instance->pdata);
|
||||||
|
assert(inst != NULL);
|
||||||
|
|
||||||
|
//inst->new_stream(type, stream, seekable, stype);
|
||||||
|
|
||||||
*stype = NP_ASFILEONLY;
|
*stype = NP_ASFILEONLY;
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
|
if (strcmp(type, "application/x-panda3d") == 0) {
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
return NPERR_GENERIC_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
@ -1,4 +1,4 @@
|
|||||||
// Filename: nppanda3d_startup.h
|
// Filename: startup.h
|
||||||
// Created by: drose (19Jun09)
|
// Created by: drose (19Jun09)
|
||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -12,13 +12,11 @@
|
|||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifndef NPPANDA3D_STARTUP_H
|
#ifndef STARTUP_H
|
||||||
#define NPPANDA3D_STARTUP_H
|
#define STARTUP_H
|
||||||
|
|
||||||
#include "nppanda3d_common.h"
|
#include "nppanda3d_common.h"
|
||||||
|
|
||||||
#include "../plugin/load_plugin_src.h"
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
NPError OSCALL NP_Initialize(NPNetscapeFuncs *browserFuncs);
|
NPError OSCALL NP_Initialize(NPNetscapeFuncs *browserFuncs);
|
@ -6,6 +6,8 @@
|
|||||||
#define USE_PACKAGES openssl zlib
|
#define USE_PACKAGES openssl zlib
|
||||||
#define TARGET panda3d
|
#define TARGET panda3d
|
||||||
|
|
||||||
|
#define LOCAL_LIBS plugin_common
|
||||||
|
|
||||||
#define OTHER_LIBS \
|
#define OTHER_LIBS \
|
||||||
prc:c dtoolutil:c dtoolbase:c dtool:m \
|
prc:c dtoolutil:c dtoolbase:c dtool:m \
|
||||||
interrogatedb:c dconfig:c dtoolconfig:m \
|
interrogatedb:c dconfig:c dtoolconfig:m \
|
||||||
|
@ -34,9 +34,8 @@
|
|||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "pset.h"
|
#include "pset.h"
|
||||||
|
|
||||||
#include "../plugin/p3d_plugin.h"
|
#include "p3d_plugin.h"
|
||||||
#include "../plugin/load_plugin_src.h"
|
#include "load_plugin.h"
|
||||||
#include "../plugin/load_plugin_src.cxx"
|
|
||||||
|
|
||||||
#ifndef HAVE_GETOPT
|
#ifndef HAVE_GETOPT
|
||||||
#include "gnu_getopt.h"
|
#include "gnu_getopt.h"
|
||||||
@ -283,7 +282,7 @@ usage() {
|
|||||||
|
|
||||||
<< "Options:\n\n"
|
<< "Options:\n\n"
|
||||||
|
|
||||||
<< " -p p3d_plugin" << dll_ext << "\n"
|
<< " -p " << get_plugin_basename() << "\n"
|
||||||
<< " Specify the full path to the particular Panda plugin DLL to\n"
|
<< " Specify the full path to the particular Panda plugin DLL to\n"
|
||||||
<< " run. Normally, this will be found by searching in the usual\n"
|
<< " run. Normally, this will be found by searching in the usual\n"
|
||||||
<< " places.\n\n"
|
<< " places.\n\n"
|
||||||
|
@ -91,17 +91,21 @@ def initPackedAppEnvironment():
|
|||||||
# we plan to mount there.
|
# we plan to mount there.
|
||||||
vfs.chdir(MultifileRoot)
|
vfs.chdir(MultifileRoot)
|
||||||
|
|
||||||
readyToStart = False
|
gotWindow = False
|
||||||
|
gotP3DFilename = False
|
||||||
started = False
|
started = False
|
||||||
def startIfReady():
|
def startIfReady():
|
||||||
global readyToStart, started
|
global gotWindow, gotP3DFilename, started
|
||||||
if readyToStart:
|
if started:
|
||||||
|
return
|
||||||
|
|
||||||
|
if gotWindow and gotP3DFilename:
|
||||||
started = True
|
started = True
|
||||||
import main
|
import main
|
||||||
if hasattr(main, 'main') and callable(main.main):
|
if hasattr(main, 'main') and callable(main.main):
|
||||||
main.main()
|
main.main()
|
||||||
|
|
||||||
def runPackedApp(p3dFilename, tokens = []):
|
def setP3DFilename(p3dFilename, tokens = []):
|
||||||
tokenDict = dict(tokens)
|
tokenDict = dict(tokens)
|
||||||
fname = Filename.fromOsSpecific(p3dFilename)
|
fname = Filename.fromOsSpecific(p3dFilename)
|
||||||
if not p3dFilename:
|
if not p3dFilename:
|
||||||
@ -156,6 +160,8 @@ def runPackedApp(p3dFilename, tokens = []):
|
|||||||
data = open(pathname, 'r').read()
|
data = open(pathname, 'r').read()
|
||||||
loadPrcFileData(pathname, data)
|
loadPrcFileData(pathname, data)
|
||||||
|
|
||||||
|
global gotP3DFilename
|
||||||
|
gotP3DFilename = True
|
||||||
startIfReady()
|
startIfReady()
|
||||||
|
|
||||||
windowPrc = None
|
windowPrc = None
|
||||||
@ -185,8 +191,8 @@ def setupWindow(windowType, x, y, width, height, parent):
|
|||||||
unloadPrcFile(windowPrc)
|
unloadPrcFile(windowPrc)
|
||||||
windowPrc = loadPrcFileData("setupWindow", data)
|
windowPrc = loadPrcFileData("setupWindow", data)
|
||||||
|
|
||||||
global readyToStart
|
global gotWindow
|
||||||
readyToStart = True
|
gotWindow = True
|
||||||
startIfReady()
|
startIfReady()
|
||||||
|
|
||||||
def parseSysArgs():
|
def parseSysArgs():
|
||||||
@ -216,9 +222,9 @@ def parseSysArgs():
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
readyToStart = True
|
gotWindow = True
|
||||||
try:
|
try:
|
||||||
runPackedApp(*parseSysArgs())
|
setP3DFilename(*parseSysArgs())
|
||||||
except ArgumentError, e:
|
except ArgumentError, e:
|
||||||
print e.args[0]
|
print e.args[0]
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user