From 398f4032430bcc42eaebf693ffff3d2f74c507c3 Mon Sep 17 00:00:00 2001 From: "mcmullen%netscape.com" Date: Wed, 19 May 1999 18:50:18 +0000 Subject: [PATCH] added nsSaveViaTempStream git-svn-id: svn://10.0.0.236/branches/XPCOM20_BRANCH@32328 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpcom/io/nsFileStream.cpp | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/mozilla/xpcom/io/nsFileStream.cpp b/mozilla/xpcom/io/nsFileStream.cpp index 9798e07cd35..52617319424 100644 --- a/mozilla/xpcom/io/nsFileStream.cpp +++ b/mozilla/xpcom/io/nsFileStream.cpp @@ -308,6 +308,64 @@ void nsOutputFileStream::flush() mFileOutputStream->Flush(); } +//---------------------------------------------------------------------------------------- +void nsOutputFileStream::abort() +//---------------------------------------------------------------------------------------- +{ + mResult = NS_FILE_FAILURE; + close(); +} + +//======================================================================================== +// nsSaveViaTempStream +//======================================================================================== + +//---------------------------------------------------------------------------------------- +nsSaveViaTempStream::nsSaveViaTempStream(const nsFileSpec& inFileToSave) +//---------------------------------------------------------------------------------------- + : mFileToSave(inFileToSave) + , mTempFileSpec(new nsFileSpec(inFileToSave)) +{ + // Make sure the temp file's unique (in particular, different from the target file) + mTempFileSpec->MakeUnique(); + open( + *mTempFileSpec, + (PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE), + 0700 /*(octal)*/); +} // nsSaveViaTempStream::nsSaveViaTempStream + +//---------------------------------------------------------------------------------------- +void nsSaveViaTempStream::close() +//---------------------------------------------------------------------------------------- +{ + if (!mTempFileSpec) + return; + nsresult currentResult = mResult; + Inherited::close(); + mResult = currentResult; + if (error()) + { + mTempFileSpec->Delete(PR_FALSE); + } + else + { + nsFileSpec thirdSpec(mFileToSave); + thirdSpec.MakeUnique(); + nsSimpleCharString originalName(mFileToSave.GetLeafName()); + mFileToSave.Rename(nsSimpleCharString(thirdSpec.GetLeafName())); + if (NS_SUCCEEDED(mTempFileSpec->Rename(originalName)) && mTempFileSpec->Valid()) + mFileToSave.Delete(PR_FALSE); + } + delete mTempFileSpec; +} // nsSaveViaTempStream::~nsSaveViaTempStream + +//---------------------------------------------------------------------------------------- +nsSaveViaTempStream::~nsSaveViaTempStream() +//---------------------------------------------------------------------------------------- +{ + delete mTempFileSpec; +} // nsSaveViaTempStream::~nsSaveViaTempStream + //======================================================================================== // Manipulators //========================================================================================