/* | |
* main.cpp | |
* gwt-hosted-mode | |
* | |
* Created by Kelly Norton on 11/18/07. | |
* Copyright 2007 Google Inc. All rights reserved. | |
* | |
*/ | |
#ifndef _WINDOWS | |
#include <unistd.h> | |
#endif | |
#include "Debug.h" | |
#include "mozincludes.h" | |
#include "Plugin.h" | |
#include "ScriptableInstance.h" | |
#include "scoped_ptr/scoped_ptr.h" | |
#include "AllowDialog.h" | |
#ifdef _WINDOWS | |
#include <windows.h> | |
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ulReasonForCall, LPVOID lpReserved) { | |
AllowDialog::setHInstance(hModule); | |
switch (ulReasonForCall) { | |
case DLL_PROCESS_ATTACH: | |
case DLL_THREAD_ATTACH: | |
case DLL_THREAD_DETACH: | |
case DLL_PROCESS_DETACH: | |
break; | |
} | |
return TRUE; | |
} | |
#endif | |
extern "C" { | |
static const NPNetscapeFuncs* browser; | |
NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, | |
int16 argc, char* argn[], char* argv[], NPSavedData* saved); | |
NPError NPP_Destroy(NPP instance, NPSavedData** save); | |
NPError NPP_SetWindow(NPP instance, NPWindow* window); | |
NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, | |
NPBool seekable, uint16* stype); | |
NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason); | |
int32 NPP_WriteReady(NPP instance, NPStream* stream); | |
int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, | |
void* buffer); | |
void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname); | |
void NPP_Print(NPP instance, NPPrint* platformPrint); | |
int16 NPP_HandleEvent(NPP instance, void* event); | |
void NPP_URLNotify(NPP instance, const char* URL, NPReason reason, | |
void* notifyData); | |
NPError NP_GetValue(void*, NPPVariable variable, void *value); | |
NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value); | |
NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value); | |
// necessary for Mac | |
#ifdef __APPLE_CC__ | |
#pragma export on | |
int main(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* shutdownUPP); | |
#endif | |
NPError WINAPI NP_Initialize(NPNetscapeFuncs* browserFuncs NPINIT_ARG(pluginFuncs)); | |
NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* pluginFuncs); | |
const char *NP_GetMIMEDescription(); | |
const char *NPP_GetMIMEDescription(); | |
NP_SHUTDOWN_RETURN_TYPE WINAPI NP_Shutdown(void); | |
#ifdef __APPLE_CC__ | |
#pragma export off | |
#endif | |
// Function pointer variables: | |
NPError WINAPI NP_Initialize(NPNetscapeFuncs* browserFuncs NPINIT_ARG(pluginFuncs)) { | |
Debug::log(Debug::Info) << "NP_Initialize (gwt-hosted-mode/c++)"; | |
#ifndef _WINDOWS | |
Debug::log(Debug::Info) << ", pid=" << (unsigned) getpid(); | |
#endif | |
Debug::log(Debug::Info) << Debug::flush; | |
SetNPNFuncs(browserFuncs); | |
browser = &GetNPNFuncs(); | |
#ifdef NPINIT_GETS_ENTRYPOINTS | |
NP_GetEntryPoints(pluginFuncs); | |
#endif | |
return NPERR_NO_ERROR; | |
} | |
#ifdef __APPLE_CC__ | |
int main(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* shutdownUPP) { | |
printf("main (gwt-hosted-mode/c++)\n"); | |
if (shutdownUPP == NULL) { | |
return NPERR_INVALID_FUNCTABLE_ERROR; | |
} | |
*shutdownUPP = NP_Shutdown;//NewNPP_ShutdownProc(NP_Shutdown); | |
NP_Initialize(browserFuncs); | |
NP_GetEntryPoints(pluginFuncs); | |
return NPERR_NO_ERROR; | |
} | |
#endif | |
NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* pluginFuncs) { | |
Debug::log(Debug::Debugging) << "NP_GetEntryPoints" << Debug::flush; | |
#ifdef BROWSER_WEBKIT | |
pluginFuncs->size = sizeof(NPPluginFuncs); | |
#else | |
if (pluginFuncs->size < sizeof(NPPluginFuncs)) { | |
return NPERR_INVALID_FUNCTABLE_ERROR; | |
} | |
#endif | |
pluginFuncs->version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR; | |
#if 1 | |
pluginFuncs->newp = NPP_New; | |
pluginFuncs->destroy = NPP_Destroy; | |
pluginFuncs->setwindow = NPP_SetWindow; | |
pluginFuncs->newstream = NPP_NewStream; | |
pluginFuncs->destroystream = NPP_DestroyStream; | |
pluginFuncs->asfile = NPP_StreamAsFile; | |
pluginFuncs->writeready = NPP_WriteReady; | |
#ifdef BROWSER_WEBKIT | |
pluginFuncs->write = reinterpret_cast<NPP_WriteProcPtr>(NPP_Write); | |
#else | |
pluginFuncs->write = NPP_Write; | |
#endif | |
pluginFuncs->print = NPP_Print; | |
pluginFuncs->event = NPP_HandleEvent; | |
pluginFuncs->urlnotify = NPP_URLNotify; | |
pluginFuncs->getvalue = NPP_GetValue; | |
pluginFuncs->setvalue = NPP_SetValue; | |
pluginFuncs->javaClass = NULL; | |
#else | |
pluginFuncs->newp = NewNPP_NewProc(NPP_New); | |
pluginFuncs->destroy = NewNPP_DestroyProc(NPP_Destroy); | |
pluginFuncs->setwindow = NewNPP_SetWindowProc(NPP_SetWindow); | |
pluginFuncs->newstream = NewNPP_NewStreamProc(NPP_NewStream); | |
pluginFuncs->destroystream = NewNPP_DestroyStreamProc(NPP_DestroyStream); | |
pluginFuncs->asfile = NewNPP_StreamAsFileProc(NPP_StreamAsFile); | |
pluginFuncs->writeready = NewNPP_WriteReadyProc(NPP_WriteReady); | |
pluginFuncs->write = NewNPP_WriteProc(NPP_Write); | |
pluginFuncs->print = NewNPP_PrintProc(NPP_Print); | |
pluginFuncs->event = NewNPP_HandleEventProc(NPP_HandleEvent); | |
pluginFuncs->urlnotify = NewNPP_URLNotifyProc(NPP_URLNotify); | |
pluginFuncs->getvalue = NewNPP_GetValueProc(NPP_GetValue); | |
pluginFuncs->setvalue = NewNPP_SetValueProc(NPP_SetValue); | |
#endif | |
return NPERR_NO_ERROR; | |
} | |
const char *NP_GetMIMEDescription() { | |
Debug::log(Debug::Info) << "NP_GetMIMEDescription: returned mime description" << Debug::flush; | |
return "application/x-gwt-dev-mode::GWT dev-mode plugin;application/x-gwt-hosted-mode::GWT dev-mode plugin"; | |
} | |
const char *NPP_GetMIMEDescription() { | |
return NP_GetMIMEDescription(); | |
} | |
NP_SHUTDOWN_RETURN_TYPE WINAPI NP_Shutdown(void) { | |
Debug::log(Debug::Debugging) << "NP_Shutdown" << Debug::flush; | |
return NP_SHUTDOWN_RETURN(NPERR_NO_ERROR); | |
} | |
NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[], | |
char* argv[], NPSavedData* saved) { | |
Debug::log(Debug::Info) << "NPP_New(instance=" << instance << ",mode=" << mode << ",argc=" | |
<< argc << ",args=["; | |
for (int i = 0; i < argc; ++i) { | |
Debug::log(Debug::Info) << (i ? "," : "") << argn[i] << "=" << argv[i]; | |
} | |
Debug::log(Debug::Info) << "],saved=" << saved << "): version=" << browser->version | |
<< Debug::flush; | |
// Version 14 provides browser->createobject, which we need for npruntime support. | |
if (browser->version < 14) { | |
return NPERR_INVALID_INSTANCE_ERROR; | |
} | |
if (instance == NULL) { | |
return NPERR_INVALID_INSTANCE_ERROR; | |
} | |
Plugin* obj; | |
// if (saved) { | |
// obj = new Plugin(instance, reinterpret_cast<ScriptableInstance*>(saved)); | |
// } else { | |
obj = new Plugin(instance); | |
// } | |
instance->pdata = obj; | |
// Make this a windowless plugin. | |
return NPN_SetValue(instance, NPPVpluginWindowBool, NULL); | |
} | |
NPError NPP_Destroy(NPP instance, NPSavedData** save) { | |
Debug::log(Debug::Info) << "NPP_Destroy(instance=" << instance << ")" << Debug::flush; | |
if (instance == NULL) { | |
return NPERR_INVALID_INSTANCE_ERROR; | |
} | |
Plugin* plugin = static_cast<Plugin*>(instance->pdata); | |
if (plugin) { | |
delete plugin; | |
instance->pdata = 0; | |
} | |
return NPERR_NO_ERROR; | |
} | |
NPError NPP_SetWindow(NPP instance, NPWindow* window) { | |
Debug::log(Debug::Info) << "NPP_SetWindow(instance=" << instance << ",window=" << window | |
<< ")" << Debug::flush; | |
return NPERR_NO_ERROR; | |
} | |
NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype) { | |
Debug::log(Debug::Info) << "NPP_NewStream(instance=" << instance << ")" << Debug::flush; | |
*stype = NP_ASFILEONLY; | |
return NPERR_NO_ERROR; | |
} | |
NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) { | |
Debug::log(Debug::Info) << "NPP_DestroyStream(instance=" << instance << ")" << Debug::flush; | |
return NPERR_NO_ERROR; | |
} | |
int32 NPP_WriteReady(NPP instance, NPStream* stream) { | |
Debug::log(Debug::Info) << "NPP_WriteReady(instance=" << instance << ")" << Debug::flush; | |
return 0; | |
} | |
int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer) { | |
Debug::log(Debug::Info) << "NPP_Write(instance=" << instance << ")" << Debug::flush; | |
return 0; | |
} | |
void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname) { | |
Debug::log(Debug::Info) << "NPP_StreamAsFile(instance=" << instance << ")" << Debug::flush; | |
} | |
void NPP_Print(NPP instance, NPPrint* platformPrint) { | |
Debug::log(Debug::Info) << "NPP_Print(instance=" << instance << ")" << Debug::flush; | |
} | |
int16 NPP_HandleEvent(NPP instance, void* event) { | |
Debug::log(Debug::Info) << "NPP_HandleEvent(instance=" << instance << ")" << Debug::flush; | |
return 1 ; | |
} | |
void NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) { | |
Debug::log(Debug::Info) << "NPP_URLNotify(instance=" << instance << ")" << Debug::flush; | |
} | |
NPObject *NPP_GetScriptableInstance(NPP instance) { | |
Debug::log(Debug::Info) << "NPP_GetScriptableInstance(instance=" << instance << ")" << Debug::flush; | |
if (!instance) { | |
return 0; | |
} | |
Plugin* plugin = static_cast<Plugin*>(instance->pdata); | |
ScriptableInstance* scriptableInstance = plugin->getScriptableInstance(); | |
NPN_RetainObject(scriptableInstance); // caller expects it retained. | |
return scriptableInstance; | |
} | |
NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) { | |
Debug::log(Debug::Info) << "NPP_GetValue(instance=" << instance << ",var=" << variable << ")" | |
<< Debug::flush; | |
switch (variable) { | |
case NPPVpluginScriptableNPObject: | |
// here the plugin is asked by Mozilla to tell if it is scriptable | |
// we should return a valid interface id and a pointer to | |
// nsScriptablePeer interface which we should have implemented | |
// and which should be defined in the corressponding *.xpt file | |
// in the bin/components folder | |
*static_cast<NPObject**>(value) = NPP_GetScriptableInstance(instance); | |
break; | |
default: | |
// pass other ones to the static version of GetValue | |
return NP_GetValue(0, variable, value); | |
} | |
return NPERR_NO_ERROR; | |
} | |
NPError NP_GetValue(void*, NPPVariable variable, void *value) { | |
Debug::log(Debug::Info) << "NP_GetValue(var=" << variable << ")" << Debug::flush; | |
switch (variable) { | |
case NPPVpluginNameString: | |
*static_cast<const char **>(value) = "GWT Development-Mode Plugin"; | |
break; | |
case NPPVpluginDescriptionString: | |
*static_cast<const char **>(value) = "Plugin to enable debugging of Google Web Toolkit " | |
"applications in development mode."; | |
break; | |
default: | |
Debug::log(Debug::Info) << "NPP_GetValue(var=" << variable | |
<< ") -- unexpected variable type" << Debug::flush; | |
return NPERR_GENERIC_ERROR; | |
} | |
return NPERR_NO_ERROR; | |
} | |
NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) { | |
Debug::log(Debug::Info) << "NPP_SetValue(instance=" << instance << ",var=" << variable << ")" | |
<< Debug::flush; | |
return NPERR_NO_ERROR; | |
} | |
} |