public async Task ConnectAsync(bool reconnect = false) { if (ClientSettings.Session.AuthKey == null || reconnect) { var result = await DoAuthentication(); ClientSettings.Session.AuthKey = result.AuthKey; ClientSettings.Session.TimeOffset = result.TimeOffset; SessionStore.Save(); } //set-up layer var config = new TlRequestGetConfig(); var request = new TlRequestInitConnection { ApiId = ClientSettings.AppId, AppVersion = "1.0.0", DeviceModel = "PC", LangCode = "en", Query = config, SystemVersion = "Win 10.0" }; ConfirmationSendService.StartSendingConfirmation(); ProtoRecieveService.StartReceiving(); var response = await SendRequestAsync <TlConfig>(new TlRequestInvokeWithLayer { Layer = 57, Query = request }); _dcOptions = response.DcOptions.Lists; }
public void StartReceiving() { if (_recievingCts != null && _recievingCts.IsCancellationRequested) { return; } _recievingCts = new CancellationTokenSource(); Task.Run( () => { while (!_recievingCts.Token.IsCancellationRequested) { try { var recieveTask = TcpTransport.Receieve(); recieveTask.Wait(_recievingCts.Token); var recieveData = recieveTask.Result; var decodedData = DecodeMessage(recieveData); Log.Debug($"Recieve message with remote id: {decodedData.Item2}"); ProcessReceivedMessage(decodedData.Item1); ConfirmationSendService.AddForSend(decodedData.Item2); } catch (Exception e) { Log.Error("Recieve message failed", e); } } }); }
private async Task StartRecievingTask(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { try { var recieveData = await TcpTransport.Receieve().ConfigureAwait(false); var decodedData = DecodeMessage(recieveData); Log.Debug($"Receive message with remote id: {decodedData.Item2}"); ProcessReceivedMessage(decodedData.Item1); ConfirmationSendService.AddForSend(decodedData.Item2); } catch (Exception e) { Log.Error("Receive message failed. Reconnecting", e); var request = new RequestInvokeWithLayer { Layer = SchemaInfo.SchemaVersion, Query = new RequestInitConnection { ApiId = ClientSettings.AppId, AppVersion = "1.0.0", DeviceModel = "PC", LangCode = "en", LangPack = "tdesktop", Query = new RequestGetConfig(), SystemLangCode = "en", SystemVersion = "Win 10.0" } }; try { await TcpTransport.Disconnect().ConfigureAwait(false); var sendTask = await Sender.SendWithConfim(request).ConfigureAwait(false); ResponseResultGetter.Receive(sendTask.Item2).ContinueWith( async task => { await sendTask.Item1.ConfigureAwait(false); }); } catch { Log.Error("Failed to reconnect", e); } } } }
private void ProcessContainerMessage(BinaryReader reader) { Log.Debug("Handle container"); var size = reader.ReadInt32(); for (var i = 0; i < size; i++) { var innerMessageId = reader.ReadUInt64(); var innerSequence = reader.ReadInt32(); var innerLength = reader.ReadInt32(); Log.Debug($"Process responce with inner id = '{innerMessageId}' into container"); ProcessReceivedMessage(reader.ReadBytes(innerLength)); ConfirmationSendService.AddForSend(innerMessageId); } }
private void ProcessReceivedMessage(IObject obj) { if (Log.IsDebugEnabled) { var jObject = JsonConvert.SerializeObject(obj); Log.Debug($"Try handle response for object: {obj} \n{jObject}"); } switch (obj) { case var o when RecieveHandlersMap.TryGetValue(o.GetType(), out var handler): Log.Debug($"Handler found - {handler}"); handler.HandleResponce(obj); break; case TMsgContainer container: foreach (var containerMessage in container.Messages) { ProcessReceivedMessage(containerMessage.Body); ConfirmationSendService.AddForSend(containerMessage.MsgId); } break; case TgZipPacked zipPacked: var unzippedData = ZipPackedHandler.HandleGZipPacked(zipPacked); ProcessReceivedMessage(unzippedData); break; default: if (Log.IsErrorEnabled) { var jObject = JsonConvert.SerializeObject(obj); Log.Error($"Cannot handle object: {obj} \n{jObject}"); } break; } }
private async Task StartRecievingTask(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { try { var recieveData = await TcpTransport.Receieve().ConfigureAwait(false); var decodedData = DecodeMessage(recieveData); Log.Debug($"Receive message with remote id: {decodedData.Item2}"); ProcessReceivedMessage(decodedData.Item1); ConfirmationSendService.AddForSend(decodedData.Item2); } catch (Exception e) { Log.Error("Receive message failed", e); } } }
private async Task ConnectAsync(bool forceAuth) { if (ClientSettings.Session.AuthKey == null || forceAuth) { var result = await DoAuthentication().ConfigureAwait(false); ClientSettings.Session.AuthKey = result.AuthKey; ClientSettings.Session.TimeOffset = result.TimeOffset; SessionStore.Save(); } ConfirmationSendService.StartSendingConfirmation(); ProtoRecieveService.StartReceiving(); //set-up layer var request = new RequestInvokeWithLayer { Layer = SchemaInfo.SchemaVersion, Query = new RequestInitConnection { ApiId = ClientSettings.AppId, AppVersion = "1.0.0", DeviceModel = "PC", LangCode = "en", LangPack = "tdesktop", SystemLangCode = "en", Query = new RequestGetConfig(), SystemVersion = "Win 10.0" } }; var response = (TConfig)await SendService.SendRequestAsync(request).ConfigureAwait(false); _dcOptions = response.DcOptions.Items.Cast <TDcOption>().ToArray(); }