core/src/iosMain/kotlin/licensee/LicenseeLicenseInfoRepository.ios.kt
changeset 28 19cf2e8a0627
child 34 ce299aacc068
equal deleted inserted replaced
27:6469637350c6 28:19cf2e8a0627
       
     1 /*
       
     2  * AboutOss is an utility library to retrieve and display
       
     3  * opensource licenses in Android applications.
       
     4  *
       
     5  * Copyright (C) 2023 by Frederic-Charles Barthelery.
       
     6  *
       
     7  * This file is part of AboutOss.
       
     8  *
       
     9  * AboutOss is free software: you can redistribute it and/or modify
       
    10  * it under the terms of the GNU General Public License as published by
       
    11  * the Free Software Foundation, either version 3 of the License, or
       
    12  * (at your option) any later version.
       
    13  *
       
    14  * AboutOss is distributed in the hope that it will be useful,
       
    15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    17  * GNU General Public License for more details.
       
    18  *
       
    19  * You should have received a copy of the GNU General Public License
       
    20  * along with AboutOss.  If not, see <http://www.gnu.org/licenses/>.
       
    21  */
       
    22 package com.geekorum.aboutoss.core.licensee
       
    23 
       
    24 import kotlinx.cinterop.ExperimentalForeignApi
       
    25 import kotlinx.cinterop.addressOf
       
    26 import kotlinx.cinterop.usePinned
       
    27 import kotlinx.coroutines.CoroutineDispatcher
       
    28 import kotlinx.coroutines.Dispatchers
       
    29 import kotlinx.coroutines.IO
       
    30 import okio.Buffer
       
    31 import platform.Foundation.NSBundle
       
    32 import platform.Foundation.NSData
       
    33 import platform.Foundation.NSFileManager
       
    34 import platform.posix.memcpy
       
    35 
       
    36 fun LicenseeLicenseInfoRepository(
       
    37     licenseeResourcePath: String = "compose-resources/app/cash/licensee/artifacts.json",
       
    38     mainCoroutineDispatcher: CoroutineDispatcher = Dispatchers.Main,
       
    39     ioCoroutineDispatcher: CoroutineDispatcher = Dispatchers.IO,
       
    40 ): LicenseeLicenseInfoRepository {
       
    41     return LicenseeLicenseInfoRepository(
       
    42         produceInput = {
       
    43             val buffer = Buffer()
       
    44             buffer.write(readResources(licenseeResourcePath))
       
    45             buffer
       
    46         },
       
    47         mainCoroutineDispatcher = mainCoroutineDispatcher,
       
    48         ioCoroutineDispatcher = ioCoroutineDispatcher
       
    49     )
       
    50 }
       
    51 
       
    52 
       
    53 @OptIn(ExperimentalForeignApi::class)
       
    54 private fun readResources(path: String): ByteArray {
       
    55     val data = readData(getPathInBundle(path))
       
    56     return ByteArray(data.length.toInt()).apply {
       
    57         usePinned { memcpy(it.addressOf(0), data.bytes, data.length) }
       
    58     }
       
    59 }
       
    60 
       
    61 private fun getPathInBundle(path: String): String {
       
    62     return NSBundle.mainBundle.resourcePath + "/$path"
       
    63 }
       
    64 
       
    65 private fun readData(path: String): NSData {
       
    66     return NSFileManager.defaultManager().contentsAtPath(path) ?: error("Resources not found with path $path")
       
    67 }