40 lines
1.3 KiB
Swift
40 lines
1.3 KiB
Swift
//
|
|
// Copyright 2024 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
public import UIKit
|
|
|
|
public struct FileHandleImageSource: OWSImageSource {
|
|
|
|
private let fileHandle: FileHandle
|
|
public let byteLength: Int
|
|
|
|
public init(fileHandle: FileHandle, byteLength: Int) {
|
|
self.fileHandle = fileHandle
|
|
self.byteLength = byteLength
|
|
}
|
|
|
|
public init(fileUrl: URL) throws {
|
|
let byteLength = Int((try? OWSFileSystem.fileSize(of: fileUrl)) ?? 0)
|
|
let fileHandle = try FileHandle(forReadingFrom: fileUrl)
|
|
self.init(fileHandle: fileHandle, byteLength: byteLength)
|
|
}
|
|
|
|
public func readData(byteOffset: Int, byteLength: Int) throws -> Data {
|
|
if try fileHandle.offset() != byteOffset {
|
|
fileHandle.seek(toFileOffset: UInt64(byteOffset))
|
|
}
|
|
return try fileHandle.read(upToCount: byteLength) ?? Data()
|
|
}
|
|
|
|
public func cgImageSource() throws -> CGImageSource? {
|
|
let dataProvider = CGDataProvider.from(fileHandle: self.fileHandle, fileSize: Int64(self.byteLength))
|
|
guard let dataProvider else {
|
|
throw OWSAssertionError("couldn't create data provider")
|
|
}
|
|
return CGImageSourceCreateWithDataProvider(dataProvider, nil)
|
|
}
|
|
}
|