src/jdk.incubator.jpackage/windows/native/libapplauncher/FilePath.cpp
author herrick
Fri, 08 Nov 2019 14:53:03 -0500
branchJDK-8200758-branch
changeset 58994 b09ba68c6a19
parent 57909 src/jdk.jpackage/windows/native/libapplauncher/FilePath.cpp@c7de06ed4b54
permissions -rw-r--r--
8233636 : Make jpackage an incubator and remove tool provider implementation Reviewed-by: asemenyuk, almatvee, kcr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57194
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
     1
/*
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
     2
 * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
     4
 *
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    10
 *
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    15
 * accompanied this code).
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    16
 *
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    20
 *
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    23
 * questions.
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    24
 */
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    25
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    26
#include "FilePath.h"
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    27
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    28
#include <algorithm>
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    29
#include <list>
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    30
#include <ShellAPI.h>
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    31
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    32
bool FilePath::FileExists(const TString FileName) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    33
    bool result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    34
    WIN32_FIND_DATA FindFileData;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    35
    TString fileName = FixPathForPlatform(FileName);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    36
    HANDLE handle = FindFirstFile(fileName.data(), &FindFileData);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    37
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    38
    if (handle != INVALID_HANDLE_VALUE) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    39
        if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    40
            result = true;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    41
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    42
        else {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    43
            result = true;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    44
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    45
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    46
        FindClose(handle);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    47
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    48
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    49
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    50
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    51
bool FilePath::DirectoryExists(const TString DirectoryName) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    52
    bool result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    53
    WIN32_FIND_DATA FindFileData;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    54
    TString directoryName = FixPathForPlatform(DirectoryName);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    55
    HANDLE handle = FindFirstFile(directoryName.data(), &FindFileData);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    56
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    57
    if (handle != INVALID_HANDLE_VALUE) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    58
        if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    59
            result = true;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    60
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    61
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    62
        FindClose(handle);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    63
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    64
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    65
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    66
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    67
std::string GetLastErrorAsString() {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    68
    // Get the error message, if any.
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    69
    DWORD errorMessageID = ::GetLastError();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    70
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    71
    if (errorMessageID == 0) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    72
        return "No error message has been recorded";
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    73
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    74
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    75
    LPSTR messageBuffer = NULL;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    76
    size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    77
            | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    78
            NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL,
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    79
            SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    80
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    81
    std::string message(messageBuffer, size);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    82
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    83
    // Free the buffer.
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    84
    LocalFree(messageBuffer);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    85
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    86
    return message;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    87
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    88
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    89
bool FilePath::DeleteFile(const TString FileName) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    90
    bool result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    91
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    92
    if (FileExists(FileName) == true) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    93
        TString lFileName = FixPathForPlatform(FileName);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    94
        FileAttributes attributes(lFileName);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    95
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    96
        if (attributes.Contains(faReadOnly) == true) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    97
            attributes.Remove(faReadOnly);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    98
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
    99
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   100
        result = ::DeleteFile(lFileName.data()) == TRUE;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   101
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   102
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   103
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   104
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   105
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   106
bool FilePath::DeleteDirectory(const TString DirectoryName) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   107
    bool result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   108
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   109
    if (DirectoryExists(DirectoryName) == true) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   110
        SHFILEOPSTRUCTW fos = {0};
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   111
        TString directoryName = FixPathForPlatform(DirectoryName);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   112
        DynamicBuffer<TCHAR> lDirectoryName(directoryName.size() + 2);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   113
        if (lDirectoryName.GetData() == NULL) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   114
            return false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   115
        }
57909
c7de06ed4b54 8229979: jpackage cleanup src files, help text, and javadoc
herrick
parents: 57397
diff changeset
   116
        memcpy(lDirectoryName.GetData(), directoryName.data(),
c7de06ed4b54 8229979: jpackage cleanup src files, help text, and javadoc
herrick
parents: 57397
diff changeset
   117
                (directoryName.size() + 2) * sizeof(TCHAR));
57194
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   118
        lDirectoryName[directoryName.size() + 1] = NULL;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   119
        // Double null terminate for SHFileOperation.
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   120
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   121
        // Delete the folder and everything inside.
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   122
        fos.wFunc = FO_DELETE;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   123
        fos.pFrom = lDirectoryName.GetData();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   124
        fos.fFlags = FOF_NO_UI;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   125
        result = SHFileOperation(&fos) == 0;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   126
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   127
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   128
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   129
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   130
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   131
TString FilePath::IncludeTrailingSeparator(const TString value) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   132
    TString result = value;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   133
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   134
    if (value.size() > 0) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   135
        TString::iterator i = result.end();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   136
        i--;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   137
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   138
        if (*i != TRAILING_PATHSEPARATOR) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   139
            result += TRAILING_PATHSEPARATOR;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   140
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   141
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   142
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   143
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   144
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   145
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   146
TString FilePath::IncludeTrailingSeparator(const char* value) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   147
    TString lvalue = PlatformString(value).toString();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   148
    return IncludeTrailingSeparator(lvalue);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   149
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   150
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   151
TString FilePath::IncludeTrailingSeparator(const wchar_t* value) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   152
    TString lvalue = PlatformString(value).toString();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   153
    return IncludeTrailingSeparator(lvalue);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   154
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   155
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   156
TString FilePath::ExtractFilePath(TString Path) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   157
    TString result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   158
    size_t slash = Path.find_last_of(TRAILING_PATHSEPARATOR);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   159
    if (slash != TString::npos)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   160
        result = Path.substr(0, slash);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   161
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   162
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   163
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   164
TString FilePath::ExtractFileExt(TString Path) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   165
    TString result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   166
    size_t dot = Path.find_last_of('.');
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   167
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   168
    if (dot != TString::npos) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   169
        result  = Path.substr(dot, Path.size() - dot);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   170
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   171
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   172
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   173
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   174
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   175
TString FilePath::ExtractFileName(TString Path) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   176
    TString result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   177
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   178
    size_t slash = Path.find_last_of(TRAILING_PATHSEPARATOR);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   179
    if (slash != TString::npos)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   180
        result = Path.substr(slash + 1, Path.size() - slash - 1);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   181
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   182
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   183
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   184
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   185
TString FilePath::ChangeFileExt(TString Path, TString Extension) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   186
    TString result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   187
    size_t dot = Path.find_last_of('.');
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   188
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   189
    if (dot != TString::npos) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   190
        result = Path.substr(0, dot) + Extension;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   191
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   192
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   193
    if (result.empty() == true) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   194
        result = Path;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   195
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   196
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   197
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   198
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   199
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   200
TString FilePath::FixPathForPlatform(TString Path) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   201
    TString result = Path;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   202
    std::replace(result.begin(), result.end(),
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   203
            BAD_TRAILING_PATHSEPARATOR, TRAILING_PATHSEPARATOR);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   204
    // The maximum path that does not require long path prefix. On Windows the
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   205
    // maximum path is 260 minus 1 (NUL) but for directories it is 260 minus
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   206
    // 12 minus 1 (to allow for the creation of a 8.3 file in the directory).
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   207
    const int maxPath = 247;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   208
    if (result.length() > maxPath &&
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   209
        result.find(_T("\\\\?\\")) == TString::npos &&
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   210
        result.find(_T("\\\\?\\UNC")) == TString::npos) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   211
        const TString prefix(_T("\\\\"));
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   212
        if (!result.compare(0, prefix.size(), prefix)) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   213
            // UNC path, converting to UNC path in long notation
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   214
            result = _T("\\\\?\\UNC") + result.substr(1, result.length());
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   215
        } else {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   216
            // converting to non-UNC path in long notation
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   217
            result = _T("\\\\?\\") + result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   218
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   219
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   220
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   221
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   222
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   223
TString FilePath::FixPathSeparatorForPlatform(TString Path) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   224
    TString result = Path;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   225
    std::replace(result.begin(), result.end(),
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   226
            BAD_PATH_SEPARATOR, PATH_SEPARATOR);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   227
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   228
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   229
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   230
TString FilePath::PathSeparator() {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   231
    TString result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   232
    result = PATH_SEPARATOR;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   233
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   234
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   235
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   236
bool FilePath::CreateDirectory(TString Path, bool ownerOnly) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   237
    bool result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   238
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   239
    std::list<TString> paths;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   240
    TString lpath = Path;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   241
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   242
    while (lpath.empty() == false && DirectoryExists(lpath) == false) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   243
        paths.push_front(lpath);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   244
        lpath = ExtractFilePath(lpath);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   245
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   246
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   247
    for (std::list<TString>::iterator iterator = paths.begin();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   248
            iterator != paths.end(); iterator++) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   249
        lpath = *iterator;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   250
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   251
        if (_wmkdir(lpath.data()) == 0) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   252
            result = true;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   253
        } else {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   254
            result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   255
            break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   256
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   257
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   258
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   259
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   260
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   261
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   262
void FilePath::ChangePermissions(TString FileName, bool ownerOnly) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   263
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   264
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   265
#include <algorithm>
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   266
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   267
FileAttributes::FileAttributes(const TString FileName, bool FollowLink) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   268
    FFileName = FileName;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   269
    FFollowLink = FollowLink;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   270
    ReadAttributes();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   271
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   272
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   273
bool FileAttributes::WriteAttributes() {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   274
    bool result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   275
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   276
    DWORD attributes = 0;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   277
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   278
    for (std::vector<FileAttribute>::const_iterator iterator =
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   279
            FAttributes.begin();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   280
        iterator != FAttributes.end(); iterator++) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   281
        switch (*iterator) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   282
            case faArchive: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   283
                attributes = attributes & FILE_ATTRIBUTE_ARCHIVE;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   284
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   285
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   286
            case faCompressed: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   287
                attributes = attributes & FILE_ATTRIBUTE_COMPRESSED;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   288
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   289
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   290
            case faDevice: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   291
                attributes = attributes & FILE_ATTRIBUTE_DEVICE;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   292
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   293
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   294
            case faDirectory: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   295
                attributes = attributes & FILE_ATTRIBUTE_DIRECTORY;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   296
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   297
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   298
            case faEncrypted: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   299
                attributes = attributes & FILE_ATTRIBUTE_ENCRYPTED;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   300
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   301
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   302
            case faHidden: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   303
                attributes = attributes & FILE_ATTRIBUTE_HIDDEN;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   304
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   305
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   306
            case faNormal: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   307
                attributes = attributes & FILE_ATTRIBUTE_NORMAL;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   308
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   309
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   310
            case faNotContentIndexed: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   311
                attributes = attributes & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   312
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   313
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   314
            case faOffline: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   315
                attributes = attributes & FILE_ATTRIBUTE_OFFLINE;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   316
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   317
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   318
            case faSystem: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   319
                attributes = attributes & FILE_ATTRIBUTE_SYSTEM;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   320
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   321
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   322
            case faSymbolicLink: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   323
                attributes = attributes & FILE_ATTRIBUTE_REPARSE_POINT;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   324
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   325
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   326
            case faSparceFile: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   327
                attributes = attributes & FILE_ATTRIBUTE_SPARSE_FILE;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   328
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   329
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   330
            case faReadOnly: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   331
                attributes = attributes & FILE_ATTRIBUTE_READONLY;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   332
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   333
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   334
            case faTemporary: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   335
                attributes = attributes & FILE_ATTRIBUTE_TEMPORARY;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   336
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   337
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   338
            case faVirtual: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   339
                attributes = attributes & FILE_ATTRIBUTE_VIRTUAL;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   340
                break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   341
            }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   342
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   343
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   344
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   345
    if (::SetFileAttributes(FFileName.data(), attributes) != 0) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   346
        result = true;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   347
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   348
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   349
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   350
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   351
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   352
#define S_ISRUSR(m)    (((m) & S_IRWXU) == S_IRUSR)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   353
#define S_ISWUSR(m)    (((m) & S_IRWXU) == S_IWUSR)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   354
#define S_ISXUSR(m)    (((m) & S_IRWXU) == S_IXUSR)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   355
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   356
#define S_ISRGRP(m)    (((m) & S_IRWXG) == S_IRGRP)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   357
#define S_ISWGRP(m)    (((m) & S_IRWXG) == S_IWGRP)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   358
#define S_ISXGRP(m)    (((m) & S_IRWXG) == S_IXGRP)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   359
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   360
#define S_ISROTH(m)    (((m) & S_IRWXO) == S_IROTH)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   361
#define S_ISWOTH(m)    (((m) & S_IRWXO) == S_IWOTH)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   362
#define S_ISXOTH(m)    (((m) & S_IRWXO) == S_IXOTH)
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   363
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   364
bool FileAttributes::ReadAttributes() {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   365
    bool result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   366
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   367
    DWORD attributes = ::GetFileAttributes(FFileName.data());
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   368
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   369
    if (attributes != INVALID_FILE_ATTRIBUTES) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   370
        result = true;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   371
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   372
        if (attributes | FILE_ATTRIBUTE_ARCHIVE) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   373
            FAttributes.push_back(faArchive);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   374
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   375
        if (attributes | FILE_ATTRIBUTE_COMPRESSED) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   376
            FAttributes.push_back(faCompressed);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   377
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   378
        if (attributes | FILE_ATTRIBUTE_DEVICE) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   379
            FAttributes.push_back(faDevice);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   380
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   381
        if (attributes | FILE_ATTRIBUTE_DIRECTORY) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   382
            FAttributes.push_back(faDirectory);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   383
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   384
        if (attributes | FILE_ATTRIBUTE_ENCRYPTED) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   385
            FAttributes.push_back(faEncrypted);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   386
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   387
        if (attributes | FILE_ATTRIBUTE_HIDDEN) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   388
            FAttributes.push_back(faHidden);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   389
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   390
        if (attributes | FILE_ATTRIBUTE_NORMAL) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   391
            FAttributes.push_back(faNormal);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   392
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   393
        if (attributes | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   394
            FAttributes.push_back(faNotContentIndexed);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   395
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   396
        if (attributes | FILE_ATTRIBUTE_SYSTEM) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   397
            FAttributes.push_back(faSystem);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   398
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   399
        if (attributes | FILE_ATTRIBUTE_OFFLINE) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   400
            FAttributes.push_back(faOffline);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   401
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   402
        if (attributes | FILE_ATTRIBUTE_REPARSE_POINT) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   403
            FAttributes.push_back(faSymbolicLink);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   404
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   405
        if (attributes | FILE_ATTRIBUTE_SPARSE_FILE) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   406
            FAttributes.push_back(faSparceFile);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   407
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   408
        if (attributes | FILE_ATTRIBUTE_READONLY ) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   409
            FAttributes.push_back(faReadOnly);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   410
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   411
        if (attributes | FILE_ATTRIBUTE_TEMPORARY) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   412
            FAttributes.push_back(faTemporary);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   413
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   414
        if (attributes | FILE_ATTRIBUTE_VIRTUAL) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   415
            FAttributes.push_back(faVirtual);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   416
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   417
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   418
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   419
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   420
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   421
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   422
bool FileAttributes::Valid(const FileAttribute Value) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   423
    bool result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   424
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   425
    switch (Value) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   426
        case faHidden:
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   427
        case faReadOnly: {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   428
            result = true;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   429
            break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   430
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   431
        default:
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   432
            break;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   433
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   434
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   435
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   436
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   437
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   438
void FileAttributes::Append(FileAttribute Value) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   439
    if (Valid(Value) == true) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   440
        FAttributes.push_back(Value);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   441
        WriteAttributes();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   442
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   443
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   444
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   445
bool FileAttributes::Contains(FileAttribute Value) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   446
    bool result = false;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   447
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   448
    std::vector<FileAttribute>::const_iterator iterator =
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   449
            std::find(FAttributes.begin(), FAttributes.end(), Value);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   450
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   451
    if (iterator != FAttributes.end()) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   452
        result = true;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   453
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   454
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   455
    return result;
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   456
}
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   457
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   458
void FileAttributes::Remove(FileAttribute Value) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   459
    if (Valid(Value) == true) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   460
        std::vector<FileAttribute>::iterator iterator =
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   461
            std::find(FAttributes.begin(), FAttributes.end(), Value);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   462
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   463
        if (iterator != FAttributes.end()) {
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   464
            FAttributes.erase(iterator);
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   465
            WriteAttributes();
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   466
        }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   467
    }
9d5fccd97421 8212091: Move jpackage native code under platform specific folders and files
herrick
parents:
diff changeset
   468
}