Build the default plugin as Mach-O, in a way that works in objdir builds. r=cls, sr=bryner, bug 179863.
git-svn-id: svn://10.0.0.236/trunk@140722 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -4,6 +4,8 @@
|
||||
//
|
||||
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <Processes.h>
|
||||
#include <Gestalt.h>
|
||||
#include <CodeFragments.h>
|
||||
@@ -22,7 +24,7 @@
|
||||
// A4Stuff does not exist as of CW 7. Define them to nothing.
|
||||
//
|
||||
|
||||
#if defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
|
||||
#if (defined(__MWERKS__) && (__MWERKS__ >= 0x2400)) || defined(__GNUC__)
|
||||
#define EnterCodeResource()
|
||||
#define ExitCodeResource()
|
||||
#else
|
||||
@@ -55,7 +57,7 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// The following fix for static initializers (which fixes a preious
|
||||
// The following fix for static initializers (which fixes a previous
|
||||
// incompatibility with some parts of PowerPlant, was submitted by
|
||||
// Jan Ulbrich.
|
||||
#ifdef __MWERKS__
|
||||
@@ -78,7 +80,7 @@
|
||||
// Define PLUGIN_TRACE to 1 to have the wrapper functions emit
|
||||
// DebugStr messages whenever they are called.
|
||||
//
|
||||
#define PLUGIN_TRACE 0
|
||||
//#define PLUGIN_TRACE 1
|
||||
|
||||
#if PLUGIN_TRACE
|
||||
#define PLUGINDEBUGSTR(msg) ::DebugStr(msg)
|
||||
@@ -87,8 +89,91 @@
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef XP_MACOSX
|
||||
|
||||
// glue for mapping outgoing Macho function pointers to TVectors
|
||||
struct TFPtoTVGlue{
|
||||
void* glue[2];
|
||||
};
|
||||
|
||||
struct {
|
||||
TFPtoTVGlue newp;
|
||||
TFPtoTVGlue destroy;
|
||||
TFPtoTVGlue setwindow;
|
||||
TFPtoTVGlue newstream;
|
||||
TFPtoTVGlue destroystream;
|
||||
TFPtoTVGlue asfile;
|
||||
TFPtoTVGlue writeready;
|
||||
TFPtoTVGlue write;
|
||||
TFPtoTVGlue print;
|
||||
TFPtoTVGlue event;
|
||||
TFPtoTVGlue urlnotify;
|
||||
TFPtoTVGlue getvalue;
|
||||
TFPtoTVGlue setvalue;
|
||||
|
||||
TFPtoTVGlue shutdown;
|
||||
} gPluginFuncsGlueTable;
|
||||
|
||||
static inline void* SetupFPtoTVGlue(TFPtoTVGlue* functionGlue, void* fp)
|
||||
{
|
||||
functionGlue->glue[0] = fp;
|
||||
functionGlue->glue[1] = 0;
|
||||
return functionGlue;
|
||||
}
|
||||
|
||||
#define PLUGIN_TO_HOST_GLUE(name, fp) (SetupFPtoTVGlue(&gPluginFuncsGlueTable.name, (void*)fp))
|
||||
|
||||
// glue for mapping netscape TVectors to Macho function pointers
|
||||
struct TTVtoFPGlue {
|
||||
uint32 glue[6];
|
||||
};
|
||||
|
||||
struct {
|
||||
TTVtoFPGlue geturl;
|
||||
TTVtoFPGlue posturl;
|
||||
TTVtoFPGlue requestread;
|
||||
TTVtoFPGlue newstream;
|
||||
TTVtoFPGlue write;
|
||||
TTVtoFPGlue destroystream;
|
||||
TTVtoFPGlue status;
|
||||
TTVtoFPGlue uagent;
|
||||
TTVtoFPGlue memalloc;
|
||||
TTVtoFPGlue memfree;
|
||||
TTVtoFPGlue memflush;
|
||||
TTVtoFPGlue reloadplugins;
|
||||
TTVtoFPGlue getJavaEnv;
|
||||
TTVtoFPGlue getJavaPeer;
|
||||
TTVtoFPGlue geturlnotify;
|
||||
TTVtoFPGlue posturlnotify;
|
||||
TTVtoFPGlue getvalue;
|
||||
TTVtoFPGlue setvalue;
|
||||
TTVtoFPGlue invalidaterect;
|
||||
TTVtoFPGlue invalidateregion;
|
||||
TTVtoFPGlue forceredraw;
|
||||
} gNetscapeFuncsGlueTable;
|
||||
|
||||
static void* SetupTVtoFPGlue(TTVtoFPGlue* functionGlue, void* tvp)
|
||||
{
|
||||
static const TTVtoFPGlue glueTemplate = { 0x3D800000, 0x618C0000, 0x800C0000, 0x804C0004, 0x7C0903A6, 0x4E800420 };
|
||||
|
||||
memcpy(functionGlue, &glueTemplate, sizeof(TTVtoFPGlue));
|
||||
functionGlue->glue[0] |= ((UInt32)tvp >> 16);
|
||||
functionGlue->glue[1] |= ((UInt32)tvp & 0xFFFF);
|
||||
::MakeDataExecutable(functionGlue, sizeof(TTVtoFPGlue));
|
||||
return functionGlue;
|
||||
}
|
||||
|
||||
#define HOST_TO_PLUGIN_GLUE(name, fp) (SetupTVtoFPGlue(&gNetscapeFuncsGlueTable.name, (void*)fp))
|
||||
|
||||
#else
|
||||
|
||||
#define PLUGIN_TO_HOST_GLUE(name, fp) (fp)
|
||||
#define HOST_TO_PLUGIN_GLUE(name, fp) (fp)
|
||||
|
||||
#endif /* XP_MACOSX */
|
||||
|
||||
|
||||
#pragma mark -
|
||||
|
||||
|
||||
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
@@ -103,7 +188,6 @@ QDGlobals* gQDPtr; // Pointer to Netscape
|
||||
short gResFile; // Refnum of the pluginÕs resource file
|
||||
NPNetscapeFuncs gNetscapeFuncs; // Function table for procs in Netscape called by plugin
|
||||
|
||||
|
||||
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
//
|
||||
// Wrapper functions for all calls from the plugin to Netscape.
|
||||
@@ -284,6 +368,8 @@ void NPN_ForceRedraw(NPP instance)
|
||||
CallNPN_ForceRedrawProc( gNetscapeFuncs.forceredraw, instance);
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
//
|
||||
// Wrapper functions for all calls from Netscape to the plugin.
|
||||
@@ -326,7 +412,9 @@ void Private_Shutdown(void)
|
||||
PLUGINDEBUGSTR("\pShutdown;g;");
|
||||
NPP_Shutdown();
|
||||
|
||||
#ifdef __MWERKS__
|
||||
__destroy_global_chain();
|
||||
#endif
|
||||
|
||||
ExitCodeResource();
|
||||
}
|
||||
@@ -456,8 +544,16 @@ jobject Private_GetJavaClass(void)
|
||||
void SetUpQD(void);
|
||||
void SetUpQD(void)
|
||||
{
|
||||
#if !TARGET_API_MAC_CARBON
|
||||
ProcessSerialNumber PSN;
|
||||
FSSpec myFSSpec;
|
||||
Str63 name;
|
||||
ProcessInfoRec infoRec;
|
||||
OSErr result = noErr;
|
||||
|
||||
CFragConnectionID connID;
|
||||
Str255 errName;
|
||||
#endif
|
||||
|
||||
//
|
||||
// Memorize the pluginÕs resource file
|
||||
// refnum for later use.
|
||||
@@ -540,8 +636,12 @@ void SetUpQD(void)
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef __GNUC__
|
||||
// gcc requires that main have an 'int' return type
|
||||
int main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp);
|
||||
#else
|
||||
NPError main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp);
|
||||
#endif
|
||||
|
||||
#if !TARGET_API_MAC_CARBON
|
||||
#pragma export on
|
||||
@@ -551,12 +651,18 @@ RoutineDescriptor mainRD = BUILD_ROUTINE_DESCRIPTOR(uppNPP_MainEntryProcInfo, ma
|
||||
#pragma export off
|
||||
#endif /* !TARGET_API_MAC_CARBON */
|
||||
|
||||
#ifdef __GNUC__
|
||||
DEFINE_API_C(int) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp)
|
||||
#else
|
||||
DEFINE_API_C(NPError) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp)
|
||||
#endif
|
||||
{
|
||||
EnterCodeResource();
|
||||
PLUGINDEBUGSTR("\pmain");
|
||||
|
||||
#ifdef __MWERKS__
|
||||
__InitCode__();
|
||||
#endif
|
||||
|
||||
NPError err = NPERR_NO_ERROR;
|
||||
|
||||
@@ -592,62 +698,63 @@ DEFINE_API_C(NPError) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs,
|
||||
|
||||
int navMinorVers = nsTable->version & 0xFF;
|
||||
|
||||
gNetscapeFuncs.version = nsTable->version;
|
||||
gNetscapeFuncs.size = nsTable->size;
|
||||
gNetscapeFuncs.posturl = nsTable->posturl;
|
||||
gNetscapeFuncs.geturl = nsTable->geturl;
|
||||
gNetscapeFuncs.requestread = nsTable->requestread;
|
||||
gNetscapeFuncs.newstream = nsTable->newstream;
|
||||
gNetscapeFuncs.write = nsTable->write;
|
||||
gNetscapeFuncs.destroystream = nsTable->destroystream;
|
||||
gNetscapeFuncs.status = nsTable->status;
|
||||
gNetscapeFuncs.uagent = nsTable->uagent;
|
||||
gNetscapeFuncs.memalloc = nsTable->memalloc;
|
||||
gNetscapeFuncs.memfree = nsTable->memfree;
|
||||
gNetscapeFuncs.memflush = nsTable->memflush;
|
||||
gNetscapeFuncs.reloadplugins = nsTable->reloadplugins;
|
||||
gNetscapeFuncs.version = nsTable->version;
|
||||
gNetscapeFuncs.size = nsTable->size;
|
||||
gNetscapeFuncs.posturl = (NPN_PostURLUPP)HOST_TO_PLUGIN_GLUE(posturl, nsTable->posturl);
|
||||
gNetscapeFuncs.geturl = (NPN_GetURLUPP)HOST_TO_PLUGIN_GLUE(geturl, nsTable->geturl);
|
||||
gNetscapeFuncs.requestread = (NPN_RequestReadUPP)HOST_TO_PLUGIN_GLUE(requestread, nsTable->requestread);
|
||||
gNetscapeFuncs.newstream = (NPN_NewStreamUPP)HOST_TO_PLUGIN_GLUE(newstream, nsTable->newstream);
|
||||
gNetscapeFuncs.write = (NPN_WriteUPP)HOST_TO_PLUGIN_GLUE(write, nsTable->write);
|
||||
gNetscapeFuncs.destroystream = (NPN_DestroyStreamUPP)HOST_TO_PLUGIN_GLUE(destroystream, nsTable->destroystream);
|
||||
gNetscapeFuncs.status = (NPN_StatusUPP)HOST_TO_PLUGIN_GLUE(status, nsTable->status);
|
||||
gNetscapeFuncs.uagent = (NPN_UserAgentUPP)HOST_TO_PLUGIN_GLUE(uagent, nsTable->uagent);
|
||||
gNetscapeFuncs.memalloc = (NPN_MemAllocUPP)HOST_TO_PLUGIN_GLUE(memalloc, nsTable->memalloc);
|
||||
gNetscapeFuncs.memfree = (NPN_MemFreeUPP)HOST_TO_PLUGIN_GLUE(memfree, nsTable->memfree);
|
||||
gNetscapeFuncs.memflush = (NPN_MemFlushUPP)HOST_TO_PLUGIN_GLUE(memflush, nsTable->memflush);
|
||||
gNetscapeFuncs.reloadplugins = (NPN_ReloadPluginsUPP)HOST_TO_PLUGIN_GLUE(reloadplugins, nsTable->reloadplugins);
|
||||
if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
|
||||
{
|
||||
gNetscapeFuncs.getJavaEnv = nsTable->getJavaEnv;
|
||||
gNetscapeFuncs.getJavaPeer = nsTable->getJavaPeer;
|
||||
gNetscapeFuncs.getJavaEnv = (NPN_GetJavaEnvUPP)HOST_TO_PLUGIN_GLUE(getJavaEnv, nsTable->getJavaEnv);
|
||||
gNetscapeFuncs.getJavaPeer = (NPN_GetJavaPeerUPP)HOST_TO_PLUGIN_GLUE(getJavaPeer, nsTable->getJavaPeer);
|
||||
}
|
||||
if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
|
||||
{
|
||||
gNetscapeFuncs.geturlnotify = nsTable->geturlnotify;
|
||||
gNetscapeFuncs.posturlnotify = nsTable->posturlnotify;
|
||||
gNetscapeFuncs.geturlnotify = (NPN_GetURLNotifyUPP)HOST_TO_PLUGIN_GLUE(geturlnotify, nsTable->geturlnotify);
|
||||
gNetscapeFuncs.posturlnotify = (NPN_PostURLNotifyUPP)HOST_TO_PLUGIN_GLUE(posturlnotify, nsTable->posturlnotify);
|
||||
}
|
||||
gNetscapeFuncs.getvalue = nsTable->getvalue;
|
||||
gNetscapeFuncs.setvalue = nsTable->setvalue;
|
||||
gNetscapeFuncs.invalidaterect = nsTable->invalidaterect;
|
||||
gNetscapeFuncs.invalidateregion = nsTable->invalidateregion;
|
||||
gNetscapeFuncs.forceredraw = nsTable->forceredraw;
|
||||
gNetscapeFuncs.getvalue = (NPN_GetValueUPP)HOST_TO_PLUGIN_GLUE(getvalue, nsTable->getvalue);
|
||||
gNetscapeFuncs.setvalue = (NPN_SetValueUPP)HOST_TO_PLUGIN_GLUE(setvalue, nsTable->setvalue);
|
||||
gNetscapeFuncs.invalidaterect = (NPN_InvalidateRectUPP)HOST_TO_PLUGIN_GLUE(invalidaterect, nsTable->invalidaterect);
|
||||
gNetscapeFuncs.invalidateregion = (NPN_InvalidateRegionUPP)HOST_TO_PLUGIN_GLUE(invalidateregion, nsTable->invalidateregion);
|
||||
gNetscapeFuncs.forceredraw = (NPN_ForceRedrawUPP)HOST_TO_PLUGIN_GLUE(forceredraw, nsTable->forceredraw);
|
||||
|
||||
//
|
||||
// Set up the plugin function table that Netscape will use to
|
||||
// call us. Netscape needs to know about our version and size
|
||||
// and have a UniversalProcPointer for every function we implement.
|
||||
//
|
||||
pluginFuncs->version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
|
||||
pluginFuncs->size = sizeof(NPPluginFuncs);
|
||||
pluginFuncs->newp = NewNPP_NewProc(Private_New);
|
||||
pluginFuncs->destroy = NewNPP_DestroyProc(Private_Destroy);
|
||||
pluginFuncs->setwindow = NewNPP_SetWindowProc(Private_SetWindow);
|
||||
pluginFuncs->newstream = NewNPP_NewStreamProc(Private_NewStream);
|
||||
pluginFuncs->destroystream = NewNPP_DestroyStreamProc(Private_DestroyStream);
|
||||
pluginFuncs->asfile = NewNPP_StreamAsFileProc(Private_StreamAsFile);
|
||||
pluginFuncs->writeready = NewNPP_WriteReadyProc(Private_WriteReady);
|
||||
pluginFuncs->write = NewNPP_WriteProc(Private_Write);
|
||||
pluginFuncs->print = NewNPP_PrintProc(Private_Print);
|
||||
pluginFuncs->event = NewNPP_HandleEventProc(Private_HandleEvent);
|
||||
pluginFuncs->version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
|
||||
pluginFuncs->size = sizeof(NPPluginFuncs);
|
||||
pluginFuncs->newp = NewNPP_NewProc(PLUGIN_TO_HOST_GLUE(newp, Private_New));
|
||||
pluginFuncs->destroy = NewNPP_DestroyProc(PLUGIN_TO_HOST_GLUE(destroy, Private_Destroy));
|
||||
pluginFuncs->setwindow = NewNPP_SetWindowProc(PLUGIN_TO_HOST_GLUE(setwindow, Private_SetWindow));
|
||||
pluginFuncs->newstream = NewNPP_NewStreamProc(PLUGIN_TO_HOST_GLUE(newstream, Private_NewStream));
|
||||
pluginFuncs->destroystream = NewNPP_DestroyStreamProc(PLUGIN_TO_HOST_GLUE(destroystream, Private_DestroyStream));
|
||||
pluginFuncs->asfile = NewNPP_StreamAsFileProc(PLUGIN_TO_HOST_GLUE(asfile, Private_StreamAsFile));
|
||||
pluginFuncs->writeready = NewNPP_WriteReadyProc(PLUGIN_TO_HOST_GLUE(writeready, Private_WriteReady));
|
||||
pluginFuncs->write = NewNPP_WriteProc(PLUGIN_TO_HOST_GLUE(write, Private_Write));
|
||||
pluginFuncs->print = NewNPP_PrintProc(PLUGIN_TO_HOST_GLUE(print, Private_Print));
|
||||
pluginFuncs->event = NewNPP_HandleEventProc(PLUGIN_TO_HOST_GLUE(event, Private_HandleEvent));
|
||||
if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
|
||||
{
|
||||
pluginFuncs->urlnotify = NewNPP_URLNotifyProc(Private_URLNotify);
|
||||
pluginFuncs->urlnotify = NewNPP_URLNotifyProc(PLUGIN_TO_HOST_GLUE(urlnotify, Private_URLNotify));
|
||||
}
|
||||
if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
|
||||
{
|
||||
pluginFuncs->javaClass = (JRIGlobalRef) Private_GetJavaClass();
|
||||
}
|
||||
*unloadUpp = NewNPP_ShutdownProc(Private_Shutdown);
|
||||
*unloadUpp = NewNPP_ShutdownProc(PLUGIN_TO_HOST_GLUE(shutdown, Private_Shutdown));
|
||||
|
||||
SetUpQD();
|
||||
err = Private_Initialize();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user