Implement attachment downloading

This commit is contained in:
nielsandriesse 2020-11-20 14:04:56 +11:00
parent 961878f74c
commit b218a16b05
86 changed files with 373 additions and 746 deletions

View File

@ -69,9 +69,11 @@ target 'SessionMessagingKit' do
pod 'AFNetworking', inhibit_warnings: true
pod 'CryptoSwift', :inhibit_warnings => true
pod 'Curve25519Kit', git: 'https://github.com/signalapp/Curve25519Kit.git', :inhibit_warnings => true
pod 'Mantle', git: 'https://github.com/signalapp/Mantle', branch: 'signal-master', :inhibit_warnings => true
pod 'PromiseKit', :inhibit_warnings => true
pod 'SignalCoreKit', git: 'https://github.com/signalapp/SignalCoreKit.git', :inhibit_warnings => true
pod 'SwiftProtobuf', '~> 1.5.0', :inhibit_warnings => true
pod 'YapDatabase/SQLCipher', :git => 'https://github.com/signalapp/YapDatabase.git', branch: 'signal-release', :inhibit_warnings => true
end
target 'SessionProtocolKit' do
@ -95,8 +97,10 @@ end
target 'SessionUtilitiesKit' do
pod 'CryptoSwift', :inhibit_warnings => true
pod 'Curve25519Kit', git: 'https://github.com/signalapp/Curve25519Kit.git', :inhibit_warnings => true
pod 'Mantle', git: 'https://github.com/signalapp/Mantle', branch: 'signal-master', :inhibit_warnings => true
pod 'PromiseKit', :inhibit_warnings => true
pod 'SignalCoreKit', git: 'https://github.com/signalapp/SignalCoreKit.git', :inhibit_warnings => true
pod 'YapDatabase/SQLCipher', :git => 'https://github.com/signalapp/YapDatabase.git', branch: 'signal-release', :inhibit_warnings => true
end
post_install do |installer|

View File

@ -230,6 +230,6 @@ SPEC CHECKSUMS:
YYImage: 6db68da66f20d9f169ceb94dfb9947c3867b9665
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
PODFILE CHECKSUM: 3489ed70ea51f2bf705bf99703efc71d697de373
PODFILE CHECKSUM: 62df79698293257648cb6e60724f720f8477bd0f
COCOAPODS: 1.10.0.rc.1

View File

@ -64,7 +64,7 @@
#import <SignalUtilitiesKit/UIViewController+OWS.h>
#import <SignalUtilitiesKit/AppVersion.h>
#import <SignalUtilitiesKit/DataSource.h>
#import <SignalUtilitiesKit/MIMETypeUtil.h>
#import <SessionUtilitiesKit/MIMETypeUtil.h>
#import <SignalUtilitiesKit/NSData+Image.h>
#import <SignalUtilitiesKit/NSNotificationCenter+OWS.h>
#import <SignalUtilitiesKit/NSString+SSK.h>
@ -72,7 +72,7 @@
#import <SignalUtilitiesKit/OWSContactsOutputStream.h>
#import <SignalUtilitiesKit/OWSDispatch.h>
#import <SignalUtilitiesKit/OWSError.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
#import <SignalUtilitiesKit/OWSIdentityManager.h>
#import <SignalUtilitiesKit/OWSMediaGalleryFinder.h>
#import <SignalUtilitiesKit/OWSPrimaryStorage+SessionStore.h>

View File

@ -7,7 +7,7 @@
#import "OWSProgressView.h"
#import <SignalUtilitiesKit/UIFont+OWS.h>
#import <SignalUtilitiesKit/UIView+OWS.h>
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/OWSUploadOperation.h>
#import <SignalUtilitiesKit/TSAttachmentStream.h>

View File

@ -10,7 +10,7 @@
#import <SignalUtilitiesKit/OWSFormat.h>
#import <SignalUtilitiesKit/UIColor+OWS.h>
#import <SignalUtilitiesKit/MimeTypeUtil.h>
#import <SessionUtilitiesKit/MIMETypeUtil.h>
#import <SignalUtilitiesKit/NSString+SSK.h>
#import <SignalUtilitiesKit/TSAttachmentStream.h>
#import <SignalCoreKit/NSString+OWS.h>

View File

@ -50,7 +50,7 @@
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SignalUtilitiesKit/UIUtil.h>
#import <SignalUtilitiesKit/UIViewController+OWS.h>
#import <SignalUtilitiesKit/MIMETypeUtil.h>
#import <SessionUtilitiesKit/MIMETypeUtil.h>
#import <SignalUtilitiesKit/NSString+SSK.h>
#import <SignalUtilitiesKit/OWSAttachmentDownloads.h>
#import <SignalUtilitiesKit/OWSBlockingManager.h>

View File

@ -2,7 +2,7 @@
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -12,7 +12,7 @@
#import <SignalCoreKit/Threading.h>
#import <SignalUtilitiesKit/OWSBackgroundTask.h>
#import <SignalUtilitiesKit/OWSError.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
#import <SignalUtilitiesKit/TSAttachment.h>
#import <SignalUtilitiesKit/TSAttachmentStream.h>
#import <SignalUtilitiesKit/TSMessage.h>

View File

@ -4,7 +4,7 @@
#import "OWSBackupIO.h"
#import <SignalCoreKit/Randomness.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
@import Compression;

View File

@ -10,7 +10,7 @@
#import <PromiseKit/AnyPromise.h>
#import <SignalCoreKit/NSData+OWS.h>
#import <SignalUtilitiesKit/OWSBackgroundTask.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
#import <SignalUtilitiesKit/TSAttachment.h>
#import <SignalUtilitiesKit/TSMessage.h>
#import <SignalUtilitiesKit/TSThread.h>

View File

@ -13,7 +13,7 @@
#import <SignalUtilitiesKit/UIColor+OWS.h>
#import <SignalUtilitiesKit/UIFont+OWS.h>
#import <SignalUtilitiesKit/UIView+OWS.h>
#import <SignalUtilitiesKit/MIMETypeUtil.h>
#import <SessionUtilitiesKit/MIMETypeUtil.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -10,7 +10,7 @@
#import <SignalUtilitiesKit/AppReadiness.h>
#import <SignalUtilitiesKit/AppVersion.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
#import <SignalUtilitiesKit/OWSPrimaryStorage.h>
#import <SignalUtilitiesKit/TSAttachmentStream.h>
#import <SignalUtilitiesKit/TSInteraction.h>

View File

@ -1,29 +1,85 @@
import Foundation
import SessionUtilitiesKit
// TODO: Implementation
import SignalCoreKit
public final class AttachmentDownloadJob : NSObject, Job, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility
public var delegate: JobDelegate?
private let attachmentID: String
public var id: String?
public var failureCount: UInt = 0
public enum Error : LocalizedError {
case noAttachment
public var errorDescription: String? {
switch self {
case .noAttachment: return "No such attachment."
}
}
}
// MARK: Settings
public class var collection: String { return "AttachmentDownloadJobCollection" }
public static let maxFailureCount: UInt = 20
// MARK: Coding
public init?(coder: NSCoder) { }
// MARK: Initialization
public init(attachmentID: String) {
self.attachmentID = attachmentID
}
public func encode(with coder: NSCoder) { }
// MARK: Coding
public init?(coder: NSCoder) {
guard let attachmentID = coder.decodeObject(forKey: "attachmentID") as! String? else { return nil }
self.attachmentID = attachmentID
}
public func encode(with coder: NSCoder) {
coder.encode(attachmentID, forKey: "attachmentID")
}
// MARK: Running
public func execute() { }
public func execute() {
guard let pointer = TSAttachmentPointer.fetch(uniqueId: attachmentID) else {
return handleFailure(error: Error.noAttachment)
}
let temporaryFilePath = URL(fileURLWithPath: OWSTemporaryDirectoryAccessibleAfterFirstAuth() + UUID().uuidString)
FileServerAPI.downloadAttachment(from: pointer.downloadURL).done(on: DispatchQueue.global(qos: .userInitiated)) { data in // Intentionally capture self
do {
try data.write(to: temporaryFilePath, options: .atomic)
} catch {
return self.handleFailure(error: error)
}
let plaintext: Data
if let key = pointer.encryptionKey, let digest = pointer.digest {
do {
plaintext = try Cryptography.decryptAttachment(data, withKey: key, digest: digest, unpaddedSize: pointer.byteCount)
} catch {
return self.handleFailure(error: error)
}
} else {
plaintext = data // Open group attachments are unencrypted
}
let stream = TSAttachmentStream(pointer: pointer)
do {
try stream.write(plaintext)
} catch {
return self.handleFailure(error: error)
}
OWSFileSystem.deleteFile(temporaryFilePath.absoluteString)
Configuration.shared.storage.withAsync({ transaction in
stream.save(with: transaction as! YapDatabaseReadWriteTransaction)
// TODO: Update the message
}, completion: { })
}.catch(on: DispatchQueue.global()) { error in
self.handleFailure(error: error)
}
}
private func handleSuccess() {
delegate?.handleJobSucceeded(self)
}
private func handleFailure(error: Error) {
private func handleFailure(error: Swift.Error) {
delegate?.handleJobFailed(self, with: error)
}
}

View File

