26 import kotlinx.cinterop.ObjCObjectVar |
26 import kotlinx.cinterop.ObjCObjectVar |
27 import kotlinx.cinterop.alloc |
27 import kotlinx.cinterop.alloc |
28 import kotlinx.cinterop.memScoped |
28 import kotlinx.cinterop.memScoped |
29 import kotlinx.cinterop.ptr |
29 import kotlinx.cinterop.ptr |
30 import kotlinx.cinterop.value |
30 import kotlinx.cinterop.value |
|
31 import kotlinx.coroutines.suspendCancellableCoroutine |
31 import platform.Foundation.NSBundle |
32 import platform.Foundation.NSBundle |
32 import platform.Foundation.NSData |
33 import platform.Foundation.NSData |
33 import platform.Foundation.NSError |
34 import platform.Foundation.NSError |
34 import platform.Foundation.NSPropertyListMutableContainers |
35 import platform.Foundation.NSPropertyListMutableContainers |
35 import platform.Foundation.NSPropertyListSerialization |
36 import platform.Foundation.NSPropertyListSerialization |
36 import platform.Foundation.NSURL |
37 import platform.Foundation.NSURL |
37 import platform.Foundation.dataWithContentsOfURL |
38 import platform.Foundation.dataWithContentsOfURL |
38 import kotlin.coroutines.resume |
39 import kotlin.coroutines.resume |
39 import kotlin.coroutines.resumeWithException |
40 import kotlin.coroutines.resumeWithException |
40 import kotlin.coroutines.suspendCoroutine |
|
41 |
41 |
42 /** |
42 /** |
43 * Parse LicensePlist files |
43 * Parse LicensePlist files |
44 */ |
44 */ |
45 class LicensePlistParser { |
45 class LicensePlistParser { |
85 private fun getContent(url: NSURL): NSData { |
85 private fun getContent(url: NSURL): NSData { |
86 return checkNotNull(NSData.dataWithContentsOfURL(url)) |
86 return checkNotNull(NSData.dataWithContentsOfURL(url)) |
87 } |
87 } |
88 |
88 |
89 @OptIn(ExperimentalForeignApi::class, BetaInteropApi::class) |
89 @OptIn(ExperimentalForeignApi::class, BetaInteropApi::class) |
90 private suspend fun NSData.toPropertyList(): Any? = suspendCoroutine { cont -> |
90 private suspend fun NSData.toPropertyList(): Any? = suspendCancellableCoroutine { cont -> |
91 val parsed = memScoped { |
91 val parsed = memScoped { |
92 val error: ObjCObjectVar<NSError?> = alloc() |
92 val error: ObjCObjectVar<NSError?> = alloc() |
93 val result = NSPropertyListSerialization.propertyListWithData(this@toPropertyList, |
93 val result = NSPropertyListSerialization.propertyListWithData( |
|
94 this@toPropertyList, |
94 options = NSPropertyListMutableContainers, |
95 options = NSPropertyListMutableContainers, |
95 format = null, |
96 format = null, |
96 error.ptr |
97 error.ptr |
97 ) |
98 ) |
98 if (error.value != null) { |
99 if (error.value != null) { |