[112811] trunk/dports/aqua/qt4-mac

michaelld at macports.org michaelld at macports.org
Fri Nov 1 13:58:27 PDT 2013


Revision: 112811
          https://trac.macports.org/changeset/112811
Author:   michaelld at macports.org
Date:     2013-11-01 13:58:27 -0700 (Fri, 01 Nov 2013)
Log Message:
-----------
qt4-mac:
* patch to provide support for OSX 10.9 Mavericks;
* should address ticket #40852.

Modified Paths:
--------------
    trunk/dports/aqua/qt4-mac/Portfile
    trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_QtWebKit.pro.diff
    trunk/dports/aqua/qt4-mac/files/patch-src_plugins_bearer_corewlan_qcorewlanengine.mm.diff

Added Paths:
-----------
    trunk/dports/aqua/qt4-mac/files/libWebKitSystemInterfaceMavericks.a
    trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_clucene_src_CLucene_search_FieldCacheImpl.cpp.diff
    trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.cpp.diff
    trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.h.diff
    trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_network_qt_QNetworkReplyHandler.cpp.diff
    trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_Api_qgraphicswebview.cpp.diff
    trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_WebCoreSupport_NotificationPresenterClientQt.cpp.diff
    trunk/dports/aqua/qt4-mac/files/patch-src_corelib_global_qglobal.h.diff

Modified: trunk/dports/aqua/qt4-mac/Portfile
===================================================================
--- trunk/dports/aqua/qt4-mac/Portfile	2013-11-01 20:41:01 UTC (rev 112810)
+++ trunk/dports/aqua/qt4-mac/Portfile	2013-11-01 20:58:27 UTC (rev 112811)
@@ -171,7 +171,10 @@
 
 patchfiles-append   patch-src_plugins_bearer_corewlan_corewlan.pro.diff
 
-# (15) fix the corewlan source to work under 10.7
+# (15) fix the corewlan source to work: this patch create a new
+# (primary) file qcorewlanengine.mm for 10.7 and newer APIs and a
+# secondary one qcorewlanengine_10_6.mm for 10.6 and older APIs.  The
+# primary file internally selects which one to use.
 
 patchfiles-append   patch-src_plugins_bearer_corewlan_qcorewlanengine.mm.diff
 
@@ -223,10 +226,12 @@
 patchfiles-append   \
     patch-src_3rdparty_webkit_Source_WebCore_WebCore.pro.diff
 
-# (22) Under 10.8 only: Patch to fix corelib linking
+# (22) Under 10.8 and 10.9: Patch to fix corelib linking
 
