// // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // #import "OWSOutgoingCallMessage.h" #import "ProtoUtils.h" #import "SignalRecipient.h" #import "TSContactThread.h" #import #import NS_ASSUME_NONNULL_BEGIN @implementation OWSOutgoingCallMessage - (instancetype)initWithThread:(TSThread *)thread { // MJK TODO - safe to remove senderTimestamp self = [super initOutgoingMessageWithTimestamp:[NSDate ows_millisecondTimeStamp] inThread:thread messageBody:nil attachmentIds:[NSMutableArray new] expiresInSeconds:0 expireStartedAt:0 isVoiceMessage:NO groupMetaMessage:TSGroupMetaMessageUnspecified quotedMessage:nil contactShare:nil linkPreview:nil]; if (!self) { return self; } return self; } - (instancetype)initWithThread:(TSThread *)thread offerMessage:(SSKProtoCallMessageOffer *)offerMessage { self = [self initWithThread:thread]; if (!self) { return self; } _offerMessage = offerMessage; return self; } - (instancetype)initWithThread:(TSThread *)thread answerMessage:(SSKProtoCallMessageAnswer *)answerMessage { self = [self initWithThread:thread]; if (!self) { return self; } _answerMessage = answerMessage; return self; } - (instancetype)initWithThread:(TSThread *)thread iceUpdateMessages:(NSArray *)iceUpdateMessages { self = [self initWithThread:thread]; if (!self) { return self; } _iceUpdateMessages = iceUpdateMessages; return self; } - (instancetype)initWithThread:(TSThread *)thread hangupMessage:(SSKProtoCallMessageHangup *)hangupMessage { self = [self initWithThread:thread]; if (!self) { return self; } _hangupMessage = hangupMessage; return self; } - (instancetype)initWithThread:(TSThread *)thread busyMessage:(SSKProtoCallMessageBusy *)busyMessage { self = [self initWithThread:thread]; if (!self) { return self; } _busyMessage = busyMessage; return self; } #pragma mark - TSOutgoingMessage overrides - (BOOL)shouldSyncTranscript { return NO; } - (BOOL)isSilent { // Avoid "phantom messages" for "outgoing call messages". return YES; } - (nullable NSData *)buildPlainTextData:(SignalRecipient *)recipient { OWSAssertDebug(recipient); SSKProtoContentBuilder *builder = [SSKProtoContent builder]; [builder setCallMessage:[self buildCallMessage:recipient.recipientId]]; NSError *error; NSData *_Nullable data = [builder buildSerializedDataAndReturnError:&error]; if (error || !data) { OWSFailDebug(@"could not serialize protobuf: %@", error); return nil; } return data; } - (nullable SSKProtoCallMessage *)buildCallMessage:(NSString *)recipientId { SSKProtoCallMessageBuilder *builder = [SSKProtoCallMessage builder]; if (self.offerMessage) { [builder setOffer:self.offerMessage]; } if (self.answerMessage) { [builder setAnswer:self.answerMessage]; } if (self.iceUpdateMessages.count > 0) { [builder setIceUpdate:self.iceUpdateMessages]; } if (self.hangupMessage) { [builder setHangup:self.hangupMessage]; } if (self.busyMessage) { [builder setBusy:self.busyMessage]; } [ProtoUtils addLocalProfileKeyIfNecessary:self.thread recipientId:recipientId callMessageBuilder:builder]; NSError *error; SSKProtoCallMessage *_Nullable result = [builder buildAndReturnError:&error]; if (error || !result) { OWSFailDebug(@"could not build protobuf: %@", error); return nil; } return result; } #pragma mark - TSYapDatabaseObject overrides - (uint)ttl { return (uint)[LKTTLUtilities getTTLFor:LKMessageTypeCall]; } - (BOOL)shouldBeSaved { return NO; } - (NSString *)debugDescription { NSString *className = NSStringFromClass([self class]); NSString *payload; if (self.offerMessage) { payload = @"offerMessage"; } else if (self.answerMessage) { payload = @"answerMessage"; } else if (self.iceUpdateMessages.count > 0) { payload = [NSString stringWithFormat:@"iceUpdateMessages: %lu", (unsigned long)self.iceUpdateMessages.count]; } else if (self.hangupMessage) { payload = @"hangupMessage"; } else if (self.busyMessage) { payload = @"busyMessage"; } else { payload = @"none"; } return [NSString stringWithFormat:@"%@ with payload: %@", className, payload]; } @end NS_ASSUME_NONNULL_END