Unpack oversize text messages if possible.

pull/1/head
Matthew Chen 8 years ago
parent 6e70c479eb
commit 992e926142

@ -3893,7 +3893,6 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
// //
// We convert large text messages to attachments // We convert large text messages to attachments
// which are presented as normal text messages. // which are presented as normal text messages.
const NSUInteger kOversizeTextMessageSizeThreshold = 16 * 1024;
BOOL didAddToProfileWhitelist = [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread]; BOOL didAddToProfileWhitelist = [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread];
TSOutgoingMessage *message; TSOutgoingMessage *message;
if ([text lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= kOversizeTextMessageSizeThreshold) { if ([text lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= kOversizeTextMessageSizeThreshold) {

@ -193,39 +193,63 @@ NS_ASSUME_NONNULL_BEGIN
} }
#endif #endif
void (^sendCompletion)(NSError *_Nullable, TSOutgoingMessage *message) = ^( void (^sendCompletion)(NSError *_Nullable, TSOutgoingMessage *) = ^(
NSError *_Nullable error, TSOutgoingMessage *message) { NSError *_Nullable error, TSOutgoingMessage *message) {
AssertIsOnMainThread();
if (error) {
[fromViewController
dismissViewControllerAnimated:YES
completion:^(void) {
DDLogInfo(@"%@ Sending attachment failed with error: %@", self.logTag, error);
[self showSendFailureAlertWithError:error
message:message
fromViewController:fromViewController];
}];
return;
}
DDLogInfo(@"%@ Sending attachment succeeded.", self.logTag); dispatch_async(dispatch_get_main_queue(), ^{
[self.shareViewDelegate shareViewWasCompleted]; if (error) {
[fromViewController
dismissViewControllerAnimated:YES
completion:^(void) {
DDLogInfo(
@"%@ Sending attachment failed with error: %@", self.logTag, error);
[self showSendFailureAlertWithError:error
message:message
fromViewController:fromViewController];
}];
return;
}
DDLogInfo(@"%@ Sending attachment succeeded.", self.logTag);
[self.shareViewDelegate shareViewWasCompleted];
});
}; };
[fromViewController presentViewController:progressAlert [fromViewController
animated:YES presentViewController:progressAlert
completion:^(void) { animated:YES
__block TSOutgoingMessage *outgoingMessage = completion:^(void) {
[ThreadUtil sendMessageWithAttachment:self.attachment __block TSOutgoingMessage *outgoingMessage = nil;
inThread:self.thread if (self.attachment.isOversizeText
messageSender:self.messageSender && self.attachment.dataLength <= kOversizeTextMessageSizeThreshold) {
completion:^(NSError *_Nullable error) { // Try to unpack oversize text messages and send them as regular
sendCompletion(error, outgoingMessage); // text messages if possible.
}]; NSData *_Nullable data = self.attachment.data;
if (!data) {
self.outgoingMessage = outgoingMessage; DDLogError(@"%@ couldn't load data for oversize text attachment", self.logTag);
} else {
NSString *messageText =
[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
outgoingMessage = [ThreadUtil sendMessageWithText:messageText
inThread:self.thread
messageSender:self.messageSender
success:^{
sendCompletion(nil, outgoingMessage);
}
failure:^(NSError *_Nonnull error) {
sendCompletion(error, outgoingMessage);
}]; }];
return;
}
}
outgoingMessage = [ThreadUtil sendMessageWithAttachment:self.attachment
inThread:self.thread
messageSender:self.messageSender
completion:^(NSError *_Nullable error) {
sendCompletion(error, outgoingMessage);
}];
}];
} }
- (void)showSendFailureAlertWithError:(NSError *)error - (void)showSendFailureAlertWithError:(NSError *)error

@ -1,11 +1,13 @@
// //
// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// //
#import "DataSource.h" #import "DataSource.h"
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
extern const NSUInteger kOversizeTextMessageSizeThreshold;
@class ContactsUpdater; @class ContactsUpdater;
@class OWSBlockingManager; @class OWSBlockingManager;
@class OWSUploadingService; @class OWSUploadingService;

@ -45,6 +45,8 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
const NSUInteger kOversizeTextMessageSizeThreshold = 16 * 1024;
void AssertIsOnSendingQueue() void AssertIsOnSendingQueue()
{ {
#ifdef DEBUG #ifdef DEBUG
@ -383,6 +385,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
failure:(void (^)(NSError *error))failureHandler failure:(void (^)(NSError *error))failureHandler
{ {
OWSAssert(message); OWSAssert(message);
if (message.body.length > 0) {
OWSAssert([message.body lengthOfBytesUsingEncoding:NSUTF8StringEncoding] <= kOversizeTextMessageSizeThreshold);
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// This method will use a read/write transaction. This transaction // This method will use a read/write transaction. This transaction

@ -584,6 +584,9 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
var rawDataSource: DataSource? var rawDataSource: DataSource?
if utiType == (kUTTypeURL as String) { if utiType == (kUTTypeURL as String) {
// Share URLs as oversize text messages whose text content is the URL. // Share URLs as oversize text messages whose text content is the URL.
//
// NOTE: SharingThreadPickerViewController will try to unpack them
// and send them as normal text messages if possible.
let urlString = url.absoluteString let urlString = url.absoluteString
rawDataSource = DataSourceValue.dataSource(withOversizeText:urlString) rawDataSource = DataSourceValue.dataSource(withOversizeText:urlString)
} else { } else {

Loading…
Cancel
Save