263 lines
6.7 KiB
C
263 lines
6.7 KiB
C
/*
|
|
* npw-common.h - Common code for both the wrapper and the plugin
|
|
*
|
|
* nspluginwrapper (C) 2005-2009 Gwenole Beauchesne
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#ifndef NPW_COMMON_H
|
|
#define NPW_COMMON_H
|
|
|
|
#include <assert.h>
|
|
|
|
#include "rpc.h"
|
|
#include "npw-rpc.h"
|
|
|
|
#define XP_UNIX 1
|
|
#define MOZ_X11 1
|
|
#include <npapi.h>
|
|
#include <npfunctions.h>
|
|
#include <npruntime.h>
|
|
|
|
/* Supported NPAPI interfaces */
|
|
#define NPW_NPAPI_VERSION 27
|
|
#define NPW_NP_CLASS_STRUCT_VERSION 3
|
|
#define NPW_TOOLKIT NPNVGtk2
|
|
|
|
/* What are we building? */
|
|
#if defined BUILD_WRAPPER
|
|
# define NPW_IS_BROWSER (1)
|
|
#elif defined BUILD_VIEWER
|
|
# define NPW_IS_BROWSER (0)
|
|
#else
|
|
# error "Could not determine what we are building (browser|plugin)-side?"
|
|
#endif
|
|
#define NPW_IS_PLUGIN (!NPW_IS_BROWSER)
|
|
|
|
#include "npruntime-impl.h"
|
|
|
|
#if NPW_IS_BROWSER
|
|
# define _NPW_INSTANCE_PRIVATE_DATA pdata
|
|
#else
|
|
# define _NPW_INSTANCE_PRIVATE_DATA ndata
|
|
#endif
|
|
|
|
/* PluginInstance */
|
|
#define NPW_DECL_PLUGIN_INSTANCE \
|
|
NPW_PluginInstanceClass *klass; \
|
|
volatile int refcount; \
|
|
NPP instance; \
|
|
uint32_t instance_id; \
|
|
bool is_valid
|
|
|
|
typedef struct _NPW_PluginInstance NPW_PluginInstance;
|
|
typedef struct _NPW_PluginInstanceClass NPW_PluginInstanceClass;
|
|
|
|
struct _NPW_PluginInstance
|
|
{
|
|
NPW_DECL_PLUGIN_INSTANCE;
|
|
};
|
|
|
|
typedef void *
|
|
(*NPW_PluginInstanceAllocateFunctionPtr) (void);
|
|
|
|
typedef void
|
|
(*NPW_PluginInstanceDeallocateFunctionPtr) (NPW_PluginInstance *plugin);
|
|
|
|
typedef void
|
|
(*NPW_PluginInstanceFinalizeFunctionPtr) (NPW_PluginInstance *plugin);
|
|
|
|
typedef void
|
|
(*NPW_PluginInstanceInvalidateFunctionPtr) (NPW_PluginInstance *plugin);
|
|
|
|
struct _NPW_PluginInstanceClass
|
|
{
|
|
NPW_PluginInstanceAllocateFunctionPtr allocate;
|
|
NPW_PluginInstanceDeallocateFunctionPtr deallocate;
|
|
NPW_PluginInstanceFinalizeFunctionPtr finalize;
|
|
NPW_PluginInstanceInvalidateFunctionPtr invalidate;
|
|
};
|
|
|
|
void *
|
|
npw_plugin_instance_new(NPW_PluginInstanceClass *klass) attribute_hidden;
|
|
|
|
void *
|
|
npw_plugin_instance_ref(void *ptr) attribute_hidden;
|
|
|
|
void
|
|
npw_plugin_instance_unref(void *ptr) attribute_hidden;
|
|
|
|
void
|
|
npw_plugin_instance_invalidate(void *ptr) attribute_hidden;
|
|
|
|
static inline bool
|
|
npw_plugin_instance_is_valid(void *ptr)
|
|
{
|
|
NPW_PluginInstance *plugin = (NPW_PluginInstance *)ptr;
|
|
return plugin && plugin->is_valid;
|
|
}
|
|
|
|
#define NPW_PLUGIN_INSTANCE(instance) npw_get_plugin_instance (instance)
|
|
#define NPW_PLUGIN_INSTANCE_NPP(plugin) npw_get_plugin_instance_npp (plugin)
|
|
|
|
static inline NPW_PluginInstance *
|
|
_npw_get_plugin_instance (NPP instance)
|
|
{
|
|
return instance ? (NPW_PluginInstance *)instance->_NPW_INSTANCE_PRIVATE_DATA : NULL;
|
|
}
|
|
|
|
static inline NPW_PluginInstance *
|
|
npw_get_plugin_instance (NPP instance)
|
|
{
|
|
if (instance)
|
|
{
|
|
NPW_PluginInstance *plugin;
|
|
if ((plugin = _npw_get_plugin_instance (instance)) != NULL)
|
|
{
|
|
if (plugin->instance == instance)
|
|
return plugin;
|
|
#if NPW_IS_PLUGIN
|
|
/* XXX: `instance' is probably a copy of the original
|
|
plugin->instance with the same `plugin' as private data
|
|
(CrossOver Plugin) */
|
|
if (_npw_get_plugin_instance (plugin->instance) == plugin)
|
|
return plugin;
|
|
#endif
|
|
assert (plugin->instance == instance);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
static inline NPP
|
|
npw_get_plugin_instance_npp (NPW_PluginInstance *plugin)
|
|
{
|
|
return plugin ? plugin->instance : NULL;
|
|
}
|
|
|
|
/* StreamInstance */
|
|
#define NPW_DECL_STREAM_INSTANCE \
|
|
NPStream *stream; \
|
|
uint32_t stream_id; \
|
|
int is_plugin_stream
|
|
|
|
typedef struct _NPW_StreamInstance NPW_StreamInstance;
|
|
struct _NPW_StreamInstance
|
|
{
|
|
NPW_DECL_STREAM_INSTANCE;
|
|
};
|
|
|
|
#define NPW_STREAM_INSTANCE(stream) npw_get_stream_instance (stream)
|
|
|
|
static inline NPW_StreamInstance *
|
|
_npw_get_stream_instance (NPStream *np_stream)
|
|
{
|
|
return (NPW_StreamInstance *)np_stream->_NPW_INSTANCE_PRIVATE_DATA;
|
|
}
|
|
|
|
static inline NPW_StreamInstance *
|
|
npw_get_stream_instance (NPStream *np_stream)
|
|
{
|
|
if (np_stream)
|
|
{
|
|
NPW_StreamInstance *stream;
|
|
if ((stream = _npw_get_stream_instance (np_stream)) != NULL)
|
|
{
|
|
assert (stream->stream == np_stream);
|
|
return stream;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/* Unimplemented functions */
|
|
#define NPW_UNIMPLEMENTED() \
|
|
npw_printf ("WARNING: Unimplemented function %s() at %s:%d\n", \
|
|
__func__, __FILE__, __LINE__)
|
|
|
|
/* Initialize NPAPI hooks */
|
|
void
|
|
NPW_InitializeFuncs (NPNetscapeFuncs *mozilla_funcs,
|
|
NPPluginFuncs *plugin_funcs)
|
|
attribute_hidden;
|
|
|
|
enum {
|
|
NPW_IdentifierType_Integer = 1,
|
|
NPW_IdentifierType_String
|
|
};
|
|
|
|
typedef struct _NPW_Identifier *NPW_Identifier;
|
|
struct _NPW_Identifier
|
|
{
|
|
uint32_t type; // type of the identifier
|
|
uint32_t id; // numeric id to pass back to the browser
|
|
union {
|
|
int32_t i;
|
|
char *s;
|
|
} value; // local value cache
|
|
};
|
|
|
|
/* Create identifier from an integer */
|
|
NPW_Identifier
|
|
NPW_CreateIntIdentifier (int32_t value) attribute_hidden;
|
|
|
|
/* Create identifier from a string (that is copied) */
|
|
NPW_Identifier
|
|
NPW_CreateStringIdentifier (const char *str) attribute_hidden;
|
|
|
|
/* Create identifier from a string (that is now owned by the identifier) */
|
|
NPW_Identifier
|
|
NPW_CreateStringIdentifierSink (char *str) attribute_hidden;
|
|
|
|
/* Destroy identifier */
|
|
void
|
|
NPW_DestroyIdentifier (NPW_Identifier id) attribute_hidden;
|
|
|
|
/* Check whether identifier is an integer */
|
|
static inline bool
|
|
NPW_IsIntIdentifier (NPW_Identifier id)
|
|
{
|
|
return id && id->type == NPW_IdentifierType_Integer;
|
|
}
|
|
|
|
/* Check whether identifier is a string */
|
|
static inline bool
|
|
NPW_IsStringIdentifier (NPW_Identifier id)
|
|
{
|
|
return id && id->type == NPW_IdentifierType_String;
|
|
}
|
|
|
|
/* Return integer value from the identifier */
|
|
static inline int32_t
|
|
NPW_GetIntIdentifierValue (NPW_Identifier id)
|
|
{
|
|
return NPW_IsIntIdentifier (id) ? id->value.i : 0;
|
|
}
|
|
|
|
/* Return string value from the identifier */
|
|
static inline const char *
|
|
NPW_GetStringIdentifierValue (NPW_Identifier id)
|
|
{
|
|
return NPW_IsStringIdentifier (id) ? id->value.s : 0;
|
|
}
|
|
|
|
/* Reallocates a buffer with NPN_MemAlloc. Returns
|
|
* NPERR_OUT_OF_MEMORY_ERROR if NPN_MemAlloc fails. */
|
|
NPError
|
|
NPW_ReallocData(void *ptr, uint32_t size, void **out) attribute_hidden;
|
|
|
|
#endif /* NPW_COMMON_H */
|