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

View file

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