Signal-iOS/SignalServiceKit/Util/ImageMetadata/OWSImageSource+FileHandle.swift
2026-04-29 14:07:51 -05:00

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)
}
}