@ -6,10 +6,14 @@ public final class JobQueue : NSObject, JobDelegate {
@objc public static let shared = JobQueue()
@objc public func add(_ job: Job, using transaction: Any) {
addWithoutExecuting(job, using: transaction)
job.execute()
}
@objc public func addWithoutExecuting(_ job: Job, using transaction: Any) {
job.id = String(NSDate.millisecondTimestamp())
Configuration.shared.storage.persist(job, using: transaction)
job.delegate = self
job.execute()
}
@objc public func resumePendingJobs() {

View File

@ -75,12 +75,6 @@ private struct OWSThumbnailRequest {
// arrive so that we prioritize the most recent view state.
private var thumbnailRequestStack = [OWSThumbnailRequest]()
private override init() {
super.init()
SwiftSingletons.register(self)
}
private func canThumbnailAttachment(attachment: TSAttachmentStream) -> Bool {
return attachment.isImage || attachment.isAnimated || attachment.isVideo
}
@ -117,8 +111,6 @@ private struct OWSThumbnailRequest {
thumbnailRequest.success(loadedThumbnail)
}
} catch {
Logger.error("Could not create thumbnail: \(error)")
DispatchQueue.global().async {
thumbnailRequest.failure(error)
}
@ -146,8 +138,6 @@ private struct OWSThumbnailRequest {
return OWSLoadedThumbnail(image: image, filePath: thumbnailPath)
}
Logger.verbose("Creating thumbnail of size: \(thumbnailRequest.thumbnailDimensionPoints)")
let thumbnailDirPath = (thumbnailPath as NSString).deletingLastPathComponent
guard OWSFileSystem.ensureDirectoryExists(thumbnailDirPath) else {
throw OWSThumbnailError.failure(description: "Could not create attachment's thumbnail directory.")

View File

@ -1,13 +1,8 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import <SignalUtilitiesKit/TSYapDatabaseObject.h>
#import <SessionUtilitiesKit/TSYapDatabaseObject.h>
NS_ASSUME_NONNULL_BEGIN
@class TSAttachmentPointer;
@class TSMessage;
typedef NS_ENUM(NSUInteger, TSAttachmentType) {
TSAttachmentTypeDefault = 0,
@ -45,7 +40,6 @@ typedef NS_ENUM(NSUInteger, TSAttachmentType) {
@property (nonatomic, readonly, nullable) NSString *caption;
@property (nonatomic, nullable) NSString *albumMessageId;
- (nullable TSMessage *)fetchAlbumMessageWithTransaction:(YapDatabaseReadTransaction *)transaction;
// `migrateAlbumMessageId` is only used in the migration to the new multi-attachment message scheme,
// and shouldn't be used as a general purpose setter. Instead, `albumMessageId` should be passed as

View File

@ -1,13 +1,7 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import "TSAttachment.h"
#import "MIMETypeUtil.h"
#import "NSString+SSK.h"
#import "TSAttachmentPointer.h"
#import "TSMessage.h"
#import <SessionProtocolKit/SessionProtocolKit.h>
#import <SignalCoreKit/NSString+OWS.h>
NS_ASSUME_NONNULL_BEGIN
@ -16,9 +10,7 @@ NSUInteger const TSAttachmentSchemaVersion = 4;
@interface TSAttachment ()
@property (nonatomic, readonly) NSUInteger attachmentSchemaVersion;
@property (nonatomic, nullable) NSString *sourceFilename;
@property (nonatomic) NSString *contentType;
@end
@ -35,17 +27,9 @@ NSUInteger const TSAttachmentSchemaVersion = 4;
caption:(nullable NSString *)caption
albumMessageId:(nullable NSString *)albumMessageId
{
OWSAssertDebug(serverId > 0);
if (byteCount <= 0) {
// This will fail with legacy iOS clients which don't upload attachment size.
OWSLogWarn(@"Missing byteCount for attachment with serverId: %lld", serverId);
}
if (contentType.length < 1) {
OWSLogWarn(@"incoming attachment has invalid content type");
contentType = OWSMimeTypeApplicationOctetStream;
}
OWSAssertDebug(contentType.length > 0);
self = [super init];
if (!self) {
@ -73,13 +57,9 @@ NSUInteger const TSAttachmentSchemaVersion = 4;
caption:(nullable NSString *)caption
albumMessageId:(nullable NSString *)albumMessageId
{
OWSAssertDebug(uniqueId.length > 0);
if (contentType.length < 1) {
OWSLogWarn(@"incoming attachment has invalid content type");
contentType = OWSMimeTypeApplicationOctetStream;
}
OWSAssertDebug(contentType.length > 0);
// If saved, this AttachmentPointer would replace the AttachmentStream in the attachments collection.
// However we only use this AttachmentPointer should only be used during the export process so it
@ -108,17 +88,13 @@ NSUInteger const TSAttachmentSchemaVersion = 4;
albumMessageId:(nullable NSString *)albumMessageId
{
if (contentType.length < 1) {
OWSLogWarn(@"outgoing attachment has invalid content type");
contentType = OWSMimeTypeApplicationOctetStream;
}
OWSAssertDebug(contentType.length > 0);
self = [super init];
if (!self) {
return self;
}
OWSLogVerbose(@"init attachment with uniqueId: %@", self.uniqueId);
_contentType = contentType;
_byteCount = byteCount;
@ -135,15 +111,6 @@ NSUInteger const TSAttachmentSchemaVersion = 4;
// that represent downloaded incoming attachments.
- (instancetype)initWithPointer:(TSAttachmentPointer *)pointer
{
if (!pointer.lazyRestoreFragment) {
OWSAssertDebug(pointer.serverId > 0);
if (pointer.byteCount <= 0) {
// This will fail with legacy iOS clients which don't upload attachment size.
OWSLogWarn(@"Missing pointer.byteCount for attachment with serverId: %lld", pointer.serverId);
}
}
OWSAssertDebug(pointer.contentType.length > 0);
// Once saved, this AttachmentStream will replace the AttachmentPointer in the attachments collection.
self = [super initWithUniqueId:pointer.uniqueId];
if (!self) {
@ -156,8 +123,6 @@ NSUInteger const TSAttachmentSchemaVersion = 4;
_sourceFilename = pointer.sourceFilename;
NSString *contentType = pointer.contentType;
if (contentType.length < 1) {
OWSLogWarn(@"incoming attachment has invalid content type");
contentType = OWSMimeTypeApplicationOctetStream;
}
_contentType = contentType;
@ -184,12 +149,9 @@ NSUInteger const TSAttachmentSchemaVersion = 4;
if (!_sourceFilename) {
// renamed _filename to _sourceFilename
_sourceFilename = [coder decodeObjectForKey:@"filename"];
OWSAssertDebug(!_sourceFilename || [_sourceFilename isKindOfClass:[NSString class]]);
}
if (_contentType.length < 1) {
OWSLogWarn(@"legacy attachment has invalid content type");
_contentType = OWSMimeTypeApplicationOctetStream;
}
@ -284,14 +246,6 @@ NSUInteger const TSAttachmentSchemaVersion = 4;
#pragma mark - Relationships
- (nullable TSMessage *)fetchAlbumMessageWithTransaction:(YapDatabaseReadTransaction *)transaction
{
if (self.albumMessageId == nil) {
return nil;
}
return [TSMessage fetchObjectWithUniqueID:self.albumMessageId transaction:transaction];
}
- (void)migrateAlbumMessageId:(NSString *)albumMesssageId
{
_albumMessageId = albumMesssageId;

View File

@ -1,8 +1,4 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import <SignalUtilitiesKit/TSAttachment.h>
#import <SessionMessagingKit/TSAttachment.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@ -39,9 +35,6 @@ typedef NS_ENUM(NSUInteger, TSAttachmentPointerState) {
@property (nonatomic, readonly) CGSize mediaSize;
// Non-nil for attachments which need "lazy backup restore."
- (nullable OWSBackupFragment *)lazyRestoreFragment;
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithServerId:(UInt64)serverId
@ -64,12 +57,6 @@ typedef NS_ENUM(NSUInteger, TSAttachmentPointerState) {
(NSArray<SNProtoAttachmentPointer *> *)attachmentProtos
albumMessage:(TSMessage *)message;
#pragma mark - Update With... Methods
// Marks attachment as needing "lazy backup restore."
- (void)markForLazyRestoreWithFragment:(OWSBackupFragment *)lazyRestoreFragment
transaction:(YapDatabaseReadWriteTransaction *)transaction;
@end
NS_ASSUME_NONNULL_END

View File

@ -1,14 +1,9 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import "TSAttachmentPointer.h"
#import "OWSBackupFragment.h"
#import "TSAttachmentStream.h"
#import <SignalUtilitiesKit/MIMETypeUtil.h>
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SessionUtilitiesKit/MIMETypeUtil.h>
#import <YapDatabase/YapDatabase.h>
#import <YapDatabase/YapDatabaseTransaction.h>
#import <SessionMessagingKit/SessionMessagingKit-Swift.h>
NS_ASSUME_NONNULL_BEGIN
@ -86,8 +81,6 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initForRestoreWithAttachmentStream:(TSAttachmentStream *)attachmentStream
{
OWSAssertDebug(attachmentStream);
self = [super initForRestoreWithUniqueId:attachmentStream.uniqueId
contentType:attachmentStream.contentType
sourceFilename:attachmentStream.sourceFilename
@ -109,21 +102,14 @@ NS_ASSUME_NONNULL_BEGIN
albumMessage:(nullable TSMessage *)albumMessage
{
if (attachmentProto.id < 1) {
OWSFailDebug(@"Invalid attachment id.");
return nil;
}
/*
if (attachmentProto.key.length < 1) {
OWSFailDebug(@"Invalid attachment key.");
return nil;
}
*/
NSString *_Nullable fileName = attachmentProto.fileName;
NSString *_Nullable contentType = attachmentProto.contentType;
if (contentType.length < 1) {
// Content type might not set if the sending client can't
// infer a MIME type from the file extension.
OWSLogWarn(@"Invalid attachment content type.");
NSString *_Nullable fileExtension = [fileName pathExtension].lowercaseString;
if (fileExtension.length > 0) {
contentType = [MIMETypeUtil mimeTypeForFileExtension:fileExtension];
@ -148,11 +134,6 @@ NS_ASSUME_NONNULL_BEGIN
caption = attachmentProto.caption;
}
NSString *_Nullable albumMessageId;
if (albumMessage != nil) {
albumMessageId = albumMessage.uniqueId;
}
CGSize mediaSize = CGSizeZero;
if (attachmentProto.hasWidth && attachmentProto.hasHeight && attachmentProto.width > 0
&& attachmentProto.height > 0) {
@ -166,22 +147,17 @@ NS_ASSUME_NONNULL_BEGIN
contentType:contentType
sourceFilename:fileName
caption:caption
albumMessageId:albumMessageId
albumMessageId:0
attachmentType:attachmentType
mediaSize:mediaSize];
pointer.downloadURL = attachmentProto.url; // Loki
pointer.downloadURL = attachmentProto.url;
return pointer;
}
+ (NSArray<TSAttachmentPointer *> *)attachmentPointersFromProtos:
(NSArray<SNProtoAttachmentPointer *> *)attachmentProtos
+ (NSArray<TSAttachmentPointer *> *)attachmentPointersFromProtos:(NSArray<SNProtoAttachmentPointer *> *)attachmentProtos
albumMessage:(TSMessage *)albumMessage
{
OWSAssertDebug(attachmentProtos);
OWSAssertDebug(albumMessage);
NSMutableArray *attachmentPointers = [NSMutableArray new];
for (SNProtoAttachmentPointer *attachmentProto in attachmentProtos) {
TSAttachmentPointer *_Nullable attachmentPointer =
@ -203,63 +179,13 @@ NS_ASSUME_NONNULL_BEGIN
// Legacy instances of TSAttachmentPointer apparently used the serverId as their
// uniqueId.
if (attachmentSchemaVersion < 2 && self.serverId == 0) {
OWSAssertDebug([self isDecimalNumberText:self.uniqueId]);
if ([self isDecimalNumberText:self.uniqueId]) {
// For legacy instances, try to parse the serverId from the uniqueId.
self.serverId = (UInt64)[self.uniqueId integerValue];
} else {
OWSLogError(@"invalid legacy attachment uniqueId: %@.", self.uniqueId);
}
}
}
- (nullable OWSBackupFragment *)lazyRestoreFragment
{
if (!self.lazyRestoreFragmentId) {
return nil;
}
OWSBackupFragment *_Nullable backupFragment =
[OWSBackupFragment fetchObjectWithUniqueID:self.lazyRestoreFragmentId];
OWSAssertDebug(backupFragment);
return backupFragment;
}
#pragma mark - Update With... Methods
- (void)markForLazyRestoreWithFragment:(OWSBackupFragment *)lazyRestoreFragment
transaction:(YapDatabaseReadWriteTransaction *)transaction
{
OWSAssertDebug(lazyRestoreFragment);
OWSAssertDebug(transaction);
if (!lazyRestoreFragment.uniqueId) {
// If metadata hasn't been saved yet, save now.
[lazyRestoreFragment saveWithTransaction:transaction];
OWSAssertDebug(lazyRestoreFragment.uniqueId);
}
[self applyChangeToSelfAndLatestCopy:transaction
changeBlock:^(TSAttachmentPointer *attachment) {
[attachment setLazyRestoreFragmentId:lazyRestoreFragment.uniqueId];
}];
}
- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
#ifdef DEBUG
if (self.uniqueId.length > 0) {
id _Nullable oldObject = [transaction objectForKey:self.uniqueId inCollection:TSAttachment.collection];
if ([oldObject isKindOfClass:[TSAttachmentStream class]]) {
OWSFailDebug(@"We should never overwrite a TSAttachmentStream with a TSAttachmentPointer.");
}
} else {
OWSFailDebug(@"Missing uniqueId.");
}
#endif
[super saveWithTransaction:transaction];
}
@end
NS_ASSUME_NONNULL_END

View File

@ -1,9 +1,5 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import <SignalUtilitiesKit/DataSource.h>
#import <SignalUtilitiesKit/TSAttachment.h>
#import <SessionUtilitiesKit/DataSource.h>
#import <SessionMessagingKit/TSAttachment.h>
#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
@ -19,7 +15,7 @@ NS_ASSUME_NONNULL_BEGIN
typedef void (^OWSThumbnailSuccess)(UIImage *image);
typedef void (^OWSThumbnailFailure)(void);
@interface TSAttachmentStream : TSAttachment <SNAttachmentStream>
@interface TSAttachmentStream : TSAttachment
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithContentType:(NSString *)contentType

View File

@ -1,16 +1,11 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import "TSAttachmentStream.h"
#import "MIMETypeUtil.h"
#import "NSData+Image.h"
#import "OWSFileSystem.h"
#import "TSAttachmentPointer.h"
#import <AVFoundation/AVFoundation.h>
#import <SignalCoreKit/Threading.h>
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <YapDatabase/YapDatabase.h>
#import <SessionUtilitiesKit/SessionUtilitiesKit.h>
#import <SessionMessagingKit/SessionMessagingKit-Swift.h>
NS_ASSUME_NONNULL_BEGIN
@ -149,21 +144,17 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
sourceFilename:self.sourceFilename
inFolder:attachmentsFolder];
if (!filePath) {
OWSFailDebug(@"Could not generate path for attachment.");
return;
}
if (![filePath hasPrefix:attachmentsFolder]) {
OWSFailDebug(@"Attachment paths should all be in the attachments folder.");
return;
}
NSString *localRelativeFilePath = [filePath substringFromIndex:attachmentsFolder.length];
if (localRelativeFilePath.length < 1) {
OWSFailDebug(@"Empty local relative attachment paths.");
return;
}
self.localRelativeFilePath = localRelativeFilePath;
OWSAssertDebug(self.originalFilePath);
}
#pragma mark - File Management
@ -173,7 +164,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
*error = nil;
NSString *_Nullable filePath = self.originalFilePath;
if (!filePath) {
OWSFailDebug(@"Missing path for attachment.");
return nil;
}
return [NSData dataWithContentsOfFile:filePath options:0 error:error];
@ -181,28 +171,20 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (BOOL)writeData:(NSData *)data error:(NSError **)error
{
OWSAssertDebug(data);
*error = nil;
NSString *_Nullable filePath = self.originalFilePath;
if (!filePath) {
OWSFailDebug(@"Missing path for attachment.");
return NO;
}
OWSLogDebug(@"Writing attachment to file: %@", filePath);
return [data writeToFile:filePath options:0 error:error];
}
- (BOOL)writeDataSource:(DataSource *)dataSource
{
OWSAssertDebug(dataSource);
NSString *_Nullable filePath = self.originalFilePath;
if (!filePath) {
OWSFailDebug(@"Missing path for attachment.");
return NO;
}
OWSLogDebug(@"Writing attachment to file: %@", filePath);
return [dataSource writeToPath:filePath];
}
@ -218,8 +200,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
+ (nullable NSError *)migrateToSharedData
{
OWSLogInfo(@"");
return [OWSFileSystem moveAppFilePath:self.legacyAttachmentsDirPath
sharedDataFilePath:self.sharedDataAttachmentsDirPath];
}
@ -239,7 +219,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (nullable NSString *)originalFilePath
{
if (!self.localRelativeFilePath) {
OWSFailDebug(@"Attachment missing local file path.");
return nil;
}
@ -250,7 +229,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
{
NSString *filePath = self.originalFilePath;
if (!filePath) {
OWSFailDebug(@"Attachment missing local file path.");
return nil;
}
@ -268,7 +246,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (NSString *)thumbnailsDirPath
{
if (!self.localRelativeFilePath) {
OWSFailDebug(@"Attachment missing local file path.");
return nil;
}
@ -288,7 +265,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
{
NSString *_Nullable filePath = self.originalFilePath;
if (!filePath) {
OWSFailDebug(@"Missing path for attachment.");
return nil;
}
return [NSURL fileURLWithPath:filePath];
@ -300,30 +276,19 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
NSString *thumbnailsDirPath = self.thumbnailsDirPath;
if ([[NSFileManager defaultManager] fileExistsAtPath:thumbnailsDirPath]) {
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:thumbnailsDirPath error:&error];
if (error || !success) {
OWSLogError(@"remove thumbnails dir failed with: %@", error);
}
[[NSFileManager defaultManager] removeItemAtPath:thumbnailsDirPath error:&error];
}
NSString *_Nullable legacyThumbnailPath = self.legacyThumbnailPath;
if (legacyThumbnailPath) {
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:legacyThumbnailPath error:&error];
if (error || !success) {
OWSLogError(@"remove legacy thumbnail failed with: %@", error);
}
[[NSFileManager defaultManager] removeItemAtPath:legacyThumbnailPath error:&error];
}
NSString *_Nullable filePath = self.originalFilePath;
if (!filePath) {
OWSFailDebug(@"Missing path for attachment.");
return;
}
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
if (error || !success) {
OWSLogError(@"remove file failed with: %@", error);
}
[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
}
- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
@ -353,13 +318,10 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (BOOL)isValidImage
{
OWSAssertDebug(self.isImage || self.isAnimated);
BOOL result;
BOOL didUpdateCache = NO;
@synchronized(self) {
if (!self.isValidImageCached) {
OWSLogVerbose(@"Updating isValidImageCached.");
self.isValidImageCached = @([NSData ows_isValidImageAtPath:self.originalFilePath
mimeType:self.contentType]);
didUpdateCache = YES;
@ -378,13 +340,10 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (BOOL)isValidVideo
{
OWSAssertDebug(self.isVideo);
BOOL result;
BOOL didUpdateCache = NO;
@synchronized(self) {
if (!self.isValidVideoCached) {
OWSLogVerbose(@"Updating isValidVideoCached.");
self.isValidVideoCached = @([OWSMediaUtils isValidVideoWithPath:self.originalFilePath]);
didUpdateCache = YES;
}
@ -423,16 +382,13 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (nullable NSData *)validStillImageData
{
if ([self isVideo]) {
OWSFailDebug(@"isVideo was unexpectedly true");
return nil;
}
if ([self isAnimated]) {
OWSFailDebug(@"isAnimated was unexpectedly true");
return nil;
}
if (![NSData ows_isValidImageAtPath:self.originalFilePath mimeType:self.contentType]) {
OWSFailDebug(@"skipping invalid image");
return nil;
}
@ -452,7 +408,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
maxDimension:ThumbnailDimensionPointsLarge()
error:&error];
if (error || !image) {
OWSLogError(@"Could not create video still: %@.", error);
return nil;
}
return image;
@ -468,15 +423,11 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
[fileManager contentsOfDirectoryAtURL:fileURL includingPropertiesForKeys:nil options:0 error:&error];
if (error) {
OWSFailDebug(@"failed to get contents of attachments folder: %@ with error: %@", self.attachmentsFolder, error);
return;
}
for (NSURL *url in contents) {
[fileManager removeItemAtURL:url error:&error];
if (error) {
OWSFailDebug(@"failed to remove item at path: %@ with error: %@", url, error);
}
}
}
@ -529,8 +480,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (CGSize)cachedMediaSize
{
OWSAssertDebug(self.shouldHaveImageSize);
@synchronized(self) {
if (self.cachedImageWidth && self.cachedImageHeight) {
return CGSizeMake(self.cachedImageWidth.floatValue, self.cachedImageHeight.floatValue);
@ -544,8 +493,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (void)applyChangeAsyncToLatestCopyWithChangeBlock:(void (^)(TSAttachmentStream *))changeBlock
{
OWSAssertDebug(changeBlock);
[LKStorage writeWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
NSString *collection = [TSAttachmentStream collection];
TSAttachmentStream *latestInstance = [transaction objectForKey:self.uniqueId inCollection:collection];
@ -555,9 +502,8 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
// _very_ rare.
//
// An exception is incoming group avatar updates which we don't ever save.
OWSLogWarn(@"Attachment not yet saved.");
} else if (![latestInstance isKindOfClass:[TSAttachmentStream class]]) {
OWSFailDebug(@"Attachment has unexpected type: %@", latestInstance.class);
// Shouldn't occur
} else {
changeBlock(latestInstance);
@ -570,9 +516,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (CGFloat)calculateAudioDurationSeconds
{
OWSAssertIsOnMainThread();
OWSAssertDebug([self isAudio]);
NSError *error;
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.originalMediaURL error:&error];
if (error && [error.domain isEqualToString:NSOSStatusErrorDomain]
@ -583,15 +526,12 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
if (!error) {
return (CGFloat)[audioPlayer duration];
} else {
OWSLogError(@"Could not find audio duration: %@", self.originalMediaURL);
return 0;
}
}
- (CGFloat)audioDurationSeconds
{
OWSAssertIsOnMainThread();
if (self.cachedAudioDurationSeconds) {
return self.cachedAudioDurationSeconds.floatValue;
}
@ -686,7 +626,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
if ([[NSFileManager defaultManager] fileExistsAtPath:thumbnailPath]) {
UIImage *_Nullable image = [UIImage imageWithContentsOfFile:thumbnailPath];
if (!image) {
OWSFailDebug(@"couldn't load image.");
// Any time we return nil from this method we have to call the failure handler
// or else the caller waits for an async thumbnail
failure();
@ -699,7 +638,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
thumbnailDimensionPoints:thumbnailDimensionPoints
success:success
failure:^(NSError *error) {
OWSLogError(@"Failed to create thumbnail: %@", error);
failure();
}];
return nil;
@ -737,7 +675,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
{
OWSLoadedThumbnail *_Nullable loadedThumbnail = [self loadedThumbnailSmallSync];
if (!loadedThumbnail) {
OWSLogInfo(@"Couldn't load small thumbnail sync.");
return nil;
}
return loadedThumbnail.image;
@ -747,13 +684,11 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
{
OWSLoadedThumbnail *_Nullable loadedThumbnail = [self loadedThumbnailSmallSync];
if (!loadedThumbnail) {
OWSLogInfo(@"Couldn't load small thumbnail sync.");
return nil;
}
NSError *error;
NSData *_Nullable data = [loadedThumbnail dataAndReturnError:&error];
if (error || !data) {
OWSFailDebug(@"Couldn't load thumbnail data: %@", error);
return nil;
}
return data;
@ -769,7 +704,7 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
NSArray<NSString *> *_Nullable fileNames =
[[NSFileManager defaultManager] contentsOfDirectoryAtPath:thumbnailsDirPath error:&error];
if (error || !fileNames) {
OWSFailDebug(@"contentsOfDirectoryAtPath failed with error: %@", error);
// Do nothing
} else {
for (NSString *fileName in fileNames) {
NSString *filePath = [thumbnailsDirPath stringByAppendingPathComponent:fileName];
@ -812,7 +747,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
NSError *error;
BOOL success = [thumbnailAttachment writeData:thumbnailData error:&error];
if (!success || error) {
OWSLogError(@"Couldn't copy attachment data for message sent to self: %@.", error);
return nil;
}
@ -823,14 +757,11 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
+ (nullable SNProtoAttachmentPointer *)buildProtoForAttachmentId:(nullable NSString *)attachmentId
{
OWSAssertDebug(attachmentId.length > 0);
// TODO we should past in a transaction, rather than sneakily generate one in `fetch...` to make sure we're
// getting a consistent view in the message sending process. A brief glance shows it touches quite a bit of code,
// but should be straight forward.
TSAttachment *attachment = [TSAttachmentStream fetchObjectWithUniqueID:attachmentId];
if (![attachment isKindOfClass:[TSAttachmentStream class]]) {
OWSLogError(@"Unexpected type for attachment builder: %@", attachment);
return nil;
}
@ -843,10 +774,8 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
{
SNProtoAttachmentPointerBuilder *builder = [SNProtoAttachmentPointer builderWithId:self.serverId];
OWSAssertDebug(self.contentType.length > 0);
builder.contentType = self.contentType;
OWSLogVerbose(@"Sending attachment with filename: '%@'", self.sourceFilename);
if (self.sourceFilename.length > 0) {
builder.fileName = self.sourceFilename;
}
@ -876,7 +805,6 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
NSError *error;
SNProtoAttachmentPointer *_Nullable attachmentProto = [builder buildAndReturnError:&error];
if (error || !attachmentProto) {
OWSFailDebug(@"could not build protobuf: %@", error);
return nil;
}
return attachmentProto;

View File

@ -16,7 +16,8 @@ public extension VisibleMessage {
public var url: String?
public var isValid: Bool {
fileName != nil && contentType != nil && key != nil && digest != nil && kind != nil && size != nil && sizeInBytes != nil && url != nil
// key and digest can be nil for open group attachments
fileName != nil && contentType != nil && kind != nil && size != nil && sizeInBytes != nil && url != nil
}
public enum Kind : String {
@ -50,7 +51,33 @@ public extension VisibleMessage {
}
public static func fromProto(_ proto: SNProtoAttachmentPointer) -> Attachment? {
preconditionFailure("Use MessageReceiverDelegate.parseAttachments(from:) instead.")
let result = Attachment()
result.fileName = proto.fileName
func inferContentType() -> String {
guard let fileName = result.fileName, let fileExtension = URL(string: fileName)?.pathExtension else { return OWSMimeTypeApplicationOctetStream }
return MIMETypeUtil.mimeType(forFileExtension: fileExtension) ?? OWSMimeTypeApplicationOctetStream
}
result.contentType = proto.contentType ?? inferContentType()
result.key = proto.key
result.digest = proto.digest
let kind: VisibleMessage.Attachment.Kind
if proto.hasFlags && (proto.flags & UInt32(SNProtoAttachmentPointer.SNProtoAttachmentPointerFlags.voiceMessage.rawValue)) > 0 {
kind = .voiceMessage
} else {
kind = .generic
}
result.kind = kind
result.caption = proto.hasCaption ? proto.caption : nil
let size: CGSize
if proto.hasWidth && proto.width > 0 && proto.hasHeight && proto.height > 0 {
size = CGSize(width: Int(proto.width), height: Int(proto.height))
} else {
size = CGSize.zero
}
result.size = size
result.sizeInBytes = proto.size > 0 ? UInt(proto.size) : nil
result.url = proto.url
return result
}
public func toProto() -> SNProtoDataMessageQuote? {

View File

@ -2,3 +2,7 @@
FOUNDATION_EXPORT double SessionMessagingKitVersionNumber;
FOUNDATION_EXPORT const unsigned char SessionMessagingKitVersionString[];
#import <SessionMessagingKit/TSAttachment.h>
#import <SessionMessagingKit/TSAttachmentPointer.h>
#import <SessionMessagingKit/TSAttachmentStream.h>

View File

@ -74,8 +74,6 @@ internal enum MessageReceiver {
// Parse the message
let message: Message? = {
if let readReceipt = ReadReceipt.fromProto(proto) { return readReceipt }
if let sessionRequest = SessionRequest.fromProto(proto) { return sessionRequest }
if let nullMessage = NullMessage.fromProto(proto) { return nullMessage }
if let typingIndicator = TypingIndicator.fromProto(proto) { return typingIndicator }
if let closedGroupUpdate = ClosedGroupUpdate.fromProto(proto) { return closedGroupUpdate }
if let expirationTimerUpdate = ExpirationTimerUpdate.fromProto(proto) { return expirationTimerUpdate }
@ -99,8 +97,6 @@ internal enum MessageReceiver {
internal static func handle(_ message: Message, associatedWithProto proto: SNProtoContent, using transaction: Any) throws {
switch message {
case let message as ReadReceipt: handleReadReceipt(message, using: transaction)
case let message as SessionRequest: handleSessionRequest(message, using: transaction)
case let message as NullMessage: handleNullMessage(message, using: transaction)
case let message as TypingIndicator: handleTypingIndicator(message, using: transaction)
case let message as ClosedGroupUpdate: handleClosedGroupUpdate(message, using: transaction)
case let message as ExpirationTimerUpdate: handleExpirationTimerUpdate(message, using: transaction)
@ -113,14 +109,6 @@ internal enum MessageReceiver {
Configuration.shared.messageReceiverDelegate.markMessagesAsRead(message.timestamps!, from: message.sender!, at: message.receivedTimestamp!)
}
private static func handleSessionRequest(_ message: SessionRequest, using transaction: Any) {
// We might not need this anymore
}
private static func handleNullMessage(_ message: NullMessage, using transaction: Any) {
// We might not need this anymore
}
private static func handleTypingIndicator(_ message: TypingIndicator, using transaction: Any) {
let delegate = Configuration.shared.messageReceiverDelegate
switch message.kind! {
@ -152,8 +140,22 @@ internal enum MessageReceiver {
let delegate = Configuration.shared.messageReceiverDelegate
let storage = Configuration.shared.storage
// Handle attachments
let attachments = delegate.parseAttachments(from: proto.dataMessage!.attachments)
message.attachmentIDs = storage.save(attachments, using: transaction)
let attachments: [VisibleMessage.Attachment] = proto.dataMessage!.attachments.compactMap { proto in
guard let attachment = VisibleMessage.Attachment.fromProto(proto) else { return nil }
return attachment.isValid ? attachment : nil
}
let attachmentIDs = storage.save(attachments, using: transaction)
message.attachmentIDs = attachmentIDs
storage.withAsync({ transaction in
attachmentIDs.forEach { attachmentID in
let downloadJob = AttachmentDownloadJob(attachmentID: attachmentID)
if CurrentAppContext().isMainAppAndActive {
JobQueue.shared.add(downloadJob, using: transaction)
} else {
JobQueue.shared.addWithoutExecuting(downloadJob, using: transaction)
}
}
}, completion: { })
// Update profile if needed
if let profile = message.profile {
delegate.updateProfile(for: message.sender!, from: profile, using: transaction)

View File

@ -14,5 +14,4 @@ public protocol MessageReceiverDelegate {
func handleGroupUpdate(_ message: ClosedGroupUpdate, using transaction: Any)
func handleSenderKeyRequest(_ message: ClosedGroupUpdate, using transaction: Any)
func handleSenderKey(_ message: ClosedGroupUpdate, using transaction: Any)
func parseAttachments(from protos: [SNProtoAttachmentPointer]) -> [VisibleMessage.Attachment]
}

View File

@ -7,13 +7,9 @@ internal extension MessageSender {
let storage = Configuration.shared.signalStorage
let cipher = try SMKSecretSessionCipher(sessionResetImplementation: Configuration.shared.sessionRestorationImplementation,
sessionStore: storage, preKeyStore: storage, signedPreKeyStore: storage, identityStore: Configuration.shared.identityKeyStore)
let useFallbackEncryption: Bool = {
if (message is SessionRequest) { return true }
return !storage.containsSession(publicKey, deviceId: 1, protocolContext: transaction)
}()
let certificate = Configuration.shared.storage.getSenderCertificate(for: publicKey)
return try cipher.throwswrapped_encryptMessage(recipientPublicKey: publicKey, deviceID: 1, paddedPlaintext: (plaintext as NSData).paddedMessageBody(),
senderCertificate: certificate, protocolContext: transaction, useFallbackSessionCipher: useFallbackEncryption)
senderCertificate: certificate, protocolContext: transaction, useFallbackSessionCipher: true)
}
static func encryptWithSharedSenderKeys(_ plaintext: Data, for groupPublicKey: String, using transaction: Any) throws -> Data {

View File

@ -138,11 +138,14 @@ public final class MessageSender : NSObject {
NotificationCenter.default.post(name: .messageSent, object: NSNumber(value: message.sentTimestamp!))
}
let notifyPNServerJob = NotifyPNServerJob(message: snodeMessage)
storage.with { transaction in
storage.withAsync({ transaction in
JobQueue.shared.add(notifyPNServerJob, using: transaction)
}
}, completion: { })
}
let _ = promise.catch(on: DispatchQueue.main) { _ in
Configuration.shared.storage.withAsync({ transaction in
Configuration.shared.messageSenderDelegate.handleFailedMessageSend(message, using: transaction)
}, completion: { })
if case .contact(_) = destination {
NotificationCenter.default.post(name: .messageSendingFailed, object: NSNumber(value: message.sentTimestamp!))
}

View File

@ -2,4 +2,5 @@
public protocol MessageSenderDelegate {
func handleSuccessfulMessageSend(_ message: Message, using transaction: Any)
func handleFailedMessageSend(_ message: Message, using transaction: Any)
}

View File

@ -1,12 +0,0 @@
@objc(SNAttachmentStream)
public protocol AttachmentStream {
@objc var encryptionKey: Data { get set }
@objc var digest: Data { get set }
@objc var serverId: UInt64 { get set }
@objc var isUploaded: Bool { get set }
@objc var downloadURL: String { get set }
@objc func readDataFromFile() throws -> Data
@objc func save()
}

View File

@ -133,11 +133,11 @@ public class DotNetAPI : NSObject {
}
@objc(uploadAttachment:withID:toServer:)
public static func objc_uploadAttachment(_ attachment: AttachmentStream, with attachmentID: String, to server: String) -> AnyPromise {
public static func objc_uploadAttachment(_ attachment: TSAttachmentStream, with attachmentID: String, to server: String) -> AnyPromise {
return AnyPromise.from(uploadAttachment(attachment, with: attachmentID, to: server))
}
public static func uploadAttachment(_ attachment: AttachmentStream, with attachmentID: String, to server: String) -> Promise<Void> {
public static func uploadAttachment(_ attachment: TSAttachmentStream, with attachmentID: String, to server: String) -> Promise<Void> {
let isEncryptionRequired = (server == FileServerAPI.server)
return Promise<Void>() { seal in
func proceed(with token: String) {

View File

@ -19,7 +19,7 @@
#import <SignalUtilitiesKit/UIFont+OWS.h>
#import <SignalUtilitiesKit/UIView+OWS.h>
#import <SignalUtilitiesKit/VersionMigrations.h>
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/AppReadiness.h>
#import <SignalUtilitiesKit/AppVersion.h>
#import <SignalUtilitiesKit/OWSMath.h>

View File

@ -5,7 +5,7 @@
#import "SAEScreenLockViewController.h"
#import "UIColor+OWS.h"
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -2,7 +2,7 @@
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -1,7 +1,3 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -1,7 +1,3 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "AppContext.h"
NS_ASSUME_NONNULL_BEGIN
@ -27,8 +23,6 @@ static id<AppContext> currentAppContext = nil;
id<AppContext> CurrentAppContext(void)
{
OWSCAssertDebug(currentAppContext);
return currentAppContext;
}
@ -38,8 +32,6 @@ void SetCurrentAppContext(id<AppContext> appContext)
//
// App extensions may be opened multiple times in the same process,
// so statics will persist.
OWSCAssertDebug(!currentAppContext || !currentAppContext.isMainApp);
currentAppContext = appContext;
}
@ -52,8 +44,6 @@ void ClearCurrentAppContextForTests()
void ExitShareExtension(void)
{
OWSLogInfo(@"ExitShareExtension");
[DDLog flushLog];
exit(0);
}

View File

@ -0,0 +1,20 @@
@objc(SNConfiguration)
public final class Configuration : NSObject {
@objc public let owsPrimaryStorage: OWSPrimaryStorageProtocol
public let maxFileSize: UInt
@objc public static var shared: Configuration!
fileprivate init(owsPrimaryStorage: OWSPrimaryStorageProtocol, maxFileSize: UInt) {
self.owsPrimaryStorage = owsPrimaryStorage
self.maxFileSize = maxFileSize
}
}
public enum SessionUtilitiesKit { // Just to make the external API nice
public static func configure(owsPrimaryStorage: OWSPrimaryStorageProtocol, maxFileSize: UInt) {
Configuration.shared = Configuration(owsPrimaryStorage: owsPrimaryStorage, maxFileSize: maxFileSize)
}
}

View File

@ -1,7 +1,3 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -1,13 +1,9 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import "DataSource.h"
#import "MIMETypeUtil.h"
#import "NSData+Image.h"
#import "OWSFileSystem.h"
#import <SignalCoreKit/NSString+OWS.h>
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SessionUtilitiesKit/SessionUtilitiesKit-Swift.h>
NS_ASSUME_NONNULL_BEGIN
@ -33,31 +29,26 @@ NS_ASSUME_NONNULL_BEGIN
- (NSData *)data
{
OWSAbstractMethod();
return nil;
}
- (nullable NSURL *)dataUrl
{
OWSAbstractMethod();
return nil;
}
- (nullable NSString *)dataPathIfOnDisk
{
OWSAbstractMethod();
return nil;
}
- (NSUInteger)dataLength
{
OWSAbstractMethod();
return 0;
}
- (BOOL)writeToPath:(NSString *)dstFilePath
{
OWSAbstractMethod();
return NO;
}
@ -87,8 +78,6 @@ NS_ASSUME_NONNULL_BEGIN
// Returns the MIME type, if known.
- (nullable NSString *)mimeType
{
OWSAbstractMethod();
return nil;
}
@ -118,10 +107,7 @@ NS_ASSUME_NONNULL_BEGIN
if (filePath) {
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error;
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
if (!success || error) {
OWSCFailDebug(@"DataSourceValue could not delete file: %@, %@", filePath, error);
}
[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
});
}
}
@ -130,8 +116,6 @@ NS_ASSUME_NONNULL_BEGIN
+ (nullable DataSource *)dataSourceWithData:(NSData *)data
fileExtension:(NSString *)fileExtension
{
OWSAssertDebug(data);
if (!data) {
return nil;
}
@ -172,8 +156,6 @@ NS_ASSUME_NONNULL_BEGIN
- (NSData *)data
{
OWSAssertDebug(self.dataValue);
return self.dataValue;
}
@ -185,17 +167,12 @@ NS_ASSUME_NONNULL_BEGIN
- (nullable NSString *)dataPath
{
OWSAssertDebug(self.dataValue);
@synchronized(self)
{
if (!self.cachedFilePath) {
NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:self.fileExtension];
if ([self writeToPath:filePath]) {
self.cachedFilePath = filePath;
} else {
OWSLogDebug(@"Could not write data to disk: %@", self.fileExtension);
OWSFailDebug(@"Could not write data to disk.");
}
}
@ -210,21 +187,15 @@ NS_ASSUME_NONNULL_BEGIN
- (NSUInteger)dataLength
{
OWSAssertDebug(self.dataValue);
return self.dataValue.length;
}
- (BOOL)writeToPath:(NSString *)dstFilePath
{
OWSAssertDebug(self.dataValue);
NSData *dataCopy = self.dataValue;
BOOL success = [dataCopy writeToFile:dstFilePath atomically:YES];
if (!success) {
OWSLogDebug(@"Could not write data to disk: %@", dstFilePath);
OWSFailDebug(@"Could not write data to disk.");
return NO;
} else {
return YES;
@ -261,10 +232,7 @@ NS_ASSUME_NONNULL_BEGIN
if (filePath) {
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error;
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
if (!success || error) {
OWSCFailDebug(@"DataSourcePath could not delete file: %@, %@", filePath, error);
}
[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
});
}
}
@ -272,8 +240,6 @@ NS_ASSUME_NONNULL_BEGIN
+ (nullable DataSource *)dataSourceWithURL:(NSURL *)fileUrl shouldDeleteOnDeallocation:(BOOL)shouldDeleteOnDeallocation
{
OWSAssertDebug(fileUrl);
if (!fileUrl || ![fileUrl isFileURL]) {
return nil;
}
@ -286,8 +252,6 @@ NS_ASSUME_NONNULL_BEGIN
+ (nullable DataSource *)dataSourceWithFilePath:(NSString *)filePath
shouldDeleteOnDeallocation:(BOOL)shouldDeleteOnDeallocation
{
OWSAssertDebug(filePath);
if (!filePath) {
return nil;
}
@ -300,30 +264,17 @@ NS_ASSUME_NONNULL_BEGIN
- (void)setFilePath:(NSString *)filePath
{
OWSAssertDebug(filePath.length > 0);
#ifdef DEBUG
BOOL isDirectory;
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory];
OWSAssertDebug(exists);
OWSAssertDebug(!isDirectory);
#endif
_filePath = filePath;
}
- (NSData *)data
{
OWSAssertDebug(self.filePath);
@synchronized(self)
{
if (!self.cachedData) {
self.cachedData = [NSData dataWithContentsOfFile:self.filePath];
}
if (!self.cachedData) {
OWSLogDebug(@"Could not read data from disk: %@", self.filePath);
OWSFailDebug(@"Could not read data from disk.");
self.cachedData = [NSData new];
}
return self.cachedData;
@ -332,29 +283,21 @@ NS_ASSUME_NONNULL_BEGIN
- (nullable NSURL *)dataUrl
{
OWSAssertDebug(self.filePath);
return [NSURL fileURLWithPath:self.filePath];
}
- (nullable NSString *)dataPath
{
OWSAssertDebug(self.filePath);
return self.filePath;
}
- (nullable NSString *)dataPathIfOnDisk
{
OWSAssertDebug(self.filePath);
return self.filePath;
}
- (NSUInteger)dataLength
{
OWSAssertDebug(self.filePath);
@synchronized(self)
{
if (!self.cachedDataLength) {
@ -362,8 +305,6 @@ NS_ASSUME_NONNULL_BEGIN
NSDictionary<NSFileAttributeKey, id> *_Nullable attributes =
[[NSFileManager defaultManager] attributesOfItemAtPath:self.filePath error:&error];
if (!attributes || error) {
OWSLogDebug(@"Could not read data length from disk: %@, %@", self.filePath, error);
OWSFailDebug(@"Could not read data length from disk with error: %@", error);
self.cachedDataLength = @(0);
} else {
uint64_t fileSize = [attributes fileSize];
@ -376,13 +317,9 @@ NS_ASSUME_NONNULL_BEGIN
- (BOOL)writeToPath:(NSString *)dstFilePath
{
OWSAssertDebug(self.filePath);
NSError *error;
BOOL success = [[NSFileManager defaultManager] copyItemAtPath:self.filePath toPath:dstFilePath error:&error];
if (!success || error) {
OWSLogDebug(@"Could not write data from path: %@, to path: %@, %@", self.filePath, dstFilePath, error);
OWSFailDebug(@"Could not write data with error: %@", error);
return NO;
} else {
return YES;

View File

@ -1,7 +1,3 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -1,10 +1,5 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "MIMETypeUtil.h"
#import "OWSFileSystem.h"
#import <SessionProtocolKit/SessionProtocolKit.h>
#if TARGET_OS_IPHONE
#import <MobileCoreServices/MobileCoreServices.h>
@ -382,7 +377,6 @@ NSString *const kSyncMessageFileExtension = @"bin";
return [self filePathForData:uniqueId withFileExtension:fileExtension inFolder:folder];
}
OWSLogError(@"Got asked for path of file %@ which is unsupported", contentType);
// Use a fallback file extension.
return [self filePathForData:uniqueId withFileExtension:kDefaultFileExtension inFolder:folder];
}
@ -475,10 +469,7 @@ NSString *const kSyncMessageFileExtension = @"bin";
NSMutableSet<NSString *> *result = [NSMutableSet new];
for (NSString *mimeType in mimeTypes) {
NSString *_Nullable utiType = [self utiTypeForMIMEType:mimeType];
if (!utiType) {
OWSFailDebug(@"unknown utiType for mimetype: %@", mimeType);
continue;
}
if (!utiType) { continue; }
[result addObject:utiType];
}
return result;
@ -1593,8 +1584,6 @@ NSString *const kSyncMessageFileExtension = @"bin";
+ (nullable NSString *)mimeTypeForFileExtension:(NSString *)fileExtension
{
OWSAssertDebug(fileExtension.length > 0);
return [self genericExtensionTypesToMIMETypes][fileExtension];
}
@ -2614,8 +2603,6 @@ NSString *const kSyncMessageFileExtension = @"bin";
+ (nullable NSString *)utiTypeForFileExtension:(NSString *)fileExtension
{
OWSAssertDebug(fileExtension.length > 0);
NSString *_Nullable utiType = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(
kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExtension, NULL);
return utiType;

View File

@ -3,6 +3,14 @@
FOUNDATION_EXPORT double SessionUtilitiesKitVersionNumber;
FOUNDATION_EXPORT const unsigned char SessionUtilitiesKitVersionString[];
#import <SessionUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/DataSource.h>
#import <SessionUtilitiesKit/MIMETypeUtil.h>
#import <SessionUtilitiesKit/NSData+Image.h>
#import <SessionUtilitiesKit/NSDate+Timestamp.h>
#import <SessionUtilitiesKit/NSTimer+Proxying.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/TSRequest.h>
#import <SessionUtilitiesKit/TSYapDatabaseObject.h>
#import <SessionUtilitiesKit/UIImage+OWS.h>

View File

@ -1,7 +1,3 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -1,12 +1,8 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import "NSData+Image.h"
#import "MIMETypeUtil.h"
#import "OWSFileSystem.h"
#import <AVFoundation/AVFoundation.h>
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SessionUtilitiesKit/SessionUtilitiesKit-Swift.h>
NS_ASSUME_NONNULL_BEGIN
@ -36,7 +32,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
= (isAnimated ? OWSMediaUtils.kMaxFileSizeAnimatedImage : OWSMediaUtils.kMaxFileSizeImage);
NSUInteger fileSize = self.length;
if (fileSize > kMaxFileSize) {
OWSLogWarn(@"Oversize image.");
return NO;
}
@ -58,35 +53,29 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
mimeType = [MIMETypeUtil mimeTypeForFileExtension:fileExtension];
}
if (mimeType.length < 1) {
OWSLogError(@"Image has unknown MIME type.");
return NO;
}
NSNumber *_Nullable fileSize = [OWSFileSystem fileSizeOfPath:filePath];
if (!fileSize) {
OWSLogError(@"Could not determine file size.");
return NO;
}
BOOL isAnimated = [MIMETypeUtil isSupportedAnimatedMIMEType:mimeType];
if (isAnimated) {
if (fileSize.unsignedIntegerValue > OWSMediaUtils.kMaxFileSizeAnimatedImage) {
OWSLogWarn(@"Oversize animated image.");
return NO;
}
} else if ([MIMETypeUtil isSupportedImageMIMEType:mimeType]) {
if (fileSize.unsignedIntegerValue > OWSMediaUtils.kMaxFileSizeImage) {
OWSLogWarn(@"Oversize still image.");
return NO;
}
} else {
OWSLogError(@"Image has unsupported MIME type.");
return NO;
}
NSError *error = nil;
NSData *_Nullable data = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:&error];
if (!data || error) {
OWSLogError(@"Could not read image data: %@", error);
return NO;
}
@ -95,7 +84,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
}
if (![self ows_hasValidImageDimensionsAtPath:filePath isAnimated:isAnimated]) {
OWSLogError(@"%@ image had invalid dimensions.", self.logTag);
return NO;
}
@ -131,8 +119,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
+ (BOOL)ows_hasValidImageDimensionWithImageSource:(CGImageSourceRef)imageSource isAnimated:(BOOL)isAnimated
{
OWSAssertDebug(imageSource);
NSDictionary *imageProperties
= (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL);
@ -142,14 +128,12 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
NSNumber *widthNumber = imageProperties[(__bridge NSString *)kCGImagePropertyPixelWidth];
if (!widthNumber) {
OWSLogError(@"widthNumber was unexpectedly nil");
return NO;
}
CGFloat width = widthNumber.floatValue;
NSNumber *heightNumber = imageProperties[(__bridge NSString *)kCGImagePropertyPixelHeight];
if (!heightNumber) {
OWSLogError(@"heightNumber was unexpectedly nil");
return NO;
}
CGFloat height = heightNumber.floatValue;
@ -158,7 +142,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
* key is a CFNumberRef. */
NSNumber *depthNumber = imageProperties[(__bridge NSString *)kCGImagePropertyDepth];
if (!depthNumber) {
OWSLogError(@"depthNumber was unexpectedly nil");
return NO;
}
NSUInteger depthBits = depthNumber.unsignedIntegerValue;
@ -169,12 +152,10 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
* The value of this key is CFStringRef. */
NSString *colorModel = imageProperties[(__bridge NSString *)kCGImagePropertyColorModel];
if (!colorModel) {
OWSLogError(@"colorModel was unexpectedly nil");
return NO;
}
if (![colorModel isEqualToString:(__bridge NSString *)kCGImagePropertyColorModelRGB]
&& ![colorModel isEqualToString:(__bridge NSString *)kCGImagePropertyColorModelGray]) {
OWSLogError(@"Invalid colorModel: %@", colorModel);
return NO;
}
@ -188,7 +169,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
CGFloat kMaxBytes = kMaxValidImageDimension * kMaxValidImageDimension * kExpectedBytePerPixel;
CGFloat actualBytes = width * height * bytesPerPixel;
if (actualBytes > kMaxBytes) {
OWSLogWarn(@"invalid dimensions width: %f, height %f, bytesPerPixel: %f", width, height, bytesPerPixel);
return NO;
}
@ -328,7 +308,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
+ (CGSize)imageSizeForFilePath:(NSString *)filePath mimeType:(NSString *)mimeType
{
if (![NSData ows_isValidImageAtPath:filePath mimeType:mimeType]) {
OWSLogError(@"Invalid image.");
return CGSizeZero;
}
NSURL *url = [NSURL fileURLWithPath:filePath];
@ -336,7 +315,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
// With CGImageSource we avoid loading the whole image into memory.
CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
if (!source) {
OWSFailDebug(@"Could not load image: %@", url);
return CGSizeZero;
}
@ -357,8 +335,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
if (orientation) {
imageSize = [self applyImageOrientation:(UIImageOrientation)orientation.intValue toImageSize:imageSize];
}
} else {
OWSFailDebug(@"Could not determine size of image: %@", url);
}
}
CFRelease(source);
@ -390,7 +366,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
// With CGImageSource we avoid loading the whole image into memory.
CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
if (!source) {
OWSFailDebug(@"Could not load image: %@", url);
return NO;
}
@ -407,7 +382,6 @@ typedef NS_ENUM(NSInteger, ImageFormat) {
} else {
// This is not an error; kCGImagePropertyHasAlpha is an optional
// property.
OWSLogWarn(@"Could not determine transparency of image: %@", url);
result = NO;
}
}

View File

@ -1,7 +1,3 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@ -12,6 +8,7 @@ NS_ASSUME_NONNULL_BEGIN
NSString *OWSTemporaryDirectory(void);
NSString *OWSTemporaryDirectoryAccessibleAfterFirstAuth(void);
void ClearOldTemporaryDirectories(void);
void ClearOldTemporaryDirectoriesSync(void);
@interface OWSFileSystem : NSObject
@ -52,7 +49,6 @@ void ClearOldTemporaryDirectories(void);
+ (nullable NSString *)writeDataToTemporaryFile:(NSData *)data fileExtension:(NSString *_Nullable)fileExtension;
+ (nullable NSNumber *)fileSizeOfPath:(NSString *)filePath;
+ (void)logAttributesOfItemAtPathRecursively:(NSString *)path;
@end

View File

@ -1,12 +1,5 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import "OWSFileSystem.h"
#import "OWSError.h"
#import "TSConstants.h"
#import "AppContext.h"
#import <SessionProtocolKit/SessionProtocolKit.h>
NS_ASSUME_NONNULL_BEGIN
@ -29,12 +22,10 @@ NS_ASSUME_NONNULL_BEGIN
for (NSString *relativePath in directoryEnumerator) {
NSString *filePath = [dirPath stringByAppendingPathComponent:relativePath];
OWSLogDebug(@"path: %@ had attributes: %@", filePath, directoryEnumerator.fileAttributes);
success = success && [self protectFileOrFolderAtPath:filePath];
}
OWSLogInfo(@"protected contents at path: %@", path);
return success;
}
@ -46,7 +37,6 @@ NS_ASSUME_NONNULL_BEGIN
+ (BOOL)protectFileOrFolderAtPath:(NSString *)path fileProtectionType:(NSFileProtectionType)fileProtectionType
{
OWSLogVerbose(@"protecting file at path: %@", path);
if (![NSFileManager.defaultManager fileExistsAtPath:path]) {
return NO;
}
@ -61,38 +51,11 @@ NS_ASSUME_NONNULL_BEGIN
BOOL success = [ressourceURL setResourceValues:resourcesAttrs error:&error];
if (error || !success) {
OWSFailDebug(@"Could not protect file or folder: %@", error);
return NO;
}
return YES;
}
+ (void)logAttributesOfItemAtPathRecursively:(NSString *)path
{
BOOL isDirectory;
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory];
if (!exists) {
OWSFailDebug(@"error retrieving file attributes for missing file");
return;
}
if (isDirectory) {
NSDirectoryEnumerator *directoryEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:(NSString *)path];
for (NSString *path in directoryEnumerator) {
OWSLogDebug(@"path: %@ has attributes: %@", path, directoryEnumerator.fileAttributes);
}
} else {
NSError *error;
NSDictionary<NSFileAttributeKey, id> *_Nullable attributes =
[[NSFileManager defaultManager] attributesOfItemAtPath:path error:&error];
if (error) {
OWSFailDebug(@"error retrieving file attributes: %@", error);
} else {
OWSLogDebug(@"path: %@ has attributes: %@", path, attributes);
}
}
}
+ (NSString *)appLibraryDirectoryPath
{
NSFileManager *fileManager = [NSFileManager defaultManager];
@ -114,7 +77,6 @@ NS_ASSUME_NONNULL_BEGIN
+ (NSString *)cachesDirectoryPath
{
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
OWSAssertDebug(paths.count >= 1);
return paths[0];
}
@ -128,13 +90,10 @@ NS_ASSUME_NONNULL_BEGIN
NSString *newFilePath =
[[oldFilePath stringByAppendingString:@"."] stringByAppendingString:[NSUUID UUID].UUIDString];
OWSLogInfo(@"Moving file or directory from: %@ to: %@", oldFilePath, newFilePath);
NSError *_Nullable error;
BOOL success = [fileManager moveItemAtPath:oldFilePath toPath:newFilePath error:&error];
if (!success || error) {
OWSLogDebug(@"Could not move file or directory from: %@ to: %@, error: %@", oldFilePath, newFilePath, error);
OWSFailDebug(@"Could not move file or directory with error: %@", error);
return error;
}
return nil;
@ -147,8 +106,6 @@ NS_ASSUME_NONNULL_BEGIN
return nil;
}
OWSLogInfo(@"Moving file or directory from: %@ to: %@", oldFilePath, newFilePath);
if ([fileManager fileExistsAtPath:newFilePath]) {
// If a file/directory already exists at the destination,
// try to move it "aside" by renaming it with an extension.
@ -159,29 +116,17 @@ NS_ASSUME_NONNULL_BEGIN
}
if ([fileManager fileExistsAtPath:newFilePath]) {
OWSLogDebug(
@"Can't move file or directory from: %@ to: %@; destination already exists.", oldFilePath, newFilePath);
OWSFailDebug(@"Can't move file or directory; destination already exists.");
return OWSErrorWithCodeDescription(
OWSErrorCodeMoveFileToSharedDataContainerError, @"Can't move file; destination already exists.");
return [NSError errorWithDomain:@"OWSSignalServiceKitErrorDomain"
code:777412
userInfo:@{ NSLocalizedDescriptionKey : @"Can't move file; destination already exists." }];
}
NSDate *startDate = [NSDate new];
NSError *_Nullable error;
BOOL success = [fileManager moveItemAtPath:oldFilePath toPath:newFilePath error:&error];
if (!success || error) {
OWSLogDebug(@"Could not move file or directory from: %@ to: %@, error: %@", oldFilePath, newFilePath, error);
OWSFailDebug(@"Could not move file or directory with error: %@", error);
return error;
}
OWSLogInfo(@"Moved file or directory in: %f", fabs([startDate timeIntervalSinceNow]));
OWSLogDebug(@"Moved file or directory from: %@ to: %@ in: %f",
oldFilePath,
newFilePath,
fabs([startDate timeIntervalSinceNow]));
// Ensure all files moved have the proper data protection class.
// On large directories this can take a while, so we dispatch async
// since we're in the launch path.
@ -202,11 +147,8 @@ NS_ASSUME_NONNULL_BEGIN
BOOL isDirectory;
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:dirPath isDirectory:&isDirectory];
if (exists) {
OWSAssertDebug(isDirectory);
return [self protectFileOrFolderAtPath:dirPath fileProtectionType:fileProtectionType];
} else {
OWSLogInfo(@"Creating directory at: %@", dirPath);
NSError *error = nil;
[[NSFileManager defaultManager] createDirectoryAtPath:dirPath
@ -214,7 +156,6 @@ NS_ASSUME_NONNULL_BEGIN
attributes:nil
error:&error];
if (error) {
OWSFailDebug(@"Failed to create directory: %@, error: %@", dirPath, error);
return NO;
}
return [self protectFileOrFolderAtPath:dirPath fileProtectionType:fileProtectionType];
@ -229,7 +170,6 @@ NS_ASSUME_NONNULL_BEGIN
} else {
BOOL success = [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
if (!success) {
OWSFailDebug(@"Failed to create file.");
return NO;
}
return [self protectFileOrFolderAtPath:filePath];
@ -241,7 +181,6 @@ NS_ASSUME_NONNULL_BEGIN
NSError *error;
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
if (!success || error) {
OWSLogError(@"Failed to delete file: %@", error.description);
return NO;
}
return YES;
@ -257,13 +196,10 @@ NS_ASSUME_NONNULL_BEGIN
+ (NSArray<NSString *> *_Nullable)allFilesInDirectoryRecursive:(NSString *)dirPath error:(NSError **)error
{
OWSAssertDebug(dirPath.length > 0);
*error = nil;
NSArray<NSString *> *filenames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:error];
if (*error) {
OWSFailDebug(@"could not find files in directory: %@", *error);
return nil;
}
@ -306,13 +242,10 @@ NS_ASSUME_NONNULL_BEGIN
+ (nullable NSString *)writeDataToTemporaryFile:(NSData *)data fileExtension:(NSString *_Nullable)fileExtension
{
OWSAssertDebug(data);
NSString *tempFilePath = [self temporaryFilePathWithFileExtension:fileExtension];
NSError *error;
BOOL success = [data writeToFile:tempFilePath options:NSDataWritingAtomic error:&error];
if (!success || error) {
OWSFailDebug(@"could not write to temporary file: %@", error);
return nil;
}
@ -328,7 +261,6 @@ NS_ASSUME_NONNULL_BEGIN
unsigned long long fileSize =
[[fileManager attributesOfItemAtPath:filePath error:&error][NSFileSize] unsignedLongLongValue];
if (error) {
OWSLogError(@"Couldn't fetch file size[%@]: %@", filePath, error);
return nil;
} else {
return @(fileSize);
@ -346,8 +278,7 @@ NSString *OWSTemporaryDirectory(void)
dispatch_once(&onceToken, ^{
NSString *dirName = [NSString stringWithFormat:@"ows_temp_%@", NSUUID.UUID.UUIDString];
dirPath = [NSTemporaryDirectory() stringByAppendingPathComponent:dirName];
BOOL success = [OWSFileSystem ensureDirectoryExists:dirPath fileProtectionType:NSFileProtectionComplete];
OWSCAssert(success);
[OWSFileSystem ensureDirectoryExists:dirPath fileProtectionType:NSFileProtectionComplete];
});
return dirPath;
}
@ -355,9 +286,8 @@ NSString *OWSTemporaryDirectory(void)
NSString *OWSTemporaryDirectoryAccessibleAfterFirstAuth(void)
{
NSString *dirPath = NSTemporaryDirectory();
BOOL success = [OWSFileSystem ensureDirectoryExists:dirPath
fileProtectionType:NSFileProtectionCompleteUntilFirstUserAuthentication];
OWSCAssert(success);
[OWSFileSystem ensureDirectoryExists:dirPath
fileProtectionType:NSFileProtectionCompleteUntilFirstUserAuthentication];
return dirPath;
}
@ -371,7 +301,6 @@ void ClearOldTemporaryDirectoriesSync(void)
NSError *error;
NSArray<NSString *> *fileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:&error];
if (error) {
OWSCFailDebug(@"contentsOfDirectoryAtPath error: %@", error);
return;
}
for (NSString *fileName in fileNames) {
@ -390,32 +319,28 @@ void ClearOldTemporaryDirectoriesSync(void)
// a) "ows_temp" name prefix.
// b) modified time before app launch time.
if (![fileName hasPrefix:@"ows_temp"]) {
NSError *error;
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:&error];
if (!attributes || error) {
NSError *e;
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:&e];
if (!attributes || e) {
// This is fine; the file may have been deleted since we found it.
OWSLogError(@"Could not get attributes of file or directory at: %@", filePath);
continue;
}
// Don't delete files which were created in the last N minutes.
NSDate *creationDate = attributes.fileModificationDate;
if ([creationDate isAfterDate:thresholdDate]) {
OWSLogInfo(@"Skipping file due to age: %f", fabs([creationDate timeIntervalSinceNow]));
if (creationDate.timeIntervalSince1970 > thresholdDate.timeIntervalSince1970) {
continue;
}
}
OWSLogVerbose(@"Removing temp file or directory: %@", filePath);
if (![OWSFileSystem deleteFile:filePath]) {
// This can happen if the app launches before the phone is unlocked.
// Clean up will occur when app becomes active.
OWSLogWarn(@"Could not delete old temp directory: %@", filePath);
}
}
}
// NOTE: We need to call this method on launch _and_ every time the app becomes active,
// since file protection may prevent it from succeeding in the background.
// since file protection may prevent it from succeeding in the background.
void ClearOldTemporaryDirectories(void)
{
// We use the lowest priority queue for this, and wait N seconds

View File

@ -1,7 +1,3 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
import Foundation
import AVFoundation
@ -16,7 +12,7 @@ public enum OWSMediaError: Error {
}
@objc public class func thumbnail(forImageAtPath path: String, maxDimension: CGFloat) throws -> UIImage {
Logger.verbose("thumbnailing image: \(path)")
SNLog("thumbnailing image: \(path)")
guard FileManager.default.fileExists(atPath: path) else {
throw OWSMediaError.failure(description: "Media file missing.")
@ -34,7 +30,7 @@ public enum OWSMediaError: Error {
}
@objc public class func thumbnail(forVideoAtPath path: String, maxDimension: CGFloat) throws -> UIImage {
Logger.verbose("thumbnailing video: \(path)")
SNLog("thumbnailing video: \(path)")
guard isVideoOfValidContentTypeAndSize(path: path) else {
throw OWSMediaError.failure(description: "Media file has missing or invalid length.")
@ -58,7 +54,7 @@ public enum OWSMediaError: Error {
@objc public class func isValidVideo(path: String) -> Bool {
guard isVideoOfValidContentTypeAndSize(path: path) else {
Logger.error("Media file has missing or invalid length.")
SNLog("Media file has missing or invalid length.")
return false
}
@ -69,21 +65,21 @@ public enum OWSMediaError: Error {
private class func isVideoOfValidContentTypeAndSize(path: String) -> Bool {
guard FileManager.default.fileExists(atPath: path) else {
Logger.error("Media file missing.")
SNLog("Media file missing.")
return false
}
let fileExtension = URL(fileURLWithPath: path).pathExtension
guard let contentType = MIMETypeUtil.mimeType(forFileExtension: fileExtension) else {
Logger.error("Media file has unknown content type.")
SNLog("Media file has unknown content type.")
return false
}
guard MIMETypeUtil.isSupportedVideoMIMEType(contentType) else {
Logger.error("Media file has invalid content type.")
SNLog("Media file has invalid content type.")
return false
}
guard let fileSize = OWSFileSystem.fileSize(ofPath: path) else {
Logger.error("Media file has unknown length.")
SNLog("Media file has unknown length.")
return false
}
return fileSize.uintValue <= kMaxFileSizeVideo
@ -97,11 +93,11 @@ public enum OWSMediaError: Error {
maxTrackSize.height = max(maxTrackSize.height, trackSize.height)
}
if maxTrackSize.width < 1.0 || maxTrackSize.height < 1.0 {
Logger.error("Invalid video size: \(maxTrackSize)")
SNLog("Invalid video size: \(maxTrackSize)")
return false
}
if maxTrackSize.width > kMaxVideoDimensions || maxTrackSize.height > kMaxVideoDimensions {
Logger.error("Invalid video dimensions: \(maxTrackSize)")
SNLog("Invalid video dimensions: \(maxTrackSize)")
return false
}
return true
@ -115,15 +111,15 @@ public enum OWSMediaError: Error {
* https://github.com/signalapp/Signal-Android/blob/master/src/org/thoughtcrime/securesms/mms/PushMediaConstraints.java
*/
@objc
public static var kMaxFileSizeAnimatedImage: UInt { UInt(Double(FileServerAPI.maxFileSize) / FileServerAPI.fileSizeORMultiplier) }
public static var kMaxFileSizeAnimatedImage: UInt { Configuration.shared.maxFileSize }
@objc
public static var kMaxFileSizeImage: UInt { UInt(Double(FileServerAPI.maxFileSize) / FileServerAPI.fileSizeORMultiplier) }
public static var kMaxFileSizeImage: UInt { Configuration.shared.maxFileSize }
@objc
public static var kMaxFileSizeVideo: UInt { UInt(Double(FileServerAPI.maxFileSize) / FileServerAPI.fileSizeORMultiplier) }
public static var kMaxFileSizeVideo: UInt { Configuration.shared.maxFileSize }
@objc
public static var kMaxFileSizeAudio: UInt { UInt(Double(FileServerAPI.maxFileSize) / FileServerAPI.fileSizeORMultiplier) }
public static var kMaxFileSizeAudio: UInt { Configuration.shared.maxFileSize }
@objc
public static var kMaxFileSizeGeneric: UInt { UInt(Double(FileServerAPI.maxFileSize) / FileServerAPI.fileSizeORMultiplier) }
public static var kMaxFileSizeGeneric: UInt { Configuration.shared.maxFileSize }
@objc
public static let kMaxVideoDimensions: CGFloat = 3 * 1024

View File

@ -0,0 +1,7 @@
import YapDatabase
@objc public protocol OWSPrimaryStorageProtocol {
var dbReadConnection: YapDatabaseConnection { get }
var dbReadWriteConnection: YapDatabaseConnection { get }
}

View File

@ -1,4 +1,5 @@
import PromiseKit
import YapDatabase
// Some important notes about YapDatabase:
//
@ -6,10 +7,10 @@ import PromiseKit
// Executing a write transaction from within a write transaction is NOT allowed.
@objc(LKStorage)
public final class Storage : NSObject, SessionMessagingKitStorageProtocol, SessionProtocolKitStorageProtocol, SessionSnodeKitStorageProtocol {
public final class Storage : NSObject {
public static let serialQueue = DispatchQueue(label: "Storage.serialQueue", qos: .userInitiated)
private static var owsStorage: OWSPrimaryStorage { OWSPrimaryStorage.shared() }
private static var owsStorage: OWSPrimaryStorageProtocol { Configuration.shared.owsPrimaryStorage }
@objc public static let shared = Storage()

View File

@ -2,6 +2,8 @@
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <YapDatabase/YapDatabase.h>
#import <Mantle/MTLModel+NSCoding.h>
NS_ASSUME_NONNULL_BEGIN
@ -71,9 +73,6 @@ NS_ASSUME_NONNULL_BEGIN
- (YapDatabaseConnection *)dbReadWriteConnection;
+ (YapDatabaseConnection *)dbReadWriteConnection;
- (OWSPrimaryStorage *)primaryStorage;
+ (OWSPrimaryStorage *)primaryStorage;
/**
* Fetches the object with the provided identifier
*

View File

@ -3,10 +3,8 @@
//
#import "TSYapDatabaseObject.h"
#import "OWSPrimaryStorage.h"
#import "SSKEnvironment.h"
#import <YapDatabase/YapDatabaseTransaction.h>
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SessionUtilitiesKit/SessionUtilitiesKit-Swift.h>
NS_ASSUME_NONNULL_BEGIN
@ -92,11 +90,6 @@ NS_ASSUME_NONNULL_BEGIN
return [[self class] dbReadWriteConnection];
}
- (OWSPrimaryStorage *)primaryStorage
{
return [[self class] primaryStorage];
}
#pragma mark Class Methods
+ (MTLPropertyStorage)storageBehaviorForPropertyWithKey:(NSString *)propertyKey
@ -110,8 +103,6 @@ NS_ASSUME_NONNULL_BEGIN
+ (YapDatabaseConnection *)dbReadConnection
{
OWSJanksUI();
// We use TSYapDatabaseObject's dbReadWriteConnection (not OWSPrimaryStorage's
// dbReadConnection) for consistency, since we tend to [TSYapDatabaseObject
// save] and want to write to the same connection we read from. To get true
@ -122,14 +113,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (YapDatabaseConnection *)dbReadWriteConnection
{
OWSJanksUI();
return SSKEnvironment.shared.objectReadWriteConnection;
}
+ (OWSPrimaryStorage *)primaryStorage
{
return [OWSPrimaryStorage sharedManager];
return SNConfiguration.shared.owsPrimaryStorage.dbReadWriteConnection;
}
+ (NSString *)collection
@ -206,8 +190,6 @@ NS_ASSUME_NONNULL_BEGIN
- (void)applyChangeToSelfAndLatestCopy:(YapDatabaseReadWriteTransaction *)transaction
changeBlock:(void (^)(id))changeBlock
{
OWSAssertDebug(transaction);
changeBlock(self);
NSString *collection = [[self class] collection];
@ -236,9 +218,6 @@ NS_ASSUME_NONNULL_BEGIN
{
TSYapDatabaseObject *latest = [[self class] fetchObjectWithUniqueID:self.uniqueId transaction:transaction];
if (!latest) {
if (!ignoreMissing) {
OWSFailDebug(@"`latest` was unexpectedly nil");
}
return;
}

View File

@ -1,7 +1,3 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -1,9 +1,4 @@
//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import "UIImage+OWS.h"
#import <SessionProtocolKit/SessionProtocolKit.h>
NS_ASSUME_NONNULL_BEGIN
@ -42,7 +37,6 @@ NS_ASSUME_NONNULL_BEGIN
{
CGSize originalSize = self.size;
if (originalSize.width < 1 || originalSize.height < 1) {
OWSLogError(@"Invalid original size: %@", NSStringFromCGSize(originalSize));
return nil;
}
@ -61,14 +55,12 @@ NS_ASSUME_NONNULL_BEGIN
thumbnailSize.height = maxDimensionPoints;
}
if (thumbnailSize.width < 1 || thumbnailSize.height < 1) {
OWSLogError(@"Invalid thumbnail size: %@", NSStringFromCGSize(thumbnailSize));
return nil;
}
UIGraphicsBeginImageContext(CGSizeMake(thumbnailSize.width, thumbnailSize.height));
CGContextRef _Nullable context = UIGraphicsGetCurrentContext();
if (context == NULL) {
OWSLogError(@"Couldn't create context.");
return nil;
}
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
@ -141,7 +133,6 @@ NS_ASSUME_NONNULL_BEGIN
break;
default:
OWSFailDebug(@"Invalid image orientation");
return nil;
}
@ -176,15 +167,10 @@ NS_ASSUME_NONNULL_BEGIN
- (UIImage *)resizedImageToFillPixelSize:(CGSize)dstSize
{
OWSAssertDebug(dstSize.width > 0);
OWSAssertDebug(dstSize.height > 0);
UIImage *normalized = [self normalizedImage];
// Get the size in pixels, not points.
CGSize srcSize = CGSizeMake(CGImageGetWidth(normalized.CGImage), CGImageGetHeight(normalized.CGImage));
OWSAssertDebug(srcSize.width > 0);
OWSAssertDebug(srcSize.height > 0);
CGFloat widthRatio = srcSize.width / dstSize.width;
CGFloat heightRatio = srcSize.height / dstSize.height;
@ -193,13 +179,11 @@ NS_ASSUME_NONNULL_BEGIN
drawRect.origin.y = 0;
drawRect.size.height = dstSize.height;
drawRect.size.width = dstSize.height * srcSize.width / srcSize.height;
OWSAssertDebug(drawRect.size.width > dstSize.width);
drawRect.origin.x = (drawRect.size.width - dstSize.width) * -0.5f;
} else {
drawRect.origin.x = 0;
drawRect.size.width = dstSize.width;
drawRect.size.height = dstSize.width * srcSize.height / srcSize.width;
OWSAssertDebug(drawRect.size.height >= dstSize.height);
drawRect.origin.y = (drawRect.size.height - dstSize.height) * -0.5f;
}
@ -214,17 +198,11 @@ NS_ASSUME_NONNULL_BEGIN
+ (UIImage *)imageWithColor:(UIColor *)color
{
OWSAssertIsOnMainThread();
OWSAssertDebug(color);
return [self imageWithColor:color size:CGSizeMake(1.f, 1.f)];
}
+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size
{
OWSAssertIsOnMainThread();
OWSAssertDebug(color);
CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 1.f);
CGContextRef context = UIGraphicsGetCurrentContext();

View File

@ -265,7 +265,6 @@
B8CCF6432397711F0091D419 /* SettingsVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8CCF6422397711F0091D419 /* SettingsVC.swift */; };
B8D8F0F32565F98E0092EF10 /* LKUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB6B255A580F00E217F9 /* LKUserDefaults.swift */; };
B8D8F0F42565F98E0092EF10 /* PushNotificationAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBDE255A581900E217F9 /* PushNotificationAPI.swift */; };
B8D8F12E2565FC910092EF10 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB36255A580B00E217F9 /* Storage.swift */; };
B8D8F1382566120F0092EF10 /* Storage+ClosedGroups.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8F1372566120F0092EF10 /* Storage+ClosedGroups.swift */; };
B8D8F16A256615DE0092EF10 /* Storage+Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F0A5FD255C988A007BE2A3 /* Storage+Shared.swift */; };
B8D8F16B256615DE0092EF10 /* Storage+VolumeSamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31F812525258FB000DD9FD9 /* Storage+VolumeSamples.swift */; };
@ -353,8 +352,6 @@
C33FDC42255A581F00E217F9 /* YapDatabaseTransaction+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA88255A57FD00E217F9 /* YapDatabaseTransaction+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC45255A581F00E217F9 /* AppVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8B255A57FD00E217F9 /* AppVersion.m */; };
C33FDC46255A581F00E217F9 /* OpenGroupPoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8C255A57FD00E217F9 /* OpenGroupPoller.swift */; };
C33FDC48255A581F00E217F9 /* OWSFileSystem.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */; };
C33FDC4A255A582000E217F9 /* TSYapDatabaseObject.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA90255A57FD00E217F9 /* TSYapDatabaseObject.m */; };
C33FDC4F255A582000E217F9 /* OWSChunkedOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA95255A57FE00E217F9 /* OWSChunkedOutputStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC50255A582000E217F9 /* OWSDispatch.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA96255A57FE00E217F9 /* OWSDispatch.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC51255A582000E217F9 /* TSIncomingMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA97255A57FE00E217F9 /* TSIncomingMessage.m */; };
@ -363,7 +360,6 @@
C33FDC57255A582000E217F9 /* OWSContactsOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA9D255A57FF00E217F9 /* OWSContactsOutputStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC58255A582000E217F9 /* ReverseDispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA9E255A57FF00E217F9 /* ReverseDispatchQueue.swift */; };
C33FDC5A255A582000E217F9 /* OWSRecipientIdentity.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAA0255A57FF00E217F9 /* OWSRecipientIdentity.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC5B255A582000E217F9 /* TSYapDatabaseObject.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAA1255A57FF00E217F9 /* TSYapDatabaseObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC61255A582000E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAA7255A57FF00E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC62255A582000E217F9 /* BuildConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAA8255A57FF00E217F9 /* BuildConfiguration.swift */; };
C33FDC64255A582000E217F9 /* NSObject+Casting.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAAA255A580000E217F9 /* NSObject+Casting.m */; };
@ -377,9 +373,7 @@
C33FDC78255A582000E217F9 /* TSConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDABE255A580100E217F9 /* TSConstants.m */; };
C33FDC7A255A582000E217F9 /* OWSIncomingMessageFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAC0255A580100E217F9 /* OWSIncomingMessageFinder.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC7B255A582000E217F9 /* NSSet+Functional.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC1255A580100E217F9 /* NSSet+Functional.m */; };
C33FDC7C255A582000E217F9 /* TSAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC2255A580200E217F9 /* TSAttachment.m */; };
C33FDC7D255A582000E217F9 /* OWSDispatch.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC3255A580200E217F9 /* OWSDispatch.m */; };
C33FDC7E255A582000E217F9 /* TSAttachmentStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC4255A580200E217F9 /* TSAttachmentStream.m */; };
C33FDC87255A582000E217F9 /* SSKJobRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDACD255A580200E217F9 /* SSKJobRecord.m */; };
C33FDC89255A582000E217F9 /* OWSAttachmentDownloads.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDACF255A580300E217F9 /* OWSAttachmentDownloads.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC8D255A582000E217F9 /* TSThread.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAD3255A580300E217F9 /* TSThread.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -394,7 +388,6 @@
C33FDC99255A582000E217F9 /* PublicChatManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDADF255A580400E217F9 /* PublicChatManager.swift */; };
C33FDC9A255A582000E217F9 /* ByteParser.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAE0255A580400E217F9 /* ByteParser.m */; };
C33FDC9B255A582000E217F9 /* OWSReadTracking.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE1255A580400E217F9 /* OWSReadTracking.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDC9E255A582000E217F9 /* TSAttachmentStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE4255A580400E217F9 /* TSAttachmentStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCA0255A582000E217F9 /* TSInteraction.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE6255A580400E217F9 /* TSInteraction.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCA1255A582000E217F9 /* TSErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAE7255A580500E217F9 /* TSErrorMessage.m */; };
C33FDCA2255A582000E217F9 /* OWSMessageUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE8255A580500E217F9 /* OWSMessageUtils.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -402,15 +395,12 @@
C33FDCA4255A582000E217F9 /* OWSBackupFragment.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAEA255A580500E217F9 /* OWSBackupFragment.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCA6255A582000E217F9 /* SignalRecipient.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAEC255A580500E217F9 /* SignalRecipient.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCA7255A582000E217F9 /* SSKMessageSenderJobRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAED255A580500E217F9 /* SSKMessageSenderJobRecord.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCA9255A582000E217F9 /* NSData+Image.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAEF255A580500E217F9 /* NSData+Image.m */; };
C33FDCAB255A582000E217F9 /* OWSThumbnailService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF1255A580500E217F9 /* OWSThumbnailService.swift */; };
C33FDCAC255A582000E217F9 /* ProxiedContentDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF2255A580500E217F9 /* ProxiedContentDownloader.swift */; };
C33FDCAD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF3255A580500E217F9 /* OWSPrimaryStorage+SessionStore.m */; };
C33FDCAE255A582000E217F9 /* SSKEnvironment.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF4255A580600E217F9 /* SSKEnvironment.m */; };
C33FDCB1255A582000E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF7255A580600E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m */; };
C33FDCB3255A582000E217F9 /* TSContactThread.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF9255A580600E217F9 /* TSContactThread.m */; };
C33FDCB5255A582000E217F9 /* SessionMetaProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAFB255A580600E217F9 /* SessionMetaProtocol.swift */; };
C33FDCB6255A582000E217F9 /* MIMETypeUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAFC255A580600E217F9 /* MIMETypeUtil.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCB7255A582000E217F9 /* LRUCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAFD255A580600E217F9 /* LRUCache.swift */; };
C33FDCB8255A582000E217F9 /* OWSStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAFE255A580600E217F9 /* OWSStorage.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCB9255A582000E217F9 /* DisplayNameUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAFF255A580600E217F9 /* DisplayNameUtilities.swift */; };
@ -425,13 +415,10 @@
C33FDCCE255A582000E217F9 /* OWSMath.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB14255A580800E217F9 /* OWSMath.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCD1255A582000E217F9 /* FunctionalUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB17255A580800E217F9 /* FunctionalUtil.m */; };
C33FDCD3255A582000E217F9 /* GroupUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB19255A580900E217F9 /* GroupUtilities.swift */; };
C33FDCD6255A582000E217F9 /* UIImage+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB1C255A580900E217F9 /* UIImage+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCD7255A582000E217F9 /* OWSReadReceiptManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB1D255A580900E217F9 /* OWSReadReceiptManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCD8255A582000E217F9 /* OWSIncomingMessageFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB1E255A580900E217F9 /* OWSIncomingMessageFinder.m */; };
C33FDCDA255A582000E217F9 /* TSDatabaseSecondaryIndexes.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB20255A580900E217F9 /* TSDatabaseSecondaryIndexes.m */; };
C33FDCDC255A582000E217F9 /* OWSMediaUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB22255A580900E217F9 /* OWSMediaUtils.swift */; };
C33FDCDF255A582000E217F9 /* TSDatabaseSecondaryIndexes.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB25255A580900E217F9 /* TSDatabaseSecondaryIndexes.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCE3255A582000E217F9 /* NSData+Image.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB29255A580A00E217F9 /* NSData+Image.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCE6255A582000E217F9 /* TSDatabaseView.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB2C255A580A00E217F9 /* TSDatabaseView.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCEB255A582000E217F9 /* SSKEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB31255A580A00E217F9 /* SSKEnvironment.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCEC255A582000E217F9 /* SSKIncrementingIdFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB32255A580A00E217F9 /* SSKIncrementingIdFinder.swift */; };
@ -441,7 +428,6 @@
C33FDCF5255A582000E217F9 /* NSNotificationCenter+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB3B255A580B00E217F9 /* NSNotificationCenter+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDCF9255A582000E217F9 /* String+SSK.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB3F255A580C00E217F9 /* String+SSK.swift */; };
C33FDCFA255A582000E217F9 /* SignalIOSProto.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB40255A580C00E217F9 /* SignalIOSProto.swift */; };
C33FDCFB255A582000E217F9 /* MIMETypeUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */; };
C33FDCFD255A582000E217F9 /* YapDatabaseConnection+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB43255A580C00E217F9 /* YapDatabaseConnection+OWS.m */; };
C33FDCFE255A582000E217F9 /* OWSContactsOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB44255A580C00E217F9 /* OWSContactsOutputStream.m */; };
C33FDCFF255A582000E217F9 /* NSString+SSK.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB45255A580C00E217F9 /* NSString+SSK.m */; };
@ -456,7 +442,6 @@
C33FDD0B255A582000E217F9 /* NSUserDefaults+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB51255A580D00E217F9 /* NSUserDefaults+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD0C255A582000E217F9 /* OWSHTTPSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB52255A580D00E217F9 /* OWSHTTPSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD0D255A582000E217F9 /* PreKeyBundle+jsonDict.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB53255A580D00E217F9 /* PreKeyBundle+jsonDict.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD0E255A582000E217F9 /* DataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB54255A580D00E217F9 /* DataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD0F255A582000E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB55255A580D00E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m */; };
C33FDD10255A582000E217F9 /* TSOutgoingMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB56255A580D00E217F9 /* TSOutgoingMessage.m */; };
C33FDD12255A582000E217F9 /* OWSPrimaryStorage+Loki.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB58255A580E00E217F9 /* OWSPrimaryStorage+Loki.m */; };
@ -484,12 +469,9 @@
C33FDD38255A582000E217F9 /* TSPreKeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB7E255A581100E217F9 /* TSPreKeyManager.m */; };
C33FDD39255A582000E217F9 /* FullTextSearchFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB7F255A581100E217F9 /* FullTextSearchFinder.swift */; };
C33FDD3A255A582000E217F9 /* Notification+Loki.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB80255A581100E217F9 /* Notification+Loki.swift */; };
C33FDD3B255A582000E217F9 /* UIImage+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB81255A581100E217F9 /* UIImage+OWS.m */; };
C33FDD3D255A582000E217F9 /* TSQuotedMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB83255A581100E217F9 /* TSQuotedMessage.m */; };
C33FDD3F255A582000E217F9 /* AppContext.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB85255A581100E217F9 /* AppContext.m */; };
C33FDD41255A582000E217F9 /* JobQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB87255A581100E217F9 /* JobQueue.swift */; };
C33FDD42255A582000E217F9 /* TSAccountManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB88255A581200E217F9 /* TSAccountManager.m */; };
C33FDD44255A582000E217F9 /* AppContext.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB8A255A581200E217F9 /* AppContext.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD45255A582000E217F9 /* Storage+SessionManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB8B255A581200E217F9 /* Storage+SessionManagement.swift */; };
C33FDD46255A582000E217F9 /* TSInvalidIdentityKeyErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB8C255A581200E217F9 /* TSInvalidIdentityKeyErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD49255A582000E217F9 /* ParamParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB8F255A581200E217F9 /* ParamParser.swift */; };
@ -498,7 +480,6 @@
C33FDD4E255A582000E217F9 /* TSAccountManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB94255A581300E217F9 /* TSAccountManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD53255A582000E217F9 /* OWSPrimaryStorage+keyFromIntLong.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB99255A581300E217F9 /* OWSPrimaryStorage+keyFromIntLong.m */; };
C33FDD56255A582000E217F9 /* TSIncomingMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB9C255A581300E217F9 /* TSIncomingMessage.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD58255A582000E217F9 /* TSAttachmentPointer.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB9E255A581400E217F9 /* TSAttachmentPointer.m */; };
C33FDD5A255A582000E217F9 /* TSStorageHeaders.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBA0255A581400E217F9 /* TSStorageHeaders.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD5B255A582000E217F9 /* OWSOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBA1255A581400E217F9 /* OWSOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD5D255A582000E217F9 /* SessionManagementProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBA3255A581400E217F9 /* SessionManagementProtocol.swift */; };
@ -506,12 +487,10 @@
C33FDD60255A582000E217F9 /* TSInvalidIdentityKeySendingErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBA6255A581400E217F9 /* TSInvalidIdentityKeySendingErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD62255A582000E217F9 /* OWSLinkPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBA8255A581500E217F9 /* OWSLinkPreview.swift */; };
C33FDD63255A582000E217F9 /* OWSIdentityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBA9255A581500E217F9 /* OWSIdentityManager.m */; };
C33FDD65255A582000E217F9 /* OWSFileSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBAB255A581500E217F9 /* OWSFileSystem.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD67255A582000E217F9 /* OWSRecordTranscriptJob.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBAD255A581500E217F9 /* OWSRecordTranscriptJob.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD68255A582000E217F9 /* SignalAccount.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBAE255A581500E217F9 /* SignalAccount.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD6A255A582000E217F9 /* TSErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBB0255A581500E217F9 /* TSErrorMessage.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDD6E255A582000E217F9 /* NSURLSessionDataTask+StatusCode.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB4255A581600E217F9 /* NSURLSessionDataTask+StatusCode.m */; };
C33FDD70255A582000E217F9 /* DataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB6255A581600E217F9 /* DataSource.m */; };
C33FDD71255A582000E217F9 /* SignalRecipient.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB7255A581600E217F9 /* SignalRecipient.m */; };
C33FDD72255A582000E217F9 /* TSThread.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB8255A581600E217F9 /* TSThread.m */; };
C33FDD73255A582000E217F9 /* ProfileManagerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBB9255A581600E217F9 /* ProfileManagerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -549,9 +528,7 @@
C33FDDC6255A582000E217F9 /* TSInfoMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC0C255A581E00E217F9 /* TSInfoMessage.m */; };
C33FDDCC255A582000E217F9 /* TSConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC12255A581E00E217F9 /* TSConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDDCD255A582000E217F9 /* OWSAttachmentDownloads.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC13255A581E00E217F9 /* OWSAttachmentDownloads.m */; };
C33FDDCF255A582000E217F9 /* TSAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC15255A581E00E217F9 /* TSAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDDD0255A582000E217F9 /* FunctionalUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC16255A581E00E217F9 /* FunctionalUtil.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDDD2255A582000E217F9 /* TSAttachmentPointer.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC18255A581F00E217F9 /* TSAttachmentPointer.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDDD3255A582000E217F9 /* OWSQueues.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC19255A581F00E217F9 /* OWSQueues.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FDDD5255A582000E217F9 /* OWSBackgroundTask.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC1B255A581F00E217F9 /* OWSBackgroundTask.m */; };
C33FDDD8255A582000E217F9 /* OWSUploadOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC1E255A581F00E217F9 /* OWSUploadOperation.m */; };
@ -586,7 +563,6 @@
C3645350252449260045C478 /* VoiceMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C364534F252449260045C478 /* VoiceMessageView.swift */; };
C364535C252467900045C478 /* AudioUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C364535B252467900045C478 /* AudioUtilities.swift */; };
C379DCF4256735770002D4EB /* VisibleMessage+Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C379DCF3256735770002D4EB /* VisibleMessage+Attachment.swift */; };
C379DCFE25673DBC0002D4EB /* Attachment+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C379DCFD25673DBC0002D4EB /* Attachment+Conversion.swift */; };
C37F5385255B94F6002AEA92 /* SelectRecipientViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF34E255B6DC8007E1867 /* SelectRecipientViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
C37F5396255B95BD002AEA92 /* OWSAnyTouchGestureRecognizer.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF302255B6DBE007E1867 /* OWSAnyTouchGestureRecognizer.h */; settings = {ATTRIBUTES = (Public, ); }; };
C37F53A7255B96E0002AEA92 /* OWSAudioPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF2F5255B6DBC007E1867 /* OWSAudioPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -787,7 +763,6 @@
C3A7219A2558C1660043A11F /* AnyPromise+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A721992558C1660043A11F /* AnyPromise+Conversion.swift */; };
C3A7222A2558C1E40043A11F /* DotNetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A722292558C1E40043A11F /* DotNetAPI.swift */; };
C3A7225E2558C38D0043A11F /* Promise+Retaining.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A7225D2558C38D0043A11F /* Promise+Retaining.swift */; };
C3A722802558C4E10043A11F /* AttachmentStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A7227F2558C4E10043A11F /* AttachmentStream.swift */; };
C3A722922558C8940043A11F /* OpenGroupAPIDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A722912558C8940043A11F /* OpenGroupAPIDelegate.swift */; };
C3A7229C2558E4310043A11F /* OpenGroupMessage+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A7229B2558E4310043A11F /* OpenGroupMessage+Conversion.swift */; };
C3AABDDF2553ECF00042FF4C /* Array+Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D12553860800C340D1 /* Array+Description.swift */; };
@ -911,6 +886,33 @@
C3CA3B2F255CF84E00F4C6D4 /* NullMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3CA3B2E255CF84E00F4C6D4 /* NullMessage.swift */; };
C3D0972B2510499C00F6E3E4 /* BackgroundPoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D0972A2510499C00F6E3E4 /* BackgroundPoller.swift */; };
C3D697382564DCE6004AF766 /* MessageReceiverDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D697372564DCE6004AF766 /* MessageReceiverDelegate.swift */; };
C3D9E35525675EE10040E4F3 /* MIMETypeUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */; };
C3D9E35E25675F640040E4F3 /* OWSFileSystem.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */; };
C3D9E379256760340040E4F3 /* MIMETypeUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAFC255A580600E217F9 /* MIMETypeUtil.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E38A256760390040E4F3 /* OWSFileSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBAB255A581500E217F9 /* OWSFileSystem.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E39B256763C20040E4F3 /* AppContext.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB85255A581100E217F9 /* AppContext.m */; };
C3D9E3A4256763DE0040E4F3 /* AppContext.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB8A255A581200E217F9 /* AppContext.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E3BE25676AD70040E4F3 /* TSAttachmentPointer.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB9E255A581400E217F9 /* TSAttachmentPointer.m */; };
C3D9E3BF25676AD70040E4F3 /* TSAttachmentStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC4255A580200E217F9 /* TSAttachmentStream.m */; };
C3D9E3C025676AD70040E4F3 /* TSAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC2255A580200E217F9 /* TSAttachment.m */; };
C3D9E3C925676AF30040E4F3 /* TSYapDatabaseObject.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA90255A57FD00E217F9 /* TSYapDatabaseObject.m */; };
C3D9E3FA25676BCE0040E4F3 /* TSYapDatabaseObject.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAA1255A57FF00E217F9 /* TSYapDatabaseObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E40C25676C100040E4F3 /* Storage+Conformances.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D9E40B25676C100040E4F3 /* Storage+Conformances.swift */; };
C3D9E41525676C320040E4F3 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB36255A580B00E217F9 /* Storage.swift */; };
C3D9E41F25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D9E41E25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift */; };
C3D9E43125676D3D0040E4F3 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D9E43025676D3D0040E4F3 /* Configuration.swift */; };
C3D9E485256775D20040E4F3 /* TSAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC15255A581E00E217F9 /* TSAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E486256775D20040E4F3 /* TSAttachmentPointer.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC18255A581F00E217F9 /* TSAttachmentPointer.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E487256775D20040E4F3 /* TSAttachmentStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE4255A580400E217F9 /* TSAttachmentStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E4C02567767F0040E4F3 /* DataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB6255A581600E217F9 /* DataSource.m */; };
C3D9E4D12567777D0040E4F3 /* OWSMediaUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB22255A580900E217F9 /* OWSMediaUtils.swift */; };
C3D9E4DA256778410040E4F3 /* UIImage+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB81255A581100E217F9 /* UIImage+OWS.m */; };
C3D9E4E3256778720040E4F3 /* UIImage+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB1C255A580900E217F9 /* UIImage+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E4F4256778AF0040E4F3 /* NSData+Image.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAEF255A580500E217F9 /* NSData+Image.m */; };
C3D9E4FD256778E30040E4F3 /* NSData+Image.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB29255A580A00E217F9 /* NSData+Image.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E50E25677A510040E4F3 /* DataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB54255A580D00E217F9 /* DataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
C3D9E52725677DF20040E4F3 /* OWSThumbnailService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF1255A580500E217F9 /* OWSThumbnailService.swift */; };
C3D9E53925677F5E0040E4F3 /* Attachment+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C379DCFD25673DBC0002D4EB /* Attachment+Conversion.swift */; };
C3DAB3242480CB2B00725F25 /* SRCopyableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DAB3232480CB2A00725F25 /* SRCopyableLabel.swift */; };
C3DFFAC623E96F0D0058DAF8 /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DFFAC523E96F0D0058DAF8 /* Sheet.swift */; };
C3E5C2FA251DBABB0040DFFC /* EditClosedGroupVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E5C2F9251DBABB0040DFFC /* EditClosedGroupVC.swift */; };
@ -1881,7 +1883,6 @@
C3A721992558C1660043A11F /* AnyPromise+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AnyPromise+Conversion.swift"; sourceTree = "<group>"; };
C3A722292558C1E40043A11F /* DotNetAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DotNetAPI.swift; sourceTree = "<group>"; };
C3A7225D2558C38D0043A11F /* Promise+Retaining.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Promise+Retaining.swift"; sourceTree = "<group>"; };
C3A7227F2558C4E10043A11F /* AttachmentStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentStream.swift; sourceTree = "<group>"; };
C3A722912558C8940043A11F /* OpenGroupAPIDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenGroupAPIDelegate.swift; sourceTree = "<group>"; };
C3A7229B2558E4310043A11F /* OpenGroupMessage+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OpenGroupMessage+Conversion.swift"; sourceTree = "<group>"; };
C3AA6BB824CE8F1B002358B6 /* Migrating Translations from Android.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "Migrating Translations from Android.md"; path = "Meta/Translations/Migrating Translations from Android.md"; sourceTree = "<group>"; };
@ -2012,6 +2013,9 @@
C3D0972A2510499C00F6E3E4 /* BackgroundPoller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundPoller.swift; sourceTree = "<group>"; };
C3D697372564DCE6004AF766 /* MessageReceiverDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReceiverDelegate.swift; sourceTree = "<group>"; };
C3D697492564DEDC004AF766 /* MessageReceiverDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReceiverDelegate.swift; sourceTree = "<group>"; };
C3D9E40B25676C100040E4F3 /* Storage+Conformances.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+Conformances.swift"; sourceTree = "<group>"; };
C3D9E41E25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWSPrimaryStorageProtocol.swift; sourceTree = "<group>"; };
C3D9E43025676D3D0040E4F3 /* Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = "<group>"; };
C3DAB3232480CB2A00725F25 /* SRCopyableLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRCopyableLabel.swift; sourceTree = "<group>"; };
C3DFFAC523E96F0D0058DAF8 /* Sheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sheet.swift; sourceTree = "<group>"; };
C3E5C2F9251DBABB0040DFFC /* EditClosedGroupVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditClosedGroupVC.swift; sourceTree = "<group>"; };
@ -2625,37 +2629,36 @@
children = (
C3C2A74325539EB700C340D1 /* Message.swift */,
C352A30825574D8400338F3E /* Message+Destination.swift */,
C300A5C62554B02D00555489 /* Visible Message */,
C300A5C72554B03900555489 /* Control Message */,
C300A5C62554B02D00555489 /* Visible Messages */,
C300A5C72554B03900555489 /* Control Messages */,
);
path = Messages;
sourceTree = "<group>";
};
C300A5C62554B02D00555489 /* Visible Message */ = {
C300A5C62554B02D00555489 /* Visible Messages */ = {
isa = PBXGroup;
children = (
C3D9E3B52567685D0040E4F3 /* Attachments */,
C3C2A74C2553A39700C340D1 /* VisibleMessage.swift */,
C379DCF3256735770002D4EB /* VisibleMessage+Attachment.swift */,
C3C2A7552553A3AB00C340D1 /* VisibleMessage+Quote.swift */,
C3C2A75E2553A3C500C340D1 /* VisibleMessage+LinkPreview.swift */,
C3C2A7672553A3D900C340D1 /* VisibleMessage+Contact.swift */,
C300A5B12554AF9800555489 /* VisibleMessage+Profile.swift */,
);
path = "Visible Message";
path = "Visible Messages";
sourceTree = "<group>";
};
C300A5C72554B03900555489 /* Control Message */ = {
C300A5C72554B03900555489 /* Control Messages */ = {
isa = PBXGroup;
children = (
C379DD172567458A0002D4EB /* Unused */,
C3C2A7702553A41E00C340D1 /* ControlMessage.swift */,
C300A5BC2554B00D00555489 /* ReadReceipt.swift */,
C300A5C82554B04E00555489 /* SessionRequest.swift */,
C3CA3B2E255CF84E00F4C6D4 /* NullMessage.swift */,
C300A5D22554B05A00555489 /* TypingIndicator.swift */,
C300A5DC2554B06600555489 /* ClosedGroupUpdate.swift */,
C300A5E62554B07300555489 /* ExpirationTimerUpdate.swift */,
);
path = "Control Message";
path = "Control Messages";
sourceTree = "<group>";
};
C300A5F02554B08500555489 /* Sending & Receiving */ = {
@ -2769,8 +2772,6 @@
C38BBA0C255E32020041B9A3 /* Threads */,
C38BBA0D255E321C0041B9A3 /* Messaging */,
C38BBA0E255E32440041B9A3 /* Database */,
C33FDB8A255A581200E217F9 /* AppContext.h */,
C33FDB85255A581100E217F9 /* AppContext.m */,
C33FDB01255A580700E217F9 /* AppReadiness.h */,
C33FDB75255A581000E217F9 /* AppReadiness.m */,
C33FDB4C255A580D00E217F9 /* AppVersion.h */,
@ -2799,8 +2800,6 @@
C33FDA8B255A57FD00E217F9 /* AppVersion.m */,
C33FDB68255A580F00E217F9 /* ContentProxy.swift */,
C33FDBC9255A581700E217F9 /* CreatePreKeysOperation.swift */,
C33FDB54255A580D00E217F9 /* DataSource.h */,
C33FDBB6255A581600E217F9 /* DataSource.m */,
C33FDB69255A580F00E217F9 /* FeatureFlags.swift */,
C33FDB7F255A581100E217F9 /* FullTextSearchFinder.swift */,
C33FDB87255A581100E217F9 /* JobQueue.swift */,
@ -2828,8 +2827,6 @@
C33FDB59255A580E00E217F9 /* OWSFailedAttachmentDownloadsJob.m */,
C33FDADB255A580400E217F9 /* OWSFailedMessagesJob.h */,
C33FDAB7255A580100E217F9 /* OWSFailedMessagesJob.m */,
C33FDBAB255A581500E217F9 /* OWSFileSystem.h */,
C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */,
C33FDABB255A580100E217F9 /* OWSGroupsOutputStream.h */,
C33FDAD8255A580300E217F9 /* OWSGroupsOutputStream.m */,
C33FDB52255A580D00E217F9 /* OWSHTTPSecurityPolicy.h */,
@ -2847,7 +2844,6 @@
C33FDA7F255A57FC00E217F9 /* OWSRecordTranscriptJob.m */,
C33FDBD3255A581800E217F9 /* OWSSignalAddress.swift */,
C33FDA75255A57FB00E217F9 /* OWSSyncManagerProtocol.h */,
C33FDAF1255A580500E217F9 /* OWSThumbnailService.swift */,
C33FDB5A255A580E00E217F9 /* OWSUDManager.swift */,
C33FDBD6255A581900E217F9 /* OWSUploadOperation.h */,
C33FDC1E255A581F00E217F9 /* OWSUploadOperation.m */,
@ -3056,7 +3052,7 @@
C379DCC3256732800002D4EB /* Storage */ = {
isa = PBXGroup;
children = (
C33FDB36255A580B00E217F9 /* Storage.swift */,
C3D9E40B25676C100040E4F3 /* Storage+Conformances.swift */,
B8D8F1372566120F0092EF10 /* Storage+ClosedGroups.swift */,
B8D8F17625661AFA0092EF10 /* Storage+Jobs.swift */,
B8D8F19225661BF80092EF10 /* Storage+Messaging.swift */,
@ -3073,8 +3069,6 @@
C379DCC4256732980002D4EB /* YapDatabase */ = {
isa = PBXGroup;
children = (
C33FDAA1255A57FF00E217F9 /* TSYapDatabaseObject.h */,
C33FDA90255A57FD00E217F9 /* TSYapDatabaseObject.m */,
C33FDA6D255A57FA00E217F9 /* YapDatabase+Promise.swift */,
C33FDB5F255A580E00E217F9 /* YapDatabaseConnection+OWS.h */,
C33FDB43255A580C00E217F9 /* YapDatabaseConnection+OWS.m */,
@ -3179,6 +3173,15 @@
path = "Attachment Approval";
sourceTree = "<group>";
};
C379DD172567458A0002D4EB /* Unused */ = {
isa = PBXGroup;
children = (
C300A5C82554B04E00555489 /* SessionRequest.swift */,
C3CA3B2E255CF84E00F4C6D4 /* NullMessage.swift */,
);
path = Unused;
sourceTree = "<group>";
};
C3851CD225624B060061EEB0 /* UI */ = {
isa = PBXGroup;
children = (
@ -3286,12 +3289,6 @@
children = (
C379DCFD25673DBC0002D4EB /* Attachment+Conversion.swift */,
C38EF224255B6D5D007E1867 /* SignalAttachment.swift */,
C33FDC15255A581E00E217F9 /* TSAttachment.h */,
C33FDAC2255A580200E217F9 /* TSAttachment.m */,
C33FDC18255A581F00E217F9 /* TSAttachmentPointer.h */,
C33FDB9E255A581400E217F9 /* TSAttachmentPointer.m */,
C33FDAE4255A580400E217F9 /* TSAttachmentStream.h */,
C33FDAC4255A580200E217F9 /* TSAttachmentStream.m */,
);
path = Attachments;
sourceTree = "<group>";
@ -3406,7 +3403,6 @@
C3BBE0B32554F0D30050F1E3 /* Utilities */ = {
isa = PBXGroup;
children = (
C3A7227F2558C4E10043A11F /* AttachmentStream.swift */,
C3A722292558C1E40043A11F /* DotNetAPI.swift */,
C3BBE0C62554F1570050F1E3 /* FixedWidthInteger+BigEndian.swift */,
C3A71D0A2558989C0043A11F /* MessageWrapper.swift */,
@ -3460,24 +3456,42 @@
C3C2A68B255388D500C340D1 /* Meta */,
C3C2A5D72553860B00C340D1 /* AESGCM.swift */,
C3A721992558C1660043A11F /* AnyPromise+Conversion.swift */,
C33FDB8A255A581200E217F9 /* AppContext.h */,
C33FDB85255A581100E217F9 /* AppContext.m */,
C3C2A5D12553860800C340D1 /* Array+Description.swift */,
C3D9E43025676D3D0040E4F3 /* Configuration.swift */,
C33FDB54255A580D00E217F9 /* DataSource.h */,
C33FDBB6255A581600E217F9 /* DataSource.m */,
C3C2ABD12553C6C900C340D1 /* Data+SecureRandom.swift */,
C3C2A5D52553860A00C340D1 /* Dictionary+Description.swift */,
C3A71D662558A0170043A11F /* DiffieHellman.swift */,
C3C2A5BC255385EE00C340D1 /* HTTP.swift */,
C3C2A5D92553860B00C340D1 /* JSON.swift */,
C3C2A5CE2553860700C340D1 /* Logging.swift */,
C33FDAFC255A580600E217F9 /* MIMETypeUtil.h */,
C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */,
C3A71F882558BA9F0043A11F /* Mnemonic.swift */,
C33FDB29255A580A00E217F9 /* NSData+Image.h */,
C33FDAEF255A580500E217F9 /* NSData+Image.m */,
C300A6302554B68200555489 /* NSDate+Timestamp.h */,
C300A6312554B6D100555489 /* NSDate+Timestamp.mm */,
C352A3762557859C00338F3E /* NSTimer+Proxying.h */,
C352A36C2557858D00338F3E /* NSTimer+Proxying.m */,
C33FDBAB255A581500E217F9 /* OWSFileSystem.h */,
C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */,
C33FDB22255A580900E217F9 /* OWSMediaUtils.swift */,
C3D9E41E25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift */,
C3C2A5D32553860900C340D1 /* Promise+Delaying.swift */,
C3A7225D2558C38D0043A11F /* Promise+Retaining.swift */,
C3C2A5D62553860B00C340D1 /* Promise+Retrying.swift */,
C33FDB36255A580B00E217F9 /* Storage.swift */,
C3C2AC2D2553CBEB00C340D1 /* String+Trimming.swift */,
C352A3A42557B5F000338F3E /* TSRequest.h */,
C352A3A52557B60D00338F3E /* TSRequest.m */,
C33FDAA1255A57FF00E217F9 /* TSYapDatabaseObject.h */,
C33FDA90255A57FD00E217F9 /* TSYapDatabaseObject.m */,
C33FDB1C255A580900E217F9 /* UIImage+OWS.h */,
C33FDB81255A581100E217F9 /* UIImage+OWS.m */,
);
path = SessionUtilitiesKit;
sourceTree = "<group>";
@ -3727,15 +3741,12 @@
C33FDB8F255A581200E217F9 /* ParamParser.swift */,
C33FDB32255A580A00E217F9 /* SSKIncrementingIdFinder.swift */,
C33FDADE255A580400E217F9 /* SwiftSingletons.swift */,
C33FDB1C255A580900E217F9 /* UIImage+OWS.h */,
C33FDB81255A581100E217F9 /* UIImage+OWS.m */,
C33FDB49255A580C00E217F9 /* WeakTimer.swift */,
C33FDB3F255A580C00E217F9 /* String+SSK.swift */,
C33FDBC2255A581700E217F9 /* SSKAsserts.h */,
C33FDA9E255A57FF00E217F9 /* ReverseDispatchQueue.swift */,
C33FDB91255A581200E217F9 /* ProtoUtils.h */,
C33FDA6C255A57FA00E217F9 /* ProtoUtils.m */,
C33FDB22255A580900E217F9 /* OWSMediaUtils.swift */,
C33FDB14255A580800E217F9 /* OWSMath.h */,
C33FDADC255A580400E217F9 /* NSObject+Casting.h */,
C33FDAAA255A580000E217F9 /* NSObject+Casting.m */,
@ -3752,10 +3763,6 @@
C33FDAB8255A580100E217F9 /* NSArray+Functional.m */,
C33FDBF8255A581C00E217F9 /* NSArray+OWS.h */,
C33FDB0D255A580800E217F9 /* NSArray+OWS.m */,
C33FDB29255A580A00E217F9 /* NSData+Image.h */,
C33FDAEF255A580500E217F9 /* NSData+Image.m */,
C33FDAFC255A580600E217F9 /* MIMETypeUtil.h */,
C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */,
C33FDAFD255A580600E217F9 /* LRUCache.swift */,
C33FDC03255A581D00E217F9 /* ByteParser.h */,
C33FDAE0255A580400E217F9 /* ByteParser.m */,
@ -3784,6 +3791,21 @@
path = Utilities;
sourceTree = "<group>";
};
C3D9E3B52567685D0040E4F3 /* Attachments */ = {
isa = PBXGroup;
children = (
C33FDAF1255A580500E217F9 /* OWSThumbnailService.swift */,
C33FDC15255A581E00E217F9 /* TSAttachment.h */,
C33FDAC2255A580200E217F9 /* TSAttachment.m */,
C33FDC18255A581F00E217F9 /* TSAttachmentPointer.h */,
C33FDB9E255A581400E217F9 /* TSAttachmentPointer.m */,
C33FDAE4255A580400E217F9 /* TSAttachmentStream.h */,
C33FDAC4255A580200E217F9 /* TSAttachmentStream.m */,
C379DCF3256735770002D4EB /* VisibleMessage+Attachment.swift */,
);
path = Attachments;
sourceTree = "<group>";
};
C3F0A58F255C8E3D007BE2A3 /* Meta */ = {
isa = PBXGroup;
children = (
@ -3927,7 +3949,6 @@
C33FDCCE255A582000E217F9 /* OWSMath.h in Headers */,
C33FDD46255A582000E217F9 /* TSInvalidIdentityKeyErrorMessage.h in Headers */,
C33FDDD0255A582000E217F9 /* FunctionalUtil.h in Headers */,
C33FDCE3255A582000E217F9 /* NSData+Image.h in Headers */,
C38EF311255B6DBF007E1867 /* OWSScrubbingLogFormatter.h in Headers */,
C33FDC77255A582000E217F9 /* OWSOutgoingReceiptManager.h in Headers */,
B8C2B3442563782400551B4D /* ThreadUtil.h in Headers */,
@ -3939,7 +3960,6 @@
C33FDC89255A582000E217F9 /* OWSAttachmentDownloads.h in Headers */,
C33FDD73255A582000E217F9 /* ProfileManagerProtocol.h in Headers */,
C38EF2D8255B6DAF007E1867 /* OWSUserProfile.h in Headers */,
C33FDCB6255A582000E217F9 /* MIMETypeUtil.h in Headers */,
C33FDD17255A582000E217F9 /* TSErrorMessage_privateConstructor.h in Headers */,
C33FDC93255A582000E217F9 /* OWSDisappearingMessagesConfiguration.h in Headers */,
C38EF2C2255B6DA6007E1867 /* TSUnreadIndicatorInteraction.h in Headers */,
@ -3947,10 +3967,7 @@
C38EF313255B6DBF007E1867 /* OWSUnreadIndicator.h in Headers */,
C33FDD7C255A582000E217F9 /* SSKAsserts.h in Headers */,
C33FDC9B255A582000E217F9 /* OWSReadTracking.h in Headers */,
C33FDD44255A582000E217F9 /* AppContext.h in Headers */,
C33FDC97255A582000E217F9 /* TSInfoMessage.h in Headers */,
C33FDD65255A582000E217F9 /* OWSFileSystem.h in Headers */,
C33FDCD6255A582000E217F9 /* UIImage+OWS.h in Headers */,
C33FDC6D255A582000E217F9 /* TSContactThread.h in Headers */,
C33FDC3A255A581F00E217F9 /* OWSDisappearingMessagesJob.h in Headers */,
C33FDD6A255A582000E217F9 /* TSErrorMessage.h in Headers */,
@ -3965,7 +3982,6 @@
C33FDC2C255A581F00E217F9 /* OWSFailedAttachmentDownloadsJob.h in Headers */,
C38EF22A255B6D5D007E1867 /* AttachmentSharing.h in Headers */,
C33FDD67255A582000E217F9 /* OWSRecordTranscriptJob.h in Headers */,
C33FDDCF255A582000E217F9 /* TSAttachment.h in Headers */,
C33FDDB8255A582000E217F9 /* NSSet+Functional.h in Headers */,
C33FDC2F255A581F00E217F9 /* OWSSyncManagerProtocol.h in Headers */,
C33FDDCC255A582000E217F9 /* TSConstants.h in Headers */,
@ -3973,7 +3989,6 @@
C33FDDBD255A582000E217F9 /* ByteParser.h in Headers */,
C38EF243255B6D67007E1867 /* UIViewController+OWS.h in Headers */,
C38EF36D255B6DCC007E1867 /* SharingThreadPickerViewController.h in Headers */,
C33FDC5B255A582000E217F9 /* TSYapDatabaseObject.h in Headers */,
C38EF35D255B6DCC007E1867 /* OWSNavigationController.h in Headers */,
C33FDDBF255A582000E217F9 /* OWSDisappearingMessagesFinder.h in Headers */,
C33FDCC4255A582000E217F9 /* TSGroupModel.h in Headers */,
@ -3985,7 +4000,6 @@
C33FDD0C255A582000E217F9 /* OWSHTTPSecurityPolicy.h in Headers */,
C33FDC57255A582000E217F9 /* OWSContactsOutputStream.h in Headers */,
C33FDCBD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.h in Headers */,
C33FDDD2255A582000E217F9 /* TSAttachmentPointer.h in Headers */,
C38EF3F0255B6DF7007E1867 /* ThreadViewHelper.h in Headers */,
C33FDCD7255A582000E217F9 /* OWSReadReceiptManager.h in Headers */,
C33FDD21255A582000E217F9 /* OWSMediaGalleryFinder.h in Headers */,
@ -4000,7 +4014,6 @@
C38EF277255B6D7A007E1867 /* OWSDatabaseMigration.h in Headers */,
C38EF294255B6D86007E1867 /* OWSSounds.h in Headers */,
C38EF3F5255B6DF7007E1867 /* OWSTextField.h in Headers */,
C33FDC9E255A582000E217F9 /* TSAttachmentStream.h in Headers */,
C38EF275255B6D7A007E1867 /* OWSDatabaseMigrationRunner.h in Headers */,
C33FDCA7255A582000E217F9 /* SSKMessageSenderJobRecord.h in Headers */,
C33FDD84255A582000E217F9 /* LKGroupUtilities.h in Headers */,
@ -4020,7 +4033,6 @@
C38EF35E255B6DCC007E1867 /* OWSViewController.h in Headers */,
C33FDC4F255A582000E217F9 /* OWSChunkedOutputStream.h in Headers */,
C37F5396255B95BD002AEA92 /* OWSAnyTouchGestureRecognizer.h in Headers */,
C33FDD0E255A582000E217F9 /* DataSource.h in Headers */,
C38EF325255B6DBF007E1867 /* OWSWindowManager.h in Headers */,
C33FDCF2255A582000E217F9 /* OWSBackgroundTask.h in Headers */,
C38EF39C255B6DDA007E1867 /* OWSQuotedReplyModel.h in Headers */,
@ -4077,8 +4089,15 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
C3D9E3FA25676BCE0040E4F3 /* TSYapDatabaseObject.h in Headers */,
C3D9E3A4256763DE0040E4F3 /* AppContext.h in Headers */,
C3D9E38A256760390040E4F3 /* OWSFileSystem.h in Headers */,
C352A3B72557B6ED00338F3E /* TSRequest.h in Headers */,
C3D9E379256760340040E4F3 /* MIMETypeUtil.h in Headers */,
C3D9E50E25677A510040E4F3 /* DataSource.h in Headers */,
C3D9E4FD256778E30040E4F3 /* NSData+Image.h in Headers */,
C300A63B2554B72200555489 /* NSDate+Timestamp.h in Headers */,
C3D9E4E3256778720040E4F3 /* UIImage+OWS.h in Headers */,
C352A3772557864000338F3E /* NSTimer+Proxying.h in Headers */,
C3C2A67D255388CC00C340D1 /* SessionUtilitiesKit.h in Headers */,
);
@ -4088,7 +4107,10 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
C3D9E485256775D20040E4F3 /* TSAttachment.h in Headers */,
C3C2A6F425539DE700C340D1 /* SessionMessagingKit.h in Headers */,
C3D9E487256775D20040E4F3 /* TSAttachmentStream.h in Headers */,
C3D9E486256775D20040E4F3 /* TSAttachmentPointer.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -4933,7 +4955,6 @@
files = (
C38EF30D255B6DBF007E1867 /* OWSUnreadIndicator.m in Sources */,
C38EF3FD255B6DF7007E1867 /* OWSTextView.m in Sources */,
C33FDCA9255A582000E217F9 /* NSData+Image.m in Sources */,
C38EF3C6255B6DE7007E1867 /* ImageEditorModel.swift in Sources */,
C38EF317255B6DBF007E1867 /* DisplayableText.swift in Sources */,
C38EF30F255B6DBF007E1867 /* AppPreferences.swift in Sources */,
@ -4963,9 +4984,8 @@
C33FDD3D255A582000E217F9 /* TSQuotedMessage.m in Sources */,
C38EF273255B6D7A007E1867 /* OWSDatabaseMigrationRunner.m in Sources */,
C33FDD12255A582000E217F9 /* OWSPrimaryStorage+Loki.m in Sources */,
C379DCFE25673DBC0002D4EB /* Attachment+Conversion.swift in Sources */,
C3D9E40C25676C100040E4F3 /* Storage+Conformances.swift in Sources */,
C38EF31A255B6DBF007E1867 /* OWSAnyTouchGestureRecognizer.m in Sources */,
C33FDCFB255A582000E217F9 /* MIMETypeUtil.m in Sources */,
C38EF36C255B6DCC007E1867 /* SharingThreadPickerViewController.m in Sources */,
C38EF244255B6D67007E1867 /* UIDevice+featureSupport.swift in Sources */,
C38EF385255B6DD2007E1867 /* AttachmentTextToolbar.swift in Sources */,
@ -4992,23 +5012,19 @@
C38EF363255B6DCC007E1867 /* ModalActivityIndicatorViewController.swift in Sources */,
C38EF38A255B6DD2007E1867 /* AttachmentCaptionToolbar.swift in Sources */,
C33FDD00255A582000E217F9 /* TSDatabaseView.m in Sources */,
C33FDD3B255A582000E217F9 /* UIImage+OWS.m in Sources */,
C33FDD83255A582000E217F9 /* CreatePreKeysOperation.swift in Sources */,
C33FDDD5255A582000E217F9 /* OWSBackgroundTask.m in Sources */,
B84072A02565F1670037CB17 /* Quote+Conversion.swift in Sources */,
C33FDC7E255A582000E217F9 /* TSAttachmentStream.m in Sources */,
C33FDC62255A582000E217F9 /* BuildConfiguration.swift in Sources */,
C38EF40A255B6DF7007E1867 /* OWSFlatButton.swift in Sources */,
C33FDCD1255A582000E217F9 /* FunctionalUtil.m in Sources */,
C38EF402255B6DF7007E1867 /* CommonStrings.swift in Sources */,
C38EF3C1255B6DE7007E1867 /* ImageEditorBrushViewController.swift in Sources */,
C33FDD3F255A582000E217F9 /* AppContext.m in Sources */,
C33FDCC7255A582000E217F9 /* NSArray+OWS.m in Sources */,
C38EF3EF255B6DF7007E1867 /* ThreadViewHelper.m in Sources */,
C33FDD72255A582000E217F9 /* TSThread.m in Sources */,
C33FDC71255A582000E217F9 /* OWSFailedMessagesJob.m in Sources */,
C33FDD32255A582000E217F9 /* OWSOperation.m in Sources */,
C33FDC4A255A582000E217F9 /* TSYapDatabaseObject.m in Sources */,
C3F0A530255C80BC007BE2A3 /* NoopNotificationsManager.swift in Sources */,
C33FDD8D255A582000E217F9 /* OWSSignalAddress.swift in Sources */,
C33FDCB1255A582000E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m in Sources */,
@ -5034,13 +5050,11 @@
C38EF316255B6DBF007E1867 /* ProximityMonitoringManager.swift in Sources */,
C38EF371255B6DCC007E1867 /* MessageApprovalViewController.swift in Sources */,
C33FDD71255A582000E217F9 /* SignalRecipient.m in Sources */,
C33FDD58255A582000E217F9 /* TSAttachmentPointer.m in Sources */,
C33FDD39255A582000E217F9 /* FullTextSearchFinder.swift in Sources */,
C38EEF0A255B49A8007E1867 /* SNProtoEnvelope+Conversion.swift in Sources */,
C33FDD92255A582000E217F9 /* SignalIOS.pb.swift in Sources */,
C33FDCB3255A582000E217F9 /* TSContactThread.m in Sources */,
C33FDC45255A581F00E217F9 /* AppVersion.m in Sources */,
C33FDC7C255A582000E217F9 /* TSAttachment.m in Sources */,
C38EF3C7255B6DE7007E1867 /* ImageEditorCanvasView.swift in Sources */,
B8D8F16A256615DE0092EF10 /* Storage+Shared.swift in Sources */,
C33FDC46255A581F00E217F9 /* OpenGroupPoller.swift in Sources */,
@ -5066,7 +5080,6 @@
C33FDD05255A582000E217F9 /* OWSChunkedOutputStream.m in Sources */,
C33FDD10255A582000E217F9 /* TSOutgoingMessage.m in Sources */,
C33FDCFA255A582000E217F9 /* SignalIOSProto.swift in Sources */,
B8D8F12E2565FC910092EF10 /* Storage.swift in Sources */,
C33FDCC3255A582000E217F9 /* NSError+MessageSending.m in Sources */,
C33FDD2D255A582000E217F9 /* TSGroupModel.m in Sources */,
C33FDD9B255A582000E217F9 /* LKGroupUtilities.m in Sources */,
@ -5084,7 +5097,6 @@
C33FDD22255A582000E217F9 /* ContentProxy.swift in Sources */,
C38EF310255B6DBF007E1867 /* DebugLogger.m in Sources */,
C38EF38B255B6DD2007E1867 /* AttachmentPrepViewController.swift in Sources */,
C33FDD70255A582000E217F9 /* DataSource.m in Sources */,
C33FDD2F255A582000E217F9 /* AppReadiness.m in Sources */,
C33FDCEC255A582000E217F9 /* SSKIncrementingIdFinder.swift in Sources */,
C33FDC7B255A582000E217F9 /* NSSet+Functional.m in Sources */,
@ -5112,7 +5124,6 @@
C33FDCF4255A582000E217F9 /* Poller.swift in Sources */,
C38EF332255B6DBF007E1867 /* OWSPreferences.m in Sources */,
C33FDC26255A581F00E217F9 /* ProtoUtils.m in Sources */,
C33FDC48255A581F00E217F9 /* OWSFileSystem.m in Sources */,
C38EF39E255B6DDA007E1867 /* OWSQuotedReplyModel.m in Sources */,
B8D8F17725661AFA0092EF10 /* Storage+Jobs.swift in Sources */,
C33FDD85255A582000E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.m in Sources */,
@ -5148,6 +5159,7 @@
C38EF293255B6D86007E1867 /* AppSetup.m in Sources */,
C33FDDC0255A582000E217F9 /* SignalAccount.m in Sources */,
C33FDC58255A582000E217F9 /* ReverseDispatchQueue.swift in Sources */,
C3D9E53925677F5E0040E4F3 /* Attachment+Conversion.swift in Sources */,
C38EF3F4255B6DF7007E1867 /* ContactCellView.m in Sources */,
C33FDD29255A582000E217F9 /* OWSOutgoingReceiptManager.m in Sources */,
B8D8F0F42565F98E0092EF10 /* PushNotificationAPI.swift in Sources */,
@ -5160,7 +5172,6 @@
C38EF3F9255B6DF7007E1867 /* OWSLayerView.swift in Sources */,
C33FDCAC255A582000E217F9 /* ProxiedContentDownloader.swift in Sources */,
C33FDD03255A582000E217F9 /* WeakTimer.swift in Sources */,
C33FDCDC255A582000E217F9 /* OWSMediaUtils.swift in Sources */,
C33FDD41255A582000E217F9 /* JobQueue.swift in Sources */,
C38EF3B9255B6DE7007E1867 /* ImageEditorPinchGestureRecognizer.swift in Sources */,
C33FDC98255A582000E217F9 /* SwiftSingletons.swift in Sources */,
@ -5188,7 +5199,6 @@
C38EF331255B6DBF007E1867 /* UIGestureRecognizer+OWS.swift in Sources */,
C33FDDD8255A582000E217F9 /* OWSUploadOperation.m in Sources */,
C33FDDC5255A582000E217F9 /* OWSError.m in Sources */,
C33FDCAB255A582000E217F9 /* OWSThumbnailService.swift in Sources */,
C38EF38D255B6DD2007E1867 /* AttachmentCaptionViewController.swift in Sources */,
C33FDC2D255A581F00E217F9 /* ECKeyPair+Hexadecimal.swift in Sources */,
C33FDDC6255A582000E217F9 /* TSInfoMessage.m in Sources */,
@ -5228,20 +5238,31 @@
buildActionMask = 2147483647;
files = (
C3AABDDF2553ECF00042FF4C /* Array+Description.swift in Sources */,
C3D9E41525676C320040E4F3 /* Storage.swift in Sources */,
C3D9E39B256763C20040E4F3 /* AppContext.m in Sources */,
C3BBE0A82554D4DE0050F1E3 /* JSON.swift in Sources */,
C352A36D2557858E00338F3E /* NSTimer+Proxying.m in Sources */,
C3C2ABD22553C6C900C340D1 /* Data+SecureRandom.swift in Sources */,
C3D9E4C02567767F0040E4F3 /* DataSource.m in Sources */,
C3D9E43125676D3D0040E4F3 /* Configuration.swift in Sources */,
C3A7211A2558BCA10043A11F /* DiffieHellman.swift in Sources */,
C3A7225E2558C38D0043A11F /* Promise+Retaining.swift in Sources */,
C3D9E4D12567777D0040E4F3 /* OWSMediaUtils.swift in Sources */,
C3BBE0AA2554D4DE0050F1E3 /* Dictionary+Description.swift in Sources */,
C3D9E4DA256778410040E4F3 /* UIImage+OWS.m in Sources */,
C3D9E35E25675F640040E4F3 /* OWSFileSystem.m in Sources */,
C3C2AC2E2553CBEB00C340D1 /* String+Trimming.swift in Sources */,
C3D9E3C925676AF30040E4F3 /* TSYapDatabaseObject.m in Sources */,
C352A3A62557B60D00338F3E /* TSRequest.m in Sources */,
C3471ED42555386B00297E91 /* AESGCM.swift in Sources */,
C3A71F892558BA9F0043A11F /* Mnemonic.swift in Sources */,
C33FDEF8255A656D00E217F9 /* Promise+Delaying.swift in Sources */,
C3D9E41F25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift in Sources */,
C3BBE0A72554D4DE0050F1E3 /* Promise+Retrying.swift in Sources */,
C3D9E4F4256778AF0040E4F3 /* NSData+Image.m in Sources */,
C3BBE0A92554D4DE0050F1E3 /* HTTP.swift in Sources */,
C300A60D2554B31900555489 /* Logging.swift in Sources */,
C3D9E35525675EE10040E4F3 /* MIMETypeUtil.m in Sources */,
C3A7219A2558C1660043A11F /* AnyPromise+Conversion.swift in Sources */,
C300A6322554B6D100555489 /* NSDate+Timestamp.mm in Sources */,
);
@ -5253,7 +5274,6 @@
files = (
C3A7229C2558E4310043A11F /* OpenGroupMessage+Conversion.swift in Sources */,
C3471F4C25553AB000297E91 /* MessageReceiver+Decryption.swift in Sources */,
C3A722802558C4E10043A11F /* AttachmentStream.swift in Sources */,
C300A5D32554B05A00555489 /* TypingIndicator.swift in Sources */,
C3CA3B2F255CF84E00F4C6D4 /* NullMessage.swift in Sources */,
C3471ECB2555356A00297E91 /* MessageSender+Encryption.swift in Sources */,
@ -5262,6 +5282,7 @@
C3C2A74D2553A39700C340D1 /* VisibleMessage.swift in Sources */,
C352A3932557883D00338F3E /* JobDelegate.swift in Sources */,
C352A31325574F5200338F3E /* MessageReceiveJob.swift in Sources */,
C3D9E3BF25676AD70040E4F3 /* TSAttachmentStream.m in Sources */,
C3A722922558C8940043A11F /* OpenGroupAPIDelegate.swift in Sources */,
C3C2A7562553A3AB00C340D1 /* VisibleMessage+Quote.swift in Sources */,
C300A5FC2554B0A000555489 /* MessageReceiver.swift in Sources */,
@ -5269,6 +5290,7 @@
C352A3892557876500338F3E /* JobQueue.swift in Sources */,
C3BBE0B52554F0E10050F1E3 /* ProofOfWork.swift in Sources */,
C3A721902558C0CD0043A11F /* FileServerAPI.swift in Sources */,
C3D9E52725677DF20040E4F3 /* OWSThumbnailService.swift in Sources */,
C3BBE0802554CDD70050F1E3 /* Storage.swift in Sources */,
C379DCF4256735770002D4EB /* VisibleMessage+Attachment.swift in Sources */,
C3C2A7842553AAF300C340D1 /* SNProto.swift in Sources */,
@ -5282,6 +5304,7 @@
C3C2A7712553A41E00C340D1 /* ControlMessage.swift in Sources */,
C300A5BD2554B00D00555489 /* ReadReceipt.swift in Sources */,
C3BBE0762554CDA60050F1E3 /* Configuration.swift in Sources */,
C3D9E3BE25676AD70040E4F3 /* TSAttachmentPointer.m in Sources */,
C3471F4225553A4D00297E91 /* Threading.swift in Sources */,
C300A5DD2554B06600555489 /* ClosedGroupUpdate.swift in Sources */,
C3471FA42555439E00297E91 /* Notification+MessageSender.swift in Sources */,
@ -5290,6 +5313,7 @@
C352A349255781F400338F3E /* AttachmentDownloadJob.swift in Sources */,
C352A30925574D8500338F3E /* Message+Destination.swift in Sources */,
C300A5E72554B07300555489 /* ExpirationTimerUpdate.swift in Sources */,
C3D9E3C025676AD70040E4F3 /* TSAttachment.m in Sources */,
C3D697382564DCE6004AF766 /* MessageReceiverDelegate.swift in Sources */,
C352A2FF25574B6300338F3E /* MessageSendJob.swift in Sources */,
C3C2A75F2553A3C500C340D1 /* VisibleMessage+LinkPreview.swift in Sources */,

View File

@ -5,7 +5,7 @@
#import "OWSDatabaseMigrationRunner.h"
#import "OWSDatabaseMigration.h"
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -0,0 +1,2 @@
extension Storage : SessionMessagingKitStorageProtocol, SessionProtocolKitStorageProtocol, SessionSnodeKitStorageProtocol { }

View File

@ -3,7 +3,7 @@
//
#import "ThreadViewHelper.h"
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/OWSPrimaryStorage.h>
#import <SignalUtilitiesKit/TSDatabaseView.h>
#import <SignalUtilitiesKit/TSThread.h>

View File

@ -5,7 +5,7 @@
#import "OWSQuotedReplyModel.h"
#import "ConversationViewItem.h"
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SignalUtilitiesKit/MIMETypeUtil.h>
#import <SessionUtilitiesKit/MIMETypeUtil.h>
#import <SignalUtilitiesKit/TSAccountManager.h>
#import <SignalUtilitiesKit/TSAttachmentPointer.h>

View File

@ -312,40 +312,4 @@ public final class MessageReceiverDelegate : SessionMessagingKit.MessageReceiver
let ratchet = ClosedGroupRatchet(chainKey: senderKey.chainKey.toHexString(), keyIndex: UInt(senderKey.keyIndex), messageKeys: [])
Storage.shared.setClosedGroupRatchet(for: groupPublicKey, senderPublicKey: message.sender!, ratchet: ratchet, using: transaction)
}
// MARK: - Attachments
public func parseAttachments(from protos: [SNProtoAttachmentPointer]) -> [VisibleMessage.Attachment] {
return protos.compactMap { proto in
let result = VisibleMessage.Attachment()
result.fileName = proto.fileName
func inferContentType() -> String {
guard let fileName = result.fileName, let fileExtension = URL(string: fileName)?.pathExtension else { return OWSMimeTypeApplicationOctetStream }
return MIMETypeUtil.mimeType(forFileExtension: fileExtension) ?? OWSMimeTypeApplicationOctetStream
}
result.contentType = proto.contentType ?? inferContentType()
result.key = proto.key
result.digest = proto.digest
let kind: VisibleMessage.Attachment.Kind
if proto.hasFlags && (proto.flags & UInt32(SNProtoAttachmentPointer.SNProtoAttachmentPointerFlags.voiceMessage.rawValue)) > 0 {
kind = .voiceMessage
} else {
kind = .generic
}
result.kind = kind
result.caption = proto.hasCaption ? proto.caption : nil
let size: CGSize
if proto.hasWidth && proto.width > 0 && proto.hasHeight && proto.height > 0 {
size = CGSize(width: Int(proto.width), height: Int(proto.height))
} else {
size = CGSize.zero
}
result.size = size
result.sizeInBytes = proto.size > 0 ? UInt(proto.size) : nil
result.url = proto.url
return result.isValid ? result : nil
}
}
}

View File

@ -7,6 +7,10 @@ public final class MessageSenderDelegate : SessionMessagingKit.MessageSenderDele
guard let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) else { return }
tsMessage.update(withSentRecipient: message.recipient!, wasSentByUD: true, transaction: transaction as! YapDatabaseReadWriteTransaction)
}
public func handleFailedMessageSend(_ message: Message, using transaction: Any) {
// TODO: Implement
}
public func requestSenderKey(for groupPublicKey: String, senderPublicKey: String, using transaction: Any) {
SNLog("Requesting sender key for group public key: \(groupPublicKey), sender public key: \(senderPublicKey).")

View File

@ -8,7 +8,6 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[];
@import SessionSnodeKit;
@import SessionUtilitiesKit;
#import <SignalUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/AppReadiness.h>
#import <SignalUtilitiesKit/AppSetup.h>
#import <SignalUtilitiesKit/AppVersion.h>
@ -17,7 +16,6 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[];
#import <SignalUtilitiesKit/DebugLogger.h>
#import <SignalUtilitiesKit/Environment.h>
#import <SignalUtilitiesKit/LKGroupUtilities.h>
#import <SignalUtilitiesKit/MIMETypeUtil.h>
#import <SignalUtilitiesKit/NotificationsProtocol.h>
#import <SignalUtilitiesKit/NSArray+Functional.h>
#import <SignalUtilitiesKit/NSAttributedString+OWS.h>
@ -38,7 +36,6 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[];
#import <SignalUtilitiesKit/OWSDisappearingMessagesJob.h>
#import <SignalUtilitiesKit/OWSDispatch.h>
#import <SignalUtilitiesKit/OWSError.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SignalUtilitiesKit/OWSFormat.h>
#import <SignalUtilitiesKit/OWSHTTPSecurityPolicy.h>
#import <SignalUtilitiesKit/OWSIdentityManager.h>

View File

@ -3,7 +3,7 @@
//
#import "OWSPreferences.h"
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/NSNotificationCenter+OWS.h>
#import <SignalUtilitiesKit/NSUserDefaults+OWS.h>
#import <SignalUtilitiesKit/OWSSyncManagerProtocol.h>

View File

@ -6,7 +6,7 @@
#import "Environment.h"
#import "OWSAudioPlayer.h"
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
#import <SignalUtilitiesKit/OWSPrimaryStorage.h>
#import <SignalUtilitiesKit/TSThread.h>
#import <SignalUtilitiesKit/YapDatabaseConnection+OWS.h>

View File

@ -8,14 +8,14 @@
#import <PromiseKit/AnyPromise.h>
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import "UIUtil.h"
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/AppReadiness.h>
#import <SignalUtilitiesKit/MIMETypeUtil.h>
#import <SessionUtilitiesKit/MIMETypeUtil.h>
#import <SignalUtilitiesKit/NSData+Image.h>
#import <SignalUtilitiesKit/NSNotificationCenter+OWS.h>
#import <SignalUtilitiesKit/NSString+SSK.h>
#import <SignalUtilitiesKit/OWSBlockingManager.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
#import <SignalUtilitiesKit/OWSPrimaryStorage+Loki.h>
#import <SignalUtilitiesKit/SSKEnvironment.h>
#import <SignalUtilitiesKit/TSAccountManager.h>

View File

@ -6,10 +6,10 @@
#import <PromiseKit/AnyPromise.h>
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/NSNotificationCenter+OWS.h>
#import <SignalUtilitiesKit/NSString+SSK.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
#import <SignalUtilitiesKit/OWSPrimaryStorage.h>
#import <SignalUtilitiesKit/SSKEnvironment.h>
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>

View File

@ -10,7 +10,7 @@
#import <SignalUtilitiesKit/UIFont+OWS.h>
#import <SignalUtilitiesKit/UIUtil.h>
#import <SignalUtilitiesKit/UIView+OWS.h>
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/SignalAccount.h>
#import <SignalUtilitiesKit/TSAccountManager.h>
#import <SignalUtilitiesKit/OWSTextField.h>

View File

@ -4,7 +4,7 @@
#import <SignalUtilitiesKit/UIColor+OWS.h>
#import <SignalUtilitiesKit/UIFont+OWS.h>
#import <SignalUtilitiesKit/MIMETypeUtil.h>
#import <SessionUtilitiesKit/MIMETypeUtil.h>
#import <SignalUtilitiesKit/UIImage+OWS.h>
#define ACCESSIBILITY_IDENTIFIER_WITH_NAME(_root_view, _variable_name) \

View File

@ -5,7 +5,7 @@
#import "UIUtil.h"
#import "Theme.h"
#import "UIColor+OWS.h"
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SessionUIKit/SessionUIKit.h>

View File

@ -5,7 +5,7 @@
#import "UIView+OWS.h"
#import "OWSMath.h"
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -11,7 +11,7 @@
#import "UIViewController+OWS.h"
#import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -4,7 +4,7 @@
#import "AttachmentSharing.h"
#import "UIUtil.h"
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/TSAttachmentStream.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -5,8 +5,8 @@
#import "DebugLogger.h"
#import "OWSScrubbingLogFormatter.h"
#import <SignalUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/OWSFileSystem.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/OWSFileSystem.h>
#pragma mark Logging - Production logging wants us to write some logs to a file in case we need it for debugging.
#import <CocoaLumberjack/DDTTYLogger.h>

View File

@ -4,7 +4,7 @@
#import "NSAttributedString+OWS.h"
#import "UIView+OWS.h"
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -2,7 +2,7 @@
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalCoreKit/NSObject+OWS.h>
#import <SignalCoreKit/OWSAsserts.h>

View File

@ -5,7 +5,7 @@
#import "VersionMigrations.h"
#import "OWSDatabaseMigrationRunner.h"
#import "SignalKeyingStorage.h"
#import <SignalUtilitiesKit/AppContext.h>
#import <SessionUtilitiesKit/AppContext.h>
#import <SignalUtilitiesKit/AppVersion.h>
#import <SignalUtilitiesKit/NSUserDefaults+OWS.h>
#import <SignalUtilitiesKit/OWSPrimaryStorage+Loki.h>