diff --git a/MTProtoKit/MTProto.m b/MTProtoKit/MTProto.m index 7c6dc87cd5..d3f5030198 100644 --- a/MTProtoKit/MTProto.m +++ b/MTProtoKit/MTProto.m @@ -331,43 +331,32 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; tempAuthKeyType = MTDatacenterAuthTempKeyTypeMedia; } - if (_transportScheme == nil) - { - if ((_mtState & MTProtoStateAwaitingDatacenterScheme) == 0) - { + if (_transportScheme == nil) { + if ((_mtState & MTProtoStateAwaitingDatacenterScheme) == 0) { [self setMtState:_mtState | MTProtoStateAwaitingDatacenterScheme]; [_context transportSchemeForDatacenterWithIdRequired:_datacenterId media:_media]; } - } - else if (!_useUnauthorizedMode && [_context authInfoForDatacenterWithId:_datacenterId] == nil) - { - if ((_mtState & MTProtoStateAwaitingDatacenterAuthorization) == 0) - { + } else if (!_useUnauthorizedMode && [_context authInfoForDatacenterWithId:_datacenterId] == nil) { + if ((_mtState & MTProtoStateAwaitingDatacenterAuthorization) == 0) { [self setMtState:_mtState | MTProtoStateAwaitingDatacenterAuthorization]; [_context authInfoForDatacenterWithIdRequired:_datacenterId isCdn:_cdn]; } - } - else if (!_useUnauthorizedMode && _useTempAuthKeys && [[_context authInfoForDatacenterWithId:_datacenterId] tempAuthKeyWithType:tempAuthKeyType] == nil) { - if ((_mtState & MTProtoStateAwaitingDatacenterTempAuthKey) == 0) - { + } else if (!_useUnauthorizedMode && _useTempAuthKeys && [[_context authInfoForDatacenterWithId:_datacenterId] tempAuthKeyWithType:tempAuthKeyType] == nil) { + if ((_mtState & MTProtoStateAwaitingDatacenterTempAuthKey) == 0) { [self setMtState:_mtState | MTProtoStateAwaitingDatacenterTempAuthKey]; [_context tempAuthKeyForDatacenterWithIdRequired:_datacenterId keyType:tempAuthKeyType]; } } - else if (_requiredAuthToken != nil && !_useUnauthorizedMode && ![_requiredAuthToken isEqual:[_context authTokenForDatacenterWithId:_datacenterId]]) - { - if ((_mtState & MTProtoStateAwaitingDatacenterAuthToken) == 0) - { + else if (_requiredAuthToken != nil && !_useUnauthorizedMode && ![_requiredAuthToken isEqual:[_context authTokenForDatacenterWithId:_datacenterId]]) { + if ((_mtState & MTProtoStateAwaitingDatacenterAuthToken) == 0) { [self setMtState:_mtState | MTProtoStateAwaitingDatacenterAuthToken]; [_context authTokenForDatacenterWithIdRequired:_datacenterId authToken:_requiredAuthToken masterDatacenterId:_authTokenMasterDatacenterId]; } - } - else - { + } else { MTTransport *transport = nil; transport = [_transportScheme createTransportWithContext:_context datacenterId:_datacenterId delegate:self usageCalculationInfo:_usageCalculationInfo]; @@ -515,7 +504,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (notifyAboutServiceTask) { if (MTLogEnabled()) { - MTLog(@"[MTProto#%p service tasks state: %d, resend: %s]", self, _mtState, true ? "yes" : "no"); + MTLog(@"[MTProto#%p service tasks state: %d, resend: %s]", self, _mtState, "yes"); } for (id messageService in _messageServices) @@ -567,7 +556,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; if (!performingServiceTasks) { if (MTLogEnabled()) { - MTLog(@"[MTProto#%p service tasks state: %d, resend: %s]", self, _mtState, false ? "yes" : "no"); + MTLog(@"[MTProto#%p service tasks state: %d, resend: %s]", self, _mtState, "no"); } for (id messageService in _messageServices) @@ -875,6 +864,8 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; return; } + //bool debugResetTransport = false; + bool extendedPadding = false; if (transport.proxySettings != nil && transport.proxySettings.secret.length != 0) { if ([MTSocksProxySettings secretSupportsExtendedPadding:transport.proxySettings.secret]) { @@ -998,7 +989,18 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; } if (MTLogEnabled()) { - MTLog(@"[MTProto#%p preparing %@]", self, [self outgoingMessageDescription:outgoingMessage messageId:messageId messageSeqNo:messageSeqNo]); + NSString *messageDescription = [self outgoingMessageDescription:outgoingMessage messageId:messageId messageSeqNo:messageSeqNo]; + /*if ([messageDescription hasPrefix:@"updates.getDifference"]) { + static dispatch_once_t onceToken; + __block bool flag = false; + dispatch_once(&onceToken, ^{ + flag = true; + }); + if (flag) { + debugResetTransport = true; + } + }*/ + MTLog(@"[MTProto#%p preparing %@]", self, messageDescription); } if (!monotonityViolated || _useUnauthorizedMode) @@ -1473,11 +1475,15 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; } else if (transactionReady != nil) transactionReady(nil); + + /*if (debugResetTransport) { + [self resetTransport]; + [self requestTransportTransaction]; + }*/ }]; } -- (NSData *)_dataForEncryptedContainerWithMessages:(NSArray *)preparedMessages sessionInfo:(MTSessionInfo *)sessionInfo quickAckId:(int32_t *)quickAckId address:(MTDatacenterAddress *)address extendedPadding:(bool)extendedPadding -{ +- (NSData *)_dataForEncryptedContainerWithMessages:(NSArray *)preparedMessages sessionInfo:(MTSessionInfo *)sessionInfo quickAckId:(int32_t *)quickAckId address:(MTDatacenterAddress *)address extendedPadding:(bool)extendedPadding { MTDatacenterAuthKey *effectiveAuthKey; if (_useTempAuthKeys) { MTDatacenterAuthTempKeyType tempAuthKeyType = MTDatacenterAuthTempKeyTypeMain; @@ -1499,8 +1505,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; [containerOs writeInt32:(int32_t)preparedMessages.count]; int64_t salt = 0; - for (MTPreparedMessage *preparedMessage in preparedMessages) - { + for (MTPreparedMessage *preparedMessage in preparedMessages) { salt = preparedMessage.salt; [containerOs writeInt64:preparedMessage.messageId]; @@ -1517,13 +1522,11 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; MTOutputStream *decryptedOs = [[MTOutputStream alloc] init]; int64_t containerMessageId = [sessionInfo generateClientMessageId:NULL]; - if (containerMessageIds.count != 0) - { + if (containerMessageIds.count != 0) { [sessionInfo addContainerMessageIdMapping:containerMessageId childMessageIds:containerMessageIds]; NSMutableString *idsString = [[NSMutableString alloc] init]; - for (NSNumber *nMessageId in containerMessageIds) - { + for (NSNumber *nMessageId in containerMessageIds) { if (idsString.length != 0) [idsString appendString:@","]; [idsString appendFormat:@"%lld", [nMessageId longLongValue]]; diff --git a/MTProtoKit/MTRequest.h b/MTProtoKit/MTRequest.h index 04dd8d52c4..d181a55abd 100644 --- a/MTProtoKit/MTRequest.h +++ b/MTProtoKit/MTRequest.h @@ -15,6 +15,7 @@ @property (nonatomic, strong, readonly) id (^responseParser)(NSData *); @property (nonatomic, strong) NSArray *decorators; +@property (nonatomic) int32_t transactionResetStateVersion; @property (nonatomic, strong) MTRequestContext *requestContext; @property (nonatomic, strong) MTRequestErrorContext *errorContext; @property (nonatomic) bool hasHighPriority; diff --git a/MTProtoKit/MTRequestMessageService.m b/MTProtoKit/MTRequestMessageService.m index 6acae37f17..a6b978edbb 100644 --- a/MTProtoKit/MTRequestMessageService.m +++ b/MTProtoKit/MTRequestMessageService.m @@ -461,12 +461,21 @@ if (messages.count != 0) { + NSMutableDictionary *requestInternalIdToTransactionResetStateVersion = [[NSMutableDictionary alloc] init]; + for (MTRequest *request in _requests) { + requestInternalIdToTransactionResetStateVersion[request.internalId] = @(request.transactionResetStateVersion); + } return [[MTMessageTransaction alloc] initWithMessagePayload:messages prepared:^(NSDictionary *messageInternalIdToPreparedMessage) { for (MTRequest *request in _requests) { id messageInternalId = requestInternalIdToMessageInternalId[request.internalId]; if (messageInternalId != nil) { MTPreparedMessage *preparedMessage = messageInternalIdToPreparedMessage[messageInternalId]; if (preparedMessage != nil) { + NSNumber *nTransactionResetStateVersion = requestInternalIdToTransactionResetStateVersion[request.internalId]; + if (nTransactionResetStateVersion != nil && [nTransactionResetStateVersion intValue] != request.transactionResetStateVersion) { + continue; + } + MTRequestContext *requestContext = [[MTRequestContext alloc] initWithMessageId:preparedMessage.messageId messageSeqNo:preparedMessage.seqNo transactionId:nil quickAckId:0]; requestContext.willInitializeApi = requestsWillInitializeApi; requestContext.waitingForMessageId = true; @@ -492,6 +501,10 @@ MTPreparedMessage *preparedMessage = messageInternalIdToPreparedMessage[messageInternalId]; if (preparedMessage != nil && messageInternalIdToTransactionId[messageInternalId] != nil) { + NSNumber *nTransactionResetStateVersion = requestInternalIdToTransactionResetStateVersion[request.internalId]; + if (nTransactionResetStateVersion != nil && [nTransactionResetStateVersion intValue] != request.transactionResetStateVersion) { + continue; + } MTRequestContext *requestContext = [[MTRequestContext alloc] initWithMessageId:preparedMessage.messageId messageSeqNo:preparedMessage.seqNo transactionId:messageInternalIdToTransactionId[messageInternalId] quickAckId:(int32_t)[messageInternalIdToQuickAckId[messageInternalId] intValue]]; requestContext.willInitializeApi = requestsWillInitializeApi; request.requestContext = requestContext; @@ -789,6 +802,9 @@ if (request.requestContext != nil && request.requestContext.transactionId != nil && [transactionIds containsObject:request.requestContext.transactionId]) { request.requestContext.transactionId = nil; + request.requestContext.delivered = false; + request.requestContext.waitingForMessageId = false; + request.transactionResetStateVersion += 1; requestTransaction = true; } } @@ -803,9 +819,12 @@ for (MTRequest *request in _requests) { - if (request.requestContext != nil && request.requestContext.transactionId != nil) + if (request.requestContext != nil) { request.requestContext.transactionId = nil; + request.requestContext.delivered = false; + request.requestContext.waitingForMessageId = false; + request.transactionResetStateVersion += 1; requestTransaction = true; } }