First update event attempt.

This commit is contained in:
Paulo Rogerio Panhoto 2017-12-28 18:15:13 -02:00
parent a69db6ba27
commit a4a5ae4a2e
2 changed files with 59 additions and 20 deletions

View file

@ -21,6 +21,10 @@ namespace TLSharp.Core.Network
private TcpTransport _transport;
private Session _session;
public delegate void HandleUpdates (TeleSharp.TL.TLAbsUpdates updates);
public event HandleUpdates UpdatesEvent;
public List<ulong> needConfirmation = new List<ulong>();
public MtProtoSender(TcpTransport transport, Session session)
@ -141,7 +145,7 @@ namespace TLSharp.Core.Network
using (var messageStream = new MemoryStream(result.Item1, false))
using (var messageReader = new BinaryReader(messageStream))
{
processMessage(result.Item2, result.Item3, messageReader, request);
await processMessage(result.Item2, result.Item3, messageReader, request);
}
}
@ -161,7 +165,7 @@ namespace TLSharp.Core.Network
await Receive(pingRequest);
}
private bool processMessage(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request)
private async Task<bool> processMessage(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request)
{
// TODO: check salt
// TODO: check sessionid
@ -176,7 +180,7 @@ namespace TLSharp.Core.Network
{
case 0x73f1f8dc: // container
//logger.debug("MSG container");
return HandleContainer(messageId, sequence, messageReader, request);
return await HandleContainer(messageId, sequence, messageReader, request);
case 0x7abe77ec: // ping
//logger.debug("MSG ping");
return HandlePing(messageId, sequence, messageReader);
@ -206,46 +210,71 @@ namespace TLSharp.Core.Network
return HandleRpcResult(messageId, sequence, messageReader, request);
case 0x3072cfa1: // gzip_packed
//logger.debug("MSG gzip_packed");
return HandleGzipPacked(messageId, sequence, messageReader, request);
return await HandleGzipPacked(messageId, sequence, messageReader, request);
case 0xe317af7e:
case 0xd3f45784:
case 0x2b2fbd4e:
case 0x78d4dec1:
case 0x725b04c3:
case 0x74ae4240:
return HandleUpdate(messageId, sequence, messageReader);
return await HandleUpdate(messageId, sequence, messageReader, request);
default:
//logger.debug("unknown message: {0}", code);
return false;
}
}
private bool HandleUpdate(ulong messageId, int sequence, BinaryReader messageReader)
private async Task<bool> HandleUpdate(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request)
{
return false;
/*
try
{
UpdatesEvent(TL.Parse<Updates>(messageReader));
return true;
var update = ParseUpdate (messageId, messageReader);
if (update != null && UpdatesEvent != null)
UpdatesEvent(update);
await Receive (request);
}
catch (Exception e)
catch
{
logger.warning("update processing exception: {0}", e);
return false;
}
*/
return false;
}
private bool HandleGzipPacked(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request)
private TeleSharp.TL.TLAbsUpdates ParseUpdate(ulong messageId, BinaryReader messageReader)
{
switch (messageId)
{
case 0xe317af7e:
return DecodeUpdate<TeleSharp.TL.TLUpdatesTooLong>(messageReader);
case 0xd3f45784:
return DecodeUpdate<TeleSharp.TL.TLUpdateShortMessage> (messageReader);
case 0x2b2fbd4e:
return DecodeUpdate<TeleSharp.TL.TLUpdateShortChatMessage> (messageReader);
case 0x78d4dec1:
return DecodeUpdate<TeleSharp.TL.TLUpdateShort> (messageReader);
case 0x725b04c3:
return DecodeUpdate<TeleSharp.TL.TLUpdatesCombined> (messageReader);
case 0x74ae4240:
return DecodeUpdate<TeleSharp.TL.TLUpdates> (messageReader);
default:
return null;
}
}
private TeleSharp.TL.TLAbsUpdates DecodeUpdate<T>(BinaryReader messageReader) where T: TeleSharp.TL.TLAbsUpdates, new()
{
var update = new T ();
update.DeserializeBody (messageReader);
return update;
}
private async Task<bool> HandleGzipPacked(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request)
{
uint code = messageReader.ReadUInt32();
byte[] packedData = GZipStream.UncompressBuffer(Serializers.Bytes.read(messageReader));
using (MemoryStream packedStream = new MemoryStream(packedData, false))
using (BinaryReader compressedReader = new BinaryReader(packedStream))
{
processMessage(messageId, sequence, compressedReader, request);
await processMessage(messageId, sequence, compressedReader, request);
}
return true;
@ -496,7 +525,7 @@ namespace TLSharp.Core.Network
return false;
}
private bool HandleContainer(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request)
private async Task<bool> HandleContainer(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request)
{
uint code = messageReader.ReadUInt32();
int size = messageReader.ReadInt32();
@ -508,12 +537,12 @@ namespace TLSharp.Core.Network
long beginPosition = messageReader.BaseStream.Position;
try
{
if (!processMessage(innerMessageId, sequence, messageReader, request))
if (!await processMessage(innerMessageId, sequence, messageReader, request))
{
messageReader.BaseStream.Position = beginPosition + innerLength;
}
}
catch (Exception e)
catch (Exception)
{
// logger.error("failed to process message in contailer: {0}", e);
messageReader.BaseStream.Position = beginPosition + innerLength;

View file

@ -30,6 +30,10 @@ namespace TLSharp.Core
private List<TLDcOption> dcOptions;
private TcpClientConnectionHandler _handler;
public delegate void UpdatesEvent (TelegramClient source, TLAbsUpdates updates);
public event UpdatesEvent Updates;
public Session Session { get { return _session; } }
public TelegramClient(int apiId, string apiHash,
@ -59,6 +63,7 @@ namespace TLSharp.Core
}
_sender = new MtProtoSender(_transport, _session);
_sender.UpdatesEvent += _sender_UpdatesEvent;
//set-up layer
var config = new TLRequestGetConfig();
@ -108,6 +113,11 @@ namespace TLSharp.Core
}
}
private void _sender_UpdatesEvent (TLAbsUpdates updates)
{
Updates (this, updates);
}
private async Task RequestWithDcMigration(TLMethod request)
{
var completed = false;