summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadRustRuntime/SwiftData.swift
blob: 2ebb4fb186b93ea3bb20f02d921ea4b3f714b8c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//
//  SwiftData.swift
//  MullvadVPN
//
//  Created by Andrew Bulhak on 2026-02-12.
//  Copyright © 2026 Mullvad VPN AB. All rights reserved.
//

// Code for passing `Data` objects to C FFI code

@_cdecl("swift_data_get_ptr")
func getSwiftDataPtr(_ pointer: UnsafePointer<SwiftData>?) -> UnsafeRawPointer? {
    guard
        let contentPtr = pointer?.pointee.ptr as? UnsafePointer<NSData>
    else { return nil }
    return contentPtr.pointee.bytes
}

@_cdecl("swift_data_get_len")
func getSwiftDataLength(_ pointer: UnsafePointer<SwiftData>?) -> Int {
    guard
        let contentPtr = pointer?.pointee.ptr as? UnsafePointer<NSData>
    else { return 0 }
    return contentPtr.pointee.count
}

@_cdecl("swift_data_drop")
func dropSwiftData(_ pointer: UnsafeMutablePointer<SwiftData>?) {
    // release the NSData
    if let ptr = pointer?.pointee.ptr {
        _ = Unmanaged<NSData>.fromOpaque(ptr).takeRetainedValue()
    }
    pointer?.pointee.ptr = nil
}

extension SwiftData {
    init(data: NSData) {
        self.init(ptr: Unmanaged.passRetained(data).toOpaque())
    }
}