📄 npmac.cpp
字号:
#if !TARGET_API_MAC_CARBON // // Ask the system if CFM is available. // long response; OSErr err = Gestalt(gestaltCFMAttr, &response); Boolean hasCFM = BitTst(&response, 31-gestaltCFMPresent); ProcessInfoRec infoRec; if (hasCFM) { // // GetProcessInformation takes a process serial number and // will give us back the name and FSSpec of the application. // See the Process Manager in IM. // Str63 name; FSSpec myFSSpec; infoRec.processInfoLength = sizeof(ProcessInfoRec); infoRec.processName = name; infoRec.processAppSpec = &myFSSpec; ProcessSerialNumber PSN; PSN.highLongOfPSN = 0; PSN.lowLongOfPSN = kCurrentProcess; result = GetProcessInformation(&PSN, &infoRec); if (result != noErr) PLUGINDEBUGSTR("\pFailed in GetProcessInformation"); } else // // If no CFM installed, assume it must be a 68K app. // result = -1; CFragConnectionID connID; if (result == noErr) { // // Now that we know the app name and FSSpec, we can call GetDiskFragment // to get a connID to use in a subsequent call to FindSymbol (it will also // return the address of “main” in app, which we ignore). If GetDiskFragment // returns an error, we assume the app must be 68K. // Ptr mainAddr; Str255 errName; result = GetDiskFragment(infoRec.processAppSpec, 0L, 0L, infoRec.processName, kLoadCFrag, &connID, (Ptr*)&mainAddr, errName); } if (result == noErr) { // // The app is a PPC code fragment, so call FindSymbol // to get the exported “qd” symbol so we can access its // QuickDraw globals. // CFragSymbolClass symClass; result = FindSymbol(connID, "\pqd", (Ptr*)&gQDPtr, &symClass); if (result != noErr) { // this fails if we are in NS 6 gQDPtr = &qd; // so we default to the standard QD globals } } else { // // The app is 68K, so use its A5 to compute the address // of its QuickDraw globals. // gQDPtr = (QDGlobals*)(*((long*)SetCurrentA5()) - (sizeof(QDGlobals) - sizeof(GrafPtr))); }#endif}#ifdef __GNUC__// gcc requires that main have an 'int' return typeint main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp);#elseNPError main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp);#endif#if !TARGET_API_MAC_CARBON#pragma export on#if TARGET_RT_MAC_CFMRoutineDescriptor mainRD = BUILD_ROUTINE_DESCRIPTOR(uppNPP_MainEntryProcInfo, main);#endif#pragma export off#endif /* !TARGET_API_MAC_CARBON */#ifdef __GNUC__DEFINE_API_C(int) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp)#elseDEFINE_API_C(NPError) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp)#endif{ EnterCodeResource(); PLUGINDEBUGSTR("\pmain");#ifdef __MWERKS__ __InitCode__();#endif NPError err = NPERR_NO_ERROR; // // Ensure that everything Netscape passed us is valid! // if ((nsTable == NULL) || (pluginFuncs == NULL) || (unloadUpp == NULL)) err = NPERR_INVALID_FUNCTABLE_ERROR; // // Check the “major” version passed in Netscape’s function table. // We won’t load if the major version is newer than what we expect. // Also check that the function tables passed in are big enough for // all the functions we need (they could be bigger, if Netscape added // new APIs, but that’s OK with us -- we’ll just ignore them). // if (err == NPERR_NO_ERROR) { if ((nsTable->version >> 8) > NP_VERSION_MAJOR) // Major version is in high byte err = NPERR_INCOMPATIBLE_VERSION_ERROR; } if (err == NPERR_NO_ERROR) { // // Copy all the fields of Netscape’s function table into our // copy so we can call back into Netscape later. Note that // we need to copy the fields one by one, rather than assigning // the whole structure, because the Netscape function table // could actually be bigger than what we expect. // int navMinorVers = nsTable->version & 0xFF; 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 = (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 = (NPN_GetURLNotifyUPP)HOST_TO_PLUGIN_GLUE(geturlnotify, nsTable->geturlnotify); gNetscapeFuncs.posturlnotify = (NPN_PostURLNotifyUPP)HOST_TO_PLUGIN_GLUE(posturlnotify, nsTable->posturlnotify); } 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); if( navMinorVers >= 14 ) { // NPRuntime support gNetscapeFuncs.getstringidentifier = (NPN_GetStringIdentifierUPP)HOST_TO_PLUGIN_GLUE(getstringidentifier, nsTable->getstringidentifier); gNetscapeFuncs.getstringidentifiers = (NPN_GetStringIdentifiersUPP)HOST_TO_PLUGIN_GLUE(getstringidentifiers, nsTable->getstringidentifiers); gNetscapeFuncs.getintidentifier = (NPN_GetIntIdentifierUPP)HOST_TO_PLUGIN_GLUE(getintidentifier, nsTable->getintidentifier); gNetscapeFuncs.identifierisstring = (NPN_IdentifierIsStringUPP)HOST_TO_PLUGIN_GLUE(identifierisstring, nsTable->identifierisstring); gNetscapeFuncs.utf8fromidentifier = (NPN_UTF8FromIdentifierUPP)HOST_TO_PLUGIN_GLUE(utf8fromidentifier, nsTable->utf8fromidentifier); gNetscapeFuncs.intfromidentifier = (NPN_IntFromIdentifierUPP)HOST_TO_PLUGIN_GLUE(intfromidentifier, nsTable->intfromidentifier); gNetscapeFuncs.createobject = (NPN_CreateObjectUPP)HOST_TO_PLUGIN_GLUE(createobject, nsTable->createobject); gNetscapeFuncs.retainobject = (NPN_RetainObjectUPP)HOST_TO_PLUGIN_GLUE(retainobject, nsTable->retainobject); gNetscapeFuncs.releaseobject = (NPN_ReleaseObjectUPP)HOST_TO_PLUGIN_GLUE(releaseobject, nsTable->releaseobject); gNetscapeFuncs.invoke = (NPN_InvokeUPP)HOST_TO_PLUGIN_GLUE(invoke, nsTable->invoke); gNetscapeFuncs.invokeDefault = (NPN_InvokeDefaultUPP)HOST_TO_PLUGIN_GLUE(invokeDefault, nsTable->invokeDefault); gNetscapeFuncs.evaluate = (NPN_EvaluateUPP)HOST_TO_PLUGIN_GLUE(evaluate, nsTable->evaluate); gNetscapeFuncs.getproperty = (NPN_GetPropertyUPP)HOST_TO_PLUGIN_GLUE(getproperty, nsTable->getproperty); gNetscapeFuncs.setproperty = (NPN_SetPropertyUPP)HOST_TO_PLUGIN_GLUE(setproperty, nsTable->setproperty); gNetscapeFuncs.removeproperty = (NPN_RemovePropertyUPP)HOST_TO_PLUGIN_GLUE(removeproperty, nsTable->removeproperty); gNetscapeFuncs.hasproperty = (NPN_HasPropertyUPP)HOST_TO_PLUGIN_GLUE(hasproperty, nsTable->hasproperty); gNetscapeFuncs.hasmethod = (NPN_HasMethodUPP)HOST_TO_PLUGIN_GLUE(hasmethod, nsTable->hasmethod); gNetscapeFuncs.releasevariantvalue = (NPN_ReleaseVariantValueUPP)HOST_TO_PLUGIN_GLUE(releasevariantvalue, nsTable->releasevariantvalue); gNetscapeFuncs.setexception = (NPN_SetExceptionUPP)HOST_TO_PLUGIN_GLUE(setexception, nsTable->setexception); } // // 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(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)); pluginFuncs->getvalue = NewNPP_GetValueProc(PLUGIN_TO_HOST_GLUE(getvalue, Private_GetValue)); if( navMinorVers >= NPVERS_HAS_NOTIFICATION ) { pluginFuncs->urlnotify = NewNPP_URLNotifyProc(PLUGIN_TO_HOST_GLUE(urlnotify, Private_URLNotify)); }#ifdef OJI if( navMinorVers >= NPVERS_HAS_LIVECONNECT ) { pluginFuncs->javaClass = (JRIGlobalRef) Private_GetJavaClass(); }#else pluginFuncs->javaClass = NULL;#endif *unloadUpp = NewNPP_ShutdownProc(PLUGIN_TO_HOST_GLUE(shutdown, Private_Shutdown)); SetUpQD(); err = Private_Initialize(); } ExitCodeResource(); return err;}#ifdef __MACH__/*** netscape plugins functions when building Mach-O binary*/extern "C" { NPError NP_Initialize(NPNetscapeFuncs* nsTable); NPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs); NPError NP_Shutdown(void);}/*** netscape plugins functions when using Mach-O binary*/NPError NP_Initialize(NPNetscapeFuncs* nsTable){ PLUGINDEBUGSTR("\pNP_Initialize"); /* validate input parameters */ if( NULL == nsTable ) return NPERR_INVALID_FUNCTABLE_ERROR; /* * Check the major version passed in Netscape's function table. * We won't load if the major version is newer than what we expect. * Also check that the function tables passed in are big enough for * all the functions we need (they could be bigger, if Netscape added * new APIs, but that's OK with us -- we'll just ignore them). * */ if ((nsTable->version >> 8) > NP_VERSION_MAJOR) return NPERR_INCOMPATIBLE_VERSION_ERROR; if (nsTable->size < sizeof(NPNetscapeFuncs)) return NPERR_INVALID_FUNCTABLE_ERROR; int navMinorVers = nsTable->version & 0xFF; /* * Copy all the fields of Netscape function table into our * copy so we can call back into Netscape later. Note that * we need to copy the fields one by one, rather than assigning * the whole structure, because the Netscape function table * could actually be bigger than what we expect. */ 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; if( navMinorVers >= NPVERS_HAS_LIVECONNECT ) { gNetscapeFuncs.getJavaEnv = nsTable->getJavaEnv; gNetscapeFuncs.getJavaPeer = nsTable->getJavaPeer; } if( navMinorVers >= NPVERS_HAS_NOTIFICATION ) { gNetscapeFuncs.geturlnotify = nsTable->geturlnotify; gNetscapeFuncs.posturlnotify = nsTable->posturlnotify; } gNetscapeFuncs.getvalue = nsTable->getvalue; gNetscapeFuncs.setvalue = nsTable->setvalue; gNetscapeFuncs.invalidaterect = nsTable->invalidaterect; gNetscapeFuncs.invalidateregion = nsTable->invalidateregion; gNetscapeFuncs.forceredraw = nsTable->forceredraw; if( navMinorVers >= 14 ) { // NPRuntime support gNetscapeFuncs.getstringidentifier = nsTable->getstringidentifier; gNetscapeFuncs.getstringidentifiers = nsTable->getstringidentifiers; gNetscapeFuncs.getintidentifier = nsTable->getintidentifier; gNetscapeFuncs.identifierisstring = nsTable->identifierisstring; gNetscapeFuncs.utf8fromidentifier = nsTable->utf8fromidentifier; gNetscapeFuncs.intfromidentifier = nsTable->intfromidentifier; gNetscapeFuncs.createobject = nsTable->createobject; gNetscapeFuncs.retainobject = nsTable->retainobject; gNetscapeFuncs.releaseobject = nsTable->releaseobject; gNetscapeFuncs.invoke = nsTable->invoke; gNetscapeFuncs.invokeDefault = nsTable->invokeDefault; gNetscapeFuncs.evaluate = nsTable->evaluate; gNetscapeFuncs.getproperty = nsTable->getproperty; gNetscapeFuncs.setproperty = nsTable->setproperty; gNetscapeFuncs.removeproperty = nsTable->removeproperty; gNetscapeFuncs.hasproperty = nsTable->hasproperty; gNetscapeFuncs.hasmethod = nsTable->hasmethod; gNetscapeFuncs.releasevariantvalue = nsTable->releasevariantvalue; gNetscapeFuncs.setexception = nsTable->setexception; } return NPP_Initialize();}NPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs){ int navMinorVers = gNetscapeFuncs.version & 0xFF; PLUGINDEBUGSTR("\pNP_GetEntryPoints"); if( pluginFuncs == NULL ) return NPERR_INVALID_FUNCTABLE_ERROR; /*if (pluginFuncs->size < sizeof(NPPluginFuncs)) return NPERR_INVALID_FUNCTABLE_ERROR;*/ /* * 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->getvalue = NewNPP_GetValueProc(Private_GetValue); pluginFuncs->setvalue = NewNPP_SetValueProc(Private_SetValue); if( navMinorVers >= NPVERS_HAS_NOTIFICATION ) { pluginFuncs->urlnotify = Private_URLNotify; }#ifdef OJI if( navMinorVers >= NPVERS_HAS_LIVECONNECT ) { pluginFuncs->javaClass = (JRIGlobalRef) Private_GetJavaClass(); }#else pluginFuncs->javaClass = NULL;#endif return NPERR_NO_ERROR;}NPError NP_Shutdown(void){ PLUGINDEBUGSTR("\pNP_Shutdown"); NPP_Shutdown(); return NPERR_NO_ERROR;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -