2022-08-19 15:59:36 +02:00
|
|
|
// Copyright (C) 2016 The Qt Company Ltd.
|
2022-12-21 10:12:09 +01:00
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
2015-01-05 15:19:37 +01:00
|
|
|
|
2015-09-01 15:59:27 +02:00
|
|
|
#include "fileutils_mac.h"
|
|
|
|
|
|
|
|
|
|
#include "qtcassert.h"
|
2015-03-26 12:28:50 +01:00
|
|
|
|
2015-09-01 15:59:27 +02:00
|
|
|
#include <QDir>
|
|
|
|
|
#include <QFileInfo>
|
2015-01-05 15:19:37 +01:00
|
|
|
#include <QUrl>
|
|
|
|
|
|
|
|
|
|
#include <Foundation/NSURL.h>
|
|
|
|
|
|
|
|
|
|
namespace Utils {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
2015-09-01 15:59:27 +02:00
|
|
|
QString normalizePathName(const QString &filePath)
|
|
|
|
|
{
|
2015-11-09 10:39:08 +01:00
|
|
|
QString result;
|
|
|
|
|
@autoreleasepool {
|
|
|
|
|
// NSURL getResourceValue returns values based on the cleaned path so we need to work on that.
|
|
|
|
|
// It also returns the disk name for "/" and "/.." and errors on "" and relative paths,
|
|
|
|
|
// so avoid that
|
2015-09-01 15:59:27 +02:00
|
|
|
|
2015-11-09 10:39:08 +01:00
|
|
|
// we cannot know the normalized name for relative paths
|
|
|
|
|
if (QFileInfo(filePath).isRelative())
|
|
|
|
|
return filePath;
|
2015-09-01 15:59:27 +02:00
|
|
|
|
2015-11-09 10:39:08 +01:00
|
|
|
QString path = QDir::cleanPath(filePath);
|
|
|
|
|
// avoid empty paths and paths like "/../foo" or "/.."
|
|
|
|
|
if (path.isEmpty() || path.contains(QLatin1String("/../")) || path.endsWith(QLatin1String("/..")))
|
|
|
|
|
return filePath;
|
2015-09-01 15:59:27 +02:00
|
|
|
|
2015-11-09 10:39:08 +01:00
|
|
|
while (path != QLatin1String("/") /*be defensive->*/&& path != QLatin1String(".") && !path.isEmpty()) {
|
|
|
|
|
QFileInfo info(path);
|
|
|
|
|
NSURL *nsurl = [NSURL fileURLWithPath:path.toNSString()];
|
|
|
|
|
NSString *out;
|
|
|
|
|
QString component;
|
|
|
|
|
if ([nsurl getResourceValue:(NSString **)&out forKey:NSURLNameKey error:nil])
|
|
|
|
|
component = QString::fromNSString(out);
|
|
|
|
|
else // e.g. if the full path does not exist
|
|
|
|
|
component = info.fileName();
|
|
|
|
|
result.prepend(QLatin1Char('/') + component);
|
|
|
|
|
path = info.path();
|
|
|
|
|
}
|
|
|
|
|
QTC_ASSERT(path == QLatin1String("/"), return filePath);
|
2015-09-01 15:59:27 +02:00
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-05 15:19:37 +01:00
|
|
|
} // Internal
|
|
|
|
|
} // Utils
|