-platform darwin 12 {
-    patchfiles-append patch-src_corelib_corelib.pro.diff
+platform darwin {
+    if {${os.major} > 12} {
+        patchfiles-append patch-src_corelib_corelib.pro.diff
+    }
 }
 
 # (23) fix Framework directory in MacDeployQt tool
@@ -239,14 +244,28 @@
 patchfiles-append   \
     patch-libc++.diff
 
-# TODO: More patches to fix Mavericks build
+# (25) Fix CLuscene to build under 10.9 CLang
+# (26) Fix qglobals.h to build under 10.9 CLang
+# (27 a-e) Fix WebKit to build under 10.9 CLang
+
+platform darwin 13 {
+    patchfiles-append   \
+        patch-src_3rdparty_clucene_src_CLucene_search_FieldCacheImpl.cpp.diff \
+        patch-src_corelib_global_qglobal.h.diff \
+        patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.h.diff \
+        patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.cpp.diff \
+        patch-src_3rdparty_webkit_Source_WebKit_qt_WebCoreSupport_NotificationPresenterClientQt.cpp.diff \
+        patch-src_3rdparty_webkit_Source_WebKit_qt_Api_qgraphicswebview.cpp.diff \
+        patch-src_3rdparty_webkit_Source_WebCore_platform_network_qt_QNetworkReplyHandler.cpp.diff
+}
+
 platform darwin {
-    if {${os.major} >= 13} {
+    if {${os.major} > 13} {
         # This project needs to be updated to build with clang++ against libc++
         depends_lib
         depends_run
         pre-fetch {
-            ui_error "$name does not build on OS X 10.9 Mavericks or later."
+            ui_error "$name does not build on OSX later than 10.9 'Mavericks'."
             error "unsupported platform"
         }
     }
@@ -388,6 +407,16 @@
     copy ${filespath}/library_path \
         ${worksrcpath}/config.tests/mac
 
+    platform darwin 13 {
+
+        # Copy new Version of webkits' lib for OSX 10.9 only.
+        # Attached by reference:
+        # https://codereview.qt-project.org/#change,69328
+        # http://trac.webkit.org/browser/trunk/WebKitLibraries/ChangeLog?rev=157771
+
+        copy ${filespath}/libWebKitSystemInterfaceMavericks.a \
+            ${worksrcpath}/src/3rdparty/webkit/WebKitLibraries
+    }
 }
 
 # Block various compilers:

Added: trunk/dports/aqua/qt4-mac/files/libWebKitSystemInterfaceMavericks.a
===================================================================
(Binary files differ)


Property changes on: trunk/dports/aqua/qt4-mac/files/libWebKitSystemInterfaceMavericks.a
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_clucene_src_CLucene_search_FieldCacheImpl.cpp.diff
===================================================================
--- trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_clucene_src_CLucene_search_FieldCacheImpl.cpp.diff	                        (rev 0)
+++ trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_clucene_src_CLucene_search_FieldCacheImpl.cpp.diff	2013-11-01 20:58:27 UTC (rev 112811)
@@ -0,0 +1,12 @@
+--- src/3rdparty/clucene/src/CLucene/search/FieldCacheImpl.cpp.orig	2013-06-07 07:16:58.000000000 +0200
++++ src/3rdparty/clucene/src/CLucene/search/FieldCacheImpl.cpp	2013-10-27 16:13:56.000000000 +0100
+@@ -11,6 +11,9 @@
+ CL_NS_USE(index)
+ CL_NS_DEF(search)
+ 
++
++using ::wcschr;
++
+ FieldCacheImpl::FieldCacheImpl():
+     cache(false,true){
+ }

Added: trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.cpp.diff
===================================================================
--- trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.cpp.diff	                        (rev 0)
+++ trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.cpp.diff	2013-11-01 20:58:27 UTC (rev 112811)
@@ -0,0 +1,261 @@
+--- src/3rdparty/webkit/Source/WebCore/platform/Timer.cpp.orig	2013-06-07 07:16:56.000000000 +0200
++++ src/3rdparty/webkit/Source/WebCore/platform/Timer.cpp	2013-10-29 21:44:54.000000000 +0100
+@@ -41,6 +41,8 @@
+ 
+ namespace WebCore {
+ 
++class TimerHeapReference;
++
+ // Timers are stored in a heap data structure, used to implement a priority queue.
+ // This allows us to efficiently determine which timer needs to fire the soonest.
+ // Then we set a single shared system timer to fire at that time.
+@@ -53,119 +55,147 @@
+     return threadGlobalData().threadTimers().timerHeap();
+ }
+ 
+-// Class to represent elements in the heap when calling the standard library heap algorithms.
+-// Maintains the m_heapIndex value in the timers themselves, which allows us to do efficient
+-// modification of the heap.
+-class TimerHeapElement {
+-public:
+-    explicit TimerHeapElement(int i)
+-        : m_index(i)
+-        , m_timer(timerHeap()[m_index])
+-    { 
+-        checkConsistency(); 
+-    }
+-
+-    TimerHeapElement(const TimerHeapElement&);
+-    TimerHeapElement& operator=(const TimerHeapElement&);
+-
+-    TimerBase* timer() const { return m_timer; }
+-
+-    void checkConsistency() const
+-    {
+-        ASSERT(m_index >= 0);
+-        ASSERT(m_index < static_cast<int>(timerHeap().size()));
+-    }
++// ----------------
+ 
++class TimerHeapPointer {
++public:
++    TimerHeapPointer(TimerBase** pointer) : m_pointer(pointer) { }
++    TimerHeapReference operator*() const;
++    TimerBase* operator->() const { return *m_pointer; }
+ private:
+-    TimerHeapElement();
++    TimerBase** m_pointer;
++};
+ 
+-    int m_index;
+-    TimerBase* m_timer;
++class TimerHeapReference {
++public:
++    TimerHeapReference(TimerBase*& reference) : m_reference(reference) { }
++    operator TimerBase*() const { return m_reference; }
++    TimerHeapPointer operator&() const { return &m_reference; }
++    TimerHeapReference& operator=(TimerBase*);
++    TimerHeapReference& operator=(TimerHeapReference);
++private:
++    TimerBase*& m_reference;
+ };
+ 
+-inline TimerHeapElement::TimerHeapElement(const TimerHeapElement& o)
+-    : m_index(-1), m_timer(o.timer())
++inline TimerHeapReference TimerHeapPointer::operator*() const
+ {
++    return *m_pointer;
+ }
+ 
+-inline TimerHeapElement& TimerHeapElement::operator=(const TimerHeapElement& o)
++inline TimerHeapReference& TimerHeapReference::operator=(TimerBase* timer)
+ {
+-    TimerBase* t = o.timer();
+-    m_timer = t;
+-    if (m_index != -1) {
+-        checkConsistency();
+-        timerHeap()[m_index] = t;
+-        t->m_heapIndex = m_index;
+-    }
++    m_reference = timer;
++    Vector<TimerBase*>& heap = timerHeap();
++    if (&m_reference >= heap.data() && &m_reference < heap.data() + heap.size())
++        timer->m_heapIndex = &m_reference - heap.data();
+     return *this;
+ }
+ 
+-inline bool operator<(const TimerHeapElement& a, const TimerHeapElement& b)
++inline TimerHeapReference& TimerHeapReference::operator=(TimerHeapReference b)
+ {
+-    // The comparisons below are "backwards" because the heap puts the largest 
+-    // element first and we want the lowest time to be the first one in the heap.
+-    double aFireTime = a.timer()->m_nextFireTime;
+-    double bFireTime = b.timer()->m_nextFireTime;
+-    if (bFireTime != aFireTime)
+-        return bFireTime < aFireTime;
++    TimerBase* timer = b;
++    return *this = timer;
++}
++
++inline void swap(TimerHeapReference a, TimerHeapReference b)
++{
++    TimerBase* timerA = a;
++    TimerBase* timerB = b;
+     
+-    // We need to look at the difference of the insertion orders instead of comparing the two 
+-    // outright in case of overflow. 
+-    unsigned difference = a.timer()->m_heapInsertionOrder - b.timer()->m_heapInsertionOrder;
+-    return difference < UINT_MAX / 2;
++    // Invoke the assignment operator, since that takes care of updating m_heapIndex.
++    a = timerB;
++    b = timerA;
+ }
+ 
+ // ----------------
+ 
+ // Class to represent iterators in the heap when calling the standard library heap algorithms.
+-// Returns TimerHeapElement for elements in the heap rather than the TimerBase pointers themselves.
+-class TimerHeapIterator : public iterator<random_access_iterator_tag, TimerHeapElement, int> {
++// Uses a custom pointer and reference type that update indices for pointers in the heap.
++class TimerHeapIterator : public iterator<random_access_iterator_tag, TimerBase*, ptrdiff_t, TimerHeapPointer, TimerHeapReference> {
+ public:
+-    TimerHeapIterator() : m_index(-1) { }
+-    TimerHeapIterator(int i) : m_index(i) { checkConsistency(); }
+-
+-    TimerHeapIterator& operator++() { checkConsistency(); ++m_index; checkConsistency(); return *this; }
+-    TimerHeapIterator operator++(int) { checkConsistency(); checkConsistency(1); return m_index++; }
+-
+-    TimerHeapIterator& operator--() { checkConsistency(); --m_index; checkConsistency(); return *this; }
+-    TimerHeapIterator operator--(int) { checkConsistency(); checkConsistency(-1); return m_index--; }
++    explicit TimerHeapIterator(TimerBase** pointer) : m_pointer(pointer) { checkConsistency(); }
++    
++    TimerHeapIterator& operator++() { checkConsistency(); ++m_pointer; checkConsistency(); return *this; }
++    TimerHeapIterator operator++(int) { checkConsistency(1); return TimerHeapIterator(m_pointer++); }
++    
++    TimerHeapIterator& operator--() { checkConsistency(); --m_pointer; checkConsistency(); return *this; }
++    TimerHeapIterator operator--(int) { checkConsistency(-1); return TimerHeapIterator(m_pointer--); }
++    
++    TimerHeapIterator& operator+=(ptrdiff_t i) { checkConsistency(); m_pointer += i; checkConsistency(); return *this; }
++    TimerHeapIterator& operator-=(ptrdiff_t i) { checkConsistency(); m_pointer -= i; checkConsistency(); return *this; }
++    
++    TimerHeapReference operator*() const { return TimerHeapReference(*m_pointer); }
++    TimerHeapReference operator[](ptrdiff_t i) const { return TimerHeapReference(m_pointer[i]); }
++    TimerBase* operator->() const { return *m_pointer; }
++    
++private:
++    void checkConsistency(ptrdiff_t offset = 0) const
++    {
++        ASSERT(m_pointer >= timerHeap().data());
++        ASSERT(m_pointer <= timerHeap().data() + timerHeap().size());
++        ASSERT_UNUSED(offset, m_pointer + offset >= timerHeap().data());
++        ASSERT_UNUSED(offset, m_pointer + offset <= timerHeap().data() + timerHeap().size());
++    }
++    
++    friend bool operator==(TimerHeapIterator, TimerHeapIterator);
++    friend bool operator!=(TimerHeapIterator, TimerHeapIterator);
++    friend bool operator<(TimerHeapIterator, TimerHeapIterator);
++    friend bool operator>(TimerHeapIterator, TimerHeapIterator);
++    friend bool operator<=(TimerHeapIterator, TimerHeapIterator);
++    friend bool operator>=(TimerHeapIterator, TimerHeapIterator);
++    
++    friend TimerHeapIterator operator+(TimerHeapIterator, size_t);
++    friend TimerHeapIterator operator+(size_t, TimerHeapIterator);
++    
++    friend TimerHeapIterator operator-(TimerHeapIterator, size_t);
++    friend ptrdiff_t operator-(TimerHeapIterator, TimerHeapIterator);
++    
++    TimerBase** m_pointer;
++};
+ 
+-    TimerHeapIterator& operator+=(int i) { checkConsistency(); m_index += i; checkConsistency(); return *this; }
+-    TimerHeapIterator& operator-=(int i) { checkConsistency(); m_index -= i; checkConsistency(); return *this; }
++inline bool operator==(TimerHeapIterator a, TimerHeapIterator b) { return a.m_pointer == b.m_pointer; }
++inline bool operator!=(TimerHeapIterator a, TimerHeapIterator b) { return a.m_pointer != b.m_pointer; }
++inline bool operator<(TimerHeapIterator a, TimerHeapIterator b) { return a.m_pointer < b.m_pointer; }
++inline bool operator>(TimerHeapIterator a, TimerHeapIterator b) { return a.m_pointer > b.m_pointer; }
++inline bool operator<=(TimerHeapIterator a, TimerHeapIterator b) { return a.m_pointer <= b.m_pointer; }
++inline bool operator>=(TimerHeapIterator a, TimerHeapIterator b) { return a.m_pointer >= b.m_pointer; }
+ 
+-    TimerHeapElement operator*() const { return TimerHeapElement(m_index); }
+-    TimerHeapElement operator[](int i) const { return TimerHeapElement(m_index + i); }
++inline TimerHeapIterator operator+(TimerHeapIterator a, size_t b) { return TimerHeapIterator(a.m_pointer + b); }
++inline TimerHeapIterator operator+(size_t a, TimerHeapIterator b) { return TimerHeapIterator(a + b.m_pointer); }
+ 
+-    int index() const { return m_index; }
++inline TimerHeapIterator operator-(TimerHeapIterator a, size_t b) { return TimerHeapIterator(a.m_pointer - b); }
++inline ptrdiff_t operator-(TimerHeapIterator a, TimerHeapIterator b) { return a.m_pointer - b.m_pointer; }
+ 
+-    void checkConsistency(int offset = 0) const
+-    {
+-        ASSERT_UNUSED(offset, m_index + offset >= 0);
+-        ASSERT_UNUSED(offset, m_index + offset <= static_cast<int>(timerHeap().size()));
+-    }
++// ----------------
+ 
+-private:
+-    int m_index;
++class TimerHeapLessThanFunction {
++public:
++    bool operator()(TimerBase*, TimerBase*) const;
+ };
+ 
+-inline bool operator==(TimerHeapIterator a, TimerHeapIterator b) { return a.index() == b.index(); }
+-inline bool operator!=(TimerHeapIterator a, TimerHeapIterator b) { return a.index() != b.index(); }
+-inline bool operator<(TimerHeapIterator a, TimerHeapIterator b) { return a.index() < b.index(); }
+-
+-inline TimerHeapIterator operator+(TimerHeapIterator a, int b) { return a.index() + b; }
+-inline TimerHeapIterator operator+(int a, TimerHeapIterator b) { return a + b.index(); }
+-
+-inline TimerHeapIterator operator-(TimerHeapIterator a, int b) { return a.index() - b; }
+-inline int operator-(TimerHeapIterator a, TimerHeapIterator b) { return a.index() - b.index(); }
++inline bool TimerHeapLessThanFunction::operator()(TimerBase* a, TimerBase* b) const
++{
++    // The comparisons below are "backwards" because the heap puts the largest
++    // element first and we want the lowest time to be the first one in the heap.
++    double aFireTime = a->m_nextFireTime;
++    double bFireTime = b->m_nextFireTime;
++    if (bFireTime != aFireTime)
++        return bFireTime < aFireTime;
++    
++    // We need to look at the difference of the insertion orders instead of comparing the two
++    // outright in case of overflow.
++    unsigned difference = a->m_heapInsertionOrder - b->m_heapInsertionOrder;
++    return difference < numeric_limits<unsigned>::max() / 2;
++}
+ 
+ // ----------------
+ 
+ TimerBase::TimerBase()
+-    : m_nextFireTime(0)
+-    , m_repeatInterval(0)
+-    , m_heapIndex(-1)
++: m_nextFireTime(0)
++, m_repeatInterval(0)
++, m_heapIndex(-1)
+ #ifndef NDEBUG
+-    , m_thread(currentThread())
++, m_thread(currentThread())
+ #endif
+ {
+ }
+@@ -225,7 +255,8 @@
+ {
+     ASSERT(m_nextFireTime != 0);
+     checkHeapIndex();
+-    push_heap(TimerHeapIterator(0), TimerHeapIterator(m_heapIndex + 1));
++    TimerBase** heapData = timerHeap().data();
++    push_heap(TimerHeapIterator(heapData), TimerHeapIterator(heapData + m_heapIndex + 1), TimerHeapLessThanFunction());
+     checkHeapIndex();
+ }
+ 
+@@ -274,7 +305,9 @@
+ {
+     ASSERT(this == timerHeap().first());
+     checkHeapIndex();
+-    pop_heap(TimerHeapIterator(0), TimerHeapIterator(timerHeap().size()));
++    Vector<TimerBase*>& heap = timerHeap();
++    TimerBase** heapData = heap.data();
++    pop_heap(TimerHeapIterator(heapData), TimerHeapIterator(heapData + heap.size()), TimerHeapLessThanFunction());
+     checkHeapIndex();
+     ASSERT(this == timerHeap().last());
+ }

Added: trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.h.diff
===================================================================
--- trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.h.diff	                        (rev 0)
+++ trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_Timer.h.diff	2013-11-01 20:58:27 UTC (rev 112811)
@@ -0,0 +1,14 @@
+--- src/3rdparty/webkit/Source/WebCore/platform/Timer.h.orig	2013-06-07 07:16:56.000000000 +0200
++++ src/3rdparty/webkit/Source/WebCore/platform/Timer.h	2013-10-29 21:47:03.000000000 +0100
+@@ -84,9 +84,9 @@
+     ThreadIdentifier m_thread;
+ #endif
+ 
+-    friend class TimerHeapElement;
+     friend class ThreadTimers;
+-    friend bool operator<(const TimerHeapElement&, const TimerHeapElement&);
++    friend class TimerHeapLessThanFunction;
++    friend class TimerHeapReference;
+ };
+ 
+ template <typename TimerFiredClass> class Timer : public TimerBase {

Added: trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_network_qt_QNetworkReplyHandler.cpp.diff
===================================================================
--- trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_network_qt_QNetworkReplyHandler.cpp.diff	                        (rev 0)
+++ trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebCore_platform_network_qt_QNetworkReplyHandler.cpp.diff	2013-11-01 20:58:27 UTC (rev 112811)
@@ -0,0 +1,82 @@
+--- src/3rdparty/webkit/Source/WebCore/platform/network/qt/QNetworkReplyHandler.orig	2013-06-07 07:16:56.000000000 +0200
++++ src/3rdparty/webkit/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp	2013-10-28 17:59:45.000000000 +0100
+@@ -234,8 +234,8 @@
+ 
+     resetConnections();
+     QNetworkReply* reply = m_reply;
+-    m_reply = 0;
+-    m_sniffer = 0;
++    m_reply = nullptr;
++    m_sniffer = nullptr;
+ 
+     reply->setParent(0);
+     return reply;
+@@ -300,7 +300,7 @@
+     Q_ASSERT(m_sniffer);
+ 
+     m_sniffedMIMEType = m_sniffer->mimeType();
+-    m_sniffer = 0;
++    m_sniffer = nullptr;
+ 
+     emitMetaDataChanged();
+ }
+@@ -392,7 +392,7 @@
+     else
+         m_method = QNetworkAccessManager::CustomOperation;
+ 
+-    QObject* originatingObject = 0;
++    QObject* originatingObject = nullptr;
+     if (m_resourceHandle->getInternal()->m_context)
+         originatingObject = m_resourceHandle->getInternal()->m_context->originatingObject();
+ 
+@@ -417,7 +417,7 @@
+         return 0;
+ 
+     QNetworkReply* reply = m_replyWrapper->release();
+-    m_replyWrapper = 0;
++    m_replyWrapper = nullptr;
+     return reply;
+ }
+ 
+@@ -440,12 +440,12 @@
+ 
+     ResourceHandleClient* client = m_resourceHandle->client();
+     if (!client) {
+-        m_replyWrapper = 0;
++        m_replyWrapper = nullptr;
+         return;
+     }
+ 
+     if (m_replyWrapper->wasRedirected()) {
+-        m_replyWrapper = 0;
++        m_replyWrapper = nullptr;
+         m_queue.push(&QNetworkReplyHandler::start);
+         return;
+     }
+@@ -465,7 +465,7 @@
+         }
+     }
+ 
+-    m_replyWrapper = 0;
++    m_replyWrapper = nullptr;
+ }
+ 
+ void QNetworkReplyHandler::sendResponseIfNeeded()
+@@ -539,7 +539,7 @@
+                             newUrl.toString(),
+                             QCoreApplication::translate("QWebPage", "Redirection limit reached"));
+         client->didFail(m_resourceHandle, error);
+-        m_replyWrapper = 0;
++        m_replyWrapper = nullptr;
+         return;
+     }
+ 
+@@ -562,7 +562,7 @@
+     if (wasAborted()) // Network error cancelled the request.
+         return;
+ 
+-    QObject* originatingObject = 0;
++    QObject* originatingObject = nullptr;
+     if (m_resourceHandle->getInternal()->m_context)
+         originatingObject = m_resourceHandle->getInternal()->m_context->originatingObject();
+ 

