| /* | |
| * 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; | |
| } | |
| } |