Fixes to use atomic rename(2) if possible in nsLocalFile::MoveTo (33098, r=?),
plus a bunch of other fixes and cleanups:
- Fix comment misstatements of fact in nsIFile.idl, improve style slightly.
- Fix typo in comment in nsILocalFile.idl.
- Avoid gratuitous nsCString and nsXPIDLCString copy-constructions, which
entail malloc'ing, in nsLocalFileUnix.cpp's CopyTo and GetParent methods.
But do use nsXPIDLCString instead of raw nsMemory::Alloc/Free.
- Get rid of unnecessary mLL_II2L and mLL_L2II macros, use "prlong.h" API only.
Also use the LL_* macros consistently in case a Unix lacking long long type
support wants to use this code.
* BTW, the "Date" methods should be renamed to use "Time" instead -- after all
PRTime is the type, and traditionally "time" refers to the time-number, a
scalar independent of one's position on the surface of the earth, while
"date" refers to a struct full of locale-specific information derived from
time and some "environment" variables such as DST. Can we rename these
nsIFile methods before Mozilla 0.9 / Netscape 6?
- Use CHECK_mPath consistently and first, before any assertions relating to
arguments (which logically come after the 'this' parameter CHECK_mPath is
making assertions about).
- Use nsCOMPtr for singly-inheriting implementations of XPCOM interfaces, to
avoid scary-when-scaled 0-refcnt instances from being handled (these all
got a ref via QI or equivalent soon enough, but you never know). This also
removed some naked deletes.
- Canonize all paths copied into mPath to lack trailing slashes, so we don't
need to strip trailing slashes elsewhere, in higher-frequency methods (you
set path less often than you get it or a substring of it).
- ssize_t for strlen return values.
- Since shaver used a function pointer to consolidate creat/mkdir logic, but
didn't fold the necessary close of the new fd returned by non-failing creat
into the pointed-at function, I did that.
- AppendRelativePath forbids .. as a component (bounded by / or beginning or
end of string on either side), not just in the middle of fragment (so that
foo..bar is not an illegal relative pathname -- it should not be). BTW,
what the heck is the difference between NS_ERROR_FILE_UNRECOGNIZED_PATH and
...INVALID_PATH?
- SetLeafName was overallocating the new pathname buffer by failing to subtract
the old leafname's length.
- CopyTo was failing to return an NSRESULT_FOR_ERRNO(), it just called that
macro on a line by itself -- eek! It also contained redundant if (newFD
== nsnull) {...} cleanup code, it did a useless PR_GetFileInfo call, and it
leaked FDs on read or write error.
- Implemented CopyToFollowingLinks as a forwarded call to CopyTo, Unix does
not support "copying" a symlink via normal file i/o. Should we instead
lstat in CopyTo and if a link is the source of the copy, do readlink and
then symlink?
- Fixed the readlink method (GetTarget) to null-terminate the link string in
the out parameter (readlink does not do that for you).
- Lots of little nsnull vs. NULL vs. 0, == and != applied to boolean or null
literals, white-space, indentation, bracing, comment, and sloppy code order
(e.g., declaring an initialized variable that's not used till after early
returns) fixes. Also invert some return logic so that NS_OK is the normal,
least indented, final return.
git-svn-id: svn://10.0.0.236/trunk@79492 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -102,14 +102,15 @@ interface nsIFile : nsISupports
|
||||
*
|
||||
* @param newParentDir
|
||||
* This param is the destination directory. If the
|
||||
* newParentDir is nsnull, copyTo() will simply
|
||||
* rename the file. If the newParentDir is not
|
||||
* null and does not exists, an error will be
|
||||
* newParentDir is null, copyTo() will use the parent
|
||||
* directory of this file. If the newParentDir is not
|
||||
* null and is not a directory, an error will be
|
||||
* returned (NS_ERROR_FILE_DESTINATION_NOT_DIR)
|
||||
*
|
||||
* @param newName
|
||||
* This param allows you to specify a new name
|
||||
* for the file to be copied. This can be nsnull.
|
||||
* This param allows you to specify a new name for
|
||||
* the file to be copied. This param may be null, in
|
||||
* which case the current leaf name will be used.
|
||||
*
|
||||
*/
|
||||
void copyTo(in nsIFile newParentDir, [const] in string newName);
|
||||
@@ -119,7 +120,9 @@ interface nsIFile : nsISupports
|
||||
* copyToFollowingLinks
|
||||
*
|
||||
* This function is identical to copyTo except it, as
|
||||
* the name implies, follows symbolic links.
|
||||
* the name implies, follows symbolic links. Some OSes
|
||||
* such as Unix and Linux always follow symbolic links
|
||||
* when copying.
|
||||
*/
|
||||
void copyToFollowingLinks(in nsIFile newParentDir, [const] in string newName);
|
||||
void copyToFollowingLinksUnicode(in nsIFile newParentDir, [const] in wstring newName);
|
||||
@@ -138,14 +141,15 @@ interface nsIFile : nsISupports
|
||||
*
|
||||
* @param newParentDir
|
||||
* This param is the destination directory. If the
|
||||
* newParentDir is nsnull, moveTo() will simply
|
||||
* rename the file. If the newParentDir is not
|
||||
* null and does not exists, an error will be
|
||||
* returned (NS_ERROR_FILE_DESTINATION_NOT_DIR)
|
||||
* newParentDir is null, moveTo() will rename the file
|
||||
* within its current directory. If the newParentDir is
|
||||
* not null and does not name a directory, an error will
|
||||
* be returned (NS_ERROR_FILE_DESTINATION_NOT_DIR)
|
||||
*
|
||||
* @param newName
|
||||
* This param allows you to specify a new name
|
||||
* for the file to be moved. This can be nsnull.
|
||||
* This param allows you to specify a new name for
|
||||
* the file to be moved. This param may be null, in
|
||||
* which case the current leaf name will be used.
|
||||
*
|
||||
*/
|
||||
void moveTo(in nsIFile newParentDir, [const] in string newName);
|
||||
@@ -277,13 +281,13 @@ interface nsIFile : nsISupports
|
||||
boolean equals(in nsIFile inFile);
|
||||
|
||||
/**
|
||||
* Will determine if the inFile is a descendant
|
||||
* If |recur| is true, it will descend subdirectories looking for
|
||||
* Will determine if inFile is a descendant of this file
|
||||
* If |recur| is true, look in subdirectories too
|
||||
*/
|
||||
boolean contains(in nsIFile inFile, in boolean recur);
|
||||
|
||||
/**
|
||||
* Parent will be nsnull when this is at the top of the volume.
|
||||
* Parent will be null when this is at the top of the volume.
|
||||
*/
|
||||
readonly attribute nsIFile parent;
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ interface nsILocalFile : nsIFile
|
||||
* @param filePath
|
||||
* A string which specifies a full file path to a
|
||||
* location. Relative paths will be treated as an
|
||||
* error (NS_ERROR_FILE_UNRECONGNIZED_PATH). This
|
||||
* error (NS_ERROR_FILE_UNRECOGNIZED_PATH). This
|
||||
* path must in native.
|
||||
*/
|
||||
void initWithPath([const] in string filePath);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -38,7 +38,7 @@
|
||||
#include "nsLocalFile.h"
|
||||
#include "nsXPIDLString.h"
|
||||
|
||||
#define NSRESULT_FOR_RETURN(ret) (!(ret) ? NS_OK : NSRESULT_FOR_ERRNO())
|
||||
#define NSRESULT_FOR_RETURN(ret) (((ret) < 0) ? NSRESULT_FOR_ERRNO() : NS_OK)
|
||||
|
||||
inline nsresult
|
||||
nsresultForErrno(int err)
|
||||
@@ -94,6 +94,8 @@ protected:
|
||||
|
||||
nsresult CreateAllAncestors(PRUint32 permissions);
|
||||
nsresult GetLeafNameRaw(const char **_retval);
|
||||
nsresult GetTargetPathName(nsIFile *newParent, const char *newName,
|
||||
char **_retval);
|
||||
|
||||
void InvalidateCache() { mHaveCachedStat = PR_FALSE; }
|
||||
|
||||
@@ -109,4 +111,5 @@ protected:
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif /* _nsLocalFileUNIX_H_ */
|
||||
|
||||
Reference in New Issue
Block a user