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,15 +193,16 @@ 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();
dispatch_async(dispatch_get_main_queue(), ^{
if (error) { if (error) {
[fromViewController [fromViewController
dismissViewControllerAnimated:YES dismissViewControllerAnimated:YES
completion:^(void) { completion:^(void) {
DDLogInfo(@"%@ Sending attachment failed with error: %@", self.logTag, error); DDLogInfo(
@"%@ Sending attachment failed with error: %@", self.logTag, error);
[self showSendFailureAlertWithError:error [self showSendFailureAlertWithError:error
message:message message:message
fromViewController:fromViewController]; fromViewController:fromViewController];
@ -211,20 +212,43 @@ NS_ASSUME_NONNULL_BEGIN
DDLogInfo(@"%@ Sending attachment succeeded.", self.logTag); DDLogInfo(@"%@ Sending attachment succeeded.", self.logTag);
[self.shareViewDelegate shareViewWasCompleted]; [self.shareViewDelegate shareViewWasCompleted];
});
}; };
[fromViewController presentViewController:progressAlert [fromViewController
presentViewController:progressAlert
animated:YES animated:YES
completion:^(void) { completion:^(void) {
__block TSOutgoingMessage *outgoingMessage = __block TSOutgoingMessage *outgoingMessage = nil;
[ThreadUtil sendMessageWithAttachment:self.attachment if (self.attachment.isOversizeText
&& self.attachment.dataLength <= kOversizeTextMessageSizeThreshold) {
// Try to unpack oversize text messages and send them as regular
// text messages if possible.
NSData *_Nullable data = self.attachment.data;
if (!data) {
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 inThread:self.thread
messageSender:self.messageSender messageSender:self.messageSender
completion:^(NSError *_Nullable error) { success:^{
sendCompletion(nil, outgoingMessage);
}
failure:^(NSError *_Nonnull error) {
sendCompletion(error, outgoingMessage); sendCompletion(error, outgoingMessage);
}]; }];
return;
}
}
self.outgoingMessage = outgoingMessage; outgoingMessage = [ThreadUtil sendMessageWithAttachment:self.attachment
inThread:self.thread
messageSender:self.messageSender
completion:^(NSError *_Nullable error) {
sendCompletion(error, outgoingMessage);
}];
}]; }];
} }

@ -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