Fixing 91140, the Acrobat blocker -- latering plugin stream destruction, r=peterl, bnesse, sr=vidur

This commit is contained in:
av%netscape.com 2001-07-21 02:31:29 +00:00
Родитель f43f993809
Коммит bd2a05ee70
4 изменённых файлов: 202 добавлений и 120 удалений

Просмотреть файл

@ -50,7 +50,9 @@ static NS_DEFINE_IID(kIPluginStreamListener2IID, NS_IPLUGINSTREAMLISTENER2_IID);
ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst, ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
void* notifyData) void* notifyData)
: mNotifyData(notifyData), : mNotifyData(notifyData),
mStreamInfo(nsnull) mStreamInfo(nsnull),
mStreamStarted(PR_FALSE),
mStreamCleanedUp(PR_FALSE)
{ {
NS_INIT_REFCNT(); NS_INIT_REFCNT();
mInst = (ns4xPluginInstance*) inst; mInst = (ns4xPluginInstance*) inst;
@ -65,9 +67,79 @@ ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
ns4xPluginStreamListener::~ns4xPluginStreamListener(void) ns4xPluginStreamListener::~ns4xPluginStreamListener(void)
{ {
#ifdef NS_DEBUG
printf("ns4xPluginStreamListener::~ns4xPluginStreamListener\n");
#endif
CleanUpStream();
NS_IF_RELEASE(mInst); NS_IF_RELEASE(mInst);
} }
nsresult ns4xPluginStreamListener::CleanUpStream()
{
if(!mStreamStarted || mStreamCleanedUp)
return NS_OK;
if(!mInst)
return NS_ERROR_FAILURE;
NPP npp;
const NPPluginFuncs *callbacks = nsnull;
mInst->GetCallbacks(&callbacks);
mInst->GetNPP(&npp);
if(!callbacks)
return NS_ERROR_FAILURE;
NPError error;
if (callbacks->destroystream != NULL)
{
// XXX need to convert status to NPReason
PRLibrary* lib = nsnull;
lib = mInst->fLibrary;
#ifdef NS_DEBUG
printf("calling NPP_DestroyStream\n");
#endif
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_DestroyStreamProc(callbacks->destroystream,
npp,
&mNPStream,
NPRES_DONE), lib);
if(error != NPERR_NO_ERROR)
return NS_ERROR_FAILURE;
}
// check to see if we have a call back and a
// XXX nasty hack for Shockwave Registration.
// we seem to crash doing URLNotify so just always exclude it.
// See bug 85334.
if (callbacks->urlnotify != NULL && mNotifyData != nsnull &&
strcmp(mNPStream.url,"http://pinger.macromedia.com") < 0 )
{
PRLibrary* lib = nsnull;
lib = mInst->fLibrary;
NS_TRY_SAFE_CALL_VOID(CallNPP_URLNotifyProc(callbacks->urlnotify,
npp,
mNPStream.url,
nsPluginReason_Done,
mNotifyData), lib);
}
// lets get rid of the buffer if we made one globally
if (mStreamBuffer)
{
PR_Free(mStreamBuffer);
mStreamBuffer=nsnull;
}
mStreamCleanedUp = PR_TRUE;
mStreamStarted = PR_FALSE;
return NS_OK;
}
NS_IMPL_ISUPPORTS2(ns4xPluginStreamListener, nsIPluginStreamListener, NS_IMPL_ISUPPORTS2(ns4xPluginStreamListener, nsIPluginStreamListener,
nsIPluginStreamListener2); nsIPluginStreamListener2);
@ -144,6 +216,7 @@ ns4xPluginStreamListener::OnStartBinding(nsIPluginStreamInfo* pluginInfo)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
} }
mStreamStarted = PR_TRUE;
return NS_OK; return NS_OK;
} }
@ -447,61 +520,26 @@ NS_IMETHODIMP
ns4xPluginStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo, ns4xPluginStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo,
nsresult status) nsresult status)
{ {
#ifdef NS_DEBUG
printf("ns4xPluginStreamListener::OnStopBinding\n");
#endif
if(!mInst || !mInst->IsStarted()) if(!mInst || !mInst->IsStarted())
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
NPP npp; if(pluginInfo) {
const NPPluginFuncs *callbacks = nsnull;
mInst->GetCallbacks(&callbacks);
mInst->GetNPP(&npp);
if(!callbacks)
return NS_ERROR_FAILURE;
NPError error;
pluginInfo->GetURL(&mNPStream.url); pluginInfo->GetURL(&mNPStream.url);
pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified)); pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified));
}
if (callbacks->destroystream != NULL) // check if the stream is not of asfileonly type and later its destruction
{ // see bug 91140
// XXX need to convert status to NPReason nsresult rv = NS_OK;
PRLibrary* lib = nsnull; if(mStreamType == nsPluginStreamType_AsFileOnly)
lib = mInst->fLibrary; rv = CleanUpStream();
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_DestroyStreamProc(callbacks->destroystream, if(rv != NPERR_NO_ERROR)
npp,
&mNPStream,
NPRES_DONE), lib);
if(error != NPERR_NO_ERROR)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
}
// check to see if we have a call back and a
// XXX nasty hack for Shockwave Registration.
// we seem to crash doing URLNotify so just always exclude it.
// See bug 85334.
if (callbacks->urlnotify != NULL && mNotifyData != nsnull &&
strcmp(mNPStream.url,"http://pinger.macromedia.com") < 0 )
{
PRLibrary* lib = nsnull;
lib = mInst->fLibrary;
NS_TRY_SAFE_CALL_VOID(CallNPP_URLNotifyProc(callbacks->urlnotify,
npp,
mNPStream.url,
nsPluginReason_Done,
mNotifyData), lib);
}
// lets get rid of the buffer if we made one globally
if (mStreamBuffer)
{
PR_Free(mStreamBuffer);
mStreamBuffer=nsnull;
}
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -48,6 +48,7 @@ public:
ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData); ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData);
virtual ~ns4xPluginStreamListener(); virtual ~ns4xPluginStreamListener();
PRBool IsStarted(); PRBool IsStarted();
nsresult CleanUpStream();
protected: protected:
void* mNotifyData; void* mNotifyData;
@ -57,6 +58,8 @@ protected:
PRUint32 mPosition; PRUint32 mPosition;
PRUint32 mCurrentStreamOffset; PRUint32 mCurrentStreamOffset;
nsPluginStreamType mStreamType; nsPluginStreamType mStreamType;
PRBool mStreamStarted;
PRBool mStreamCleanedUp;
public: public:
nsIPluginStreamInfo * mStreamInfo; nsIPluginStreamInfo * mStreamInfo;

