From 395017ccda1f0a7eb520fd76b9bc418ccc33d597 Mon Sep 17 00:00:00 2001 From: "ccarlen%netscape.com" Date: Mon, 26 Feb 2001 15:22:17 +0000 Subject: [PATCH] Bug 27857 - nsIFile not complete on Mac. Adding CopyToFollowingLinks(). r=sdagley@netscape.com, sr=sfraser@netscape.com git-svn-id: svn://10.0.0.236/trunk@87987 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpcom/io/nsLocalFileMac.cpp | 29 +++++++++++++++++++---------- mozilla/xpcom/io/nsLocalFileMac.h | 2 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/mozilla/xpcom/io/nsLocalFileMac.cpp b/mozilla/xpcom/io/nsLocalFileMac.cpp index 0c3928832e4..8f6612bcabe 100644 --- a/mozilla/xpcom/io/nsLocalFileMac.cpp +++ b/mozilla/xpcom/io/nsLocalFileMac.cpp @@ -1389,16 +1389,21 @@ nsLocalFile::GetPath(char **_retval) return NS_OK; } -nsresult nsLocalFile::MoveCopy( nsIFile* newParentDir, const char* newName, PRBool isCopy ) +nsresult nsLocalFile::MoveCopy( nsIFile* newParentDir, const char* newName, PRBool isCopy, PRBool followLinks ) { nsresult rv = ResolveAndStat( PR_TRUE ); if ( NS_FAILED( rv ) ) return rv; OSErr macErr; - FSSpec srcSpec = mResolvedSpec; + FSSpec srcSpec; Str255 newPascalName; + if (followLinks) + srcSpec = mTargetSpec; + else + srcSpec = mResolvedSpec; + // If newParentDir == nsnull, it's a simple rename if ( !newParentDir ) { @@ -1407,15 +1412,19 @@ nsresult nsLocalFile::MoveCopy( nsIFile* newParentDir, const char* newName, PRBo macErr = ::FSpRename( &srcSpec, newPascalName ); return MacErrorMapper( macErr ); } + + PRBool isDirectory; + rv = newParentDir->IsDirectory( &isDirectory ); + if ( NS_FAILED( rv ) || !isDirectory ) + return NS_ERROR_FILE_DESTINATION_NOT_DIR; nsCOMPtr destDir( do_QueryInterface( newParentDir )); FSSpec destSpec; - PRBool isDirectory; - rv = newParentDir->IsDirectory( &isDirectory ); - if ( NS_FAILED( rv ) ) - return rv; - rv = destDir->GetResolvedFSSpec( &destSpec ); + if (followLinks) + rv = destDir->GetTargetFSSpec( &destSpec ); + else + rv = destDir->GetResolvedFSSpec( &destSpec ); // If resolved spec is an alias file, we'll rightly fail if ( NS_FAILED( rv ) ) return rv; @@ -1448,19 +1457,19 @@ nsresult nsLocalFile::MoveCopy( nsIFile* newParentDir, const char* newName, PRBo NS_IMETHODIMP nsLocalFile::CopyTo(nsIFile *newParentDir, const char *newName) { - return MoveCopy( newParentDir, newName, PR_TRUE ); + return MoveCopy( newParentDir, newName, PR_TRUE, PR_FALSE ); } NS_IMETHODIMP nsLocalFile::CopyToFollowingLinks(nsIFile *newParentDir, const char *newName) { - return NS_ERROR_NOT_IMPLEMENTED; + return MoveCopy( newParentDir, newName, PR_TRUE, PR_TRUE ); } NS_IMETHODIMP nsLocalFile::MoveTo(nsIFile *newParentDir, const char *newName) { - return MoveCopy( newParentDir, newName, PR_FALSE ); + return MoveCopy( newParentDir, newName, PR_FALSE, PR_FALSE ); } NS_IMETHODIMP diff --git a/mozilla/xpcom/io/nsLocalFileMac.h b/mozilla/xpcom/io/nsLocalFileMac.h index b5213459610..f9d3fcf785e 100644 --- a/mozilla/xpcom/io/nsLocalFileMac.h +++ b/mozilla/xpcom/io/nsLocalFileMac.h @@ -94,7 +94,7 @@ protected: nsresult TestFinderFlag(PRUint16 flagMask, PRBool *outFlagSet, PRBool testTargetSpec = PR_TRUE); OSErr GetTargetSpecCatInfo(CInfoPBRec& outInfo); - nsresult MoveCopy( nsIFile* newParentDir, const char* newName, PRBool isCopy ); + nsresult MoveCopy( nsIFile* newParentDir, const char* newName, PRBool isCopy, PRBool followLinks ); // Passing nsnull for the extension uses leaf name nsresult SetOSTypeAndCreatorFromExtension(const char* extension = nsnull);