diff options
Diffstat (limited to 'ios/MullvadRustRuntime')
| -rw-r--r-- | ios/MullvadRustRuntime/MullvadAccessMethodReceiver.swift | 6 | ||||
| -rw-r--r-- | ios/MullvadRustRuntime/MullvadApiContext.swift | 23 | ||||
| -rw-r--r-- | ios/MullvadRustRuntime/include/mullvad_rust_runtime.h | 23 |
3 files changed, 42 insertions, 10 deletions
diff --git a/ios/MullvadRustRuntime/MullvadAccessMethodReceiver.swift b/ios/MullvadRustRuntime/MullvadAccessMethodReceiver.swift index c683a10af6..bb94759717 100644 --- a/ios/MullvadRustRuntime/MullvadAccessMethodReceiver.swift +++ b/ios/MullvadRustRuntime/MullvadAccessMethodReceiver.swift @@ -17,12 +17,12 @@ public class MullvadAccessMethodReceiver { public init( apiContext: MullvadApiContext, accessMethodsDataSource: AnyPublisher<[PersistentAccessMethod], Never>, - lastReachableDataSource: AnyPublisher<PersistentAccessMethod, Never> + requestDataSource: AnyPublisher<PersistentAccessMethod, Never> ) { self.apiContext = apiContext - lastReachableDataSource.sink { [weak self] in - self?.saveLastReachable($0) + requestDataSource.sink { [weak self] latestReachable in + self?.saveLastReachable(latestReachable) } .store(in: &cancellables) diff --git a/ios/MullvadRustRuntime/MullvadApiContext.swift b/ios/MullvadRustRuntime/MullvadApiContext.swift index 7600b79e70..d2d289b951 100644 --- a/ios/MullvadRustRuntime/MullvadApiContext.swift +++ b/ios/MullvadRustRuntime/MullvadApiContext.swift @@ -6,18 +6,28 @@ // Copyright © 2025 Mullvad VPN AB. All rights reserved. // +import MullvadSettings import MullvadTypes -public struct MullvadApiContext: @unchecked Sendable { +func onAccessChangeCallback(selfPtr: UnsafeRawPointer?, bytes: UnsafePointer<UInt8>?) { + guard let selfPtr, let bytes else { return } + let context = Unmanaged<MullvadApiContext>.fromOpaque(selfPtr).takeUnretainedValue() + + let uuid = NSUUID(uuidBytes: bytes) as UUID + context.accessMethodChangeListener?.accessMethodChangedTo(uuid) +} + +public class MullvadApiContext: @unchecked Sendable { enum Error: Swift.Error { case failedToConstructApiClient } - public let context: SwiftApiContext + public private(set) var context: SwiftApiContext! private let shadowsocksBridgeProvider: SwiftShadowsocksBridgeProviding! private let shadowsocksBridgeProviderWrapper: SwiftShadowsocksLoaderWrapper! private let addressCacheWrapper: SwiftAddressCacheWrapper! private let addressCacheProvider: AddressCacheProviding! + public var accessMethodChangeListener: MullvadAccessMethodChangeListening? public init( host: String, @@ -36,6 +46,7 @@ public struct MullvadApiContext: @unchecked Sendable { self.addressCacheProvider = defaultAddressCache self.addressCacheWrapper = iniSwiftAddressCacheWrapper(provider: defaultAddressCache) + let selfPtr = Unmanaged.passUnretained(self).toOpaque() context = switch disableTls { case true: mullvad_api_init_new_tls_disabled( @@ -44,7 +55,9 @@ public struct MullvadApiContext: @unchecked Sendable { domain, shadowsocksBridgeProviderWrapper, accessMethodWrapper, - addressCacheWrapper + addressCacheWrapper, + onAccessChangeCallback, + selfPtr ) case false: mullvad_api_init_new( @@ -53,7 +66,9 @@ public struct MullvadApiContext: @unchecked Sendable { domain, shadowsocksBridgeProviderWrapper, accessMethodWrapper, - addressCacheWrapper + addressCacheWrapper, + onAccessChangeCallback, + selfPtr ) } diff --git a/ios/MullvadRustRuntime/include/mullvad_rust_runtime.h b/ios/MullvadRustRuntime/include/mullvad_rust_runtime.h index 751e58aae0..c8443c1fcf 100644 --- a/ios/MullvadRustRuntime/include/mullvad_rust_runtime.h +++ b/ios/MullvadRustRuntime/include/mullvad_rust_runtime.h @@ -169,7 +169,10 @@ struct SwiftApiContext mullvad_api_init_new_tls_disabled(const char *host, const char *domain, struct SwiftShadowsocksLoaderWrapper bridge_provider, struct SwiftAccessMethodSettingsWrapper settings_provider, - struct SwiftAddressCacheWrapper address_cache); + struct SwiftAddressCacheWrapper address_cache, + void (*access_method_change_callback)(const void*, + const uint8_t*), + const void *access_method_change_context); /** * # Safety @@ -180,6 +183,14 @@ struct SwiftApiContext mullvad_api_init_new_tls_disabled(const char *host, * `address` must be a pointer to a null terminated string representing a socket address through which * the Mullvad API can be reached directly. * + * address_method_change_callback is a function with the C calling convention which will be called + * whenever the access method changes with a user-specified opaque pointer and a pointer to the bytes + * of the access method's UUID. Note that this callback must remain valid for the lifetime of the + * program. + * + * access_method_change_context is the pointer passed verbatim to the callback. It is not dereferenced + * by the Rust code, but remains opaque. + * * If a context cannot be constructed this function will panic since the call site would not be able * to proceed in a meaningful way anyway. * @@ -190,7 +201,10 @@ struct SwiftApiContext mullvad_api_init_new(const char *host, const char *domain, struct SwiftShadowsocksLoaderWrapper bridge_provider, struct SwiftAccessMethodSettingsWrapper settings_provider, - struct SwiftAddressCacheWrapper address_cache); + struct SwiftAddressCacheWrapper address_cache, + void (*access_method_change_callback)(const void*, + const uint8_t*), + const void *access_method_change_context); /** * # Safety @@ -212,7 +226,10 @@ struct SwiftApiContext mullvad_api_init_inner(const char *host, bool disable_tls, struct SwiftShadowsocksLoaderWrapper bridge_provider, struct SwiftAccessMethodSettingsWrapper settings_provider, - struct SwiftAddressCacheWrapper address_cache); + struct SwiftAddressCacheWrapper address_cache, + void (*access_method_change_callback)(const void*, + const uint8_t*), + const void *access_method_change_context); /** * Converts parameters into a `Box<AccessMethodSetting>` raw representation that |
