diff --git a/languages/qmljs/libs/CMakeLists.txt b/languages/qmljs/libs/CMakeLists.txt --- a/languages/qmljs/libs/CMakeLists.txt +++ b/languages/qmljs/libs/CMakeLists.txt @@ -47,6 +47,11 @@ qmljs/qmljsviewercontext.cpp ) +if (APPLE) + target_sources(kdevqtc-qmlsupport PRIVATE utils/fileutils_mac.mm) + target_link_libraries(kdevqtc-qmlsupport LINK_PRIVATE "-framework Foundation" ) +endif(APPLE) + set_target_properties(kdevqtc-qmlsupport PROPERTIES COMPILE_FLAGS "-DLANGUAGEUTILS_BUILD_DIR\ -DQTCREATOR_UTILS_LIB") target_link_libraries(kdevqtc-qmlsupport LINK_PRIVATE Qt5::Core diff --git a/languages/qmljs/libs/utils/autoreleasepool.h b/languages/qmljs/libs/utils/autoreleasepool.h new file mode 100644 --- /dev/null +++ b/languages/qmljs/libs/utils/autoreleasepool.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms and +** conditions see http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + + +#ifndef AUTORELEASEPOOL_H +#define AUTORELEASEPOOL_H + +#import + +namespace Utils { + +class AutoreleasePool +{ +public: + AutoreleasePool() { pool = [[NSAutoreleasePool alloc] init]; } + ~AutoreleasePool() { [pool release]; } +private: + NSAutoreleasePool *pool; +}; + +} // Utils + +#endif // AUTORELEASEPOOL_H + diff --git a/languages/qmljs/libs/utils/fileutils_mac.h b/languages/qmljs/libs/utils/fileutils_mac.h new file mode 100644 --- /dev/null +++ b/languages/qmljs/libs/utils/fileutils_mac.h @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms and +** conditions see http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + + +#ifndef FILEUTILS_MAC_H +#define FILEUTILS_MAC_H + +#include + +namespace Utils { +namespace Internal { + +QUrl filePathUrl(const QUrl &url); +QString normalizePathName(const QString &filePath); + +} // Internal +} // Utils + +#endif // FILEUTILS_MAC_H + diff --git a/languages/qmljs/libs/utils/fileutils_mac.mm b/languages/qmljs/libs/utils/fileutils_mac.mm new file mode 100644 --- /dev/null +++ b/languages/qmljs/libs/utils/fileutils_mac.mm @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms and +** conditions see http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "fileutils_mac.h" + +#include "autoreleasepool.h" +#include "qtcassert.h" + +#include +#include +#include + +#include + +namespace Utils { +namespace Internal { + +QUrl filePathUrl(const QUrl &url) +{ + Utils::AutoreleasePool pool; Q_UNUSED(pool) + QUrl ret = url; + NSURL *nsurl = url.toNSURL(); + if ([nsurl isFileReferenceURL]) + ret = QUrl::fromNSURL([nsurl filePathURL]); + return ret; +} + +QString normalizePathName(const QString &filePath) +{ + AutoreleasePool pool; Q_UNUSED(pool) + + // 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 + + // we cannot know the normalized name for relative paths + if (QFileInfo(filePath).isRelative()) + return filePath; + + QString result; + QString path = QDir::cleanPath(filePath); + // avoid empty paths and paths like "/../foo" or "/.." + if (path.isEmpty() || path.contains(QLatin1String("/../")) || path.endsWith(QLatin1String("/.."))) + return filePath; + + 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); + return result; +} + +} // Internal +} // Utils