From 74d000f595e9157a0a75b6d6fa9ede6d7b2e0b38 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@18797224-902f-48f8-a5cc-f745e15eee43> Date: Sat, 4 Nov 2000 00:42:33 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create branch 'Netscape_20000922_BRANCH'. git-svn-id: svn://10.0.0.236/branches/Netscape_20000922_BRANCH@82294 18797224-902f-48f8-a5cc-f745e15eee43 --- .../plugin/default/mac/Default Plug-in | Bin 0 -> 27117 bytes .../modules/plugin/default/mac/NullPlugin.cpp | 1130 +++++++++++++++++ .../modules/plugin/default/mac/NullPlugin.mcp | Bin 0 -> 42566 bytes .../plugin/default/mac/NullPlugin.rsrc | Bin 0 -> 1923 bytes mozilla/modules/plugin/default/mac/npmac.cpp | 646 ++++++++++ .../samples/default/mac/Default Plug-in | Bin 0 -> 27117 bytes .../plugin/samples/default/mac/NullPlugin.cpp | 1130 +++++++++++++++++ .../plugin/samples/default/mac/NullPlugin.mcp | Bin 0 -> 42566 bytes .../samples/default/mac/NullPlugin.rsrc | Bin 0 -> 1923 bytes .../plugin/samples/default/mac/npmac.cpp | 646 ++++++++++ 10 files changed, 3552 insertions(+) create mode 100644 mozilla/modules/plugin/default/mac/Default Plug-in create mode 100644 mozilla/modules/plugin/default/mac/NullPlugin.cpp create mode 100644 mozilla/modules/plugin/default/mac/NullPlugin.mcp create mode 100644 mozilla/modules/plugin/default/mac/NullPlugin.rsrc create mode 100644 mozilla/modules/plugin/default/mac/npmac.cpp create mode 100644 mozilla/modules/plugin/samples/default/mac/Default Plug-in create mode 100644 mozilla/modules/plugin/samples/default/mac/NullPlugin.cpp create mode 100644 mozilla/modules/plugin/samples/default/mac/NullPlugin.mcp create mode 100644 mozilla/modules/plugin/samples/default/mac/NullPlugin.rsrc create mode 100644 mozilla/modules/plugin/samples/default/mac/npmac.cpp diff --git a/mozilla/modules/plugin/default/mac/Default Plug-in b/mozilla/modules/plugin/default/mac/Default Plug-in new file mode 100644 index 0000000000000000000000000000000000000000..1b38c7bae48e5cf72a0d75d27e35b155107cd6c4 GIT binary patch literal 27117 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 literal 0 HcmV?d00001 diff --git a/mozilla/modules/plugin/default/mac/NullPlugin.cpp b/mozilla/modules/plugin/default/mac/NullPlugin.cpp new file mode 100644 index 00000000000..e93c95c2b58 --- /dev/null +++ b/mozilla/modules/plugin/default/mac/NullPlugin.cpp @@ -0,0 +1,1130 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is Netscape Communications + * Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + + +#ifndef _NPAPI_H_ +#include "npapi.h" +#endif + + +#include +#include +#include + +#define PLUGINFINDER_COMMAND_BEGINNING "javascript:window.open(\"" +#define PLUGINFINDER_COMMAND_END "\",\"plugin\",\"toolbar=no,status=no,resizeable=no,scrollbars=no,height=252,width=626\");" +#define PLUGINFINDER_COMMAND_END2 "\",\"plugin\",\"toolbar=no,status=no,resizeable=yes,scrollbars=yes,height=252,width=626\");" + + +// +// Instance state information about the plugin. +// +class CPlugin +{ +public: + enum HiliteState { kUnhilited = 0, kHilited = 1 }; + + static NPError Initialize(); + static void Shutdown(); + + void Constructor(NPP instance, NPMIMEType type, uint16 mode, int16 argc, char* argn[], char* argv[]); + void Destructor(); + + void SetWindow(NPWindow* window); + void Print(NPPrint* printInfo); + Boolean HandleEvent(EventRecord*); + +protected: + void Draw(HiliteState hilite); + void DrawString(const unsigned char* text, short width, short height, short centerX, Rect drawRect); + void MouseDown(); + + Boolean FocusDraw(); + void RestoreDraw(); + + void DetermineURL(int16 argc, char* argn[], char* argv[]); + char * MakeDefaultURL(void); + void AddMimeTypeToList(StringPtr cTypeString); + Boolean CheckMimeTypes(); + void AskAndLoadURL(); + void RefreshPluginPage(); + + Ptr New(UInt32 size); + void Delete(Ptr ptr); + + Boolean IsPluginHidden(int16 argc, char* argn[], char* argv[]); + +private: + static CIconHandle sIconHandle; + static CursHandle sHandCursor; + static char* sAltText; + static char* sInstallCommand; + static char* sDefaultPage; + static char* sRefreshText; + static char* sJavaScriptPage; + static FSSpec sDataFileSpec; + + NPP fInstance; + NPWindow* fWindow; + uint16 fMode; + NPMIMEType fType; + char* fPageURL; + char* fFileURL; + NPBool m_bOffline; + NPBool m_bJavaScript; + + GrafPtr fSavePort; + RgnHandle fSaveClip; + Rect fRevealedRect; + short fSavePortTop; + short fSavePortLeft; + Boolean fUserInstalledPlugin; + Boolean fHiddenPlugin; + Boolean fAskedLoadURL; +}; + + +CIconHandle CPlugin::sIconHandle = NULL; +CursHandle CPlugin::sHandCursor = NULL; +char* CPlugin::sAltText = NULL; +char* CPlugin::sInstallCommand = NULL; +char* CPlugin::sDefaultPage = NULL; +char* CPlugin::sRefreshText = NULL; +char* CPlugin::sJavaScriptPage = NULL; +FSSpec CPlugin::sDataFileSpec; + +extern short gResFile; +extern QDGlobals* gQDPtr; + + +// 'cicn' +const short rBrokenPluginIcon = 326; + +// 'CURS' +const short rHandCursor = 128; + +// 'STR ' +const short rDefaultPluginURL = 128; +const short rAltTextString = 129; +const short rJavaScriptInstallCommand = 130; +const short rRefreshTextString = 131; +const short rJavaScriptPageURL = 132; + +// 'STR#' +const short rTypeListStrings = 129; + +static char szPluginFinderCommandBeginning[] = PLUGINFINDER_COMMAND_BEGINNING; +static char szPluginFinderCommandEnd[] = PLUGINFINDER_COMMAND_END; + + +//------------------------------------------------------------------------------------ +// strcasecomp: Why don't the MW C libraries have this?? +//------------------------------------------------------------------------------------ +#define XP_TO_LOWER(i) ((((unsigned int) (i)) > 0x7f) ? (int) (i) : tolower(i)) +int strcasecmp (const char* one, const char *two); + +int strcasecmp (const char* one, const char *two) +{ + const char *pA; + const char *pB; + + for(pA=one, pB=two; *pA && *pB; pA++, pB++) + { + int tmp = XP_TO_LOWER(*pA) - XP_TO_LOWER(*pB); + if (tmp) + return tmp; + } + if (*pA) + return 1; + if (*pB) + return -1; + return 0; +} + + +//------------------------------------------------------------------------------------ +// NPP_Initialize: +//------------------------------------------------------------------------------------ +NPError NPP_Initialize(void) +{ + return CPlugin::Initialize(); +} + + +//------------------------------------------------------------------------------------ +// NPP_Shutdown: +//------------------------------------------------------------------------------------ +void NPP_Shutdown(void) +{ + CPlugin::Shutdown(); +} + + +//------------------------------------------------------------------------------------ +// NPP_New: +//------------------------------------------------------------------------------------ +NPError NPP_New(NPMIMEType type, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData*) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + CPlugin* This = (CPlugin*) (char*)NPN_MemAlloc(sizeof(CPlugin)); + instance->pdata = This; + if (This != NULL) + { + This->Constructor(instance, type, mode, argc, argn, argv); + return NPERR_NO_ERROR; + } + else + return NPERR_OUT_OF_MEMORY_ERROR; +} + + + + +//------------------------------------------------------------------------------------ +// NPP_Destroy: +//------------------------------------------------------------------------------------ +NPError NP_LOADDS +NPP_Destroy(NPP instance, NPSavedData** /*save*/) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + CPlugin* This = (CPlugin*) instance->pdata; + + if (This != NULL) + { + This->Destructor(); + NPN_MemFree(This); + instance->pdata = NULL; + } + + return NPERR_NO_ERROR; +} + + + + +//------------------------------------------------------------------------------------ +// NPP_SetWindow: +//------------------------------------------------------------------------------------ +NPError NPP_SetWindow(NPP instance, NPWindow* window) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + CPlugin* This = (CPlugin*) instance->pdata; + if (This != NULL) + This->SetWindow(window); + + return NPERR_NO_ERROR; +} + + + +//------------------------------------------------------------------------------------ +// NPP_NewStream: +//------------------------------------------------------------------------------------ +NPError NP_LOADDS +NPP_NewStream(NPP instance, + NPMIMEType /*type*/, + NPStream* /*stream*/, + NPBool /*seekable*/, + uint16* /*stype*/) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + return NPERR_NO_ERROR; +} + + + +int32 STREAMBUFSIZE = 0X0FFFFFFF; // If we are reading from a file in NPAsFile + // mode so we can take any size stream in our + // write call (since we ignore it) + +//------------------------------------------------------------------------------------ +// NPP_WriteReady: +//------------------------------------------------------------------------------------ +int32 NP_LOADDS +NPP_WriteReady(NPP /*instance*/, NPStream* /*stream*/) +{ + return STREAMBUFSIZE; // Number of bytes ready to accept in NPP_Write() +} + + + +//------------------------------------------------------------------------------------ +// NPP_Write: +//------------------------------------------------------------------------------------ +int32 NP_LOADDS +NPP_Write(NPP /*instance*/, NPStream* /*stream*/, int32 /*offset*/, int32 len, void* /*buffer*/) +{ + return len; // The number of bytes accepted +} + + + +//------------------------------------------------------------------------------------ +// NPP_DestroyStream: +//------------------------------------------------------------------------------------ +NPError NP_LOADDS +NPP_DestroyStream(NPP instance, NPStream* /*stream*/, NPError /*reason*/) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + return NPERR_NO_ERROR; +} + + +//------------------------------------------------------------------------------------ +// NPP_StreamAsFile: +//------------------------------------------------------------------------------------ +void NP_LOADDS +NPP_StreamAsFile(NPP /*instance*/, NPStream */*stream*/, const char* /*fname*/) +{ +} + + + +//------------------------------------------------------------------------------------ +// NPP_Print: +//------------------------------------------------------------------------------------ +void NP_LOADDS +NPP_Print(NPP instance, NPPrint* printInfo) +{ + if (printInfo == NULL) + return; + + if (instance != NULL) + { + if (printInfo->mode == NP_FULL) + printInfo->print.fullPrint.pluginPrinted = FALSE; // Do the default + else // If not fullscreen, we must be embedded + { + CPlugin* This = (CPlugin*) instance->pdata; + if (This != NULL) + This->Print(printInfo); + } + } + +} + + +//------------------------------------------------------------------------------------ +// NPP_HandleEvent: +// Mac-only. +//------------------------------------------------------------------------------------ +int16 NPP_HandleEvent(NPP instance, void* event) +{ + if (instance != NULL) + { + CPlugin* This = (CPlugin*) instance->pdata; + if (This != NULL && event != NULL) + return This->HandleEvent((EventRecord*) event); + } + + return FALSE; +} + + +//------------------------------------------------------------------------------------ +// NPP_URLNotify: +//------------------------------------------------------------------------------------ +void NPP_URLNotify(NPP /*instance*/, const char* /*url*/, NPReason /*reason*/, void* /*notifyData*/) +{ +} + + +//------------------------------------------------------------------------------------ +// NPP_GetJavaClass: +//------------------------------------------------------------------------------------ +jref NPP_GetJavaClass(void) +{ + return NULL; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Initialize: +//------------------------------------------------------------------------------------ +NPError CPlugin::Initialize() +{ + Handle string; + SInt16 wResFile; + short saveResFile = CurResFile(); + + UseResFile(gResFile); + + // Get Resources + CPlugin::sIconHandle = GetCIcon(rBrokenPluginIcon); + CPlugin::sHandCursor = GetCursor(rHandCursor); + + // Get "alt text" string + string = Get1Resource('STR ', rAltTextString); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sAltText = (char*)NPN_MemAlloc(stringLen +1); + if (CPlugin::sAltText != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sAltText[dest++] = (*string)[src++]; + CPlugin::sAltText[dest++] = 0; + } + } + ReleaseResource(string); + + // Get "refresh text" string + string = Get1Resource('STR ', rRefreshTextString); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sRefreshText = (char*)NPN_MemAlloc(stringLen + 1); + if (CPlugin::sRefreshText != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sRefreshText[dest++] = (*string)[src++]; + CPlugin::sRefreshText[dest++] = 0; + } + } + ReleaseResource(string); + + // Get JavaScript install command string + string = Get1Resource('STR ', rJavaScriptInstallCommand); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sInstallCommand = (char*)NPN_MemAlloc(stringLen + 1); + if (CPlugin::sInstallCommand != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sInstallCommand[dest++] = (*string)[src++]; + CPlugin::sInstallCommand[dest++] = 0; + } + } + ReleaseResource(string); + + // Get default plug-in page URL + string = Get1Resource('STR ', rDefaultPluginURL); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sDefaultPage = (char*)NPN_MemAlloc(stringLen + 1); + if (CPlugin::sDefaultPage != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sDefaultPage[dest++] = (*string)[src++]; + CPlugin::sDefaultPage[dest++] = 0; + } + } + ReleaseResource(string); + + // Get javascript plug-in page URL + string = Get1Resource('STR ', rJavaScriptPageURL); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sJavaScriptPage = (char*)NPN_MemAlloc(stringLen + 1); + if (CPlugin::sJavaScriptPage != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sJavaScriptPage[dest++] = (*string)[src++]; + CPlugin::sJavaScriptPage[dest++] = 0; + } + } + ReleaseResource(string); + + UseResFile(saveResFile); + + { + ProcessSerialNumber psn; + ProcessInfoRec info; + FSSpec fsTheApp; + OSErr wErr; + + psn.highLongOfPSN = 0; + psn.lowLongOfPSN = kCurrentProcess; + + info.processInfoLength = sizeof(ProcessInfoRec); + info.processName = nil; + info.processAppSpec = &fsTheApp; + wErr = ::GetProcessInformation(&psn, &info); + if (wErr == noErr) { + wErr = FSMakeFSSpec(fsTheApp.vRefNum, fsTheApp.parID, "\p:Plug-ins:Default Plug-in Data", + &sDataFileSpec); + if (wErr == fnfErr) { + FSpCreateResFile(&sDataFileSpec, 'MOSS', 'BINA', smSystemScript); + wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdWrPerm); + if (wResFile != -1) { + // create a STR# with 0 entires (i.e. only a count) + string = NewHandleClear(sizeof(SInt16)); + AddResource(string, 'STR#', rTypeListStrings, "\p"); + UpdateResFile(wResFile); + ReleaseResource(string); + } + FSClose(wResFile); + } + } + } + return NPERR_NO_ERROR; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Shutdown: +//------------------------------------------------------------------------------------ +void CPlugin::Shutdown() +{ + if (CPlugin::sIconHandle != NULL) + ::ReleaseResource((Handle) CPlugin::sIconHandle); + if (CPlugin::sHandCursor != NULL) + ::ReleaseResource((Handle) CPlugin::sHandCursor); + + if (CPlugin::sAltText != NULL) + NPN_MemFree(CPlugin::sAltText); + if (CPlugin::sInstallCommand != NULL) + NPN_MemFree(CPlugin::sInstallCommand); + if (CPlugin::sDefaultPage != NULL) + NPN_MemFree(CPlugin::sDefaultPage); + if(CPlugin::sRefreshText != NULL) + NPN_MemFree(CPlugin::sRefreshText); +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Constructor: +//------------------------------------------------------------------------------------ +void CPlugin::Constructor(NPP instance, NPMIMEType type, uint16 mode, int16 argc, char* argn[], char* argv[]) +{ + fWindow = NULL; + fPageURL = NULL; + fFileURL = NULL; + fInstance = instance; + fMode = mode; // Mode is NP_EMBED, NP_FULL, or NP_BACKGROUND (see npapi.h) + fAskedLoadURL = false; + fUserInstalledPlugin = false; + + // Save a copy of our mime type string + short typeLength = strlen(type); + fType = (char*)NPN_MemAlloc(typeLength+1); + if (fType != NULL) + strcpy(fType, type); + + // Make a handy region for use in FocusDraw + fSaveClip = NewRgn(); + + // determine if the plugin is specified as HIDDEN + if(IsPluginHidden(argc, argn, argv)) + fHiddenPlugin = true; + else + fHiddenPlugin = false; + + // Get some information about our environment + NPN_GetValue(fInstance, NPNVisOfflineBool, (void *)&m_bOffline); + NPN_GetValue(fInstance, NPNVjavascriptEnabledBool, (void *)&m_bJavaScript); + + // Figure out what URL we will go to + DetermineURL(argc, argn, argv); +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Destructor: +//------------------------------------------------------------------------------------ +void CPlugin::Destructor() +{ + if (fSaveClip != NULL) + DisposeRgn(fSaveClip); + + if (fType != NULL) + NPN_MemFree(fType); + if (fFileURL != NULL) + NPN_MemFree(fFileURL); + if (fPageURL != NULL) + NPN_MemFree(fPageURL); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::SetWindow: +//------------------------------------------------------------------------------------ +void CPlugin::SetWindow(NPWindow* window) +{ + fWindow = window; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Print: +// +// To print, we need to retrieve the printing window from the printInfo, +// temporarily make it our window, draw into it, and restore the window. +// +//------------------------------------------------------------------------------------ +void CPlugin::Print(NPPrint* printInfo) +{ + NPWindow* printWindow = &(printInfo->print.embedPrint.window); + + NPWindow* oldWindow = fWindow; + fWindow = printWindow; + + if (FocusDraw()) + { + Draw(kUnhilited); + RestoreDraw(); + } + + fWindow = oldWindow; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::HandleEvent: +//------------------------------------------------------------------------------------ +Boolean CPlugin::HandleEvent(EventRecord* ev) +{ + Boolean eventHandled = false; + + switch (ev->what) + { + case mouseDown: + MouseDown(); + eventHandled = true; + break; + + case updateEvt: + if (FocusDraw()) { + Draw(kUnhilited); + RestoreDraw(); + } + eventHandled = true; + break; + + case adjustCursorEvent: + if (CPlugin::sHandCursor != NULL) + SetCursor(*CPlugin::sHandCursor); + if (fUserInstalledPlugin) { + if (CPlugin::sRefreshText != NULL) + NPN_Status(fInstance, CPlugin::sRefreshText); + } else { + if (CPlugin::sAltText != NULL) + NPN_Status(fInstance, CPlugin::sAltText); + } + eventHandled = true; + break; + + case nullEvent: + // + // NOTE: We have to wait until idle time + // to ask the user if they want to visit + // the URL to avoid reentering XP code. + // + if (!fAskedLoadURL) { + if (CheckMimeTypes()) + AskAndLoadURL(); + fAskedLoadURL = true; + } + break; + default: + break; + } + + return eventHandled; +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::Draw: +//------------------------------------------------------------------------------------ +void CPlugin::Draw(HiliteState hilite) +{ + UInt8 *pTheText; + SInt32 height = fWindow->height; + SInt32 width = fWindow->width; + SInt32 centerX = (width) >> 1; + SInt32 centerY = (height) >> 1; + Rect drawRect; + RGBColor black = { 0x0000, 0x0000, 0x0000 }; + RGBColor white = { 0xFFFF, 0xFFFF, 0xFFFF }; + RGBColor hiliteColor = { 0x0000, 0x0000, 0x0000 }; + short transform; + + drawRect.top = 0; + drawRect.left = 0; + drawRect.bottom = height; + drawRect.right = width; + + if (height < 4 && width < 4) + return; + + PenNormal(); + RGBForeColor(&black); + RGBBackColor(&white); + + FillRect(&drawRect, &(gQDPtr->white)); + + if (hilite == kHilited) { + hiliteColor.red = 0xFFFF; + transform = ttSelected; + } else { + hiliteColor.blue = 0xFFFF; + transform = ttNone; + } + + RGBForeColor(&hiliteColor); + FrameRect(&drawRect); + + if (height > 32 && width > 32 && CPlugin::sIconHandle != NULL) + { + drawRect.top = centerY - 16; + drawRect.bottom = centerY + 16; + drawRect.left = centerX - 16; + drawRect.right = centerX + 16; + PlotCIconHandle(&drawRect, atAbsoluteCenter, transform, CPlugin::sIconHandle); + } + + if (fUserInstalledPlugin) { + pTheText = (unsigned char*)CPlugin::sRefreshText; + } else { + pTheText = (unsigned char*)CPlugin::sAltText; + } + DrawString(pTheText, width, height, centerX, drawRect); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::MouseDown: +// +// Track the click in our plugin by drawing the icon enabled or disabled +// as the user moves the mouse in and out with the button held down. If +// they let up the mouse while still inside, get the URL. +// +//------------------------------------------------------------------------------------ +void CPlugin::MouseDown() +{ + if (FocusDraw()) + { + Draw(kHilited); + Boolean inside = true; + + while (StillDown()) + { + Point localMouse; + GetMouse(&localMouse); + Boolean insideNow = ::PtInRect(localMouse, &fRevealedRect); + + if (insideNow != inside) + { + Draw(insideNow ? kHilited : kUnhilited); + inside = insideNow; + } + } + + if (inside) { + Draw(kUnhilited); + if (!fUserInstalledPlugin) + AskAndLoadURL(); + else + RefreshPluginPage(); + } + + RestoreDraw(); + } +} + + +//------------------------------------------------------------------------------------ +// CPlugin::FocusDraw: +//------------------------------------------------------------------------------------ +Boolean CPlugin::FocusDraw() +{ + if (fWindow == NULL) + return false; + + NP_Port* npport = (NP_Port*) fWindow->window; + CGrafPtr ourPort = npport->port; + + if (fWindow->clipRect.left < fWindow->clipRect.right) + { + GetPort(&fSavePort); + SetPort((GrafPtr) ourPort); + fSavePortTop = ourPort->portRect.top; + fSavePortLeft = ourPort->portRect.left; + GetClip(fSaveClip); + + fRevealedRect.top = fWindow->clipRect.top + npport->porty; + fRevealedRect.left = fWindow->clipRect.left + npport->portx; + fRevealedRect.bottom = fWindow->clipRect.bottom + npport->porty; + fRevealedRect.right = fWindow->clipRect.right + npport->portx; + SetOrigin(npport->portx, npport->porty); + ClipRect(&fRevealedRect); + + return true; + } + else + return false; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::RestoreDraw: +//------------------------------------------------------------------------------------ +void CPlugin::RestoreDraw() +{ + SetOrigin(fSavePortLeft, fSavePortTop); + SetClip(fSaveClip); + SetPort(fSavePort); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::DetermineURL: +// +// Get a URL from either the parameters passed from the EMBED. +// Append "?" and our mime type and save for later use. +// +//------------------------------------------------------------------------------------ +void CPlugin::DetermineURL(int16 argc, char* argn[], char* argv[]) +{ + char* url; + SInt32 additionalLength = 0; + SInt32 i; + + // Appended to the URL will be a "?" and the mime type of this instance. This lets the server + // do something intelligent with a CGI script. + + if (fType != NULL) + additionalLength += (strlen(fType) + 1); // Add 1 for '?' + + // The page designer can specify a URL where the plugin for this type can be downloaded. Here + // we scan the arguments for this attribute and save it away if we + // find it for later use by LoadPluginURL(). + // + for (i = 0; i < argc; i++) { + if ((strcasecmp(argn[i], "PLUGINSPAGE") == 0) || (strcasecmp(argn[i], "CODEBASE") == 0)) { + url = argv[i]; + fPageURL = (char*)NPN_MemAlloc(strlen(url) + 1 + additionalLength); // Add 1 for '\0' + if (fPageURL != NULL) { + if (additionalLength > 0) { + sprintf(fPageURL, "%s?%s", url, fType); + } else { + strcpy(fPageURL, url); + } + } + break; + } else if ((strcasecmp(argn[i], "PLUGINURL") == 0) || (strcasecmp(argn[i], "CLASSID") == 0)) { + url = argv[i]; + if (CPlugin::sInstallCommand != NULL) { + // Allocate a new string + fFileURL = (char*)NPN_MemAlloc(strlen(CPlugin::sInstallCommand) + 1 + strlen(url)); + if (fFileURL != NULL) + sprintf(fFileURL, CPlugin::sInstallCommand, url); + } + break; + } + } +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::MakeDefaultURL: +// +// Get a URL from our resources. Append "?" and our mime type and save for later use. +// +//------------------------------------------------------------------------------------ +char *CPlugin::MakeDefaultURL(void) +{ + char *pDefURL = NULL; + SInt32 additionalLength = 0; + + // Appended to the URL will be a "?" and the mime type of this instance. This lets the server + // do something intelligent with a CGI script. + + if (fType != NULL) + additionalLength += (strlen(fType) + 1); // Add 1 for '?' + + if (!m_bJavaScript) { + if (CPlugin::sDefaultPage != NULL) { + pDefURL = (char*)NPN_MemAlloc(strlen(CPlugin::sDefaultPage) + 1 + additionalLength); + if (pDefURL != NULL) { + if (additionalLength > 0) { + sprintf(pDefURL, "%s?%s", CPlugin::sDefaultPage, fType); + } else { + strcpy(pDefURL, CPlugin::sDefaultPage); + } + } + } + } else { + if (CPlugin::sJavaScriptPage != NULL) { + pDefURL = (char*)NPN_MemAlloc(strlen(szPluginFinderCommandBeginning) + + strlen(CPlugin::sJavaScriptPage) + + additionalLength + strlen(szPluginFinderCommandEnd) + 1); + if (pDefURL != NULL) { + sprintf(pDefURL, "%s%s%s%s", szPluginFinderCommandBeginning, + CPlugin::sJavaScriptPage, fType, szPluginFinderCommandEnd); + } + } + } + return(pDefURL); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::AddMimeTypeToList: +// +// Check the mime type of this instance against our list +// of types weÕve seen before. If we find our type in the +// list, return false; otherwise, return true. +// +// type 'STR#' { +// integer = $$Countof(StringArray); +// array StringArray { +// pstring; +// }; +// +//------------------------------------------------------------------------------------ +void CPlugin::AddMimeTypeToList(StringPtr cTypeString) +{ + Handle hTypeList; + SInt32 dwCount; + SInt32 index; + Str255 oldType; + SInt16 wResFile; + Boolean failedToFind = true; + + wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdWrPerm); + if (wResFile != -1) { + hTypeList = Get1Resource('STR#', rTypeListStrings); + if (hTypeList != NULL) { + dwCount = **((short **)hTypeList); + + // First make sure it's not already in the list. + for (index = 1; index <= dwCount; index++) { + GetIndString(oldType, rTypeListStrings, index); + + // if the mimetype already exists in our list, or the plugin is NOT hidden, + // don't bring up the dialog box + if (EqualString(cTypeString, oldType, true, true) && !fHiddenPlugin) { + failedToFind = false; + break; // Found a match, so bail out! + } + } + if (failedToFind) { + // Grow the string list handle + Size itsSize = GetHandleSize(hTypeList); + Size typeSize = cTypeString[0] + 1; + SetHandleSize(hTypeList, itsSize + typeSize); + + // Increment the count of strings in the list + (**((short**)hTypeList)) = (short)(++dwCount); + + // Copy the data from our string into the handle + long dwCount = Munger(hTypeList, itsSize, NULL, typeSize, cTypeString, typeSize); + + // Mark the resource as changed so it will be written out + if (dwCount > 0) { + ChangedResource(hTypeList); + UpdateResFile(wResFile); + } + } + ReleaseResource(hTypeList); + } + FSClose(wResFile); + } +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::CheckMimeTypes: +// +// Check the mime type of this instance against our list +// of types weÕve seen before. If we find our type in the +// list, return false; otherwise, return true. +// +// type 'STR#' { +// integer = $$Countof(StringArray); +// array StringArray { +// pstring; +// }; +// +//------------------------------------------------------------------------------------ +Boolean CPlugin::CheckMimeTypes() +{ + Handle hTypeList; + SInt32 index; + Str255 oldType; + Str255 ourType; + SInt16 wResFile; + Boolean failedToFind = true; + + wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdPerm); + if (wResFile != -1) { + hTypeList = Get1Resource('STR#', rTypeListStrings); + if (hTypeList != NULL) { + // Convert the mime-type C string to a Pascal string. + index = strlen(fType); + if (index > 255) { // don't blow out the Str255 + index = 255; + } + BlockMoveData(fType, &ourType[1], index); + ourType[0] = index; + + short count = **((short **)hTypeList); + + // Iterate through all the strings in the list. + for (index = 1; index <= count; index++) { + GetIndString(oldType, rTypeListStrings, index); + + // if the mimetype already exists in our list, or the plugin is NOT hidden, + // don't bring up the dialog box + if (EqualString(ourType, oldType, true, true) && !fHiddenPlugin) { + failedToFind = false; + break; // Found a match, so bail out! + } + } + ReleaseResource(hTypeList); + } + FSClose(wResFile); + } + return(failedToFind); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::AskAndLoadURL: +//------------------------------------------------------------------------------------ +void CPlugin::AskAndLoadURL() +{ + char *pTheURL; + SInt32 dwLen; + Str255 ourType; + + if (!m_bOffline) { + // Convert the mime-type C string to a Pascal string. + dwLen = strlen(fType); + if (dwLen > 255) { // don't blow out the Str255 + dwLen = 255; + } + BlockMoveData(fType, &ourType[1], dwLen); + ourType[0] = dwLen; + + // NOTE: We need to set the cursor because almost always we will have set it to the + // hand cursor before we get here. + SetCursor(&(gQDPtr->arrow)); + + // Now that weÕve queried the user about this mime type, + // add it to our list so we wonÕt bug them again. + AddMimeTypeToList(ourType); + + // + // If the user clicked "Get the Plug-in", either execute the + // JavaScript file-installation URL, or ask Netscape to open + // a new window with the page URL. The title of the window + // is arbitrary since it has nothing to do with the actual + // window title shown to the user (itÕs only used internally). + // + if (fFileURL != NULL) { + (void) NPN_GetURL(fInstance, fFileURL, "_current"); + } else if (fPageURL != NULL) { + NPN_GetURL(fInstance, fPageURL, "_blank"); + } else { + pTheURL = MakeDefaultURL(); + if (!m_bJavaScript) { + NPN_GetURL(fInstance, pTheURL, "_blank"); + } else { + NPN_GetURL(fInstance, pTheURL, NULL); + } + NPN_MemFree(pTheURL); + } + + fUserInstalledPlugin = true; + if (FocusDraw()) { + Draw(kUnhilited); + RestoreDraw(); + } + } +} + +void CPlugin::RefreshPluginPage() +{ + (void) NPN_GetURL(fInstance, "javascript:navigator.plugins.refresh(true);", "_self"); +} + +void CPlugin::DrawString(const unsigned char* text, short width, short height, short centerX, Rect drawRect) +{ + short length, textHeight, textWidth; + + if(text == NULL) + return; + + length = strlen((char*)text); + TextFont(20); + TextFace(underline); + TextMode(srcCopy); + TextSize(10); + + FontInfo fontInfo; + GetFontInfo(&fontInfo); + + textHeight = fontInfo.ascent + fontInfo.descent + fontInfo.leading; + textWidth = TextWidth(text, 0, length); + + if (width > textWidth && height > textHeight + 32) + { + MoveTo(centerX - (textWidth >> 1), drawRect.bottom + textHeight); + DrawText(text, 0, length); + } +} + +Boolean CPlugin::IsPluginHidden(int16 argc, char* argn[], char* argv[]) +{ + int i; + for(i=0; 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 XLzee>A`vb=7UFUCt4)cN-Twa{)p?j$ literal 0 HcmV?d00001 diff --git a/mozilla/modules/plugin/default/mac/NullPlugin.rsrc b/mozilla/modules/plugin/default/mac/NullPlugin.rsrc new file mode 100644 index 0000000000000000000000000000000000000000..1a09fad814f071ee0369684dfd9dce1e6627c44b GIT binary patch literal 1923 zcma)7O-vg{6n-ABjSW_8<&bhn!)Ob{MZuO@HHsoN;ZFn*awEgGJ_WmGy(}2pve!73 z+A6uWzkWUgI)6u!;_(Zm-Il!!+X0VSn&&ao{eXlH& zx6qpUqwm_45O`{JIyw3$SswJz@&4QKs{^wj(MjJDIJ>T<`p5R*VsHq~$1jAX$m3sO z2xcm=omJ^)w9|=TU}h`zJUG)IrQNBgA|K#U==|_4vo$yqycO>q)55-RPuLxK3=d~U zK6nA=vSe^p><&9|191#Fh5(%3@xE98mHO>=9*G=1!+=K=P{eqdv_o-1q3C*@~{ zg+vTV6W`P0U^pr)ym2uw|+j73Q+?@fmZl4zE@# z$N>X{KL+6E90LSrL=L_}jsX^z<$F!eT?~1(5+m}?1MwR*m@5VzjF(N=snu$n6B%S# zrt;2qsbq1avK;(sTLI)sS+H{O$mT5k66>4yn%jyuhyI15s?6&@C_;^MrFs|F+rGP9 z^p@hBf5drFDS&19K;i7rlTN9jF{ZOct;@r)u6_bN^^MI4eJ?<7#&$otR)J`yq+_zXH=t* zOyty1A)7Laxy6K`hUW9Srm6YRoRP>Ib7(Im@~R?yL3yAczl}wF;P8&7)71DRrxuXE z2Skq8wP+-s;{cN(f4t^ci(xPBG~IfO3y6f zDPV!KpO>ELm50t07P|=FgL7^^`WAk=ScYv8DMT3xau1i^= ze=hWOt~(}$rMqWZ@$q;Gocle~%l83qFaXITym+Ibj#oSi-f*b@AoMMv|1NaQ#Wy&} cbw59JJwu1-SU$U=W=?$I_!V|q$jWE`0T~@@*#H0l literal 0 HcmV?d00001 diff --git a/mozilla/modules/plugin/default/mac/npmac.cpp b/mozilla/modules/plugin/default/mac/npmac.cpp new file mode 100644 index 00000000000..5b75f47c914 --- /dev/null +++ b/mozilla/modules/plugin/default/mac/npmac.cpp @@ -0,0 +1,646 @@ +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +// +// npmac.cpp +// +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +#include +#include +#include +#include +#include +#include + +#define XP_MAC 1 + +// +// 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). +// +#include + + +#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 + +#include "npupp.h" + +#ifdef __MWERKS__ +#ifndef powerc +#pragma pointers_in_A0 +#endif +#endif + +// The following fix for static initializers (which fixes a preious +// 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 +#endif + + + + + + +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +// +// Globals +// +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +QDGlobals* gQDPtr; // Pointer to NetscapeÕs QuickDraw globals +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. +// 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); +} + + +JRIEnv* NPN_GetJavaEnv(void) +{ + return CallNPN_GetJavaEnvProc( gNetscapeFuncs.getJavaEnv ); +} + +jobject NPN_GetJavaPeer(NPP instance) +{ + return CallNPN_GetJavaPeerProc( gNetscapeFuncs.getJavaPeer, instance ); +} + +NPError 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); +} + +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +// +// Wrapper functions for all calls from Netscape to the plugin. +// These functions let the plugin developer just create the APIs +// as documented and defined in npapi.h, without needing to +// install those functions in the function table or worry about +// setting up globals for 68K plugins. +// +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +NPError Private_Initialize(void); +void Private_Shutdown(void); +NPError Private_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData* saved); +NPError Private_Destroy(NPP instance, NPSavedData** save); +NPError Private_SetWindow(NPP instance, NPWindow* window); +NPError Private_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype); +NPError Private_DestroyStream(NPP instance, NPStream* stream, NPError reason); +int32 Private_WriteReady(NPP instance, NPStream* stream); +int32 Private_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer); +void Private_StreamAsFile(NPP instance, NPStream* stream, const char* fname); +void Private_Print(NPP instance, NPPrint* platformPrint); +int16 Private_HandleEvent(NPP instance, void* event); +void Private_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData); +jobject Private_GetJavaClass(void); + + +NPError Private_Initialize(void) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pInitialize;g;"); + err = NPP_Initialize(); + ExitCodeResource(); + return err; +} + +void Private_Shutdown(void) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pShutdown;g;"); + NPP_Shutdown(); + + __destroy_global_chain(); + + ExitCodeResource(); +} + + +NPError Private_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData* saved) +{ + EnterCodeResource(); + NPError ret = NPP_New(pluginType, instance, mode, argc, argn, argv, saved); + PLUGINDEBUGSTR("\pNew;g;"); + ExitCodeResource(); + return ret; +} + +NPError Private_Destroy(NPP instance, NPSavedData** save) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pDestroy;g;"); + err = NPP_Destroy(instance, save); + ExitCodeResource(); + return err; +} + +NPError Private_SetWindow(NPP instance, NPWindow* window) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pSetWindow;g;"); + err = NPP_SetWindow(instance, window); + ExitCodeResource(); + return err; +} + +NPError Private_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pNewStream;g;"); + err = NPP_NewStream(instance, type, stream, seekable, stype); + ExitCodeResource(); + return err; +} + +int32 Private_WriteReady(NPP instance, NPStream* stream) +{ + int32 result; + EnterCodeResource(); + PLUGINDEBUGSTR("\pWriteReady;g;"); + result = NPP_WriteReady(instance, stream); + ExitCodeResource(); + return result; +} + +int32 Private_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer) +{ + int32 result; + EnterCodeResource(); + PLUGINDEBUGSTR("\pWrite;g;"); + result = NPP_Write(instance, stream, offset, len, buffer); + ExitCodeResource(); + return result; +} + +void Private_StreamAsFile(NPP instance, NPStream* stream, const char* fname) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pStreamAsFile;g;"); + NPP_StreamAsFile(instance, stream, fname); + ExitCodeResource(); +} + + +NPError Private_DestroyStream(NPP instance, NPStream* stream, NPError reason) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pDestroyStream;g;"); + err = NPP_DestroyStream(instance, stream, reason); + ExitCodeResource(); + return err; +} + +int16 Private_HandleEvent(NPP instance, void* event) +{ + int16 result; + EnterCodeResource(); + PLUGINDEBUGSTR("\pHandleEvent;g;"); + result = NPP_HandleEvent(instance, event); + ExitCodeResource(); + return result; +} + +void Private_Print(NPP instance, NPPrint* platformPrint) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pPrint;g;"); + NPP_Print(instance, platformPrint); + ExitCodeResource(); +} + +void Private_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pURLNotify;g;"); + NPP_URLNotify(instance, url, reason, notifyData); + ExitCodeResource(); +} + + +jobject Private_GetJavaClass(void) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pGetJavaClass;g;"); + + jobject clazz = NPP_GetJavaClass(); + ExitCodeResource(); + if (clazz) + { + JRIEnv* env = NPN_GetJavaEnv(); + return (jobject)JRI_NewGlobalRef(env, clazz); + } + return NULL; +} + + +void SetUpQD(void); +void SetUpQD(void) +{ + ProcessSerialNumber PSN; + FSSpec myFSSpec; + Str63 name; + ProcessInfoRec infoRec; + OSErr result = noErr; + CFragConnectionID connID; + Str255 errName; + + // + // Memorize the pluginÕs resource file + // refnum for later use. + // + gResFile = CurResFile(); + + // + // Ask the system if CFM is available. + // + long response; + OSErr err = Gestalt(gestaltCFMAttr, &response); + Boolean hasCFM = BitTst(&response, 31-gestaltCFMPresent); + + 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. + // + infoRec.processInfoLength = sizeof(ProcessInfoRec); + infoRec.processName = name; + infoRec.processAppSpec = &myFSSpec; + + 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; + + 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; + 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))); + } + +} + + + +NPError main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp); + +#pragma export on +#if GENERATINGCFM +RoutineDescriptor mainRD = BUILD_ROUTINE_DESCRIPTOR(uppNPP_MainEntryProcInfo, main); +#endif +#pragma export off + + +NPError main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pmain"); + + __InitCode__(); + + 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 = 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; + + // + // 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); + if( navMinorVers >= NPVERS_HAS_NOTIFICATION ) + { + pluginFuncs->urlnotify = NewNPP_URLNotifyProc(Private_URLNotify); + } + if( navMinorVers >= NPVERS_HAS_LIVECONNECT ) + { + pluginFuncs->javaClass = (JRIGlobalRef) Private_GetJavaClass(); + } + *unloadUpp = NewNPP_ShutdownProc(Private_Shutdown); + SetUpQD(); + err = Private_Initialize(); + } + + ExitCodeResource(); + return err; +} diff --git a/mozilla/modules/plugin/samples/default/mac/Default Plug-in b/mozilla/modules/plugin/samples/default/mac/Default Plug-in new file mode 100644 index 0000000000000000000000000000000000000000..1b38c7bae48e5cf72a0d75d27e35b155107cd6c4 GIT binary patch literal 27117 zcmeHw4SZ9_mG4|hwq>e-k~)b424rKl0t6Anq}P@qGIodvhALow@$RFGgef{&YU@OX6{^>Wn9CUgE6fZ;Y;6*SM)Mg1q!S_k&9jpMR`6ZVitPTp4G~2)5(QW@G2evL6R( z5vqfdWG*vM+7=%4pzh%uW}&oko9{M=~DTwzKR|GW&y zu11)Q@CAhH5oCligfAgfBZLv|K)4H`17RD&PJ}%OeFz5;4kNsV@Fv195I(Xn$%^nf zgdBt!2=fqbLa0ReON8|ZO$fj%0k8A`LJz_d2;V_?7U5-t*Ad=8cnje}gmV^V8HX?t z!HrOaP=T-c zcrC@ZMB~ARrZ@{m>z6k)Z3xHM;+5sGhUO@%iYDTVQCm+m)W_MX#+qp@~;c~jIx3-B%mg-hz! zHL#oSYzfB%M!+lTn(tWL6kfj}3JyRa=az_A5sk!&&=n0W@w)nGMYK86RM!}9;N+Gs zi8Ry`xpPO!SaHjuMd8RD*V)mW++JKzT{3_Cl-TL@)mAPIj)86+j zvh7onlM>3K(-Hy3dQ(#vQ&?8q%~;ak#+<1ak>8&cN11zDD}Z-r#XXZW&EL)(a<8TV z?z}yexv+|5E>xanPo}1hX)p4;{cg1HLHj(>9+r}~S4I1Y?8)SQ7W7PpAp-v7-d_<- zA)m%1-_Mw2;P!wsl;;?Ws|r$0+1k9?F+_ps{TLu_r|DYmXnVzq7gEEZt)N2m?) z13bi6hMD#b(9;2W3_i!wr?gH=jG?8d<9y$R)OUbow@@E?dg2U9%LrZIf%^SJ`|E0B ztH<9+3eV( zeJsYWU)h5Bv3puVjD_E=>!;j{v2oM%YiCZ9MfX%bj;@Zk0f$^jN0Wy?N+jPU`Pp9~ zJ|L%R=v0t&${3dp^z}RYhyI9uy&dO9^`cPplV|7$`Z-1YR7Elu3SGEtpVTjnpV9w| zk~X08Ju+DGn7yjxW&7%qckCgb#a`_zu-63GvZvHCmeU_*Ka$tlkM=>n0k-^Rg2^Fi zG19m3bh|y)Rl{{d1#Fdo)e@{Uw6aQ$tZ>OHYYVW-JE@HHUC6gv)#Xa^+pZ=V`$`96 ztvj>gtsPlKa)jpewRaMaU7I1#>-ZQ@-H>m9NhK%%-yUk09QY_fb_4dTNU^dfRn%{- zc{owh3|J?@@}Eo|&MInEc{%g9X~#elVSC44Uk`a3{B>bJVKB}(QRFwnIZ^!vxqf2n$W z4ljLW4E^l^cI$7($bX+n{@q;uR`lxx{Z@nitAE4k-vs)v9i>0!Q<)?)#`-089An_+ zW1yZ+_<97rd%?p)a2~_#xNKz-)l)*CeINMf03Rf4^o4OaD)$0+y1JZ~ThET+1$uVt z^fA2jnRw|TdQ!ko>l^z1XVCG_x;|Z<&-vMiKCdzHgY`r3b8M8K(3=V0-6nn>vH_O27X@C`N_GB^V0%;t~T-GALZxh zC_nxmCwzZp;^(WJpQD1Gqoe$kbADdCfS+`AIX_GOlK25lKQhLJWC`0cfY^fg2;x%2 zodTYcC7yp?4x>&RBmV!6aKP5ckfp4z^Xz%xEXCTeP=3sEOn%w!0RAg3tf##Jo4gbD z$x*5<`;y$ba%E}nq9yYF|NwySf+H0WoW{Ib-K@}E*UXgU#Kfn}7|ZAHM~pWsn~>+7WCmh&a}8`j64 zg{?L0F65y5Xlv~;6*}sMtZ4lJjWJrofFqmZSZl8xQ(mi=-||aQUNfe=MlZjrg>(Y= zLSxE9qI{JoUp=OLwJ4u2%B#neSBvtisT}LuMLrYxnS#H5k|WmsnDXqb1bm^5%4fdB zmb~)BmIX@_To0x)n~2AY_$uIxbxnnHDzT0IQ{msBAFQ==MC?hH{}}7*qBp32r8TRF zY`Q)Vu3SQ}t|S`=J21|WDeS*+-Daq>SW{12*A z1s_+mr?p-}|FbcN9D;_~WLuz1net2QngF|!uTKJI1MFJBzD#)dI(-5DtSbo)9!LEG zvrkI?h@l%KJMfWb&;k5;;QI-p-Nc`h_zN&6_nQE}%2fXWdP&+lAOuSV3n&P0DH@XsOqu!Vg80AG3rm791Ge2-f|aG}?8 z$Y&j^2j>05OZnQnLiVbn@cG=MD$Le#nmKuV7<;$3$2TTF9p4Ba`~$KVs9%9`vGtRE zSZn!Ez!nPFBEW_OOct!UtB5O;gIPt$FHa8eIOu_`!1y{mQ<$wxl?nsQKbz(P z){hFLi$xlKu>WR}zEy6wA0t`Go$O@;4qkgmM05#4YQhhCT-Y;LgC2^57%Q_a_sbKtGn}7^%t?I6lX<>Up3L(>!i9N} zk(~Z|0_$2#eU--irXLdSRNknrI7wGJ_?iIw1AU-$vIF*t?8+;!fB%N?^{gW74{vSD zXUj3}TsOgI3VRQg)}H4uhL@ew*b|Z-fPdcBq%+3|4mzc!+PP1By?m}z>oU>hfH^43 zk1`kJ!tE;At=ms$F1)=LX9QN}$DDH$j@t)EZ7Qw9H0SJO7l8MXVG;qj*4ywN)HAR;X#*pv10xYX8gnGc~)cLT#KzTha8GH9pn|nDsbHQFvx4|}| z0e#UK1NAY8d1&i6jDyk_F~^aH4qsDcvn>?qiHeQeqNn8~%MGvv++WepHx^t+)?!{XK|?e2nqv-&j-M^-QFF3?HZQtw+9- zNbdhtLj5_>RLtu`X9hsy_~btFF-nRF2Ve(AY1sEoq9J?{ZJm1wzC_R#GiXyMjrxqW zI-SL@5Kg5DKEvIFyO^)FO5_29?%7lhy00?%2()j$N_`mf1oWbfL01m#qg!dOHU+X$ zM+Pu<3D}ZG?#E)h3|nGa8+z&71Y=X>YqziV4f1uBsgp--mpiS=a=Z2O>hsWxx2YeQj~isX zlgiW{j!*c1Of|_buFFf_N^~iAO-f*Gsz&=3p5F|+_*dwEt>sR@!g`&FIkaC=Hd}H6 zEb|QxJ5LioKLahZuwSWG-vmA9*tlW~wg2KzsV=7nXL*okXsm61@sM^>p9>?sM2pfh zE#ZUBh20l>7azAD3en}tD$@5Zl1H3TOq2N;i;vqI)Y^NQa$tUaL$!gK^LfnC!Kh zjJ!#@{(Z6u%BD$)l!E>tH-ak@blxHJW8^c#*8VlhxLo+$hF&h!hEJJnS03;%bvL_8e#{CT zwit7p_DqIdHtLK=odu}#2+;$btspN_#GBtgrMg0sa-=bHk=ofUZWY zY24~qu z%+L8>=DHSQHl*uB8vM_15oy@j`E5K6dxG@eQMwOjH8>xkGn|rSZ$VCS@4xdi64)D- z`) zHd&qU9=!`v53$wiDHaN_d1YLN5!g+WUuEz$7MH-2C#%+13_Jlg_neT^s9$!e_M&Ye z#_tnqi+0?u{;qySJ2%?#KGBZr$K~3IHbrPNAN9HZU9LXOk1?{UxL8(mxgAl`$jW@? zvQ#_$OAHZzA4fW6?%V9M8uCT`x2Zn%A3QeKH)LtXZ_qpT-5};-BcJCO_g=g=?8AFQ zjB_pabg?#+p`Ts94_%k)%fJg9pZw=>yqo{W;vjwQKE&43`%r@>=u;>K81ahvGvklN zZQuis=l)n6L|@k-Rx_49%()t!zSH0OeQ+DPVT?85HRvOLK_mAy{}5d<+V?>>(0OQ}C&tnF`UFFKE}3$We%{jj+Yn#bnzEu*jV{>-`KzL)LC zbldNJifkm#k&gD)(7VjYIyus`9{vl?oV?uc><=?P{4v-aHWe^lpZp4wFC2t_fOj8K zr7TG)#6iT^^Gf1fh=tCW@s7j-zYgg(sS zJSu#UUdZwga1S!6Sds$8`K+|Kj0J#;uZLz_XeXmxKyH_wqBT=KMC-SA0bf%t?6Xj| z*iX=VfApP;I&=A&K|Y#QyOH4V6J_{`UfRnTvNgZszF>_7ZsifIvv?l>8N;rYEtGxiuu;BZp3cH9>gBR zUc_F{B$i#K^7ci@7XdCKmQC=K4bXf6B z_`jHS`F@k@T40?-FhH^RL6F4VoZ(yK(4CX`O*E%s}g_ZOh2Ge1X( zT$i)OUY4W$qBuv%^gFjqFTRrZXSXJ{d|_$AJB~?1R}Dwo@!a#-9| z%D{UBmF=VU%i1Bs)0!q9(X?X5SS8LD0k_LrwISdQ$u^c%#oixLveBQuN2*L^!tUFd zy*mqc=Q5cEu?4Xeu@$imu?=ws;ta%@h%*sqA|yJ7Ir1(;oapYv2BgN{+2aGMw9LDh!6&wg#N3-lvx#~iRDZAaRH*n!xI z*oim?aSq~K#JPy`5a)H;m}_SybAk4QO159;E89=+33E_JxQ9`WOWE4Tpw|ZaF^5@y zRp0v~CVGcJFUkFP(t8v%0_OnHc@lIY??miGoQpUYu?w*au^X`)u@|uyv5Z(gW@G-h zGMWEU^rDP#522jKiRiV1UOVXv=?IMlWUGzp%6mdrE|zO$3S-7~1!Ie}r5pN!*oxSS z*oN4KI0JD8;!MPuh_eu9VZ7}@=3h<)rysmU+E~NKs@_v5q=-f`{rciUz?;_|7 z^yCcfiAk?s3Tq#boyFXdgb&$>{emomH=K(VBa|Tc5a=F>AE9E~UYzs4W8Ig00ryNN zv*~yrE%|ETPi!UI%Tf>TVGGnYm}#_;TYK0A4A@YJnhLF5yPj-@`K(+*&;m+dMgos z4{;FwFs6?>G=GfZNG-dtg&gKX1n&j+e%x z>b@6ob_h8y)ijb#weU&ZbY2OYX6r(%TKWBjO8ENlVe|RpQ<$SsepX+yC;|fMjMk%D#pm9!l*M=Cg^7) z^$pq9f{r}QJxg~O`WeC;$2}{f9qQF${AoRMB3)V5E;(`T=t4RMcqh_1DbzRLuch|D zW5;+0phHr38@m&EhJ0-ba}Vb)argn$Zw|^v`vM=w0N)7s5#VeDP7C@tn2t8o?-|p# zRrGBWeOt!%E$|nb@aLk=MSK&Ts2c+Kw+zuImmgsKo|2do4nvM& zj?rC%Zlp`y`aPA4^pWvJ)6z3FGTC z(MtBoiZZ&VV%KS5C!ueki5)lfe+2zo1ut1tALae$`vb4={Xt(3@CX^QE~6jOj_e?{ zOMv#VxM~2S_Nz_pgQ7i+4cUGJFWG*>#uoxk>qaBlbc9OqV6y3F<3>A@FJCLMz9CKP zYzXTcUqk=YI*R_gv2W^nj{64scPz$vP1hc*#fPvbKgHa5pW(SbpLy>uV?}Lk%yVxU zn|5!QO>fI*?t3Mc58ha}P17*9nY<7F2=cxGu0w?$2aogIIM_<;pK#Y1a>m#d0%j+_4C!1d z7ikC5PD(3>KYLJl_3TfSS960(xy58v;J^S)m!sWeRgS zmB_x67xb)j$4KQGGcROSnD9dsFWMc#?L(gAAAp^#Hv3g;>qZ(WBGQyXdzo3>AktsnjfEBRE{ zVSJayb-3iWTwh2RSZib=a9eoaT&J(&va+Mjh%$9Bs9bBw5k8`!(?^sk2k{Q{U=XzH zIvs*eXA7O)4V~T%o!$+d-VL4J4V~T%o!$+d-Ys-GB6J$_05Go8(BDhZlPh?2K0FmP z>pYGSPki2zjsuRd^nf?Mj*aTL4!=;x0TXBWDcDT)S+3u@%_M&wW5xFoxMM+QiBdP# zN$L}E2F-^Q@(SuzBCYH#$SKZXncMq7*M9A|@;H1q>;=((g|ZjE_kNZ^_D9LUUK(p_ z3VTp}tgwe880KQiPU~;h2!B>IsSyw5dw*Y`Uk?{;_Scc0%pr48Y3(+O?R-es~8^nU0FY{XI6h-0t~ z$6*^zbm04zZDs8Ho=MU<+KX;$WB<5q4|_#x~S5qg#J{;+GP3v!^feIa63Kh{<` zjPxP4D8O>|(77RWd$I2jyG41F?iR5;*z3jQ$DqyPKKL3k_RnZnLG|2_Dan32t!o&^ zvUZJpv0IQ{0-ik>Z>N|)gzF&E%K_hs^Z}xS@F3lL)FK@p#+fwgmnu__Kj|yhK7-#h z7j<*#?hM|2U=8~`e_w?9l>(Ll*qtHZ0ZbO{hK+XeW&qoze?T4n-UfAY1nfD$im9D` zFUNKq{SAwHoy?=0kU9shRY2xxbs&f>Cmi<9#` zk==~=K!Dk501x<8+iIc#>Gj~tfjsu7(z}FPVJGRV$%(O8BtOj0hToumJ=n{Z!M-Wh zlX!Q}irjfzmmI#kxz0IgYDa3i;^r5-;CHR>N{!7lA)79^cSc8==?7k zVYlG`qQ(bi0jGWZV)RXCBSedXXu%ovvOe%yj5Q5o#}u120iGNb@JYI z>&2O`ti0lSP#L(UvC4`$#U|!}+;NJEbsI3~y%#o0<7F!3_zRqqXwVxQ*-q`K2WN%2 zpD?fm-%54Ej-U+o@n}$)q}#`b*P!00E?afIoCJE|hkz!RJPGe)a4!SnLcWW=2RMo# z8{i%yIVq1$Bpq~+uA0g|#(6#W;|jyG508w{B#d{5y@$(_UYS(zJad` z>Jy%#LG+3CByS~a(U^6^Vh7EOmDI`Gl%K&q_Huc}AYZ#&!_VPp?v9>slFtZvdO@qV z8}uWLAe=)OM)(ZjQ-rhNV+gjE&imd{GBB1{hY&Mr2U;A&C;3cRUuYgWw`am$L%#^F zSp76MPEHs4!}z{SFeL(>)&IJ+E!`MGr^xp9qA&VpnDoNYlLURR!JH;02NfHq>jMQV zky0ZEL2sh!{CXQqfgi|0Lrn4+K}<3_hj89KJh4UnhGrsF%2D=_R#sh_kN^!T@&z8mZ76)$jDbkgQz&&-^% zc1JDta!kGtcz2VIe4fAGqy2-w-BGE38}A4x|Gn`xy*|DAy+&BY(412LYkUgrxJMBKyA^oNE z0Vm$grx0W9wmhYV!8d-Pp~}i`lsixcInbR&)rN1#!#ESh*_w(ukNhz5G2|Q3$5X&Z z=d{MUOmmZLVghh0(v3*xZaau|Q9ok}ee)SUr>i@j<8cr)(pf+*??1wD)@7~e*sBer zT@lLY{3K75;SA1N(cYmAwd>_MW80*{;91`XI+DG(pElW=K%Q(W<>MkxI1i{{O9Jvx zT5(4m{1k#8x4Oro0@m5uu{VKzxCbz=ddQLjYBN0v(CG%u0~n_hc`x!s$m=xj!TWlNl_IaxxJQ4- zfV@uQ9=xZ=89wqljeBs8k24fOW3{>m=hK&@^VhfObY`lp^ZJ9hGmf*dQJw4g6X={< z%nL*3;zH+QkXsJv9OBU4KasxO-fLTE);E4et?S>PxxW4Shx$0$4*q%T+Xtrvolaff zY?UT`dp?c6*@TV5JEZ@#jgv2W8ShriSW4g@>3tJEt_9`rFL0H(U zu&@PTVXwl%7U2CB=6(?U=(YgwxRC!H_Ubp^(#Hko9o!CBo)+Vh1v~3E+i0~z8+P0H zT4cvQ>Ii()7P;4gbD5v-q4k~o$1>I8Eh%FyCjR-F&|Z$VSLtm_7D?YjA9q7`w3d00 zzUwRV7^8g23R;gWUdX6Zxf1o;EQQLIv`4q(Q9Ywgd%mSpZo+#16!$wo!#lHy2J#8; zUg%8gyj<8c>HXI79cY`efXb9RCm}7JAfAXv{(cZ?*d2=+!M@704kDc!U{?Ajlg{m7 ztE^q%DR)N)jk~pz?sn04AxI|#tP!y-sg5*u>F^NsL9zhNw2tfFW8wWTcuT*IOO|f* zN$b4_^}3*w+cBP9Dc}@)4)XEnERD`DNN0EQG5W7t`^nFtwI6#?oWEdRz~`g!ETy?X zzgr>l9{OI%lsDFSKHl`s)hH`*aeC?9z;tR$G7+%Amcz{$6YC>j(I>o=gOpfhyn~i$i&d-n-yV=V@;c->fqECG>-{pQYNro+91l-?6e! z>8_?-g%4@ITW8$s9orx7g)p4)_xs*uY{wxc?>NQZ@wdgBoeve@02|gvA5%N3aI3tYRpU)caFM}L$uOI&5YMk|j z=*}SSP=w92lZ*&XcV)K252rmcWDcFvK2|!W@jGVxe$QV0z7>`Aa2?QpON!c6sr)yf z9N1Iy`!(A;fCIV%9A~ILzf%^{@7lDrv!h*fPtgH+Rzm(bSDhQ!8hC9Qcu^X7Fb(`*8u+m^@SSPk18LwnY2c-4 z;Py1|L>jn~2EH#1ye|#BDh>QV8hB$GxIYcNCJp>Z8u<1!@IV@PVH)`Jmx7ahBskee zvXf*Z$yUR?s#5VCsU3Fp|DDHv3`-&;Vy{A2jSxbpMyNrkMTj9Bg-eKF+lLrSr!hbyi3%c~QOBHdYhzTj4sn3g86>*^+PZ<<(r-=P}Jb75e0`KG+JwH7tVu8Q1 zoAQ4X-Wb+@tG8qme&DuY)0_tUrmnky6?h67V=egoVI<-W4Y9T1rUms49{dJxyrr2^ zP0?oj=x}&#EXv`LriK_*;$^kby7jg31@q?5^K7D@NrD$LfbjfLy)F!Nd;-dMLjjNd1oqchn&rzyG)9M!tx zO)XJSx~4fATgL)RDk^SX&Z<_dx*3FgV+1cAMxP1qF^SorZzm0qWIPsnjLiAiX20<9 zjy?k3%OCX;k6t0fAG`#==%I2+w7aO#0Ek}vdaSA1P95of0~ z73mK|VX@jWGPCU2<38uOV*CW>l~;W}=jv;&&Ao2oq`b*frn>SArWH>Ai!Zom%$((! zJ?DDw+<7+?&A;)Ba&d{Tbiu-#{Nc5cn&`UqwRL}UM{GlVL*t!I&GD9vn-ZJv`fsbh z{MTzj>C5j{wzMX{viSGFN}U)TK)?AZC$2OsL*^|gn49(i&2J)pZfN9p8oFl{^8&=&p!A33opJjaOma3M_zgLACG?jwbZtU zfAE9jKm5^;PrUJye>r*bU*CM|?VtU8@YFk}-@Ui%p8M~6VCPqNJhbafch94beDWW^ z9Xk8zXT#@4psQZYfA2nocNv@K{Lck1Y~k;VV{QU{qW;+aFNI?+(TKWp{paz|J*cP6 z^(j5;3{He9M1VaSO&c&%JPSNi`K*(sdO4=FsqW?QTu|o071DhO2mXK%zeL?j!3gK} zOVlNJw+W8^Z}cF@zkis2;^MlOf^nRVi|cZDo(b-mO)CjZ<~qaJ{QvmRQUVgF%EY-s z1_JxnKT8t-_Y#HgeWaPvOmyO4Qg&G^=8A7_j5Z@bpIHi)N8`GS{Dc+zNbL5@5N1RRWL0|4pBZsMLxB)+EQ>| zHy@)jYDP8A^ehDh8oO`Tu3eP3z{f2pa24El&!$a!9@&Bd_wIXEG2~aZ^IW_8tjMd^ ze+c~Ay+ik`%5FsYnzN|_!r$G(c2Ry+DuMp)N!-(ty(vWb+bQ3&Y7@(DBz)CG&-E=@ zFnbrzt2#X{wrf*}%2iHJ0o(OZi2AQ4>IzW$5cVjPw@{8{Khy|u@%;54GO&VDo?oS% zO=Ul{X=BL9SF7llGAx7YuUeJ8YuAN&QJF3MLax8`|9Wb!=ycLumY=IDdD zbCwe#^yv&rDsbylHU8BM?L1KVjlyw-7N^B-vE#4Q*lf79q#FO$5B+vHIdT*JO&ysq zGGRCi|9~SCVajCufsx1^uG(l*)D>@Vt&hfC@!F`19Cs{;s8QxO?PBVMg_+aburA)h z|H#UmD*Pc8{OON5E92p&_)5Sxg`1-KA7F78Om8lj0VH4e3sX1Yb@=NpE^JWn7e`|F zYbv81ivDWj@y3$tuaB&+n={&9q+tUAX0NTQzg}!At_Q7a^zYD9Z)YNbX{v6NBVCAwetz5}Pb_u!tFCXsosQ>@~ literal 0 HcmV?d00001 diff --git a/mozilla/modules/plugin/samples/default/mac/NullPlugin.cpp b/mozilla/modules/plugin/samples/default/mac/NullPlugin.cpp new file mode 100644 index 00000000000..e93c95c2b58 --- /dev/null +++ b/mozilla/modules/plugin/samples/default/mac/NullPlugin.cpp @@ -0,0 +1,1130 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is Netscape Communications + * Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + + +#ifndef _NPAPI_H_ +#include "npapi.h" +#endif + + +#include +#include +#include + +#define PLUGINFINDER_COMMAND_BEGINNING "javascript:window.open(\"" +#define PLUGINFINDER_COMMAND_END "\",\"plugin\",\"toolbar=no,status=no,resizeable=no,scrollbars=no,height=252,width=626\");" +#define PLUGINFINDER_COMMAND_END2 "\",\"plugin\",\"toolbar=no,status=no,resizeable=yes,scrollbars=yes,height=252,width=626\");" + + +// +// Instance state information about the plugin. +// +class CPlugin +{ +public: + enum HiliteState { kUnhilited = 0, kHilited = 1 }; + + static NPError Initialize(); + static void Shutdown(); + + void Constructor(NPP instance, NPMIMEType type, uint16 mode, int16 argc, char* argn[], char* argv[]); + void Destructor(); + + void SetWindow(NPWindow* window); + void Print(NPPrint* printInfo); + Boolean HandleEvent(EventRecord*); + +protected: + void Draw(HiliteState hilite); + void DrawString(const unsigned char* text, short width, short height, short centerX, Rect drawRect); + void MouseDown(); + + Boolean FocusDraw(); + void RestoreDraw(); + + void DetermineURL(int16 argc, char* argn[], char* argv[]); + char * MakeDefaultURL(void); + void AddMimeTypeToList(StringPtr cTypeString); + Boolean CheckMimeTypes(); + void AskAndLoadURL(); + void RefreshPluginPage(); + + Ptr New(UInt32 size); + void Delete(Ptr ptr); + + Boolean IsPluginHidden(int16 argc, char* argn[], char* argv[]); + +private: + static CIconHandle sIconHandle; + static CursHandle sHandCursor; + static char* sAltText; + static char* sInstallCommand; + static char* sDefaultPage; + static char* sRefreshText; + static char* sJavaScriptPage; + static FSSpec sDataFileSpec; + + NPP fInstance; + NPWindow* fWindow; + uint16 fMode; + NPMIMEType fType; + char* fPageURL; + char* fFileURL; + NPBool m_bOffline; + NPBool m_bJavaScript; + + GrafPtr fSavePort; + RgnHandle fSaveClip; + Rect fRevealedRect; + short fSavePortTop; + short fSavePortLeft; + Boolean fUserInstalledPlugin; + Boolean fHiddenPlugin; + Boolean fAskedLoadURL; +}; + + +CIconHandle CPlugin::sIconHandle = NULL; +CursHandle CPlugin::sHandCursor = NULL; +char* CPlugin::sAltText = NULL; +char* CPlugin::sInstallCommand = NULL; +char* CPlugin::sDefaultPage = NULL; +char* CPlugin::sRefreshText = NULL; +char* CPlugin::sJavaScriptPage = NULL; +FSSpec CPlugin::sDataFileSpec; + +extern short gResFile; +extern QDGlobals* gQDPtr; + + +// 'cicn' +const short rBrokenPluginIcon = 326; + +// 'CURS' +const short rHandCursor = 128; + +// 'STR ' +const short rDefaultPluginURL = 128; +const short rAltTextString = 129; +const short rJavaScriptInstallCommand = 130; +const short rRefreshTextString = 131; +const short rJavaScriptPageURL = 132; + +// 'STR#' +const short rTypeListStrings = 129; + +static char szPluginFinderCommandBeginning[] = PLUGINFINDER_COMMAND_BEGINNING; +static char szPluginFinderCommandEnd[] = PLUGINFINDER_COMMAND_END; + + +//------------------------------------------------------------------------------------ +// strcasecomp: Why don't the MW C libraries have this?? +//------------------------------------------------------------------------------------ +#define XP_TO_LOWER(i) ((((unsigned int) (i)) > 0x7f) ? (int) (i) : tolower(i)) +int strcasecmp (const char* one, const char *two); + +int strcasecmp (const char* one, const char *two) +{ + const char *pA; + const char *pB; + + for(pA=one, pB=two; *pA && *pB; pA++, pB++) + { + int tmp = XP_TO_LOWER(*pA) - XP_TO_LOWER(*pB); + if (tmp) + return tmp; + } + if (*pA) + return 1; + if (*pB) + return -1; + return 0; +} + + +//------------------------------------------------------------------------------------ +// NPP_Initialize: +//------------------------------------------------------------------------------------ +NPError NPP_Initialize(void) +{ + return CPlugin::Initialize(); +} + + +//------------------------------------------------------------------------------------ +// NPP_Shutdown: +//------------------------------------------------------------------------------------ +void NPP_Shutdown(void) +{ + CPlugin::Shutdown(); +} + + +//------------------------------------------------------------------------------------ +// NPP_New: +//------------------------------------------------------------------------------------ +NPError NPP_New(NPMIMEType type, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData*) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + CPlugin* This = (CPlugin*) (char*)NPN_MemAlloc(sizeof(CPlugin)); + instance->pdata = This; + if (This != NULL) + { + This->Constructor(instance, type, mode, argc, argn, argv); + return NPERR_NO_ERROR; + } + else + return NPERR_OUT_OF_MEMORY_ERROR; +} + + + + +//------------------------------------------------------------------------------------ +// NPP_Destroy: +//------------------------------------------------------------------------------------ +NPError NP_LOADDS +NPP_Destroy(NPP instance, NPSavedData** /*save*/) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + CPlugin* This = (CPlugin*) instance->pdata; + + if (This != NULL) + { + This->Destructor(); + NPN_MemFree(This); + instance->pdata = NULL; + } + + return NPERR_NO_ERROR; +} + + + + +//------------------------------------------------------------------------------------ +// NPP_SetWindow: +//------------------------------------------------------------------------------------ +NPError NPP_SetWindow(NPP instance, NPWindow* window) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + CPlugin* This = (CPlugin*) instance->pdata; + if (This != NULL) + This->SetWindow(window); + + return NPERR_NO_ERROR; +} + + + +//------------------------------------------------------------------------------------ +// NPP_NewStream: +//------------------------------------------------------------------------------------ +NPError NP_LOADDS +NPP_NewStream(NPP instance, + NPMIMEType /*type*/, + NPStream* /*stream*/, + NPBool /*seekable*/, + uint16* /*stype*/) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + return NPERR_NO_ERROR; +} + + + +int32 STREAMBUFSIZE = 0X0FFFFFFF; // If we are reading from a file in NPAsFile + // mode so we can take any size stream in our + // write call (since we ignore it) + +//------------------------------------------------------------------------------------ +// NPP_WriteReady: +//------------------------------------------------------------------------------------ +int32 NP_LOADDS +NPP_WriteReady(NPP /*instance*/, NPStream* /*stream*/) +{ + return STREAMBUFSIZE; // Number of bytes ready to accept in NPP_Write() +} + + + +//------------------------------------------------------------------------------------ +// NPP_Write: +//------------------------------------------------------------------------------------ +int32 NP_LOADDS +NPP_Write(NPP /*instance*/, NPStream* /*stream*/, int32 /*offset*/, int32 len, void* /*buffer*/) +{ + return len; // The number of bytes accepted +} + + + +//------------------------------------------------------------------------------------ +// NPP_DestroyStream: +//------------------------------------------------------------------------------------ +NPError NP_LOADDS +NPP_DestroyStream(NPP instance, NPStream* /*stream*/, NPError /*reason*/) +{ + if (instance == NULL) + return NPERR_INVALID_INSTANCE_ERROR; + + return NPERR_NO_ERROR; +} + + +//------------------------------------------------------------------------------------ +// NPP_StreamAsFile: +//------------------------------------------------------------------------------------ +void NP_LOADDS +NPP_StreamAsFile(NPP /*instance*/, NPStream */*stream*/, const char* /*fname*/) +{ +} + + + +//------------------------------------------------------------------------------------ +// NPP_Print: +//------------------------------------------------------------------------------------ +void NP_LOADDS +NPP_Print(NPP instance, NPPrint* printInfo) +{ + if (printInfo == NULL) + return; + + if (instance != NULL) + { + if (printInfo->mode == NP_FULL) + printInfo->print.fullPrint.pluginPrinted = FALSE; // Do the default + else // If not fullscreen, we must be embedded + { + CPlugin* This = (CPlugin*) instance->pdata; + if (This != NULL) + This->Print(printInfo); + } + } + +} + + +//------------------------------------------------------------------------------------ +// NPP_HandleEvent: +// Mac-only. +//------------------------------------------------------------------------------------ +int16 NPP_HandleEvent(NPP instance, void* event) +{ + if (instance != NULL) + { + CPlugin* This = (CPlugin*) instance->pdata; + if (This != NULL && event != NULL) + return This->HandleEvent((EventRecord*) event); + } + + return FALSE; +} + + +//------------------------------------------------------------------------------------ +// NPP_URLNotify: +//------------------------------------------------------------------------------------ +void NPP_URLNotify(NPP /*instance*/, const char* /*url*/, NPReason /*reason*/, void* /*notifyData*/) +{ +} + + +//------------------------------------------------------------------------------------ +// NPP_GetJavaClass: +//------------------------------------------------------------------------------------ +jref NPP_GetJavaClass(void) +{ + return NULL; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Initialize: +//------------------------------------------------------------------------------------ +NPError CPlugin::Initialize() +{ + Handle string; + SInt16 wResFile; + short saveResFile = CurResFile(); + + UseResFile(gResFile); + + // Get Resources + CPlugin::sIconHandle = GetCIcon(rBrokenPluginIcon); + CPlugin::sHandCursor = GetCursor(rHandCursor); + + // Get "alt text" string + string = Get1Resource('STR ', rAltTextString); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sAltText = (char*)NPN_MemAlloc(stringLen +1); + if (CPlugin::sAltText != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sAltText[dest++] = (*string)[src++]; + CPlugin::sAltText[dest++] = 0; + } + } + ReleaseResource(string); + + // Get "refresh text" string + string = Get1Resource('STR ', rRefreshTextString); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sRefreshText = (char*)NPN_MemAlloc(stringLen + 1); + if (CPlugin::sRefreshText != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sRefreshText[dest++] = (*string)[src++]; + CPlugin::sRefreshText[dest++] = 0; + } + } + ReleaseResource(string); + + // Get JavaScript install command string + string = Get1Resource('STR ', rJavaScriptInstallCommand); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sInstallCommand = (char*)NPN_MemAlloc(stringLen + 1); + if (CPlugin::sInstallCommand != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sInstallCommand[dest++] = (*string)[src++]; + CPlugin::sInstallCommand[dest++] = 0; + } + } + ReleaseResource(string); + + // Get default plug-in page URL + string = Get1Resource('STR ', rDefaultPluginURL); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sDefaultPage = (char*)NPN_MemAlloc(stringLen + 1); + if (CPlugin::sDefaultPage != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sDefaultPage[dest++] = (*string)[src++]; + CPlugin::sDefaultPage[dest++] = 0; + } + } + ReleaseResource(string); + + // Get javascript plug-in page URL + string = Get1Resource('STR ', rJavaScriptPageURL); + if (string && *string) + { + short stringLen = (*string)[0]; + CPlugin::sJavaScriptPage = (char*)NPN_MemAlloc(stringLen + 1); + if (CPlugin::sJavaScriptPage != NULL) + { + short src = 1; + short dest = 0; + while (src <= stringLen) + CPlugin::sJavaScriptPage[dest++] = (*string)[src++]; + CPlugin::sJavaScriptPage[dest++] = 0; + } + } + ReleaseResource(string); + + UseResFile(saveResFile); + + { + ProcessSerialNumber psn; + ProcessInfoRec info; + FSSpec fsTheApp; + OSErr wErr; + + psn.highLongOfPSN = 0; + psn.lowLongOfPSN = kCurrentProcess; + + info.processInfoLength = sizeof(ProcessInfoRec); + info.processName = nil; + info.processAppSpec = &fsTheApp; + wErr = ::GetProcessInformation(&psn, &info); + if (wErr == noErr) { + wErr = FSMakeFSSpec(fsTheApp.vRefNum, fsTheApp.parID, "\p:Plug-ins:Default Plug-in Data", + &sDataFileSpec); + if (wErr == fnfErr) { + FSpCreateResFile(&sDataFileSpec, 'MOSS', 'BINA', smSystemScript); + wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdWrPerm); + if (wResFile != -1) { + // create a STR# with 0 entires (i.e. only a count) + string = NewHandleClear(sizeof(SInt16)); + AddResource(string, 'STR#', rTypeListStrings, "\p"); + UpdateResFile(wResFile); + ReleaseResource(string); + } + FSClose(wResFile); + } + } + } + return NPERR_NO_ERROR; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Shutdown: +//------------------------------------------------------------------------------------ +void CPlugin::Shutdown() +{ + if (CPlugin::sIconHandle != NULL) + ::ReleaseResource((Handle) CPlugin::sIconHandle); + if (CPlugin::sHandCursor != NULL) + ::ReleaseResource((Handle) CPlugin::sHandCursor); + + if (CPlugin::sAltText != NULL) + NPN_MemFree(CPlugin::sAltText); + if (CPlugin::sInstallCommand != NULL) + NPN_MemFree(CPlugin::sInstallCommand); + if (CPlugin::sDefaultPage != NULL) + NPN_MemFree(CPlugin::sDefaultPage); + if(CPlugin::sRefreshText != NULL) + NPN_MemFree(CPlugin::sRefreshText); +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Constructor: +//------------------------------------------------------------------------------------ +void CPlugin::Constructor(NPP instance, NPMIMEType type, uint16 mode, int16 argc, char* argn[], char* argv[]) +{ + fWindow = NULL; + fPageURL = NULL; + fFileURL = NULL; + fInstance = instance; + fMode = mode; // Mode is NP_EMBED, NP_FULL, or NP_BACKGROUND (see npapi.h) + fAskedLoadURL = false; + fUserInstalledPlugin = false; + + // Save a copy of our mime type string + short typeLength = strlen(type); + fType = (char*)NPN_MemAlloc(typeLength+1); + if (fType != NULL) + strcpy(fType, type); + + // Make a handy region for use in FocusDraw + fSaveClip = NewRgn(); + + // determine if the plugin is specified as HIDDEN + if(IsPluginHidden(argc, argn, argv)) + fHiddenPlugin = true; + else + fHiddenPlugin = false; + + // Get some information about our environment + NPN_GetValue(fInstance, NPNVisOfflineBool, (void *)&m_bOffline); + NPN_GetValue(fInstance, NPNVjavascriptEnabledBool, (void *)&m_bJavaScript); + + // Figure out what URL we will go to + DetermineURL(argc, argn, argv); +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Destructor: +//------------------------------------------------------------------------------------ +void CPlugin::Destructor() +{ + if (fSaveClip != NULL) + DisposeRgn(fSaveClip); + + if (fType != NULL) + NPN_MemFree(fType); + if (fFileURL != NULL) + NPN_MemFree(fFileURL); + if (fPageURL != NULL) + NPN_MemFree(fPageURL); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::SetWindow: +//------------------------------------------------------------------------------------ +void CPlugin::SetWindow(NPWindow* window) +{ + fWindow = window; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::Print: +// +// To print, we need to retrieve the printing window from the printInfo, +// temporarily make it our window, draw into it, and restore the window. +// +//------------------------------------------------------------------------------------ +void CPlugin::Print(NPPrint* printInfo) +{ + NPWindow* printWindow = &(printInfo->print.embedPrint.window); + + NPWindow* oldWindow = fWindow; + fWindow = printWindow; + + if (FocusDraw()) + { + Draw(kUnhilited); + RestoreDraw(); + } + + fWindow = oldWindow; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::HandleEvent: +//------------------------------------------------------------------------------------ +Boolean CPlugin::HandleEvent(EventRecord* ev) +{ + Boolean eventHandled = false; + + switch (ev->what) + { + case mouseDown: + MouseDown(); + eventHandled = true; + break; + + case updateEvt: + if (FocusDraw()) { + Draw(kUnhilited); + RestoreDraw(); + } + eventHandled = true; + break; + + case adjustCursorEvent: + if (CPlugin::sHandCursor != NULL) + SetCursor(*CPlugin::sHandCursor); + if (fUserInstalledPlugin) { + if (CPlugin::sRefreshText != NULL) + NPN_Status(fInstance, CPlugin::sRefreshText); + } else { + if (CPlugin::sAltText != NULL) + NPN_Status(fInstance, CPlugin::sAltText); + } + eventHandled = true; + break; + + case nullEvent: + // + // NOTE: We have to wait until idle time + // to ask the user if they want to visit + // the URL to avoid reentering XP code. + // + if (!fAskedLoadURL) { + if (CheckMimeTypes()) + AskAndLoadURL(); + fAskedLoadURL = true; + } + break; + default: + break; + } + + return eventHandled; +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::Draw: +//------------------------------------------------------------------------------------ +void CPlugin::Draw(HiliteState hilite) +{ + UInt8 *pTheText; + SInt32 height = fWindow->height; + SInt32 width = fWindow->width; + SInt32 centerX = (width) >> 1; + SInt32 centerY = (height) >> 1; + Rect drawRect; + RGBColor black = { 0x0000, 0x0000, 0x0000 }; + RGBColor white = { 0xFFFF, 0xFFFF, 0xFFFF }; + RGBColor hiliteColor = { 0x0000, 0x0000, 0x0000 }; + short transform; + + drawRect.top = 0; + drawRect.left = 0; + drawRect.bottom = height; + drawRect.right = width; + + if (height < 4 && width < 4) + return; + + PenNormal(); + RGBForeColor(&black); + RGBBackColor(&white); + + FillRect(&drawRect, &(gQDPtr->white)); + + if (hilite == kHilited) { + hiliteColor.red = 0xFFFF; + transform = ttSelected; + } else { + hiliteColor.blue = 0xFFFF; + transform = ttNone; + } + + RGBForeColor(&hiliteColor); + FrameRect(&drawRect); + + if (height > 32 && width > 32 && CPlugin::sIconHandle != NULL) + { + drawRect.top = centerY - 16; + drawRect.bottom = centerY + 16; + drawRect.left = centerX - 16; + drawRect.right = centerX + 16; + PlotCIconHandle(&drawRect, atAbsoluteCenter, transform, CPlugin::sIconHandle); + } + + if (fUserInstalledPlugin) { + pTheText = (unsigned char*)CPlugin::sRefreshText; + } else { + pTheText = (unsigned char*)CPlugin::sAltText; + } + DrawString(pTheText, width, height, centerX, drawRect); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::MouseDown: +// +// Track the click in our plugin by drawing the icon enabled or disabled +// as the user moves the mouse in and out with the button held down. If +// they let up the mouse while still inside, get the URL. +// +//------------------------------------------------------------------------------------ +void CPlugin::MouseDown() +{ + if (FocusDraw()) + { + Draw(kHilited); + Boolean inside = true; + + while (StillDown()) + { + Point localMouse; + GetMouse(&localMouse); + Boolean insideNow = ::PtInRect(localMouse, &fRevealedRect); + + if (insideNow != inside) + { + Draw(insideNow ? kHilited : kUnhilited); + inside = insideNow; + } + } + + if (inside) { + Draw(kUnhilited); + if (!fUserInstalledPlugin) + AskAndLoadURL(); + else + RefreshPluginPage(); + } + + RestoreDraw(); + } +} + + +//------------------------------------------------------------------------------------ +// CPlugin::FocusDraw: +//------------------------------------------------------------------------------------ +Boolean CPlugin::FocusDraw() +{ + if (fWindow == NULL) + return false; + + NP_Port* npport = (NP_Port*) fWindow->window; + CGrafPtr ourPort = npport->port; + + if (fWindow->clipRect.left < fWindow->clipRect.right) + { + GetPort(&fSavePort); + SetPort((GrafPtr) ourPort); + fSavePortTop = ourPort->portRect.top; + fSavePortLeft = ourPort->portRect.left; + GetClip(fSaveClip); + + fRevealedRect.top = fWindow->clipRect.top + npport->porty; + fRevealedRect.left = fWindow->clipRect.left + npport->portx; + fRevealedRect.bottom = fWindow->clipRect.bottom + npport->porty; + fRevealedRect.right = fWindow->clipRect.right + npport->portx; + SetOrigin(npport->portx, npport->porty); + ClipRect(&fRevealedRect); + + return true; + } + else + return false; +} + + +//------------------------------------------------------------------------------------ +// CPlugin::RestoreDraw: +//------------------------------------------------------------------------------------ +void CPlugin::RestoreDraw() +{ + SetOrigin(fSavePortLeft, fSavePortTop); + SetClip(fSaveClip); + SetPort(fSavePort); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::DetermineURL: +// +// Get a URL from either the parameters passed from the EMBED. +// Append "?" and our mime type and save for later use. +// +//------------------------------------------------------------------------------------ +void CPlugin::DetermineURL(int16 argc, char* argn[], char* argv[]) +{ + char* url; + SInt32 additionalLength = 0; + SInt32 i; + + // Appended to the URL will be a "?" and the mime type of this instance. This lets the server + // do something intelligent with a CGI script. + + if (fType != NULL) + additionalLength += (strlen(fType) + 1); // Add 1 for '?' + + // The page designer can specify a URL where the plugin for this type can be downloaded. Here + // we scan the arguments for this attribute and save it away if we + // find it for later use by LoadPluginURL(). + // + for (i = 0; i < argc; i++) { + if ((strcasecmp(argn[i], "PLUGINSPAGE") == 0) || (strcasecmp(argn[i], "CODEBASE") == 0)) { + url = argv[i]; + fPageURL = (char*)NPN_MemAlloc(strlen(url) + 1 + additionalLength); // Add 1 for '\0' + if (fPageURL != NULL) { + if (additionalLength > 0) { + sprintf(fPageURL, "%s?%s", url, fType); + } else { + strcpy(fPageURL, url); + } + } + break; + } else if ((strcasecmp(argn[i], "PLUGINURL") == 0) || (strcasecmp(argn[i], "CLASSID") == 0)) { + url = argv[i]; + if (CPlugin::sInstallCommand != NULL) { + // Allocate a new string + fFileURL = (char*)NPN_MemAlloc(strlen(CPlugin::sInstallCommand) + 1 + strlen(url)); + if (fFileURL != NULL) + sprintf(fFileURL, CPlugin::sInstallCommand, url); + } + break; + } + } +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::MakeDefaultURL: +// +// Get a URL from our resources. Append "?" and our mime type and save for later use. +// +//------------------------------------------------------------------------------------ +char *CPlugin::MakeDefaultURL(void) +{ + char *pDefURL = NULL; + SInt32 additionalLength = 0; + + // Appended to the URL will be a "?" and the mime type of this instance. This lets the server + // do something intelligent with a CGI script. + + if (fType != NULL) + additionalLength += (strlen(fType) + 1); // Add 1 for '?' + + if (!m_bJavaScript) { + if (CPlugin::sDefaultPage != NULL) { + pDefURL = (char*)NPN_MemAlloc(strlen(CPlugin::sDefaultPage) + 1 + additionalLength); + if (pDefURL != NULL) { + if (additionalLength > 0) { + sprintf(pDefURL, "%s?%s", CPlugin::sDefaultPage, fType); + } else { + strcpy(pDefURL, CPlugin::sDefaultPage); + } + } + } + } else { + if (CPlugin::sJavaScriptPage != NULL) { + pDefURL = (char*)NPN_MemAlloc(strlen(szPluginFinderCommandBeginning) + + strlen(CPlugin::sJavaScriptPage) + + additionalLength + strlen(szPluginFinderCommandEnd) + 1); + if (pDefURL != NULL) { + sprintf(pDefURL, "%s%s%s%s", szPluginFinderCommandBeginning, + CPlugin::sJavaScriptPage, fType, szPluginFinderCommandEnd); + } + } + } + return(pDefURL); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::AddMimeTypeToList: +// +// Check the mime type of this instance against our list +// of types weÕve seen before. If we find our type in the +// list, return false; otherwise, return true. +// +// type 'STR#' { +// integer = $$Countof(StringArray); +// array StringArray { +// pstring; +// }; +// +//------------------------------------------------------------------------------------ +void CPlugin::AddMimeTypeToList(StringPtr cTypeString) +{ + Handle hTypeList; + SInt32 dwCount; + SInt32 index; + Str255 oldType; + SInt16 wResFile; + Boolean failedToFind = true; + + wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdWrPerm); + if (wResFile != -1) { + hTypeList = Get1Resource('STR#', rTypeListStrings); + if (hTypeList != NULL) { + dwCount = **((short **)hTypeList); + + // First make sure it's not already in the list. + for (index = 1; index <= dwCount; index++) { + GetIndString(oldType, rTypeListStrings, index); + + // if the mimetype already exists in our list, or the plugin is NOT hidden, + // don't bring up the dialog box + if (EqualString(cTypeString, oldType, true, true) && !fHiddenPlugin) { + failedToFind = false; + break; // Found a match, so bail out! + } + } + if (failedToFind) { + // Grow the string list handle + Size itsSize = GetHandleSize(hTypeList); + Size typeSize = cTypeString[0] + 1; + SetHandleSize(hTypeList, itsSize + typeSize); + + // Increment the count of strings in the list + (**((short**)hTypeList)) = (short)(++dwCount); + + // Copy the data from our string into the handle + long dwCount = Munger(hTypeList, itsSize, NULL, typeSize, cTypeString, typeSize); + + // Mark the resource as changed so it will be written out + if (dwCount > 0) { + ChangedResource(hTypeList); + UpdateResFile(wResFile); + } + } + ReleaseResource(hTypeList); + } + FSClose(wResFile); + } +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::CheckMimeTypes: +// +// Check the mime type of this instance against our list +// of types weÕve seen before. If we find our type in the +// list, return false; otherwise, return true. +// +// type 'STR#' { +// integer = $$Countof(StringArray); +// array StringArray { +// pstring; +// }; +// +//------------------------------------------------------------------------------------ +Boolean CPlugin::CheckMimeTypes() +{ + Handle hTypeList; + SInt32 index; + Str255 oldType; + Str255 ourType; + SInt16 wResFile; + Boolean failedToFind = true; + + wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdPerm); + if (wResFile != -1) { + hTypeList = Get1Resource('STR#', rTypeListStrings); + if (hTypeList != NULL) { + // Convert the mime-type C string to a Pascal string. + index = strlen(fType); + if (index > 255) { // don't blow out the Str255 + index = 255; + } + BlockMoveData(fType, &ourType[1], index); + ourType[0] = index; + + short count = **((short **)hTypeList); + + // Iterate through all the strings in the list. + for (index = 1; index <= count; index++) { + GetIndString(oldType, rTypeListStrings, index); + + // if the mimetype already exists in our list, or the plugin is NOT hidden, + // don't bring up the dialog box + if (EqualString(ourType, oldType, true, true) && !fHiddenPlugin) { + failedToFind = false; + break; // Found a match, so bail out! + } + } + ReleaseResource(hTypeList); + } + FSClose(wResFile); + } + return(failedToFind); +} + + + +//------------------------------------------------------------------------------------ +// CPlugin::AskAndLoadURL: +//------------------------------------------------------------------------------------ +void CPlugin::AskAndLoadURL() +{ + char *pTheURL; + SInt32 dwLen; + Str255 ourType; + + if (!m_bOffline) { + // Convert the mime-type C string to a Pascal string. + dwLen = strlen(fType); + if (dwLen > 255) { // don't blow out the Str255 + dwLen = 255; + } + BlockMoveData(fType, &ourType[1], dwLen); + ourType[0] = dwLen; + + // NOTE: We need to set the cursor because almost always we will have set it to the + // hand cursor before we get here. + SetCursor(&(gQDPtr->arrow)); + + // Now that weÕve queried the user about this mime type, + // add it to our list so we wonÕt bug them again. + AddMimeTypeToList(ourType); + + // + // If the user clicked "Get the Plug-in", either execute the + // JavaScript file-installation URL, or ask Netscape to open + // a new window with the page URL. The title of the window + // is arbitrary since it has nothing to do with the actual + // window title shown to the user (itÕs only used internally). + // + if (fFileURL != NULL) { + (void) NPN_GetURL(fInstance, fFileURL, "_current"); + } else if (fPageURL != NULL) { + NPN_GetURL(fInstance, fPageURL, "_blank"); + } else { + pTheURL = MakeDefaultURL(); + if (!m_bJavaScript) { + NPN_GetURL(fInstance, pTheURL, "_blank"); + } else { + NPN_GetURL(fInstance, pTheURL, NULL); + } + NPN_MemFree(pTheURL); + } + + fUserInstalledPlugin = true; + if (FocusDraw()) { + Draw(kUnhilited); + RestoreDraw(); + } + } +} + +void CPlugin::RefreshPluginPage() +{ + (void) NPN_GetURL(fInstance, "javascript:navigator.plugins.refresh(true);", "_self"); +} + +void CPlugin::DrawString(const unsigned char* text, short width, short height, short centerX, Rect drawRect) +{ + short length, textHeight, textWidth; + + if(text == NULL) + return; + + length = strlen((char*)text); + TextFont(20); + TextFace(underline); + TextMode(srcCopy); + TextSize(10); + + FontInfo fontInfo; + GetFontInfo(&fontInfo); + + textHeight = fontInfo.ascent + fontInfo.descent + fontInfo.leading; + textWidth = TextWidth(text, 0, length); + + if (width > textWidth && height > textHeight + 32) + { + MoveTo(centerX - (textWidth >> 1), drawRect.bottom + textHeight); + DrawText(text, 0, length); + } +} + +Boolean CPlugin::IsPluginHidden(int16 argc, char* argn[], char* argv[]) +{ + int i; + for(i=0; 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 XLzee>A`vb=7UFUCt4)cN-Twa{)p?j$ literal 0 HcmV?d00001 diff --git a/mozilla/modules/plugin/samples/default/mac/NullPlugin.rsrc b/mozilla/modules/plugin/samples/default/mac/NullPlugin.rsrc new file mode 100644 index 0000000000000000000000000000000000000000..1a09fad814f071ee0369684dfd9dce1e6627c44b GIT binary patch literal 1923 zcma)7O-vg{6n-ABjSW_8<&bhn!)Ob{MZuO@HHsoN;ZFn*awEgGJ_WmGy(}2pve!73 z+A6uWzkWUgI)6u!;_(Zm-Il!!+X0VSn&&ao{eXlH& zx6qpUqwm_45O`{JIyw3$SswJz@&4QKs{^wj(MjJDIJ>T<`p5R*VsHq~$1jAX$m3sO z2xcm=omJ^)w9|=TU}h`zJUG)IrQNBgA|K#U==|_4vo$yqycO>q)55-RPuLxK3=d~U zK6nA=vSe^p><&9|191#Fh5(%3@xE98mHO>=9*G=1!+=K=P{eqdv_o-1q3C*@~{ zg+vTV6W`P0U^pr)ym2uw|+j73Q+?@fmZl4zE@# z$N>X{KL+6E90LSrL=L_}jsX^z<$F!eT?~1(5+m}?1MwR*m@5VzjF(N=snu$n6B%S# zrt;2qsbq1avK;(sTLI)sS+H{O$mT5k66>4yn%jyuhyI15s?6&@C_;^MrFs|F+rGP9 z^p@hBf5drFDS&19K;i7rlTN9jF{ZOct;@r)u6_bN^^MI4eJ?<7#&$otR)J`yq+_zXH=t* zOyty1A)7Laxy6K`hUW9Srm6YRoRP>Ib7(Im@~R?yL3yAczl}wF;P8&7)71DRrxuXE z2Skq8wP+-s;{cN(f4t^ci(xPBG~IfO3y6f zDPV!KpO>ELm50t07P|=FgL7^^`WAk=ScYv8DMT3xau1i^= ze=hWOt~(}$rMqWZ@$q;Gocle~%l83qFaXITym+Ibj#oSi-f*b@AoMMv|1NaQ#Wy&} cbw59JJwu1-SU$U=W=?$I_!V|q$jWE`0T~@@*#H0l literal 0 HcmV?d00001 diff --git a/mozilla/modules/plugin/samples/default/mac/npmac.cpp b/mozilla/modules/plugin/samples/default/mac/npmac.cpp new file mode 100644 index 00000000000..5b75f47c914 --- /dev/null +++ b/mozilla/modules/plugin/samples/default/mac/npmac.cpp @@ -0,0 +1,646 @@ +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +// +// npmac.cpp +// +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +#include +#include +#include +#include +#include +#include + +#define XP_MAC 1 + +// +// 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). +// +#include + + +#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 + +#include "npupp.h" + +#ifdef __MWERKS__ +#ifndef powerc +#pragma pointers_in_A0 +#endif +#endif + +// The following fix for static initializers (which fixes a preious +// 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 +#endif + + + + + + +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +// +// Globals +// +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +QDGlobals* gQDPtr; // Pointer to NetscapeÕs QuickDraw globals +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. +// 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); +} + + +JRIEnv* NPN_GetJavaEnv(void) +{ + return CallNPN_GetJavaEnvProc( gNetscapeFuncs.getJavaEnv ); +} + +jobject NPN_GetJavaPeer(NPP instance) +{ + return CallNPN_GetJavaPeerProc( gNetscapeFuncs.getJavaPeer, instance ); +} + +NPError 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); +} + +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +// +// Wrapper functions for all calls from Netscape to the plugin. +// These functions let the plugin developer just create the APIs +// as documented and defined in npapi.h, without needing to +// install those functions in the function table or worry about +// setting up globals for 68K plugins. +// +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +NPError Private_Initialize(void); +void Private_Shutdown(void); +NPError Private_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData* saved); +NPError Private_Destroy(NPP instance, NPSavedData** save); +NPError Private_SetWindow(NPP instance, NPWindow* window); +NPError Private_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype); +NPError Private_DestroyStream(NPP instance, NPStream* stream, NPError reason); +int32 Private_WriteReady(NPP instance, NPStream* stream); +int32 Private_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer); +void Private_StreamAsFile(NPP instance, NPStream* stream, const char* fname); +void Private_Print(NPP instance, NPPrint* platformPrint); +int16 Private_HandleEvent(NPP instance, void* event); +void Private_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData); +jobject Private_GetJavaClass(void); + + +NPError Private_Initialize(void) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pInitialize;g;"); + err = NPP_Initialize(); + ExitCodeResource(); + return err; +} + +void Private_Shutdown(void) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pShutdown;g;"); + NPP_Shutdown(); + + __destroy_global_chain(); + + ExitCodeResource(); +} + + +NPError Private_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData* saved) +{ + EnterCodeResource(); + NPError ret = NPP_New(pluginType, instance, mode, argc, argn, argv, saved); + PLUGINDEBUGSTR("\pNew;g;"); + ExitCodeResource(); + return ret; +} + +NPError Private_Destroy(NPP instance, NPSavedData** save) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pDestroy;g;"); + err = NPP_Destroy(instance, save); + ExitCodeResource(); + return err; +} + +NPError Private_SetWindow(NPP instance, NPWindow* window) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pSetWindow;g;"); + err = NPP_SetWindow(instance, window); + ExitCodeResource(); + return err; +} + +NPError Private_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pNewStream;g;"); + err = NPP_NewStream(instance, type, stream, seekable, stype); + ExitCodeResource(); + return err; +} + +int32 Private_WriteReady(NPP instance, NPStream* stream) +{ + int32 result; + EnterCodeResource(); + PLUGINDEBUGSTR("\pWriteReady;g;"); + result = NPP_WriteReady(instance, stream); + ExitCodeResource(); + return result; +} + +int32 Private_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer) +{ + int32 result; + EnterCodeResource(); + PLUGINDEBUGSTR("\pWrite;g;"); + result = NPP_Write(instance, stream, offset, len, buffer); + ExitCodeResource(); + return result; +} + +void Private_StreamAsFile(NPP instance, NPStream* stream, const char* fname) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pStreamAsFile;g;"); + NPP_StreamAsFile(instance, stream, fname); + ExitCodeResource(); +} + + +NPError Private_DestroyStream(NPP instance, NPStream* stream, NPError reason) +{ + NPError err; + EnterCodeResource(); + PLUGINDEBUGSTR("\pDestroyStream;g;"); + err = NPP_DestroyStream(instance, stream, reason); + ExitCodeResource(); + return err; +} + +int16 Private_HandleEvent(NPP instance, void* event) +{ + int16 result; + EnterCodeResource(); + PLUGINDEBUGSTR("\pHandleEvent;g;"); + result = NPP_HandleEvent(instance, event); + ExitCodeResource(); + return result; +} + +void Private_Print(NPP instance, NPPrint* platformPrint) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pPrint;g;"); + NPP_Print(instance, platformPrint); + ExitCodeResource(); +} + +void Private_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pURLNotify;g;"); + NPP_URLNotify(instance, url, reason, notifyData); + ExitCodeResource(); +} + + +jobject Private_GetJavaClass(void) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pGetJavaClass;g;"); + + jobject clazz = NPP_GetJavaClass(); + ExitCodeResource(); + if (clazz) + { + JRIEnv* env = NPN_GetJavaEnv(); + return (jobject)JRI_NewGlobalRef(env, clazz); + } + return NULL; +} + + +void SetUpQD(void); +void SetUpQD(void) +{ + ProcessSerialNumber PSN; + FSSpec myFSSpec; + Str63 name; + ProcessInfoRec infoRec; + OSErr result = noErr; + CFragConnectionID connID; + Str255 errName; + + // + // Memorize the pluginÕs resource file + // refnum for later use. + // + gResFile = CurResFile(); + + // + // Ask the system if CFM is available. + // + long response; + OSErr err = Gestalt(gestaltCFMAttr, &response); + Boolean hasCFM = BitTst(&response, 31-gestaltCFMPresent); + + 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. + // + infoRec.processInfoLength = sizeof(ProcessInfoRec); + infoRec.processName = name; + infoRec.processAppSpec = &myFSSpec; + + 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; + + 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; + 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))); + } + +} + + + +NPError main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp); + +#pragma export on +#if GENERATINGCFM +RoutineDescriptor mainRD = BUILD_ROUTINE_DESCRIPTOR(uppNPP_MainEntryProcInfo, main); +#endif +#pragma export off + + +NPError main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp) +{ + EnterCodeResource(); + PLUGINDEBUGSTR("\pmain"); + + __InitCode__(); + + 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 = 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; + + // + // 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); + if( navMinorVers >= NPVERS_HAS_NOTIFICATION ) + { + pluginFuncs->urlnotify = NewNPP_URLNotifyProc(Private_URLNotify); + } + if( navMinorVers >= NPVERS_HAS_LIVECONNECT ) + { + pluginFuncs->javaClass = (JRIGlobalRef) Private_GetJavaClass(); + } + *unloadUpp = NewNPP_ShutdownProc(Private_Shutdown); + SetUpQD(); + err = Private_Initialize(); + } + + ExitCodeResource(); + return err; +}