зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
633eeda090
Коммит
25e12ec3c0
|
@ -447,12 +447,12 @@ nsresult nsExternalAppHandler::SetUpTempFile(nsIChannel * aChannel)
|
|||
mTempFile->Append(tempLeafName); // make this file unique!!!
|
||||
mTempFile->CreateUnique(nsnull, nsIFile::NORMAL_FILE_TYPE, 0644);
|
||||
|
||||
nsCOMPtr<nsIFileChannel> mFileChannel = do_CreateInstance(NS_LOCALFILECHANNEL_PROGID);
|
||||
if (mFileChannel)
|
||||
nsCOMPtr<nsIFileChannel> fileChannel = do_CreateInstance(NS_LOCALFILECHANNEL_PROGID);
|
||||
if (fileChannel)
|
||||
{
|
||||
rv = mFileChannel->Init(mTempFile, -1, 0);
|
||||
rv = fileChannel->Init(mTempFile, -1, 0);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = mFileChannel->OpenOutputStream(getter_AddRefs(mOutStream));
|
||||
rv = fileChannel->OpenOutputStream(getter_AddRefs(mOutStream));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
|
||||
|
@ -463,6 +463,10 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIChannel * aChannel, nsISup
|
|||
{
|
||||
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);
|
||||
|
||||
// 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,
|
||||
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.
|
||||
PRUint32 numBytesRead = 0;
|
||||
if (mOutStream && mDataBuffer && count > 0)
|
||||
|
@ -519,9 +527,12 @@ NS_IMETHODIMP nsExternalAppHandler::OnStopRequest(nsIChannel * aChannel, nsISupp
|
|||
nsresult aStatus, const PRUnichar * errorMsg)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
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
|
||||
// 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
|
||||
|
@ -529,7 +540,10 @@ NS_IMETHODIMP nsExternalAppHandler::OnStopRequest(nsIChannel * aChannel, nsISupp
|
|||
|
||||
// close the stream...
|
||||
if (mOutStream)
|
||||
{
|
||||
mOutStream->Close();
|
||||
mOutStream = nsnull;
|
||||
}
|
||||
|
||||
if (mReceivedDispostionInfo && !mCanceled)
|
||||
{
|
||||
|
@ -596,37 +610,35 @@ nsresult nsExternalAppHandler::PromptForSaveToFile(nsILocalFile ** aNewFile, con
|
|||
NS_IMETHODIMP nsExternalAppHandler::SaveToDisk(nsIFile * aNewFileLocation, PRBool aRememberThisPreference)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
mReceivedDispostionInfo = PR_TRUE;
|
||||
if (mStopRequestIssued)
|
||||
nsCOMPtr<nsILocalFile> fileToUse;
|
||||
if (mCanceled)
|
||||
return NS_OK;
|
||||
|
||||
if (!aNewFileLocation)
|
||||
{
|
||||
nsCOMPtr<nsILocalFile> fileToUse;
|
||||
if (!aNewFileLocation)
|
||||
{
|
||||
nsXPIDLString leafName;
|
||||
mTempFile->GetUnicodeLeafName(getter_Copies(leafName));
|
||||
rv = PromptForSaveToFile(getter_AddRefs(fileToUse), leafName);
|
||||
}
|
||||
else
|
||||
fileToUse = do_QueryInterface(aNewFileLocation);
|
||||
if (NS_SUCCEEDED(rv) && fileToUse)
|
||||
{
|
||||
// extract the new leaf name from the file location
|
||||
nsXPIDLCString fileName;
|
||||
fileToUse->GetLeafName(getter_Copies(fileName));
|
||||
nsCOMPtr<nsIFile> directoryLocation;
|
||||
fileToUse->GetParent(getter_AddRefs(directoryLocation));
|
||||
if (directoryLocation)
|
||||
{
|
||||
rv = mTempFile->MoveTo(directoryLocation, fileName);
|
||||
}
|
||||
}
|
||||
else
|
||||
Cancel(); // call cancel if we failed to save the file to disk.
|
||||
nsXPIDLString leafName;
|
||||
mTempFile->GetUnicodeLeafName(getter_Copies(leafName));
|
||||
rv = PromptForSaveToFile(getter_AddRefs(fileToUse), leafName);
|
||||
if (NS_FAILED(rv))
|
||||
return Cancel();
|
||||
mFinalFileDestination = do_QueryInterface(fileToUse);
|
||||
}
|
||||
// o.t. remember the new file location to save to.
|
||||
else
|
||||
fileToUse = do_QueryInterface(aNewFileLocation);
|
||||
|
||||
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)
|
||||
{
|
||||
mFinalFileDestination = aNewFileLocation;
|
||||
// extract the new leaf name from the file location
|
||||
nsXPIDLCString fileName;
|
||||
fileToUse->GetLeafName(getter_Copies(fileName));
|
||||
nsCOMPtr<nsIFile> directoryLocation;
|
||||
fileToUse->GetParent(getter_AddRefs(directoryLocation));
|
||||
if (directoryLocation)
|
||||
{
|
||||
rv = mTempFile->MoveTo(directoryLocation, fileName);
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
@ -634,6 +646,9 @@ NS_IMETHODIMP nsExternalAppHandler::SaveToDisk(nsIFile * aNewFileLocation, PRBoo
|
|||
|
||||
NS_IMETHODIMP nsExternalAppHandler::LaunchWithApplication(nsIFile * aApplication, PRBool aRememberThisPreference)
|
||||
{
|
||||
if (mCanceled)
|
||||
return NS_OK;
|
||||
|
||||
mReceivedDispostionInfo = PR_TRUE;
|
||||
if (mMimeInfo && aApplication)
|
||||
mMimeInfo->SetPreferredApplicationHandler(aApplication);
|
||||
|
@ -655,5 +670,18 @@ NS_IMETHODIMP nsExternalAppHandler::LaunchWithApplication(nsIFile * aApplication
|
|||
NS_IMETHODIMP nsExternalAppHandler::Cancel()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче