summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@theqtcompany.com>2015-10-25 15:19:25 -0700
committerJake Petroules <jake.petroules@theqtcompany.com>2015-11-04 21:23:06 +0000
commitf7f55c0b294f03932b205f8eae4335928647f57b (patch)
tree24ab14cee0da980bed8c187ba09ed58613d5381e
parent59dbf1786f22ec4ac88d8f9d38cac5cfb82acaea (diff)
Add Objective-C specific type converters to QUuid.
This patch adds the Objective-C NSUUID/CFUUIDRef converters to QUuid [ChangeLog][QtCore][Objective-C] Added NSUUID/CFUUIDRef converters for QUuid Change-Id: Ifebf6fd5ce9f46dcdc06f221e189cb1fd9079e18 Reviewed-by: Jake Petroules <jake.petroules@theqtcompany.com>
-rw-r--r--src/corelib/plugin/plugin.pri4
-rw-r--r--src/corelib/plugin/quuid.cpp33
-rw-r--r--src/corelib/plugin/quuid.h15
-rw-r--r--src/corelib/plugin/quuid_darwin.mm69
-rw-r--r--tests/auto/corelib/plugin/quuid/test/test.pro5
-rw-r--r--tests/auto/corelib/plugin/quuid/tst_quuid.cpp12
-rw-r--r--tests/auto/corelib/plugin/quuid/tst_quuid_darwin.mm82
7 files changed, 220 insertions, 0 deletions
diff --git a/src/corelib/plugin/plugin.pri b/src/corelib/plugin/plugin.pri
index 8b64f93467..9dc60c5d39 100644
--- a/src/corelib/plugin/plugin.pri
+++ b/src/corelib/plugin/plugin.pri
@@ -35,4 +35,8 @@ integrity {
SOURCES += plugin/qlibrary_unix.cpp
}
+darwin {
+ OBJECTIVE_SOURCES += plugin/quuid_darwin.mm
+}
+
LIBS_PRIVATE += $$QMAKE_LIBS_DYNLOAD
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index 6698b140af..664d563f51 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -803,6 +803,39 @@ QUuid::Version QUuid::version() const Q_DECL_NOTHROW
return ver;
}
+/*! \fn QUuid QUuid::fromCFUUID(CFUUIDRef uuid)
+ \since 5.7
+
+ Constructs a new QUuid containing a copy of the \a uuid CFUUID.
+
+ \note this function is only available on Apple platforms.
+*/
+
+/*! \fn CFUUIDRef QUuid::toCFUUID() const
+ \since 5.7
+
+ Creates a CFUUID from a QUuid. The caller owns the CFUUID and is
+ responsible for releasing it.
+
+ \note this function is only available on Apple platforms.
+*/
+
+/*! \fn QUuid QUuid::fromNSUUID(const NSUUID *uuid)
+ \since 5.7
+
+ Constructs a new QUuid containing a copy of the \a uuid NSUUID.
+
+ \note this function is only available on Apple platforms.
+*/
+
+/*! \fn NSUUID QUuid::toNSUUID() const
+ \since 5.7
+
+ Creates a NSUUID from a QUuid. The NSUUID is autoreleased.
+
+ \note this function is only available on Apple platforms.
+*/
+
/*!
\fn bool QUuid::operator<(const QUuid &other) const
diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h
index f004cba77e..07cd9c4103 100644
--- a/src/corelib/plugin/quuid.h
+++ b/src/corelib/plugin/quuid.h
@@ -49,6 +49,12 @@ typedef struct _GUID
#endif
#endif
+#ifdef Q_OS_DARWIN
+Q_FORWARD_DECLARE_CF_TYPE(CFUUID);
+# ifdef __OBJC__
+Q_FORWARD_DECLARE_OBJC_CLASS(NSUUID);
+# endif
+#endif
QT_BEGIN_NAMESPACE
@@ -195,6 +201,15 @@ public:
QUuid::Variant variant() const Q_DECL_NOTHROW;
QUuid::Version version() const Q_DECL_NOTHROW;
+#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
+ static QUuid fromCFUUID(CFUUIDRef uuid);
+ CFUUIDRef toCFUUID() const Q_DECL_CF_RETURNS_RETAINED;
+# if defined(__OBJC__) || defined(Q_QDOC)
+ static QUuid fromNSUUID(const NSUUID *uuid);
+ NSUUID *toNSUUID() const Q_DECL_NS_RETURNS_AUTORELEASED;
+# endif
+#endif
+
uint data1;
ushort data2;
ushort data3;
diff --git a/src/corelib/plugin/quuid_darwin.mm b/src/corelib/plugin/quuid_darwin.mm
new file mode 100644
index 0000000000..b316b88d52
--- /dev/null
+++ b/src/corelib/plugin/quuid_darwin.mm
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** 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.
+**
+** 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.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "quuid.h"
+
+#import <Foundation/Foundation.h>
+
+QT_BEGIN_NAMESPACE
+
+QUuid QUuid::fromCFUUID(CFUUIDRef uuid)
+{
+ if (!uuid)
+ return QUuid();
+ const CFUUIDBytes bytes = CFUUIDGetUUIDBytes(uuid);
+ return QUuid::fromRfc4122(QByteArray::fromRawData(reinterpret_cast<const char *>(&bytes), sizeof(bytes)));
+}
+
+CFUUIDRef QUuid::toCFUUID() const
+{
+ const QByteArray bytes = toRfc4122();
+ return CFUUIDCreateFromUUIDBytes(0, *reinterpret_cast<const CFUUIDBytes *>(bytes.constData()));
+}
+
+QUuid QUuid::fromNSUUID(const NSUUID *uuid)
+{
+ if (!uuid)
+ return QUuid();
+ uuid_t bytes;
+ [uuid getUUIDBytes:bytes];
+ return QUuid::fromRfc4122(QByteArray::fromRawData(reinterpret_cast<const char *>(bytes), sizeof(bytes)));
+}
+
+NSUUID *QUuid::toNSUUID() const
+{
+ const QByteArray bytes = toRfc4122();
+ return [[[NSUUID alloc] initWithUUIDBytes:*reinterpret_cast<const uuid_t *>(bytes.constData())] autorelease];
+}
+
+QT_END_NAMESPACE
diff --git a/tests/auto/corelib/plugin/quuid/test/test.pro b/tests/auto/corelib/plugin/quuid/test/test.pro
index 0f6f915814..562bfbdc25 100644
--- a/tests/auto/corelib/plugin/quuid/test/test.pro
+++ b/tests/auto/corelib/plugin/quuid/test/test.pro
@@ -3,6 +3,11 @@ TARGET = tst_quuid
QT = core testlib
SOURCES = ../tst_quuid.cpp
+darwin {
+ OBJECTIVE_SOURCES = ../tst_quuid_darwin.mm
+ LIBS += -framework Foundation
+}
+
CONFIG(debug_and_release_target) {
CONFIG(debug, debug|release) {
DESTDIR = ../debug
diff --git a/tests/auto/corelib/plugin/quuid/tst_quuid.cpp b/tests/auto/corelib/plugin/quuid/tst_quuid.cpp
index e40f3416aa..ed549907d2 100644
--- a/tests/auto/corelib/plugin/quuid/tst_quuid.cpp
+++ b/tests/auto/corelib/plugin/quuid/tst_quuid.cpp
@@ -73,6 +73,8 @@ private slots:
void qvariant();
void qvariant_conversion();
+ void darwinTypes();
+
public:
// Variables
QUuid uuidNS;
@@ -406,5 +408,15 @@ void tst_QUuid::qvariant_conversion()
QCOMPARE(sv.value<QUuid>(), uuid);
}
+void tst_QUuid::darwinTypes()
+{
+#ifndef Q_OS_DARWIN
+ QSKIP("This is a Darwin-only test");
+#else
+ extern void tst_QUuid_darwinTypes(); // in tst_quuid_darwin.mm
+ tst_QUuid_darwinTypes();
+#endif
+}
+
QTEST_MAIN(tst_QUuid)
#include "tst_quuid.moc"
diff --git a/tests/auto/corelib/plugin/quuid/tst_quuid_darwin.mm b/tests/auto/corelib/plugin/quuid/tst_quuid_darwin.mm
new file mode 100644
index 0000000000..251250d4ce
--- /dev/null
+++ b/tests/auto/corelib/plugin/quuid/tst_quuid_darwin.mm
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** 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.
+**
+** 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.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QUuid>
+#include <QtTest/QtTest>
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <Foundation/Foundation.h>
+
+void tst_QUuid_darwinTypes()
+{
+ // QUuid <-> CFUUID
+ {
+ QUuid qtUuid(QByteArrayLiteral("0f7169cc-5711-4af9-99d9-fecb2329fdef"));
+ const CFUUIDRef cfuuid = qtUuid.toCFUUID();
+ QCOMPARE(QUuid::fromCFUUID(cfuuid), qtUuid);
+ CFStringRef cfstring = CFUUIDCreateString(0, cfuuid);
+ QCOMPARE(QString::fromCFString(cfstring), qtUuid.toString().mid(1, 36).toUpper());
+ CFRelease(cfstring);
+ CFRelease(cfuuid);
+ }
+ {
+ QUuid qtUuid(QByteArrayLiteral("0f7169cc-5711-4af9-99d9-fecb2329fdef"));
+ const CFUUIDRef cfuuid = qtUuid.toCFUUID();
+ QUuid qtUuidCopy(qtUuid);
+ qtUuid = QUuid(QByteArrayLiteral("93eec131-13c5-4d13-aaea-e456b4c57efa")); // modify
+ QCOMPARE(QUuid::fromCFUUID(cfuuid), qtUuidCopy);
+ CFStringRef cfstring = CFUUIDCreateString(0, cfuuid);
+ QCOMPARE(QString::fromCFString(cfstring), qtUuidCopy.toString().mid(1, 36).toUpper());
+ CFRelease(cfstring);
+ CFRelease(cfuuid);
+ }
+ // QUuid <-> NSUUID
+ {
+ QMacAutoReleasePool pool;
+
+ QUuid qtUuid(QByteArrayLiteral("0f7169cc-5711-4af9-99d9-fecb2329fdef"));
+ const NSUUID *nsuuid = qtUuid.toNSUUID();
+ QCOMPARE(QUuid::fromNSUUID(nsuuid), qtUuid);
+ QCOMPARE(QString::fromNSString([nsuuid UUIDString]), qtUuid.toString().mid(1, 36).toUpper());
+ }
+ {
+ QMacAutoReleasePool pool;
+
+ QUuid qtUuid(QByteArrayLiteral("0f7169cc-5711-4af9-99d9-fecb2329fdef"));
+ const NSUUID *nsuuid = qtUuid.toNSUUID();
+ QUuid qtUuidCopy(qtUuid);
+ qtUuid = QUuid(QByteArrayLiteral("93eec131-13c5-4d13-aaea-e456b4c57efa")); // modify
+ QCOMPARE(QUuid::fromNSUUID(nsuuid), qtUuidCopy);
+ QCOMPARE(QString::fromNSString([nsuuid UUIDString]), qtUuidCopy.toString().mid(1, 36).toUpper());
+ }
+}