| /* | 
 |  *  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" | 
 |  | 
 | #ifdef _WINDOWS | 
 | #include <windows.h> | 
 | BOOL APIENTRY DllMain(HMODULE hModule, DWORD ulReasonForCall, LPVOID lpReserved) { | 
 |   switch (ulReasonForCall) { | 
 |     case DLL_PROCESS_ATTACH: | 
 |       DisableThreadLibraryCalls(hModule); | 
 |       break; | 
 |     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-dev-plugin/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::Spam) << "NPP_HandleEvent(instance=" << instance << ")" << Debug::flush; | 
 |     return 0 ; | 
 |   } | 
 |  | 
 |   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; | 
 |   } | 
 | } |