Added: trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_Api_qgraphicswebview.cpp.diff
===================================================================
--- trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_Api_qgraphicswebview.cpp.diff	                        (rev 0)
+++ trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_Api_qgraphicswebview.cpp.diff	2013-11-01 20:58:27 UTC (rev 112811)
@@ -0,0 +1,11 @@
+--- src/3rdparty/webkit/Source/WebKit/qt/Api/qgraphicswebview.cpp.orig	2013-06-07 07:16:58.000000000 +0200
++++ src/3rdparty/webkit/Source/WebKit/qt/Api/qgraphicswebview.cpp	2013-10-28 18:54:43.000000000 +0100
+@@ -471,7 +471,7 @@
+         return;
+ 
+     page->d->view.clear();
+-    page->d->client = 0;
++    page->d->client = nullptr;
+ 
+     // if the page was created by us, we own it and need to
+     // destroy it as well.

Modified: trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_QtWebKit.pro.diff
===================================================================
--- trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_QtWebKit.pro.diff	2013-11-01 20:41:01 UTC (rev 112810)
+++ trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_QtWebKit.pro.diff	2013-11-01 20:58:27 UTC (rev 112811)
@@ -1,5 +1,5 @@
---- src/3rdparty/webkit/Source/WebKit/qt/QtWebKit.pro.orig	2012-08-08 16:27:13.000000000 -0400
-+++ src/3rdparty/webkit/Source/WebKit/qt/QtWebKit.pro	2012-08-08 16:33:29.000000000 -0400
+--- src/3rdparty/webkit/Source/WebKit/qt/QtWebKit.pro.orig	2013-06-07 07:16:58.000000000 +0200
++++ src/3rdparty/webkit/Source/WebKit/qt/QtWebKit.pro	2013-10-30 10:10:17.000000000 +0100
 @@ -233,7 +233,7 @@
                         $$SOURCE_DIR/../WebKitLibraries/
  
@@ -9,7 +9,16 @@
              DEFINES+=NS_BUILD_32_LIKE_64
          }
  
