From 91a29fa7f7aecbf2f0ce57c0068822b511c3a7fe Mon Sep 17 00:00:00 2001 From: "amusil%netscape.com" Date: Mon, 17 May 1999 21:26:48 +0000 Subject: [PATCH] Updated 4x plugin support on the Mac git-svn-id: svn://10.0.0.236/trunk@31934 18797224-902f-48f8-a5cc-f745e15eee43 --- .../modules/plugin/base/src/ns4xPlugin.cpp | 119 +++++++++++++++--- mozilla/modules/plugin/base/src/ns4xPlugin.h | 22 +++- .../plugin/base/src/ns4xPluginInstance.cpp | 20 ++- .../plugin/base/src/nsPluginHostImpl.cpp | 28 ++++- .../plugin/base/src/nsPluginHostImpl.h | 1 + .../modules/plugin/base/src/nsPluginsDir.h | 1 + .../plugin/base/src/nsPluginsDirMac.cpp | 6 +- mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp | 119 +++++++++++++++--- mozilla/modules/plugin/nglsrc/ns4xPlugin.h | 22 +++- .../plugin/nglsrc/ns4xPluginInstance.cpp | 20 ++- .../plugin/nglsrc/nsPluginHostImpl.cpp | 28 ++++- .../modules/plugin/nglsrc/nsPluginHostImpl.h | 1 + mozilla/modules/plugin/nglsrc/nsPluginsDir.h | 1 + .../modules/plugin/nglsrc/nsPluginsDirMac.cpp | 6 +- 14 files changed, 334 insertions(+), 60 deletions(-) diff --git a/mozilla/modules/plugin/base/src/ns4xPlugin.cpp b/mozilla/modules/plugin/base/src/ns4xPlugin.cpp index 26e95ef2a90..978854f5fcd 100644 --- a/mozilla/modules/plugin/base/src/ns4xPlugin.cpp +++ b/mozilla/modules/plugin/base/src/ns4xPlugin.cpp @@ -25,6 +25,11 @@ #include "nsIServiceManager.h" #include "nsIAllocator.h" #include "nsIPluginStreamListener.h" +#include "nsPluginsDir.h" + +#ifdef XP_MAC +#include +#endif //////////////////////////////////////////////////////////////////////// @@ -115,6 +120,7 @@ ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown, ns ns4xPlugin::~ns4xPlugin(void) { + } @@ -148,6 +154,24 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance) return NS_NOINTERFACE; } +#ifdef XP_MAC +static char* p2cstrdup(StringPtr pstr) +{ + int len = pstr[0]; + char* cstr = new char[len + 1]; + if (cstr != NULL) { + ::BlockMoveData(pstr + 1, cstr, len); + cstr[len] = '\0'; + } + return cstr; +} + +void +ns4xPlugin::SetPluginRefNum(short aRefNum) +{ + fPluginRefNum = aRefNum; +} +#endif //////////////////////////////////////////////////////////////////////// // Static factory method. @@ -161,15 +185,14 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance) */ nsresult -ns4xPlugin::CreatePlugin(PRLibrary *library, - nsIPlugin **result, - nsIServiceManager* serviceMgr) +ns4xPlugin::CreatePlugin(nsPluginTag* pluginTag, nsIServiceManager* serviceMgr) { CheckClassInitialized(); - + +#ifdef XP_PC // XXX this only applies on Windows NP_GETENTRYPOINTS pfnGetEntryPoints = - (NP_GETENTRYPOINTS)PR_FindSymbol(library, "NP_GetEntryPoints"); + (NP_GETENTRYPOINTS)PR_FindSymbol(pluginTag->mLibrary, "NP_GetEntryPoints"); if (pfnGetEntryPoints == NULL) return NS_ERROR_FAILURE; @@ -182,26 +205,26 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, if (pfnGetEntryPoints(&callbacks) != NS_OK) return NS_ERROR_FAILURE; // XXX -#ifdef XP_WIN // XXX This is really XP, but we need to figure out how to do HIBYTE() +#ifdef XP_PC // XXX This is really XP, but we need to figure out how to do HIBYTE() if (HIBYTE(callbacks.version) < NP_VERSION_MAJOR) return NS_ERROR_FAILURE; -#endif +#endif NP_PLUGINSHUTDOWN pfnShutdown = - (NP_PLUGINSHUTDOWN)PR_FindSymbol(library, "NP_Shutdown"); + (NP_PLUGINSHUTDOWN)PR_FindSymbol(pluginTag->mLibrary, "NP_Shutdown"); // create the new plugin handler - *result = new ns4xPlugin(&callbacks, pfnShutdown, serviceMgr); + pluginTag->mEntryPoint = new ns4xPlugin(&callbacks, pfnShutdown, serviceMgr); - NS_ADDREF(*result); - - if (*result == NULL) + if (pluginTag->mEntryPoint == NULL) return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(pluginTag->mEntryPoint); // we must init here because the plugin may call NPN functions // when we call into the NP_Initialize entry point - NPN functions // require that mBrowserManager be set up - (*result)->Initialize(); + pluginTag->mEntryPoint->Initialize(); // the NP_Initialize entry point was misnamed as NP_PluginInit, // early in plugin project development. Its correct name is @@ -210,11 +233,11 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, // we'll accept either name NP_PLUGININIT pfnInitialize = - (NP_PLUGININIT)PR_FindSymbol(library, "NP_Initialize"); + (NP_PLUGININIT)PR_FindSymbol(pluginTag->mLibrary, "NP_Initialize"); if (!pfnInitialize) { pfnInitialize = - (NP_PLUGININIT)PR_FindSymbol(library, "NP_PluginInit"); + (NP_PLUGININIT)PR_FindSymbol(pluginTag->mLibrary, "NP_PluginInit"); } if (pfnInitialize == NULL) @@ -222,6 +245,66 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, if (pfnInitialize(&(ns4xPlugin::CALLBACKS)) != NS_OK) return NS_ERROR_UNEXPECTED; +#endif + +#ifdef XP_MAC + // get the mainRD entry point + NP_MAIN pfnMain = (NP_MAIN) PR_FindSymbol(pluginTag->mLibrary, "mainRD"); + if(pfnMain == NULL) + return NS_ERROR_FAILURE; + + NPP_ShutdownUPP pfnShutdown; + NPPluginFuncs callbacks; + memset((void*) &callbacks, 0, sizeof(callbacks)); + callbacks.size = sizeof(callbacks); + + nsPluginsDir pluginsDir; + if(!pluginsDir.Valid()) + return NS_ERROR_FAILURE; + + short appRefNum = ::CurResFile(); + short pluginRefNum; + for(nsDirectoryIterator iter(pluginsDir); iter.Exists(); iter++) + { + const nsFileSpec& file = iter; + if (pluginsDir.IsPluginFile(file)) + { + FSSpec spec = file; + char* fileName = p2cstrdup(spec.name); + if(!PL_strcmp(fileName, pluginTag->mFileName)) + { + Boolean targetIsFolder, wasAliased; + OSErr err = ::ResolveAliasFile(&spec, true, &targetIsFolder, &wasAliased); + pluginRefNum = ::FSpOpenResFile(&spec, fsRdPerm); + } + } + } + + // call into the entry point + if(CallNPP_MainEntryProc(pfnMain, &(ns4xPlugin::CALLBACKS), &callbacks, &pfnShutdown) != NPERR_NO_ERROR) + return NS_ERROR_FAILURE; + + ::UseResFile(appRefNum); + + if ((callbacks.version >> 8) < NP_VERSION_MAJOR) + return NS_ERROR_FAILURE; + + // create the new plugin handler + ns4xPlugin* plugin = new ns4xPlugin(&callbacks, (NP_PLUGINSHUTDOWN)pfnShutdown, serviceMgr); + + if(plugin == NULL) + return NS_ERROR_OUT_OF_MEMORY; + + plugin->SetPluginRefNum(pluginRefNum); + + pluginTag->mEntryPoint = plugin; + + NS_ADDREF(pluginTag->mEntryPoint); +#endif + +#ifdef XP_UNIX + return NS_ERROR_FAILURE; +#endif return NS_OK; } @@ -288,7 +371,13 @@ ns4xPlugin::Shutdown(void) #ifdef NS_DEBUG printf("shutting down plugin %08x\n", this); #endif +#ifdef XP_MAC + CallNPP_ShutdownProc(fShutdownEntry); + ::CloseResFile(fPluginRefNum); +#else fShutdownEntry(); +#endif + fShutdownEntry = nsnull; } diff --git a/mozilla/modules/plugin/base/src/ns4xPlugin.h b/mozilla/modules/plugin/base/src/ns4xPlugin.h index f7dea6da853..70df7b1b341 100644 --- a/mozilla/modules/plugin/base/src/ns4xPlugin.h +++ b/mozilla/modules/plugin/base/src/ns4xPlugin.h @@ -22,6 +22,7 @@ #include "nsplugin.h" #include "prlink.h" // for PRLibrary #include "npupp.h" +#include "nsPluginHostImpl.h" //////////////////////////////////////////////////////////////////////// @@ -38,9 +39,16 @@ // XXX These are defined in platform specific FE directories right now :-/ +#if defined(XP_PC) || defined(XP_UNIX) typedef NS_CALLBACK_(NPError, NP_GETENTRYPOINTS) (NPPluginFuncs* pCallbacks); typedef NS_CALLBACK_(NPError, NP_PLUGININIT) (const NPNetscapeFuncs* pCallbacks); typedef NS_CALLBACK_(NPError, NP_PLUGINSHUTDOWN) (void); +#endif + +#ifdef XP_MAC +typedef NS_CALLBACK_(NPError, NP_PLUGINSHUTDOWN) (void); +typedef NS_CALLBACK_(NPError, NP_MAIN) (NPNetscapeFuncs* nCallbacks, NPPluginFuncs* pCallbacks, NPP_ShutdownUPP* unloadUpp); +#endif class nsIServiceManager; class nsIAllocator; @@ -99,10 +107,14 @@ public: * and initializes an ns4xPlugin object, and returns it in * result. */ + static nsresult - CreatePlugin(PRLibrary *library, - nsIPlugin **result, - nsIServiceManager* serviceMgr); + CreatePlugin(nsPluginTag* pluginTag, nsIServiceManager* serviceMgr); + +#ifdef XP_MAC + void + SetPluginRefNum(short aRefNum); +#endif protected: /** @@ -212,6 +224,10 @@ protected: #pragma pointers_in_A0 #endif +#ifdef XP_MAC + short fPluginRefNum; +#endif + /** * The plugin-side callbacks that the browser calls. One set of * plugin callbacks for each plugin. diff --git a/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp b/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp index a0b094f14ea..a48f0f7cc3e 100644 --- a/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp +++ b/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp @@ -518,14 +518,28 @@ nsresult ns4xPluginInstance::NewNotifyStream(nsIPluginStreamListener** listener, NS_IMETHODIMP ns4xPluginInstance::Print(nsPluginPrint* platformPrint) { -printf("instance print called\n"); + printf("instance print called\n"); return NS_OK; } NS_IMETHODIMP ns4xPluginInstance::HandleEvent(nsPluginEvent* event, PRBool* handled) { -printf("instance handleevent called\n"); - *handled = PR_FALSE; + printf("instance handleevent called\n"); + PRInt16 res = 0; + + if (fCallbacks->event) + { +#if !TARGET_CARBON +// pinkerton +// relies on routine descriptors, not present in carbon. We need to fix this. + res = CallNPP_HandleEventProc(fCallbacks->event, + &fNPP, + (void*) event->event); +#endif + + *handled = res; + } + return NS_OK; } diff --git a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp index 6bd6c4e4bb8..5d81c36eba8 100644 --- a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp +++ b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp @@ -1325,6 +1325,13 @@ NS_IMETHODIMP nsPluginHostImpl::Destroy(void) { nsPluginTag *plug = mPlugins; + PRUint32 i; + for(i=0; iDestroy(); + } + while (nsnull != plug) { if (nsnull != plug->mEntryPoint) @@ -1456,6 +1463,9 @@ nsresult nsPluginHostImpl::FindStoppedPluginForURL(nsIURL* aURL, nsIPluginInstan { PRUint32 i; const char* url; + if(!aURL) + return NS_ERROR_FAILURE; + (void)aURL->GetSpec(&url); for(i=0; iGetSpec(&url); if(mNumActivePlugins < MAX_ACTIVE_PLUGINS) @@ -1526,12 +1539,16 @@ NS_IMETHODIMP nsPluginHostImpl::SetUpPluginInstance(const char *aMimeType, nsIPlugin* plugin = NULL; const char* mimetype; + + if(!aURL) + return NS_ERROR_FAILURE; + // if don't have a mimetype, check by file extension if(!aMimeType) { const char* filename; char* extension; - + aURL->GetFile(&filename); extension = PL_strrchr(filename, '.'); if(extension) @@ -1546,7 +1563,7 @@ NS_IMETHODIMP nsPluginHostImpl::SetUpPluginInstance(const char *aMimeType, mimetype = aMimeType; - if(GetPluginFactory(mimetype, &plugin) == NS_OK) + if(GetPluginFactory(mimetype, &plugin) == NS_OK) { // instantiate a plugin. nsIPluginInstance* instance = NULL; @@ -1855,11 +1872,9 @@ NS_IMETHODIMP nsPluginHostImpl::GetPluginFactory(const char *aMimeType, nsIPlugi } else { - rv = ns4xPlugin::CreatePlugin(pluginTag->mLibrary, - (nsIPlugin **)&pluginTag->mEntryPoint, - mServiceMgr); + rv = ns4xPlugin::CreatePlugin(pluginTag, mServiceMgr); plugin = pluginTag->mEntryPoint; - pluginTag->mFlags |= NS_PLUGIN_FLAG_OLDSCHOOL; + pluginTag->mFlags |= NS_PLUGIN_FLAG_OLDSCHOOL; // no need to initialize, already done by CreatePlugin() } @@ -1907,6 +1922,7 @@ NS_IMETHODIMP nsPluginHostImpl::LoadPlugins() pluginTag->mMimeTypeArray = info.fMimeTypeArray; pluginTag->mMimeDescriptionArray = info.fMimeDescriptionArray; pluginTag->mExtensionsArray = info.fExtensionArray; + pluginTag->mFileName = info.fFileName; } pluginTag->mLibrary = pluginLibrary; diff --git a/mozilla/modules/plugin/base/src/nsPluginHostImpl.h b/mozilla/modules/plugin/base/src/nsPluginHostImpl.h index e68beff6f9b..1782c170e61 100644 --- a/mozilla/modules/plugin/base/src/nsPluginHostImpl.h +++ b/mozilla/modules/plugin/base/src/nsPluginHostImpl.h @@ -52,6 +52,7 @@ public: PRLibrary *mLibrary; nsIPlugin *mEntryPoint; PRUint32 mFlags; + char *mFileName; }; #define MAX_ACTIVE_PLUGINS 10 diff --git a/mozilla/modules/plugin/base/src/nsPluginsDir.h b/mozilla/modules/plugin/base/src/nsPluginsDir.h index e03b0908fef..25ccdddb2a8 100644 --- a/mozilla/modules/plugin/base/src/nsPluginsDir.h +++ b/mozilla/modules/plugin/base/src/nsPluginsDir.h @@ -55,6 +55,7 @@ struct nsPluginInfo { char** fMimeTypeArray; char** fMimeDescriptionArray; char** fExtensionArray; + char* fFileName; }; /** diff --git a/mozilla/modules/plugin/base/src/nsPluginsDirMac.cpp b/mozilla/modules/plugin/base/src/nsPluginsDirMac.cpp index ae1414e0937..f7b764eb7d2 100644 --- a/mozilla/modules/plugin/base/src/nsPluginsDirMac.cpp +++ b/mozilla/modules/plugin/base/src/nsPluginsDirMac.cpp @@ -74,7 +74,7 @@ PRBool nsPluginsDir::IsPluginFile(const nsFileSpec& fileSpec) const FSSpec& spec = fileSpec; OSErr result = FSpGetFInfo(&spec, &info); if (result == noErr) - return (info.fdType == 'shlb' && info.fdCreator == 'MOSS'); + return ((info.fdType == 'shlb' && info.fdCreator == 'MOSS') || info.fdType == 'NSPL'); return false; } @@ -91,8 +91,7 @@ nsPluginFile::~nsPluginFile() {} */ nsresult nsPluginFile::LoadPlugin(PRLibrary* &outLibrary) { - // How can we convert to a full path names for using with NSPR? - nsFilePath path(*this); + const char* path = this->GetCString(); outLibrary = PR_LoadLibrary(path); return NS_OK; } @@ -154,6 +153,7 @@ nsresult nsPluginFile::GetPluginInfo(nsPluginInfo& info) info.fMimeTypeArray = new char*[variantCount]; info.fMimeDescriptionArray = new char*[variantCount]; info.fExtensionArray = new char*[variantCount]; + info.fFileName = p2cstrdup(spec.name); short mimeIndex = 1, descriptionIndex = 1; for (int i = 0; i < variantCount; i++) { diff --git a/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp b/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp index 26e95ef2a90..978854f5fcd 100644 --- a/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp +++ b/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp @@ -25,6 +25,11 @@ #include "nsIServiceManager.h" #include "nsIAllocator.h" #include "nsIPluginStreamListener.h" +#include "nsPluginsDir.h" + +#ifdef XP_MAC +#include +#endif //////////////////////////////////////////////////////////////////////// @@ -115,6 +120,7 @@ ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown, ns ns4xPlugin::~ns4xPlugin(void) { + } @@ -148,6 +154,24 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance) return NS_NOINTERFACE; } +#ifdef XP_MAC +static char* p2cstrdup(StringPtr pstr) +{ + int len = pstr[0]; + char* cstr = new char[len + 1]; + if (cstr != NULL) { + ::BlockMoveData(pstr + 1, cstr, len); + cstr[len] = '\0'; + } + return cstr; +} + +void +ns4xPlugin::SetPluginRefNum(short aRefNum) +{ + fPluginRefNum = aRefNum; +} +#endif //////////////////////////////////////////////////////////////////////// // Static factory method. @@ -161,15 +185,14 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance) */ nsresult -ns4xPlugin::CreatePlugin(PRLibrary *library, - nsIPlugin **result, - nsIServiceManager* serviceMgr) +ns4xPlugin::CreatePlugin(nsPluginTag* pluginTag, nsIServiceManager* serviceMgr) { CheckClassInitialized(); - + +#ifdef XP_PC // XXX this only applies on Windows NP_GETENTRYPOINTS pfnGetEntryPoints = - (NP_GETENTRYPOINTS)PR_FindSymbol(library, "NP_GetEntryPoints"); + (NP_GETENTRYPOINTS)PR_FindSymbol(pluginTag->mLibrary, "NP_GetEntryPoints"); if (pfnGetEntryPoints == NULL) return NS_ERROR_FAILURE; @@ -182,26 +205,26 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, if (pfnGetEntryPoints(&callbacks) != NS_OK) return NS_ERROR_FAILURE; // XXX -#ifdef XP_WIN // XXX This is really XP, but we need to figure out how to do HIBYTE() +#ifdef XP_PC // XXX This is really XP, but we need to figure out how to do HIBYTE() if (HIBYTE(callbacks.version) < NP_VERSION_MAJOR) return NS_ERROR_FAILURE; -#endif +#endif NP_PLUGINSHUTDOWN pfnShutdown = - (NP_PLUGINSHUTDOWN)PR_FindSymbol(library, "NP_Shutdown"); + (NP_PLUGINSHUTDOWN)PR_FindSymbol(pluginTag->mLibrary, "NP_Shutdown"); // create the new plugin handler - *result = new ns4xPlugin(&callbacks, pfnShutdown, serviceMgr); + pluginTag->mEntryPoint = new ns4xPlugin(&callbacks, pfnShutdown, serviceMgr); - NS_ADDREF(*result); - - if (*result == NULL) + if (pluginTag->mEntryPoint == NULL) return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(pluginTag->mEntryPoint); // we must init here because the plugin may call NPN functions // when we call into the NP_Initialize entry point - NPN functions // require that mBrowserManager be set up - (*result)->Initialize(); + pluginTag->mEntryPoint->Initialize(); // the NP_Initialize entry point was misnamed as NP_PluginInit, // early in plugin project development. Its correct name is @@ -210,11 +233,11 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, // we'll accept either name NP_PLUGININIT pfnInitialize = - (NP_PLUGININIT)PR_FindSymbol(library, "NP_Initialize"); + (NP_PLUGININIT)PR_FindSymbol(pluginTag->mLibrary, "NP_Initialize"); if (!pfnInitialize) { pfnInitialize = - (NP_PLUGININIT)PR_FindSymbol(library, "NP_PluginInit"); + (NP_PLUGININIT)PR_FindSymbol(pluginTag->mLibrary, "NP_PluginInit"); } if (pfnInitialize == NULL) @@ -222,6 +245,66 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, if (pfnInitialize(&(ns4xPlugin::CALLBACKS)) != NS_OK) return NS_ERROR_UNEXPECTED; +#endif + +#ifdef XP_MAC + // get the mainRD entry point + NP_MAIN pfnMain = (NP_MAIN) PR_FindSymbol(pluginTag->mLibrary, "mainRD"); + if(pfnMain == NULL) + return NS_ERROR_FAILURE; + + NPP_ShutdownUPP pfnShutdown; + NPPluginFuncs callbacks; + memset((void*) &callbacks, 0, sizeof(callbacks)); + callbacks.size = sizeof(callbacks); + + nsPluginsDir pluginsDir; + if(!pluginsDir.Valid()) + return NS_ERROR_FAILURE; + + short appRefNum = ::CurResFile(); + short pluginRefNum; + for(nsDirectoryIterator iter(pluginsDir); iter.Exists(); iter++) + { + const nsFileSpec& file = iter; + if (pluginsDir.IsPluginFile(file)) + { + FSSpec spec = file; + char* fileName = p2cstrdup(spec.name); + if(!PL_strcmp(fileName, pluginTag->mFileName)) + { + Boolean targetIsFolder, wasAliased; + OSErr err = ::ResolveAliasFile(&spec, true, &targetIsFolder, &wasAliased); + pluginRefNum = ::FSpOpenResFile(&spec, fsRdPerm); + } + } + } + + // call into the entry point + if(CallNPP_MainEntryProc(pfnMain, &(ns4xPlugin::CALLBACKS), &callbacks, &pfnShutdown) != NPERR_NO_ERROR) + return NS_ERROR_FAILURE; + + ::UseResFile(appRefNum); + + if ((callbacks.version >> 8) < NP_VERSION_MAJOR) + return NS_ERROR_FAILURE; + + // create the new plugin handler + ns4xPlugin* plugin = new ns4xPlugin(&callbacks, (NP_PLUGINSHUTDOWN)pfnShutdown, serviceMgr); + + if(plugin == NULL) + return NS_ERROR_OUT_OF_MEMORY; + + plugin->SetPluginRefNum(pluginRefNum); + + pluginTag->mEntryPoint = plugin; + + NS_ADDREF(pluginTag->mEntryPoint); +#endif + +#ifdef XP_UNIX + return NS_ERROR_FAILURE; +#endif return NS_OK; } @@ -288,7 +371,13 @@ ns4xPlugin::Shutdown(void) #ifdef NS_DEBUG printf("shutting down plugin %08x\n", this); #endif +#ifdef XP_MAC + CallNPP_ShutdownProc(fShutdownEntry); + ::CloseResFile(fPluginRefNum); +#else fShutdownEntry(); +#endif + fShutdownEntry = nsnull; } diff --git a/mozilla/modules/plugin/nglsrc/ns4xPlugin.h b/mozilla/modules/plugin/nglsrc/ns4xPlugin.h index f7dea6da853..70df7b1b341 100644 --- a/mozilla/modules/plugin/nglsrc/ns4xPlugin.h +++ b/mozilla/modules/plugin/nglsrc/ns4xPlugin.h @@ -22,6 +22,7 @@ #include "nsplugin.h" #include "prlink.h" // for PRLibrary #include "npupp.h" +#include "nsPluginHostImpl.h" //////////////////////////////////////////////////////////////////////// @@ -38,9 +39,16 @@ // XXX These are defined in platform specific FE directories right now :-/ +#if defined(XP_PC) || defined(XP_UNIX) typedef NS_CALLBACK_(NPError, NP_GETENTRYPOINTS) (NPPluginFuncs* pCallbacks); typedef NS_CALLBACK_(NPError, NP_PLUGININIT) (const NPNetscapeFuncs* pCallbacks); typedef NS_CALLBACK_(NPError, NP_PLUGINSHUTDOWN) (void); +#endif + +#ifdef XP_MAC +typedef NS_CALLBACK_(NPError, NP_PLUGINSHUTDOWN) (void); +typedef NS_CALLBACK_(NPError, NP_MAIN) (NPNetscapeFuncs* nCallbacks, NPPluginFuncs* pCallbacks, NPP_ShutdownUPP* unloadUpp); +#endif class nsIServiceManager; class nsIAllocator; @@ -99,10 +107,14 @@ public: * and initializes an ns4xPlugin object, and returns it in * result. */ + static nsresult - CreatePlugin(PRLibrary *library, - nsIPlugin **result, - nsIServiceManager* serviceMgr); + CreatePlugin(nsPluginTag* pluginTag, nsIServiceManager* serviceMgr); + +#ifdef XP_MAC + void + SetPluginRefNum(short aRefNum); +#endif protected: /** @@ -212,6 +224,10 @@ protected: #pragma pointers_in_A0 #endif +#ifdef XP_MAC + short fPluginRefNum; +#endif + /** * The plugin-side callbacks that the browser calls. One set of * plugin callbacks for each plugin. diff --git a/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp index a0b094f14ea..a48f0f7cc3e 100644 --- a/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp +++ b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp @@ -518,14 +518,28 @@ nsresult ns4xPluginInstance::NewNotifyStream(nsIPluginStreamListener** listener, NS_IMETHODIMP ns4xPluginInstance::Print(nsPluginPrint* platformPrint) { -printf("instance print called\n"); + printf("instance print called\n"); return NS_OK; } NS_IMETHODIMP ns4xPluginInstance::HandleEvent(nsPluginEvent* event, PRBool* handled) { -printf("instance handleevent called\n"); - *handled = PR_FALSE; + printf("instance handleevent called\n"); + PRInt16 res = 0; + + if (fCallbacks->event) + { +#if !TARGET_CARBON +// pinkerton +// relies on routine descriptors, not present in carbon. We need to fix this. + res = CallNPP_HandleEventProc(fCallbacks->event, + &fNPP, + (void*) event->event); +#endif + + *handled = res; + } + return NS_OK; } diff --git a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp index 6bd6c4e4bb8..5d81c36eba8 100644 --- a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp +++ b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp @@ -1325,6 +1325,13 @@ NS_IMETHODIMP nsPluginHostImpl::Destroy(void) { nsPluginTag *plug = mPlugins; + PRUint32 i; + for(i=0; iDestroy(); + } + while (nsnull != plug) { if (nsnull != plug->mEntryPoint) @@ -1456,6 +1463,9 @@ nsresult nsPluginHostImpl::FindStoppedPluginForURL(nsIURL* aURL, nsIPluginInstan { PRUint32 i; const char* url; + if(!aURL) + return NS_ERROR_FAILURE; + (void)aURL->GetSpec(&url); for(i=0; iGetSpec(&url); if(mNumActivePlugins < MAX_ACTIVE_PLUGINS) @@ -1526,12 +1539,16 @@ NS_IMETHODIMP nsPluginHostImpl::SetUpPluginInstance(const char *aMimeType, nsIPlugin* plugin = NULL; const char* mimetype; + + if(!aURL) + return NS_ERROR_FAILURE; + // if don't have a mimetype, check by file extension if(!aMimeType) { const char* filename; char* extension; - + aURL->GetFile(&filename); extension = PL_strrchr(filename, '.'); if(extension) @@ -1546,7 +1563,7 @@ NS_IMETHODIMP nsPluginHostImpl::SetUpPluginInstance(const char *aMimeType, mimetype = aMimeType; - if(GetPluginFactory(mimetype, &plugin) == NS_OK) + if(GetPluginFactory(mimetype, &plugin) == NS_OK) { // instantiate a plugin. nsIPluginInstance* instance = NULL; @@ -1855,11 +1872,9 @@ NS_IMETHODIMP nsPluginHostImpl::GetPluginFactory(const char *aMimeType, nsIPlugi } else { - rv = ns4xPlugin::CreatePlugin(pluginTag->mLibrary, - (nsIPlugin **)&pluginTag->mEntryPoint, - mServiceMgr); + rv = ns4xPlugin::CreatePlugin(pluginTag, mServiceMgr); plugin = pluginTag->mEntryPoint; - pluginTag->mFlags |= NS_PLUGIN_FLAG_OLDSCHOOL; + pluginTag->mFlags |= NS_PLUGIN_FLAG_OLDSCHOOL; // no need to initialize, already done by CreatePlugin() } @@ -1907,6 +1922,7 @@ NS_IMETHODIMP nsPluginHostImpl::LoadPlugins() pluginTag->mMimeTypeArray = info.fMimeTypeArray; pluginTag->mMimeDescriptionArray = info.fMimeDescriptionArray; pluginTag->mExtensionsArray = info.fExtensionArray; + pluginTag->mFileName = info.fFileName; } pluginTag->mLibrary = pluginLibrary; diff --git a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.h b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.h index e68beff6f9b..1782c170e61 100644 --- a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.h +++ b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.h @@ -52,6 +52,7 @@ public: PRLibrary *mLibrary; nsIPlugin *mEntryPoint; PRUint32 mFlags; + char *mFileName; }; #define MAX_ACTIVE_PLUGINS 10 diff --git a/mozilla/modules/plugin/nglsrc/nsPluginsDir.h b/mozilla/modules/plugin/nglsrc/nsPluginsDir.h index e03b0908fef..25ccdddb2a8 100644 --- a/mozilla/modules/plugin/nglsrc/nsPluginsDir.h +++ b/mozilla/modules/plugin/nglsrc/nsPluginsDir.h @@ -55,6 +55,7 @@ struct nsPluginInfo { char** fMimeTypeArray; char** fMimeDescriptionArray; char** fExtensionArray; + char* fFileName; }; /** diff --git a/mozilla/modules/plugin/nglsrc/nsPluginsDirMac.cpp b/mozilla/modules/plugin/nglsrc/nsPluginsDirMac.cpp index ae1414e0937..f7b764eb7d2 100644 --- a/mozilla/modules/plugin/nglsrc/nsPluginsDirMac.cpp +++ b/mozilla/modules/plugin/nglsrc/nsPluginsDirMac.cpp @@ -74,7 +74,7 @@ PRBool nsPluginsDir::IsPluginFile(const nsFileSpec& fileSpec) const FSSpec& spec = fileSpec; OSErr result = FSpGetFInfo(&spec, &info); if (result == noErr) - return (info.fdType == 'shlb' && info.fdCreator == 'MOSS'); + return ((info.fdType == 'shlb' && info.fdCreator == 'MOSS') || info.fdType == 'NSPL'); return false; } @@ -91,8 +91,7 @@ nsPluginFile::~nsPluginFile() {} */ nsresult nsPluginFile::LoadPlugin(PRLibrary* &outLibrary) { - // How can we convert to a full path names for using with NSPR? - nsFilePath path(*this); + const char* path = this->GetCString(); outLibrary = PR_LoadLibrary(path); return NS_OK; } @@ -154,6 +153,7 @@ nsresult nsPluginFile::GetPluginInfo(nsPluginInfo& info) info.fMimeTypeArray = new char*[variantCount]; info.fMimeDescriptionArray = new char*[variantCount]; info.fExtensionArray = new char*[variantCount]; + info.fFileName = p2cstrdup(spec.name); short mimeIndex = 1, descriptionIndex = 1; for (int i = 0; i < variantCount; i++) {