mirror of
https://github.com/vale981/tdesktop
synced 2025-03-05 17:51:41 -05:00
Use TL code generator from lib_tl.
This commit is contained in:
parent
7bb23519f9
commit
bc2a0fb505
7 changed files with 154 additions and 1733 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -43,3 +43,6 @@
|
||||||
[submodule "Telegram/lib_lottie"]
|
[submodule "Telegram/lib_lottie"]
|
||||||
path = Telegram/lib_lottie
|
path = Telegram/lib_lottie
|
||||||
url = https://github.com/desktop-app/lib_lottie.git
|
url = https://github.com/desktop-app/lib_lottie.git
|
||||||
|
[submodule "Telegram/lib_tl"]
|
||||||
|
path = Telegram/lib_tl
|
||||||
|
url = https://github.com/desktop-app/lib_tl.git
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
// Core types (no need to gen)
|
// Core types (no need to gen)
|
||||||
|
|
||||||
//vector#1cb5c415 {t:Type} # [ t ] = Vector t;
|
int ? = Int;
|
||||||
|
long ? = Long;
|
||||||
|
double ? = Double;
|
||||||
|
string ? = String;
|
||||||
|
|
||||||
|
vector {t:Type} # [ t ] = Vector t;
|
||||||
|
|
||||||
|
int128 4*[ int ] = Int128;
|
||||||
|
int256 8*[ int ] = Int256;
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
/// Authorization key creation
|
/// Authorization key creation
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -7,16 +7,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <gsl/gsl>
|
|
||||||
#include <QtCore/QVector>
|
|
||||||
#include <QtCore/QString>
|
|
||||||
#include <QtCore/QByteArray>
|
|
||||||
#include "base/basic_types.h"
|
#include "base/basic_types.h"
|
||||||
#include "base/match_method.h"
|
#include "base/match_method.h"
|
||||||
#include "base/flags.h"
|
#include "base/flags.h"
|
||||||
#include "base/bytes.h"
|
#include "base/bytes.h"
|
||||||
#include "base/algorithm.h"
|
#include "base/algorithm.h"
|
||||||
#include "base/assertion.h"
|
#include "base/assertion.h"
|
||||||
|
#include "tl/tl_basic_types.h"
|
||||||
|
|
||||||
|
#include <QtCore/QVector>
|
||||||
|
#include <QtCore/QString>
|
||||||
|
#include <QtCore/QByteArray>
|
||||||
|
#include <gsl/gsl>
|
||||||
|
|
||||||
using mtpPrime = int32;
|
using mtpPrime = int32;
|
||||||
using mtpRequestId = int32;
|
using mtpRequestId = int32;
|
||||||
|
@ -58,108 +60,17 @@ constexpr int GetDcIdShift(ShiftedDcId shiftedDcId) {
|
||||||
|
|
||||||
} // namespace MTP
|
} // namespace MTP
|
||||||
|
|
||||||
namespace MTP {
|
|
||||||
namespace internal {
|
|
||||||
|
|
||||||
class TypeData {
|
|
||||||
public:
|
|
||||||
TypeData() = default;
|
|
||||||
TypeData(const TypeData &other) = delete;
|
|
||||||
TypeData(TypeData &&other) = delete;
|
|
||||||
TypeData &operator=(const TypeData &other) = delete;
|
|
||||||
TypeData &operator=(TypeData &&other) = delete;
|
|
||||||
|
|
||||||
virtual ~TypeData() {
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void incrementCounter() const {
|
|
||||||
_counter.ref();
|
|
||||||
}
|
|
||||||
bool decrementCounter() const {
|
|
||||||
return _counter.deref();
|
|
||||||
}
|
|
||||||
friend class TypeDataOwner;
|
|
||||||
|
|
||||||
mutable QAtomicInt _counter = { 1 };
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
class TypeDataOwner {
|
|
||||||
public:
|
|
||||||
TypeDataOwner(TypeDataOwner &&other) : _data(base::take(other._data)) {
|
|
||||||
}
|
|
||||||
TypeDataOwner(const TypeDataOwner &other) : _data(other._data) {
|
|
||||||
incrementCounter();
|
|
||||||
}
|
|
||||||
TypeDataOwner &operator=(TypeDataOwner &&other) {
|
|
||||||
if (other._data != _data) {
|
|
||||||
decrementCounter();
|
|
||||||
_data = base::take(other._data);
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
TypeDataOwner &operator=(const TypeDataOwner &other) {
|
|
||||||
if (other._data != _data) {
|
|
||||||
setData(other._data);
|
|
||||||
incrementCounter();
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
~TypeDataOwner() {
|
|
||||||
decrementCounter();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
TypeDataOwner() = default;
|
|
||||||
TypeDataOwner(const TypeData *data) : _data(data) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void setData(const TypeData *data) {
|
|
||||||
decrementCounter();
|
|
||||||
_data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unsafe cast, type should be checked by the caller.
|
|
||||||
template <typename DataType>
|
|
||||||
const DataType &queryData() const {
|
|
||||||
Expects(_data != nullptr);
|
|
||||||
|
|
||||||
return static_cast<const DataType &>(*_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void incrementCounter() {
|
|
||||||
if (_data) {
|
|
||||||
_data->incrementCounter();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void decrementCounter() {
|
|
||||||
if (_data && !_data->decrementCounter()) {
|
|
||||||
delete base::take(_data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const TypeData * _data = nullptr;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ZeroFlagsHelper {
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace MTP
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
// core types
|
// core types
|
||||||
mtpc_int = 0xa8509bda,
|
mtpc_int = tl::id_int,
|
||||||
mtpc_long = 0x22076cba,
|
mtpc_long = tl::id_long,
|
||||||
mtpc_int128 = 0x4bb5362b,
|
mtpc_int128 = tl::id_int128,
|
||||||
mtpc_int256 = 0x929c32f,
|
mtpc_int256 = tl::id_int256,
|
||||||
mtpc_double = 0x2210c154,
|
mtpc_double = tl::id_double,
|
||||||
mtpc_string = 0xb5286e24,
|
mtpc_string = tl::id_string,
|
||||||
|
mtpc_vector = tl::id_vector,
|
||||||
mtpc_vector = 0x1cb5c415,
|
mtpc_bytes = tl::id_bytes,
|
||||||
|
mtpc_flags = tl::id_flags,
|
||||||
|
|
||||||
// layers
|
// layers
|
||||||
mtpc_invokeWithLayer1 = 0x53835315,
|
mtpc_invokeWithLayer1 = 0x53835315,
|
||||||
|
@ -187,8 +98,6 @@ enum {
|
||||||
// mtpc_msg_copy = 0xe06046b2,
|
// mtpc_msg_copy = 0xe06046b2,
|
||||||
mtpc_gzip_packed = 0x3072cfa1
|
mtpc_gzip_packed = 0x3072cfa1
|
||||||
};
|
};
|
||||||
static const mtpTypeId mtpc_bytes = mtpc_string;
|
|
||||||
static const mtpTypeId mtpc_flags = mtpc_int;
|
|
||||||
static const mtpTypeId mtpc_core_message = -1; // undefined type, but is used
|
static const mtpTypeId mtpc_core_message = -1; // undefined type, but is used
|
||||||
static const mtpTypeId mtpLayers[] = {
|
static const mtpTypeId mtpLayers[] = {
|
||||||
mtpTypeId(mtpc_invokeWithLayer1),
|
mtpTypeId(mtpc_invokeWithLayer1),
|
||||||
|
@ -212,43 +121,6 @@ static const mtpTypeId mtpLayers[] = {
|
||||||
};
|
};
|
||||||
static const uint32 mtpLayerMaxSingle = sizeof(mtpLayers) / sizeof(mtpLayers[0]);
|
static const uint32 mtpLayerMaxSingle = sizeof(mtpLayers) / sizeof(mtpLayers[0]);
|
||||||
|
|
||||||
template <typename bareT>
|
|
||||||
class MTPBoxed : public bareT {
|
|
||||||
public:
|
|
||||||
using bareT::bareT;
|
|
||||||
MTPBoxed() = default;
|
|
||||||
MTPBoxed(const MTPBoxed<bareT> &v) = default;
|
|
||||||
MTPBoxed<bareT> &operator=(const MTPBoxed<bareT> &v) = default;
|
|
||||||
MTPBoxed(const bareT &v) : bareT(v) {
|
|
||||||
}
|
|
||||||
MTPBoxed<bareT> &operator=(const bareT &v) {
|
|
||||||
*((bareT*)this) = v;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 innerLength() const {
|
|
||||||
return sizeof(mtpTypeId) + bareT::innerLength();
|
|
||||||
}
|
|
||||||
[[nodiscard]] bool read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) {
|
|
||||||
if (from + 1 > end) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
cons = (mtpTypeId)*(from++);
|
|
||||||
return bareT::read(from, end, cons);
|
|
||||||
}
|
|
||||||
void write(mtpBuffer &to) const {
|
|
||||||
to.push_back(bareT::type());
|
|
||||||
bareT::write(to);
|
|
||||||
}
|
|
||||||
|
|
||||||
using Unboxed = bareT;
|
|
||||||
|
|
||||||
};
|
|
||||||
template <typename T>
|
|
||||||
class MTPBoxed<MTPBoxed<T> > {
|
|
||||||
typename T::CantMakeBoxedBoxedType v;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace MTP {
|
namespace MTP {
|
||||||
namespace details {
|
namespace details {
|
||||||
|
|
||||||
|
@ -257,17 +129,6 @@ struct SecureRequestCreateTag {
|
||||||
|
|
||||||
} // namespace details
|
} // namespace details
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct is_boxed : std::false_type {
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct is_boxed<MTPBoxed<T>> : std::true_type {
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
constexpr bool is_boxed_v = is_boxed<T>::value;
|
|
||||||
|
|
||||||
class SecureRequestData;
|
class SecureRequestData;
|
||||||
class SecureRequest {
|
class SecureRequest {
|
||||||
public:
|
public:
|
||||||
|
@ -290,7 +151,7 @@ public:
|
||||||
|
|
||||||
template <
|
template <
|
||||||
typename Request,
|
typename Request,
|
||||||
typename = std::enable_if_t<is_boxed_v<Request>>>
|
typename = std::enable_if_t<tl::is_boxed_v<Request>>>
|
||||||
static SecureRequest Serialize(const Request &request);
|
static SecureRequest Serialize(const Request &request);
|
||||||
|
|
||||||
// For template MTP requests and MTPBoxed instanciation.
|
// For template MTP requests and MTPBoxed instanciation.
|
||||||
|
@ -341,511 +202,122 @@ SecureRequest SecureRequest::Serialize(const Request &request) {
|
||||||
return serialized;
|
return serialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Type>
|
|
||||||
struct RepeatHelper {
|
|
||||||
using type = Type;
|
|
||||||
};
|
|
||||||
template <typename Type>
|
|
||||||
using Repeat = typename RepeatHelper<Type>::type;
|
|
||||||
|
|
||||||
struct InnerHelper {
|
|
||||||
static void Check(...);
|
|
||||||
template <typename Type, typename Result = decltype(std::declval<Type>().v)>
|
|
||||||
static Result Check(const Type&);
|
|
||||||
|
|
||||||
template <typename Type>
|
|
||||||
using type = std::decay_t<decltype(Check(std::declval<Type>()))>;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Type>
|
|
||||||
class conditional {
|
|
||||||
public:
|
|
||||||
conditional() = default;
|
|
||||||
conditional(const Type *value) : _value(value) {
|
|
||||||
}
|
|
||||||
|
|
||||||
operator const Type*() const {
|
|
||||||
return _value;
|
|
||||||
}
|
|
||||||
const Type *operator->() const {
|
|
||||||
Expects(_value != nullptr);
|
|
||||||
|
|
||||||
return _value;
|
|
||||||
}
|
|
||||||
const Type &operator*() const {
|
|
||||||
Expects(_value != nullptr);
|
|
||||||
|
|
||||||
return *_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <
|
|
||||||
typename Inner = InnerHelper::type<Type>,
|
|
||||||
typename = std::enable_if_t<!std::is_same_v<Inner, void>>>
|
|
||||||
Inner value_or(Repeat<Inner> fallback) const {
|
|
||||||
return _value ? _value->v : fallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <
|
|
||||||
typename Inner = InnerHelper::type<Type>,
|
|
||||||
typename = std::enable_if_t<!std::is_same_v<Inner, void>>>
|
|
||||||
Inner value_or_empty() const {
|
|
||||||
return _value ? _value->v : Inner();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const Type *_value = nullptr;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace MTP
|
} // namespace MTP
|
||||||
|
|
||||||
class MTPint {
|
using MTPint = tl::int_type;
|
||||||
public:
|
|
||||||
int32 v = 0;
|
|
||||||
|
|
||||||
MTPint() = default;
|
|
||||||
|
|
||||||
uint32 innerLength() const {
|
|
||||||
return sizeof(int32);
|
|
||||||
}
|
|
||||||
mtpTypeId type() const {
|
|
||||||
return mtpc_int;
|
|
||||||
}
|
|
||||||
[[nodiscard]] bool read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_int) {
|
|
||||||
if (from + 1 > end || cons != mtpc_int) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
v = (int32)*(from++);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
void write(mtpBuffer &to) const {
|
|
||||||
to.push_back((mtpPrime)v);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
explicit MTPint(int32 val) : v(val) {
|
|
||||||
}
|
|
||||||
|
|
||||||
friend MTPint MTP_int(int32 v);
|
|
||||||
};
|
|
||||||
inline MTPint MTP_int(int32 v) {
|
inline MTPint MTP_int(int32 v) {
|
||||||
return MTPint(v);
|
return tl::make_int(v);
|
||||||
}
|
}
|
||||||
using MTPInt = MTPBoxed<MTPint>;
|
|
||||||
|
|
||||||
template <typename Flags>
|
template <typename Flags>
|
||||||
class MTPflags {
|
using MTPflags = tl::flags_type<Flags>;
|
||||||
public:
|
|
||||||
Flags v = 0;
|
|
||||||
static_assert(
|
|
||||||
sizeof(Flags) == sizeof(int32),
|
|
||||||
"MTPflags are allowed only wrapping int32 flag types!");
|
|
||||||
|
|
||||||
MTPflags() = default;
|
|
||||||
MTPflags(MTP::internal::ZeroFlagsHelper helper) {
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 innerLength() const {
|
|
||||||
return sizeof(Flags);
|
|
||||||
}
|
|
||||||
mtpTypeId type() const {
|
|
||||||
return mtpc_flags;
|
|
||||||
}
|
|
||||||
[[nodiscard]] bool read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_flags) {
|
|
||||||
if (from + 1 > end || cons != mtpc_flags) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
v = Flags::from_raw(static_cast<typename Flags::Type>(*(from++)));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
void write(mtpBuffer &to) const {
|
|
||||||
to.push_back(static_cast<mtpPrime>(v.value()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
explicit MTPflags(Flags val) : v(val) {
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
friend MTPflags<base::flags<T>> MTP_flags(base::flags<T> v);
|
|
||||||
|
|
||||||
template <typename T, typename>
|
|
||||||
friend MTPflags<base::flags<T>> MTP_flags(T v);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline MTPflags<base::flags<T>> MTP_flags(base::flags<T> v) {
|
inline MTPflags<base::flags<T>> MTP_flags(base::flags<T> v) {
|
||||||
return MTPflags<base::flags<T>>(v);
|
return tl::make_flags(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename = std::enable_if_t<!std::is_same<T, int>::value>>
|
template <typename T, typename = std::enable_if_t<!std::is_same<T, int>::value>>
|
||||||
inline MTPflags<base::flags<T>> MTP_flags(T v) {
|
inline MTPflags<base::flags<T>> MTP_flags(T v) {
|
||||||
return MTPflags<base::flags<T>>(v);
|
return tl::make_flags(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline MTP::internal::ZeroFlagsHelper MTP_flags(void(MTP::internal::ZeroFlagsHelper::*)()) {
|
inline tl::details::zero_flags_helper MTP_flags(void(tl::details::zero_flags_helper::*)()) {
|
||||||
return MTP::internal::ZeroFlagsHelper();
|
return tl::details::zero_flags_helper();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Flags>
|
using MTPlong = tl::long_type;
|
||||||
using MTPFlags = MTPBoxed<MTPflags<Flags>>;
|
|
||||||
|
|
||||||
inline bool operator==(const MTPint &a, const MTPint &b) {
|
|
||||||
return a.v == b.v;
|
|
||||||
}
|
|
||||||
inline bool operator!=(const MTPint &a, const MTPint &b) {
|
|
||||||
return a.v != b.v;
|
|
||||||
}
|
|
||||||
|
|
||||||
class MTPlong {
|
|
||||||
public:
|
|
||||||
uint64 v = 0;
|
|
||||||
|
|
||||||
MTPlong() = default;
|
|
||||||
|
|
||||||
uint32 innerLength() const {
|
|
||||||
return sizeof(uint64);
|
|
||||||
}
|
|
||||||
mtpTypeId type() const {
|
|
||||||
return mtpc_long;
|
|
||||||
}
|
|
||||||
[[nodiscard]] bool read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_long) {
|
|
||||||
if (from + 2 > end || cons != mtpc_long) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
v = (uint64)(((uint32*)from)[0]) | ((uint64)(((uint32*)from)[1]) << 32);
|
|
||||||
from += 2;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
void write(mtpBuffer &to) const {
|
|
||||||
to.push_back((mtpPrime)(v & 0xFFFFFFFFL));
|
|
||||||
to.push_back((mtpPrime)(v >> 32));
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
explicit MTPlong(uint64 val) : v(val) {
|
|
||||||
}
|
|
||||||
|
|
||||||
friend MTPlong MTP_long(uint64 v);
|
|
||||||
};
|
|
||||||
inline MTPlong MTP_long(uint64 v) {
|
inline MTPlong MTP_long(uint64 v) {
|
||||||
return MTPlong(v);
|
return tl::make_long(v);
|
||||||
}
|
|
||||||
using MTPLong = MTPBoxed<MTPlong>;
|
|
||||||
|
|
||||||
inline bool operator==(const MTPlong &a, const MTPlong &b) {
|
|
||||||
return a.v == b.v;
|
|
||||||
}
|
|
||||||
inline bool operator!=(const MTPlong &a, const MTPlong &b) {
|
|
||||||
return a.v != b.v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MTPint128 {
|
using MTPint128 = tl::int128_type;
|
||||||
public:
|
|
||||||
uint64 l = 0;
|
|
||||||
uint64 h = 0;
|
|
||||||
|
|
||||||
MTPint128() = default;
|
|
||||||
|
|
||||||
uint32 innerLength() const {
|
|
||||||
return sizeof(uint64) + sizeof(uint64);
|
|
||||||
}
|
|
||||||
mtpTypeId type() const {
|
|
||||||
return mtpc_int128;
|
|
||||||
}
|
|
||||||
[[nodiscard]] bool read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_int128) {
|
|
||||||
if (from + 4 > end || cons != mtpc_int128) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
l = (uint64)(((uint32*)from)[0]) | ((uint64)(((uint32*)from)[1]) << 32);
|
|
||||||
h = (uint64)(((uint32*)from)[2]) | ((uint64)(((uint32*)from)[3]) << 32);
|
|
||||||
from += 4;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
void write(mtpBuffer &to) const {
|
|
||||||
to.push_back((mtpPrime)(l & 0xFFFFFFFFL));
|
|
||||||
to.push_back((mtpPrime)(l >> 32));
|
|
||||||
to.push_back((mtpPrime)(h & 0xFFFFFFFFL));
|
|
||||||
to.push_back((mtpPrime)(h >> 32));
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
explicit MTPint128(uint64 low, uint64 high) : l(low), h(high) {
|
|
||||||
}
|
|
||||||
|
|
||||||
friend MTPint128 MTP_int128(uint64 l, uint64 h);
|
|
||||||
};
|
|
||||||
inline MTPint128 MTP_int128(uint64 l, uint64 h) {
|
inline MTPint128 MTP_int128(uint64 l, uint64 h) {
|
||||||
return MTPint128(l, h);
|
return tl::make_int128(l, h);
|
||||||
}
|
|
||||||
using MTPInt128 = MTPBoxed<MTPint128>;
|
|
||||||
|
|
||||||
inline bool operator==(const MTPint128 &a, const MTPint128 &b) {
|
|
||||||
return a.l == b.l && a.h == b.h;
|
|
||||||
}
|
|
||||||
inline bool operator!=(const MTPint128 &a, const MTPint128 &b) {
|
|
||||||
return a.l != b.l || a.h != b.h;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MTPint256 {
|
using MTPint256 = tl::int256_type;
|
||||||
public:
|
|
||||||
MTPint128 l;
|
|
||||||
MTPint128 h;
|
|
||||||
|
|
||||||
MTPint256() = default;
|
|
||||||
|
|
||||||
uint32 innerLength() const {
|
|
||||||
return l.innerLength() + h.innerLength();
|
|
||||||
}
|
|
||||||
mtpTypeId type() const {
|
|
||||||
return mtpc_int256;
|
|
||||||
}
|
|
||||||
[[nodiscard]] bool read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_int256) {
|
|
||||||
if (cons != mtpc_int256) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return l.read(from, end)
|
|
||||||
&& h.read(from, end);
|
|
||||||
}
|
|
||||||
void write(mtpBuffer &to) const {
|
|
||||||
l.write(to);
|
|
||||||
h.write(to);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
explicit MTPint256(MTPint128 low, MTPint128 high) : l(low), h(high) {
|
|
||||||
}
|
|
||||||
|
|
||||||
friend MTPint256 MTP_int256(const MTPint128 &l, const MTPint128 &h);
|
|
||||||
};
|
|
||||||
inline MTPint256 MTP_int256(const MTPint128 &l, const MTPint128 &h) {
|
inline MTPint256 MTP_int256(const MTPint128 &l, const MTPint128 &h) {
|
||||||
return MTPint256(l, h);
|
return tl::make_int256(l, h);
|
||||||
}
|
|
||||||
using MTPInt256 = MTPBoxed<MTPint256>;
|
|
||||||
|
|
||||||
inline bool operator==(const MTPint256 &a, const MTPint256 &b) {
|
|
||||||
return a.l == b.l && a.h == b.h;
|
|
||||||
}
|
|
||||||
inline bool operator!=(const MTPint256 &a, const MTPint256 &b) {
|
|
||||||
return a.l != b.l || a.h != b.h;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MTPdouble {
|
using MTPdouble = tl::double_type;
|
||||||
public:
|
|
||||||
float64 v = 0.;
|
|
||||||
|
|
||||||
MTPdouble() = default;
|
|
||||||
|
|
||||||
uint32 innerLength() const {
|
|
||||||
return sizeof(float64);
|
|
||||||
}
|
|
||||||
mtpTypeId type() const {
|
|
||||||
return mtpc_double;
|
|
||||||
}
|
|
||||||
[[nodiscard]] bool read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_double) {
|
|
||||||
if (from + 2 > end || cons != mtpc_double) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
auto nv = (uint64)(((uint32*)from)[0]) | ((uint64)(((uint32*)from)[1]) << 32);
|
|
||||||
std::memcpy(&v, &nv, sizeof(v));
|
|
||||||
from += 2;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
void write(mtpBuffer &to) const {
|
|
||||||
uint64 iv;
|
|
||||||
std::memcpy(&iv, &v, sizeof(v));
|
|
||||||
to.push_back((mtpPrime)(iv & 0xFFFFFFFFL));
|
|
||||||
to.push_back((mtpPrime)(iv >> 32));
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
explicit MTPdouble(float64 val) : v(val) {
|
|
||||||
}
|
|
||||||
|
|
||||||
friend MTPdouble MTP_double(float64 v);
|
|
||||||
};
|
|
||||||
inline MTPdouble MTP_double(float64 v) {
|
inline MTPdouble MTP_double(float64 v) {
|
||||||
return MTPdouble(v);
|
return tl::make_double(v);
|
||||||
}
|
|
||||||
using MTPDouble = MTPBoxed<MTPdouble>;
|
|
||||||
|
|
||||||
inline bool operator==(const MTPdouble &a, const MTPdouble &b) {
|
|
||||||
return a.v == b.v;
|
|
||||||
}
|
|
||||||
inline bool operator!=(const MTPdouble &a, const MTPdouble &b) {
|
|
||||||
return a.v != b.v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MTPstring;
|
using MTPstring = tl::string_type;
|
||||||
using MTPbytes = MTPstring;
|
using MTPbytes = tl::bytes_type;
|
||||||
|
|
||||||
class MTPstring {
|
|
||||||
public:
|
|
||||||
MTPstring() = default;
|
|
||||||
|
|
||||||
uint32 innerLength() const;
|
|
||||||
mtpTypeId type() const {
|
|
||||||
return mtpc_string;
|
|
||||||
}
|
|
||||||
[[nodiscard]] bool read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_string);
|
|
||||||
void write(mtpBuffer &to) const;
|
|
||||||
|
|
||||||
QByteArray v;
|
|
||||||
|
|
||||||
private:
|
|
||||||
explicit MTPstring(QByteArray &&data) : v(std::move(data)) {
|
|
||||||
}
|
|
||||||
|
|
||||||
friend MTPstring MTP_string(const std::string &v);
|
|
||||||
friend MTPstring MTP_string(const QString &v);
|
|
||||||
friend MTPstring MTP_string(const char *v);
|
|
||||||
friend MTPstring MTP_string();
|
|
||||||
|
|
||||||
friend MTPbytes MTP_bytes(const QByteArray &v);
|
|
||||||
friend MTPbytes MTP_bytes(QByteArray &&v);
|
|
||||||
friend MTPbytes MTP_bytes();
|
|
||||||
|
|
||||||
};
|
|
||||||
using MTPString = MTPBoxed<MTPstring>;
|
|
||||||
using MTPBytes = MTPBoxed<MTPbytes>;
|
|
||||||
|
|
||||||
inline MTPstring MTP_string(const std::string &v) {
|
inline MTPstring MTP_string(const std::string &v) {
|
||||||
return MTPstring(QByteArray(v.data(), v.size()));
|
return tl::make_string(v);
|
||||||
}
|
}
|
||||||
inline MTPstring MTP_string(const QString &v) {
|
inline MTPstring MTP_string(const QString &v) {
|
||||||
return MTPstring(v.toUtf8());
|
return tl::make_string(v);
|
||||||
}
|
}
|
||||||
inline MTPstring MTP_string(const char *v) {
|
inline MTPstring MTP_string(const char *v) {
|
||||||
return MTPstring(QByteArray(v, strlen(v)));
|
return tl::make_string(v);
|
||||||
}
|
}
|
||||||
inline MTPstring MTP_string() {
|
inline MTPstring MTP_string() {
|
||||||
return MTPstring(QByteArray());
|
return tl::make_string();
|
||||||
}
|
}
|
||||||
MTPstring MTP_string(const QByteArray &v) = delete;
|
MTPstring MTP_string(const QByteArray &v) = delete;
|
||||||
|
|
||||||
inline MTPbytes MTP_bytes(const QByteArray &v) {
|
inline MTPbytes MTP_bytes(const QByteArray &v) {
|
||||||
return MTPbytes(QByteArray(v));
|
return tl::make_bytes(v);
|
||||||
}
|
}
|
||||||
inline MTPbytes MTP_bytes(QByteArray &&v) {
|
inline MTPbytes MTP_bytes(QByteArray &&v) {
|
||||||
return MTPbytes(std::move(v));
|
return tl::make_bytes(std::move(v));
|
||||||
}
|
}
|
||||||
inline MTPbytes MTP_bytes() {
|
inline MTPbytes MTP_bytes() {
|
||||||
return MTPbytes(QByteArray());
|
return tl::make_bytes();
|
||||||
}
|
}
|
||||||
inline MTPbytes MTP_bytes(bytes::const_span buffer) {
|
inline MTPbytes MTP_bytes(bytes::const_span buffer) {
|
||||||
return MTP_bytes(QByteArray(
|
return tl::make_bytes(buffer);
|
||||||
reinterpret_cast<const char*>(buffer.data()),
|
|
||||||
buffer.size()));
|
|
||||||
}
|
}
|
||||||
inline MTPbytes MTP_bytes(const bytes::vector &buffer) {
|
inline MTPbytes MTP_bytes(const bytes::vector &buffer) {
|
||||||
return MTP_bytes(bytes::make_span(buffer));
|
return tl::make_bytes(buffer);
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator==(const MTPstring &a, const MTPstring &b) {
|
|
||||||
return a.v == b.v;
|
|
||||||
}
|
|
||||||
inline bool operator!=(const MTPstring &a, const MTPstring &b) {
|
|
||||||
return a.v != b.v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QString qs(const MTPstring &v) {
|
inline QString qs(const MTPstring &v) {
|
||||||
return QString::fromUtf8(v.v);
|
return tl::utf16(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QString qs(const QByteArray &v) {
|
inline QString qs(const QByteArray &v) {
|
||||||
return QString::fromUtf8(v);
|
return tl::utf16(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QByteArray qba(const MTPstring &v) {
|
inline QByteArray qba(const MTPstring &v) {
|
||||||
return v.v;
|
return tl::utf8(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class MTPvector {
|
using MTPvector = tl::vector_type<T>;
|
||||||
public:
|
|
||||||
MTPvector() = default;
|
|
||||||
|
|
||||||
uint32 innerLength() const {
|
|
||||||
auto result = uint32(sizeof(uint32));
|
|
||||||
for (const auto &item : v) {
|
|
||||||
result += item.innerLength();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
mtpTypeId type() const {
|
|
||||||
return mtpc_vector;
|
|
||||||
}
|
|
||||||
[[nodiscard]] bool read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_vector) {
|
|
||||||
if (from + 1 > end || cons != mtpc_vector) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
auto count = static_cast<uint32>(*(from++));
|
|
||||||
|
|
||||||
auto vector = QVector<T>(count, T());
|
|
||||||
for (auto &item : vector) {
|
|
||||||
if (!item.read(from, end)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
v = std::move(vector);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
void write(mtpBuffer &to) const {
|
|
||||||
to.push_back(v.size());
|
|
||||||
for (const auto &item : v) {
|
|
||||||
item.write(to);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QVector<T> v;
|
|
||||||
|
|
||||||
private:
|
|
||||||
explicit MTPvector(QVector<T> &&data) : v(std::move(data)) {
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename U>
|
|
||||||
friend MTPvector<U> MTP_vector(uint32 count);
|
|
||||||
template <typename U>
|
|
||||||
friend MTPvector<U> MTP_vector(uint32 count, const U &value);
|
|
||||||
template <typename U>
|
|
||||||
friend MTPvector<U> MTP_vector(const QVector<U> &v);
|
|
||||||
template <typename U>
|
|
||||||
friend MTPvector<U> MTP_vector(QVector<U> &&v);
|
|
||||||
template <typename U>
|
|
||||||
friend MTPvector<U> MTP_vector();
|
|
||||||
|
|
||||||
};
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline MTPvector<T> MTP_vector(uint32 count) {
|
inline MTPvector<T> MTP_vector(uint32 count) {
|
||||||
return MTPvector<T>(QVector<T>(count));
|
return tl::make_vector<T>(count);
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline MTPvector<T> MTP_vector(uint32 count, const T &value) {
|
inline MTPvector<T> MTP_vector(uint32 count, const T &value) {
|
||||||
return MTPvector<T>(QVector<T>(count, value));
|
return tl::make_vector<T>(count, value);
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline MTPvector<T> MTP_vector(const QVector<T> &v) {
|
inline MTPvector<T> MTP_vector(const QVector<T> &v) {
|
||||||
return MTPvector<T>(QVector<T>(v));
|
return tl::make_vector<T>(v);
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline MTPvector<T> MTP_vector(QVector<T> &&v) {
|
inline MTPvector<T> MTP_vector(QVector<T> &&v) {
|
||||||
return MTPvector<T>(std::move(v));
|
return tl::make_vector<T>(std::move(v));
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline MTPvector<T> MTP_vector() {
|
inline MTPvector<T> MTP_vector() {
|
||||||
return MTPvector<T>();
|
return tl::make_vector<T>();
|
||||||
}
|
|
||||||
template <typename T>
|
|
||||||
using MTPVector = MTPBoxed<MTPvector<T>>;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator==(const MTPvector<T> &a, const MTPvector<T> &b) {
|
|
||||||
return a.c_vector().v == b.c_vector().v;
|
|
||||||
}
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator!=(const MTPvector<T> &a, const MTPvector<T> &b) {
|
|
||||||
return a.c_vector().v != b.c_vector().v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Human-readable text serialization
|
// Human-readable text serialization
|
||||||
|
|
|
@ -156,6 +156,7 @@ auto GenerateCodes() {
|
||||||
Ui::show(Box<InformBox>("All sound overrides were reset."));
|
Ui::show(Box<InformBox>("All sound overrides were reset."));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return codes;
|
return codes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,9 +31,11 @@
|
||||||
}]],
|
}]],
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
'<(submodules_loc)/lib_base/lib_base.gyp:lib_base',
|
'<(submodules_loc)/lib_base/lib_base.gyp:lib_base',
|
||||||
|
'<(submodules_loc)/lib_tl/lib_tl.gyp:lib_tl',
|
||||||
],
|
],
|
||||||
'export_dependent_settings': [
|
'export_dependent_settings': [
|
||||||
'<(submodules_loc)/lib_base/lib_base.gyp:lib_base',
|
'<(submodules_loc)/lib_base/lib_base.gyp:lib_base',
|
||||||
|
'<(submodules_loc)/lib_tl/lib_tl.gyp:lib_tl',
|
||||||
],
|
],
|
||||||
'include_dirs': [
|
'include_dirs': [
|
||||||
'<(src_loc)',
|
'<(src_loc)',
|
||||||
|
@ -49,6 +51,7 @@
|
||||||
'action_name': 'codegen_scheme',
|
'action_name': 'codegen_scheme',
|
||||||
'inputs': [
|
'inputs': [
|
||||||
'<(src_loc)/codegen/scheme/codegen_scheme.py',
|
'<(src_loc)/codegen/scheme/codegen_scheme.py',
|
||||||
|
'<(submodules_loc)/lib_tl/tl/generate_tl.py',
|
||||||
'<(res_loc)/tl/mtproto.tl',
|
'<(res_loc)/tl/mtproto.tl',
|
||||||
'<(res_loc)/tl/api.tl',
|
'<(res_loc)/tl/api.tl',
|
||||||
],
|
],
|
||||||
|
@ -58,7 +61,7 @@
|
||||||
],
|
],
|
||||||
'action': [
|
'action': [
|
||||||
'python', '<(src_loc)/codegen/scheme/codegen_scheme.py',
|
'python', '<(src_loc)/codegen/scheme/codegen_scheme.py',
|
||||||
'-o', '<(SHARED_INTERMEDIATE_DIR)',
|
'-o', '<(SHARED_INTERMEDIATE_DIR)/scheme',
|
||||||
'<(res_loc)/tl/mtproto.tl',
|
'<(res_loc)/tl/mtproto.tl',
|
||||||
'<(res_loc)/tl/api.tl',
|
'<(res_loc)/tl/api.tl',
|
||||||
],
|
],
|
||||||
|
|
1
Telegram/lib_tl
Submodule
1
Telegram/lib_tl
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit ab4e30d38914142d6abbb64389a00cd6f8ef55d2
|
Loading…
Add table
Reference in a new issue