diff --git a/CMakeLists.txt b/CMakeLists.txt index b4eb5793ac..ab66c6d5ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.2) if (USE_ANDROID_TOOLCHAIN) set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/android/android.toolchain.cmake") set(ANDROID_NATIVE_API_LEVEL 19) + set(ANDROID_TOOLCHAIN_NAME arm-linux-androideabi-clang3.5) + set(ANDROID_STL c++_static) endif () if (WIN32) @@ -64,7 +66,7 @@ if (WIN32) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /OPT:REF /OPT:ICF") else () set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -fno-strict-aliasing -Wno-unused-parameter") - if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb -Woverloaded-virtual -Wdouble-promotion") if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "5.1") # gcc 5.1 and on have suggest-override set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override") @@ -72,18 +74,23 @@ else () endif () endif(WIN32) -if ((NOT MSVC12) AND (NOT MSVC14)) - include(CheckCXXCompilerFlag) - CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) - CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) +if (NOT ANDROID) + if ((NOT MSVC12) AND (NOT MSVC14)) + include(CheckCXXCompilerFlag) + CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) + CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) - if (COMPILER_SUPPORTS_CXX11) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") - elseif(COMPILER_SUPPORTS_CXX0X) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") - else() - message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") - endif() + if (COMPILER_SUPPORTS_CXX11) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + elseif(COMPILER_SUPPORTS_CXX0X) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + else() + message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") + endif() + endif () +else () + # assume that the toolchain selected for android has C++11 support + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif () if (APPLE) diff --git a/cmake/android/android.toolchain.cmake b/cmake/android/android.toolchain.cmake index ffa26126a7..806cef6b18 100755 --- a/cmake/android/android.toolchain.cmake +++ b/cmake/android/android.toolchain.cmake @@ -154,6 +154,8 @@ # Implies -frtti -fno-exceptions. # Available for NDK r7b and newer. # Silently degrades to gnustl_static if not available. +# c++_static -> Use the LLVM libc++ runtime as a static library. +# c++_shared -> Use the LLVM libc++ runtime as a shared library. # # ANDROID_STL_FORCE_FEATURES=ON - turn rtti and exceptions support based on # chosen runtime. If disabled, then the user is responsible for settings @@ -833,7 +835,7 @@ set( ANDROID_STL_FORCE_FEATURES ON CACHE BOOL "automatically configure rtti and mark_as_advanced( ANDROID_STL ANDROID_STL_FORCE_FEATURES ) if( BUILD_WITH_ANDROID_NDK ) - if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared)$") + if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared|c\\+\\+_static|c\\+\\+_shared)$") message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\". The possible values are: none -> Do not configure the runtime. @@ -845,6 +847,8 @@ The possible values are: stlport_shared -> Use the STLport runtime as a shared library. gnustl_static -> (default) Use the GNU STL as a static library. gnustl_shared -> Use the GNU STL as a shared library. + c++_static -> Use the LLVM libc++ runtime as a static library. + c++_shared -> Use the LLVM libc++ runtime as a shared library. " ) endif() elseif( BUILD_WITH_STANDALONE_TOOLCHAIN ) @@ -1026,6 +1030,34 @@ if( BUILD_WITH_ANDROID_NDK ) else() set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" ) endif() + elseif( ANDROID_STL MATCHES "c\\+\\+_shared" OR ANDROID_STL MATCHES "c\\+\\+_static" ) + set( ANDROID_EXCEPTIONS ON ) + set( ANDROID_RTTI ON ) + set( ANDROID_CXX_ROOT "${ANDROID_NDK}/sources/cxx-stl/" ) + set( ANDROID_LLVM_ROOT "${ANDROID_CXX_ROOT}/llvm-libc++" ) + + if( X86 ) + set( ANDROID_ABI_INCLUDE_DIRS "${ANDROID_CXX_ROOT}/gabi++/include" ) + else() + set( ANDROID_ABI_INCLUDE_DIRS "${ANDROID_CXX_ROOT}/llvm-libc++abi/include" ) + endif() + + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_LLVM_ROOT}/libcxx/include" "${ANDROID_ABI_INCLUDE_DIRS}" ) + + # android support sfiles + include_directories ( SYSTEM ${ANDROID_NDK}/sources/android/support/include ) + + if(ANDROID_STL MATCHES "c\\+\\+_shared") + set ( LLVM_LIBRARY_NAME "libc++_shared.so") + else() + set ( LLVM_LIBRARY_NAME "libc++_static.a" ) + endif () + + if( EXISTS "${ANDROID_LLVM_ROOT}/libs/${ANDROID_NDK_ABI_NAME}/${LLVM_LIBRARY_NAME}" ) + set( __libstl "${ANDROID_LLVM_ROOT}/libs/${ANDROID_NDK_ABI_NAME}/${LLVM_LIBRARY_NAME}" ) + else() + message( FATAL_ERROR "Could not find libc++ library" ) + endif() else() message( FATAL_ERROR "Unknown runtime: ${ANDROID_STL}" ) endif() diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index d89514b7cd..2f4cbad26c 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -56,7 +56,7 @@ JSONCallbackParameters::JSONCallbackParameters(QObject* jsonCallbackReceiver, co updateReciever(updateReceiver), updateSlot(updateSlot) { - + } QJsonObject AccountManager::dataObjectFromResponse(QNetworkReply &requestReply) { @@ -85,7 +85,7 @@ AccountManager::AccountManager(UserAgentGetter userAgentGetter) : qRegisterMetaType<QNetworkAccessManager::Operation>("QNetworkAccessManager::Operation"); qRegisterMetaType<JSONCallbackParameters>("JSONCallbackParameters"); - + qRegisterMetaType<QHttpMultiPart*>("QHttpMultiPart*"); qRegisterMetaType<AccountManagerAuth::Type>(); @@ -143,7 +143,7 @@ void AccountManager::setAuthURL(const QUrl& authURL) { _authURL = authURL; qCDebug(networking) << "AccountManager URL for authenticated requests has been changed to" << qPrintable(_authURL.toString()); - + // check if there are existing access tokens to load from settings QFile accountsFile { accountFilePath() }; bool loadedMap = false; @@ -434,9 +434,9 @@ void AccountManager::removeAccountFromFile() { } bool AccountManager::hasValidAccessToken() { - + if (_accountInfo.getAccessToken().token.isEmpty() || _accountInfo.getAccessToken().isExpired()) { - + if (VERBOSE_HTTP_REQUEST_DEBUGGING) { qCDebug(networking) << "An access token is required for requests to" << qPrintable(_authURL.toString()); } @@ -468,7 +468,7 @@ void AccountManager::setAccessTokenForCurrentAuthURL(const QString& accessToken) } else if (!_accountInfo.getAccessToken().token.isEmpty()) { qCDebug(networking) << "Clearing AccountManager OAuth token."; } - + _accountInfo.setAccessToken(newOAuthToken); persistAccountToFile(); @@ -553,7 +553,7 @@ void AccountManager::requestAccessTokenFinished() { _accountInfo.setAccessTokenFromJSON(rootObject); emit loginComplete(rootURL); - + persistAccountToFile(); requestProfile(); @@ -576,7 +576,7 @@ void AccountManager::requestProfile() { QUrl profileURL = _authURL; profileURL.setPath("/api/v1/user/profile"); - + QNetworkRequest profileRequest(profileURL); profileRequest.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter()); profileRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, _accountInfo.getAccessToken().authorizationHeaderValue()); @@ -602,7 +602,7 @@ void AccountManager::requestProfileFinished() { // store the whole profile into the local settings persistAccountToFile(); - + } else { // TODO: error handling qCDebug(networking) << "Error in response for profile"; @@ -658,14 +658,14 @@ void AccountManager::generateNewKeypair(bool isUserKeypair, const QUuid& domainI connect(generateThread, &QThread::finished, generateThread, &QThread::deleteLater); keypairGenerator->moveToThread(generateThread); - + qCDebug(networking) << "Starting worker thread to generate 2048-bit RSA keypair."; generateThread->start(); } } void AccountManager::processGeneratedKeypair() { - + qCDebug(networking) << "Generated 2048-bit RSA keypair. Uploading public key now."; RSAKeypairGenerator* keypairGenerator = qobject_cast<RSAKeypairGenerator*>(sender()); @@ -716,7 +716,7 @@ void AccountManager::processGeneratedKeypair() { sendRequest(uploadPath, AccountManagerAuth::Optional, QNetworkAccessManager::PutOperation, callbackParameters, QByteArray(), requestMultiPart); - + keypairGenerator->deleteLater(); } else { qCWarning(networking) << "Expected processGeneratedKeypair to be called by a live RSAKeypairGenerator" diff --git a/libraries/networking/src/udt/PacketQueue.cpp b/libraries/networking/src/udt/PacketQueue.cpp index 3684e5ba07..bb20982ca4 100644 --- a/libraries/networking/src/udt/PacketQueue.cpp +++ b/libraries/networking/src/udt/PacketQueue.cpp @@ -32,25 +32,25 @@ PacketQueue::PacketPointer PacketQueue::takePacket() { if (isEmpty()) { return PacketPointer(); } - + // Find next non empty channel if (_channels[nextIndex()].empty()) { nextIndex(); } auto& channel = _channels[_currentIndex]; Q_ASSERT(!channel.empty()); - + // Take front packet auto packet = std::move(channel.front()); channel.pop_front(); - + // Remove now empty channel (Don't remove the main channel) if (channel.empty() && _currentIndex != 0) { channel.swap(_channels.back()); _channels.pop_back(); --_currentIndex; } - + return packet; } @@ -68,7 +68,7 @@ void PacketQueue::queuePacketList(PacketListPointer packetList) { if (packetList->isOrdered()) { packetList->preparePackets(getNextMessageNumber()); } - + LockGuard locker(_packetsLock); _channels.push_back(std::move(packetList->_packets)); }