diff --git a/native/android/app/CMakeLists.txt b/native/android/app/CMakeLists.txt --- a/native/android/app/CMakeLists.txt +++ b/native/android/app/CMakeLists.txt @@ -119,6 +119,7 @@ ) set(GENERATED_NATIVE_CODE "../../cpp/CommonCpp/_generated/commJSI-generated.cpp") +set(RUST_NATIVE_CODE "../../native_rust_library/RustCallback.cpp") file(GLOB CRYPTO_NATIVE_CODE "../../cpp/CommonCpp/CryptoTools/*.cpp") file(GLOB DB_NATIVE_CODE "../../cpp/CommonCpp/DatabaseManagers/*.cpp") file(GLOB DB_ENTITIES_NATIVE_CODE "../../cpp/CommonCpp/DatabaseManagers/entities/*.cpp") @@ -154,6 +155,7 @@ ${MODULE_ROOT_NATIVE_CODE} ${TOOLS_NATIVE_CODE} ${NOTIFICATIONS_NATIVE_CODE} + ${RUST_NATIVE_CODE} ) set(BUILD_DIR ${CMAKE_SOURCE_DIR}/build) diff --git a/native/android/app/build.gradle b/native/android/app/build.gradle --- a/native/android/app/build.gradle +++ b/native/android/app/build.gradle @@ -379,10 +379,30 @@ "x86_64-linux-android" } +def nativeRustLibraryDir = "../../native_rust_library" +def nativeRustLibraryManifestPath = "${nativeRustLibraryDir}/Cargo.toml" +def cxxBridgeBindingDir = "${nativeRustLibraryDir}/target/cxxbridge/native_rust_library/src" +def cxxBridgeCommonDir = "${nativeRustLibraryDir}/target/cxxbridge/rust" + +task buildNativeRustLibrary(type: Exec) { + commandLine "cargo", "build", "--manifest-path", nativeRustLibraryManifestPath +} + +task copyNativeRustLibraryFiles(dependsOn: buildNativeRustLibrary, type: Copy) { + from(cxxBridgeBindingDir) { + include 'lib.rs.h' + include 'lib.rs.cc' + } + from(cxxBridgeCommonDir) { + include 'cxx.h' + } + into nativeRustLibraryDir +} + // Bind preBuild dependencies only if not 'clean' running if (!isCleanRunning()) { afterEvaluate { - preBuild.dependsOn(prepareExternalLibs, updateRustToolchain) + preBuild.dependsOn(prepareExternalLibs, updateRustToolchain, copyNativeRustLibraryFiles) } } diff --git a/native/ios/Comm.xcodeproj/project.pbxproj b/native/ios/Comm.xcodeproj/project.pbxproj --- a/native/ios/Comm.xcodeproj/project.pbxproj +++ b/native/ios/Comm.xcodeproj/project.pbxproj @@ -39,6 +39,8 @@ 7FA2DCDE293E62F500991BA4 /* CommIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7FA2DCDC293E62F500991BA4 /* CommIcons.ttf */; }; 7FA2DCDF293E62F500991BA4 /* SWMansionIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7FA2DCDD293E62F500991BA4 /* SWMansionIcons.ttf */; }; 7FE4D9F5291DFE9300667BF6 /* commJSI-generated.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7FE4D9F4291DFE9300667BF6 /* commJSI-generated.cpp */; }; + 8B38121629CE5742000C52E9 /* RustPromiseManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B38121529CE5742000C52E9 /* RustPromiseManager.cpp */; }; + 8B652FA6295EAA5B009F8163 /* RustCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B652FA5295EAA5B009F8163 /* RustCallback.cpp */; }; 8B99BAAC28D50F3000EB5ADB /* libnative_rust_library.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B99BAAB28D50F3000EB5ADB /* libnative_rust_library.a */; }; 8B99BAAE28D511FF00EB5ADB /* lib.rs.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8B99BAAD28D511FF00EB5ADB /* lib.rs.cc */; }; 8E43C32C291E5B4A009378F5 /* TerminateApp.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8E43C32B291E5B4A009378F5 /* TerminateApp.mm */; }; @@ -167,6 +169,10 @@ 7FE4D9F3291DFE9300667BF6 /* commJSI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = commJSI.h; sourceTree = ""; }; 7FE4D9F4291DFE9300667BF6 /* commJSI-generated.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "commJSI-generated.cpp"; sourceTree = ""; }; 891D1495EE1F375F3AF6C7ED /* Pods-NotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationService.debug.xcconfig"; path = "Target Support Files/Pods-NotificationService/Pods-NotificationService.debug.xcconfig"; sourceTree = ""; }; + 8B38121529CE5742000C52E9 /* RustPromiseManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RustPromiseManager.cpp; sourceTree = ""; }; + 8B652FA1295EA6B8009F8163 /* RustPromiseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RustPromiseManager.h; sourceTree = ""; }; + 8B652FA4295EA9F1009F8163 /* RustCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RustCallback.h; sourceTree = ""; }; + 8B652FA5295EAA5B009F8163 /* RustCallback.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RustCallback.cpp; sourceTree = ""; }; 8B99AF6D28D50D4800EB5ADB /* lib.rs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lib.rs.h; sourceTree = ""; }; 8B99B59928D50D4900EB5ADB /* cxx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cxx.h; sourceTree = ""; }; 8B99BAAB28D50F3000EB5ADB /* libnative_rust_library.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libnative_rust_library.a; path = ../native_rust_library/target/universal/release/libnative_rust_library.a; sourceTree = ""; }; @@ -452,6 +458,8 @@ 726E5D722731A4240032361D /* InternalModules */ = { isa = PBXGroup; children = ( + 8B38121529CE5742000C52E9 /* RustPromiseManager.cpp */, + 8B652FA1295EA6B8009F8163 /* RustPromiseManager.h */, CBDEC69928ED859600C17588 /* GlobalDBSingleton.h */, ); path = InternalModules; @@ -502,9 +510,11 @@ 8B99AF6B28D50D4800EB5ADB /* native_rust_library */ = { isa = PBXGroup; children = ( + 8B652FA4295EA9F1009F8163 /* RustCallback.h */, 8B99BAAD28D511FF00EB5ADB /* lib.rs.cc */, 8B99AF6D28D50D4800EB5ADB /* lib.rs.h */, 8B99B59928D50D4900EB5ADB /* cxx.h */, + 8B652FA5295EAA5B009F8163 /* RustCallback.cpp */, ); name = native_rust_library; path = ../native_rust_library; @@ -969,6 +979,7 @@ 71BF5B7526B401D300EDE27D /* Tools.cpp in Sources */, 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, 7FE4D9F5291DFE9300667BF6 /* commJSI-generated.cpp in Sources */, + 8B652FA6295EAA5B009F8163 /* RustCallback.cpp in Sources */, 71142A7726C2650B0039DCBD /* CommSecureStoreIOSWrapper.mm in Sources */, CB38F2B1286C6C870010535C /* MessageOperationsUtilities.cpp in Sources */, 71CA4A64262DA8E500835C89 /* Logger.mm in Sources */, @@ -976,6 +987,7 @@ CB24361829A39A2500FEC4E1 /* NotificationsCryptoModule.cpp in Sources */, 71BE844A2636A944002849D2 /* CommCoreModule.cpp in Sources */, 71D4D7CC26C50B1000FCDBCD /* CommSecureStore.mm in Sources */, + 8B38121629CE5742000C52E9 /* RustPromiseManager.cpp in Sources */, 711B408425DA97F9005F8F06 /* dummy.swift in Sources */, 8E86A6D329537EBB000BBE7D /* DatabaseManager.cpp in Sources */, CBDEC69B28ED867000C17588 /* GlobalDBSingleton.mm in Sources */, diff --git a/native/native_rust_library/RustCallback.h b/native/native_rust_library/RustCallback.h new file mode 100644 --- /dev/null +++ b/native/native_rust_library/RustCallback.h @@ -0,0 +1,9 @@ +#pragma once + +#include "cxx.h" + +namespace comm { + +void stringCallback(rust::String error, uint32_t promiseID, rust::String ret); + +} // namespace comm diff --git a/native/native_rust_library/RustCallback.cpp b/native/native_rust_library/RustCallback.cpp new file mode 100644 --- /dev/null +++ b/native/native_rust_library/RustCallback.cpp @@ -0,0 +1,26 @@ +#include "RustCallback.h" +#include "../cpp/CommonCpp/NativeModules/CommCoreModule.h" +#include "../cpp/CommonCpp/NativeModules/InternalModules/RustPromiseManager.h" +#include "../cpp/CommonCpp/Tools/Logger.h" +#include +#include +#include + +namespace comm { + +void stringCallback(rust::String error, uint32_t promiseID, rust::String ret) { + auto it = RustPromiseManager::instance.promises.find(promiseID); + if (it == RustPromiseManager::instance.promises.end()) { + return; + } + + if (error.size()) { + RustPromiseManager::instance.rejectPromise(promiseID, std::string(error)); + } else { + folly::dynamic retDyn; + retDyn = std::string(ret); + RustPromiseManager::instance.resolvePromise(promiseID, retDyn); + } +} + +} // namespace comm diff --git a/shared/cmake/corrosion-cxx.cmake b/shared/cmake/corrosion-cxx.cmake --- a/shared/cmake/corrosion-cxx.cmake +++ b/shared/cmake/corrosion-cxx.cmake @@ -99,6 +99,8 @@ ) target_include_directories(${_LIB_PATH_STEM}_cxxbridge PUBLIC ${cxx_binding_include_dir} + # Try to pick up any other headers exposed by target + ${CMAKE_CURRENT_LIST_DIR}/${rust_lib_PATH} ) # Create total target with alias with given namespace