Add support for loading cfm plugins in OSX mach-o builds.

Changes backported from the CHIMERA_M1_0_1_BRANCH branch.
Bug #155256 r=peterl sr=sfraser


git-svn-id: svn://10.0.0.236/trunk@133054 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
seawood%netscape.com
2002-11-06 01:24:57 +00:00
parent a4274ab9cb
commit 8ae058aa20
14 changed files with 718 additions and 417 deletions

View File

@@ -60,7 +60,7 @@
#include "nsIDocument.h"
#include "nsIScriptGlobalObject.h"
#ifdef XP_MAC
#if defined(XP_MAC) || defined(XP_MACOSX)
#include <Resources.h>
#endif
@@ -204,6 +204,44 @@ PR_BEGIN_EXTERN_C
PR_END_EXTERN_C
#ifdef XP_MACOSX
static void* TV2FP(void *tvp)
{
static uint32 glue[6] = { 0x3D800000, 0x618C0000, 0x800C0000, 0x804C0004, 0x7C0903A6, 0x4E800420 };
uint32* newGlue = NULL;
if (tvp != NULL) {
newGlue = (uint32*) malloc(sizeof(glue));
if (newGlue != NULL) {
memcpy(newGlue, glue, sizeof(glue));
newGlue[0] |= ((UInt32)tvp >> 16);
newGlue[1] |= ((UInt32)tvp & 0xFFFF);
MakeDataExecutable(newGlue, sizeof(glue));
}
}
return newGlue;
}
static void* FP2TV(void *fp)
{
void **newGlue = NULL;
if (fp != NULL) {
newGlue = (void**) malloc(2 * sizeof(void *));
if (newGlue != NULL) {
newGlue[0] = fp;
newGlue[1] = NULL;
}
}
return newGlue;
}
#else
#define TV2FP(f) (f)
#define FP2TV(f) (f)
#endif /* XP_MACOSX */
////////////////////////////////////////////////////////////////////////
// Globals
@@ -224,27 +262,27 @@ ns4xPlugin::CheckClassInitialized(void)
CALLBACKS.size = sizeof(CALLBACKS);
CALLBACKS.version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
CALLBACKS.geturl = NewNPN_GetURLProc(_geturl);
CALLBACKS.posturl = NewNPN_PostURLProc(_posturl);
CALLBACKS.requestread = NewNPN_RequestReadProc(_requestread);
CALLBACKS.newstream = NewNPN_NewStreamProc(_newstream);
CALLBACKS.write = NewNPN_WriteProc(_write);
CALLBACKS.destroystream = NewNPN_DestroyStreamProc(_destroystream);
CALLBACKS.status = NewNPN_StatusProc(_status);
CALLBACKS.uagent = NewNPN_UserAgentProc(_useragent);
CALLBACKS.memalloc = NewNPN_MemAllocProc(_memalloc);
CALLBACKS.memfree = NewNPN_MemFreeProc(_memfree);
CALLBACKS.memflush = NewNPN_MemFlushProc(_memflush);
CALLBACKS.reloadplugins = NewNPN_ReloadPluginsProc(_reloadplugins);
CALLBACKS.getJavaEnv = NewNPN_GetJavaEnvProc(_getJavaEnv);
CALLBACKS.getJavaPeer = NewNPN_GetJavaPeerProc(_getJavaPeer);
CALLBACKS.geturlnotify = NewNPN_GetURLNotifyProc(_geturlnotify);
CALLBACKS.posturlnotify = NewNPN_PostURLNotifyProc(_posturlnotify);
CALLBACKS.getvalue = NewNPN_GetValueProc(_getvalue);
CALLBACKS.setvalue = NewNPN_SetValueProc(_setvalue);
CALLBACKS.invalidaterect = NewNPN_InvalidateRectProc(_invalidaterect);
CALLBACKS.invalidateregion = NewNPN_InvalidateRegionProc(_invalidateregion);
CALLBACKS.forceredraw = NewNPN_ForceRedrawProc(_forceredraw);
CALLBACKS.geturl = NewNPN_GetURLProc(FP2TV(_geturl));
CALLBACKS.posturl = NewNPN_PostURLProc(FP2TV(_posturl));
CALLBACKS.requestread = NewNPN_RequestReadProc(FP2TV(_requestread));
CALLBACKS.newstream = NewNPN_NewStreamProc(FP2TV(_newstream));
CALLBACKS.write = NewNPN_WriteProc(FP2TV(_write));
CALLBACKS.destroystream = NewNPN_DestroyStreamProc(FP2TV(_destroystream));
CALLBACKS.status = NewNPN_StatusProc(FP2TV(_status));
CALLBACKS.uagent = NewNPN_UserAgentProc(FP2TV(_useragent));
CALLBACKS.memalloc = NewNPN_MemAllocProc(FP2TV(_memalloc));
CALLBACKS.memfree = NewNPN_MemFreeProc(FP2TV(_memfree));
CALLBACKS.memflush = NewNPN_MemFlushProc(FP2TV(_memflush));
CALLBACKS.reloadplugins = NewNPN_ReloadPluginsProc(FP2TV(_reloadplugins));
CALLBACKS.getJavaEnv = NewNPN_GetJavaEnvProc(FP2TV(_getJavaEnv));
CALLBACKS.getJavaPeer = NewNPN_GetJavaPeerProc(FP2TV(_getJavaPeer));
CALLBACKS.geturlnotify = NewNPN_GetURLNotifyProc(FP2TV(_geturlnotify));
CALLBACKS.posturlnotify = NewNPN_PostURLNotifyProc(FP2TV(_posturlnotify));
CALLBACKS.getvalue = NewNPN_GetValueProc(FP2TV(_getvalue));
CALLBACKS.setvalue = NewNPN_SetValueProc(FP2TV(_setvalue));
CALLBACKS.invalidaterect = NewNPN_InvalidateRectProc(FP2TV(_invalidaterect));
CALLBACKS.invalidateregion = NewNPN_InvalidateRegionProc(FP2TV(_invalidateregion));
CALLBACKS.forceredraw = NewNPN_ForceRedrawProc(FP2TV(_forceredraw));
initialized = TRUE;
@@ -300,6 +338,52 @@ ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, PRLibrary* aLibrary, NP_PLUGINS
if(error != NPERR_NO_ERROR || ((fCallbacks.version >> 8) < NP_VERSION_MAJOR))
return;
#elif defined(XP_MACOSX) || (defined(XP_MAC) && TARGET_CARBON)
// call into the entry point
NP_MAIN pfnMain = (NP_MAIN) PR_FindSymbol(aLibrary, "main");
if(pfnMain == NULL)
return;
NPP_ShutdownUPP pfnShutdown;
NPPluginFuncs np_callbacks;
memset((void*) &np_callbacks, 0, sizeof(np_callbacks));
np_callbacks.size = sizeof(np_callbacks);
NPError error;
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_MainEntryProc(pfnMain,
&(ns4xPlugin::CALLBACKS),
&np_callbacks,
&pfnShutdown), aLibrary, nsnull);
NPP_PLUGIN_LOG(PLUGIN_LOG_BASIC, ("NPP MainEntryProc called: return=%d\n",error));
if(error != NPERR_NO_ERROR)
return;
// version is a uint16 so cast to int to avoid an invalid
// comparison due to limited range of the data type
int cb_version = np_callbacks.version;
if ((cb_version >> 8) < NP_VERSION_MAJOR)
return;
// wrap all plugin entry points tvectors as mach-o callable function pointers.
fCallbacks.size = sizeof(fCallbacks);
fCallbacks.version = np_callbacks.version;
fCallbacks.newp = (NPP_NewUPP) TV2FP(np_callbacks.newp);
fCallbacks.destroy = (NPP_DestroyUPP) TV2FP(np_callbacks.destroy);
fCallbacks.setwindow = (NPP_SetWindowUPP) TV2FP(np_callbacks.setwindow);
fCallbacks.newstream = (NPP_NewStreamUPP) TV2FP(np_callbacks.newstream);
fCallbacks.destroystream = (NPP_DestroyStreamUPP) TV2FP(np_callbacks.destroystream);
fCallbacks.asfile = (NPP_StreamAsFileUPP) TV2FP(np_callbacks.asfile);
fCallbacks.writeready = (NPP_WriteReadyUPP) TV2FP(np_callbacks.writeready);
fCallbacks.write = (NPP_WriteUPP) TV2FP(np_callbacks.write);
fCallbacks.print = (NPP_PrintUPP) TV2FP(np_callbacks.print);
fCallbacks.event = (NPP_HandleEventUPP) TV2FP(np_callbacks.event);
fCallbacks.urlnotify = (NPP_URLNotifyUPP) TV2FP(np_callbacks.urlnotify);
fCallbacks.getvalue = (NPP_GetValueUPP) TV2FP(np_callbacks.getvalue);
fCallbacks.setvalue = (NPP_SetValueUPP) TV2FP(np_callbacks.setvalue);
fShutdownEntry = (NP_PLUGINSHUTDOWN) TV2FP(pfnShutdown);
#else // for everyone else
memcpy((void*) &fCallbacks, (void*) callbacks, sizeof(fCallbacks));
fShutdownEntry = aShutdown;
@@ -313,6 +397,33 @@ ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, PRLibrary* aLibrary, NP_PLUGINS
ns4xPlugin::~ns4xPlugin(void)
{
//reset the callbacks list
#if defined(XP_MACOSX)
// release all wrapped plugin entry points.
if (fCallbacks.newp)
free(fCallbacks.newp);
if (fCallbacks.destroy)
free(fCallbacks.destroy);
if (fCallbacks.setwindow)
free(fCallbacks.setwindow);
if (fCallbacks.newstream)
free(fCallbacks.newstream);
if (fCallbacks.asfile)
free(fCallbacks.asfile);
if (fCallbacks.writeready)
free(fCallbacks.writeready);
if (fCallbacks.write)
free(fCallbacks.write);
if (fCallbacks.print)
free(fCallbacks.print);
if (fCallbacks.event)
free(fCallbacks.event);
if (fCallbacks.urlnotify)
free(fCallbacks.urlnotify);
if (fCallbacks.getvalue)
free(fCallbacks.getvalue);
if (fCallbacks.setvalue)
free(fCallbacks.setvalue);
#endif
memset((void*) &fCallbacks, 0, sizeof(fCallbacks));
}
@@ -324,19 +435,7 @@ void ns4xPlugin::ReleaseStatics()
}
#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;
}
#if defined(XP_MAC) || defined(XP_MACOSX)
////////////////////////////////////////////////////////////////////////
void ns4xPlugin::SetPluginRefNum(short aRefNum)
{
@@ -368,7 +467,7 @@ ns4xPlugin::CreatePlugin(nsIServiceManagerObsolete* aServiceMgr,
aServiceMgr->GetService(kMemoryCID, kIMemoryIID, (nsISupports**)&gMalloc);
}
#ifdef XP_UNIX
#if defined(XP_UNIX) && !defined(XP_MACOSX)
ns4xPlugin *plptr;
@@ -549,7 +648,7 @@ ns4xPlugin::CreatePlugin(nsIServiceManagerObsolete* aServiceMgr,
}
#endif
#if defined(XP_MAC)
#if defined(XP_MAC) || defined(XP_MACOSX)
short appRefNum = ::CurResFile();
short pluginRefNum;
@@ -559,37 +658,7 @@ ns4xPlugin::CreatePlugin(nsIServiceManagerObsolete* aServiceMgr,
if (pluginRefNum == -1)
return NS_ERROR_FAILURE;
#if TARGET_CARBON
// call into the entry point
NP_MAIN pfnMain = (NP_MAIN) PR_FindSymbol(aLibrary, "main");
if(pfnMain == NULL)
return NS_ERROR_FAILURE;
NPP_ShutdownUPP pfnShutdown;
NPPluginFuncs callbacks;
memset((void*) &callbacks, 0, sizeof(callbacks));
callbacks.size = sizeof(callbacks);
NPError error;
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_MainEntryProc(pfnMain,
&(ns4xPlugin::CALLBACKS),
&callbacks,
&pfnShutdown), fLibrary, nsnull);
NPP_PLUGIN_LOG(PLUGIN_LOG_BASIC, ("NPP MainEntryProc called: return=%d\n",error));
if(error != NPERR_NO_ERROR)
return NS_ERROR_FAILURE;
if ((callbacks.version >> 8) < NP_VERSION_MAJOR)
return NS_ERROR_FAILURE;
// create the new plugin handler
ns4xPlugin* plugin = new ns4xPlugin(&callbacks, aLibrary, (NP_PLUGINSHUTDOWN)pfnShutdown, aServiceMgr);
#else // not carbon
ns4xPlugin* plugin = new ns4xPlugin(nsnull, aLibrary, nsnull, aServiceMgr);
#endif
if(plugin == NULL)
return NS_ERROR_OUT_OF_MEMORY;
@@ -603,7 +672,7 @@ ns4xPlugin::CreatePlugin(nsIServiceManagerObsolete* aServiceMgr,
}
plugin->SetPluginRefNum(pluginRefNum);
#endif // XP_MAC
#endif // XP_MAC || XP_MACOSX
#ifdef XP_BEOS
// I just copied UNIX version.
@@ -711,13 +780,17 @@ ns4xPlugin::Shutdown(void)
NPP_PLUGIN_LOG(PLUGIN_LOG_BASIC, ("NPP Shutdown to be called: this=%p\n",this));
if (nsnull != fShutdownEntry) {
#ifdef XP_MAC
#if defined(XP_MAC) || defined(XP_MACOSX)
CallNPP_ShutdownProc(fShutdownEntry);
::CloseResFile(fPluginRefNum);
#else
NS_TRY_SAFE_CALL_VOID(fShutdownEntry(), fLibrary, nsnull);
#endif
#if defined(XP_MACOSX)
// release the wrapped plugin function.
free(fShutdownEntry);
#endif
fShutdownEntry = nsnull;
}
@@ -730,9 +803,9 @@ ns4xPlugin::Shutdown(void)
nsresult
ns4xPlugin::GetMIMEDescription(const char* *resultingDesc)
{
const char* (*npGetMIMEDescrpition)() = (const char* (*)()) PR_FindSymbol(fLibrary, "NP_GetMIMEDescription");
const char* (*npGetMIMEDescription)() = (const char* (*)()) PR_FindSymbol(fLibrary, "NP_GetMIMEDescription");
*resultingDesc = npGetMIMEDescrpition ? npGetMIMEDescrpition() : "";
*resultingDesc = npGetMIMEDescription ? npGetMIMEDescription() : "";
PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("ns4xPlugin::GetMIMEDescription called: this=%p, result=%s\n",this, *resultingDesc));
@@ -1148,7 +1221,7 @@ _getvalue(NPP npp, NPNVariable variable, void *result)
nsresult res;
switch(variable) {
#ifdef XP_UNIX
#if defined(XP_UNIX) && !defined(XP_MACOSX)
case NPNVxDisplay : {
#if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_GTK2)
// adobe nppdf calls XtGetApplicationNameAndClass(display, &instance, &class)