Fix for bug 165507. Clean up code and fix leaking callback allocations. sr=beard.

git-svn-id: svn://10.0.0.236/branches/CHIMERA_M1_0_1_BRANCH@128707 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bnesse%netscape.com
2002-09-03 16:56:22 +00:00
parent 07d5f6cfca
commit 9cc3b7c367
2 changed files with 85 additions and 53 deletions

View File

@@ -306,9 +306,13 @@ ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, PRLibrary* aLibrary, NP_PLUGINS
NS_ASSERTION(HIBYTE(fCallbacks.version) >= NP_VERSION_MAJOR, "callback version is less than NP version");
fShutdownEntry = (NP_PLUGINSHUTDOWN)PR_FindSymbol(aLibrary, "NP_Shutdown");
#elif defined(XP_MAC) && !TARGET_CARBON
#elif defined(XP_MAC)
// get the main entry point
#if !TARGET_CARBON
NP_MAIN pfnMain = (NP_MAIN) PR_FindSymbol(aLibrary, "mainRD");
#else // carbon
NP_MAIN pfnMain = (NP_MAIN) PR_FindSymbol(aLibrary, "main");
#endif
if(pfnMain == NULL)
return;
@@ -326,23 +330,48 @@ ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, PRLibrary* aLibrary, NP_PLUGINS
return;
#elif defined(XP_MACOSX)
// call into the entry point
NP_MAIN pfnMain = (NP_MAIN) PR_FindSymbol(aLibrary, "main");
if(pfnMain == NULL)
return;
NPP_ShutdownUPP pfnShutdown;
NPPluginFuncs np_callbacks;
memset((void*) &np_callbacks, 0, sizeof(np_callbacks));
np_callbacks.size = sizeof(np_callbacks);
NPError error;
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_MainEntryProc(pfnMain,
&(ns4xPlugin::CALLBACKS),
&np_callbacks,
&pfnShutdown), aLibrary, nsnull);
NPP_PLUGIN_LOG(PLUGIN_LOG_BASIC, ("NPP MainEntryProc called: return=%d\n",error));
if(error != NPERR_NO_ERROR)
return;
if ((np_callbacks.version >> 8) < NP_VERSION_MAJOR)
return;
// wrap all plugin entry points tvectors as mach-o callable function pointers.
fCallbacks.size = callbacks->size;
fCallbacks.version = callbacks->version;
fCallbacks.newp = (NPP_NewUPP) TV2FP(callbacks->newp);
fCallbacks.destroy = (NPP_DestroyUPP) TV2FP(callbacks->destroy);
fCallbacks.setwindow = (NPP_SetWindowUPP) TV2FP(callbacks->setwindow);
fCallbacks.newstream = (NPP_NewStreamUPP) TV2FP(callbacks->newstream);
fCallbacks.destroystream = (NPP_DestroyStreamUPP) TV2FP(callbacks->destroystream);
fCallbacks.asfile = (NPP_StreamAsFileUPP) TV2FP(callbacks->asfile);
fCallbacks.writeready = (NPP_WriteReadyUPP) TV2FP(callbacks->writeready);
fCallbacks.write = (NPP_WriteUPP) TV2FP(callbacks->write);
fCallbacks.print = (NPP_PrintUPP) TV2FP(callbacks->print);
fCallbacks.event = (NPP_HandleEventUPP) TV2FP(callbacks->event);
fCallbacks.urlnotify = (NPP_URLNotifyUPP) TV2FP(callbacks->urlnotify);
fCallbacks.getvalue = (NPP_GetValueUPP) TV2FP(callbacks->getvalue);
fCallbacks.setvalue = (NPP_SetValueUPP) TV2FP(callbacks->setvalue);
fShutdownEntry = (NP_PLUGINSHUTDOWN) TV2FP(aShutdown);
fCallbacks.size = sizeof(fCallbacks);
fCallbacks.version = np_callbacks.version;
fCallbacks.newp = (NPP_NewUPP) TV2FP(np_callbacks.newp);
fCallbacks.destroy = (NPP_DestroyUPP) TV2FP(np_callbacks.destroy);
fCallbacks.setwindow = (NPP_SetWindowUPP) TV2FP(np_callbacks.setwindow);
fCallbacks.newstream = (NPP_NewStreamUPP) TV2FP(np_callbacks.newstream);
fCallbacks.destroystream = (NPP_DestroyStreamUPP) TV2FP(np_callbacks.destroystream);
fCallbacks.asfile = (NPP_StreamAsFileUPP) TV2FP(np_callbacks.asfile);
fCallbacks.writeready = (NPP_WriteReadyUPP) TV2FP(np_callbacks.writeready);
fCallbacks.write = (NPP_WriteUPP) TV2FP(np_callbacks.write);
fCallbacks.print = (NPP_PrintUPP) TV2FP(np_callbacks.print);
fCallbacks.event = (NPP_HandleEventUPP) TV2FP(np_callbacks.event);
fCallbacks.urlnotify = (NPP_URLNotifyUPP) TV2FP(np_callbacks.urlnotify);
fCallbacks.getvalue = (NPP_GetValueUPP) TV2FP(np_callbacks.getvalue);
fCallbacks.setvalue = (NPP_SetValueUPP) TV2FP(np_callbacks.setvalue);
fShutdownEntry = (NP_PLUGINSHUTDOWN) TV2FP(pfnShutdown);
#else // for everyone else
memcpy((void*) &fCallbacks, (void*) callbacks, sizeof(fCallbacks));
fShutdownEntry = aShutdown;
@@ -356,6 +385,33 @@ ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, PRLibrary* aLibrary, NP_PLUGINS
ns4xPlugin::~ns4xPlugin(void)
{
//reset the callbacks list
#if defined(XP_MACOSX)
// release all wrapped plugin entry points.
if (fCallbacks.newp)
free(fCallbacks.newp);
if (fCallbacks.destroy)
free(fCallbacks.destroy);
if (fCallbacks.setwindow)
free(fCallbacks.setwindow);
if (fCallbacks.newstream)
free(fCallbacks.newstream);
if (fCallbacks.asfile)
free(fCallbacks.asfile);
if (fCallbacks.writeready)
free(fCallbacks.writeready);
if (fCallbacks.write)
free(fCallbacks.write);
if (fCallbacks.print)
free(fCallbacks.print);
if (fCallbacks.event)
free(fCallbacks.event);
if (fCallbacks.urlnotify)
free(fCallbacks.urlnotify);
if (fCallbacks.getvalue)
free(fCallbacks.getvalue);
if (fCallbacks.setvalue)
free(fCallbacks.setvalue);
#endif
memset((void*) &fCallbacks, 0, sizeof(fCallbacks));
}
@@ -590,39 +646,7 @@ ns4xPlugin::CreatePlugin(nsIServiceManagerObsolete* aServiceMgr,
if (pluginRefNum == -1)
return NS_ERROR_FAILURE;
#if TARGET_CARBON
// call into the entry point
NP_MAIN pfnMain = (NP_MAIN) PR_FindSymbol(aLibrary, "main");
printf("[ns4xPlugin::CreatePlugin: pfnMain = 0x%08X]\n", pfnMain);
if(pfnMain == NULL)
return NS_ERROR_FAILURE;
NPP_ShutdownUPP pfnShutdown;
NPPluginFuncs callbacks;
memset((void*) &callbacks, 0, sizeof(callbacks));
callbacks.size = sizeof(callbacks);
NPError error;
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_MainEntryProc(pfnMain,
&(ns4xPlugin::CALLBACKS),
&callbacks,
&pfnShutdown), fLibrary, nsnull);
NPP_PLUGIN_LOG(PLUGIN_LOG_BASIC, ("NPP MainEntryProc called: return=%d\n",error));
if(error != NPERR_NO_ERROR)
return NS_ERROR_FAILURE;
if ((callbacks.version >> 8) < NP_VERSION_MAJOR)
return NS_ERROR_FAILURE;
// create the new plugin handler
ns4xPlugin* plugin = new ns4xPlugin(&callbacks, aLibrary, (NP_PLUGINSHUTDOWN)pfnShutdown, aServiceMgr);
#else // not carbon
ns4xPlugin* plugin = new ns4xPlugin(nsnull, aLibrary, nsnull, aServiceMgr);
#endif
if(plugin == NULL)
return NS_ERROR_OUT_OF_MEMORY;
@@ -751,6 +775,10 @@ ns4xPlugin::Shutdown(void)
NS_TRY_SAFE_CALL_VOID(fShutdownEntry(), fLibrary, nsnull);
#endif
#if defined(XP_MACOSX)
// release the wrapped plugin function.
free(fShutdownEntry);
#endif
fShutdownEntry = nsnull;
}
@@ -1124,9 +1152,6 @@ _invalidaterect(NPP npp, NPRect *invalidRect)
("NPN_InvalidateRect: npp=%p, top=%d, left=%d, bottom=%d, right=%d\n",
(void *)npp, invalidRect->top, invalidRect->left, invalidRect->bottom, invalidRect->right));
printf("[NPN_InvalidateRect: top=%d, left=%d, bottom=%d, right=%d]\n",
invalidRect->top, invalidRect->left, invalidRect->bottom, invalidRect->right);
if(!npp)
return;

View File

@@ -257,9 +257,16 @@ ns4xPluginStreamListener::OnStartBinding(nsIPluginStreamInfo* pluginInfo)
mStreamInfo = pluginInfo;
// if we don't know the end of the stream, use 0 instead of -1. bug 59571
if (mNPStream.end == -1)
// if (mNPStream.end == -1)
if (mNPStream.end == 0xFFFFFFFF)
mNPStream.end = 0;
if (!mNPStream.pdata) {
printf("Akkk, mNPStream.pdata is null\n");
}
if (mNPStream.ndata != npp->ndata) {
printf("Akkk, mNPStream.ndata (0x%08x) != npp->ndata (0x%08x)\n", mNPStream.ndata, npp->ndata);
}
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_NewStreamProc(callbacks->newstream,
npp,
(char *)contentType,