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:
brendan%mozilla.org
2000-09-19 00:22:41 +00:00
parent 0898232dc5
commit 86e239c98f
4 changed files with 438 additions and 466 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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_ */