1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef _nsLocalFileWIN_H_
#define _nsLocalFileWIN_H_
#include "nscore.h"
#include "nsError.h"
#include "nsString.h"
#include "nsCRT.h"
#include "nsIFile.h"
#include "nsILocalFileWin.h"
#include "nsIClassInfoImpl.h"
#include "nsWindowsHelpers.h"
#include "prio.h"
#include <windows.h>
#include <shlobj.h>
#include <sys/stat.h>
class nsLocalFile final : public nsILocalFileWin {
public:
NS_DEFINE_STATIC_CID_ACCESSOR(NS_LOCAL_FILE_CID)
nsLocalFile();
static nsresult nsLocalFileConstructor(const nsIID& aIID,
void** aInstancePtr);
// nsISupports interface
NS_DECL_THREADSAFE_ISUPPORTS
// nsIFile interface
NS_DECL_NSIFILE
// nsILocalFileWin interface
NS_DECL_NSILOCALFILEWIN
public:
// Removes registry command handler parameters, quotes, and expands
// environment strings.
static bool CleanupCmdHandlerPath(nsAString& aCommandHandler);
// Called off the main thread to open the window revealing the file
static nsresult RevealFile(const nsString& aResolvedPath);
// Checks if the filename is one of the windows reserved filenames
// (com1, com2, etc...) and returns true if so.
static bool CheckForReservedFileName(const nsString& aFileName);
/**
* Checks whether the inherited ACEs in aChildDacl only come from the parent.
*
* @param aChildDacl the DACL for the child file object
* @param aIsChildDir true if child is a directory
* @param aChildSecDesc the SECURITY_DESCRIPTOR for the child, this will
* correspond to aChildDacl
* @param aParentDir the parent nsIFile
* @return true if inherited ACEs are only from aParentDir
* false if child has other inherited ACEs or a failure occurs
*/
static bool ChildAclMatchesAclInheritedFromParent(
const mozilla::NotNull<ACL*> aChildDacl, bool aIsChildDir,
const AutoFreeSecurityDescriptor& aChildSecDesc, nsIFile* aParentDir);
// PRFileInfo64 does not hvae an accessTime field;
struct FileInfo {
PRFileType type;
PROffset64 size;
PRTime creationTime;
PRTime accessTime;
PRTime modifyTime;
};
private:
// CopyMove and CopySingleFile constants for |options| parameter:
enum CopyFileOption {
FollowSymlinks = 1u << 0,
Move = 1u << 1,
SkipNtfsAclReset = 1u << 2,
Rename = 1u << 3
};
nsLocalFile(const nsLocalFile& aOther);
~nsLocalFile() {}
bool mDirty; // cached information can only be used when this is false
bool mResolveDirty;
bool mUseDOSDevicePathSyntax;
// this string will always be in native format!
nsString mWorkingPath;
// this will be the resolved path of shortcuts, it will *NEVER*
// be returned to the user
nsString mResolvedPath;
// this string, if not empty, is the *short* pathname that represents
// mWorkingPath
nsString mShortWorkingPath;
FileInfo mFileInfo;
void MakeDirty() {
mDirty = true;
mResolveDirty = true;
mShortWorkingPath.Truncate();
}
nsresult LookupExtensionIn(const char* const* aExtensionsArray,
size_t aArrayLength, bool* aResult);
nsresult ResolveAndStat();
nsresult Resolve();
nsresult ResolveSymlink();
void EnsureShortPath();
nsresult CopyMove(nsIFile* aNewParentDir, const nsAString& aNewName,
uint32_t aOptions);
/**
* Moves or copies this file or directory as a single entity.
* @param aDest the destination directory
* @param aNewName optional new name
* @param aOptions CopyFileOption flags
*/
nsresult MoveOrCopyAsSingleFileOrDir(nsIFile* aDest,
const nsAString& aNewName,
uint32_t aOptions);
enum class TimeField { AccessedTime, ModifiedTime };
nsresult SetDateImpl(int64_t aTime, TimeField aTimeField);
nsresult GetDateImpl(PRTime* aTime, TimeField aTimeField, bool aFollowLinks);
nsresult HasFileAttribute(DWORD aFileAttrib, bool* aResult);
nsresult AppendInternal(const nsString& aNode, bool aMultipleComponents);
nsresult OpenNSPRFileDescMaybeShareDelete(int32_t aFlags, int32_t aMode,
bool aShareDelete,
PRFileDesc** aResult);
};
#endif
|