-@@ -297,7 +297,7 @@
+@@ -255,6 +255,8 @@
+             LIBS += $$SOURCE_DIR/../WebKitLibraries/libWebKitSystemInterfaceLion.a
+         } else: equals(DARWIN_MAJOR_VERSION, "12") | contains(QMAKE_MAC_SDK, ".*MacOSX10.8.sdk") {
+             LIBS += $$SOURCE_DIR/../WebKitLibraries/libWebKitSystemInterfaceMountainLion.a
++        } else: equals(DARWIN_MAJOR_VERSION, "13") | contains(QMAKE_MAC_SDK, ".*MacOSX10.9.sdk") {
++            LIBS += $$SOURCE_DIR/../WebKitLibraries/libWebKitSystemInterfaceMavericks.a
+         }
+     }
+ }
+@@ -297,7 +299,7 @@
  
  !symbian-abld:!symbian-sbsv2 {
      modfile.files = $$moduleFile
@@ -18,7 +27,7 @@
  
      INSTALLS += modfile
  } else {
-@@ -305,7 +305,7 @@
+@@ -305,7 +307,7 @@
  
      inst_modfile.commands = $$QMAKE_COPY ${QMAKE_FILE_NAME} ${QMAKE_FILE_OUT}
      inst_modfile.input = moduleFile

Added: trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_WebCoreSupport_NotificationPresenterClientQt.cpp.diff
===================================================================
--- trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_WebCoreSupport_NotificationPresenterClientQt.cpp.diff	                        (rev 0)
+++ trunk/dports/aqua/qt4-mac/files/patch-src_3rdparty_webkit_Source_WebKit_qt_WebCoreSupport_NotificationPresenterClientQt.cpp.diff	2013-11-01 20:58:27 UTC (rev 112811)
@@ -0,0 +1,89 @@
+--- src/3rdparty/webkit/Source/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.cpp.orig	2013-06-07 07:16:58.000000000 +0200
++++ src/3rdparty/webkit/Source/WebKit/qt/WebCoreSupport/NotificationPresenterClientQt.cpp	2013-10-28 19:04:41.000000000 +0100
+@@ -54,7 +54,7 @@
+ 
+ bool NotificationPresenterClientQt::dumpNotification = false;
+ 
+-NotificationPresenterClientQt* s_notificationPresenter = 0;
++NotificationPresenterClientQt* s_notificationPresenter = nullptr;
+ 
+ NotificationPresenterClientQt* NotificationPresenterClientQt::notificationPresenter()
+ {
+@@ -73,9 +73,9 @@
+ #if ENABLE(NOTIFICATIONS)
+ 
+ #ifndef QT_NO_SYSTEMTRAYICON
+-    m_notificationIcon = 0;
++    m_notificationIcon = nullptr;
+ #endif
+-    m_presenter = 0;
++    m_presenter = nullptr;
+ #endif
+ }
+ 
+@@ -164,7 +164,7 @@
+ {
+     m_clientCount--;
+     if (!m_clientCount) {
+-        s_notificationPresenter = 0;
++        s_notificationPresenter = nullptr;
+         delete this;
+     }
+ }
+@@ -276,7 +276,7 @@
+         return;
+     NotificationsQueue::ConstIterator end = m_notifications.end();
+     NotificationsQueue::ConstIterator iter = m_notifications.begin();
+-    Notification* notification = 0;
++    Notification* notification = nullptr;
+     while (iter != end) {
+         notification = iter.key();
+         QString notificationTitle;
+@@ -300,7 +300,7 @@
+         iter++;
+     if (iter != end)
+         return iter.key();
+-    return 0;
++    return nullptr;
+ }
+ 
+ void NotificationPresenterClientQt::notificationObjectDestroyed(Notification* notification)
+@@ -388,7 +388,7 @@
+ 
+ void NotificationPresenterClientQt::removeReplacedNotificationFromQueue(Notification* notification)
+ {
+-    Notification* oldNotification = 0;
++    Notification* oldNotification = nullptr;
+     NotificationsQueue::Iterator end = m_notifications.end();
+     NotificationsQueue::Iterator iter = m_notifications.begin();
+ 
+@@ -437,13 +437,13 @@
+ QWebPage* NotificationPresenterClientQt::toPage(ScriptExecutionContext* context)
+ {
+     if (!context || context->isWorkerContext())
+-        return 0;
++        return nullptr;
+ 
+     Document* document = static_cast<Document*>(context);
+ 
+     Page* page = document->page();
+     if (!page || !page->mainFrame())
+-        return 0;
++        return nullptr;
+ 
+     return QWebFramePrivate::kit(page->mainFrame())->page();
+ }
+@@ -451,11 +451,11 @@
+ QWebFrame* NotificationPresenterClientQt::toFrame(ScriptExecutionContext* context)
+ {
+     if (!context || context->isWorkerContext())
+-        return 0;
++        return nullptr;
+ 
+     Document* document = static_cast<Document*>(context);
+     if (!document || !document->frame())
+-        return 0;
++        return nullptr;
+ 
+     return QWebFramePrivate::kit(document->frame());
+ }

Added: trunk/dports/aqua/qt4-mac/files/patch-src_corelib_global_qglobal.h.diff
===================================================================
--- trunk/dports/aqua/qt4-mac/files/patch-src_corelib_global_qglobal.h.diff	                        (rev 0)
+++ trunk/dports/aqua/qt4-mac/files/patch-src_corelib_global_qglobal.h.diff	2013-11-01 20:58:27 UTC (rev 112811)
@@ -0,0 +1,14 @@
+--- src/corelib/global/qglobal.h.orig	2013-06-07 07:16:52.000000000 +0200
++++ src/corelib/global/qglobal.h	2013-10-27 14:05:22.000000000 +0100
+@@ -327,7 +327,10 @@
+ #  if !defined(MAC_OS_X_VERSION_10_8)
+ #       define MAC_OS_X_VERSION_10_8 MAC_OS_X_VERSION_10_7 + 1
+ #  endif
+-#  if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_8)
++#  if !defined(MAC_OS_X_VERSION_10_9)
++#       define MAC_OS_X_VERSION_10_9 MAC_OS_X_VERSION_10_8 + 1
++#  endif
++#  if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_9)
+ #    warning "This version of Mac OS X is unsupported"
+ #  endif
+ #endif

Modified: trunk/dports/aqua/qt4-mac/files/patch-src_plugins_bearer_corewlan_qcorewlanengine.mm.diff
===================================================================
--- trunk/dports/aqua/qt4-mac/files/patch-src_plugins_bearer_corewlan_qcorewlanengine.mm.diff	2013-11-01 20:41:01 UTC (rev 112810)
+++ trunk/dports/aqua/qt4-mac/files/patch-src_plugins_bearer_corewlan_qcorewlanengine.mm.diff	2013-11-01 20:58:27 UTC (rev 112811)
@@ -1,13 +1,1382 @@
---- src/plugins/bearer/corewlan/qcorewlanengine.mm.orig	2011-08-04 16:33:29.000000000 +0200
-+++ src/plugins/bearer/corewlan/qcorewlanengine.mm	2011-08-04 16:34:21.000000000 +0200
-@@ -52,6 +52,10 @@
+--- src/plugins/bearer/corewlan/qcorewlanengine.mm
++++ src/plugins/bearer/corewlan/qcorewlanengine.mm
+@@ -52,29 +52,17 @@
  #include <QtCore/qdebug.h>
  
  #include <QDir>
-+#ifdef MAC_SDK_10_7
-+   #include <CoreWLAN/CoreWLANConstants.h>
-+   #include <CoreWLAN/CoreWLANTypes.h>
-+#endif 
- #include <CoreWLAN/CoreWLAN.h>
- #include <CoreWLAN/CWInterface.h>
- #include <CoreWLAN/CWNetwork.h>
+-#include <CoreWLAN/CoreWLAN.h>
+-#include <CoreWLAN/CWInterface.h>
+-#include <CoreWLAN/CWNetwork.h>
+-#include <CoreWLAN/CWNetwork.h>
+-#include <CoreWLAN/CW8021XProfile.h>
+-
+-#include <Foundation/NSEnumerator.h>
+-#include <Foundation/NSKeyValueObserving.h>
+-#include <Foundation/NSAutoreleasePool.h>
+-#include <Foundation/NSLock.h>
+-
+-#include <SystemConfiguration/SCNetworkConfiguration.h>
++
++extern "C" { // Otherwise it won't find CWKeychain* symbols at link time
++#import <CoreWLAN/CoreWLAN.h>
++}
++
+ #include "private/qcore_mac_p.h"
+ 
+ #include <net/if.h>
+ #include <ifaddrs.h>
+ 
+-inline QString qt_NSStringToQString(const NSString *nsstr)
+-{ return QCFString::toQString(reinterpret_cast<const CFStringRef>(nsstr)); }
+-
+-inline NSString *qt_QStringToNSString(const QString &qstr)
+-{ return [const_cast<NSString *>(reinterpret_cast<const NSString *>(QCFString::toCFStringRef(qstr))) autorelease]; }
+-
++#if __MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
+ 
+ @interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject
+ {
+@@ -86,6 +74,7 @@ inline NSString *qt_QStringToNSString(const QString &qstr)
+ - (void)notificationHandler;//:(NSNotification *)notification;
+ - (void)remove;
+ - (void)setEngine:(QCoreWlanEngine *)coreEngine;
++- (QCoreWlanEngine *)engine;
+ - (void)dealloc;
+ 
+ @property (assign) QCoreWlanEngine* engine;
+@@ -93,7 +82,6 @@ inline NSString *qt_QStringToNSString(const QString &qstr)
+ @end
+ 
+ @implementation QT_MANGLE_NAMESPACE(QNSListener)
+- at synthesize engine;
+ 
+ - (id) init
+ {
+@@ -101,7 +89,7 @@ inline NSString *qt_QStringToNSString(const QString &qstr)
+     NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+     notificationCenter = [NSNotificationCenter defaultCenter];
+     currentInterface = [CWInterface interfaceWithName:nil];
+-    [notificationCenter addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil];
++    [notificationCenter addObserver:self selector:@selector(notificationHandler:) name:CWPowerDidChangeNotification object:nil];
+     [locker unlock];
+     [autoreleasepool release];
+     return self;
+@@ -120,6 +108,11 @@ inline NSString *qt_QStringToNSString(const QString &qstr)
+     [locker unlock];
+ }
+ 
++-(QCoreWlanEngine *)engine
++{
++    return engine;
++}
++
+ -(void)remove
+ {
+     [locker lock];
+@@ -133,7 +126,7 @@ inline NSString *qt_QStringToNSString(const QString &qstr)
+ }
+ @end
+ 
+-QT_MANGLE_NAMESPACE(QNSListener) *listener = 0;
++static QT_MANGLE_NAMESPACE(QNSListener) *listener = 0;
+ 
+ QT_BEGIN_NAMESPACE
+ 
+@@ -170,36 +163,28 @@ void QScanThread::run()
+     NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+     QStringList found;
+     mutex.lock();
+-    CWInterface *currentInterface = [CWInterface interfaceWithName:qt_QStringToNSString(interfaceName)];
++    CWInterface *currentInterface = [CWInterface interfaceWithName: (NSString *)QCFString::toCFStringRef(interfaceName)];
+     mutex.unlock();
+ 
+-    if([currentInterface power]) {
++    if (currentInterface.powerOn) {
+         NSError *err = nil;
+-        NSDictionary *parametersDict =  [NSDictionary dictionaryWithObjectsAndKeys:
+-                                   [NSNumber numberWithBool:YES], kCWScanKeyMerge,
+-                                   [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType,
+-                                   [NSNumber numberWithInteger:100], kCWScanKeyRestTime, nil];
+ 
+-        NSArray* apArray = [currentInterface scanForNetworksWithParameters:parametersDict error:&err];
+-        CWNetwork *apNetwork;
++        NSSet* apSet = [currentInterface scanForNetworksWithName:nil error:&err];
+ 
+         if (!err) {
+-
+-            for(uint row=0; row < [apArray count]; row++ ) {
+-                apNetwork = [apArray objectAtIndex:row];
+-
+-                const QString networkSsid = qt_NSStringToQString([apNetwork ssid]);
++            for (CWNetwork *apNetwork in apSet) {
++                const QString networkSsid = QCFString::toQString(CFStringRef([apNetwork ssid]));
+                 const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
+                 found.append(id);
+ 
+                 QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
+                 bool known = isKnownSsid(networkSsid);
+-                if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
+-                    if( networkSsid == qt_NSStringToQString( [currentInterface ssid])) {
++                if (currentInterface.serviceActive) {
++                    if( networkSsid == QCFString::toQString(CFStringRef([currentInterface ssid]))) {
+                         state = QNetworkConfiguration::Active;
+                     }
+                 }
+-                if(state == QNetworkConfiguration::Undefined) {
++                if (state == QNetworkConfiguration::Undefined) {
+                     if(known) {
+                         state = QNetworkConfiguration::Discovered;
+                     } else {
+@@ -207,7 +192,7 @@ void QScanThread::run()
+                     }
+                 }
+                 QNetworkConfiguration::Purpose purpose = QNetworkConfiguration::UnknownPurpose;
+-                if([[apNetwork securityMode] intValue] == kCWSecurityModeOpen) {
++                if ([apNetwork supportsSecurity:kCWSecurityNone]) {
+                     purpose = QNetworkConfiguration::PublicPurpose;
+                 } else {
+                     purpose = QNetworkConfiguration::PrivatePurpose;
+@@ -237,8 +222,8 @@ void QScanThread::run()
+                 interfaceName = ij.value();
+             }
+ 
+-            if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
+-                if( networkSsid == qt_NSStringToQString([currentInterface ssid])) {
++            if (currentInterface.serviceActive) {
++                if( networkSsid == QCFString::toQString(CFStringRef([currentInterface ssid]))) {
+                     state = QNetworkConfiguration::Active;
+                 }
+             }
+@@ -300,14 +285,14 @@ void QScanThread::getUserConfigurations()
+     NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+     userProfiles.clear();
+ 
+-    NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
+-    for(uint row=0; row < [wifiInterfaces count]; row++ ) {
++    NSSet *wifiInterfaces = [CWInterface interfaceNames];
++    for (NSString *ifName in wifiInterfaces) {
+ 
+-        CWInterface *wifiInterface = [CWInterface interfaceWithName: [wifiInterfaces objectAtIndex:row]];
+-        if ( ![wifiInterface power] )
++        CWInterface *wifiInterface = [CWInterface interfaceWithName: ifName];
++        if (!wifiInterface.powerOn)
+             continue;
+ 
+-        NSString *nsInterfaceName = [wifiInterface name];
++        NSString *nsInterfaceName = wifiInterface.ssid;
+ // add user configured system networks
+         SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, (CFStringRef)@"Qt corewlan", nil, nil);
+         NSDictionary * airportPlist = (NSDictionary *)SCDynamicStoreCopyValue(dynRef, (CFStringRef)[NSString stringWithFormat:@"Setup:/Network/Interface/%@/AirPort", nsInterfaceName]);
+@@ -316,11 +301,11 @@ void QScanThread::getUserConfigurations()
+             NSDictionary *prefNetDict = [airportPlist objectForKey:@"PreferredNetworks"];
+ 
+             NSArray *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"];
+-            for(NSString *ssidkey in thisSsidarray) {
+-                QString thisSsid = qt_NSStringToQString(ssidkey);
++            for (NSString *ssidkey in thisSsidarray) {
++                QString thisSsid = QCFString::toQString(CFStringRef(ssidkey));
+                 if(!userProfiles.contains(thisSsid)) {
+                     QMap <QString,QString> map;
+-                    map.insert(thisSsid, qt_NSStringToQString(nsInterfaceName));
++                    map.insert(thisSsid, QCFString::toQString(CFStringRef(nsInterfaceName)));
+                     userProfiles.insert(thisSsid, map);
+                 }
+             }
+@@ -329,7 +314,7 @@ void QScanThread::getUserConfigurations()
+ 
+         // 802.1X user profiles
+         QString userProfilePath = QDir::homePath() + "/Library/Preferences/com.apple.eap.profiles.plist";
+-        NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile:qt_QStringToNSString(userProfilePath)] autorelease];
++        NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile: (NSString *)QCFString::toCFStringRef(userProfilePath)] autorelease];
+         if(eapDict != nil) {
+             NSString *profileStr= @"Profiles";
+             NSString *nameStr = @"UserDefinedName";
+@@ -348,15 +333,15 @@ void QScanThread::getUserConfigurations()
+                         QString ssid;
+                         for(int i = 0; i < dictSize; i++) {
+                             if([nameStr isEqualToString:keys[i]]) {
+-                                networkName = qt_NSStringToQString(objects[i]);
++                                networkName = QCFString::toQString(CFStringRef(objects[i]));
+                             }
+                             if([networkSsidStr isEqualToString:keys[i]]) {
+-                                ssid = qt_NSStringToQString(objects[i]);
++                                ssid = QCFString::toQString(CFStringRef(objects[i]));
+                             }
+                             if(!userProfiles.contains(networkName)
+                                 && !ssid.isEmpty()) {
+                                 QMap<QString,QString> map;
+-                                map.insert(ssid, qt_NSStringToQString(nsInterfaceName));
++                                map.insert(ssid, QCFString::toQString(CFStringRef(nsInterfaceName)));
+                                 userProfiles.insert(networkName, map);
+                             }
+                         }
+@@ -444,7 +429,7 @@ void QCoreWlanEngine::initialize()
+     QMutexLocker locker(&mutex);
+     NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+ 
+-    if([[CWInterface supportedInterfaces] count] > 0 && !listener) {
++    if ([[CWInterface interfaceNames] count] > 0 && !listener) {
+         listener = [[QT_MANGLE_NAMESPACE(QNSListener) alloc] init];
+         listener.engine = this;
+         hasWifi = true;
+@@ -479,141 +464,68 @@ void QCoreWlanEngine::connectToId(const QString &id)
+     QString interfaceString = getInterfaceFromId(id);
+ 
+     CWInterface *wifiInterface =
+-        [CWInterface interfaceWithName: qt_QStringToNSString(interfaceString)];
++        [CWInterface interfaceWithName: (NSString *)QCFString::toCFStringRef(interfaceString)];
+ 
+-    if ([wifiInterface power]) {
++    if (wifiInterface.powerOn) {
+         NSError *err = nil;
+-        NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:0];
+-
+         QString wantedSsid;
+-
+         QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+ 
+         const QString idHash = QString::number(qHash(QLatin1String("corewlan:") + ptr->name));
+         const QString idHash2 = QString::number(qHash(QLatin1String("corewlan:") + scanThread->getNetworkNameFromSsid(ptr->name)));
+ 
+-        bool using8021X = false;
+-        if (idHash2 != id) {
+-            NSArray *array = [CW8021XProfile allUser8021XProfiles];
+-
+-            for (NSUInteger i = 0; i < [array count]; ++i) {
+-                const QString networkNameHashCheck = QString::number(qHash(QLatin1String("corewlan:") + qt_NSStringToQString([[array objectAtIndex:i] userDefinedName])));
+-
+-                const QString ssidHash = QString::number(qHash(QLatin1String("corewlan:") + qt_NSStringToQString([[array objectAtIndex:i] ssid])));
+-
+-                if (id == networkNameHashCheck || id == ssidHash) {
+-                    const QString thisName = scanThread->getSsidFromNetworkName(id);
+-                    if (thisName.isEmpty())
+-                        wantedSsid = id;
+-                    else
+-                        wantedSsid = thisName;
+-
+-                    [params setValue: [array objectAtIndex:i] forKey:kCWAssocKey8021XProfile];
+-                    using8021X = true;
+-                    break;
+-                }
++        QString wantedNetwork;
++        QMapIterator<QString, QMap<QString, QString> > i(scanThread->userProfiles);
++        while (i.hasNext()) {
++            i.next();
++            wantedNetwork = i.key();
++            const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") + wantedNetwork));
++            if (id == networkNameHash) {
++                wantedSsid = scanThread->getSsidFromNetworkName(wantedNetwork);
++                break;
+             }
+         }
+ 
+-        if (!using8021X) {
+-            QString wantedNetwork;
+-            QMapIterator<QString, QMap<QString,QString> > i(scanThread->userProfiles);
+-            while (i.hasNext()) {
+-                i.next();
+-                wantedNetwork = i.key();
+-                const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") + wantedNetwork));
+-                if (id == networkNameHash) {
+-                    wantedSsid =  scanThread->getSsidFromNetworkName(wantedNetwork);
+-                    break;
+-                }
+-            }
+-        }
+-        NSDictionary *scanParameters = [NSDictionary dictionaryWithObjectsAndKeys:
+-                                        [NSNumber numberWithBool:YES], kCWScanKeyMerge,
+-                                        [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType,
+-                                        [NSNumber numberWithInteger:100], kCWScanKeyRestTime,
+-                                        qt_QStringToNSString(wantedSsid), kCWScanKeySSID,
+-                                        nil];
+-
+-        NSArray *scanArray = [wifiInterface scanForNetworksWithParameters:scanParameters error:&err];
++        NSSet *scanSet = [wifiInterface scanForNetworksWithName:(NSString *)QCFString::toCFStringRef(wantedSsid) error:&err];
+ 
+         if(!err) {
+-            for(uint row=0; row < [scanArray count]; row++ ) {
+-                CWNetwork *apNetwork = [scanArray objectAtIndex:row];
+-
+-                if(wantedSsid == qt_NSStringToQString([apNetwork ssid])) {
+-
+-                    if(!using8021X) {
+-                        SecKeychainAttribute attributes[3];
+-
+-                        NSString *account = [apNetwork ssid];
+-                        NSString *keyKind = @"AirPort network password";
+-                        NSString *keyName = account;
+-
+-                        attributes[0].tag = kSecAccountItemAttr;
+-                        attributes[0].data = (void *)[account UTF8String];
+-                        attributes[0].length = [account length];
+-
+-                        attributes[1].tag = kSecDescriptionItemAttr;
+-                        attributes[1].data = (void *)[keyKind UTF8String];
+-                        attributes[1].length = [keyKind length];
+-
+-                        attributes[2].tag = kSecLabelItemAttr;
+-                        attributes[2].data = (void *)[keyName UTF8String];
+-                        attributes[2].length = [keyName length];
+-
+-                        SecKeychainAttributeList attributeList = {3,attributes};
+-
+-                        SecKeychainSearchRef searchRef;
+-                        SecKeychainSearchCreateFromAttributes(NULL, kSecGenericPasswordItemClass, &attributeList, &searchRef);
+-
+-                        NSString *password = @"";
+-                        SecKeychainItemRef searchItem;
+-
+-                        if (SecKeychainSearchCopyNext(searchRef, &searchItem) == noErr) {
+-                            UInt32 realPasswordLength;
+-                            SecKeychainAttribute attributesW[8];
+-                            attributesW[0].tag = kSecAccountItemAttr;
+-                            SecKeychainAttributeList listW = {1,attributesW};
+-                            char *realPassword;
+-                            OSStatus status = SecKeychainItemCopyContent(searchItem, NULL, &listW, &realPasswordLength,(void **)&realPassword);
+-
+-                            if (status == noErr) {
+-                                if (realPassword != NULL) {
+-
+-                                    QByteArray pBuf;
+-                                    pBuf.resize(realPasswordLength);
+-                                    pBuf.prepend(realPassword);
+-                                    pBuf.insert(realPasswordLength,'\0');
+-
+-                                    password = [NSString stringWithUTF8String:pBuf];
+-                                }
+-                                SecKeychainItemFreeContent(&listW, realPassword);
+-                            }
+-
+-                            CFRelease(searchItem);
+-                        } else {
+-                            qDebug() << "SecKeychainSearchCopyNext error";
+-                        }
+-                        [params setValue: password forKey: kCWAssocKeyPassphrase];
+-                    } // end using8021X
+-
+-
+-                    bool result = [wifiInterface associateToNetwork: apNetwork parameters:[NSDictionary dictionaryWithDictionary:params] error:&err];
++            for (CWNetwork *apNetwork in scanSet) {
++                CFDataRef ssidData = (CFDataRef)[apNetwork ssidData];
++                bool result = false;
++
++                SecIdentityRef identity = 0;
++                // Check first whether we require IEEE 802.1X authentication for the wanted SSID
++                if (CWKeychainCopyEAPIdentity(ssidData, &identity) == errSecSuccess) {
++                    CFStringRef username = 0;
++                    CFStringRef password = 0;
++                    if (CWKeychainCopyEAPUsernameAndPassword(ssidData, &username, &password) == errSecSuccess) {
++                        result = [wifiInterface associateToEnterpriseNetwork:apNetwork
++                                    identity:identity username:(NSString *)username password:(NSString *)password
++                                    error:&err];
++                        CFRelease(username);
++                        CFRelease(password);
++                    }
++                    CFRelease(identity);
++                } else {
++                    CFStringRef password = 0;
++                    if (CWKeychainCopyPassword(ssidData, &password) == errSecSuccess) {
++                        result = [wifiInterface associateToNetwork:apNetwork password:(NSString *)password error:&err];
++                        CFRelease(password);
++                    }
++                }
+ 
+-                    if(!err) {
+-                        if(!result) {
+-                            emit connectionError(id, ConnectError);
+-                        } else {
+-                            return;
+-                        }
++                if (!err) {
++                    if (!result) {
++                        emit connectionError(id, ConnectError);
+                     } else {
+-                        qDebug() <<"associate ERROR"<<  qt_NSStringToQString([err localizedDescription ]);
++                        return;
+                     }
++                } else {
++                    qDebug() <<"associate ERROR"<<  QCFString::toQString(CFStringRef([err localizedDescription ]));
+                 }
+             } //end scan network
+         } else {
+-            qDebug() <<"scan ERROR"<<  qt_NSStringToQString([err localizedDescription ]);
++            qDebug() <<"scan ERROR"<<  QCFString::toQString(CFStringRef([err localizedDescription ]));
+         }
+         emit connectionError(id, InterfaceLookupError);
+     }
+@@ -631,10 +543,10 @@ void QCoreWlanEngine::disconnectFromId(const QString &id)
+     NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+ 
+     CWInterface *wifiInterface =
+-        [CWInterface interfaceWithName: qt_QStringToNSString(interfaceString)];
++        [CWInterface interfaceWithName: (NSString *)QCFString::toCFStringRef(interfaceString)];
+ 
+     [wifiInterface disassociate];
+-    if ([[wifiInterface interfaceState]intValue] != kCWInterfaceStateInactive) {
++    if (wifiInterface.serviceActive) {
+         locker.unlock();
+         emit connectionError(id, DisconnectionError);
+         locker.relock();
+@@ -654,9 +566,9 @@ void QCoreWlanEngine::doRequestUpdate()
+ 
+     NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+ 
+-    NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
+-    for (uint row = 0; row < [wifiInterfaces count]; ++row) {
+-            scanThread->interfaceName = qt_NSStringToQString([wifiInterfaces objectAtIndex:row]);
++    NSSet *wifiInterfaces = [CWInterface interfaceNames];
++    for (NSString *ifName in wifiInterfaces) {
++            scanThread->interfaceName = QCFString::toQString(CFStringRef(ifName));
+             scanThread->start();
+     }
+     locker.unlock();
+@@ -669,8 +581,8 @@ bool QCoreWlanEngine::isWifiReady(const QString &wifiDeviceName)
+     bool haswifi = false;
+     if(hasWifi) {
+         NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+-        CWInterface *defaultInterface = [CWInterface interfaceWithName: qt_QStringToNSString(wifiDeviceName)];
+-        if([defaultInterface power]) {
++        CWInterface *defaultInterface = [CWInterface interfaceWithName: (NSString *)QCFString::toCFStringRef(wifiDeviceName)];
++        if (defaultInterface.powerOn) {
+             haswifi = true;
+         }
+         [autoreleasepool release];
+@@ -898,7 +810,7 @@ quint64 QCoreWlanEngine::startTime(const QString &identifier)
+                 bool ok = false;
+                 for(int i = 0; i < dictSize; i++) {
+                     if([ssidStr isEqualToString:keys[i]]) {
+-                        const QString ident = QString::number(qHash(QLatin1String("corewlan:") + qt_NSStringToQString(objects[i])));
++                        const QString ident = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString(CFStringRef(objects[i]))));
+                         if(ident == identifier) {
+                             ok = true;
+                         }
+@@ -944,3 +856,7 @@ quint64 QCoreWlanEngine::getBytes(const QString &interfaceName, bool b)
+ }
+ 
+ QT_END_NAMESPACE
++
++#else // QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE
++#include "qcorewlanengine_10_6.mm"
++#endif
+diff --git a/src/plugins/bearer/corewlan/qcorewlanengine_10_6.mm b/src/plugins/bearer/corewlan/qcorewlanengine_10_6.mm
+new file mode 100644
+index 0000000..a3bf615
+--- /dev/null
++++ src/plugins/bearer/corewlan/qcorewlanengine_10_6.mm
+@@ -0,0 +1,916 @@
++/****************************************************************************
++**
++** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the plugins of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** 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 Digia.  For licensing terms and
++** conditions see http://qt.digia.com/licensing.  For further information
++** use the contact form at http://qt.digia.com/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 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file.  Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights.  These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file.  Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include <SystemConfiguration/SCNetworkConfiguration.h>
++
++ at interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject
++{
++    NSNotificationCenter *notificationCenter;
++    CWInterface *currentInterface;
++    QCoreWlanEngine *engine;
++    NSLock *locker;
++}
++- (void)notificationHandler;//:(NSNotification *)notification;
++- (void)remove;
++- (void)setEngine:(QCoreWlanEngine *)coreEngine;
++- (QCoreWlanEngine *)engine;
++- (void)dealloc;
++
++ at property (assign) QCoreWlanEngine* engine;
++
++ at end
++
++ at implementation QT_MANGLE_NAMESPACE(QNSListener)
++
++- (id) init
++{
++    [locker lock];
++    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
++    notificationCenter = [NSNotificationCenter defaultCenter];
++    currentInterface = [CWInterface interfaceWithName:nil];
++    [notificationCenter addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil];
++    [locker unlock];
++    [autoreleasepool release];
++    return self;
++}
++
++-(void)dealloc
++{
++    [super dealloc];
++}
++
++-(void)setEngine:(QCoreWlanEngine *)coreEngine
++{
++    [locker lock];
++    if(!engine)
++        engine = coreEngine;
++    [locker unlock];
++}
++
++-(QCoreWlanEngine *)engine
++{
++    return engine;
++}
++
++-(void)remove
++{
++    [locker lock];
++    [notificationCenter removeObserver:self];
++    [locker unlock];
++}
++
++- (void)notificationHandler//:(NSNotification *)notification
++{
++    engine->requestUpdate();
++}
++ at end
++
++static QT_MANGLE_NAMESPACE(QNSListener) *listener = 0;
++
++QT_BEGIN_NAMESPACE
++
++void networkChangeCallback(SCDynamicStoreRef/* store*/, CFArrayRef changedKeys, void *info)
++{
++    for ( long i = 0; i < CFArrayGetCount(changedKeys); i++) {
++
++        QString changed =  QCFString::toQString(CFStringRef((CFStringRef)CFArrayGetValueAtIndex(changedKeys, i)));
++        if( changed.contains("/Network/Global/IPv4")) {
++            QCoreWlanEngine* wlanEngine = static_cast<QCoreWlanEngine*>(info);
++            wlanEngine->requestUpdate();
++        }
++    }
++    return;
++}
++
++
++QScanThread::QScanThread(QObject *parent)
++    :QThread(parent)
++{
++}
++
++QScanThread::~QScanThread()
++{
++}
++
++void QScanThread::quit()
++{
++    wait();
++}
++
++void QScanThread::run()
++{
++    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
++    QStringList found;
++    mutex.lock();
++    CWInterface *currentInterface = [CWInterface interfaceWithName: (NSString *)QCFString::toCFStringRef(interfaceName)];
++    mutex.unlock();
++
++    if([currentInterface power]) {
++        NSError *err = nil;
++        NSDictionary *parametersDict =  [NSDictionary dictionaryWithObjectsAndKeys:
++                                   [NSNumber numberWithBool:YES], kCWScanKeyMerge,
++                                   [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType,
++                                   [NSNumber numberWithInteger:100], kCWScanKeyRestTime, nil];
++
++        NSArray* apArray = [currentInterface scanForNetworksWithParameters:parametersDict error:&err];
++        CWNetwork *apNetwork;
++
++        if (!err) {
++
++            for(uint row=0; row < [apArray count]; row++ ) {
++                apNetwork = [apArray objectAtIndex:row];
++
++                const QString networkSsid = QCFString::toQString(CFStringRef([apNetwork ssid]));
++                const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
++                found.append(id);
++
++                QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
++                bool known = isKnownSsid(networkSsid);
++                if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
++                    if( networkSsid == QCFString::toQString(CFStringRef([currentInterface ssid]))) {
++                        state = QNetworkConfiguration::Active;
++                    }
++                }
++                if(state == QNetworkConfiguration::Undefined) {
++                    if(known) {
++                        state = QNetworkConfiguration::Discovered;
++                    } else {
++                        state = QNetworkConfiguration::Undefined;
++                    }
++                }
++                QNetworkConfiguration::Purpose purpose = QNetworkConfiguration::UnknownPurpose;
++                if([[apNetwork securityMode] intValue] == kCWSecurityModeOpen) {
++                    purpose = QNetworkConfiguration::PublicPurpose;
++                } else {
++                    purpose = QNetworkConfiguration::PrivatePurpose;
++                }
++
++                found.append(foundNetwork(id, networkSsid, state, interfaceName, purpose));
++
++            }
++        }
++    }
++    // add known configurations that are not around.
++    QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
++    while (i.hasNext()) {
++        i.next();
++
++        QString networkName = i.key();
++        const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkName));
++
++        if(!found.contains(id)) {
++            QString networkSsid = getSsidFromNetworkName(networkName);
++            const QString ssidId = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
++            QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
++            QString interfaceName;
++            QMapIterator<QString, QString> ij(i.value());
++            while (ij.hasNext()) {
++                ij.next();
++                interfaceName = ij.value();
++            }
++
++            if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
++                if( networkSsid == QCFString::toQString(CFStringRef([currentInterface ssid]))) {
++                    state = QNetworkConfiguration::Active;
++                }
++            }
++            if(state == QNetworkConfiguration::Undefined) {
++                if( userProfiles.contains(networkName)
++                    && found.contains(ssidId)) {
++                    state = QNetworkConfiguration::Discovered;
++                }
++            }
++
++            if(state == QNetworkConfiguration::Undefined) {
++                state = QNetworkConfiguration::Defined;
++            }
++
++            found.append(foundNetwork(id, networkName, state, interfaceName, QNetworkConfiguration::UnknownPurpose));
++        }
++    }
++    emit networksChanged();
++    [autoreleasepool release];
++}
++
++QStringList QScanThread::foundNetwork(const QString &id, const QString &name, const QNetworkConfiguration::StateFlags state, const QString &interfaceName, const QNetworkConfiguration::Purpose purpose)
++{
++    QStringList found;
++    QMutexLocker locker(&mutex);
++        QNetworkConfigurationPrivate *ptr = new QNetworkConfigurationPrivate;
++
++        ptr->name = name;
++        ptr->isValid = true;
++        ptr->id = id;
++        ptr->state = state;
++        ptr->type = QNetworkConfiguration::InternetAccessPoint;
++        ptr->bearerType = QNetworkConfiguration::BearerWLAN;
++        ptr->purpose = purpose;
++
++        fetchedConfigurations.append( ptr);
++        configurationInterface.insert(ptr->id, interfaceName);
++
++        locker.unlock();
++        locker.relock();
++       found.append(id);
++    return found;
++}
++
++QList<QNetworkConfigurationPrivate *> QScanThread::getConfigurations()
++{
++    QMutexLocker locker(&mutex);
++
++    QList<QNetworkConfigurationPrivate *> foundConfigurations = fetchedConfigurations;
++    fetchedConfigurations.clear();
++
++    return foundConfigurations;
++}
++
++void QScanThread::getUserConfigurations()
++{
++    QMutexLocker locker(&mutex);
++
++    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
++    userProfiles.clear();
++
++    NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
++    for(uint row=0; row < [wifiInterfaces count]; row++ ) {
++
++        CWInterface *wifiInterface = [CWInterface interfaceWithName: [wifiInterfaces objectAtIndex:row]];
++        if ( ![wifiInterface power] )
++            continue;
++
++        NSString *nsInterfaceName = [wifiInterface name];
++// add user configured system networks
++        SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, (CFStringRef)@"Qt corewlan", nil, nil);
++        NSDictionary * airportPlist = (NSDictionary *)SCDynamicStoreCopyValue(dynRef, (CFStringRef)[NSString stringWithFormat:@"Setup:/Network/Interface/%@/AirPort", nsInterfaceName]);
++        CFRelease(dynRef);
++        if(airportPlist != nil) {
++            NSDictionary *prefNetDict = [airportPlist objectForKey:@"PreferredNetworks"];
++
++            NSArray *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"];
++            for(NSString *ssidkey in thisSsidarray) {
++                QString thisSsid = QCFString::toQString(CFStringRef(ssidkey));
++                if(!userProfiles.contains(thisSsid)) {
++                    QMap <QString,QString> map;
++                    map.insert(thisSsid, QCFString::toQString(CFStringRef(nsInterfaceName)));
++                    userProfiles.insert(thisSsid, map);
++                }
++            }
++            CFRelease(airportPlist);
++        }
++
++        // 802.1X user profiles
++        QString userProfilePath = QDir::homePath() + "/Library/Preferences/com.apple.eap.profiles.plist";
++        NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile: (NSString *)QCFString::toCFStringRef(userProfilePath)] autorelease];
++        if(eapDict != nil) {
++            NSString *profileStr= @"Profiles";
++            NSString *nameStr = @"UserDefinedName";
++            NSString *networkSsidStr = @"Wireless Network";
++            for (id profileKey in eapDict) {
++                if ([profileStr isEqualToString:profileKey]) {
++                    NSDictionary *itemDict = [eapDict objectForKey:profileKey];
++                    for (id itemKey in itemDict) {
++
++                        NSInteger dictSize = [itemKey count];
++                        id objects[dictSize];
++                        id keys[dictSize];
++
++                        [itemKey getObjects:objects andKeys:keys];
++                        QString networkName;
++                        QString ssid;
++                        for(int i = 0; i < dictSize; i++) {
++                            if([nameStr isEqualToString:keys[i]]) {
++                                networkName = QCFString::toQString(CFStringRef(objects[i]));
++                            }
++                            if([networkSsidStr isEqualToString:keys[i]]) {
++                                ssid = QCFString::toQString(CFStringRef(objects[i]));
++                            }
++                            if(!userProfiles.contains(networkName)
++                                && !ssid.isEmpty()) {
++                                QMap<QString,QString> map;
++                                map.insert(ssid, QCFString::toQString(CFStringRef(nsInterfaceName)));
++                                userProfiles.insert(networkName, map);
++                            }
++                        }
++                    }
++                }
++            }
++        }
++    }
++    [autoreleasepool release];
++}
++
++QString QScanThread::getSsidFromNetworkName(const QString &name)
++{
++    QMutexLocker locker(&mutex);
++
++    QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
++    while (i.hasNext()) {
++        i.next();
++        QMap<QString,QString> map = i.value();
++        QMapIterator<QString, QString> ij(i.value());
++         while (ij.hasNext()) {
++             ij.next();
++             const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") +i.key()));
++             if(name == i.key() || name == networkNameHash) {
++                 return ij.key();
++             }
++        }
++    }
++    return QString();
++}
++
++QString QScanThread::getNetworkNameFromSsid(const QString &ssid)
++{
++    QMutexLocker locker(&mutex);
++
++    QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
++    while (i.hasNext()) {
++        i.next();
++        QMap<QString,QString> map = i.value();
++        QMapIterator<QString, QString> ij(i.value());
++         while (ij.hasNext()) {
++             ij.next();
++             if(ij.key() == ssid) {
++                 return i.key();
++             }
++         }
++    }
++    return QString();
++}
++
++bool QScanThread::isKnownSsid(const QString &ssid)
++{
++    QMutexLocker locker(&mutex);
++
++    QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
++    while (i.hasNext()) {
++        i.next();
++        QMap<QString,QString> map = i.value();
++        if(map.keys().contains(ssid)) {
++            return true;
++        }
++    }
++    return false;
++}
++
++
++QCoreWlanEngine::QCoreWlanEngine(QObject *parent)
++:   QBearerEngineImpl(parent), scanThread(0)
++{
++    scanThread = new QScanThread(this);
++    connect(scanThread, SIGNAL(networksChanged()),
++            this, SLOT(networksChanged()));
++}
++
++QCoreWlanEngine::~QCoreWlanEngine()
++{
++    while (!foundConfigurations.isEmpty())
++        delete foundConfigurations.takeFirst();
++    [listener remove];
++    [listener release];
++}
++
++void QCoreWlanEngine::initialize()
++{
++    QMutexLocker locker(&mutex);
++    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
++
++    if([[CWInterface supportedInterfaces] count] > 0 && !listener) {
++        listener = [[QT_MANGLE_NAMESPACE(QNSListener) alloc] init];
++        listener.engine = this;
++        hasWifi = true;
++    } else {
++        hasWifi = false;
++    }
++    storeSession = NULL;
++
++    startNetworkChangeLoop();
++    [autoreleasepool release];
++}
++
++
++QString QCoreWlanEngine::getInterfaceFromId(const QString &id)
++{
++    QMutexLocker locker(&mutex);
++
++    return scanThread->configurationInterface.value(id);
++}
++
++bool QCoreWlanEngine::hasIdentifier(const QString &id)
++{
++    QMutexLocker locker(&mutex);
++
++    return scanThread->configurationInterface.contains(id);
++}
++
++void QCoreWlanEngine::connectToId(const QString &id)
++{
++    QMutexLocker locker(&mutex);
++    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
++    QString interfaceString = getInterfaceFromId(id);
++
++    CWInterface *wifiInterface =
++        [CWInterface interfaceWithName: (NSString *)QCFString::toCFStringRef(interfaceString)];
++
++    if ([wifiInterface power]) {
++        NSError *err = nil;
++        NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:0];
++
++        QString wantedSsid;
++
++        QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
++
++        const QString idHash = QString::number(qHash(QLatin1String("corewlan:") + ptr->name));
++        const QString idHash2 = QString::number(qHash(QLatin1String("corewlan:") + scanThread->getNetworkNameFromSsid(ptr->name)));
++
++        bool using8021X = false;
++        if (idHash2 != id) {
++            NSArray *array = [CW8021XProfile allUser8021XProfiles];
++
++            for (NSUInteger i = 0; i < [array count]; ++i) {
++                const QString networkNameHashCheck = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString(CFStringRef([[array objectAtIndex:i] userDefinedName]))));
++
++                const QString ssidHash = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString(CFStringRef([[array objectAtIndex:i] ssid]))));
++
++                if (id == networkNameHashCheck || id == ssidHash) {
++                    const QString thisName = scanThread->getSsidFromNetworkName(id);
++                    if (thisName.isEmpty())
++                        wantedSsid = id;
++                    else
++                        wantedSsid = thisName;
++
++                    [params setValue: [array objectAtIndex:i] forKey:kCWAssocKey8021XProfile];
++                    using8021X = true;
++                    break;
++                }
++            }
++        }
++
++        if (!using8021X) {
++            QString wantedNetwork;
++            QMapIterator<QString, QMap<QString,QString> > i(scanThread->userProfiles);
++            while (i.hasNext()) {
++                i.next();
++                wantedNetwork = i.key();
++                const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") + wantedNetwork));
++                if (id == networkNameHash) {
++                    wantedSsid =  scanThread->getSsidFromNetworkName(wantedNetwork);
++                    break;
++                }
++            }
++        }
++        NSDictionary *scanParameters = [NSDictionary dictionaryWithObjectsAndKeys:
++                                        [NSNumber numberWithBool:YES], kCWScanKeyMerge,
++                                        [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType,
++                                        [NSNumber numberWithInteger:100], kCWScanKeyRestTime,
++                                        (NSString *)QCFString::toCFStringRef(wantedSsid), kCWScanKeySSID,
++                                        nil];
++
++        NSArray *scanArray = [wifiInterface scanForNetworksWithParameters:scanParameters error:&err];
++
++        if(!err) {
++            for(uint row=0; row < [scanArray count]; row++ ) {
++                CWNetwork *apNetwork = [scanArray objectAtIndex:row];
++
++                if(wantedSsid == QCFString::toQString(CFStringRef([apNetwork ssid]))) {
++
++                    if(!using8021X) {
++                        SecKeychainAttribute attributes[3];
++
++                        NSString *account = [apNetwork ssid];
++                        NSString *keyKind = @"AirPort network password";
++                        NSString *keyName = account;
++
++                        attributes[0].tag = kSecAccountItemAttr;
++                        attributes[0].data = (void *)[account UTF8String];
++                        attributes[0].length = [account length];
++
++                        attributes[1].tag = kSecDescriptionItemAttr;
++                        attributes[1].data = (void *)[keyKind UTF8String];
++                        attributes[1].length = [keyKind length];
++
++                        attributes[2].tag = kSecLabelItemAttr;
++                        attributes[2].data = (void *)[keyName UTF8String];
++                        attributes[2].length = [keyName length];
++
++                        SecKeychainAttributeList attributeList = {3,attributes};
++
++                        SecKeychainSearchRef searchRef;
++                        SecKeychainSearchCreateFromAttributes(NULL, kSecGenericPasswordItemClass, &attributeList, &searchRef);
++
++                        NSString *password = @"";
++                        SecKeychainItemRef searchItem;
++
++                        if (SecKeychainSearchCopyNext(searchRef, &searchItem) == noErr) {
++                            UInt32 realPasswordLength;
++                            SecKeychainAttribute attributesW[8];
++                            attributesW[0].tag = kSecAccountItemAttr;
++                            SecKeychainAttributeList listW = {1,attributesW};
++                            char *realPassword;
++                            OSStatus status = SecKeychainItemCopyContent(searchItem, NULL, &listW, &realPasswordLength,(void **)&realPassword);
++
++                            if (status == noErr) {
++                                if (realPassword != NULL) {
++
++                                    QByteArray pBuf;
++                                    pBuf.resize(realPasswordLength);
++                                    pBuf.prepend(realPassword);
++                                    pBuf.insert(realPasswordLength,'\0');
++
++                                    password = [NSString stringWithUTF8String:pBuf];
++                                }
++                                SecKeychainItemFreeContent(&listW, realPassword);
++                            }
++
++                            CFRelease(searchItem);
++                        } else {
++                            qDebug() << "SecKeychainSearchCopyNext error";
++                        }
++                        [params setValue: password forKey: kCWAssocKeyPassphrase];
++                    } // end using8021X
++
++
++                    bool result = [wifiInterface associateToNetwork: apNetwork parameters:[NSDictionary dictionaryWithDictionary:params] error:&err];
++
++                    if(!err) {
++                        if(!result) {
++                            emit connectionError(id, ConnectError);
++                        } else {
++                            return;
++                        }
++                    } else {
++                        qDebug() <<"associate ERROR"<<  QCFString::toQString(CFStringRef([err localizedDescription ]));
++                    }
++                }
++            } //end scan network
++        } else {
++            qDebug() <<"scan ERROR"<<  QCFString::toQString(CFStringRef([err localizedDescription ]));
++        }
++        emit connectionError(id, InterfaceLookupError);
++    }
++
++    locker.unlock();
++    emit connectionError(id, InterfaceLookupError);
++    [autoreleasepool release];
++}
++
++void QCoreWlanEngine::disconnectFromId(const QString &id)
++{
++    QMutexLocker locker(&mutex);
++
++    QString interfaceString = getInterfaceFromId(id);
++    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
++
++    CWInterface *wifiInterface =
++        [CWInterface interfaceWithName: (NSString *)QCFString::toCFStringRef(interfaceString)];
++
++    [wifiInterface disassociate];
++    if ([[wifiInterface interfaceState]intValue] != kCWInterfaceStateInactive) {
++        locker.unlock();
++        emit connectionError(id, DisconnectionError);
++        locker.relock();
++    }
++    [autoreleasepool release];
++}
++
++void QCoreWlanEngine::requestUpdate()
++{
++    scanThread->getUserConfigurations();
++    doRequestUpdate();
++}
++
++void QCoreWlanEngine::doRequestUpdate()
++{
++    QMutexLocker locker(&mutex);
++
++    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
++
++    NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
++    for (uint row = 0; row < [wifiInterfaces count]; ++row) {
++            scanThread->interfaceName = QCFString::toQString(CFStringRef([wifiInterfaces objectAtIndex:row]));
++            scanThread->start();
++    }
++    locker.unlock();
++    [autoreleasepool release];
++}
++
++bool QCoreWlanEngine::isWifiReady(const QString &wifiDeviceName)
++{
++    QMutexLocker locker(&mutex);
++    bool haswifi = false;
++    if(hasWifi) {
++        NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
++        CWInterface *defaultInterface = [CWInterface interfaceWithName: (NSString *)QCFString::toCFStringRef(wifiDeviceName)];
++        if([defaultInterface power]) {
++            haswifi = true;
++        }
++        [autoreleasepool release];
++    }
++    return haswifi;
++}
++
++
++QNetworkSession::State QCoreWlanEngine::sessionStateForId(const QString &id)
++{
++    QMutexLocker locker(&mutex);
++    QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
++
++    if (!ptr)
++        return QNetworkSession::Invalid;
++
++    if (!ptr->isValid) {
++        return QNetworkSession::Invalid;
++    } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
++        return QNetworkSession::Connected;
++    } else if ((ptr->state & QNetworkConfiguration::Discovered) ==
++                QNetworkConfiguration::Discovered) {
++        return QNetworkSession::Disconnected;
++    } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
++        return QNetworkSession::NotAvailable;
++    } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
++                QNetworkConfiguration::Undefined) {
++        return QNetworkSession::NotAvailable;
++    }
++
++    return QNetworkSession::Invalid;
++}
++
++QNetworkConfigurationManager::Capabilities QCoreWlanEngine::capabilities() const
++{
++    return QNetworkConfigurationManager::ForcedRoaming;
++}
++
++void QCoreWlanEngine::startNetworkChangeLoop()
++{
++
++    SCDynamicStoreContext dynStoreContext = { 0, this/*(void *)storeSession*/, NULL, NULL, NULL };
++    storeSession = SCDynamicStoreCreate(NULL,
++                                 CFSTR("networkChangeCallback"),
++                                 networkChangeCallback,
++                                 &dynStoreContext);
++    if (!storeSession ) {
++        qWarning() << "could not open dynamic store: error:" << SCErrorString(SCError());
++        return;
++    }
++
++    CFMutableArrayRef notificationKeys;
++    notificationKeys = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
++    CFMutableArrayRef patternsArray;
++    patternsArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
++
++    CFStringRef storeKey;
++    storeKey = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
++                                                     kSCDynamicStoreDomainState,
++                                                     kSCEntNetIPv4);
++    CFArrayAppendValue(notificationKeys, storeKey);
++    CFRelease(storeKey);
++
++    storeKey = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
++                                                      kSCDynamicStoreDomainState,
++                                                      kSCCompAnyRegex,
++                                                      kSCEntNetIPv4);
++    CFArrayAppendValue(patternsArray, storeKey);
++    CFRelease(storeKey);
++
++    if (!SCDynamicStoreSetNotificationKeys(storeSession , notificationKeys, patternsArray)) {
++        qWarning() << "register notification error:"<< SCErrorString(SCError());
++        CFRelease(storeSession );
++        CFRelease(notificationKeys);
++        CFRelease(patternsArray);
++        return;
++    }
++    CFRelease(notificationKeys);
++    CFRelease(patternsArray);
++
++    runloopSource = SCDynamicStoreCreateRunLoopSource(NULL, storeSession , 0);
++    if (!runloopSource) {
++        qWarning() << "runloop source error:"<< SCErrorString(SCError());
++        CFRelease(storeSession );
++        return;
++    }
++
++    CFRunLoopAddSource(CFRunLoopGetCurrent(), runloopSource, kCFRunLoopDefaultMode);
++    return;
++}
++
++QNetworkSessionPrivate *QCoreWlanEngine::createSessionBackend()
++{
++    return new QNetworkSessionPrivateImpl;
++}
++
++QNetworkConfigurationPrivatePointer QCoreWlanEngine::defaultConfiguration()
++{
++    return QNetworkConfigurationPrivatePointer();
++}
++
++bool QCoreWlanEngine::requiresPolling() const
++{
++    return true;
++}
++
++void QCoreWlanEngine::networksChanged()
++{
++    QMutexLocker locker(&mutex);
++
++    QStringList previous = accessPointConfigurations.keys();
++
++    QList<QNetworkConfigurationPrivate *> foundConfigurations = scanThread->getConfigurations();
++    while (!foundConfigurations.isEmpty()) {
++        QNetworkConfigurationPrivate *cpPriv = foundConfigurations.takeFirst();
++
++        previous.removeAll(cpPriv->id);
++
++        if (accessPointConfigurations.contains(cpPriv->id)) {
++            QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(cpPriv->id);
++
++            bool changed = false;
++
++            ptr->mutex.lock();
++
++            if (ptr->isValid != cpPriv->isValid) {
++                ptr->isValid = cpPriv->isValid;
++                changed = true;
++            }
++
++            if (ptr->name != cpPriv->name) {
++                ptr->name = cpPriv->name;
++                changed = true;
++            }
++
++            if (ptr->bearerType != cpPriv->bearerType) {
++                ptr->bearerType = cpPriv->bearerType;
++                changed = true;
++            }
++
++            if (ptr->state != cpPriv->state) {
++                ptr->state = cpPriv->state;
++                changed = true;
++            }
++
++            ptr->mutex.unlock();
++
++            if (changed) {
++                locker.unlock();
++                emit configurationChanged(ptr);
++                locker.relock();
++            }
++
++            delete cpPriv;
++        } else {
++            QNetworkConfigurationPrivatePointer ptr(cpPriv);
++
++            accessPointConfigurations.insert(ptr->id, ptr);
++
++            locker.unlock();
++            emit configurationAdded(ptr);
++            locker.relock();
++        }
++    }
++
++    while (!previous.isEmpty()) {
++        QNetworkConfigurationPrivatePointer ptr =
++            accessPointConfigurations.take(previous.takeFirst());
++
++        locker.unlock();
++        emit configurationRemoved(ptr);
++        locker.relock();
++    }
++
++    locker.unlock();
++    emit updateCompleted();
++
++}
++
++quint64 QCoreWlanEngine::bytesWritten(const QString &id)
++{
++    QMutexLocker locker(&mutex);
++    const QString interfaceStr = getInterfaceFromId(id);
++    return getBytes(interfaceStr,false);
++}
++
++quint64 QCoreWlanEngine::bytesReceived(const QString &id)
++{
++    QMutexLocker locker(&mutex);
++    const QString interfaceStr = getInterfaceFromId(id);
++    return getBytes(interfaceStr,true);
++}
++
++quint64 QCoreWlanEngine::startTime(const QString &identifier)
++{
++    QMutexLocker locker(&mutex);
++    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
++    quint64 timestamp = 0;
++
++    NSString *filePath = @"/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist";
++    NSDictionary* plistDict = [[[NSDictionary alloc] initWithContentsOfFile:filePath] autorelease];
++    if(plistDict == nil)
++        return timestamp;
++    NSString *input = @"KnownNetworks";
++    NSString *timeStampStr = @"_timeStamp";
++
++    NSString *ssidStr = @"SSID_STR";
++
++    for (id key in plistDict) {
++        if ([input isEqualToString:key]) {
++
++            NSDictionary *knownNetworksDict = [plistDict objectForKey:key];
++            if(knownNetworksDict == nil)
++                return timestamp;
++            for (id networkKey in knownNetworksDict) {
++                bool isFound = false;
++                NSDictionary *itemDict = [knownNetworksDict objectForKey:networkKey];
++                if(itemDict == nil)
++                    return timestamp;
++                NSInteger dictSize = [itemDict count];
++                id objects[dictSize];
++                id keys[dictSize];
++
++                [itemDict getObjects:objects andKeys:keys];
++                bool ok = false;
++                for(int i = 0; i < dictSize; i++) {
++                    if([ssidStr isEqualToString:keys[i]]) {
++                        const QString ident = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString(CFStringRef(objects[i]))));
++                        if(ident == identifier) {
++                            ok = true;
++                        }
++                    }
++                    if(ok && [timeStampStr isEqualToString:keys[i]]) {
++                        timestamp = (quint64)[objects[i] timeIntervalSince1970];
++                        isFound = true;
++                        break;
++                    }
++                }
++                if(isFound)
++                    break;
++            }
++        }
++    }
++    [autoreleasepool release];
++    return timestamp;
++}
++
++quint64 QCoreWlanEngine::getBytes(const QString &interfaceName, bool b)
++{
++    struct ifaddrs *ifAddressList, *ifAddress;
++    struct if_data *if_data;
++
++    quint64 bytes = 0;
++    ifAddressList = nil;
++    if(getifaddrs(&ifAddressList) == 0) {
++        for(ifAddress = ifAddressList; ifAddress; ifAddress = ifAddress->ifa_next) {
++            if(interfaceName == ifAddress->ifa_name) {
++                if_data = (struct if_data*)ifAddress->ifa_data;
++                if(b) {
++                    bytes = if_data->ifi_ibytes;
++                    break;
++                } else {
++                    bytes = if_data->ifi_obytes;
++                    break;
++                }
++            }
++        }
++        freeifaddrs(ifAddressList);
++    }
++    return bytes;
++}
++
++QT_END_NAMESPACE
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20131101/813fc6f0/attachment-0001.html>


More information about the macports-changes mailing list