diff -r f4303074311f -r e4e5f02787a1 front_idill/extern/fajran-npTuioClient/src/plugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_idill/extern/fajran-npTuioClient/src/plugin.cpp Fri Apr 06 10:44:54 2012 +0200 @@ -0,0 +1,351 @@ +// +// Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +// +// 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 3 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 St, Fifth Floor, Boston, MA 02110-1301 USA + +#include "plugin.h" + +#include +#include +#include +#define D(s) /*std::cerr << s << std::endl;*/ + +#include + +#define MIME_TYPES_HANDLED "application/x-tuio" +// The name must be this value to get flash movies that check the +// plugin version to load. +#define PLUGIN_NAME "TUIO Client" +#define MIME_TYPES_DESCRIPTION MIME_TYPES_HANDLED":tuio:"PLUGIN_NAME + +#define PLUGIN_DESCRIPTION "TUIO Client plugin" + +extern NPNetscapeFuncs NPNFuncs; + +NPBool plugInitialized = FALSE; + +static std::set instances; + +void tuio_callback(TuioEventData data) +{ + std::set::iterator iter; + for (iter = instances.begin(); iter != instances.end(); iter++) { + (*iter)->event(data); + } +} + +void +PR_CALLBACK Destructor(void * /* data */) +{ +#if 0 + /* + * We don't actually free the storage since it's actually allocated + * on the stack. Normally, this would not be the case and this is + * the opportunity to free whatever. + */ + PR_Free(data); +#endif +} + +/// \brief Return the MIME Type description for this plugin. +char* +NPP_GetMIMEDescription(void) +{ + return const_cast(MIME_TYPES_DESCRIPTION); +} + +// +// general initialization and shutdown +// + +/// \brief Initialize the plugin +/// +/// This C++ function gets called once when the plugin is loaded, +/// regardless of how many instantiations there is actually playing +/// movies. So this is where all the one time only initialization +/// stuff goes. +NPError +NS_PluginInitialize() +{ + if ( plugInitialized ) + { + return NPERR_NO_ERROR; + } + + plugInitialized = TRUE; + + tuio_start(3333); + + return NPERR_NO_ERROR; +} + +/// \brief Shutdown the plugin +/// +/// This C++ function gets called once when the plugin is being +/// shutdown, regardless of how many instantiations actually are +/// playing movies. So this is where all the one time only +/// shutdown stuff goes. +void +NS_PluginShutdown() +{ +#if 0 + if (!plugInitialized) + { +#if GNASH_PLUGIN_DEBUG > 1 + std::cout << "Plugin already shut down" << std::endl; +#endif + return; + } + + plugInitialized = FALSE; +#endif + + tuio_stop(); +} + + + +/// \brief Retrieve values from the plugin for the Browser +/// +/// This C++ function is called by the browser to get certain +/// information is needs from the plugin. This information is the +/// plugin name, a description, etc... +NPError +NS_PluginGetValue(NPPVariable aVariable, void *aValue) +{ + NPError err = NPERR_NO_ERROR; + + switch (aVariable) + { + case NPPVpluginNameString: + *static_cast (aValue) = PLUGIN_NAME; + break; + + // This becomes the description field you see below the opening + // text when you type about:plugins and in + // navigator.plugins["Shockwave Flash"].description, used in + // many flash version detection scripts. + case NPPVpluginDescriptionString: + *static_cast(aValue) = PLUGIN_DESCRIPTION; + break; + + case NPPVpluginNeedsXEmbed: + *(int*)aValue = PR_TRUE; + break; + + case NPPVpluginTimerInterval: + + case NPPVpluginKeepLibraryInMemory: + + default: + err = NPERR_INVALID_PARAM; + break; + } + return err; +} + +/// \brief construct our plugin instance object +/// +/// This instantiates a new object via a C++ function used by the +/// browser. +nsPluginInstanceBase * +NS_NewPluginInstance(nsPluginCreateData * aCreateDataStruct) +{ + if(!aCreateDataStruct) return NULL; + + return new nsPluginInstance(aCreateDataStruct); +} + +/// \brief destroy our plugin instance object +/// +/// This destroys our instantiated object via a C++ function used by the +/// browser. +void +NS_DestroyPluginInstance(nsPluginInstanceBase* aPlugin) +{ + delete static_cast (aPlugin); +} + +// +// nsPluginInstance class implementation +// + +/// \brief Constructor +nsPluginInstance::nsPluginInstance(nsPluginCreateData* data) + : + nsPluginInstanceBase(), + _instance(data->instance), + _port(3333), + _callback("tuio_callback") +{ + for (size_t i=0, n=data->argc; iargn[i]) + { + name = data->argn[i]; + } + + if (data->argv[i]) + { + val = data->argv[i]; + } + + else if ( ! strstr(name.c_str(), "callback") ) + { + _callback = val; + } + + else if ( ! strstr(name.c_str(), "port") ) + { + _port = atoi(val.c_str()); + } + } + + instances.insert(this); +} + +/// \brief Destructor +nsPluginInstance::~nsPluginInstance() +{ + instances.erase(this); +} + +/// \brief Initialize an instance of the plugin object +/// +/// This methods initializes the plugin object, and is called for +/// every movie that gets played. This is where the movie playing +/// specific initialization goes. +NPBool +nsPluginInstance::init(NPWindow* aWindow) +{ + D("[ns] init"); + return TRUE; +} + +/// \brief Shutdown an instantiated object +/// +/// This shuts down an object, and is called for every movie that gets +/// played. This is where the movie playing specific shutdown code +/// goes. +void +nsPluginInstance::shut() +{ + D("[ns] shut"); +} + +NPError +nsPluginInstance::SetWindow(NPWindow* aWindow) +{ + D("[ns] SetWindow"); + + if(!aWindow) + { + return NPERR_INVALID_PARAM; + } + + return NPERR_NO_ERROR; +} + +NPError +nsPluginInstance::GetValue(NPPVariable aVariable, void *aValue) +{ + return NS_PluginGetValue(aVariable, aValue); +} + +/// \brief Write a status message +/// +/// This writes a status message to the status line at the bottom of +/// the browser window and the console firefox was started from. +NPError +nsPluginInstance::WriteStatus(const char *msg) const +{ + NPN_Status(_instance, msg); + std::cout << msg << std::endl; + + return NPERR_NO_ERROR; +} + +NPError +nsPluginInstance::NewStream(NPMIMEType /*type*/, NPStream* stream, + NPBool /*seekable*/, uint16* /*stype*/) +{ + D("[ns] NewStream"); + return NPERR_NO_ERROR; +} + +NPError +nsPluginInstance::DestroyStream(NPStream* /*stream*/, NPError /*reason*/) +{ + D("[ns] DestroyStream"); + return NPERR_NO_ERROR; +} + +int32_t +nsPluginInstance::WriteReady(NPStream* /* stream */ ) +{ + D("[ns] WriteReady"); + return 0x0fffffff; +} + +int32_t +nsPluginInstance::Write(NPStream* /*stream*/, int32_t /*offset*/, int32_t len, + void* buffer) +{ + D("[ns] Write: len=" << len); + return len; +} + +typedef struct { + NPP instance; + TuioEventData data; +} Event; + +void test(void* ev) +{ + D("ev=" << ev); + Event* event = (Event*)ev; + D("event=" << event); + std::stringstream ss; + ss << "javascript:tuio_callback("; + ss << event->data.type << ", "; + ss << event->data.sid << ", "; + ss << event->data.fid << ", "; + ss << event->data.x << ", "; + ss << event->data.y << ", "; + ss << event->data.a << ");"; + NPN_GetURL(event->instance, ss.str().c_str(), "_self"); + + delete event; +} + +void nsPluginInstance::event(TuioEventData data) +{ + D("[event] callback: type=" << data.type + << ", sid=" << data.sid << ", fid=" << data.fid + << ", x=" << data.x << ", y=" << data.y << ", a=" << data.a); + + Event* ev = new Event(); + ev->instance = _instance; + ev->data = data; + + NPN_PluginThreadAsyncCall(_instance, test, ev); +} + +// Local Variables: +// mode: C++ +// indent-tabs-mode: t +// End: