summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadRustRuntime
diff options
context:
space:
mode:
Diffstat (limited to 'ios/MullvadRustRuntime')
-rw-r--r--ios/MullvadRustRuntime/MullvadAccessMethodReceiver.swift6
-rw-r--r--ios/MullvadRustRuntime/MullvadApiContext.swift23
-rw-r--r--ios/MullvadRustRuntime/include/mullvad_rust_runtime.h23
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