From 61ba04689f48a1fb29b684c2b55745c2e6d1c58e Mon Sep 17 00:00:00 2001 From: "dougt%netscape.com" Date: Sun, 21 Mar 1999 06:22:45 +0000 Subject: [PATCH] Now adjusting the nsFileSpec after a Move(). Also fixing a bug with Rename(). Now it should successfully take partial pathnames on Unix and Windows. git-svn-id: svn://10.0.0.236/trunk@24612 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/base/public/nsFileSpec.h | 2 +- mozilla/base/src/mac/nsFileSpecMac.cpp | 5 ++++- mozilla/base/src/unix/nsFileSpecUnix.cpp | 21 ++++++++++++++++----- mozilla/base/src/windows/nsFileSpecWin.cpp | 20 +++++++++++++++++--- mozilla/xpcom/io/nsFileSpec.h | 2 +- mozilla/xpcom/io/nsFileSpecMac.cpp | 5 ++++- mozilla/xpcom/io/nsFileSpecUnix.cpp | 21 ++++++++++++++++----- mozilla/xpcom/io/nsFileSpecWin.cpp | 20 +++++++++++++++++--- 8 files changed, 76 insertions(+), 20 deletions(-) diff --git a/mozilla/base/public/nsFileSpec.h b/mozilla/base/public/nsFileSpec.h index 626ce71c268..13a099581d6 100644 --- a/mozilla/base/public/nsFileSpec.h +++ b/mozilla/base/public/nsFileSpec.h @@ -458,7 +458,7 @@ class NS_BASE nsFileSpec return Rename(newName); } nsresult Copy(const nsFileSpec& inNewParentDirectory) const; - nsresult Move(const nsFileSpec& inNewParentDirectory) const; + nsresult Move(const nsFileSpec& inNewParentDirectory); nsresult Execute(const char* args) const; nsresult Execute(const nsString& args) const { diff --git a/mozilla/base/src/mac/nsFileSpecMac.cpp b/mozilla/base/src/mac/nsFileSpecMac.cpp index 1d7fc34d20d..21b63ad1220 100644 --- a/mozilla/base/src/mac/nsFileSpecMac.cpp +++ b/mozilla/base/src/mac/nsFileSpecMac.cpp @@ -816,7 +816,7 @@ nsresult nsFileSpec::Copy(const nsFileSpec& newParentDir) const } // nsFileSpec::Copy //---------------------------------------------------------------------------------------- -nsresult nsFileSpec::Move(const nsFileSpec& newParentDir) const +nsresult nsFileSpec::Move(const nsFileSpec& newParentDir) //---------------------------------------------------------------------------------------- { // We can only move into a directory @@ -827,6 +827,9 @@ nsresult nsFileSpec::Move(const nsFileSpec& newParentDir) const nsresult result = NS_FILE_RESULT(::FSpMoveRenameCompat(&mSpec, &newParentDir.mSpec, const_cast(GetLeafPName()))); + + if ( NS_SUCCEEDED(result) ) + *this = newParentDir + GetLeafName(); return result; } // nsFileSpec::Move diff --git a/mozilla/base/src/unix/nsFileSpecUnix.cpp b/mozilla/base/src/unix/nsFileSpecUnix.cpp index f6c2cf7b070..2a92870b0fe 100644 --- a/mozilla/base/src/unix/nsFileSpecUnix.cpp +++ b/mozilla/base/src/unix/nsFileSpecUnix.cpp @@ -231,11 +231,19 @@ nsresult nsFileSpec::Rename(const char* inNewName) if (strchr(inNewName, '/')) return NS_FILE_FAILURE; - if (PR_Rename(mPath, inNewName) != 0) + char* oldPath = PL_strdup(mPath); + + SetLeafName(inNewName); + + if (PR_Rename(oldPath, mPath) != NS_OK) { + // Could not rename, set back to the original. + mPath = oldPath; return NS_FILE_FAILURE; } - SetLeafName(inNewName); + + delete [] oldPath; + return NS_OK; } // nsFileSpec::Rename @@ -313,7 +321,7 @@ nsresult nsFileSpec::Copy(const nsFileSpec& inParentDirectory) const } // nsFileSpec::Copy //---------------------------------------------------------------------------------------- -nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) const +nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) //---------------------------------------------------------------------------------------- { // We can only copy into a directory, and (for now) can not copy entire directories @@ -331,8 +339,11 @@ nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) const if (result == NS_OK) { // cast to fix const-ness - ((nsFileSpec*)this)->Delete(PR_FALSE); - } + ((nsFileSpec*)this)->Delete(PR_FALSE); + + *this = inNewParentDirectory + GetLeafName(); + } + delete [] destPath; } return result; } diff --git a/mozilla/base/src/windows/nsFileSpecWin.cpp b/mozilla/base/src/windows/nsFileSpecWin.cpp index b95de83b0eb..1665849bc74 100644 --- a/mozilla/base/src/windows/nsFileSpecWin.cpp +++ b/mozilla/base/src/windows/nsFileSpecWin.cpp @@ -284,11 +284,19 @@ nsresult nsFileSpec::Rename(const char* inNewName) if (strchr(inNewName, '/')) return NS_FILE_FAILURE; - if (PR_Rename(*this, inNewName) != NS_OK) + char* oldPath = PL_strdup(mPath); + + SetLeafName(inNewName); + + if (PR_Rename(oldPath, mPath) != NS_OK) { + // Could not rename, set back to the original. + mPath = oldPath; return NS_FILE_FAILURE; } - SetLeafName(inNewName); + + delete [] oldPath; + return NS_OK; } // nsFileSpec::Rename @@ -314,7 +322,7 @@ nsresult nsFileSpec::Copy(const nsFileSpec& inParentDirectory) const } // nsFileSpec::Copy //---------------------------------------------------------------------------------------- -nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) const +nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) //---------------------------------------------------------------------------------------- { // We can only copy into a directory, and (for now) can not copy entire directories @@ -328,8 +336,14 @@ nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) const // MoveFile returns non-zero if succeeds int copyOK = MoveFile(GetCString(), destPath); + if (copyOK) + { + *this = inNewParentDirectory + GetLeafName(); return NS_OK; + } + + delete [] destPath; } return NS_FILE_FAILURE; } // nsFileSpec::Move diff --git a/mozilla/xpcom/io/nsFileSpec.h b/mozilla/xpcom/io/nsFileSpec.h index 626ce71c268..13a099581d6 100644 --- a/mozilla/xpcom/io/nsFileSpec.h +++ b/mozilla/xpcom/io/nsFileSpec.h @@ -458,7 +458,7 @@ class NS_BASE nsFileSpec return Rename(newName); } nsresult Copy(const nsFileSpec& inNewParentDirectory) const; - nsresult Move(const nsFileSpec& inNewParentDirectory) const; + nsresult Move(const nsFileSpec& inNewParentDirectory); nsresult Execute(const char* args) const; nsresult Execute(const nsString& args) const { diff --git a/mozilla/xpcom/io/nsFileSpecMac.cpp b/mozilla/xpcom/io/nsFileSpecMac.cpp index 1d7fc34d20d..21b63ad1220 100644 --- a/mozilla/xpcom/io/nsFileSpecMac.cpp +++ b/mozilla/xpcom/io/nsFileSpecMac.cpp @@ -816,7 +816,7 @@ nsresult nsFileSpec::Copy(const nsFileSpec& newParentDir) const } // nsFileSpec::Copy //---------------------------------------------------------------------------------------- -nsresult nsFileSpec::Move(const nsFileSpec& newParentDir) const +nsresult nsFileSpec::Move(const nsFileSpec& newParentDir) //---------------------------------------------------------------------------------------- { // We can only move into a directory @@ -827,6 +827,9 @@ nsresult nsFileSpec::Move(const nsFileSpec& newParentDir) const nsresult result = NS_FILE_RESULT(::FSpMoveRenameCompat(&mSpec, &newParentDir.mSpec, const_cast(GetLeafPName()))); + + if ( NS_SUCCEEDED(result) ) + *this = newParentDir + GetLeafName(); return result; } // nsFileSpec::Move diff --git a/mozilla/xpcom/io/nsFileSpecUnix.cpp b/mozilla/xpcom/io/nsFileSpecUnix.cpp index f6c2cf7b070..2a92870b0fe 100644 --- a/mozilla/xpcom/io/nsFileSpecUnix.cpp +++ b/mozilla/xpcom/io/nsFileSpecUnix.cpp @@ -231,11 +231,19 @@ nsresult nsFileSpec::Rename(const char* inNewName) if (strchr(inNewName, '/')) return NS_FILE_FAILURE; - if (PR_Rename(mPath, inNewName) != 0) + char* oldPath = PL_strdup(mPath); + + SetLeafName(inNewName); + + if (PR_Rename(oldPath, mPath) != NS_OK) { + // Could not rename, set back to the original. + mPath = oldPath; return NS_FILE_FAILURE; } - SetLeafName(inNewName); + + delete [] oldPath; + return NS_OK; } // nsFileSpec::Rename @@ -313,7 +321,7 @@ nsresult nsFileSpec::Copy(const nsFileSpec& inParentDirectory) const } // nsFileSpec::Copy //---------------------------------------------------------------------------------------- -nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) const +nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) //---------------------------------------------------------------------------------------- { // We can only copy into a directory, and (for now) can not copy entire directories @@ -331,8 +339,11 @@ nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) const if (result == NS_OK) { // cast to fix const-ness - ((nsFileSpec*)this)->Delete(PR_FALSE); - } + ((nsFileSpec*)this)->Delete(PR_FALSE); + + *this = inNewParentDirectory + GetLeafName(); + } + delete [] destPath; } return result; } diff --git a/mozilla/xpcom/io/nsFileSpecWin.cpp b/mozilla/xpcom/io/nsFileSpecWin.cpp index b95de83b0eb..1665849bc74 100644 --- a/mozilla/xpcom/io/nsFileSpecWin.cpp +++ b/mozilla/xpcom/io/nsFileSpecWin.cpp @@ -284,11 +284,19 @@ nsresult nsFileSpec::Rename(const char* inNewName) if (strchr(inNewName, '/')) return NS_FILE_FAILURE; - if (PR_Rename(*this, inNewName) != NS_OK) + char* oldPath = PL_strdup(mPath); + + SetLeafName(inNewName); + + if (PR_Rename(oldPath, mPath) != NS_OK) { + // Could not rename, set back to the original. + mPath = oldPath; return NS_FILE_FAILURE; } - SetLeafName(inNewName); + + delete [] oldPath; + return NS_OK; } // nsFileSpec::Rename @@ -314,7 +322,7 @@ nsresult nsFileSpec::Copy(const nsFileSpec& inParentDirectory) const } // nsFileSpec::Copy //---------------------------------------------------------------------------------------- -nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) const +nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) //---------------------------------------------------------------------------------------- { // We can only copy into a directory, and (for now) can not copy entire directories @@ -328,8 +336,14 @@ nsresult nsFileSpec::Move(const nsFileSpec& inNewParentDirectory) const // MoveFile returns non-zero if succeeds int copyOK = MoveFile(GetCString(), destPath); + if (copyOK) + { + *this = inNewParentDirectory + GetLeafName(); return NS_OK; + } + + delete [] destPath; } return NS_FILE_FAILURE; } // nsFileSpec::Move