Просмотреть файл

@ -50,7 +50,9 @@ static NS_DEFINE_IID(kIPluginStreamListener2IID, NS_IPLUGINSTREAMLISTENER2_IID);
ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst, ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
void* notifyData) void* notifyData)
: mNotifyData(notifyData), : mNotifyData(notifyData),
mStreamInfo(nsnull) mStreamInfo(nsnull),
mStreamStarted(PR_FALSE),
mStreamCleanedUp(PR_FALSE)
{ {
NS_INIT_REFCNT(); NS_INIT_REFCNT();
mInst = (ns4xPluginInstance*) inst; mInst = (ns4xPluginInstance*) inst;
@ -65,9 +67,79 @@ ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
ns4xPluginStreamListener::~ns4xPluginStreamListener(void) ns4xPluginStreamListener::~ns4xPluginStreamListener(void)
{ {
#ifdef NS_DEBUG
printf("ns4xPluginStreamListener::~ns4xPluginStreamListener\n");
#endif
CleanUpStream();
NS_IF_RELEASE(mInst); NS_IF_RELEASE(mInst);
} }
nsresult ns4xPluginStreamListener::CleanUpStream()
{
if(!mStreamStarted || mStreamCleanedUp)
return NS_OK;
if(!mInst)
return NS_ERROR_FAILURE;
NPP npp;
const NPPluginFuncs *callbacks = nsnull;
mInst->GetCallbacks(&callbacks);
mInst->GetNPP(&npp);
if(!callbacks)
return NS_ERROR_FAILURE;
NPError error;
if (callbacks->destroystream != NULL)
{
// XXX need to convert status to NPReason
PRLibrary* lib = nsnull;
lib = mInst->fLibrary;
#ifdef NS_DEBUG
printf("calling NPP_DestroyStream\n");
#endif
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_DestroyStreamProc(callbacks->destroystream,
npp,
&mNPStream,
NPRES_DONE), lib);
if(error != NPERR_NO_ERROR)
return NS_ERROR_FAILURE;
}
// check to see if we have a call back and a
// XXX nasty hack for Shockwave Registration.
// we seem to crash doing URLNotify so just always exclude it.
// See bug 85334.
if (callbacks->urlnotify != NULL && mNotifyData != nsnull &&
strcmp(mNPStream.url,"http://pinger.macromedia.com") < 0 )
{
PRLibrary* lib = nsnull;
lib = mInst->fLibrary;
NS_TRY_SAFE_CALL_VOID(CallNPP_URLNotifyProc(callbacks->urlnotify,
npp,
mNPStream.url,
nsPluginReason_Done,
mNotifyData), lib);
}
// lets get rid of the buffer if we made one globally
if (mStreamBuffer)
{
PR_Free(mStreamBuffer);
mStreamBuffer=nsnull;
}
mStreamCleanedUp = PR_TRUE;
mStreamStarted = PR_FALSE;
return NS_OK;
}
NS_IMPL_ISUPPORTS2(ns4xPluginStreamListener, nsIPluginStreamListener, NS_IMPL_ISUPPORTS2(ns4xPluginStreamListener, nsIPluginStreamListener,
nsIPluginStreamListener2); nsIPluginStreamListener2);
@ -144,6 +216,7 @@ ns4xPluginStreamListener::OnStartBinding(nsIPluginStreamInfo* pluginInfo)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
} }
mStreamStarted = PR_TRUE;
return NS_OK; return NS_OK;
} }
@ -447,61 +520,26 @@ NS_IMETHODIMP
ns4xPluginStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo, ns4xPluginStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo,
nsresult status) nsresult status)
{ {
#ifdef NS_DEBUG
printf("ns4xPluginStreamListener::OnStopBinding\n");
#endif
if(!mInst || !mInst->IsStarted()) if(!mInst || !mInst->IsStarted())
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
NPP npp; if(pluginInfo) {
const NPPluginFuncs *callbacks = nsnull;
mInst->GetCallbacks(&callbacks);
mInst->GetNPP(&npp);
if(!callbacks)
return NS_ERROR_FAILURE;
NPError error;
pluginInfo->GetURL(&mNPStream.url); pluginInfo->GetURL(&mNPStream.url);
pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified)); pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified));
}
if (callbacks->destroystream != NULL) // check if the stream is not of asfileonly type and later its destruction
{ // see bug 91140
// XXX need to convert status to NPReason nsresult rv = NS_OK;
PRLibrary* lib = nsnull; if(mStreamType == nsPluginStreamType_AsFileOnly)
lib = mInst->fLibrary; rv = CleanUpStream();
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_DestroyStreamProc(callbacks->destroystream, if(rv != NPERR_NO_ERROR)
npp,
&mNPStream,
NPRES_DONE), lib);
if(error != NPERR_NO_ERROR)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
}
// check to see if we have a call back and a
// XXX nasty hack for Shockwave Registration.
// we seem to crash doing URLNotify so just always exclude it.
// See bug 85334.
if (callbacks->urlnotify != NULL && mNotifyData != nsnull &&
strcmp(mNPStream.url,"http://pinger.macromedia.com") < 0 )
{
PRLibrary* lib = nsnull;
lib = mInst->fLibrary;
NS_TRY_SAFE_CALL_VOID(CallNPP_URLNotifyProc(callbacks->urlnotify,
npp,
mNPStream.url,
nsPluginReason_Done,
mNotifyData), lib);
}
// lets get rid of the buffer if we made one globally
if (mStreamBuffer)
{
PR_Free(mStreamBuffer);
mStreamBuffer=nsnull;
}
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -48,6 +48,7 @@ public:
ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData); ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData);
virtual ~ns4xPluginStreamListener(); virtual ~ns4xPluginStreamListener();
PRBool IsStarted(); PRBool IsStarted();
nsresult CleanUpStream();
protected: protected:
void* mNotifyData; void* mNotifyData;
@ -57,6 +58,8 @@ protected:
PRUint32 mPosition; PRUint32 mPosition;
PRUint32 mCurrentStreamOffset; PRUint32 mCurrentStreamOffset;
nsPluginStreamType mStreamType; nsPluginStreamType mStreamType;
PRBool mStreamStarted;
PRBool mStreamCleanedUp;
public: public:
nsIPluginStreamInfo * mStreamInfo; nsIPluginStreamInfo * mStreamInfo;