From 59cd848eb369959dbb6d6d07dbb0cc50efedc477 Mon Sep 17 00:00:00 2001 From: KhalilBellakrid Date: Fri, 5 Oct 2018 17:48:06 -0400 Subject: [PATCH] Fix iOS: change runpaths so we dont need any action from user to run app on simulator or real device --- .circleci/build_lib.sh | 1 + .circleci/deploy_fat_lib.sh | 1 + CMakeLists.txt | 2 +- appveyor.yml | 2 +- core/src/CMakeLists.txt | 2 +- .../synchronization_P2SH_tests.cpp | 196 +++++++++--------- .../synchronization/synchronization_tests.cpp | 108 +++++----- qt-host/net/QtWebSocketClient.cpp | 66 +++--- qt-host/net/QtWebSocketClient.h | 6 +- tools/build_ios/install_name.sh | 11 +- tools/build_ios/ios_build.sh | 5 +- tools/generateBindingsRN.sh | 27 +-- 12 files changed, 197 insertions(+), 230 deletions(-) diff --git a/.circleci/build_lib.sh b/.circleci/build_lib.sh index 311ca21499..ab6bc1bf4a 100755 --- a/.circleci/build_lib.sh +++ b/.circleci/build_lib.sh @@ -48,6 +48,7 @@ function command_ios { cp `pwd`/../lib-ledger-core/tools/build_ios/framework.plist.in `pwd` cp `pwd`/../lib-ledger-core/tools/build_ios/install_name.sh `pwd` + BUILD_CONFIG="Release" add_to_cmake_params -G "Xcode" -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_TESTS=OFF -DCMAKE_OSX_ARCHITECTURES:STRING=${ARCH} -DCMAKE_MACOSX_BUNDLE:BOOL=ON -DCMAKE_OSX_SYSROOT:STRING=${OSX_SYSROOT} -DCMAKE_TOOLCHAIN_FILE=${POLLY_ROOT}/${TOOLCHAIN_NAME}.cmake } diff --git a/.circleci/deploy_fat_lib.sh b/.circleci/deploy_fat_lib.sh index f076456865..fb8a36007f 100644 --- a/.circleci/deploy_fat_lib.sh +++ b/.circleci/deploy_fat_lib.sh @@ -13,6 +13,7 @@ lipo -create armv7/ledger-core.framework/ledger-core arm64/ledger-core.framework mkdir ledger-core.framework mv ledger-core ledger-core.framework/ cp arm64/ledger-core.framework/Info.plist ledger-core.framework/ +install_name_tool -add_rpath "@executable_path/Frameworks/universal" ledger-core.framework/ledger-core lipo -info ledger-core.framework/ledger-core echo "======> Deploy from $branchstr branch, version : $LIB_VERSION" diff --git a/CMakeLists.txt b/CMakeLists.txt index 3670304c28..13e9837317 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ include(UseBackportedModules) # The project version number. set(VERSION_MAJOR 1 CACHE STRING "Project major version number.") set(VERSION_MINOR 1 CACHE STRING "Project minor version number.") -set(VERSION_PATCH 1 CACHE STRING "Project patch version number.") +set(VERSION_PATCH 2 CACHE STRING "Project patch version number.") mark_as_advanced(VERSION_MAJOR VERSION_MINOR VERSION_PATCH) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY build) diff --git a/appveyor.yml b/appveyor.yml index d9dcc77d6c..a668d1b4be 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,7 +5,7 @@ branches: image: - Visual Studio 2015 environment: - LIB_VERSION: 1.1.1 #Hardcode the LIB_VERSION : should be retrieved by building libcore node module and run tests/lib_version.js + LIB_VERSION: 1.1.2 #Hardcode the LIB_VERSION : should be retrieved by building libcore node module and run tests/lib_version.js nodejs_version: "9" appveyor_rdp_password: secure: jb1LsDmcxCww7tA38S3xSw== diff --git a/core/src/CMakeLists.txt b/core/src/CMakeLists.txt index 063988176c..40ca854e78 100644 --- a/core/src/CMakeLists.txt +++ b/core/src/CMakeLists.txt @@ -84,7 +84,7 @@ if(IS_IOS GREATER_EQUAL 0) add_custom_command( TARGET ledger-core POST_BUILD - COMMAND /bin/bash -c "${CMAKE_BINARY_DIR}/install_name.sh \${BUILT_PRODUCTS_DIR}/\${PRODUCT_NAME}.framework/\${PRODUCT_NAME}" + COMMAND /bin/bash -c "${CMAKE_BINARY_DIR}/install_name.sh \${BUILT_PRODUCTS_DIR}/\${PRODUCT_NAME}.framework/\${PRODUCT_NAME} ${CMAKE_OSX_ARCHITECTURES}" ) add_custom_command( TARGET ledger-core diff --git a/core/test/integration/synchronization/synchronization_P2SH_tests.cpp b/core/test/integration/synchronization/synchronization_P2SH_tests.cpp index 16b9954e30..1c8d1f6d45 100644 --- a/core/test/integration/synchronization/synchronization_P2SH_tests.cpp +++ b/core/test/integration/synchronization/synchronization_P2SH_tests.cpp @@ -35,105 +35,11 @@ #include #include #include + class BitcoinLikeWalletP2SHSynchronization : public BaseFixture { }; -TEST_F(BitcoinLikeWalletP2SHSynchronization, TestNetSynchronization) { - auto pool = newDefaultPool(); - { - auto configuration = DynamicObject::newInstance(); - configuration->putString(api::Configuration::KEYCHAIN_ENGINE,api::KeychainEngines::BIP49_P2SH); - configuration->putString(api::Configuration::KEYCHAIN_DERIVATION_SCHEME,"49'/'/'//
"); - auto wallet = wait(pool->createWallet("testnet_wallet", "bitcoin_testnet",configuration)); - std::set emittedOperations; - { - auto nextIndex = wait(wallet->getNextAccountIndex()); - auto info = wait(wallet->getNextExtendedKeyAccountCreationInfo()); - info.extendedKeys.push_back("tpubDCcvqEHx7prGddpWTfEviiew5YLMrrKy4oJbt14teJZenSi6AYMAs2SNXwYXFzkrNYwECSmobwxESxMCrpfqw4gsUt88bcr8iMrJmbb8P2q"); - EXPECT_EQ(nextIndex, 0); - auto account = createBitcoinLikeAccount(wallet, nextIndex, info); - auto receiver = make_receiver([&](const std::shared_ptr &event) { - if (event->getCode() == api::EventCode::NEW_OPERATION) { - auto uid = event->getPayload()->getString( - api::Account::EV_NEW_OP_UID).value(); - EXPECT_EQ(emittedOperations.find(uid), emittedOperations.end()); - } - }); - - pool->getEventBus()->subscribe(dispatcher->getMainExecutionContext(),receiver); - receiver.reset(); - receiver = make_receiver([=](const std::shared_ptr &event) { - fmt::print("Received event {}\n", api::to_string(event->getCode())); - if (event->getCode() == api::EventCode::SYNCHRONIZATION_STARTED) - return; - EXPECT_NE(event->getCode(), api::EventCode::SYNCHRONIZATION_FAILED); - dispatcher->stop(); - }); - - account->synchronize()->subscribe(dispatcher->getMainExecutionContext(),receiver); - dispatcher->waitUntilStopped(); - } - } -} - -TEST_F(BitcoinLikeWalletP2SHSynchronization, EraseDataSinceAfterSynchronization) { - auto pool = newDefaultPool(); - { - //Set configuration - auto configuration = DynamicObject::newInstance(); - configuration->putString(api::Configuration::KEYCHAIN_ENGINE, api::KeychainEngines::BIP49_P2SH); - configuration->putString(api::Configuration::KEYCHAIN_DERIVATION_SCHEME, - "49'/'/'//
"); - //Create wallet - auto wallet = wait(pool->createWallet("e847815f-488a-4301-b67c-378a5e9c8a63", "bitcoin_testnet", configuration)); - //Create account - auto account = createBitcoinLikeAccount(wallet, 0, P2SH_XPUB_INFO); - //Sync account - auto bus = account->synchronize(); - auto receiver = make_receiver([=](const std::shared_ptr &event) { - fmt::print("Received event {}\n", api::to_string(event->getCode())); - if (event->getCode() == api::EventCode::SYNCHRONIZATION_STARTED) - return; - - EXPECT_NE(event->getCode(), api::EventCode::SYNCHRONIZATION_FAILED); - dispatcher->stop(); - }); - bus->subscribe(dispatcher->getMainExecutionContext(),receiver); - dispatcher->waitUntilStopped(); - - auto accountCount = wait(wallet->getAccountCount()); - EXPECT_EQ(accountCount, 1); - auto accountFromWallet = wait(wallet->getAccount(0)); - EXPECT_EQ(account, accountFromWallet); - - auto date = "2000-03-27T09:10:22Z"; - auto formatedDate = DateUtils::fromJSON(date); - - //Delete account - auto code = wait(wallet->eraseDataSince(formatedDate)); - EXPECT_EQ(code, api::ErrorCode::FUTURE_WAS_SUCCESSFULL); - - //Check if account was successfully deleted - auto newAccountCount = wait(wallet->getAccountCount()); - EXPECT_EQ(newAccountCount, 0); - { - soci::session sql(pool->getDatabaseSessionPool()->getPool()); - BitcoinLikeAccountDatabaseEntry entry; - auto result = BitcoinLikeAccountDatabaseHelper::queryAccount(sql, account->getAccountUid(), entry); - EXPECT_EQ(result, false); - } - - //Delete wallet - auto walletCode = wait(pool->eraseDataSince(formatedDate)); - EXPECT_EQ(walletCode, api::ErrorCode::FUTURE_WAS_SUCCESSFULL); - - //Check if wallet was successfully deleted - auto walletCount = wait(pool->getWalletCount()); - EXPECT_EQ(walletCount, 0); - } -} - TEST_F(BitcoinLikeWalletP2SHSynchronization, MediumXpubSynchronization) { auto pool = newDefaultPool(); { @@ -251,15 +157,101 @@ TEST_F(BitcoinLikeWalletP2SHSynchronization, SynchronizeFromLastBlock) { }; auto b1 = synchronize(true); - /* - * TODO: Investigate later: this second synchro is OK for this test, - * but for some reason it is affecting following tests (in this case synchronization_tests.cpp) - * making them fail - */ - //auto b2 = synchronize(false); - //EXPECT_NE(b1, b2); + auto b2 = synchronize(false); + EXPECT_NE(b1, b2); } } +TEST_F(BitcoinLikeWalletP2SHSynchronization, EraseDataSinceAfterSynchronization) { + auto pool = newDefaultPool(); + { + //Set configuration + auto configuration = DynamicObject::newInstance(); + configuration->putString(api::Configuration::KEYCHAIN_ENGINE, api::KeychainEngines::BIP49_P2SH); + configuration->putString(api::Configuration::KEYCHAIN_DERIVATION_SCHEME, + "49'/'/'//
"); + //Create wallet + auto wallet = wait(pool->createWallet("e847815f-488a-4301-b67c-378a5e9c8a63", "bitcoin_testnet", configuration)); + //Create account + auto account = createBitcoinLikeAccount(wallet, 0, P2SH_XPUB_INFO); + //Sync account + auto bus = account->synchronize(); + auto receiver = make_receiver([=](const std::shared_ptr &event) { + fmt::print("Received event {}\n", api::to_string(event->getCode())); + if (event->getCode() == api::EventCode::SYNCHRONIZATION_STARTED) + return; + EXPECT_NE(event->getCode(), api::EventCode::SYNCHRONIZATION_FAILED); + dispatcher->stop(); + }); + bus->subscribe(dispatcher->getMainExecutionContext(),receiver); + dispatcher->waitUntilStopped(); + + auto accountCount = wait(wallet->getAccountCount()); + EXPECT_EQ(accountCount, 1); + auto accountFromWallet = wait(wallet->getAccount(0)); + EXPECT_EQ(account, accountFromWallet); + + auto date = "2000-03-27T09:10:22Z"; + auto formatedDate = DateUtils::fromJSON(date); + //Delete account + auto code = wait(wallet->eraseDataSince(formatedDate)); + EXPECT_EQ(code, api::ErrorCode::FUTURE_WAS_SUCCESSFULL); + + //Check if account was successfully deleted + auto newAccountCount = wait(wallet->getAccountCount()); + EXPECT_EQ(newAccountCount, 0); + { + soci::session sql(pool->getDatabaseSessionPool()->getPool()); + BitcoinLikeAccountDatabaseEntry entry; + auto result = BitcoinLikeAccountDatabaseHelper::queryAccount(sql, account->getAccountUid(), entry); + EXPECT_EQ(result, false); + } + + //Delete wallet + auto walletCode = wait(pool->eraseDataSince(formatedDate)); + EXPECT_EQ(walletCode, api::ErrorCode::FUTURE_WAS_SUCCESSFULL); + + //Check if wallet was successfully deleted + auto walletCount = wait(pool->getWalletCount()); + EXPECT_EQ(walletCount, 0); + } +} +TEST_F(BitcoinLikeWalletP2SHSynchronization, TestNetSynchronization) { + auto pool = newDefaultPool(); + { + auto configuration = DynamicObject::newInstance(); + configuration->putString(api::Configuration::KEYCHAIN_ENGINE,api::KeychainEngines::BIP49_P2SH); + configuration->putString(api::Configuration::KEYCHAIN_DERIVATION_SCHEME,"49'/'/'//
"); + auto wallet = wait(pool->createWallet("testnet_wallet", "bitcoin_testnet",configuration)); + std::set emittedOperations; + { + auto nextIndex = wait(wallet->getNextAccountIndex()); + auto info = wait(wallet->getNextExtendedKeyAccountCreationInfo()); + info.extendedKeys.push_back("tpubDCcvqEHx7prGddpWTfEviiew5YLMrrKy4oJbt14teJZenSi6AYMAs2SNXwYXFzkrNYwECSmobwxESxMCrpfqw4gsUt88bcr8iMrJmbb8P2q"); + EXPECT_EQ(nextIndex, 0); + auto account = createBitcoinLikeAccount(wallet, nextIndex, info); + auto receiver = make_receiver([&](const std::shared_ptr &event) { + if (event->getCode() == api::EventCode::NEW_OPERATION) { + auto uid = event->getPayload()->getString( + api::Account::EV_NEW_OP_UID).value(); + EXPECT_EQ(emittedOperations.find(uid), emittedOperations.end()); + } + }); + + pool->getEventBus()->subscribe(dispatcher->getMainExecutionContext(),receiver); + receiver.reset(); + receiver = make_receiver([=](const std::shared_ptr &event) { + fmt::print("Received event {}\n", api::to_string(event->getCode())); + if (event->getCode() == api::EventCode::SYNCHRONIZATION_STARTED) + return; + EXPECT_NE(event->getCode(), api::EventCode::SYNCHRONIZATION_FAILED); + dispatcher->stop(); + }); + + account->synchronize()->subscribe(dispatcher->getMainExecutionContext(),receiver); + dispatcher->waitUntilStopped(); + } + } +} \ No newline at end of file diff --git a/core/test/integration/synchronization/synchronization_tests.cpp b/core/test/integration/synchronization/synchronization_tests.cpp index c671a61c37..640661ee0d 100644 --- a/core/test/integration/synchronization/synchronization_tests.cpp +++ b/core/test/integration/synchronization/synchronization_tests.cpp @@ -37,56 +37,6 @@ class BitcoinLikeWalletSynchronization : public BaseFixture { }; -TEST_F(BitcoinLikeWalletSynchronization, TestNetSynchronization) { - auto pool = newDefaultPool(); - { - auto wallet = wait(pool->createWallet("e847815f-488a-4301-b67c-378a5e9c8a61", "bitcoin_testnet", - api::DynamicObject::newInstance())); - std::set emittedOperations; - { - auto nextIndex = wait(wallet->getNextAccountIndex()); - auto info = wait(wallet->getNextExtendedKeyAccountCreationInfo()); - info.extendedKeys.push_back("tpubDCJarhe7f951cUufTWeGKh1w6hDgdBcJfvQgyMczbxWvwvLdryxZuchuNK3KmTKXwBNH6Ze6tHGrUqvKGJd1VvSZUhTVx58DrLn9hR16DVr"); - EXPECT_EQ(nextIndex, 0); - auto account = createBitcoinLikeAccount(wallet, nextIndex, info); - - auto receiver = make_receiver([&](const std::shared_ptr &event) { - if (event->getCode() == api::EventCode::NEW_OPERATION) { - auto uid = event->getPayload()->getString( - api::Account::EV_NEW_OP_UID).value(); - EXPECT_EQ(emittedOperations.find(uid), emittedOperations.end()); - } - }); - - pool->getEventBus()->subscribe(dispatcher->getMainExecutionContext(),receiver); - - receiver.reset(); - receiver = make_receiver([=](const std::shared_ptr &event) { - fmt::print("Received event {}\n", api::to_string(event->getCode())); - if (event->getCode() == api::EventCode::SYNCHRONIZATION_STARTED) - return; - EXPECT_NE(event->getCode(), api::EventCode::SYNCHRONIZATION_FAILED); - //EXPECT_EQ(event->getCode(), - // api::EventCode::SYNCHRONIZATION_SUCCEED_ON_PREVIOUSLY_EMPTY_ACCOUNT); - auto amount = wait(account->getBalance()); - auto ops = wait(std::dynamic_pointer_cast(account->queryOperations()->complete())->execute()); - std::cout << "Amount: " << amount->toLong() << std::endl; - std::cout << "Ops: " << ops.size() << std::endl; - for (auto& op : ops) { - std::cout << "op: " << op->asBitcoinLikeOperation()->getTransaction()->getHash() << std::endl; - std::cout << " amount: " << op->getAmount()->toLong() << std::endl; - std::cout << " type: " << api::to_string(op->getOperationType()) << std::endl; - } - dispatcher->stop(); - }); - - account->synchronize()->subscribe(dispatcher->getMainExecutionContext(),receiver); - - dispatcher->waitUntilStopped(); - } - } -} - TEST_F(BitcoinLikeWalletSynchronization, MediumXpubSynchronization) { auto pool = newDefaultPool(); { @@ -190,13 +140,57 @@ TEST_F(BitcoinLikeWalletSynchronization, SynchronizeFromLastBlock) { return bus; }; auto b1 = synchronize(true); - /* - * TODO: Investigate later: this second synchro is OK for this test, - * but for some reason it is affecting following tests (in this case bitcoin_P2PKH_transaction_tests.cpp) - * making them fail - */ - //auto b2 = synchronize(false); - //EXPECT_NE(b1, b2); + auto b2 = synchronize(false); + EXPECT_NE(b1, b2); } } +TEST_F(BitcoinLikeWalletSynchronization, TestNetSynchronization) { + auto pool = newDefaultPool(); + { + auto wallet = wait(pool->createWallet("e847815f-488a-4301-b67c-378a5e9c8a61", "bitcoin_testnet", + api::DynamicObject::newInstance())); + std::set emittedOperations; + { + auto nextIndex = wait(wallet->getNextAccountIndex()); + auto info = wait(wallet->getNextExtendedKeyAccountCreationInfo()); + info.extendedKeys.push_back("tpubDCJarhe7f951cUufTWeGKh1w6hDgdBcJfvQgyMczbxWvwvLdryxZuchuNK3KmTKXwBNH6Ze6tHGrUqvKGJd1VvSZUhTVx58DrLn9hR16DVr"); + EXPECT_EQ(nextIndex, 0); + auto account = createBitcoinLikeAccount(wallet, nextIndex, info); + + auto receiver = make_receiver([&](const std::shared_ptr &event) { + if (event->getCode() == api::EventCode::NEW_OPERATION) { + auto uid = event->getPayload()->getString( + api::Account::EV_NEW_OP_UID).value(); + EXPECT_EQ(emittedOperations.find(uid), emittedOperations.end()); + } + }); + + pool->getEventBus()->subscribe(dispatcher->getMainExecutionContext(),receiver); + + receiver.reset(); + receiver = make_receiver([=](const std::shared_ptr &event) { + fmt::print("Received event {}\n", api::to_string(event->getCode())); + if (event->getCode() == api::EventCode::SYNCHRONIZATION_STARTED) + return; + EXPECT_NE(event->getCode(), api::EventCode::SYNCHRONIZATION_FAILED); + //EXPECT_EQ(event->getCode(), + // api::EventCode::SYNCHRONIZATION_SUCCEED_ON_PREVIOUSLY_EMPTY_ACCOUNT); + auto amount = wait(account->getBalance()); + auto ops = wait(std::dynamic_pointer_cast(account->queryOperations()->complete())->execute()); + std::cout << "Amount: " << amount->toLong() << std::endl; + std::cout << "Ops: " << ops.size() << std::endl; + for (auto& op : ops) { + std::cout << "op: " << op->asBitcoinLikeOperation()->getTransaction()->getHash() << std::endl; + std::cout << " amount: " << op->getAmount()->toLong() << std::endl; + std::cout << " type: " << api::to_string(op->getOperationType()) << std::endl; + } + dispatcher->stop(); + }); + + account->synchronize()->subscribe(dispatcher->getMainExecutionContext(),receiver); + + dispatcher->waitUntilStopped(); + } + } +} \ No newline at end of file diff --git a/qt-host/net/QtWebSocketClient.cpp b/qt-host/net/QtWebSocketClient.cpp index c47f76574b..15d0d17c91 100644 --- a/qt-host/net/QtWebSocketClient.cpp +++ b/qt-host/net/QtWebSocketClient.cpp @@ -49,12 +49,12 @@ namespace ledger { auto conn = std::make_shared(); conn->api = connection; _connections.push_back(conn); - QObject::connect(conn->socket.get(), &QWebSocket::connected, this, &QtWebSocketClient::onWebSocketConnected); - QObject::connect(conn->socket.get(), &QWebSocket::disconnected, this, &QtWebSocketClient::onWebSocketDisconnected); - QObject::connect(conn->socket.get(), &QWebSocket::textMessageReceived, this, &QtWebSocketClient::onMessageReceived); - QObject::connect(conn->socket.get(), SIGNAL(error(QAbstractSocket::SocketError)), + QObject::connect(&conn->socket, &QWebSocket::connected, this, &QtWebSocketClient::onWebSocketConnected); + QObject::connect(&conn->socket, &QWebSocket::disconnected, this, &QtWebSocketClient::onWebSocketDisconnected); + QObject::connect(&conn->socket, &QWebSocket::textMessageReceived, this, &QtWebSocketClient::onMessageReceived); + QObject::connect(&conn->socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); - conn->socket->open(QUrl(QString::fromStdString(url))); + conn->socket.open(QUrl(QString::fromStdString(url))); } } @@ -66,7 +66,7 @@ namespace ledger { } else if (conn->api->getConnectionId() == -1) { connection->onError(api::ErrorCode::ILLEGAL_STATE, "Connection is not ready"); } else { - conn->socket->sendTextMessage(QString::fromStdString(data)); + conn->socket.sendTextMessage(QString::fromStdString(data)); } } @@ -74,13 +74,13 @@ namespace ledger { void QtWebSocketClient::disconnect(const std::shared_ptr &connection) { auto conn = getConnection(connection); if (conn != nullptr && conn->api != nullptr) { - conn->socket->close(QWebSocketProtocol::CloseCode::CloseCodeNormal, "Disconnected by user"); + conn->socket.close(QWebSocketProtocol::CloseCode::CloseCodeNormal, "Disconnected by user"); } } std::shared_ptr QtWebSocketClient::getConnection(QObject *sender) const { for (auto& conn : _connections) { - if (static_cast(conn->socket.get()) == sender) + if (static_cast(&conn->socket) == sender) return conn; } return nullptr; @@ -101,10 +101,10 @@ namespace ledger { while (it != end) { auto conn = *it; if (conn.get() == connection) { - QObject::disconnect(conn->socket.get(), &QWebSocket::connected, this, &QtWebSocketClient::onWebSocketConnected); - QObject::disconnect(conn->socket.get(), &QWebSocket::disconnected, this, &QtWebSocketClient::onWebSocketDisconnected); - QObject::disconnect(conn->socket.get(), &QWebSocket::textMessageReceived, this, &QtWebSocketClient::onMessageReceived); - QObject::disconnect(conn->socket.get(), SIGNAL(error(QAbstractSocket::SocketError)), + QObject::disconnect(&conn->socket, &QWebSocket::connected, this, &QtWebSocketClient::onWebSocketConnected); + QObject::disconnect(&conn->socket, &QWebSocket::disconnected, this, &QtWebSocketClient::onWebSocketDisconnected); + QObject::disconnect(&conn->socket, &QWebSocket::textMessageReceived, this, &QtWebSocketClient::onMessageReceived); + QObject::disconnect(&conn->socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); _connections.erase(it); return true; @@ -141,55 +141,55 @@ namespace ledger { QString message; switch (error) { case QAbstractSocket::ConnectionRefusedError: - message = QString("Connection refused to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Connection refused to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::RemoteHostClosedError: - message = QString("Remote host closed connection to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Remote host closed connection to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::HostNotFoundError: - message = QString("Host not found for %1").arg(conn->socket->requestUrl().toString()); + message = QString("Host not found for %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::SocketAccessError: - message = QString("Socket access error to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Socket access error to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::SocketResourceError: - message = QString("Socket resource failed to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Socket resource failed to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::SocketTimeoutError: - message = QString("Socket timed out to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Socket timed out to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::DatagramTooLargeError: - message = QString("Too large datagram for %1").arg(conn->socket->requestUrl().toString()); + message = QString("Too large datagram for %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::NetworkError: - message = QString("Network error to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Network error to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::AddressInUseError: - message = QString("Address is in use for %1").arg(conn->socket->requestUrl().toString()); + message = QString("Address is in use for %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::SocketAddressNotAvailableError: - message = QString("Address %1 not available").arg(conn->socket->requestUrl().toString()); + message = QString("Address %1 not available").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::UnsupportedSocketOperationError: - message = QString("Unsopported operation to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Unsopported operation to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::UnfinishedSocketOperationError: - message = QString("Unfinished operation for %1").arg(conn->socket->requestUrl().toString()); + message = QString("Unfinished operation for %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::ProxyAuthenticationRequiredError: message = QString("Proxy authentication required"); break; case QAbstractSocket::SslHandshakeFailedError: - message = QString("SSL handshake failed to %1").arg(conn->socket->requestUrl().toString()); + message = QString("SSL handshake failed to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::ProxyConnectionRefusedError: - message = QString("Proxy connection refused to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Proxy connection refused to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::ProxyConnectionClosedError: - message = QString("Proxy connection closed to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Proxy connection closed to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::ProxyConnectionTimeoutError: - message = QString("Proxy connection timed out to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Proxy connection timed out to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::ProxyNotFoundError: message = QString("Proxy not found"); @@ -198,19 +198,19 @@ namespace ledger { message = QString("Proxy protocol error"); break; case QAbstractSocket::OperationError: - message = QString("Operation error to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Operation error to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::SslInternalError: - message = QString("SSL internal error to %1").arg(conn->socket->requestUrl().toString()); + message = QString("SSL internal error to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::SslInvalidUserDataError: - message = QString("SSSL invalid user data error for %1").arg(conn->socket->requestUrl().toString()); + message = QString("SSSL invalid user data error for %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::TemporaryError: - message = QString("Tempory error to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Tempory error to %1").arg(conn->socket.requestUrl().toString()); break; case QAbstractSocket::UnknownSocketError: - message = QString("Connection refused to %1").arg(conn->socket->requestUrl().toString()); + message = QString("Connection refused to %1").arg(conn->socket.requestUrl().toString()); break; } conn->api->onError(api::ErrorCode::HTTP_ERROR, message.toStdString()); diff --git a/qt-host/net/QtWebSocketClient.h b/qt-host/net/QtWebSocketClient.h index c193008587..2fe3abdddb 100644 --- a/qt-host/net/QtWebSocketClient.h +++ b/qt-host/net/QtWebSocketClient.h @@ -58,11 +58,7 @@ namespace ledger { private: struct Connection { - Connection(QObject* parent = Q_NULLPTR) { - QString origin("Test Connection"); - socket = std::make_shared(origin, QWebSocketProtocol::VersionLatest, parent); - }; - std::shared_ptr socket; + QWebSocket socket; std::shared_ptr api; ~Connection() = default; }; diff --git a/tools/build_ios/install_name.sh b/tools/build_ios/install_name.sh index 853f3623cf..9404a3ede7 100755 --- a/tools/build_ios/install_name.sh +++ b/tools/build_ios/install_name.sh @@ -1,9 +1,12 @@ #!/bin/bash echo $1 -if ! otool -l $1 | grep LC_RPATH; -then - #install_name_tool -add_rpath "@executable_path/Frameworks;@loader_path/Frameworks" $1; - install_name_tool -add_rpath "@executable_path/Frameworks" $1; +echo $2 +if ! otool -l $1 | grep LC_RPATH; then + if [ "$2" == "x86_64" ]; then + install_name_tool -add_rpath "@executable_path/Frameworks/$2" $1; + else + install_name_tool -add_rpath "@executable_path/Frameworks" $1; + fi else echo 'Otool Operation Skipped'; fi; diff --git a/tools/build_ios/ios_build.sh b/tools/build_ios/ios_build.sh index 2889f0186d..2af6708202 100755 --- a/tools/build_ios/ios_build.sh +++ b/tools/build_ios/ios_build.sh @@ -32,7 +32,10 @@ else fi cp `pwd`/../lib-ledger-core/tools/build_ios/framework.plist.in `pwd` -cp `pwd`/../lib-ledger-core/tools/build_ios/install_name.sh `pwd` + +cp `pwd`/../lib-ledger-core/tools/build_ios/install_name.sh `pwd` $ARCH + + echo " >>> Starting iOS build for architecture ${ARCH} with toolchain ${TOOLCHAIN_NAME} for ${OSX_SYSROOT}" if [ "${ARCH}" == 'bitcode' ]; then diff --git a/tools/generateBindingsRN.sh b/tools/generateBindingsRN.sh index bacc12c844..61e213a009 100755 --- a/tools/generateBindingsRN.sh +++ b/tools/generateBindingsRN.sh @@ -5,42 +5,19 @@ DEST=../lib-ledger-core-react-native-bindings # CORE_BUILD=../lib-ledger-core-build CORE_CPP_API=core/src/api -CORE_CPP_JNI=core/src/jni - if [ ! -e $DEST/src/react-native ]; then + if [ ! -e $DEST/ios/Sources/react-native-ios ]; then ./djinni/src/run \ --idl ./core/core.djinni \ --cpp-out $CORE_CPP_API \ --cpp-namespace ledger::core::api \ --cpp-optional-template std::experimental::optional \ --cpp-optional-header "\"../utils/optional.hpp\"" \ - --jni-include-cpp-prefix "../../api/" \ - --jni-out $CORE_CPP_JNI/jni \ --objc-type-prefix LG \ - --react-native-objc-out $DEST/src/react-native \ + --react-native-objc-out $DEST/ios/Sources/react-native-ios \ --react-native-type-prefix RCTCore \ --react-include-objc-impl ../objc-impl \ --react-native-objc-impl-suffix Impl \ --trace true fi -# copy include files -# rm -rf $DEST/include -cp -r $CORE_CPP_API $DEST/include - -# copy util files -rm -rf $DEST/src/utils -mkdir $DEST/src/utils -cp -r core/src/utils/optional.hpp $DEST/src/utils - -# copy lib files -rm -rf $DEST/lib -mkdir $DEST/lib - -# copy dynamic library -# cp $CORE_BUILD/core/src/libledger-core.* $DEST/lib - -# create tmp folder if needed -# if [ ! -e $DEST/js/tmp ]; then -# mkdir $DEST/js/tmp -# fi