📄 npmac.cpp
字号:
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://// npmac.cpp////::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::#include <string.h>#include <Processes.h>#include <Gestalt.h>#include <CodeFragments.h>#include <Timer.h>#include <Resources.h>#include <ToolUtils.h>#define XP_MACOSX 1#undef TARGET_RT_MAC_CFM//// A4Stuff.h contains the definition of EnterCodeResource and // EnterCodeResource, used for setting up the code resource’s// globals for 68K (analagous to the function SetCurrentA5// defined by the toolbox).//// A4Stuff does not exist as of CW 7. Define them to nothing.//#if (defined(__MWERKS__) && (__MWERKS__ >= 0x2400)) || defined(__GNUC__) #define EnterCodeResource() #define ExitCodeResource()#else #include <A4Stuff.h>#endif#include "npapi.h"//// The Mixed Mode procInfos defined in npupp.h assume Think C-// style calling conventions. These conventions are used by// Metrowerks with the exception of pointer return types, which// in Metrowerks 68K are returned in A0, instead of the standard// D0. Thus, since NPN_MemAlloc and NPN_UserAgent return pointers,// Mixed Mode will return the values to a 68K plugin in D0, but // a 68K plugin compiled by Metrowerks will expect the result in// A0. The following pragma forces Metrowerks to use D0 instead.//#ifdef __MWERKS__#ifndef powerc#pragma pointers_in_D0#endif#endif#ifdef XP_UNIX#undef XP_UNIX#endif#include "npupp.h"#ifdef __MWERKS__#ifndef powerc#pragma pointers_in_A0#endif#endif// The following fix for static initializers (which fixes a previous// incompatibility with some parts of PowerPlant, was submitted by // Jan Ulbrich.#ifdef __MWERKS__ #ifdef __cplusplus extern "C" { #endif #ifndef powerc extern void __InitCode__(void); #else extern void __sinit(void); #define __InitCode__ __sinit #endif extern void __destroy_global_chain(void); #ifdef __cplusplus } #endif // __cplusplus#endif // __MWERKS__//// Define PLUGIN_TRACE to 1 to have the wrapper functions emit// DebugStr messages whenever they are called.//#define PLUGIN_TRACE 0#if PLUGIN_TRACE#define PLUGINDEBUGSTR(msg) ::DebugStr(msg)#else#define PLUGINDEBUGSTR(msg) {}#endif#if defined(XP_MACOSX) && defined(__POWERPC__) && (!defined(TARGET_RT_MAC_CFM))// glue for mapping outgoing Macho function pointers to TVectorsstruct TFPtoTVGlue { void* glue[2];};static 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 pointersstruct TTVtoFPGlue { uint32 glue[6];};static 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; // NPRuntime support TTVtoFPGlue getstringidentifier; TTVtoFPGlue getstringidentifiers; TTVtoFPGlue getintidentifier; TTVtoFPGlue identifierisstring; TTVtoFPGlue utf8fromidentifier; TTVtoFPGlue intfromidentifier; TTVtoFPGlue createobject; TTVtoFPGlue retainobject; TTVtoFPGlue releaseobject; TTVtoFPGlue invoke; TTVtoFPGlue invokeDefault; TTVtoFPGlue evaluate; TTVtoFPGlue getproperty; TTVtoFPGlue setproperty; TTVtoFPGlue removeproperty; TTVtoFPGlue hasproperty; TTVtoFPGlue hasmethod; TTVtoFPGlue releasevariantvalue; TTVtoFPGlue setexception;} 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 -//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://// Globals////::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::#if !TARGET_API_MAC_CARBONQDGlobals* gQDPtr; // Pointer to Netscape’s QuickDraw globals#endifshort gResFile; // Refnum of the plugin’s resource fileNPNetscapeFuncs gNetscapeFuncs; // Function table for procs in Netscape called by plugin//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://// Wrapper functions for all calls from the plugin to Netscape.// These functions let the plugin developer just call the APIs// as documented and defined in npapi.h, without needing to know// about the function table and call macros in npupp.h.////::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::void NPN_Version(int* plugin_major, int* plugin_minor, int* netscape_major, int* netscape_minor){ *plugin_major = NP_VERSION_MAJOR; *plugin_minor = NP_VERSION_MINOR; *netscape_major = gNetscapeFuncs.version >> 8; // Major version is in high byte *netscape_minor = gNetscapeFuncs.version & 0xFF; // Minor version is in low byte}NPError NPN_GetURLNotify(NPP instance, const char* url, const char* window, void* notifyData){ int navMinorVers = gNetscapeFuncs.version & 0xFF; NPError err; if( navMinorVers >= NPVERS_HAS_NOTIFICATION ) { err = CallNPN_GetURLNotifyProc(gNetscapeFuncs.geturlnotify, instance, url, window, notifyData); } else { err = NPERR_INCOMPATIBLE_VERSION_ERROR; } return err;}NPError NPN_GetURL(NPP instance, const char* url, const char* window){ return CallNPN_GetURLProc(gNetscapeFuncs.geturl, instance, url, window);}NPError NPN_PostURLNotify(NPP instance, const char* url, const char* window, uint32 len, const char* buf, NPBool file, void* notifyData){ int navMinorVers = gNetscapeFuncs.version & 0xFF; NPError err; if( navMinorVers >= NPVERS_HAS_NOTIFICATION ) { err = CallNPN_PostURLNotifyProc(gNetscapeFuncs.posturlnotify, instance, url, window, len, buf, file, notifyData); } else { err = NPERR_INCOMPATIBLE_VERSION_ERROR; } return err;}NPError NPN_PostURL(NPP instance, const char* url, const char* window, uint32 len, const char* buf, NPBool file){ return CallNPN_PostURLProc(gNetscapeFuncs.posturl, instance, url, window, len, buf, file);}NPError NPN_RequestRead(NPStream* stream, NPByteRange* rangeList){ return CallNPN_RequestReadProc(gNetscapeFuncs.requestread, stream, rangeList);}NPError NPN_NewStream(NPP instance, NPMIMEType type, const char* window, NPStream** stream){ int navMinorVers = gNetscapeFuncs.version & 0xFF; NPError err; if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT ) { err = CallNPN_NewStreamProc(gNetscapeFuncs.newstream, instance, type, window, stream); } else { err = NPERR_INCOMPATIBLE_VERSION_ERROR; } return err;}int32 NPN_Write(NPP instance, NPStream* stream, int32 len, void* buffer){ int navMinorVers = gNetscapeFuncs.version & 0xFF; NPError err; if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT ) { err = CallNPN_WriteProc(gNetscapeFuncs.write, instance, stream, len, buffer); } else { err = NPERR_INCOMPATIBLE_VERSION_ERROR; } return err;}NPError NPN_DestroyStream(NPP instance, NPStream* stream, NPError reason){ int navMinorVers = gNetscapeFuncs.version & 0xFF; NPError err; if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT ) { err = CallNPN_DestroyStreamProc(gNetscapeFuncs.destroystream, instance, stream, reason); } else { err = NPERR_INCOMPATIBLE_VERSION_ERROR; } return err;}void NPN_Status(NPP instance, const char* message){ CallNPN_StatusProc(gNetscapeFuncs.status, instance, message);}const char* NPN_UserAgent(NPP instance){ return CallNPN_UserAgentProc(gNetscapeFuncs.uagent, instance);}void* NPN_MemAlloc(uint32 size){ return CallNPN_MemAllocProc(gNetscapeFuncs.memalloc, size);}void NPN_MemFree(void* ptr){ CallNPN_MemFreeProc(gNetscapeFuncs.memfree, ptr);}uint32 NPN_MemFlush(uint32 size){ return CallNPN_MemFlushProc(gNetscapeFuncs.memflush, size);}void NPN_ReloadPlugins(NPBool reloadPages){ CallNPN_ReloadPluginsProc(gNetscapeFuncs.reloadplugins, reloadPages);}#ifdef OJIJRIEnv* NPN_GetJavaEnv(void){ return CallNPN_GetJavaEnvProc( gNetscapeFuncs.getJavaEnv );}jobject NPN_GetJavaPeer(NPP instance){ return CallNPN_GetJavaPeerProc( gNetscapeFuncs.getJavaPeer, instance );}#endifNPError NPN_GetValue(NPP instance, NPNVariable variable, void *value){ return CallNPN_GetValueProc( gNetscapeFuncs.getvalue, instance, variable, value);}NPError NPN_SetValue(NPP instance, NPPVariable variable, void *value){ return CallNPN_SetValueProc( gNetscapeFuncs.setvalue, instance, variable, value);}void NPN_InvalidateRect(NPP instance, NPRect *rect){ CallNPN_InvalidateRectProc( gNetscapeFuncs.invalidaterect, instance, rect);}void NPN_InvalidateRegion(NPP instance, NPRegion region){ CallNPN_InvalidateRegionProc( gNetscapeFuncs.invalidateregion, instance, region);}void NPN_ForceRedraw(NPP instance){ CallNPN_ForceRedrawProc( gNetscapeFuncs.forceredraw, instance);}NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -