private void SendAsyncInternal <T>(string caption, double timeout, TLObject obj, Action <T> callback, Action fastCallback, Action <TLRPCError> faultCallback) { int sequenceNumber; long messageId; lock (_activeTransportRoot) { sequenceNumber = _activeTransport.SequenceNumber * 2 + 1; _activeTransport.SequenceNumber++; messageId = _activeTransport.GenerateMessageId(true); } var transportMessage = new TLContainerTransportMessage { MsgId = messageId, SeqNo = sequenceNumber, Query = obj }; var now = DateTime.Now; var sendBeforeTime = now.AddSeconds(timeout); var sendingItem = new HistoryItem { SendTime = now, SendBeforeTime = sendBeforeTime, Caption = caption, Object = obj, Message = transportMessage, Callback = result => callback((T)result), FastCallback = fastCallback, FaultCallback = null, // чтобы не вылететь по таймауту не сохраняем сюда faultCallback, а просто запоминаем последнюю ошибку, FaultQueueCallback = faultCallback, // для MTProto.CleanupQueue InvokeAfter = null, // устанвливаем в момент создания контейнера historyItems.LastOrDefault(), Status = RequestStatus.ReadyToSend, }; //обрабатываем ошибки sendingItem.FaultCallback = error => ProcessFault(sendingItem, error); AddActionInfoToFile(TLUtils.DateToUniversalTimeTLInt(ClientTicksDelta, sendBeforeTime), obj); lock (_sendingQueueSyncRoot) { _sendingQueue.Add(sendingItem); StartSendingTimer(); } ProcessQueue(); }
private static TLEncryptedTransportMessage CreateTLEncryptedMessage(byte[] authKey, TLContainerTransportMessage containerTransportMessage) { var message = new TLEncryptedTransportMessage { Data = containerTransportMessage.ToBytes() }; return(message.Encrypt(authKey)); }
private void GetPassportRequestsInternal(TLObject[] requests, Action <TLObject> getResultCallback, Action <TLRPCError> faultCallback = null) { var container = new TLContainer { Messages = new List <TLContainerTransportMessage>() }; var historyItems = new List <HistoryItem>(); for (var i = 0; i < requests.Length; i++) { var obj = requests[i]; int sequenceNumber; TLLong messageId; lock (_activeTransportRoot) { sequenceNumber = _activeTransport.SequenceNumber * 2 + 1; _activeTransport.SequenceNumber++; messageId = _activeTransport.GenerateMessageId(true); } var data = i > 0 ? new TLInvokeAfterMsg { MsgId = container.Messages[i - 1].MessageId, Object = obj } : obj; var transportMessage = new TLContainerTransportMessage { MessageId = messageId, SeqNo = new TLInt(sequenceNumber), MessageData = data }; var historyItem = new HistoryItem { SendTime = DateTime.Now, Caption = "passport.item" + i, Object = obj, Message = transportMessage, Callback = getResultCallback, AttemptFailed = null, FaultCallback = faultCallback, ClientTicksDelta = ClientTicksDelta, Status = RequestStatus.Sent, }; historyItems.Add(historyItem); container.Messages.Add(transportMessage); } lock (_historyRoot) { foreach (var item in historyItems) { _history[item.Hash] = item; } } #if DEBUG NotifyOfPropertyChange(() => History); #endif SendNonInformativeMessage <TLObject>("passport.container", container, result => { }, faultCallback); }