Signal-iOS/SignalServiceKit/Messages/Attachments/TSAttachmentStream.h
2024-06-17 11:56:26 -07:00

221 lines
10 KiB
Objective-C

//
// Copyright 2017 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
#import <SignalServiceKit/DataSource.h>
#import <SignalServiceKit/TSAttachment.h>
#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#endif
NS_ASSUME_NONNULL_BEGIN
@class AudioWaveform;
@class SSKProtoAttachmentPointer;
@class TSAttachmentPointer;
typedef void (^OWSThumbnailSuccess)(UIImage *image);
typedef void (^OWSThumbnailFailure)(void);
typedef NS_CLOSED_ENUM(NSUInteger, TSAttachmentThumbnailQuality) {
TSAttachmentThumbnailQuality_Small,
TSAttachmentThumbnailQuality_Medium,
TSAttachmentThumbnailQuality_MediumLarge,
TSAttachmentThumbnailQuality_Large
};
NSString *NSStringForAttachmentThumbnailQuality(TSAttachmentThumbnailQuality value);
@interface TSAttachmentStream : TSAttachment
- (instancetype)initWithServerId:(UInt64)serverId
cdnKey:(NSString *)cdnKey
cdnNumber:(UInt32)cdnNumber
encryptionKey:(NSData *)encryptionKey
byteCount:(UInt32)byteCount
contentType:(NSString *)contentType
clientUuid:(nullable NSUUID *)clientUuid
sourceFilename:(nullable NSString *)sourceFilename
caption:(nullable NSString *)caption
attachmentType:(TSAttachmentType)attachmentType
albumMessageId:(nullable NSString *)albumMessageId
blurHash:(nullable NSString *)blurHash
uploadTimestamp:(unsigned long long)uploadTimestamp
videoDuration:(nullable NSNumber *)videoDuration NS_UNAVAILABLE;
- (instancetype)initAttachmentWithContentType:(NSString *)contentType
byteCount:(UInt32)byteCount
sourceFilename:(nullable NSString *)sourceFilename
caption:(nullable NSString *)caption
attachmentType:(TSAttachmentType)attachmentType
albumMessageId:(nullable NSString *)albumMessageId NS_UNAVAILABLE;
- (instancetype)initWithGrdbId:(int64_t)grdbId
uniqueId:(NSString *)uniqueId
albumMessageId:(nullable NSString *)albumMessageId
attachmentSchemaVersion:(NSUInteger)attachmentSchemaVersion
attachmentType:(TSAttachmentType)attachmentType
blurHash:(nullable NSString *)blurHash
byteCount:(unsigned int)byteCount
caption:(nullable NSString *)caption
cdnKey:(NSString *)cdnKey
cdnNumber:(unsigned int)cdnNumber
clientUuid:(nullable NSString *)clientUuid
contentType:(NSString *)contentType
encryptionKey:(nullable NSData *)encryptionKey
serverId:(unsigned long long)serverId
sourceFilename:(nullable NSString *)sourceFilename
uploadTimestamp:(unsigned long long)uploadTimestamp
videoDuration:(nullable NSNumber *)videoDuration NS_UNAVAILABLE;
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithContentType:(NSString *)contentType
byteCount:(UInt32)byteCount
sourceFilename:(nullable NSString *)sourceFilename
caption:(nullable NSString *)caption
attachmentType:(TSAttachmentType)attachmentType
albumMessageId:(nullable NSString *)albumMessageId NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithPointer:(TSAttachmentPointer *)pointer
transaction:(SDSAnyReadTransaction *)transaction NS_DESIGNATED_INITIALIZER;
// --- CODE GENERATION MARKER
// This snippet is generated by /Scripts/sds_codegen/sds_generate.py. Do not manually edit it, instead run
// `sds_codegen.sh`.
// clang-format off
- (instancetype)initWithGrdbId:(int64_t)grdbId
uniqueId:(NSString *)uniqueId
albumMessageId:(nullable NSString *)albumMessageId
attachmentSchemaVersion:(NSUInteger)attachmentSchemaVersion
attachmentType:(TSAttachmentType)attachmentType
blurHash:(nullable NSString *)blurHash
byteCount:(unsigned int)byteCount
caption:(nullable NSString *)caption
cdnKey:(NSString *)cdnKey
cdnNumber:(unsigned int)cdnNumber
clientUuid:(nullable NSString *)clientUuid
contentType:(NSString *)contentType
encryptionKey:(nullable NSData *)encryptionKey
serverId:(unsigned long long)serverId
sourceFilename:(nullable NSString *)sourceFilename
uploadTimestamp:(unsigned long long)uploadTimestamp
videoDuration:(nullable NSNumber *)videoDuration
cachedAudioDurationSeconds:(nullable NSNumber *)cachedAudioDurationSeconds
cachedImageHeight:(nullable NSNumber *)cachedImageHeight
cachedImageWidth:(nullable NSNumber *)cachedImageWidth
creationTimestamp:(NSDate *)creationTimestamp
digest:(nullable NSData *)digest
isAnimatedCached:(nullable NSNumber *)isAnimatedCached
isUploaded:(BOOL)isUploaded
isValidImageCached:(nullable NSNumber *)isValidImageCached
isValidVideoCached:(nullable NSNumber *)isValidVideoCached
localRelativeFilePath:(nullable NSString *)localRelativeFilePath
NS_DESIGNATED_INITIALIZER NS_SWIFT_NAME(init(grdbId:uniqueId:albumMessageId:attachmentSchemaVersion:attachmentType:blurHash:byteCount:caption:cdnKey:cdnNumber:clientUuid:contentType:encryptionKey:serverId:sourceFilename:uploadTimestamp:videoDuration:cachedAudioDurationSeconds:cachedImageHeight:cachedImageWidth:creationTimestamp:digest:isAnimatedCached:isUploaded:isValidImageCached:isValidVideoCached:localRelativeFilePath:));
// clang-format on
// --- CODE GENERATION MARKER
// Though now required, `digest` may be null for pre-existing records or from
// messages received from other clients
@property (nullable, nonatomic) NSData *digest;
// This only applies for attachments being uploaded.
@property (atomic) BOOL isUploaded;
@property (nonatomic, readonly) NSDate *creationTimestamp;
#if TARGET_OS_IPHONE
- (nullable NSData *)validStillImageData;
#endif
@property (nonatomic, readonly, nullable) UIImage *originalImage;
@property (nonatomic, readonly, nullable) NSString *originalFilePath;
@property (nonatomic, readonly, nullable) NSURL *originalMediaURL;
@property (nonatomic, readonly, nullable) NSString *audioWaveformPath;
- (NSArray<NSString *> *)allSecondaryFilePaths;
- (nullable NSData *)readDataFromFileWithError:(NSError **)error;
- (BOOL)writeData:(NSData *)data error:(NSError **)error;
/// Copies the contents of the DataSource into the attachment stream's backing file.
- (BOOL)writeCopyingDataSource:(id<DataSource>)dataSource
error:(NSError **)error NS_SWIFT_NAME(writeCopyingDataSource(_:));
/// This method *moves* the file backing `dataSource`, rather than copying it's content. As such it's faster than
/// `writeCopyingDataSource`, but it must not be used if the DataSource is backed by a file which must exist *after*
/// this write.
- (BOOL)writeConsumingDataSource:(id<DataSource>)dataSource
error:(NSError **)error NS_SWIFT_NAME(writeConsumingDataSource(_:));
+ (void)deleteAttachmentsFromDisk;
+ (NSString *)attachmentsFolder;
+ (NSString *)legacyAttachmentsDirPath;
+ (NSString *)sharedDataAttachmentsDirPath;
@property (nonatomic, readonly) BOOL shouldHaveImageSize;
@property (nonatomic, readonly) CGSize imageSizePixels;
- (NSTimeInterval)audioDurationSeconds;
#pragma mark - Thumbnails
// On cache hit, the thumbnail will be returned synchronously and completion will never be invoked.
// On cache miss, nil will be returned and success will be invoked if thumbnail can be generated;
// otherwise failure will be invoked.
//
// success and failure are invoked async on main.
- (void)thumbnailImageWithSizeHint:(CGSize)sizeHint
success:(OWSThumbnailSuccess)success
failure:(OWSThumbnailFailure)failure;
- (void)thumbnailImageWithQuality:(TSAttachmentThumbnailQuality)quality
success:(OWSThumbnailSuccess)success
failure:(OWSThumbnailFailure)failure NS_SWIFT_NAME(thumbnailImage(quality:success:failure:));
- (nullable UIImage *)thumbnailImageSyncWithQuality:(TSAttachmentThumbnailQuality)quality
NS_SWIFT_NAME(thumbnailImageSync(quality:));
// This method should only be invoked by OWSThumbnailService.
- (NSString *)pathForThumbnailDimensionPoints:(CGFloat)thumbnailDimensionPoints;
#pragma mark - Validation
@property (nonatomic, readonly) BOOL isValidImage;
@property (nonatomic, readonly) BOOL isValidVideo;
@property (nonatomic, readonly) BOOL isValidVisualMedia;
// Might check the contents themselves, if the MIME type is ambiguous.
@property (nonatomic, readonly) BOOL isAnimatedContent;
- (BOOL)isValidImageIgnoringSize:(BOOL)ignoreSize;
- (BOOL)isValidVideoIgnoringSize:(BOOL)ignoreSize;
- (BOOL)isValidVisualMediaIgnoringSize:(BOOL)ignoreSize;
#pragma mark - Update With... Methods
- (void)updateAsUploadedWithEncryptionKey:(NSData *)encryptionKey
digest:(NSData *)digest
serverId:(UInt64)serverId
cdnKey:(NSString *)cdnKey
cdnNumber:(UInt32)cdnNumber
uploadTimestamp:(unsigned long long)uploadTimestamp
transaction:(SDSAnyWriteTransaction *)transaction;
- (nullable TSAttachmentStream *)cloneAsThumbnail;
#pragma mark - Protobuf
- (nullable SSKProtoAttachmentPointer *)buildProto;
@end
NS_ASSUME_NONNULL_END