Correctly handle RPC Error for methods returning bool.

Also don't hang CallAsync on ReadRpcResult deserializing error
This commit is contained in:
Wizou 2021-12-07 16:35:23 +01:00
parent 95d9135bd0
commit f289b9e2e5
2 changed files with 19 additions and 10 deletions

View file

@ -699,18 +699,26 @@ namespace WTelegram
object result;
if (tcs != null)
{
if (!type.IsArray)
result = reader.ReadTLValue(type);
else if (reader.ReadUInt32() == Layer.RpcErrorCtor)
result = reader.ReadTLObject(Layer.RpcErrorCtor);
else
try
{
reader.BaseStream.Position -= 4;
result = reader.ReadTLValue(type);
if (!type.IsArray)
result = reader.ReadTLValue(type);
else if (reader.ReadUInt32() == Layer.RpcErrorCtor)
result = reader.ReadTLObject(Layer.RpcErrorCtor);
else
{
reader.BaseStream.Position -= 4;
result = reader.ReadTLValue(type);
}
if (type.IsEnum) result = Enum.ToObject(type, result);
Log(1, "");
tcs.SetResult(result);
}
catch (Exception ex)
{
tcs.SetException(ex);
throw;
}
if (type.IsEnum) result = Enum.ToObject(type, result);
Log(1, "");
tcs.SetResult(result);
}
else
{

View file

@ -130,6 +130,7 @@ namespace TL
{
0x997275b5 => true,
0xbc799737 => false,
Layer.RpcErrorCtor => reader.ReadTLObject(Layer.RpcErrorCtor),
var value => throw new ApplicationException($"Invalid boolean value #{value:x}")
};
case TypeCode.Object: