Bug #48078, 48081 --> bring up save to disk dialog right away from the helper app dialog instead of

waiting till the download is finished.
properly implement Cancel so we stop the download and clean up the temp file.
r=alecf
This commit is contained in:
mscott%netscape.com 2000-08-10 01:49:06 +00:00
Родитель 633eeda090
Коммит 25e12ec3c0
1 изменённых файлов: 60 добавлений и 32 удалений

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

@ -447,12 +447,12 @@ nsresult nsExternalAppHandler::SetUpTempFile(nsIChannel * aChannel)
mTempFile->Append(tempLeafName); // make this file unique!!! mTempFile->Append(tempLeafName); // make this file unique!!!
mTempFile->CreateUnique(nsnull, nsIFile::NORMAL_FILE_TYPE, 0644); mTempFile->CreateUnique(nsnull, nsIFile::NORMAL_FILE_TYPE, 0644);
nsCOMPtr<nsIFileChannel> mFileChannel = do_CreateInstance(NS_LOCALFILECHANNEL_PROGID); nsCOMPtr<nsIFileChannel> fileChannel = do_CreateInstance(NS_LOCALFILECHANNEL_PROGID);
if (mFileChannel) if (fileChannel)
{ {
rv = mFileChannel->Init(mTempFile, -1, 0); rv = fileChannel->Init(mTempFile, -1, 0);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
rv = mFileChannel->OpenOutputStream(getter_AddRefs(mOutStream)); rv = fileChannel->OpenOutputStream(getter_AddRefs(mOutStream));
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
} }
@ -463,6 +463,10 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIChannel * aChannel, nsISup
{ {
NS_ENSURE_ARG(aChannel); NS_ENSURE_ARG(aChannel);
// first, check to see if we've been canceled....
if (mCanceled) // then go cancel our underlying channel too
return aChannel->Cancel(NS_BINDING_ABORTED);
nsresult rv = SetUpTempFile(aChannel); nsresult rv = SetUpTempFile(aChannel);
// now that the temp file is set up, find out if we need to invoke a dialog asking the user what // now that the temp file is set up, find out if we need to invoke a dialog asking the user what
@ -496,6 +500,10 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIChannel * aChannel, nsISup
NS_IMETHODIMP nsExternalAppHandler::OnDataAvailable(nsIChannel * aChannel, nsISupports * aCtxt, NS_IMETHODIMP nsExternalAppHandler::OnDataAvailable(nsIChannel * aChannel, nsISupports * aCtxt,
nsIInputStream * inStr, PRUint32 sourceOffset, PRUint32 count) nsIInputStream * inStr, PRUint32 sourceOffset, PRUint32 count)
{ {
// first, check to see if we've been canceled....
if (mCanceled) // then go cancel our underlying channel too
return aChannel->Cancel(NS_BINDING_ABORTED);
// read the data out of the stream and write it to the temp file. // read the data out of the stream and write it to the temp file.
PRUint32 numBytesRead = 0; PRUint32 numBytesRead = 0;
if (mOutStream && mDataBuffer && count > 0) if (mOutStream && mDataBuffer && count > 0)
@ -519,9 +527,12 @@ NS_IMETHODIMP nsExternalAppHandler::OnStopRequest(nsIChannel * aChannel, nsISupp
nsresult aStatus, const PRUnichar * errorMsg) nsresult aStatus, const PRUnichar * errorMsg)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
mStopRequestIssued = PR_TRUE; mStopRequestIssued = PR_TRUE;
// first, check to see if we've been canceled....
if (mCanceled) // then go cancel our underlying channel too
return aChannel->Cancel(NS_BINDING_ABORTED);
// go ahead and execute the application passing in our temp file as an argument // go ahead and execute the application passing in our temp file as an argument
// this may involve us calling back into the OS external app service to make the call // this may involve us calling back into the OS external app service to make the call
// for actually launching the helper app. It'd be great if nsIFile::spawn could be made to work // for actually launching the helper app. It'd be great if nsIFile::spawn could be made to work
@ -529,7 +540,10 @@ NS_IMETHODIMP nsExternalAppHandler::OnStopRequest(nsIChannel * aChannel, nsISupp
// close the stream... // close the stream...
if (mOutStream) if (mOutStream)
{
mOutStream->Close(); mOutStream->Close();
mOutStream = nsnull;
}
if (mReceivedDispostionInfo && !mCanceled) if (mReceivedDispostionInfo && !mCanceled)
{ {
@ -596,19 +610,25 @@ nsresult nsExternalAppHandler::PromptForSaveToFile(nsILocalFile ** aNewFile, con
NS_IMETHODIMP nsExternalAppHandler::SaveToDisk(nsIFile * aNewFileLocation, PRBool aRememberThisPreference) NS_IMETHODIMP nsExternalAppHandler::SaveToDisk(nsIFile * aNewFileLocation, PRBool aRememberThisPreference)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
mReceivedDispostionInfo = PR_TRUE;
if (mStopRequestIssued)
{
nsCOMPtr<nsILocalFile> fileToUse; nsCOMPtr<nsILocalFile> fileToUse;
if (mCanceled)
return NS_OK;
if (!aNewFileLocation) if (!aNewFileLocation)
{ {
nsXPIDLString leafName; nsXPIDLString leafName;
mTempFile->GetUnicodeLeafName(getter_Copies(leafName)); mTempFile->GetUnicodeLeafName(getter_Copies(leafName));
rv = PromptForSaveToFile(getter_AddRefs(fileToUse), leafName); rv = PromptForSaveToFile(getter_AddRefs(fileToUse), leafName);
if (NS_FAILED(rv))
return Cancel();
mFinalFileDestination = do_QueryInterface(fileToUse);
} }
else else
fileToUse = do_QueryInterface(aNewFileLocation); fileToUse = do_QueryInterface(aNewFileLocation);
if (NS_SUCCEEDED(rv) && fileToUse)
mReceivedDispostionInfo = PR_TRUE;
// if the on stop request was actually issued then it's now time to actually perform the file move....
if (mStopRequestIssued && fileToUse)
{ {
// extract the new leaf name from the file location // extract the new leaf name from the file location
nsXPIDLCString fileName; nsXPIDLCString fileName;
@ -620,20 +640,15 @@ NS_IMETHODIMP nsExternalAppHandler::SaveToDisk(nsIFile * aNewFileLocation, PRBoo
rv = mTempFile->MoveTo(directoryLocation, fileName); rv = mTempFile->MoveTo(directoryLocation, fileName);
} }
} }
else
Cancel(); // call cancel if we failed to save the file to disk.
}
// o.t. remember the new file location to save to.
else
{
mFinalFileDestination = aNewFileLocation;
}
return rv; return rv;
} }
NS_IMETHODIMP nsExternalAppHandler::LaunchWithApplication(nsIFile * aApplication, PRBool aRememberThisPreference) NS_IMETHODIMP nsExternalAppHandler::LaunchWithApplication(nsIFile * aApplication, PRBool aRememberThisPreference)
{ {
if (mCanceled)
return NS_OK;
mReceivedDispostionInfo = PR_TRUE; mReceivedDispostionInfo = PR_TRUE;
if (mMimeInfo && aApplication) if (mMimeInfo && aApplication)
mMimeInfo->SetPreferredApplicationHandler(aApplication); mMimeInfo->SetPreferredApplicationHandler(aApplication);
@ -655,5 +670,18 @@ NS_IMETHODIMP nsExternalAppHandler::LaunchWithApplication(nsIFile * aApplication
NS_IMETHODIMP nsExternalAppHandler::Cancel() NS_IMETHODIMP nsExternalAppHandler::Cancel()
{ {
mCanceled = PR_TRUE; mCanceled = PR_TRUE;
// shutdown our stream to the temp file
if (mOutStream)
{
mOutStream->Close();
mOutStream = nsnull;
}
// clean up after ourselves and delete the temp file...
if (mTempFile)
{
mTempFile->Delete(PR_TRUE);
mTempFile = nsnull;
}
return NS_OK; return NS_OK;
} }