File: nsLocalFileWin.h

package info (click to toggle)
firefox 146.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,653,260 kB
  • sloc: cpp: 7,587,892; javascript: 6,509,455; ansic: 3,755,295; python: 1,410,813; xml: 629,201; asm: 438,677; java: 186,096; sh: 62,697; makefile: 18,086; objc: 13,087; perl: 12,811; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (147 lines) | stat: -rw-r--r-- 4,596 bytes parent folder | download
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