Detached libtgl
This commit is contained in:
parent
f45458c321
commit
2c340e59bf
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "tgl"]
|
||||
path = tgl
|
||||
url = https://github.com/vysheng/tgl.git
|
66
Makefile.in
66
Makefile.in
@ -10,24 +10,16 @@ EXTRA_LIBS=@LIBS@ @EXTRA_LIBS@ @OPENSSL_LIBS@
|
||||
LOCAL_LDFLAGS=-rdynamic -ggdb -levent ${EXTRA_LIBS}
|
||||
LINK_FLAGS=${LDFLAGS} ${LOCAL_LDFLAGS}
|
||||
|
||||
DEP=${srcdir}/dep
|
||||
AUTO=${srcdir}/auto
|
||||
EXE=${srcdir}/bin
|
||||
OBJ=${srcdir}/objs
|
||||
LIB=${srcdir}/libs
|
||||
DEP=dep
|
||||
AUTO=auto
|
||||
EXE=bin
|
||||
OBJ=objs
|
||||
LIB=libs
|
||||
DIR_LIST=${DEP} ${AUTO} ${EXE} ${OBJ} ${LIB} ${DEP}/auto ${OBJ}/auto
|
||||
|
||||
EXE_LIST=${EXE}/generate ${EXE}/tlc ${EXE}/telegram-cli
|
||||
LIB_LIST=${LIB}/libtgl.a
|
||||
EXE_LIST=${EXE}/telegram-cli
|
||||
|
||||
TG_OBJECTS=${OBJ}/main.o ${OBJ}/loop.o ${OBJ}/interface.o ${OBJ}/net.o ${OBJ}/lua-tg.o ${OBJ}/tgl-timers.o
|
||||
TGL_OBJECTS=${OBJ}/mtproto-common.o ${OBJ}/mtproto-client.o ${OBJ}/queries.o ${OBJ}/structures.o ${OBJ}/binlog.o ${OBJ}/auto/auto.o ${OBJ}/tgl.o ${OBJ}/updates.o
|
||||
TLC_OBJECTS=${OBJ}/tlc.o ${OBJ}/tl-parser.o ${OBJ}/crc32.o
|
||||
TLD_OBJECTS=${OBJ}/dump-tl-file.o
|
||||
GENERATE_OBJECTS=${OBJ}/generate.o
|
||||
COMMON_OBJECTS=${OBJ}/tools.o
|
||||
OBJ_LIST=${TG_OBJECTS} ${TLC_OBJECTS} ${GENERATE_OBJECTS} ${COMMON_OBJECTS} ${TGL_OBJECTS} ${TLD_OBJECTS}
|
||||
OBJ_C=${TLC_OBJECTS} ${GENERATE_OBJECTS} ${COMMON_OBJECTS} ${TGL_OBJECTS} ${TLD_OBJECTS}
|
||||
TG_OBJECTS=${OBJ}/main.o ${OBJ}/loop.o ${OBJ}/interface.o ${OBJ}/lua-tg.o
|
||||
|
||||
DEPENDENCE=$(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${OBJ_LIST}))
|
||||
DEPENDENCE_LIST=${DEPENDENCE}
|
||||
@ -39,56 +31,24 @@ CC=@CC@
|
||||
|
||||
.SUFFIXES: .c .h .o
|
||||
|
||||
all: ${EXE_LIST} ${DIR_LIST} ${LIB_LIST}
|
||||
all: ${EXE_LIST} ${DIR_LIST}
|
||||
create_dirs_and_headers: ${DIR_LIST} ${AUTO}/auto.c ${AUTO}/auto-header.h ${AUTO}/constants.h
|
||||
create_dirs: ${DIR_LIST}
|
||||
dump-tl: ${EXE}/dump-tl-file
|
||||
|
||||
include ${srcdir}/Makefile.tl-parser
|
||||
include ${srcdir}/Makefile.tgl
|
||||
|
||||
${DIR_LIST}:
|
||||
@test -d $@ || mkdir -p $@
|
||||
|
||||
-include ${DEPENDENCE_LIST}
|
||||
|
||||
${TG_OBJECTS} ${TGL_OBJECTS}: ${AUTO}/constants.h ${AUTO}/auto-header.h
|
||||
|
||||
${TG_OBJECTS}: ${OBJ}/%.o: %.c | create_dirs_and_headers
|
||||
${CC} ${INCLUDE} ${COMPILE_FLAGS} -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $<
|
||||
|
||||
${OBJ_C}: ${OBJ}/%.o: %.c | create_dirs
|
||||
${CC} ${INCLUDE} ${COMPILE_FLAGS} -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $<
|
||||
|
||||
${EXE}/tlc: ${TLC_OBJECTS} ${COMMON_OBJECTS}
|
||||
${CC} ${TLC_OBJECTS} ${COMMON_OBJECTS} ${LINK_FLAGS} -o $@
|
||||
|
||||
${EXE}/telegram-cli: ${TG_OBJECTS} ${COMMON_OBJECTS} ${LIB}/libtgl.a
|
||||
${CC} ${TG_OBJECTS} ${COMMON_OBJECTS} ${LINK_FLAGS} -L${LIB} -l tgl -o $@
|
||||
|
||||
${LIB}/libtgl.a: ${TGL_OBJECTS} ${COMMON_OBJECTS}
|
||||
ar ruv $@ ${TGL_OBJECTS} ${COMMON_OBJECTS}
|
||||
|
||||
${EXE}/generate: ${GENERATE_OBJECTS} ${COMMON_OBJECTS}
|
||||
${CC} ${GENERATE_OBJECTS} ${COMMON_OBJECTS} ${LINK_FLAGS} -o $@
|
||||
|
||||
${AUTO}/scheme.tlo: ${AUTO}/scheme.tl ${EXE}/tlc
|
||||
${EXE}/tlc -e $@ ${AUTO}/scheme.tl
|
||||
|
||||
${AUTO}/scheme.tl: ${srcdir}/scheme.tl ${srcdir}/encrypted_scheme.tl ${srcdir}/binlog.tl ${srcdir}/append.tl | ${AUTO}
|
||||
cat $^ > $@
|
||||
|
||||
${AUTO}/scheme2.tl: ${AUTO}/scheme.tl ${EXE}/tlc
|
||||
${EXE}/tlc -E ${AUTO}/scheme.tl 2> $@ || ( cat $@ && rm $@ && false )
|
||||
|
||||
${AUTO}/auto.c: ${AUTO}/scheme.tlo ${EXE}/generate
|
||||
${EXE}/generate ${AUTO}/scheme.tlo > $@
|
||||
|
||||
${AUTO}/auto-header.h: ${AUTO}/scheme.tlo ${EXE}/generate
|
||||
${EXE}/generate -H ${AUTO}/scheme.tlo > $@
|
||||
|
||||
${AUTO}/constants.h: ${AUTO}/scheme2.tl ${srcdir}/gen_constants_h.awk
|
||||
awk -f ${srcdir}/gen_constants_h.awk < $< > $@
|
||||
|
||||
${EXE}/dump-tl-file: ${OBJ}/auto/auto.o ${TLD_OBJECTS}
|
||||
${CC} ${OBJ}/auto/auto.o ${TLD_OBJECTS} ${LINK_FLAGS} -o $@
|
||||
${EXE}/telegram-cli: ${TG_OBJECTS} ${LIB}/libtgl.a
|
||||
${CC} $^ ${LINK_FLAGS} -o $@
|
||||
|
||||
clean:
|
||||
rm -rf ${DIR_LIST} config.log config.status > /dev/null || echo "all clean"
|
||||
|
47
Makefile.tgl
Normal file
47
Makefile.tgl
Normal file
@ -0,0 +1,47 @@
|
||||
TGL_OBJECTS=${OBJ}/mtproto-common.o ${OBJ}/mtproto-client.o ${OBJ}/queries.o ${OBJ}/structures.o ${OBJ}/binlog.o ${OBJ}/tgl.o ${OBJ}/updates.o ${OBJ}/tgl-net.o ${OBJ}/tgl-timers.o
|
||||
TLD_OBJECTS=${OBJ}/dump-tl-file.o
|
||||
GENERATE_OBJECTS=${OBJ}/generate.o
|
||||
TGL_COMMON_OBJECTS=${OBJ}/tools.o
|
||||
TGL_OBJ_C=${GENERATE_OBJECTS} ${TGL_COMMON_OBJECTS} ${TGL_OBJECTS} ${TLD_OBJECTS}
|
||||
|
||||
.SUFFIXES:
|
||||
|
||||
.SUFFIXES: .c .h .o
|
||||
|
||||
dump-tl: ${EXE}/dump-tl-file
|
||||
|
||||
${OBJ}/auto/auto.o ${TGL_OBJECTS}: ${AUTO}/constants.h ${AUTO}/auto-header.h
|
||||
|
||||
${TGL_OBJ_C}: ${OBJ}/%.o: ${srcdir}/tgl/%.c | create_dirs
|
||||
${CC} ${INCLUDE} ${COMPILE_FLAGS} -iquote ${srcdir}/tgl -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $<
|
||||
|
||||
${OBJ}/auto/auto.o: ${AUTO}/auto.c
|
||||
${CC} ${INCLUDE} ${COMPILE_FLAGS} -iquote ${srcdir}/tgl -c -MP -MD -MF ${DEP}/auto/auto.d -MQ ${OBJ}/auto/auto.o -o $@ $<
|
||||
|
||||
${LIB}/libtgl.a: ${TGL_OBJECTS} ${TGL_COMMON_OBJECTS} ${OBJ}/auto/auto.o
|
||||
ar ruv $@ $^
|
||||
|
||||
${EXE}/generate: ${GENERATE_OBJECTS} ${TGL_COMMON_OBJECTS}
|
||||
${CC} ${GENERATE_OBJECTS} ${TGL_COMMON_OBJECTS} ${LINK_FLAGS} -o $@
|
||||
|
||||
${AUTO}/scheme.tlo: ${AUTO}/scheme.tl ${EXE}/tl-parser
|
||||
${EXE}/tl-parser -e $@ ${AUTO}/scheme.tl
|
||||
|
||||
${AUTO}/scheme.tl: ${srcdir}/tgl/scheme.tl ${srcdir}/tgl/encrypted_scheme.tl ${srcdir}/tgl/binlog.tl ${srcdir}/tgl/append.tl | ${AUTO}
|
||||
cat $^ > $@
|
||||
|
||||
${AUTO}/scheme2.tl: ${AUTO}/scheme.tl ${EXE}/tl-parser
|
||||
${EXE}/tl-parser -E ${AUTO}/scheme.tl 2> $@ || ( cat $@ && rm $@ && false )
|
||||
|
||||
${AUTO}/auto.c: ${AUTO}/scheme.tlo ${EXE}/generate
|
||||
${EXE}/generate ${AUTO}/scheme.tlo > $@
|
||||
|
||||
${AUTO}/auto-header.h: ${AUTO}/scheme.tlo ${EXE}/generate
|
||||
${EXE}/generate -H ${AUTO}/scheme.tlo > $@
|
||||
|
||||
${AUTO}/constants.h: ${AUTO}/scheme2.tl ${srcdir}/tgl/gen_constants_h.awk
|
||||
awk -f ${srcdir}/tgl/gen_constants_h.awk < $< > $@
|
||||
|
||||
${EXE}/dump-tl-file: ${OBJ}/auto/auto.o ${TLD_OBJECTS}
|
||||
${CC} ${OBJ}/auto/auto.o ${TLD_OBJECTS} ${LINK_FLAGS} -o $@
|
||||
|
7
Makefile.tl-parser
Normal file
7
Makefile.tl-parser
Normal file
@ -0,0 +1,7 @@
|
||||
TL_PARSER_OBJECTS=${OBJ}/tl-parser.o ${OBJ}/tlc.o ${OBJ}/crc32.o
|
||||
|
||||
${TL_PARSER_OBJECTS}: ${OBJ}/%.o: ${srcdir}/tgl/tl-parser/%.c | create_dirs
|
||||
${CC} ${INCLUDE} ${COMPILE_FLAGS} -iquote ${srcdir}/tgl/tl-parser -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $<
|
||||
|
||||
${EXE}/tl-parser: ${TL_PARSER_OBJECTS}
|
||||
${CC} $^ ${LINK_FLAGS} -o $@
|
@ -22,12 +22,7 @@ Fourth, in peer_name '#' are substitued to '@'. (Not applied to appending of '#%
|
||||
|
||||
Clone GitHub Repository
|
||||
|
||||
git clone https://github.com/vysheng/tg.git && cd tg
|
||||
|
||||
or download and extract zip
|
||||
|
||||
wget https://github.com/vysheng/tg/archive/master.zip -O tg-master.zip
|
||||
unzip tg-master.zip && cd tg-master
|
||||
git clone --recursive https://github.com/vysheng/tg.git && cd tg
|
||||
|
||||
#### Linux and BSDs
|
||||
|
||||
|
@ -1,2 +0,0 @@
|
||||
decryptedMessageMediaVideoL12#4cee6ef3 thumb:bytes thumb_w:int thumb_h:int duration:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaAudioL12#6080758f duration:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
83
binlog.tl
83
binlog.tl
@ -1,83 +0,0 @@
|
||||
---types---
|
||||
binlog.fileLocation dc:int volume:long local_id:int secret:long = binlog.FileLocation;
|
||||
binlog.chatParticipant user:int inviter:int date:int = binlog.ChatParticipant;
|
||||
|
||||
binlog.start = binlog.Update;
|
||||
|
||||
binlog.dcOption id:int name:string ip:string port:int = binlog.Update;
|
||||
binlog.authKey dc:int key_id:long key:64*[int] = binlog.Update;
|
||||
binlog.defaultDc dc:int = binlog.Update;
|
||||
binlog.ourId id:int = binlog.Update;
|
||||
binlog.dcSigned id:int = binlog.Update;
|
||||
binlog.dcSalt id:int salt:long = binlog.Update;
|
||||
|
||||
binlog.setDhParams root:int prime:64*[int] version:int = binlog.Update;
|
||||
binlog.setPts pts:int = binlog.Update;
|
||||
binlog.setQts qts:int = binlog.Update;
|
||||
binlog.setDate date:int = binlog.Update;
|
||||
binlog.setSeq seq:int = binlog.Update;
|
||||
|
||||
binlog.userAdd id:int first_name:string last_name:string hash:long phone:string is_contact:int = binlog.Update;
|
||||
binlog.userDelete id:int = binlog.Update;
|
||||
binlog.userSetAccessHash id:int hash:long = binlog.Update;
|
||||
binlog.userSetPhone id:int phone:string = binlog.Update;
|
||||
binlog.userSetFriend id:int friend:int = binlog.Update;
|
||||
binlog.userSetFullPhoto id:int photo:Photo = binlog.Update;
|
||||
binlog.userSetBlocked id:int blocked:int = binlog.Update;
|
||||
binlog.userSetRealName id:int real_first_name:string real_last_name:string = binlog.Update;
|
||||
binlog.userSetName id:int first_name:string last_name:string = binlog.Update;
|
||||
binlog.userSetPhoto id:int photo:UserProfilePhoto = binlog.Update;
|
||||
binlog.userSetUsername id:int username:string = binlog.Update;
|
||||
|
||||
binlog.encrChatDelete id:int = binlog.Update;
|
||||
binlog.encrChatRequested id:int hash:long date:int admin:int user:int key:64*[int] nonce:64*[int] = binlog.Update;
|
||||
binlog.encrChatAccepted id:int key:64*[int] nonce:64*[int] fingerprint:long = binlog.Update;
|
||||
binlog.encrChatInit id:int user:int key:64*[int] g_key:64*[int] = binlog.Update;
|
||||
binlog.encrChatCreate id:int user_id:int admin_id:int name:string = binlog.Update;
|
||||
|
||||
binlog.encrChatSetAccessHash id:int hash:long = binlog.Update;
|
||||
binlog.encrChatSetDate id:int date:int = binlog.Update;
|
||||
binlog.encrChatSetTtl id:int ttl:int = binlog.Update;
|
||||
binlog.encrChatSetLayer id:int layer:int = binlog.Update;
|
||||
binlog.encrChatSetState id:int state:int = binlog.Update;
|
||||
binlog.encrChatSetKey id:int key:64*[int] fingerprint:long = binlog.Update;
|
||||
|
||||
binlog.encrChatUpdateSeq id:int in_seq_no:int out_seq_no:int = binlog.Update;
|
||||
binlog.encrChatSetSeq id:int in_seq_no:int last_in_seq_no:int out_seq_no:int = binlog.Update;
|
||||
|
||||
binlog.chatCreate id:int flags:int title:string user_num:int date:int version:int photo_big:%binlog.FileLocation photo_small:%binlog.FileLocation = binlog.Update;
|
||||
binlog.chatChangeFlags id:int set_flags:int clear_flags:int = binlog.Update;
|
||||
binlog.chatSetTitle id:int title:string = binlog.Update;
|
||||
binlog.chatSetPhoto id:int photo_big:%binlog.FileLocation photo_small:%binlog.FileLocation = binlog.Update;
|
||||
binlog.chatSetDate id:int date:int = binlog.Update;
|
||||
binlog.chatSetVersion id:int version:int users_num:int = binlog.Update;
|
||||
binlog.chatSetAdmin id:int admin:int = binlog.Update;
|
||||
binlog.chatSetParticipants id:int version:int participants:%(Vector %binlog.ChatParticipant) = binlog.Update;
|
||||
binlog.chatSetFullPhoto id:int photo:Photo = binlog.Update;
|
||||
binlog.chatAddParticipant id:int version:int user:%binlog.ChatParticipant = binlog.Update;
|
||||
binlog.chatDelParticipant id:int version:int user:int = binlog.Update;
|
||||
|
||||
binlog.createMessageText id:int from_id:int to_type:int to_id:int date:int unread:int text:string = binlog.Update;
|
||||
binlog.sendMessageText id:long from_id:int to_type:int to_id:int date:int text:string = binlog.Update;
|
||||
binlog.sendMessageActionEncr id:long from_id:int to_type:int to_id:int date:int action:DecryptedMessageAction = binlog.Update;
|
||||
binlog.createMessageTextFwd id:int from_id:int to_type:int to_id:int date:int fwd_from_id:int fwd_date:int unread:int text:string = binlog.Update;
|
||||
binlog.createMessageMedia id:int from_id:int to_type:int to_id:int date:int unread:int text:string media:MessageMedia = binlog.Update;
|
||||
binlog.createMessageMediaEncr id:long from_id:int to_type:int to_id:int date:int text:string media:DecryptedMessageMedia file:EncryptedFile = binlog.Update;
|
||||
binlog.createMessageMediaEncrPending id:long from_id:int to_type:int to_id:int date:int text:string media:DecryptedMessageMedia = binlog.Update;
|
||||
binlog.createMessageMediaEncrSent id:long file:EncryptedFile = binlog.Update;
|
||||
binlog.createMessageMediaFwd id:int from_id:int to_type:int to_id:int date:int fwd_from_id:int fwd_date:int unread:int text:string media:MessageMedia = binlog.Update;
|
||||
binlog.createMessageService id:int from_id:int to_type:int to_id:int date:int unread:int action:MessageAction = binlog.Update;
|
||||
binlog.createMessageServiceEncr id:long from_id:int to_type:int to_id:int date:int action:DecryptedMessageAction = binlog.Update;
|
||||
binlog.createMessageServiceFwd id:int from_id:int to_type:int to_id:int date:int fwd_from_id:int fwd_date:int unread:int action:MessageAction = binlog.Update;
|
||||
binlog.messageSetUnread id:int = binlog.Update;
|
||||
binlog.messageSetUnreadLong id:long = binlog.Update;
|
||||
binlog.setMessageSent id:long = binlog.Update;
|
||||
binlog.setMsgId old_id:long new_id:int = binlog.Update;
|
||||
binlog.deleteMsg id:long = binlog.Update;
|
||||
|
||||
binlog.msgSeqUpdate id:long = binlog.Update;
|
||||
binlog.msgUpdate id:long = binlog.Update;
|
||||
|
||||
binlog.resetAuthorization = binlog.Update;
|
||||
|
||||
//binlog.addDc id:int ip:string port:int auth_key_id:long auth_key:64*[int] = binlog.Update;
|
668
crc32.c
668
crc32.c
@ -1,668 +0,0 @@
|
||||
/*
|
||||
This file is part of VK/KittenPHP-DB-Engine Library.
|
||||
|
||||
VK/KittenPHP-DB-Engine Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
VK/KittenPHP-DB-Engine Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with VK/KittenPHP-DB-Engine Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright 2009-2012 Vkontakte Ltd
|
||||
2009-2012 Nikolai Durov
|
||||
2009-2012 Andrei Lopatin
|
||||
2012 Anton Maydell
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "crc32.h"
|
||||
#endif
|
||||
|
||||
#ifndef HAVE___BUILTIN_BSWAP32
|
||||
static inline unsigned __builtin_bswap32(unsigned x) {
|
||||
return ((x << 24) & 0xff000000 ) |
|
||||
((x << 8) & 0x00ff0000 ) |
|
||||
((x >> 8) & 0x0000ff00 ) |
|
||||
((x >> 24) & 0x000000ff );
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned int crc32_table[256] =
|
||||
{
|
||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
|
||||
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
|
||||
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
|
||||
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
|
||||
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
|
||||
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
|
||||
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
|
||||
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
|
||||
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
|
||||
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
|
||||
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
|
||||
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
|
||||
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
|
||||
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
||||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
|
||||
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
|
||||
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
|
||||
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
|
||||
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
|
||||
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
||||
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
|
||||
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
|
||||
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
|
||||
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
|
||||
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
|
||||
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
|
||||
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
|
||||
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
|
||||
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
||||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
|
||||
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
|
||||
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
|
||||
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
|
||||
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
|
||||
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
|
||||
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
|
||||
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
|
||||
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
|
||||
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
|
||||
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
|
||||
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
||||
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
|
||||
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
|
||||
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
||||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
|
||||
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
|
||||
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
|
||||
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
|
||||
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
|
||||
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
|
||||
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
|
||||
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
|
||||
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
|
||||
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
|
||||
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
|
||||
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
|
||||
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
|
||||
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
|
||||
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
||||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
|
||||
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
|
||||
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||
};
|
||||
|
||||
unsigned int crc32_table2[256] =
|
||||
{
|
||||
0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3,
|
||||
0x646cc504, 0x7d77f445, 0x565aa786, 0x4f4196c7,
|
||||
0xc8d98a08, 0xd1c2bb49, 0xfaefe88a, 0xe3f4d9cb,
|
||||
0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, 0x87981ccf,
|
||||
0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192,
|
||||
0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496,
|
||||
0x821b9859, 0x9b00a918, 0xb02dfadb, 0xa936cb9a,
|
||||
0xe6775d5d, 0xff6c6c1c, 0xd4413fdf, 0xcd5a0e9e,
|
||||
0x958424a2, 0x8c9f15e3, 0xa7b24620, 0xbea97761,
|
||||
0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265,
|
||||
0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69,
|
||||
0x39316bae, 0x202a5aef, 0x0b07092c, 0x121c386d,
|
||||
0xdf4636f3, 0xc65d07b2, 0xed705471, 0xf46b6530,
|
||||
0xbb2af3f7, 0xa231c2b6, 0x891c9175, 0x9007a034,
|
||||
0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38,
|
||||
0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c,
|
||||
0xf0794f05, 0xe9627e44, 0xc24f2d87, 0xdb541cc6,
|
||||
0x94158a01, 0x8d0ebb40, 0xa623e883, 0xbf38d9c2,
|
||||
0x38a0c50d, 0x21bbf44c, 0x0a96a78f, 0x138d96ce,
|
||||
0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca,
|
||||
0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97,
|
||||
0xded79850, 0xc7cca911, 0xece1fad2, 0xf5facb93,
|
||||
0x7262d75c, 0x6b79e61d, 0x4054b5de, 0x594f849f,
|
||||
0x160e1258, 0x0f152319, 0x243870da, 0x3d23419b,
|
||||
0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864,
|
||||
0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60,
|
||||
0xad24e1af, 0xb43fd0ee, 0x9f12832d, 0x8609b26c,
|
||||
0xc94824ab, 0xd05315ea, 0xfb7e4629, 0xe2657768,
|
||||
0x2f3f79f6, 0x362448b7, 0x1d091b74, 0x04122a35,
|
||||
0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31,
|
||||
0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d,
|
||||
0x838a36fa, 0x9a9107bb, 0xb1bc5478, 0xa8a76539,
|
||||
0x3b83984b, 0x2298a90a, 0x09b5fac9, 0x10aecb88,
|
||||
0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, 0x74c20e8c,
|
||||
0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180,
|
||||
0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484,
|
||||
0x71418a1a, 0x685abb5b, 0x4377e898, 0x5a6cd9d9,
|
||||
0x152d4f1e, 0x0c367e5f, 0x271b2d9c, 0x3e001cdd,
|
||||
0xb9980012, 0xa0833153, 0x8bae6290, 0x92b553d1,
|
||||
0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5,
|
||||
0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a,
|
||||
0xca6b79ed, 0xd37048ac, 0xf85d1b6f, 0xe1462a2e,
|
||||
0x66de36e1, 0x7fc507a0, 0x54e85463, 0x4df36522,
|
||||
0x02b2f3e5, 0x1ba9c2a4, 0x30849167, 0x299fa026,
|
||||
0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b,
|
||||
0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f,
|
||||
0x2c1c24b0, 0x350715f1, 0x1e2a4632, 0x07317773,
|
||||
0x4870e1b4, 0x516bd0f5, 0x7a468336, 0x635db277,
|
||||
0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, 0xe0d7848d,
|
||||
0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189,
|
||||
0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85,
|
||||
0x674f9842, 0x7e54a903, 0x5579fac0, 0x4c62cb81,
|
||||
0x8138c51f, 0x9823f45e, 0xb30ea79d, 0xaa1596dc,
|
||||
0xe554001b, 0xfc4f315a, 0xd7626299, 0xce7953d8,
|
||||
0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4,
|
||||
0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0,
|
||||
0x5e7ef3ec, 0x4765c2ad, 0x6c48916e, 0x7553a02f,
|
||||
0x3a1236e8, 0x230907a9, 0x0824546a, 0x113f652b,
|
||||
0x96a779e4, 0x8fbc48a5, 0xa4911b66, 0xbd8a2a27,
|
||||
0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23,
|
||||
0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e,
|
||||
0x70d024b9, 0x69cb15f8, 0x42e6463b, 0x5bfd777a,
|
||||
0xdc656bb5, 0xc57e5af4, 0xee530937, 0xf7483876,
|
||||
0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, 0x9324fd72,
|
||||
};
|
||||
|
||||
unsigned int crc32_table1[256] =
|
||||
{
|
||||
0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59,
|
||||
0x0709a8dc, 0x06cbc2eb, 0x048d7cb2, 0x054f1685,
|
||||
0x0e1351b8, 0x0fd13b8f, 0x0d9785d6, 0x0c55efe1,
|
||||
0x091af964, 0x08d89353, 0x0a9e2d0a, 0x0b5c473d,
|
||||
0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29,
|
||||
0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5,
|
||||
0x1235f2c8, 0x13f798ff, 0x11b126a6, 0x10734c91,
|
||||
0x153c5a14, 0x14fe3023, 0x16b88e7a, 0x177ae44d,
|
||||
0x384d46e0, 0x398f2cd7, 0x3bc9928e, 0x3a0bf8b9,
|
||||
0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065,
|
||||
0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901,
|
||||
0x3157bf84, 0x3095d5b3, 0x32d36bea, 0x331101dd,
|
||||
0x246be590, 0x25a98fa7, 0x27ef31fe, 0x262d5bc9,
|
||||
0x23624d4c, 0x22a0277b, 0x20e69922, 0x2124f315,
|
||||
0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71,
|
||||
0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad,
|
||||
0x709a8dc0, 0x7158e7f7, 0x731e59ae, 0x72dc3399,
|
||||
0x7793251c, 0x76514f2b, 0x7417f172, 0x75d59b45,
|
||||
0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, 0x7ccf6221,
|
||||
0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd,
|
||||
0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9,
|
||||
0x6bb5866c, 0x6a77ec5b, 0x68315202, 0x69f33835,
|
||||
0x62af7f08, 0x636d153f, 0x612bab66, 0x60e9c151,
|
||||
0x65a6d7d4, 0x6464bde3, 0x662203ba, 0x67e0698d,
|
||||
0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579,
|
||||
0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5,
|
||||
0x46c49a98, 0x4706f0af, 0x45404ef6, 0x448224c1,
|
||||
0x41cd3244, 0x400f5873, 0x4249e62a, 0x438b8c1d,
|
||||
0x54f16850, 0x55330267, 0x5775bc3e, 0x56b7d609,
|
||||
0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5,
|
||||
0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1,
|
||||
0x5deb9134, 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d,
|
||||
0xe1351b80, 0xe0f771b7, 0xe2b1cfee, 0xe373a5d9,
|
||||
0xe63cb35c, 0xe7fed96b, 0xe5b86732, 0xe47a0d05,
|
||||
0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461,
|
||||
0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd,
|
||||
0xfd13b8f0, 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9,
|
||||
0xfa1a102c, 0xfbd87a1b, 0xf99ec442, 0xf85cae75,
|
||||
0xf300e948, 0xf2c2837f, 0xf0843d26, 0xf1465711,
|
||||
0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd,
|
||||
0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339,
|
||||
0xde71f5bc, 0xdfb39f8b, 0xddf521d2, 0xdc374be5,
|
||||
0xd76b0cd8, 0xd6a966ef, 0xd4efd8b6, 0xd52db281,
|
||||
0xd062a404, 0xd1a0ce33, 0xd3e6706a, 0xd2241a5d,
|
||||
0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049,
|
||||
0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895,
|
||||
0xcb4dafa8, 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1,
|
||||
0xcc440774, 0xcd866d43, 0xcfc0d31a, 0xce02b92d,
|
||||
0x91af9640, 0x906dfc77, 0x922b422e, 0x93e92819,
|
||||
0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5,
|
||||
0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1,
|
||||
0x98b56f24, 0x99770513, 0x9b31bb4a, 0x9af3d17d,
|
||||
0x8d893530, 0x8c4b5f07, 0x8e0de15e, 0x8fcf8b69,
|
||||
0x8a809dec, 0x8b42f7db, 0x89044982, 0x88c623b5,
|
||||
0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1,
|
||||
0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d,
|
||||
0xa9e2d0a0, 0xa820ba97, 0xaa6604ce, 0xaba46ef9,
|
||||
0xaeeb787c, 0xaf29124b, 0xad6fac12, 0xacadc625,
|
||||
0xa7f18118, 0xa633eb2f, 0xa4755576, 0xa5b73f41,
|
||||
0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d,
|
||||
0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89,
|
||||
0xb2cddb0c, 0xb30fb13b, 0xb1490f62, 0xb08b6555,
|
||||
0xbbd72268, 0xba15485f, 0xb853f606, 0xb9919c31,
|
||||
0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, 0xbe9834ed,
|
||||
};
|
||||
|
||||
unsigned int crc32_table0[256] = {
|
||||
0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee,
|
||||
0x8f629757, 0x37def032, 0x256b5fdc, 0x9dd738b9,
|
||||
0xc5b428ef, 0x7d084f8a, 0x6fbde064, 0xd7018701,
|
||||
0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, 0x58631056,
|
||||
0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871,
|
||||
0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26,
|
||||
0x95ad7f70, 0x2d111815, 0x3fa4b7fb, 0x8718d09e,
|
||||
0x1acfe827, 0xa2738f42, 0xb0c620ac, 0x087a47c9,
|
||||
0xa032af3e, 0x188ec85b, 0x0a3b67b5, 0xb28700d0,
|
||||
0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787,
|
||||
0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f,
|
||||
0xeae41086, 0x525877e3, 0x40edd80d, 0xf851bf68,
|
||||
0xf02bf8a1, 0x48979fc4, 0x5a22302a, 0xe29e574f,
|
||||
0x7f496ff6, 0xc7f50893, 0xd540a77d, 0x6dfcc018,
|
||||
0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0,
|
||||
0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7,
|
||||
0x9b14583d, 0x23a83f58, 0x311d90b6, 0x89a1f7d3,
|
||||
0x1476cf6a, 0xaccaa80f, 0xbe7f07e1, 0x06c36084,
|
||||
0x5ea070d2, 0xe61c17b7, 0xf4a9b859, 0x4c15df3c,
|
||||
0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b,
|
||||
0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c,
|
||||
0x446f98f5, 0xfcd3ff90, 0xee66507e, 0x56da371b,
|
||||
0x0eb9274d, 0xb6054028, 0xa4b0efc6, 0x1c0c88a3,
|
||||
0x81dbb01a, 0x3967d77f, 0x2bd27891, 0x936e1ff4,
|
||||
0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed,
|
||||
0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba,
|
||||
0xfe92dfec, 0x462eb889, 0x549b1767, 0xec277002,
|
||||
0x71f048bb, 0xc94c2fde, 0xdbf98030, 0x6345e755,
|
||||
0x6b3fa09c, 0xd383c7f9, 0xc1366817, 0x798a0f72,
|
||||
0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825,
|
||||
0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d,
|
||||
0x21e91f24, 0x99557841, 0x8be0d7af, 0x335cb0ca,
|
||||
0xed59b63b, 0x55e5d15e, 0x47507eb0, 0xffec19d5,
|
||||
0x623b216c, 0xda874609, 0xc832e9e7, 0x708e8e82,
|
||||
0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a,
|
||||
0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d,
|
||||
0xbd40e1a4, 0x05fc86c1, 0x1749292f, 0xaff54e4a,
|
||||
0x322276f3, 0x8a9e1196, 0x982bbe78, 0x2097d91d,
|
||||
0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, 0x6a4166a5,
|
||||
0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2,
|
||||
0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb,
|
||||
0xc2098e52, 0x7ab5e937, 0x680046d9, 0xd0bc21bc,
|
||||
0x88df31ea, 0x3063568f, 0x22d6f961, 0x9a6a9e04,
|
||||
0x07bda6bd, 0xbf01c1d8, 0xadb46e36, 0x15080953,
|
||||
0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174,
|
||||
0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623,
|
||||
0xd8c66675, 0x607a0110, 0x72cfaefe, 0xca73c99b,
|
||||
0x57a4f122, 0xef189647, 0xfdad39a9, 0x45115ecc,
|
||||
0x764dee06, 0xcef18963, 0xdc44268d, 0x64f841e8,
|
||||
0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf,
|
||||
0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907,
|
||||
0x3c9b51be, 0x842736db, 0x96929935, 0x2e2efe50,
|
||||
0x2654b999, 0x9ee8defc, 0x8c5d7112, 0x34e11677,
|
||||
0xa9362ece, 0x118a49ab, 0x033fe645, 0xbb838120,
|
||||
0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98,
|
||||
0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf,
|
||||
0xd67f4138, 0x6ec3265d, 0x7c7689b3, 0xc4caeed6,
|
||||
0x591dd66f, 0xe1a1b10a, 0xf3141ee4, 0x4ba87981,
|
||||
0x13cb69d7, 0xab770eb2, 0xb9c2a15c, 0x017ec639,
|
||||
0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e,
|
||||
0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949,
|
||||
0x090481f0, 0xb1b8e695, 0xa30d497b, 0x1bb12e1e,
|
||||
0x43d23e48, 0xfb6e592d, 0xe9dbf6c3, 0x516791a6,
|
||||
0xccb0a91f, 0x740cce7a, 0x66b96194, 0xde0506f1,
|
||||
};
|
||||
|
||||
unsigned crc32_partial_old (const void *data, int len, unsigned crc) {
|
||||
const char *p = data;
|
||||
for (; len > 0; len--) {
|
||||
crc = crc32_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
/*
|
||||
unsigned crc32_partial_fast (const void *data, int len, unsigned crc) {
|
||||
const int *p = (const int *) data;
|
||||
int x;
|
||||
for (x = (len >> 2); x > 0; x--) {
|
||||
crc ^= *p++;
|
||||
crc = crc32_table0[crc & 0xff] ^ crc32_table1[(crc & 0xff00) >> 8] ^ crc32_table2[(crc & 0xff0000) >> 16] ^ crc32_table[crc >> 24];
|
||||
}
|
||||
const char *q = (const char *) p;
|
||||
switch (len & 3) {
|
||||
case 3:
|
||||
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||
case 2:
|
||||
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||
case 1:
|
||||
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
*/
|
||||
|
||||
unsigned crc32_partial (const void *data, int len, unsigned crc) {
|
||||
const int *p = (const int *) data;
|
||||
int x;
|
||||
#define DO_ONE(v) crc ^= v; crc = crc32_table0[crc & 0xff] ^ crc32_table1[(crc & 0xff00) >> 8] ^ crc32_table2[(crc & 0xff0000) >> 16] ^ crc32_table[crc >> 24];
|
||||
#define DO_FOUR(p) DO_ONE((p)[0]); DO_ONE((p)[1]); DO_ONE((p)[2]); DO_ONE((p)[3]);
|
||||
|
||||
for (x = (len >> 5); x > 0; x--) {
|
||||
DO_FOUR (p);
|
||||
DO_FOUR (p + 4);
|
||||
p += 8;
|
||||
}
|
||||
if (len & 16) {
|
||||
DO_FOUR (p);
|
||||
p += 4;
|
||||
}
|
||||
if (len & 8) {
|
||||
DO_ONE (p[0]);
|
||||
DO_ONE (p[1]);
|
||||
p += 2;
|
||||
}
|
||||
if (len & 4) {
|
||||
DO_ONE (*p++);
|
||||
}
|
||||
/*
|
||||
for (x = (len >> 2) & 7; x > 0; x--) {
|
||||
DO_ONE (*p++);
|
||||
}
|
||||
*/
|
||||
#undef DO_ONE
|
||||
#undef DO_FOUR
|
||||
const char *q = (const char *) p;
|
||||
if (len & 2) {
|
||||
crc = crc32_table[(crc ^ q[0]) & 0xff] ^ (crc >> 8);
|
||||
crc = crc32_table[(crc ^ q[1]) & 0xff] ^ (crc >> 8);
|
||||
q += 2;
|
||||
}
|
||||
if (len & 1) {
|
||||
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned compute_crc32 (const void *data, int len) {
|
||||
return crc32_partial (data, len, -1) ^ -1;
|
||||
}
|
||||
|
||||
unsigned long long crc64_table[256] = {
|
||||
0x0000000000000000LL, 0xb32e4cbe03a75f6fLL, 0xf4843657a840a05bLL, 0x47aa7ae9abe7ff34LL,
|
||||
0x7bd0c384ff8f5e33LL, 0xc8fe8f3afc28015cLL, 0x8f54f5d357cffe68LL, 0x3c7ab96d5468a107LL,
|
||||
0xf7a18709ff1ebc66LL, 0x448fcbb7fcb9e309LL, 0x0325b15e575e1c3dLL, 0xb00bfde054f94352LL,
|
||||
0x8c71448d0091e255LL, 0x3f5f08330336bd3aLL, 0x78f572daa8d1420eLL, 0xcbdb3e64ab761d61LL,
|
||||
0x7d9ba13851336649LL, 0xceb5ed8652943926LL, 0x891f976ff973c612LL, 0x3a31dbd1fad4997dLL,
|
||||
0x064b62bcaebc387aLL, 0xb5652e02ad1b6715LL, 0xf2cf54eb06fc9821LL, 0x41e11855055bc74eLL,
|
||||
0x8a3a2631ae2dda2fLL, 0x39146a8fad8a8540LL, 0x7ebe1066066d7a74LL, 0xcd905cd805ca251bLL,
|
||||
0xf1eae5b551a2841cLL, 0x42c4a90b5205db73LL, 0x056ed3e2f9e22447LL, 0xb6409f5cfa457b28LL,
|
||||
0xfb374270a266cc92LL, 0x48190ecea1c193fdLL, 0x0fb374270a266cc9LL, 0xbc9d3899098133a6LL,
|
||||
0x80e781f45de992a1LL, 0x33c9cd4a5e4ecdceLL, 0x7463b7a3f5a932faLL, 0xc74dfb1df60e6d95LL,
|
||||
0x0c96c5795d7870f4LL, 0xbfb889c75edf2f9bLL, 0xf812f32ef538d0afLL, 0x4b3cbf90f69f8fc0LL,
|
||||
0x774606fda2f72ec7LL, 0xc4684a43a15071a8LL, 0x83c230aa0ab78e9cLL, 0x30ec7c140910d1f3LL,
|
||||
0x86ace348f355aadbLL, 0x3582aff6f0f2f5b4LL, 0x7228d51f5b150a80LL, 0xc10699a158b255efLL,
|
||||
0xfd7c20cc0cdaf4e8LL, 0x4e526c720f7dab87LL, 0x09f8169ba49a54b3LL, 0xbad65a25a73d0bdcLL,
|
||||
0x710d64410c4b16bdLL, 0xc22328ff0fec49d2LL, 0x85895216a40bb6e6LL, 0x36a71ea8a7ace989LL,
|
||||
0x0adda7c5f3c4488eLL, 0xb9f3eb7bf06317e1LL, 0xfe5991925b84e8d5LL, 0x4d77dd2c5823b7baLL,
|
||||
0x64b62bcaebc387a1LL, 0xd7986774e864d8ceLL, 0x90321d9d438327faLL, 0x231c512340247895LL,
|
||||
0x1f66e84e144cd992LL, 0xac48a4f017eb86fdLL, 0xebe2de19bc0c79c9LL, 0x58cc92a7bfab26a6LL,
|
||||
0x9317acc314dd3bc7LL, 0x2039e07d177a64a8LL, 0x67939a94bc9d9b9cLL, 0xd4bdd62abf3ac4f3LL,
|
||||
0xe8c76f47eb5265f4LL, 0x5be923f9e8f53a9bLL, 0x1c4359104312c5afLL, 0xaf6d15ae40b59ac0LL,
|
||||
0x192d8af2baf0e1e8LL, 0xaa03c64cb957be87LL, 0xeda9bca512b041b3LL, 0x5e87f01b11171edcLL,
|
||||
0x62fd4976457fbfdbLL, 0xd1d305c846d8e0b4LL, 0x96797f21ed3f1f80LL, 0x2557339fee9840efLL,
|
||||
0xee8c0dfb45ee5d8eLL, 0x5da24145464902e1LL, 0x1a083bacedaefdd5LL, 0xa9267712ee09a2baLL,
|
||||
0x955cce7fba6103bdLL, 0x267282c1b9c65cd2LL, 0x61d8f8281221a3e6LL, 0xd2f6b4961186fc89LL,
|
||||
0x9f8169ba49a54b33LL, 0x2caf25044a02145cLL, 0x6b055fede1e5eb68LL, 0xd82b1353e242b407LL,
|
||||
0xe451aa3eb62a1500LL, 0x577fe680b58d4a6fLL, 0x10d59c691e6ab55bLL, 0xa3fbd0d71dcdea34LL,
|
||||
0x6820eeb3b6bbf755LL, 0xdb0ea20db51ca83aLL, 0x9ca4d8e41efb570eLL, 0x2f8a945a1d5c0861LL,
|
||||
0x13f02d374934a966LL, 0xa0de61894a93f609LL, 0xe7741b60e174093dLL, 0x545a57dee2d35652LL,
|
||||
0xe21ac88218962d7aLL, 0x5134843c1b317215LL, 0x169efed5b0d68d21LL, 0xa5b0b26bb371d24eLL,
|
||||
0x99ca0b06e7197349LL, 0x2ae447b8e4be2c26LL, 0x6d4e3d514f59d312LL, 0xde6071ef4cfe8c7dLL,
|
||||
0x15bb4f8be788911cLL, 0xa6950335e42fce73LL, 0xe13f79dc4fc83147LL, 0x521135624c6f6e28LL,
|
||||
0x6e6b8c0f1807cf2fLL, 0xdd45c0b11ba09040LL, 0x9aefba58b0476f74LL, 0x29c1f6e6b3e0301bLL,
|
||||
0xc96c5795d7870f42LL, 0x7a421b2bd420502dLL, 0x3de861c27fc7af19LL, 0x8ec62d7c7c60f076LL,
|
||||
0xb2bc941128085171LL, 0x0192d8af2baf0e1eLL, 0x4638a2468048f12aLL, 0xf516eef883efae45LL,
|
||||
0x3ecdd09c2899b324LL, 0x8de39c222b3eec4bLL, 0xca49e6cb80d9137fLL, 0x7967aa75837e4c10LL,
|
||||
0x451d1318d716ed17LL, 0xf6335fa6d4b1b278LL, 0xb199254f7f564d4cLL, 0x02b769f17cf11223LL,
|
||||
0xb4f7f6ad86b4690bLL, 0x07d9ba1385133664LL, 0x4073c0fa2ef4c950LL, 0xf35d8c442d53963fLL,
|
||||
0xcf273529793b3738LL, 0x7c0979977a9c6857LL, 0x3ba3037ed17b9763LL, 0x888d4fc0d2dcc80cLL,
|
||||
0x435671a479aad56dLL, 0xf0783d1a7a0d8a02LL, 0xb7d247f3d1ea7536LL, 0x04fc0b4dd24d2a59LL,
|
||||
0x3886b22086258b5eLL, 0x8ba8fe9e8582d431LL, 0xcc0284772e652b05LL, 0x7f2cc8c92dc2746aLL,
|
||||
0x325b15e575e1c3d0LL, 0x8175595b76469cbfLL, 0xc6df23b2dda1638bLL, 0x75f16f0cde063ce4LL,
|
||||
0x498bd6618a6e9de3LL, 0xfaa59adf89c9c28cLL, 0xbd0fe036222e3db8LL, 0x0e21ac88218962d7LL,
|
||||
0xc5fa92ec8aff7fb6LL, 0x76d4de52895820d9LL, 0x317ea4bb22bfdfedLL, 0x8250e80521188082LL,
|
||||
0xbe2a516875702185LL, 0x0d041dd676d77eeaLL, 0x4aae673fdd3081deLL, 0xf9802b81de97deb1LL,
|
||||
0x4fc0b4dd24d2a599LL, 0xfceef8632775faf6LL, 0xbb44828a8c9205c2LL, 0x086ace348f355aadLL,
|
||||
0x34107759db5dfbaaLL, 0x873e3be7d8faa4c5LL, 0xc094410e731d5bf1LL, 0x73ba0db070ba049eLL,
|
||||
0xb86133d4dbcc19ffLL, 0x0b4f7f6ad86b4690LL, 0x4ce50583738cb9a4LL, 0xffcb493d702be6cbLL,
|
||||
0xc3b1f050244347ccLL, 0x709fbcee27e418a3LL, 0x3735c6078c03e797LL, 0x841b8ab98fa4b8f8LL,
|
||||
0xadda7c5f3c4488e3LL, 0x1ef430e13fe3d78cLL, 0x595e4a08940428b8LL, 0xea7006b697a377d7LL,
|
||||
0xd60abfdbc3cbd6d0LL, 0x6524f365c06c89bfLL, 0x228e898c6b8b768bLL, 0x91a0c532682c29e4LL,
|
||||
0x5a7bfb56c35a3485LL, 0xe955b7e8c0fd6beaLL, 0xaeffcd016b1a94deLL, 0x1dd181bf68bdcbb1LL,
|
||||
0x21ab38d23cd56ab6LL, 0x9285746c3f7235d9LL, 0xd52f0e859495caedLL, 0x6601423b97329582LL,
|
||||
0xd041dd676d77eeaaLL, 0x636f91d96ed0b1c5LL, 0x24c5eb30c5374ef1LL, 0x97eba78ec690119eLL,
|
||||
0xab911ee392f8b099LL, 0x18bf525d915feff6LL, 0x5f1528b43ab810c2LL, 0xec3b640a391f4fadLL,
|
||||
0x27e05a6e926952ccLL, 0x94ce16d091ce0da3LL, 0xd3646c393a29f297LL, 0x604a2087398eadf8LL,
|
||||
0x5c3099ea6de60cffLL, 0xef1ed5546e415390LL, 0xa8b4afbdc5a6aca4LL, 0x1b9ae303c601f3cbLL,
|
||||
0x56ed3e2f9e224471LL, 0xe5c372919d851b1eLL, 0xa26908783662e42aLL, 0x114744c635c5bb45LL,
|
||||
0x2d3dfdab61ad1a42LL, 0x9e13b115620a452dLL, 0xd9b9cbfcc9edba19LL, 0x6a978742ca4ae576LL,
|
||||
0xa14cb926613cf817LL, 0x1262f598629ba778LL, 0x55c88f71c97c584cLL, 0xe6e6c3cfcadb0723LL,
|
||||
0xda9c7aa29eb3a624LL, 0x69b2361c9d14f94bLL, 0x2e184cf536f3067fLL, 0x9d36004b35545910LL,
|
||||
0x2b769f17cf112238LL, 0x9858d3a9ccb67d57LL, 0xdff2a94067518263LL, 0x6cdce5fe64f6dd0cLL,
|
||||
0x50a65c93309e7c0bLL, 0xe388102d33392364LL, 0xa4226ac498dedc50LL, 0x170c267a9b79833fLL,
|
||||
0xdcd7181e300f9e5eLL, 0x6ff954a033a8c131LL, 0x28532e49984f3e05LL, 0x9b7d62f79be8616aLL,
|
||||
0xa707db9acf80c06dLL, 0x14299724cc279f02LL, 0x5383edcd67c06036LL, 0xe0ada17364673f59LL
|
||||
};
|
||||
|
||||
unsigned long long crc64_partial (const void *data, int len, unsigned long long crc) {
|
||||
const char *p = data;
|
||||
for (; len > 0; len--) {
|
||||
crc = crc64_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned long long crc64 (const void *data, int len) {
|
||||
return crc64_partial (data, len, -1LL) ^ -1LL;
|
||||
}
|
||||
|
||||
static unsigned gf32_matrix_times (unsigned *matrix, unsigned vector) {
|
||||
unsigned sum = 0;
|
||||
while (vector) {
|
||||
if (vector & 1) {
|
||||
sum ^= *matrix;
|
||||
}
|
||||
vector >>= 1;
|
||||
matrix++;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
static void gf32_matrix_square (unsigned *square, unsigned *matrix) {
|
||||
int n = 0;
|
||||
do {
|
||||
square[n] = gf32_matrix_times (matrix, matrix[n]);
|
||||
} while (++n < 32);
|
||||
}
|
||||
|
||||
unsigned compute_crc32_combine (unsigned crc1, unsigned crc2, int len2) {
|
||||
assert (len2 < (1 << 29));
|
||||
static int power_buf_initialized = 0;
|
||||
static unsigned power_buf[1024];
|
||||
int n;
|
||||
/* degenerate case (also disallow negative lengths) */
|
||||
if (len2 <= 0) {
|
||||
return crc1;
|
||||
}
|
||||
if (!power_buf_initialized) {
|
||||
power_buf[0] = 0xedb88320UL;
|
||||
for (n = 0; n < 31; n++) {
|
||||
power_buf[n+1] = 1U << n;
|
||||
}
|
||||
for (n = 1; n < 32; n++) {
|
||||
gf32_matrix_square (power_buf + (n << 5), power_buf + ((n - 1) << 5));
|
||||
}
|
||||
power_buf_initialized = 1;
|
||||
}
|
||||
|
||||
unsigned int *p = power_buf + 64;
|
||||
do {
|
||||
p += 32;
|
||||
if (len2 & 1) {
|
||||
crc1 = gf32_matrix_times (p, crc1);
|
||||
}
|
||||
len2 >>= 1;
|
||||
} while (len2);
|
||||
return crc1 ^ crc2;
|
||||
}
|
||||
|
||||
|
||||
/********************************* crc32 repair ************************/
|
||||
struct fcb_table_entry {
|
||||
unsigned p; //zeta ^ k
|
||||
int i;
|
||||
};
|
||||
|
||||
static inline unsigned gf32_mod (unsigned long long r, int high_bit) {
|
||||
int j = high_bit;
|
||||
for (j = high_bit; j >= 32; j--) {
|
||||
if ((1ULL << j) & r) {
|
||||
r ^= 0x04C11DB7ULL << (j - 32);
|
||||
}
|
||||
}
|
||||
return (unsigned) r;
|
||||
}
|
||||
|
||||
static unsigned gf32_mult (unsigned a, unsigned b) {
|
||||
int i;
|
||||
const unsigned long long m = b;
|
||||
unsigned long long r = 0;
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (a & (1U << i)) {
|
||||
r ^= m << i;
|
||||
}
|
||||
}
|
||||
return gf32_mod (r, 62);
|
||||
}
|
||||
|
||||
static unsigned gf32_shl (unsigned int a, int shift) {
|
||||
unsigned long long r = a;
|
||||
r <<= shift;
|
||||
return gf32_mod (r, 31 + shift);
|
||||
}
|
||||
|
||||
static unsigned gf32_pow (unsigned a, int k) {
|
||||
if (!k) { return 1; }
|
||||
unsigned x = gf32_pow (gf32_mult (a, a), k >> 1);
|
||||
if (k & 1) {
|
||||
x = gf32_mult (x, a);
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
static int cmp_fcb_table_entry (const void *a, const void *b) {
|
||||
const struct fcb_table_entry *x = a;
|
||||
const struct fcb_table_entry *y = b;
|
||||
if (x->p < y->p) { return -1; }
|
||||
if (x->p > y->p) { return 1; }
|
||||
if (x->i < y->i) { return -1; }
|
||||
if (x->i > y->i) { return 1; }
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define GROUP_SWAP(x,m,s) ((x & m) << s) | ((x & (~m)) >> s)
|
||||
static unsigned revbin (unsigned x) {
|
||||
x = GROUP_SWAP(x,0x55555555U,1);
|
||||
x = GROUP_SWAP(x,0x33333333U,2);
|
||||
x = GROUP_SWAP(x,0x0f0f0f0fU,4);
|
||||
x = __builtin_bswap32 (x);
|
||||
return x;
|
||||
}
|
||||
#undef GROUP_SWAP
|
||||
|
||||
static inline unsigned xmult (unsigned a) {
|
||||
unsigned r = a << 1;
|
||||
if (a & (1U<<31)) {
|
||||
r ^= 0x04C11DB7U;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
static int find_corrupted_bit (int size, unsigned d) {
|
||||
int i, j;
|
||||
size += 4;
|
||||
d = revbin (d);
|
||||
int n = size << 3;
|
||||
int r = (int) (sqrt (n) + 0.5);
|
||||
struct fcb_table_entry *T = calloc (r, sizeof (struct fcb_table_entry));
|
||||
assert (T != NULL);
|
||||
T[0].i = 0;
|
||||
T[0].p = 1;
|
||||
for (i = 1; i < r; i++) {
|
||||
T[i].i = i;
|
||||
T[i].p = xmult (T[i-1].p);
|
||||
}
|
||||
assert (xmult (0x82608EDB) == 1);
|
||||
qsort (T, r, sizeof (T[0]), cmp_fcb_table_entry);
|
||||
unsigned q = gf32_pow (0x82608EDB, r);
|
||||
|
||||
unsigned A[32];
|
||||
for (i = 0; i < 32; i++) {
|
||||
A[i] = gf32_shl (q, i);
|
||||
}
|
||||
|
||||
unsigned x = d;
|
||||
int max_j = n / r, res = -1;
|
||||
for (j = 0; j <= max_j; j++) {
|
||||
int a = -1, b = r;
|
||||
while (b - a > 1) {
|
||||
int c = ((a + b) >> 1);
|
||||
if (T[c].p <= x) { a = c; } else { b = c; }
|
||||
}
|
||||
if (a >= 0 && T[a].p == x) {
|
||||
res = T[a].i + r * j;
|
||||
break;
|
||||
}
|
||||
x = gf32_matrix_times (A, x);
|
||||
}
|
||||
free (T);
|
||||
return res;
|
||||
}
|
||||
|
||||
static int repair_bit (unsigned char *input, int l, int k) {
|
||||
if (k < 0) {
|
||||
return -1;
|
||||
}
|
||||
int idx = k >> 5, bit = k & 31, i = (l - 1) - (idx - 1) * 4;
|
||||
while (bit >= 8) {
|
||||
i--;
|
||||
bit -= 8;
|
||||
}
|
||||
if (i < 0) {
|
||||
return -2;
|
||||
}
|
||||
if (i >= l) {
|
||||
return -3;
|
||||
}
|
||||
int j = 7 - bit;
|
||||
input[i] ^= 1 << j;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int crc32_check_and_repair (void *input, int l, unsigned *input_crc32, int force_exit) {
|
||||
unsigned computed_crc32 = compute_crc32 (input, l);
|
||||
const unsigned crc32_diff = computed_crc32 ^ (*input_crc32);
|
||||
if (!crc32_diff) {
|
||||
return 0;
|
||||
}
|
||||
int k = find_corrupted_bit (l, crc32_diff);
|
||||
int r = repair_bit (input, l, k);
|
||||
if (!r) {
|
||||
assert (compute_crc32 (input, l) == *input_crc32);
|
||||
return 1;
|
||||
}
|
||||
if (!(crc32_diff & (crc32_diff - 1))) { /* crc32_diff is power of 2 */
|
||||
*input_crc32 = computed_crc32;
|
||||
return 2;
|
||||
}
|
||||
assert (!force_exit);
|
||||
*input_crc32 = computed_crc32;
|
||||
return -1;
|
||||
}
|
59
crc32.h
59
crc32.h
@ -1,59 +0,0 @@
|
||||
/*
|
||||
This file is part of VK/KittenPHP-DB-Engine Library.
|
||||
|
||||
VK/KittenPHP-DB-Engine Library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
VK/KittenPHP-DB-Engine Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with VK/KittenPHP-DB-Engine Library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright 2009-2012 Vkontakte Ltd
|
||||
2009-2012 Nikolai Durov
|
||||
2009-2012 Andrei Lopatin
|
||||
2012 Anton Maydell
|
||||
*/
|
||||
|
||||
#ifndef __CRC32_H__
|
||||
#define __CRC32_H__
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern unsigned int crc32_table[256];
|
||||
unsigned crc32_partial (const void *data, int len, unsigned crc);
|
||||
//unsigned crc32_partial_fast (const void *data, int len, unsigned crc);
|
||||
//unsigned crc32_partial_fastest (const void *data, int len, unsigned crc);
|
||||
unsigned compute_crc32 (const void *data, int len);
|
||||
unsigned compute_crc32_combine (unsigned crc1, unsigned crc2, int len2);
|
||||
|
||||
extern unsigned long long crc64_table[256];
|
||||
unsigned long long crc64_partial (const void *data, int len, unsigned long long crc);
|
||||
unsigned long long crc64 (const void *data, int len);
|
||||
|
||||
//unsigned gf32_matrix_times (unsigned *matrix, unsigned vector);
|
||||
|
||||
/* crc32_check_and_repair returns
|
||||
0 : Cyclic redundancy check is ok
|
||||
1 : Cyclic redundancy check fails, but we fix one bit in input
|
||||
2 : Cyclic redundancy check fails, but we fix one bit in input_crc32
|
||||
-1 : Cyclic redundancy check fails, no repair possible.
|
||||
In this case *input_crc32 will be equal crc32 (input, l)
|
||||
|
||||
Case force_exit == 1 (case 1, 2: kprintf call, case -1: assert fail).
|
||||
*/
|
||||
int crc32_check_and_repair (void *input, int l, unsigned *input_crc32, int force_exit);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1 +0,0 @@
|
||||
encrypted_scheme17.tl
|
@ -1,22 +0,0 @@
|
||||
---types---
|
||||
decryptedMessageLayer#99a438cf layer:int message:DecryptedMessage = DecryptedMessageLayer;
|
||||
decryptedMessage#1f814f1f random_id:long random_bytes:bytes message:string media:DecryptedMessageMedia = DecryptedMessage;
|
||||
decryptedMessageService#aa48327d random_id:long random_bytes:bytes action:DecryptedMessageAction = DecryptedMessage;
|
||||
decryptedMessageMediaEmpty#89f5c4a = DecryptedMessageMedia;
|
||||
decryptedMessageMediaPhoto#32798a8c thumb:bytes thumb_w:int thumb_h:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
//decryptedMessageMediaVideo#4cee6ef3 thumb:bytes thumb_w:int thumb_h:int duration:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaGeoPoint#35480a59 lat:double long:double = DecryptedMessageMedia;
|
||||
decryptedMessageMediaContact#588a0a97 phone_number:string first_name:string last_name:string user_id:int = DecryptedMessageMedia;
|
||||
decryptedMessageActionSetMessageTTL#a1733aec ttl_seconds:int = DecryptedMessageAction;
|
||||
|
||||
decryptedMessageMediaDocument#b095434b thumb:bytes thumb_w:int thumb_h:int file_name:string mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
//decryptedMessageMediaAudio#6080758f duration:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
|
||||
decryptedMessageMediaVideo#524a415d thumb:bytes thumb_w:int thumb_h:int duration:int mime_type:string w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaAudio#57e0a9cb duration:int mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageActionReadMessages#c4f40be random_ids:Vector<long> = DecryptedMessageAction;
|
||||
decryptedMessageActionDeleteMessages#65614304 random_ids:Vector<long> = DecryptedMessageAction;
|
||||
decryptedMessageActionScreenshotMessages#8ac1f475 random_ids:Vector<long> = DecryptedMessageAction;
|
||||
decryptedMessageActionFlushHistory#6719e45c = DecryptedMessageAction;
|
||||
decryptedMessageActionNotifyLayer#f3048883 layer:int = DecryptedMessageAction;
|
||||
---functions---
|
@ -1,31 +0,0 @@
|
||||
---types---
|
||||
decryptedMessageLayer#1be31789 layer:int message:DecryptedMessage = DecryptedMessageLayer;
|
||||
decryptedMessage_l16#1f814f1f random_id:long random_bytes:bytes message:string media:DecryptedMessageMedia = DecryptedMessage;
|
||||
decryptedMessageService_l16#aa48327d random_id:long random_bytes:bytes action:DecryptedMessageAction = DecryptedMessage;
|
||||
|
||||
decryptedMessage#204d3878 in_seq_no:int out_seq_no:int ttl:int random_id:long random_bytes:bytes message:string media:DecryptedMessageMedia = DecryptedMessage;
|
||||
decryptedMessageService#73164160 in_seq_no:int out_seq_no:int random_id:long random_bytes:bytes action:DecryptedMessageAction = DecryptedMessage;
|
||||
|
||||
decryptedMessageMediaEmpty#89f5c4a = DecryptedMessageMedia;
|
||||
decryptedMessageMediaPhoto#32798a8c thumb:bytes thumb_w:int thumb_h:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
//decryptedMessageMediaVideo#4cee6ef3 thumb:bytes thumb_w:int thumb_h:int duration:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaGeoPoint#35480a59 lat:double long:double = DecryptedMessageMedia;
|
||||
decryptedMessageMediaContact#588a0a97 phone_number:string first_name:string last_name:string user_id:int = DecryptedMessageMedia;
|
||||
decryptedMessageActionSetMessageTTL#a1733aec ttl_seconds:int = DecryptedMessageAction;
|
||||
|
||||
decryptedMessageMediaDocument#b095434b thumb:bytes thumb_w:int thumb_h:int file_name:string mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
//decryptedMessageMediaAudio#6080758f duration:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
|
||||
decryptedMessageMediaVideo#524a415d thumb:bytes thumb_w:int thumb_h:int duration:int mime_type:string w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaAudio#57e0a9cb duration:int mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageActionReadMessages#c4f40be random_ids:Vector<long> = DecryptedMessageAction;
|
||||
decryptedMessageActionDeleteMessages#65614304 random_ids:Vector<long> = DecryptedMessageAction;
|
||||
decryptedMessageActionScreenshotMessages#8ac1f475 random_ids:Vector<long> = DecryptedMessageAction;
|
||||
decryptedMessageActionFlushHistory#6719e45c = DecryptedMessageAction;
|
||||
decryptedMessageActionNotifyLayer#f3048883 layer:int = DecryptedMessageAction;
|
||||
|
||||
decryptedMessageActionResend#511110b0 start_seq_no:int end_seq_no:int = DecryptedMessageAction;
|
||||
|
||||
decryptedMessageActionTyping#ccb27641 action:SendMessageAction = DecryptedMessageAction;
|
||||
|
||||
---functions---
|
@ -1,37 +0,0 @@
|
||||
BEGIN {
|
||||
print "/*";
|
||||
print " This file is part of telegram-client.";
|
||||
print "";
|
||||
print " Telegram-client is free software: you can redistribute it and/or modify";
|
||||
print " it under the terms of the GNU General Public License as published by";
|
||||
print " the Free Software Foundation, either version 2 of the License, or";
|
||||
print " (at your option) any later version.";
|
||||
print "";
|
||||
print " Telegram-client is distributed in the hope that it will be useful,";
|
||||
print " but WITHOUT ANY WARRANTY; without even the implied warranty of";
|
||||
print " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the";
|
||||
print " GNU General Public License for more details.";
|
||||
print "";
|
||||
print " You should have received a copy of the GNU General Public License";
|
||||
print " along with this telegram-client. If not, see <http://www.gnu.org/licenses/>.";
|
||||
print "";
|
||||
print " Copyright Vitaly Valtman 2013";
|
||||
print "*/";
|
||||
print "#ifndef CONSTANTS_H";
|
||||
print "#define CONSTANTS_H";
|
||||
}
|
||||
// {
|
||||
if (split ($1, a, "#") == 2) {
|
||||
gsub (/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]/, "_&", a[1]);
|
||||
gsub (/[.]/, "_", a[1]);
|
||||
if (a[2] in h) {
|
||||
print "ERROR: Duplicate magic " a[2] " for define " a[1] " and " h[a[2]] >"/dev/stderr/"
|
||||
exit 1;
|
||||
}
|
||||
h[a[2]] = a[1];
|
||||
print "#define", "CODE_" tolower(a[1]), "0x" a[2];
|
||||
}
|
||||
}
|
||||
END {
|
||||
print "#endif";
|
||||
}
|
1829
generate.c
1829
generate.c
File diff suppressed because it is too large
Load Diff
171
generate.h
171
generate.h
@ -1,171 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-libary/generate
|
||||
|
||||
Tgl-library/generate is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Tgl-library/generate is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this tgl-library/generate. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2014
|
||||
|
||||
It is derivative work of VK/KittenPHP-DB-Engine (https://github.com/vk-com/kphp-kdb/)
|
||||
Copyright 2012-2013 Vkontakte Ltd
|
||||
2012-2013 Vitaliy Valtman
|
||||
*/
|
||||
|
||||
#ifndef __GENERATE_H__
|
||||
#define __GENERATE_H__
|
||||
|
||||
struct tl_combinator;
|
||||
|
||||
struct tl_type {
|
||||
// struct tl_type_methods *methods;
|
||||
char *id;
|
||||
char *print_id;
|
||||
unsigned name;
|
||||
int arity;
|
||||
int flags;
|
||||
int constructors_num;
|
||||
struct tl_combinator **constructors;
|
||||
long long params_types;
|
||||
int extra;
|
||||
};
|
||||
|
||||
#define NODE_TYPE_TYPE 1
|
||||
#define NODE_TYPE_NAT_CONST 2
|
||||
#define NODE_TYPE_VAR_TYPE 3
|
||||
#define NODE_TYPE_VAR_NUM 4
|
||||
#define NODE_TYPE_ARRAY 5
|
||||
|
||||
#define MAX_COMBINATOR_VARS 64
|
||||
|
||||
#define NAME_VAR_NUM 0x70659eff
|
||||
#define NAME_VAR_TYPE 0x2cecf817
|
||||
#define NAME_INT 0xa8509bda
|
||||
#define NAME_LONG 0x22076cba
|
||||
#define NAME_DOUBLE 0x2210c154
|
||||
#define NAME_STRING 0xb5286e24
|
||||
#define NAME_VECTOR 0x1cb5c415
|
||||
#define NAME_MAYBE_TRUE 0x3f9c8ef8
|
||||
#define NAME_MAYBE_FALSE 0x27930a7b
|
||||
#define NAME_BOOL_FALSE 0xbc799737
|
||||
#define NAME_BOOL_TRUE 0x997275b5
|
||||
|
||||
#define FLAG_OPT_VAR (1 << 17)
|
||||
#define FLAG_EXCL (1 << 18)
|
||||
#define FLAG_OPT_FIELD (1 << 20)
|
||||
#define FLAG_NOVAR (1 << 21)
|
||||
#define FLAG_BARE 1
|
||||
#define FLAGS_MASK ((1 << 16) - 1)
|
||||
#define FLAG_DEFAULT_CONSTRUCTOR (1 << 25)
|
||||
#define FLAG_NOCONS (1 << 1)
|
||||
|
||||
extern struct tl_tree_methods tl_nat_const_methods;
|
||||
extern struct tl_tree_methods tl_nat_const_full_methods;
|
||||
extern struct tl_tree_methods tl_pnat_const_full_methods;
|
||||
extern struct tl_tree_methods tl_array_methods;
|
||||
extern struct tl_tree_methods tl_type_methods;
|
||||
extern struct tl_tree_methods tl_parray_methods;
|
||||
extern struct tl_tree_methods tl_ptype_methods;
|
||||
extern struct tl_tree_methods tl_var_num_methods;
|
||||
extern struct tl_tree_methods tl_var_type_methods;
|
||||
extern struct tl_tree_methods tl_pvar_num_methods;
|
||||
extern struct tl_tree_methods tl_pvar_type_methods;
|
||||
#define TL_IS_NAT_VAR(x) (((long)x) & 1)
|
||||
#define TL_TREE_METHODS(x) (TL_IS_NAT_VAR (x) ? &tl_nat_const_methods : ((struct tl_tree *)(x))->methods)
|
||||
|
||||
#define DEC_REF(x) (TL_TREE_METHODS(x)->dec_ref ((void *)x))
|
||||
#define INC_REF(x) (TL_TREE_METHODS(x)->inc_ref ((void *)x))
|
||||
#define TYPE(x) (TL_TREE_METHODS(x)->type ((void *)x))
|
||||
|
||||
typedef unsigned long long tl_tree_hash_t;
|
||||
struct tl_tree;
|
||||
|
||||
struct tl_tree_methods {
|
||||
int (*type)(struct tl_tree *T);
|
||||
int (*eq)(struct tl_tree *T, struct tl_tree *U);
|
||||
void (*inc_ref)(struct tl_tree *T);
|
||||
void (*dec_ref)(struct tl_tree *T);
|
||||
};
|
||||
|
||||
struct tl_tree {
|
||||
int ref_cnt;
|
||||
int flags;
|
||||
//tl_tree_hash_t hash;
|
||||
struct tl_tree_methods *methods;
|
||||
};
|
||||
/*
|
||||
struct tl_tree_nat_const {
|
||||
struct tl_tree self;
|
||||
int value;
|
||||
};*/
|
||||
|
||||
struct tl_tree_type {
|
||||
struct tl_tree self;
|
||||
|
||||
struct tl_type *type;
|
||||
int children_num;
|
||||
struct tl_tree **children;
|
||||
};
|
||||
|
||||
struct tl_tree_array {
|
||||
struct tl_tree self;
|
||||
|
||||
struct tl_tree *multiplicity;
|
||||
int args_num;
|
||||
struct arg **args;
|
||||
};
|
||||
|
||||
struct tl_tree_var_type {
|
||||
struct tl_tree self;
|
||||
|
||||
int var_num;
|
||||
};
|
||||
|
||||
struct tl_tree_var_num {
|
||||
struct tl_tree self;
|
||||
|
||||
int var_num;
|
||||
int dif;
|
||||
};
|
||||
|
||||
struct tl_tree_nat_const {
|
||||
struct tl_tree self;
|
||||
|
||||
long long value;
|
||||
};
|
||||
|
||||
struct arg {
|
||||
char *id;
|
||||
int var_num;
|
||||
int flags;
|
||||
int exist_var_num;
|
||||
int exist_var_bit;
|
||||
struct tl_tree *type;
|
||||
};
|
||||
|
||||
struct tl_combinator {
|
||||
//struct tl_combinator_methods *methods;
|
||||
char *id;
|
||||
char *print_id;
|
||||
unsigned name;
|
||||
int is_fun;
|
||||
int var_num;
|
||||
int args_num;
|
||||
struct arg **args;
|
||||
struct tl_tree *result;
|
||||
void **IP;
|
||||
void **fIP;
|
||||
int IP_len;
|
||||
int fIP_len;
|
||||
};
|
||||
|
||||
#endif
|
24
include.h
24
include.h
@ -1,24 +0,0 @@
|
||||
/*
|
||||
This file is part of telegram-client.
|
||||
|
||||
Telegram-client is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Telegram-client is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this telegram-client. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2013
|
||||
*/
|
||||
#ifndef __INCLUDE_H__
|
||||
#define __INCLUDE_H__
|
||||
|
||||
#define UU __attribute__ ((unused))
|
||||
|
||||
#endif
|
11
interface.c
11
interface.c
@ -38,7 +38,6 @@
|
||||
#endif
|
||||
#include <unistd.h>
|
||||
|
||||
#include "include.h"
|
||||
//#include "queries.h"
|
||||
|
||||
#include "interface.h"
|
||||
@ -62,7 +61,7 @@
|
||||
|
||||
//#include "mtproto-common.h"
|
||||
|
||||
#include "tgl.h"
|
||||
#include <tgl/tgl.h>
|
||||
#include "loop.h"
|
||||
|
||||
#ifndef PATH_MAX
|
||||
@ -496,7 +495,7 @@ char *get_default_prompt (void) {
|
||||
return buf;
|
||||
}
|
||||
|
||||
char *complete_none (const char *text UU, int state UU) {
|
||||
char *complete_none (const char *text, int state) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1371,7 +1370,7 @@ char *command_generator (const char *text, int state) {
|
||||
}
|
||||
}
|
||||
|
||||
char **complete_text (char *text, int start UU, int end UU) {
|
||||
char **complete_text (char *text, int start, int end) {
|
||||
return (char **) rl_completion_matches (text, command_generator);
|
||||
}
|
||||
|
||||
@ -2045,7 +2044,7 @@ struct tgl_update_callback upd_cb = {
|
||||
};
|
||||
|
||||
|
||||
void interpreter_ex (char *line UU, void *ex) {
|
||||
void interpreter_ex (char *line, void *ex) {
|
||||
force_end_mode = 1;
|
||||
assert (!in_readline);
|
||||
in_readline = 1;
|
||||
@ -2279,7 +2278,7 @@ void interpreter_ex (char *line UU, void *ex) {
|
||||
in_readline = 0;
|
||||
}
|
||||
|
||||
void interpreter (char *line UU) {
|
||||
void interpreter (char *line) {
|
||||
interpreter_ex (line, 0);
|
||||
}
|
||||
|
||||
|
@ -18,8 +18,8 @@
|
||||
*/
|
||||
#ifndef __INTERFACE_H__
|
||||
#define __INTERFACE_H__
|
||||
#include "structures.h"
|
||||
#include "tgl-layout.h"
|
||||
#include <tgl/tgl-structures.h>
|
||||
#include <tgl/tgl-layout.h>
|
||||
|
||||
#define COLOR_RED "\033[0;31m"
|
||||
#define COLOR_REDB "\033[1;31m"
|
||||
|
9
loop.c
9
loop.c
@ -57,10 +57,10 @@
|
||||
#include "telegram.h"
|
||||
#include "loop.h"
|
||||
#include "lua-tg.h"
|
||||
#include "tgl.h"
|
||||
#include "binlog.h"
|
||||
#include "net.h"
|
||||
#include "tgl-timers.h"
|
||||
#include <tgl/tgl.h>
|
||||
#include <tgl/tgl-binlog.h>
|
||||
#include <tgl/tgl-net.h>
|
||||
#include <tgl/tgl-timers.h>
|
||||
|
||||
int verbosity;
|
||||
extern int readline_disabled;
|
||||
@ -708,6 +708,7 @@ int loop (void) {
|
||||
tgl_set_ev_base (TLS, ev);
|
||||
tgl_set_net_methods (TLS, &tgl_conn_methods);
|
||||
tgl_set_timer_methods (TLS, &tgl_libevent_timers);
|
||||
assert (TLS->timer_methods);
|
||||
tgl_set_download_directory (TLS, get_downloads_directory ());
|
||||
tgl_init (TLS);
|
||||
|
||||
|
9
lua-tg.c
9
lua-tg.c
@ -24,7 +24,6 @@
|
||||
#ifdef USE_LUA
|
||||
#include "lua-tg.h"
|
||||
|
||||
#include "include.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@ -42,7 +41,7 @@ lua_State *luaState;
|
||||
|
||||
//#include "interface.h"
|
||||
//#include "auto/constants.h"
|
||||
#include "tgl.h"
|
||||
#include <tgl/tgl.h>
|
||||
#include "interface.h"
|
||||
|
||||
#include <assert.h>
|
||||
@ -52,7 +51,7 @@ extern struct tgl_state *TLS;
|
||||
static int have_file;
|
||||
|
||||
#define my_lua_checkstack(L,x) assert (lua_checkstack (L, x))
|
||||
void push_user (tgl_peer_t *P UU);
|
||||
void push_user (tgl_peer_t *P);
|
||||
void push_peer (tgl_peer_id_t id, tgl_peer_t *P);
|
||||
|
||||
void lua_add_string_field (const char *name, const char *value) {
|
||||
@ -96,7 +95,7 @@ void push_tgl_peer_type (int x) {
|
||||
}
|
||||
}
|
||||
|
||||
void push_user (tgl_peer_t *P UU) {
|
||||
void push_user (tgl_peer_t *P) {
|
||||
my_lua_checkstack (luaState, 4);
|
||||
lua_add_string_field ("first_name", P->user.first_name);
|
||||
lua_add_string_field ("last_name", P->user.last_name);
|
||||
@ -387,7 +386,7 @@ void lua_our_id (int id) {
|
||||
}
|
||||
}
|
||||
|
||||
void lua_new_msg (struct tgl_message *M UU) {
|
||||
void lua_new_msg (struct tgl_message *M) {
|
||||
if (!have_file) { return; }
|
||||
lua_settop (luaState, 0);
|
||||
//lua_checkstack (luaState, 20);
|
||||
|
3
lua-tg.h
3
lua-tg.h
@ -20,8 +20,7 @@
|
||||
#define __LUA_TG_H__
|
||||
|
||||
#include <string.h>
|
||||
#include "lua-tg.h"
|
||||
#include "tgl.h"
|
||||
#include <tgl/tgl.h>
|
||||
|
||||
void lua_init (const char *file);
|
||||
void lua_new_msg (struct tgl_message *M);
|
||||
|
4
main.c
4
main.c
@ -64,13 +64,13 @@
|
||||
#include "telegram.h"
|
||||
#include "loop.h"
|
||||
#include "interface.h"
|
||||
#include "tools.h"
|
||||
#include <tgl/tools.h>
|
||||
|
||||
#ifdef USE_LUA
|
||||
# include "lua-tg.h"
|
||||
#endif
|
||||
|
||||
#include "tgl.h"
|
||||
#include <tgl/tgl.h>
|
||||
|
||||
#define PROGNAME "telegram-cli"
|
||||
#define VERSION "0.07"
|
||||
|
1462
mtproto-client.c
1462
mtproto-client.c
File diff suppressed because it is too large
Load Diff
@ -1,60 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Nikolay Durov, Andrey Lopatin 2012-2013
|
||||
Vitaly Valtman 2013-2014
|
||||
*/
|
||||
#ifndef __MTPROTO_CLIENT_H__
|
||||
#define __MTPROTO_CLIENT_H__
|
||||
//#include "net.h"
|
||||
#include <openssl/bn.h>
|
||||
//void on_start (void);
|
||||
//..long long encrypt_send_message (struct connection *c, int *msg, int msg_ints, int useful);
|
||||
//void dc_authorize (struct tgl_dc *DC);
|
||||
//void work_update (struct connection *c, long long msg_id);
|
||||
//void work_update_binlog (void);
|
||||
//int check_g (unsigned char p[256], BIGNUM *g);
|
||||
//int check_g_bn (BIGNUM *p, BIGNUM *g);
|
||||
//int check_DH_params (BIGNUM *p, int g);
|
||||
//void secure_random (void *s, int l);
|
||||
|
||||
#include "tgl.h"
|
||||
|
||||
struct connection;
|
||||
struct tgl_dc;
|
||||
//#include "queries.h"
|
||||
#define TG_APP_HASH "36722c72256a24c1225de00eb6a1ca74"
|
||||
#define TG_APP_ID 2899
|
||||
|
||||
#define ACK_TIMEOUT 1
|
||||
#define MAX_DC_ID 10
|
||||
|
||||
struct connection;
|
||||
|
||||
long long tglmp_encrypt_send_message (struct tgl_state *TLS, struct connection *c, int *msg, int msg_ints, int flags);
|
||||
void tglmp_dc_create_session (struct tgl_state *TLS, struct tgl_dc *DC);
|
||||
int tglmp_check_g (struct tgl_state *TLS, unsigned char p[256], BIGNUM *g);
|
||||
int tglmp_check_DH_params (struct tgl_state *TLS, BIGNUM *p, int g);
|
||||
struct tgl_dc *tglmp_alloc_dc (struct tgl_state *TLS, int id, char *ip, int port);
|
||||
void tglmp_regenerate_temp_auth_key (struct tgl_state *TLS, struct tgl_dc *D);
|
||||
|
||||
void tgln_insert_msg_id (struct tgl_state *TLS, struct tgl_session *S, long long id);
|
||||
void tglmp_on_start (struct tgl_state *TLS);
|
||||
void tgl_dc_authorize (struct tgl_state *TLS, struct tgl_dc *DC);
|
||||
void tgls_free_dc (struct tgl_state *TLS, struct tgl_dc *DC);
|
||||
void tgls_free_pubkey (struct tgl_state *TLS);
|
||||
#endif
|
394
mtproto-common.c
394
mtproto-common.c
@ -1,394 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Nikolay Durov, Andrey Lopatin 2012-2013
|
||||
Vitaly Valtman 2013-2014
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/rand.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/aes.h>
|
||||
#include <openssl/sha.h>
|
||||
|
||||
#include "mtproto-common.h"
|
||||
#include "include.h"
|
||||
#include "tools.h"
|
||||
|
||||
#ifdef __MACH__
|
||||
#include <mach/clock.h>
|
||||
#include <mach/mach.h>
|
||||
#endif
|
||||
|
||||
|
||||
static int __packet_buffer[PACKET_BUFFER_SIZE + 16];
|
||||
int *tgl_packet_ptr;
|
||||
int *tgl_packet_buffer = __packet_buffer + 16;
|
||||
|
||||
static long long rsa_encrypted_chunks, rsa_decrypted_chunks;
|
||||
|
||||
//int verbosity;
|
||||
|
||||
static int get_random_bytes (struct tgl_state *TLS, unsigned char *buf, int n) {
|
||||
int r = 0, h = open ("/dev/random", O_RDONLY | O_NONBLOCK);
|
||||
if (h >= 0) {
|
||||
r = read (h, buf, n);
|
||||
if (r > 0) {
|
||||
vlogprintf (E_DEBUG, "added %d bytes of real entropy to secure random numbers seed\n", r);
|
||||
} else {
|
||||
r = 0;
|
||||
}
|
||||
close (h);
|
||||
}
|
||||
|
||||
if (r < n) {
|
||||
h = open ("/dev/urandom", O_RDONLY);
|
||||
if (h < 0) {
|
||||
return r;
|
||||
}
|
||||
int s = read (h, buf + r, n - r);
|
||||
close (h);
|
||||
if (s > 0) {
|
||||
r += s;
|
||||
}
|
||||
}
|
||||
|
||||
if (r >= (int) sizeof (long)) {
|
||||
*(long *)buf ^= lrand48 ();
|
||||
srand48 (*(long *)buf);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
/* RDTSC */
|
||||
#if defined(__i386__)
|
||||
#define HAVE_RDTSC
|
||||
static __inline__ unsigned long long rdtsc (void) {
|
||||
unsigned long long int x;
|
||||
__asm__ volatile ("rdtsc" : "=A" (x));
|
||||
return x;
|
||||
}
|
||||
#elif defined(__x86_64__)
|
||||
#define HAVE_RDTSC
|
||||
static __inline__ unsigned long long rdtsc (void) {
|
||||
unsigned hi, lo;
|
||||
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
|
||||
return ((unsigned long long) lo) | (((unsigned long long) hi) << 32);
|
||||
}
|
||||
#endif
|
||||
|
||||
void tgl_prng_seed (struct tgl_state *TLS, const char *password_filename, int password_length) {
|
||||
struct timespec T;
|
||||
tgl_my_clock_gettime (CLOCK_REALTIME, &T);
|
||||
RAND_add (&T, sizeof (T), 4.0);
|
||||
#ifdef HAVE_RDTSC
|
||||
unsigned long long r = rdtsc ();
|
||||
RAND_add (&r, 8, 4.0);
|
||||
#endif
|
||||
unsigned short p = getpid ();
|
||||
RAND_add (&p, sizeof (p), 0.0);
|
||||
p = getppid ();
|
||||
RAND_add (&p, sizeof (p), 0.0);
|
||||
unsigned char rb[32];
|
||||
int s = get_random_bytes (TLS, rb, 32);
|
||||
if (s > 0) {
|
||||
RAND_add (rb, s, s);
|
||||
}
|
||||
memset (rb, 0, sizeof (rb));
|
||||
if (password_filename && password_length > 0) {
|
||||
int fd = open (password_filename, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
vlogprintf (E_WARNING, "Warning: fail to open password file - \"%s\", %m.\n", password_filename);
|
||||
} else {
|
||||
unsigned char *a = talloc0 (password_length);
|
||||
int l = read (fd, a, password_length);
|
||||
if (l < 0) {
|
||||
vlogprintf (E_WARNING, "Warning: fail to read password file - \"%s\", %m.\n", password_filename);
|
||||
} else {
|
||||
vlogprintf (E_DEBUG, "read %d bytes from password file.\n", l);
|
||||
RAND_add (a, l, l);
|
||||
}
|
||||
close (fd);
|
||||
tfree_secure (a, password_length);
|
||||
}
|
||||
}
|
||||
TLS->BN_ctx = BN_CTX_new ();
|
||||
ensure_ptr (TLS->BN_ctx);
|
||||
}
|
||||
|
||||
int tgl_serialize_bignum (BIGNUM *b, char *buffer, int maxlen) {
|
||||
int itslen = BN_num_bytes (b);
|
||||
int reqlen;
|
||||
if (itslen < 254) {
|
||||
reqlen = itslen + 1;
|
||||
} else {
|
||||
reqlen = itslen + 4;
|
||||
}
|
||||
int newlen = (reqlen + 3) & -4;
|
||||
int pad = newlen - reqlen;
|
||||
reqlen = newlen;
|
||||
if (reqlen > maxlen) {
|
||||
return -reqlen;
|
||||
}
|
||||
if (itslen < 254) {
|
||||
*buffer++ = itslen;
|
||||
} else {
|
||||
*(int *)buffer = (itslen << 8) + 0xfe;
|
||||
buffer += 4;
|
||||
}
|
||||
int l = BN_bn2bin (b, (unsigned char *)buffer);
|
||||
assert (l == itslen);
|
||||
buffer += l;
|
||||
while (pad --> 0) {
|
||||
*buffer++ = 0;
|
||||
}
|
||||
return reqlen;
|
||||
}
|
||||
|
||||
|
||||
long long tgl_do_compute_rsa_key_fingerprint (RSA *key) {
|
||||
static char tempbuff[4096];
|
||||
static unsigned char sha[20];
|
||||
assert (key->n && key->e);
|
||||
int l1 = tgl_serialize_bignum (key->n, tempbuff, 4096);
|
||||
assert (l1 > 0);
|
||||
int l2 = tgl_serialize_bignum (key->e, tempbuff + l1, 4096 - l1);
|
||||
assert (l2 > 0 && l1 + l2 <= 4096);
|
||||
SHA1 ((unsigned char *)tempbuff, l1 + l2, sha);
|
||||
return *(long long *)(sha + 12);
|
||||
}
|
||||
|
||||
void tgl_out_cstring (const char *str, long len) {
|
||||
assert (len >= 0 && len < (1 << 24));
|
||||
assert ((char *) packet_ptr + len + 8 < (char *) (packet_buffer + PACKET_BUFFER_SIZE));
|
||||
char *dest = (char *) packet_ptr;
|
||||
if (len < 254) {
|
||||
*dest++ = len;
|
||||
} else {
|
||||
*packet_ptr = (len << 8) + 0xfe;
|
||||
dest += 4;
|
||||
}
|
||||
memcpy (dest, str, len);
|
||||
dest += len;
|
||||
while ((long) dest & 3) {
|
||||
*dest++ = 0;
|
||||
}
|
||||
packet_ptr = (int *) dest;
|
||||
}
|
||||
|
||||
void tgl_out_cstring_careful (const char *str, long len) {
|
||||
assert (len >= 0 && len < (1 << 24));
|
||||
assert ((char *) packet_ptr + len + 8 < (char *) (packet_buffer + PACKET_BUFFER_SIZE));
|
||||
char *dest = (char *) packet_ptr;
|
||||
if (len < 254) {
|
||||
dest++;
|
||||
if (dest != str) {
|
||||
memmove (dest, str, len);
|
||||
}
|
||||
dest[-1] = len;
|
||||
} else {
|
||||
dest += 4;
|
||||
if (dest != str) {
|
||||
memmove (dest, str, len);
|
||||
}
|
||||
*packet_ptr = (len << 8) + 0xfe;
|
||||
}
|
||||
dest += len;
|
||||
while ((long) dest & 3) {
|
||||
*dest++ = 0;
|
||||
}
|
||||
packet_ptr = (int *) dest;
|
||||
}
|
||||
|
||||
|
||||
void tgl_out_data (const void *data, long len) {
|
||||
assert (len >= 0 && len < (1 << 24) && !(len & 3));
|
||||
assert ((char *) packet_ptr + len + 8 < (char *) (packet_buffer + PACKET_BUFFER_SIZE));
|
||||
memcpy (packet_ptr, data, len);
|
||||
packet_ptr += len >> 2;
|
||||
}
|
||||
|
||||
int *tgl_in_ptr, *tgl_in_end;
|
||||
|
||||
int tgl_fetch_bignum (BIGNUM *x) {
|
||||
int l = prefetch_strlen ();
|
||||
if (l < 0) {
|
||||
return l;
|
||||
}
|
||||
char *str = fetch_str (l);
|
||||
assert (BN_bin2bn ((unsigned char *) str, l, x) == x);
|
||||
return l;
|
||||
}
|
||||
|
||||
int tgl_pad_rsa_encrypt (struct tgl_state *TLS, char *from, int from_len, char *to, int size, BIGNUM *N, BIGNUM *E) {
|
||||
int pad = (255000 - from_len - 32) % 255 + 32;
|
||||
int chunks = (from_len + pad) / 255;
|
||||
int bits = BN_num_bits (N);
|
||||
assert (bits >= 2041 && bits <= 2048);
|
||||
assert (from_len > 0 && from_len <= 2550);
|
||||
assert (size >= chunks * 256);
|
||||
assert (RAND_pseudo_bytes ((unsigned char *) from + from_len, pad) >= 0);
|
||||
int i;
|
||||
BIGNUM x, y;
|
||||
BN_init (&x);
|
||||
BN_init (&y);
|
||||
rsa_encrypted_chunks += chunks;
|
||||
for (i = 0; i < chunks; i++) {
|
||||
BN_bin2bn ((unsigned char *) from, 255, &x);
|
||||
assert (BN_mod_exp (&y, &x, E, N, TLS->BN_ctx) == 1);
|
||||
unsigned l = 256 - BN_num_bytes (&y);
|
||||
assert (l <= 256);
|
||||
memset (to, 0, l);
|
||||
BN_bn2bin (&y, (unsigned char *) to + l);
|
||||
to += 256;
|
||||
}
|
||||
BN_free (&x);
|
||||
BN_free (&y);
|
||||
return chunks * 256;
|
||||
}
|
||||
|
||||
int tgl_pad_rsa_decrypt (struct tgl_state *TLS, char *from, int from_len, char *to, int size, BIGNUM *N, BIGNUM *D) {
|
||||
if (from_len < 0 || from_len > 0x1000 || (from_len & 0xff)) {
|
||||
return -1;
|
||||
}
|
||||
int chunks = (from_len >> 8);
|
||||
int bits = BN_num_bits (N);
|
||||
assert (bits >= 2041 && bits <= 2048);
|
||||
assert (size >= chunks * 255);
|
||||
int i;
|
||||
BIGNUM x, y;
|
||||
BN_init (&x);
|
||||
BN_init (&y);
|
||||
for (i = 0; i < chunks; i++) {
|
||||
++rsa_decrypted_chunks;
|
||||
BN_bin2bn ((unsigned char *) from, 256, &x);
|
||||
assert (BN_mod_exp (&y, &x, D, N, TLS->BN_ctx) == 1);
|
||||
int l = BN_num_bytes (&y);
|
||||
if (l > 255) {
|
||||
BN_free (&x);
|
||||
BN_free (&y);
|
||||
return -1;
|
||||
}
|
||||
assert (l >= 0 && l <= 255);
|
||||
memset (to, 0, 255 - l);
|
||||
BN_bn2bin (&y, (unsigned char *) to + 255 - l);
|
||||
to += 255;
|
||||
}
|
||||
BN_free (&x);
|
||||
BN_free (&y);
|
||||
return chunks * 255;
|
||||
}
|
||||
|
||||
static unsigned char aes_key_raw[32], aes_iv[32];
|
||||
static AES_KEY aes_key;
|
||||
|
||||
void tgl_init_aes_unauth (const char server_nonce[16], const char hidden_client_nonce[32], int encrypt) {
|
||||
static unsigned char buffer[64], hash[20];
|
||||
memcpy (buffer, hidden_client_nonce, 32);
|
||||
memcpy (buffer + 32, server_nonce, 16);
|
||||
SHA1 (buffer, 48, aes_key_raw);
|
||||
memcpy (buffer + 32, hidden_client_nonce, 32);
|
||||
SHA1 (buffer, 64, aes_iv + 8);
|
||||
memcpy (buffer, server_nonce, 16);
|
||||
memcpy (buffer + 16, hidden_client_nonce, 32);
|
||||
SHA1 (buffer, 48, hash);
|
||||
memcpy (aes_key_raw + 20, hash, 12);
|
||||
memcpy (aes_iv, hash + 12, 8);
|
||||
memcpy (aes_iv + 28, hidden_client_nonce, 4);
|
||||
if (encrypt == AES_ENCRYPT) {
|
||||
AES_set_encrypt_key (aes_key_raw, 32*8, &aes_key);
|
||||
} else {
|
||||
AES_set_decrypt_key (aes_key_raw, 32*8, &aes_key);
|
||||
}
|
||||
memset (aes_key_raw, 0, sizeof (aes_key_raw));
|
||||
}
|
||||
|
||||
void tgl_init_aes_auth (char auth_key[192], char msg_key[16], int encrypt) {
|
||||
static unsigned char buffer[48], hash[20];
|
||||
// sha1_a = SHA1 (msg_key + substr (auth_key, 0, 32));
|
||||
// sha1_b = SHA1 (substr (auth_key, 32, 16) + msg_key + substr (auth_key, 48, 16));
|
||||
// sha1_с = SHA1 (substr (auth_key, 64, 32) + msg_key);
|
||||
// sha1_d = SHA1 (msg_key + substr (auth_key, 96, 32));
|
||||
// aes_key = substr (sha1_a, 0, 8) + substr (sha1_b, 8, 12) + substr (sha1_c, 4, 12);
|
||||
// aes_iv = substr (sha1_a, 8, 12) + substr (sha1_b, 0, 8) + substr (sha1_c, 16, 4) + substr (sha1_d, 0, 8);
|
||||
memcpy (buffer, msg_key, 16);
|
||||
memcpy (buffer + 16, auth_key, 32);
|
||||
SHA1 (buffer, 48, hash);
|
||||
memcpy (aes_key_raw, hash, 8);
|
||||
memcpy (aes_iv, hash + 8, 12);
|
||||
|
||||
memcpy (buffer, auth_key + 32, 16);
|
||||
memcpy (buffer + 16, msg_key, 16);
|
||||
memcpy (buffer + 32, auth_key + 48, 16);
|
||||
SHA1 (buffer, 48, hash);
|
||||
memcpy (aes_key_raw + 8, hash + 8, 12);
|
||||
memcpy (aes_iv + 12, hash, 8);
|
||||
|
||||
memcpy (buffer, auth_key + 64, 32);
|
||||
memcpy (buffer + 32, msg_key, 16);
|
||||
SHA1 (buffer, 48, hash);
|
||||
memcpy (aes_key_raw + 20, hash + 4, 12);
|
||||
memcpy (aes_iv + 20, hash + 16, 4);
|
||||
|
||||
memcpy (buffer, msg_key, 16);
|
||||
memcpy (buffer + 16, auth_key + 96, 32);
|
||||
SHA1 (buffer, 48, hash);
|
||||
memcpy (aes_iv + 24, hash, 8);
|
||||
|
||||
if (encrypt == AES_ENCRYPT) {
|
||||
AES_set_encrypt_key (aes_key_raw, 32*8, &aes_key);
|
||||
} else {
|
||||
AES_set_decrypt_key (aes_key_raw, 32*8, &aes_key);
|
||||
}
|
||||
memset (aes_key_raw, 0, sizeof (aes_key_raw));
|
||||
}
|
||||
|
||||
int tgl_pad_aes_encrypt (char *from, int from_len, char *to, int size) {
|
||||
int padded_size = (from_len + 15) & -16;
|
||||
assert (from_len > 0 && padded_size <= size);
|
||||
if (from_len < padded_size) {
|
||||
assert (RAND_pseudo_bytes ((unsigned char *) from + from_len, padded_size - from_len) >= 0);
|
||||
}
|
||||
AES_ige_encrypt ((unsigned char *) from, (unsigned char *) to, padded_size, &aes_key, aes_iv, AES_ENCRYPT);
|
||||
return padded_size;
|
||||
}
|
||||
|
||||
int tgl_pad_aes_decrypt (char *from, int from_len, char *to, int size) {
|
||||
if (from_len <= 0 || from_len > size || (from_len & 15)) {
|
||||
return -1;
|
||||
}
|
||||
AES_ige_encrypt ((unsigned char *) from, (unsigned char *) to, from_len, &aes_key, aes_iv, AES_DECRYPT);
|
||||
return from_len;
|
||||
}
|
||||
|
||||
|
384
mtproto-common.h
384
mtproto-common.h
@ -1,384 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Nikolay Durov, Andrey Lopatin 2012-2013
|
||||
Vitaly Valtman 2013-2014
|
||||
*/
|
||||
#ifndef __MTPROTO_COMMON_H__
|
||||
#define __MTPROTO_COMMON_H__
|
||||
|
||||
#include <string.h>
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/aes.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
//#include "interface.h"
|
||||
#include "tools.h"
|
||||
#include "auto/constants.h"
|
||||
|
||||
#include "tgl.h"
|
||||
#include "tgl-inner.h"
|
||||
/* DH key exchange protocol data structures */
|
||||
#define CODE_req_pq 0x60469778
|
||||
#define CODE_resPQ 0x05162463
|
||||
#define CODE_req_DH_params 0xd712e4be
|
||||
#define CODE_p_q_inner_data 0x83c95aec
|
||||
#define CODE_p_q_inner_data_temp 0x3c6a84d4
|
||||
#define CODE_server_DH_inner_data 0xb5890dba
|
||||
#define CODE_server_DH_params_fail 0x79cb045d
|
||||
#define CODE_server_DH_params_ok 0xd0e8075c
|
||||
#define CODE_set_client_DH_params 0xf5045f1f
|
||||
#define CODE_client_DH_inner_data 0x6643b654
|
||||
#define CODE_dh_gen_ok 0x3bcbf734
|
||||
#define CODE_dh_gen_retry 0x46dc1fb9
|
||||
#define CODE_dh_gen_fail 0xa69dae02
|
||||
|
||||
#define CODE_bind_auth_key_inner 0x75a3f765
|
||||
|
||||
/* service messages */
|
||||
#define CODE_rpc_result 0xf35c6d01
|
||||
#define CODE_rpc_error 0x2144ca19
|
||||
#define CODE_msg_container 0x73f1f8dc
|
||||
#define CODE_msg_copy 0xe06046b2
|
||||
#define CODE_msgs_ack 0x62d6b459
|
||||
#define CODE_bad_msg_notification 0xa7eff811
|
||||
#define CODE_bad_server_salt 0xedab447b
|
||||
#define CODE_msgs_state_req 0xda69fb52
|
||||
#define CODE_msgs_state_info 0x04deb57d
|
||||
#define CODE_msgs_all_info 0x8cc0d131
|
||||
#define CODE_new_session_created 0x9ec20908
|
||||
#define CODE_msg_resend_req 0x7d861a08
|
||||
#define CODE_ping 0x7abe77ec
|
||||
#define CODE_pong 0x347773c5
|
||||
#define CODE_destroy_session 0xe7512126
|
||||
#define CODE_destroy_session_ok 0xe22045fc
|
||||
#define CODE_destroy_session_none 0x62d350c9
|
||||
#define CODE_destroy_sessions 0x9a6face8
|
||||
#define CODE_destroy_sessions_res 0xa8164668
|
||||
#define CODE_get_future_salts 0xb921bd04
|
||||
#define CODE_future_salt 0x0949d9dc
|
||||
#define CODE_future_salts 0xae500895
|
||||
#define CODE_rpc_drop_answer 0x58e4a740
|
||||
#define CODE_rpc_answer_unknown 0x5e2ad36e
|
||||
#define CODE_rpc_answer_dropped_running 0xcd78e586
|
||||
#define CODE_rpc_answer_dropped 0xa43ad8b7
|
||||
#define CODE_msg_detailed_info 0x276d3ec6
|
||||
#define CODE_msg_new_detailed_info 0x809db6df
|
||||
#define CODE_ping_delay_disconnect 0xf3427b8c
|
||||
#define CODE_gzip_packed 0x3072cfa1
|
||||
|
||||
#define CODE_input_peer_notify_settings_old 0x3cf4b1be
|
||||
#define CODE_peer_notify_settings_old 0xddbcd4a5
|
||||
#define CODE_user_profile_photo_old 0x990d1493
|
||||
#define CODE_config_old 0x232d5905
|
||||
|
||||
#define CODE_msg_new_detailed_info 0x809db6df
|
||||
|
||||
#define CODE_msg_detailed_info 0x276d3ec6
|
||||
/* not really a limit, for struct encrypted_message only */
|
||||
// #define MAX_MESSAGE_INTS 16384
|
||||
#define MAX_MESSAGE_INTS 1048576
|
||||
#define MAX_PROTO_MESSAGE_INTS 1048576
|
||||
|
||||
#define PACKET_BUFFER_SIZE (16384 * 100 + 16) // temp fix
|
||||
#pragma pack(push,4)
|
||||
struct encrypted_message {
|
||||
// unencrypted header
|
||||
long long auth_key_id;
|
||||
char msg_key[16];
|
||||
// encrypted part, starts with encrypted header
|
||||
long long server_salt;
|
||||
long long session_id;
|
||||
// long long auth_key_id2; // removed
|
||||
// first message follows
|
||||
long long msg_id;
|
||||
int seq_no;
|
||||
int msg_len; // divisible by 4
|
||||
int message[MAX_MESSAGE_INTS];
|
||||
};
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
//BN_CTX *BN_ctx;
|
||||
|
||||
void tgl_prng_seed (struct tgl_state *TLS, const char *password_filename, int password_length);
|
||||
int tgl_serialize_bignum (BIGNUM *b, char *buffer, int maxlen);
|
||||
long long tgl_do_compute_rsa_key_fingerprint (RSA *key);
|
||||
|
||||
#define packet_buffer tgl_packet_buffer
|
||||
#define packet_ptr tgl_packet_ptr
|
||||
|
||||
extern int *tgl_packet_buffer;
|
||||
extern int *tgl_packet_ptr;
|
||||
|
||||
static inline void out_ints (const int *what, int len) {
|
||||
assert (packet_ptr + len <= packet_buffer + PACKET_BUFFER_SIZE);
|
||||
memcpy (packet_ptr, what, len * 4);
|
||||
packet_ptr += len;
|
||||
}
|
||||
|
||||
|
||||
static inline void out_int (int x) {
|
||||
assert (packet_ptr + 1 <= packet_buffer + PACKET_BUFFER_SIZE);
|
||||
*packet_ptr++ = x;
|
||||
}
|
||||
|
||||
|
||||
static inline void out_long (long long x) {
|
||||
assert (packet_ptr + 2 <= packet_buffer + PACKET_BUFFER_SIZE);
|
||||
*(long long *)packet_ptr = x;
|
||||
packet_ptr += 2;
|
||||
}
|
||||
|
||||
static inline void out_double (double x) {
|
||||
assert (packet_ptr + 2 <= packet_buffer + PACKET_BUFFER_SIZE);
|
||||
*(double *)packet_ptr = x;
|
||||
packet_ptr += 2;
|
||||
}
|
||||
|
||||
static inline void clear_packet (void) {
|
||||
packet_ptr = packet_buffer;
|
||||
}
|
||||
|
||||
void tgl_out_cstring (const char *str, long len);
|
||||
void tgl_out_cstring_careful (const char *str, long len);
|
||||
void tgl_out_data (const void *data, long len);
|
||||
|
||||
#define out_cstring tgl_out_cstring
|
||||
#define out_cstring_careful tgl_out_cstring_careful
|
||||
#define out_data tgl_out_data
|
||||
|
||||
static inline void out_string (const char *str) {
|
||||
out_cstring (str, strlen (str));
|
||||
}
|
||||
|
||||
static inline void out_bignum (BIGNUM *n) {
|
||||
int l = tgl_serialize_bignum (n, (char *)packet_ptr, (PACKET_BUFFER_SIZE - (packet_ptr - packet_buffer)) * 4);
|
||||
assert (l > 0);
|
||||
packet_ptr += l >> 2;
|
||||
}
|
||||
|
||||
#define in_ptr tgl_in_ptr
|
||||
#define in_end tgl_in_end
|
||||
extern int *tgl_in_ptr, *tgl_in_end;
|
||||
|
||||
|
||||
//void fetch_pts (void);
|
||||
//void fetch_qts (void);
|
||||
//void fetch_date (void);
|
||||
//void fetch_seq (void);
|
||||
static inline int prefetch_strlen (void) {
|
||||
if (in_ptr >= in_end) {
|
||||
return -1;
|
||||
}
|
||||
unsigned l = *in_ptr;
|
||||
if ((l & 0xff) < 0xfe) {
|
||||
l &= 0xff;
|
||||
return (in_end >= in_ptr + (l >> 2) + 1) ? (int)l : -1;
|
||||
} else if ((l & 0xff) == 0xfe) {
|
||||
l >>= 8;
|
||||
return (l >= 254 && in_end >= in_ptr + ((l + 7) >> 2)) ? (int)l : -1;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static inline char *fetch_str (int len) {
|
||||
assert (len >= 0);
|
||||
if (len < 254) {
|
||||
char *str = (char *) in_ptr + 1;
|
||||
in_ptr += 1 + (len >> 2);
|
||||
return str;
|
||||
} else {
|
||||
char *str = (char *) in_ptr + 4;
|
||||
in_ptr += (len + 7) >> 2;
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
static inline char *fetch_str_dup (void) {
|
||||
int l = prefetch_strlen ();
|
||||
assert (l >= 0);
|
||||
int i;
|
||||
char *s = fetch_str (l);
|
||||
for (i = 0; i < l; i++) {
|
||||
if (!s[i]) { break; }
|
||||
}
|
||||
char *r = talloc (i + 1);
|
||||
memcpy (r, s, i);
|
||||
r[i] = 0;
|
||||
return r;
|
||||
}
|
||||
|
||||
static inline int fetch_update_str (char **s) {
|
||||
if (!*s) {
|
||||
*s = fetch_str_dup ();
|
||||
return 1;
|
||||
}
|
||||
int l = prefetch_strlen ();
|
||||
char *r = fetch_str (l);
|
||||
if (memcmp (*s, r, l) || (*s)[l]) {
|
||||
tfree_str (*s);
|
||||
*s = talloc (l + 1);
|
||||
memcpy (*s, r, l);
|
||||
(*s)[l] = 0;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int fetch_update_int (int *value) {
|
||||
if (*value == *in_ptr) {
|
||||
in_ptr ++;
|
||||
return 0;
|
||||
} else {
|
||||
*value = *(in_ptr ++);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int fetch_update_long (long long *value) {
|
||||
if (*value == *(long long *)in_ptr) {
|
||||
in_ptr += 2;
|
||||
return 0;
|
||||
} else {
|
||||
*value = *(long long *)(in_ptr);
|
||||
in_ptr += 2;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int set_update_int (int *value, int new_value) {
|
||||
if (*value == new_value) {
|
||||
return 0;
|
||||
} else {
|
||||
*value = new_value;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void fetch_skip (int n) {
|
||||
in_ptr += n;
|
||||
assert (in_ptr <= in_end);
|
||||
}
|
||||
|
||||
static inline void fetch_skip_str (void) {
|
||||
int l = prefetch_strlen ();
|
||||
assert (l >= 0);
|
||||
fetch_str (l);
|
||||
}
|
||||
|
||||
static inline long have_prefetch_ints (void) {
|
||||
return in_end - in_ptr;
|
||||
}
|
||||
|
||||
int tgl_fetch_bignum (BIGNUM *x);
|
||||
#define fetch_bignum tgl_fetch_bignum
|
||||
|
||||
static inline int fetch_int (void) {
|
||||
assert (in_ptr + 1 <= in_end);
|
||||
return *(in_ptr ++);
|
||||
}
|
||||
|
||||
static inline int fetch_bool (void) {
|
||||
assert (in_ptr + 1 <= in_end);
|
||||
assert (*(in_ptr) == (int)CODE_bool_true || *(in_ptr) == (int)CODE_bool_false);
|
||||
return *(in_ptr ++) == (int)CODE_bool_true;
|
||||
}
|
||||
|
||||
static inline int prefetch_int (void) {
|
||||
assert (in_ptr < in_end);
|
||||
return *(in_ptr);
|
||||
}
|
||||
|
||||
static inline void prefetch_data (void *data, int size) {
|
||||
assert (in_ptr + (size >> 2) <= in_end);
|
||||
memcpy (data, in_ptr, size);
|
||||
}
|
||||
|
||||
static inline void fetch_data (void *data, int size) {
|
||||
assert (in_ptr + (size >> 2) <= in_end);
|
||||
memcpy (data, in_ptr, size);
|
||||
assert (!(size & 3));
|
||||
in_ptr += (size >> 2);
|
||||
}
|
||||
|
||||
static inline long long fetch_long (void) {
|
||||
assert (in_ptr + 2 <= in_end);
|
||||
long long r = *(long long *)in_ptr;
|
||||
in_ptr += 2;
|
||||
return r;
|
||||
}
|
||||
|
||||
static inline double fetch_double (void) {
|
||||
assert (in_ptr + 2 <= in_end);
|
||||
double r = *(double *)in_ptr;
|
||||
in_ptr += 2;
|
||||
return r;
|
||||
}
|
||||
|
||||
static inline void fetch_ints (void *data, int count) {
|
||||
assert (in_ptr + count <= in_end);
|
||||
memcpy (data, in_ptr, 4 * count);
|
||||
in_ptr += count;
|
||||
}
|
||||
|
||||
static inline void fetch256 (void *buf) {
|
||||
int l = prefetch_strlen ();
|
||||
assert (l >= 0);
|
||||
char *s = fetch_str (l);
|
||||
if (l < 256) {
|
||||
memcpy (buf + 256 - l, s, l);
|
||||
} else {
|
||||
memcpy (buf, s + (l - 256), 256);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int in_remaining (void) {
|
||||
return 4 * (in_end - in_ptr);
|
||||
}
|
||||
|
||||
//int get_random_bytes (unsigned char *buf, int n);
|
||||
|
||||
int tgl_pad_rsa_encrypt (struct tgl_state *TLS, char *from, int from_len, char *to, int size, BIGNUM *N, BIGNUM *E);
|
||||
int tgl_pad_rsa_decrypt (struct tgl_state *TLS, char *from, int from_len, char *to, int size, BIGNUM *N, BIGNUM *D);
|
||||
|
||||
//extern long long rsa_encrypted_chunks, rsa_decrypted_chunks;
|
||||
|
||||
//extern unsigned char aes_key_raw[32], aes_iv[32];
|
||||
//extern AES_KEY aes_key;
|
||||
|
||||
void tgl_init_aes_unauth (const char server_nonce[16], const char hidden_client_nonce[32], int encrypt);
|
||||
void tgl_init_aes_auth (char auth_key[192], char msg_key[16], int encrypt);
|
||||
int tgl_pad_aes_encrypt (char *from, int from_len, char *to, int size);
|
||||
int tgl_pad_aes_decrypt (char *from, int from_len, char *to, int size);
|
||||
/*
|
||||
static inline void hexdump_in (void) {
|
||||
hexdump (in_ptr, in_end);
|
||||
}
|
||||
|
||||
static inline void hexdump_out (void) {
|
||||
hexdump (packet_buffer, packet_ptr);
|
||||
}*/
|
||||
|
||||
#ifdef __MACH__
|
||||
#define CLOCK_REALTIME 0
|
||||
#define CLOCK_MONOTONIC 1
|
||||
#endif
|
||||
#endif
|
623
net.c
623
net.c
@ -1,623 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <poll.h>
|
||||
#include <openssl/rand.h>
|
||||
#include <arpa/inet.h>
|
||||
#ifdef EVENT_V2
|
||||
#include <event2/event.h>
|
||||
#else
|
||||
#include <event.h>
|
||||
#include "event-old.h"
|
||||
#endif
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "net.h"
|
||||
#include "include.h"
|
||||
#include "tgl.h"
|
||||
#include "tgl-inner.h"
|
||||
//#include "mtproto-client.h"
|
||||
//#include "mtproto-common.h"
|
||||
#include "tree.h"
|
||||
#include "tools.h"
|
||||
|
||||
#ifndef POLLRDHUP
|
||||
#define POLLRDHUP 0
|
||||
#endif
|
||||
|
||||
//double get_utime (int clock_id);
|
||||
|
||||
//extern struct mtproto_methods auth_methods;
|
||||
|
||||
static void fail_connection (struct connection *c);
|
||||
|
||||
#define PING_TIMEOUT 10
|
||||
|
||||
static void start_ping_timer (struct connection *c);
|
||||
static void ping_alarm (evutil_socket_t fd, short what, void *arg) {
|
||||
struct connection *c = arg;
|
||||
struct tgl_state *TLS = c->TLS;
|
||||
vlogprintf (E_DEBUG + 2,"ping alarm\n");
|
||||
assert (c->state == conn_ready || c->state == conn_connecting);
|
||||
if (tglt_get_double_time () - c->last_receive_time > 6 * PING_TIMEOUT) {
|
||||
vlogprintf (E_WARNING, "fail connection: reason: ping timeout\n");
|
||||
c->state = conn_failed;
|
||||
fail_connection (c);
|
||||
} else if (tglt_get_double_time () - c->last_receive_time > 3 * PING_TIMEOUT && c->state == conn_ready) {
|
||||
tgl_do_send_ping (c->TLS, c);
|
||||
start_ping_timer (c);
|
||||
} else {
|
||||
start_ping_timer (c);
|
||||
}
|
||||
}
|
||||
|
||||
static void stop_ping_timer (struct connection *c) {
|
||||
event_del (c->ping_ev);
|
||||
}
|
||||
|
||||
static void start_ping_timer (struct connection *c) {
|
||||
static struct timeval ptimeout = { PING_TIMEOUT, 0};
|
||||
event_add (c->ping_ev, &ptimeout);
|
||||
}
|
||||
|
||||
static void restart_connection (struct connection *c);
|
||||
|
||||
static void fail_alarm (evutil_socket_t fd, short what, void *arg) {
|
||||
struct connection *c = arg;
|
||||
c->in_fail_timer = 0;
|
||||
restart_connection (c);
|
||||
}
|
||||
|
||||
static void start_fail_timer (struct connection *c) {
|
||||
if (c->in_fail_timer) { return; }
|
||||
c->in_fail_timer = 1;
|
||||
|
||||
static struct timeval ptimeout = { 10, 0};
|
||||
event_add (c->fail_ev, &ptimeout);
|
||||
}
|
||||
|
||||
static struct connection_buffer *new_connection_buffer (int size) {
|
||||
struct connection_buffer *b = talloc0 (sizeof (*b));
|
||||
b->start = talloc (size);
|
||||
b->end = b->start + size;
|
||||
b->rptr = b->wptr = b->start;
|
||||
return b;
|
||||
}
|
||||
|
||||
static void delete_connection_buffer (struct connection_buffer *b) {
|
||||
tfree (b->start, b->end - b->start);
|
||||
tfree (b, sizeof (*b));
|
||||
}
|
||||
|
||||
int tgln_write_out (struct connection *c, const void *_data, int len) {
|
||||
struct tgl_state *TLS = c->TLS;
|
||||
vlogprintf (E_DEBUG, "write_out: %d bytes\n", len);
|
||||
const unsigned char *data = _data;
|
||||
if (!len) { return 0; }
|
||||
assert (len > 0);
|
||||
int x = 0;
|
||||
if (!c->out_bytes) {
|
||||
event_add (c->write_ev, 0);
|
||||
}
|
||||
if (!c->out_head) {
|
||||
struct connection_buffer *b = new_connection_buffer (1 << 20);
|
||||
c->out_head = c->out_tail = b;
|
||||
}
|
||||
while (len) {
|
||||
if (c->out_tail->end - c->out_tail->wptr >= len) {
|
||||
memcpy (c->out_tail->wptr, data, len);
|
||||
c->out_tail->wptr += len;
|
||||
c->out_bytes += len;
|
||||
return x + len;
|
||||
} else {
|
||||
int y = c->out_tail->end - c->out_tail->wptr;
|
||||
assert (y < len);
|
||||
memcpy (c->out_tail->wptr, data, y);
|
||||
x += y;
|
||||
len -= y;
|
||||
data += y;
|
||||
struct connection_buffer *b = new_connection_buffer (1 << 20);
|
||||
c->out_tail->next = b;
|
||||
b->next = 0;
|
||||
c->out_tail = b;
|
||||
c->out_bytes += y;
|
||||
}
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
int tgln_read_in (struct connection *c, void *_data, int len) {
|
||||
unsigned char *data = _data;
|
||||
if (!len) { return 0; }
|
||||
assert (len > 0);
|
||||
if (len > c->in_bytes) {
|
||||
len = c->in_bytes;
|
||||
}
|
||||
int x = 0;
|
||||
while (len) {
|
||||
int y = c->in_head->wptr - c->in_head->rptr;
|
||||
if (y > len) {
|
||||
memcpy (data, c->in_head->rptr, len);
|
||||
c->in_head->rptr += len;
|
||||
c->in_bytes -= len;
|
||||
return x + len;
|
||||
} else {
|
||||
memcpy (data, c->in_head->rptr, y);
|
||||
c->in_bytes -= y;
|
||||
x += y;
|
||||
data += y;
|
||||
len -= y;
|
||||
void *old = c->in_head;
|
||||
c->in_head = c->in_head->next;
|
||||
if (!c->in_head) {
|
||||
c->in_tail = 0;
|
||||
}
|
||||
delete_connection_buffer (old);
|
||||
}
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
int tgln_read_in_lookup (struct connection *c, void *_data, int len) {
|
||||
unsigned char *data = _data;
|
||||
if (!len || !c->in_bytes) { return 0; }
|
||||
assert (len > 0);
|
||||
if (len > c->in_bytes) {
|
||||
len = c->in_bytes;
|
||||
}
|
||||
int x = 0;
|
||||
struct connection_buffer *b = c->in_head;
|
||||
while (len) {
|
||||
int y = b->wptr - b->rptr;
|
||||
if (y >= len) {
|
||||
memcpy (data, b->rptr, len);
|
||||
return x + len;
|
||||
} else {
|
||||
memcpy (data, b->rptr, y);
|
||||
x += y;
|
||||
data += y;
|
||||
len -= y;
|
||||
b = b->next;
|
||||
}
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
void tgln_flush_out (struct connection *c UU) {
|
||||
}
|
||||
|
||||
#define MAX_CONNECTIONS 100
|
||||
static struct connection *Connections[MAX_CONNECTIONS];
|
||||
static int max_connection_fd;
|
||||
|
||||
static void rotate_port (struct connection *c) {
|
||||
switch (c->port) {
|
||||
case 443:
|
||||
c->port = 80;
|
||||
break;
|
||||
case 80:
|
||||
c->port = 25;
|
||||
break;
|
||||
case 25:
|
||||
c->port = 443;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void try_read (struct connection *c);
|
||||
static void try_write (struct connection *c);
|
||||
|
||||
static void conn_try_read (evutil_socket_t fd, short what, void *arg) {
|
||||
struct connection *c = arg;
|
||||
struct tgl_state *TLS = c->TLS;
|
||||
vlogprintf (E_DEBUG + 1, "Try read. Fd = %d\n", c->fd);
|
||||
try_read (c);
|
||||
}
|
||||
static void conn_try_write (evutil_socket_t fd, short what, void *arg) {
|
||||
struct connection *c = arg;
|
||||
struct tgl_state *TLS = c->TLS;
|
||||
if (c->state == conn_connecting) {
|
||||
c->state = conn_ready;
|
||||
c->methods->ready (TLS, c);
|
||||
}
|
||||
try_write (c);
|
||||
if (c->out_bytes) {
|
||||
event_add (c->write_ev, 0);
|
||||
}
|
||||
}
|
||||
|
||||
struct connection *tgln_create_connection (struct tgl_state *TLS, const char *host, int port, struct tgl_session *session, struct tgl_dc *dc, struct mtproto_methods *methods) {
|
||||
struct connection *c = talloc0 (sizeof (*c));
|
||||
c->TLS = TLS;
|
||||
int fd = socket (AF_INET, SOCK_STREAM, 0);
|
||||
if (fd == -1) {
|
||||
vlogprintf (E_ERROR, "Can not create socket: %m\n");
|
||||
exit (1);
|
||||
}
|
||||
assert (fd >= 0 && fd < MAX_CONNECTIONS);
|
||||
if (fd > max_connection_fd) {
|
||||
max_connection_fd = fd;
|
||||
}
|
||||
int flags = -1;
|
||||
setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &flags, sizeof (flags));
|
||||
setsockopt (fd, SOL_SOCKET, SO_KEEPALIVE, &flags, sizeof (flags));
|
||||
setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &flags, sizeof (flags));
|
||||
|
||||
struct sockaddr_in addr;
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons (port);
|
||||
addr.sin_addr.s_addr = inet_addr (host);
|
||||
|
||||
|
||||
fcntl (fd, F_SETFL, O_NONBLOCK);
|
||||
|
||||
if (connect (fd, (struct sockaddr *) &addr, sizeof (addr)) == -1) {
|
||||
//vlogprintf (E_ERROR, "Can not connect to %s:%d %m\n", host, port);
|
||||
if (errno != EINPROGRESS) {
|
||||
vlogprintf (E_ERROR, "Can not connect to %s:%d %m\n", host, port);
|
||||
close (fd);
|
||||
tfree (c, sizeof (*c));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
c->fd = fd;
|
||||
c->state = conn_connecting;
|
||||
c->last_receive_time = tglt_get_double_time ();
|
||||
c->ip = tstrdup (host);
|
||||
c->flags = 0;
|
||||
c->port = port;
|
||||
assert (!Connections[fd]);
|
||||
Connections[fd] = c;
|
||||
|
||||
c->ping_ev = evtimer_new (TLS->ev_base, ping_alarm, c);
|
||||
c->fail_ev = evtimer_new (TLS->ev_base, fail_alarm, c);
|
||||
c->write_ev = event_new (TLS->ev_base, c->fd, EV_WRITE, conn_try_write, c);
|
||||
|
||||
struct timeval tv = {5, 0};
|
||||
c->read_ev = event_new (TLS->ev_base, c->fd, EV_READ | EV_PERSIST, conn_try_read, c);
|
||||
event_add (c->read_ev, &tv);
|
||||
|
||||
start_ping_timer (c);
|
||||
|
||||
c->dc = dc;
|
||||
c->session = session;
|
||||
c->methods = methods;
|
||||
|
||||
char byte = 0xef;
|
||||
assert (tgln_write_out (c, &byte, 1) == 1);
|
||||
tgln_flush_out (c);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static void restart_connection (struct connection *c) {
|
||||
struct tgl_state *TLS = c->TLS;
|
||||
if (c->last_connect_time == time (0)) {
|
||||
start_fail_timer (c);
|
||||
return;
|
||||
}
|
||||
|
||||
c->last_connect_time = time (0);
|
||||
int fd = socket (AF_INET, SOCK_STREAM, 0);
|
||||
if (fd == -1) {
|
||||
vlogprintf (E_ERROR, "Can not create socket: %m\n");
|
||||
exit (1);
|
||||
}
|
||||
assert (fd >= 0 && fd < MAX_CONNECTIONS);
|
||||
if (fd > max_connection_fd) {
|
||||
max_connection_fd = fd;
|
||||
}
|
||||
int flags = -1;
|
||||
setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &flags, sizeof (flags));
|
||||
setsockopt (fd, SOL_SOCKET, SO_KEEPALIVE, &flags, sizeof (flags));
|
||||
setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &flags, sizeof (flags));
|
||||
|
||||
struct sockaddr_in addr;
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons (c->port);
|
||||
if (strcmp (c->ip, c->dc->ip)) {
|
||||
tfree_str (c->ip);
|
||||
c->ip = tstrdup (c->dc->ip);
|
||||
}
|
||||
addr.sin_addr.s_addr = inet_addr (c->ip);
|
||||
|
||||
|
||||
fcntl (fd, F_SETFL, O_NONBLOCK);
|
||||
|
||||
if (connect (fd, (struct sockaddr *) &addr, sizeof (addr)) == -1) {
|
||||
if (errno != EINPROGRESS) {
|
||||
vlogprintf (E_WARNING, "Can not connect to %s:%d %m\n", c->ip, c->port);
|
||||
start_fail_timer (c);
|
||||
close (fd);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
c->fd = fd;
|
||||
c->state = conn_connecting;
|
||||
c->last_receive_time = tglt_get_double_time ();
|
||||
start_ping_timer (c);
|
||||
Connections[fd] = c;
|
||||
|
||||
c->write_ev = event_new (TLS->ev_base, c->fd, EV_WRITE, conn_try_write, c);
|
||||
|
||||
struct timeval tv = {5, 0};
|
||||
c->read_ev = event_new (TLS->ev_base, c->fd, EV_READ | EV_PERSIST, conn_try_read, c);
|
||||
event_add (c->read_ev, &tv);
|
||||
|
||||
char byte = 0xef;
|
||||
assert (tgln_write_out (c, &byte, 1) == 1);
|
||||
tgln_flush_out (c);
|
||||
}
|
||||
|
||||
static void fail_connection (struct connection *c) {
|
||||
struct tgl_state *TLS = c->TLS;
|
||||
if (c->state == conn_ready || c->state == conn_connecting) {
|
||||
stop_ping_timer (c);
|
||||
}
|
||||
event_free (c->write_ev);
|
||||
event_free (c->read_ev);
|
||||
|
||||
rotate_port (c);
|
||||
struct connection_buffer *b = c->out_head;
|
||||
while (b) {
|
||||
struct connection_buffer *d = b;
|
||||
b = b->next;
|
||||
delete_connection_buffer (d);
|
||||
}
|
||||
b = c->in_head;
|
||||
while (b) {
|
||||
struct connection_buffer *d = b;
|
||||
b = b->next;
|
||||
delete_connection_buffer (d);
|
||||
}
|
||||
c->out_head = c->out_tail = c->in_head = c->in_tail = 0;
|
||||
c->state = conn_failed;
|
||||
c->out_bytes = c->in_bytes = 0;
|
||||
close (c->fd);
|
||||
Connections[c->fd] = 0;
|
||||
vlogprintf (E_NOTICE, "Lost connection to server... %s:%d\n", c->ip, c->port);
|
||||
restart_connection (c);
|
||||
}
|
||||
|
||||
//extern FILE *log_net_f;
|
||||
static void try_write (struct connection *c) {
|
||||
struct tgl_state *TLS = c->TLS;
|
||||
vlogprintf (E_DEBUG, "try write: fd = %d\n", c->fd);
|
||||
int x = 0;
|
||||
while (c->out_head) {
|
||||
int r = write (c->fd, c->out_head->rptr, c->out_head->wptr - c->out_head->rptr);
|
||||
if (r >= 0) {
|
||||
x += r;
|
||||
c->out_head->rptr += r;
|
||||
if (c->out_head->rptr != c->out_head->wptr) {
|
||||
break;
|
||||
}
|
||||
struct connection_buffer *b = c->out_head;
|
||||
c->out_head = b->next;
|
||||
if (!c->out_head) {
|
||||
c->out_tail = 0;
|
||||
}
|
||||
delete_connection_buffer (b);
|
||||
} else {
|
||||
if (errno != EAGAIN && errno != EWOULDBLOCK) {
|
||||
vlogprintf (E_NOTICE, "fail_connection: write_error %m\n");
|
||||
fail_connection (c);
|
||||
return;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
vlogprintf (E_DEBUG, "Sent %d bytes to %d\n", x, c->fd);
|
||||
c->out_bytes -= x;
|
||||
}
|
||||
|
||||
static void try_rpc_read (struct connection *c) {
|
||||
assert (c->in_head);
|
||||
struct tgl_state *TLS = c->TLS;
|
||||
|
||||
while (1) {
|
||||
if (c->in_bytes < 1) { return; }
|
||||
unsigned len = 0;
|
||||
unsigned t = 0;
|
||||
assert (tgln_read_in_lookup (c, &len, 1) == 1);
|
||||
if (len >= 1 && len <= 0x7e) {
|
||||
if (c->in_bytes < (int)(1 + 4 * len)) { return; }
|
||||
} else {
|
||||
if (c->in_bytes < 4) { return; }
|
||||
assert (tgln_read_in_lookup (c, &len, 4) == 4);
|
||||
len = (len >> 8);
|
||||
if (c->in_bytes < (int)(4 + 4 * len)) { return; }
|
||||
len = 0x7f;
|
||||
}
|
||||
|
||||
if (len >= 1 && len <= 0x7e) {
|
||||
assert (tgln_read_in (c, &t, 1) == 1);
|
||||
assert (t == len);
|
||||
assert (len >= 1);
|
||||
} else {
|
||||
assert (len == 0x7f);
|
||||
assert (tgln_read_in (c, &len, 4) == 4);
|
||||
len = (len >> 8);
|
||||
assert (len >= 1);
|
||||
}
|
||||
len *= 4;
|
||||
int op;
|
||||
assert (tgln_read_in_lookup (c, &op, 4) == 4);
|
||||
c->methods->execute (TLS, c, op, len);
|
||||
}
|
||||
}
|
||||
|
||||
static void try_read (struct connection *c) {
|
||||
struct tgl_state *TLS = c->TLS;
|
||||
vlogprintf (E_DEBUG, "try read: fd = %d\n", c->fd);
|
||||
if (!c->in_tail) {
|
||||
c->in_head = c->in_tail = new_connection_buffer (1 << 20);
|
||||
}
|
||||
#ifdef EVENT_V1
|
||||
struct timeval tv = {5, 0};
|
||||
event_add (c->read_ev, &tv);
|
||||
#endif
|
||||
int x = 0;
|
||||
while (1) {
|
||||
int r = read (c->fd, c->in_tail->wptr, c->in_tail->end - c->in_tail->wptr);
|
||||
if (r > 0) {
|
||||
c->last_receive_time = tglt_get_double_time ();
|
||||
stop_ping_timer (c);
|
||||
start_ping_timer (c);
|
||||
}
|
||||
if (r >= 0) {
|
||||
c->in_tail->wptr += r;
|
||||
x += r;
|
||||
if (c->in_tail->wptr != c->in_tail->end) {
|
||||
break;
|
||||
}
|
||||
struct connection_buffer *b = new_connection_buffer (1 << 20);
|
||||
c->in_tail->next = b;
|
||||
c->in_tail = b;
|
||||
} else {
|
||||
if (errno != EAGAIN && errno != EWOULDBLOCK) {
|
||||
vlogprintf (E_NOTICE, "fail_connection: read_error %m\n");
|
||||
fail_connection (c);
|
||||
return;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
vlogprintf (E_DEBUG, "Received %d bytes from %d\n", x, c->fd);
|
||||
c->in_bytes += x;
|
||||
if (x) {
|
||||
try_rpc_read (c);
|
||||
}
|
||||
}
|
||||
/*
|
||||
int tgl_connections_make_poll_array (struct pollfd *fds, int max) {
|
||||
int _max = max;
|
||||
int i;
|
||||
for (i = 0; i <= max_connection_fd; i++) {
|
||||
if (Connections[i] && Connections[i]->state == conn_failed) {
|
||||
restart_connection (Connections[i]);
|
||||
}
|
||||
if (Connections[i] && Connections[i]->state != conn_failed) {
|
||||
assert (max > 0);
|
||||
struct connection *c = Connections[i];
|
||||
fds[0].fd = c->fd;
|
||||
fds[0].events = POLLERR | POLLHUP | POLLRDHUP | POLLIN;
|
||||
if (c->out_bytes || c->state == conn_connecting) {
|
||||
fds[0].events |= POLLOUT;
|
||||
}
|
||||
fds ++;
|
||||
max --;
|
||||
}
|
||||
}
|
||||
return _max - max;
|
||||
}
|
||||
|
||||
void tgl_connections_poll_result (struct pollfd *fds, int max) {
|
||||
int i;
|
||||
for (i = 0; i < max; i++) {
|
||||
struct connection *c = Connections[fds[i].fd];
|
||||
if (fds[i].revents & POLLIN) {
|
||||
try_read (c);
|
||||
}
|
||||
if (fds[i].revents & (POLLHUP | POLLERR | POLLRDHUP)) {
|
||||
vlogprintf (E_NOTICE, "fail_connection: events_mask=0x%08x\n", fds[i].revents);
|
||||
fail_connection (c);
|
||||
} else if (fds[i].revents & POLLOUT) {
|
||||
if (c->state == conn_connecting) {
|
||||
vlogprintf (E_DEBUG, "connection ready\n");
|
||||
c->state = conn_ready;
|
||||
c->last_receive_time = tglt_get_double_time ();
|
||||
}
|
||||
if (c->out_bytes) {
|
||||
try_write (c);
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
static void incr_out_packet_num (struct connection *c) {
|
||||
c->out_packet_num ++;
|
||||
}
|
||||
|
||||
static struct tgl_dc *get_dc (struct connection *c) {
|
||||
return c->dc;
|
||||
}
|
||||
|
||||
static struct tgl_session *get_session (struct connection *c) {
|
||||
return c->session;
|
||||
}
|
||||
|
||||
static void tgln_free (struct connection *c) {
|
||||
if (c->ip) { tfree_str (c->ip); }
|
||||
struct connection_buffer *b = c->out_head;
|
||||
while (b) {
|
||||
struct connection_buffer *d = b;
|
||||
b = b->next;
|
||||
delete_connection_buffer (d);
|
||||
}
|
||||
b = c->in_head;
|
||||
while (b) {
|
||||
struct connection_buffer *d = b;
|
||||
b = b->next;
|
||||
delete_connection_buffer (d);
|
||||
}
|
||||
|
||||
if (c->ping_ev) { event_free (c->ping_ev); }
|
||||
if (c->fail_ev) { event_free (c->fail_ev); }
|
||||
if (c->read_ev) { event_free (c->read_ev); }
|
||||
if (c->write_ev) { event_free (c->write_ev); }
|
||||
|
||||
if (c->fd >= 0) { close (c->fd); }
|
||||
tfree (c, sizeof (*c));
|
||||
}
|
||||
|
||||
struct tgl_net_methods tgl_conn_methods = {
|
||||
.write_out = tgln_write_out,
|
||||
.read_in = tgln_read_in,
|
||||
.read_in_lookup = tgln_read_in_lookup,
|
||||
.flush_out = tgln_flush_out,
|
||||
.incr_out_packet_num = incr_out_packet_num,
|
||||
.get_dc = get_dc,
|
||||
.get_session = get_session,
|
||||
.create_connection = tgln_create_connection,
|
||||
.free = tgln_free
|
||||
};
|
87
net.h
87
net.h
@ -1,87 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
#ifndef __NET_H__
|
||||
#define __NET_H__
|
||||
|
||||
struct connection_buffer {
|
||||
unsigned char *start;
|
||||
unsigned char *end;
|
||||
unsigned char *rptr;
|
||||
unsigned char *wptr;
|
||||
struct connection_buffer *next;
|
||||
};
|
||||
|
||||
enum conn_state {
|
||||
conn_none,
|
||||
conn_connecting,
|
||||
conn_ready,
|
||||
conn_failed,
|
||||
conn_stopped
|
||||
};
|
||||
|
||||
struct connection {
|
||||
int fd;
|
||||
char *ip;
|
||||
int port;
|
||||
int flags;
|
||||
enum conn_state state;
|
||||
int ipv6[4];
|
||||
struct connection_buffer *in_head;
|
||||
struct connection_buffer *in_tail;
|
||||
struct connection_buffer *out_head;
|
||||
struct connection_buffer *out_tail;
|
||||
int in_bytes;
|
||||
int out_bytes;
|
||||
int packet_num;
|
||||
int out_packet_num;
|
||||
int last_connect_time;
|
||||
int in_fail_timer;
|
||||
struct mtproto_methods *methods;
|
||||
struct tgl_state *TLS;
|
||||
struct tgl_session *session;
|
||||
struct tgl_dc *dc;
|
||||
void *extra;
|
||||
struct event *ping_ev;
|
||||
struct event *fail_ev;
|
||||
struct event *read_ev;
|
||||
struct event *write_ev;
|
||||
double last_receive_time;
|
||||
};
|
||||
|
||||
//extern struct connection *Connections[];
|
||||
|
||||
int tgln_write_out (struct connection *c, const void *data, int len);
|
||||
void tgln_flush_out (struct connection *c);
|
||||
int tgln_read_in (struct connection *c, void *data, int len);
|
||||
int tgln_read_in_lookup (struct connection *c, void *data, int len);
|
||||
|
||||
//void tgln_insert_msg_id (struct tgl_session *S, long long id);
|
||||
|
||||
extern struct tgl_net_methods tgl_conn_methods;
|
||||
|
||||
//void create_all_outbound_connections (void);
|
||||
|
||||
//struct connection *create_connection (const char *host, int port, struct tgl_session *session, struct connection_methods *methods);
|
||||
//struct tgl_dc *tgln_alloc_dc (int id, char *ip, int port);
|
||||
//void tgln_dc_create_session (struct tgl_dc *DC, struct mtproto_methods *methods);
|
||||
struct connection *tgln_create_connection (struct tgl_state *TLS, const char *host, int port, struct tgl_session *session, struct tgl_dc *dc, struct mtproto_methods *methods);
|
||||
|
||||
#define GET_DC(c) (c->session->dc)
|
||||
#endif
|
106
no-preview.h
106
no-preview.h
@ -1,106 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
|
||||
// Just sample jpg file 90x90
|
||||
|
||||
int thumb_file_size = (82 * 6 - 2) * 4;
|
||||
int thumb_file [] = {
|
||||
0xe0ffd8ff, 0x464a1000, 0x01004649, 0x64000101, 0x00006400, 0xa002e2ff,
|
||||
0x5f434349, 0x464f5250, 0x00454c49, 0x00000101, 0x636c9002, 0x3004736d,
|
||||
0x6e6d0000, 0x47527274, 0x59582042, 0xdd07205a, 0x04000b00, 0x1b001600,
|
||||
0x63612400, 0x50417073, 0x00004c50, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x0100d6f6, 0x00000000, 0x636c2dd3,
|
||||
0x0000736d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x65640b00, 0x00006373, 0x00000801, 0x70633800, 0x00007472, 0x00004001,
|
||||
0x74774e00, 0x00007470, 0x00009001, 0x68631400, 0x00006461, 0x0000a401,
|
||||
0x58722c00, 0x00005a59, 0x0000d001, 0x58621400, 0x00005a59, 0x0000e401,
|
||||
0x58671400, 0x00005a59, 0x0000f801, 0x54721400, 0x00004352, 0x00000c02,
|
||||
0x54672000, 0x00004352, 0x00002c02, 0x54622000, 0x00004352, 0x00004c02,
|
||||
0x68632000, 0x00006d72, 0x00006c02, 0x6c6d2400, 0x00006375, 0x00000000,
|
||||
0x00000100, 0x6e650c00, 0x00005355, 0x00001c00, 0x73001c00, 0x47005200,
|
||||
0x20004200, 0x75006200, 0x6c006900, 0x2d007400, 0x6e006900, 0x6c6d0000,
|
||||
0x00006375, 0x00000000, 0x00000100, 0x6e650c00, 0x00005355, 0x00003200,
|
||||
0x4e001c00, 0x20006f00, 0x6f006300, 0x79007000, 0x69007200, 0x68006700,
|
||||
0x2c007400, 0x75002000, 0x65007300, 0x66002000, 0x65007200, 0x6c006500,
|
||||
0x00007900, 0x59580000, 0x0000205a, 0x00000000, 0x0100d6f6, 0x00000000,
|
||||
0x66732dd3, 0x00003233, 0x01000000, 0x00004a0c, 0xffffe305, 0x00002af3,
|
||||
0x00009b07, 0xffff87fd, 0xffffa2fb, 0x0000a3fd, 0x0000d803, 0x595894c0,
|
||||
0x0000205a, 0x00000000, 0x0000946f, 0x0000ee38, 0x59589003, 0x0000205a,
|
||||
0x00000000, 0x00009d24, 0x0000830f, 0x5958beb6, 0x0000205a, 0x00000000,
|
||||
0x0000a562, 0x000090b7, 0x6170de18, 0x00006172, 0x03000000, 0x02000000,
|
||||
0x00006666, 0x0000a7f2, 0x0000590d, 0x0000d013, 0x61705b0a, 0x00006172,
|
||||
0x03000000, 0x02000000, 0x00006666, 0x0000a7f2, 0x0000590d, 0x0000d013,
|
||||
0x61705b0a, 0x00006172, 0x03000000, 0x02000000, 0x00006666, 0x0000a7f2,
|
||||
0x0000590d, 0x0000d013, 0x68635b0a, 0x00006d72, 0x03000000, 0x00000000,
|
||||
0x0000d7a3, 0x00007b54, 0x0000cd4c, 0x00009a99, 0x00006626, 0xdbff5c0f,
|
||||
0x14004300, 0x0f120f0e, 0x1112140d, 0x14161712, 0x21331f18, 0x1f1c1c1f,
|
||||
0x252f2d3f, 0x4e414a33, 0x4841494d, 0x765c5246, 0x6f575264, 0x66484658,
|
||||
0x7a6f688c, 0x8485847d, 0x9b91634f, 0x769a808f, 0xff7f8481, 0x014300db,
|
||||
0x1f171716, 0x213c1f1b, 0x547f3c21, 0x7f7f5448, 0x7f7f7f7f, 0x7f7f7f7f,
|
||||
0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f,
|
||||
0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x1100c0ff, 0x005a0008,
|
||||
0x2201035a, 0x01110200, 0xff011103, 0x001900c4, 0x01010101, 0x00000101,
|
||||
0x00000000, 0x00000000, 0x02030400, 0xc4ff0605, 0x00103600, 0x02010401,
|
||||
0x06050304, 0x00000306, 0x01000000, 0x11030200, 0x05211204, 0x13514131,
|
||||
0x32146122, 0x23918171, 0x72423424, 0x432515a1, 0xa2827444, 0xc4fff0b3,
|
||||
0x01011400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1400c4ff,
|
||||
0x00000111, 0x00000000, 0x00000000, 0x00000000, 0xdaff0000, 0x01030c00,
|
||||
0x03110200, 0x003f0011, 0x404434fb, 0xbcb4875c, 0x006b38b0, 0x03dcdb12,
|
||||
0xf4637f74, 0xe519f153, 0x09d7c5c7, 0x47d29160, 0x20692f18, 0xd06d786a,
|
||||
0x53f7f922, 0x17b3e260, 0x2fe8668c, 0x1786a473, 0x9775efbd, 0xe917e43a,
|
||||
0x1d0a1bb0, 0x114d0f82, 0x14651110, 0x35f299ed, 0xe9b09680, 0xf5a4fc2f,
|
||||
0xe975bd03, 0xb506737b, 0x04444440, 0x5c444044, 0x8e8dedbd, 0xc61adc7b,
|
||||
0x689c738b, 0x92a0dc01, 0x58e2b77f, 0x7bfb37d1, 0xb5b5e79d, 0xdbf968cc,
|
||||
0xead3f48d, 0x38ed1313, 0xdea77c86, 0xae089963, 0xc743435a, 0x403fe4ce,
|
||||
0x392ee1b9, 0xed39e718, 0xd6517e2d, 0x7fc4aa03, 0xb7ad7590, 0x77e7e6ab,
|
||||
0x34bf705d, 0x7c77ca53, 0x3dea1299, 0x7fb0bcf4, 0x241fadc5, 0x95a7a816,
|
||||
0x13fbe6f3, 0x3182b135, 0xd1b4b224, 0x1b0d48a2, 0xbf9d26d8, 0x82dc3640,
|
||||
0x63569a2a, 0xbbd224c3, 0xb9b4714c, 0x1680aec6, 0x3d311856, 0x9b59be91,
|
||||
0x09876ca6, 0x61d86564, 0x5a9f06d2, 0x36f51b0d, 0x8682e476, 0xacb1b131,
|
||||
0xd1584363, 0x00456b4d, 0x22d2053b, 0x22202202, 0xf3f30222, 0xe3e513e5,
|
||||
0xf1e6e1f0, 0x2380496e, 0x5fdcdb68, 0x549b3a27, 0x825e6a6c, 0x6522028b,
|
||||
0xaf91ccc8, 0x341cf26b, 0x58dbc4b5, 0xf2289add, 0x0854ddbd, 0x0b9247d5,
|
||||
0xf02b5c54, 0x3f917f92, 0xaf56affd, 0xe3760637, 0x05cebde0, 0xed4c76ce,
|
||||
0x3cef1b63, 0x7fd8aff8, 0xa0c902ea, 0x7e730d0a, 0x435834f3, 0x26edbb76,
|
||||
0xd3ec00fd, 0x76d48efa, 0xa8560f2d, 0x0e766331, 0xd319993c, 0x20243209,
|
||||
0x61b7e6c8, 0x998331d0, 0x640ee802, 0x47a3d493, 0xfab99413, 0x4fd871f1,
|
||||
0xe9443792, 0x627e051c, 0xd8f3051c, 0x2f28f558, 0x64b51745, 0x1b2bfee3,
|
||||
0xb8783953, 0x9900fff6, 0xd8176a65, 0x5a3bf56a, 0x1b331fdb, 0x64b3572f,
|
||||
0xd59a3643, 0xaf3abce1, 0x11dd20bd, 0x01111110, 0x5c141011, 0xb3e3083f,
|
||||
0xd9b19cc4, 0x17edb20e, 0xa78e9aa1, 0x4ef4de06, 0x00c0bfe7, 0x7e1e442d,
|
||||
0x9221fe38, 0xedb5c7dc, 0x6338078a, 0x62495b8d, 0xc11d9b8c, 0x49e81b16,
|
||||
0x51d02bea, 0x3eb86d70, 0xc8bc4f13, 0xa10ec758, 0xd40751c0, 0x5ac94710,
|
||||
0xc4c8b080, 0x95492b83, 0x975ee696, 0xb7bd96b4, 0x17379cce, 0x82e856e8,
|
||||
0xe4c2c82a, 0x398e935f, 0x632437ea, 0x7c9c87d2, 0xdc1ddb7c, 0x65a80a48,
|
||||
0x2309f164, 0x51fab475, 0x081dc11d, 0xda45573b, 0x6622f3f3, 0x48f1b214,
|
||||
0x676c4edb, 0x243468c7, 0x00ffde60, 0xf1630350, 0xa0076c1d, 0x8f2c0c8b,
|
||||
0x2383c26b, 0x361a8f4e, 0xaceea6c9, 0x01dd5a5d, 0x11111011, 0xc3780c04,
|
||||
0xbf093ee2, 0xc7972c0b, 0x00d99040, 0xc0c20eb7, 0x659d3bd4, 0x269ab85e,
|
||||
0x468e114f, 0x11ad4fdb, 0x83d083d8, 0x8c52f4bd, 0x3c9664bf, 0xa4f9c77c,
|
||||
0x22a68876, 0xadb18784, 0xf480be83, 0x885a00ea, 0x220e0a88, 0xc303e4f6,
|
||||
0xc866e058, 0xdddbd661, 0xdf395db1, 0xbad64343, 0xe6e65b03, 0x668e81c3,
|
||||
0xad619e98, 0xeeb94563, 0xd4d19a3c, 0x3316ce95, 0x9d65f1e1, 0x3bf324fe,
|
||||
0x0e468f53, 0xc386068c, 0xa89e24f7, 0xf0c7c73b, 0xb60e391f, 0x1b8827cb,
|
||||
0x58601954, 0xc54f90f9, 0x80886ec5, 0x88088888, 0x1b7bb980, 0xb4c71c23,
|
||||
0xe6148e39, 0xb12358b8, 0xbd08225d, 0x0ffef085, 0x72b4f025, 0x635ce389,
|
||||
0xb90277e4, 0x0d05e000, 0x9bf9dbb9, 0x8e749fbc, 0x7ee6abbf, 0x4ddbf4af,
|
||||
0x728df7f3, 0x10b59adf, 0xe3c38f49, 0xb23c638a, 0xdb3d9349, 0x66899a64,
|
||||
0x00004dd5, 0xf51b5adf, 0x2220a255, 0xd9ff0f22};
|
75
queries.h
75
queries.h
@ -1,75 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
//#include "net.h"
|
||||
#ifndef __QUERIES_H__
|
||||
#define __QUERIES_H__
|
||||
#include "structures.h"
|
||||
#include "auto.h"
|
||||
#include "tgl-layout.h"
|
||||
|
||||
#define QUERY_ACK_RECEIVED 1
|
||||
#define QUERY_FORCE_SEND 2
|
||||
|
||||
struct query;
|
||||
struct query_methods {
|
||||
int (*on_answer)(struct tgl_state *TLS, struct query *q);
|
||||
int (*on_error)(struct tgl_state *TLS, struct query *q, int error_code, int len, char *error);
|
||||
int (*on_timeout)(struct tgl_state *TLS, struct query *q);
|
||||
struct paramed_type *type;
|
||||
};
|
||||
|
||||
struct query {
|
||||
long long msg_id;
|
||||
int data_len;
|
||||
int flags;
|
||||
int seq_no;
|
||||
long long session_id;
|
||||
void *data;
|
||||
struct query_methods *methods;
|
||||
struct tgl_timer *ev;
|
||||
struct tgl_dc *DC;
|
||||
struct tgl_session *session;
|
||||
struct paramed_type *type;
|
||||
void *extra;
|
||||
void *callback;
|
||||
void *callback_extra;
|
||||
};
|
||||
|
||||
|
||||
struct query *tglq_send_query (struct tgl_state *TLS, struct tgl_dc *DC, int len, void *data, struct query_methods *methods, void *extra, void *callback, void *callback_extra);
|
||||
void tglq_query_ack (struct tgl_state *TLS, long long id);
|
||||
void tglq_query_error (struct tgl_state *TLS, long long id);
|
||||
void tglq_query_result (struct tgl_state *TLS, long long id);
|
||||
void tglq_query_restart (struct tgl_state *TLS, long long id);
|
||||
|
||||
//double next_timer_in (void);
|
||||
//void work_timers (void);
|
||||
|
||||
//extern struct query_methods help_get_config_methods;
|
||||
|
||||
double get_double_time (void);
|
||||
|
||||
void tgl_do_send_bind_temp_key (struct tgl_state *TLS, struct tgl_dc *D, long long nonce, int expires_at, void *data, int len, long long msg_id);
|
||||
|
||||
// For binlog
|
||||
|
||||
//int get_dh_config_on_answer (struct query *q);
|
||||
//void fetch_dc_option (void);
|
||||
#endif
|
505
scheme12.tl
505
scheme12.tl
@ -1,505 +0,0 @@
|
||||
int ?= Int;
|
||||
long ?= Long;
|
||||
double ?= Double;
|
||||
string ?= String;
|
||||
|
||||
bytes string = Bytes;
|
||||
|
||||
boolFalse#bc799737 = Bool;
|
||||
boolTrue#997275b5 = Bool;
|
||||
|
||||
vector#1cb5c415 {t:Type} # [ t ] = Vector t;
|
||||
|
||||
error#c4b9f9bb code:int text:string = Error;
|
||||
|
||||
null#56730bcc = Null;
|
||||
|
||||
inputPeerEmpty#7f3b18ea = InputPeer;
|
||||
inputPeerSelf#7da07ec9 = InputPeer;
|
||||
inputPeerContact#1023dbe8 user_id:int = InputPeer;
|
||||
inputPeerForeign#9b447325 user_id:int access_hash:long = InputPeer;
|
||||
inputPeerChat#179be863 chat_id:int = InputPeer;
|
||||
|
||||
inputUserEmpty#b98886cf = InputUser;
|
||||
inputUserSelf#f7c1b13f = InputUser;
|
||||
inputUserContact#86e94f65 user_id:int = InputUser;
|
||||
inputUserForeign#655e74ff user_id:int access_hash:long = InputUser;
|
||||
|
||||
inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact;
|
||||
|
||||
inputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile;
|
||||
|
||||
inputMediaEmpty#9664f57f = InputMedia;
|
||||
inputMediaUploadedPhoto#2dc53a7d file:InputFile = InputMedia;
|
||||
inputMediaPhoto#8f2ab2ec id:InputPhoto = InputMedia;
|
||||
inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;
|
||||
inputMediaContact#a6e45987 phone_number:string first_name:string last_name:string = InputMedia;
|
||||
inputMediaUploadedVideo#4847d92a file:InputFile duration:int w:int h:int = InputMedia;
|
||||
inputMediaUploadedThumbVideo#e628a145 file:InputFile thumb:InputFile duration:int w:int h:int = InputMedia;
|
||||
inputMediaVideo#7f023ae6 id:InputVideo = InputMedia;
|
||||
|
||||
inputChatPhotoEmpty#1ca48f57 = InputChatPhoto;
|
||||
inputChatUploadedPhoto#94254732 file:InputFile crop:InputPhotoCrop = InputChatPhoto;
|
||||
inputChatPhoto#b2e1bf08 id:InputPhoto crop:InputPhotoCrop = InputChatPhoto;
|
||||
|
||||
inputGeoPointEmpty#e4c123d6 = InputGeoPoint;
|
||||
inputGeoPoint#f3b7acc9 lat:double long:double = InputGeoPoint;
|
||||
|
||||
inputPhotoEmpty#1cd7bf0d = InputPhoto;
|
||||
inputPhoto#fb95c6c4 id:long access_hash:long = InputPhoto;
|
||||
|
||||
inputVideoEmpty#5508ec75 = InputVideo;
|
||||
inputVideo#ee579652 id:long access_hash:long = InputVideo;
|
||||
|
||||
inputFileLocation#14637196 volume_id:long local_id:int secret:long = InputFileLocation;
|
||||
inputVideoFileLocation#3d0364ec id:long access_hash:long = InputFileLocation;
|
||||
|
||||
inputPhotoCropAuto#ade6b004 = InputPhotoCrop;
|
||||
inputPhotoCrop#d9915325 crop_left:double crop_top:double crop_width:double = InputPhotoCrop;
|
||||
|
||||
inputAppEvent#770656a8 time:double type:string peer:long data:string = InputAppEvent;
|
||||
|
||||
peerUser#9db1bc6d user_id:int = Peer;
|
||||
peerChat#bad0e5bb chat_id:int = Peer;
|
||||
|
||||
storage.fileUnknown#aa963b05 = storage.FileType;
|
||||
storage.fileJpeg#7efe0e = storage.FileType;
|
||||
storage.fileGif#cae1aadf = storage.FileType;
|
||||
storage.filePng#a4f63c0 = storage.FileType;
|
||||
storage.filePdf#ae1e508d = storage.FileType;
|
||||
storage.fileMp3#528a0677 = storage.FileType;
|
||||
storage.fileMov#4b09ebbc = storage.FileType;
|
||||
storage.filePartial#40bc6f52 = storage.FileType;
|
||||
storage.fileMp4#b3cea0e4 = storage.FileType;
|
||||
storage.fileWebp#1081464c = storage.FileType;
|
||||
|
||||
fileLocationUnavailable#7c596b46 volume_id:long local_id:int secret:long = FileLocation;
|
||||
fileLocation#53d69076 dc_id:int volume_id:long local_id:int secret:long = FileLocation;
|
||||
|
||||
userEmpty#200250ba id:int = User;
|
||||
userSelf#720535ec id:int first_name:string last_name:string phone:string photo:UserProfilePhoto status:UserStatus inactive:Bool = User;
|
||||
userContact#f2fb8319 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userRequest#22e8ceb0 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userForeign#5214c89d id:int first_name:string last_name:string access_hash:long photo:UserProfilePhoto status:UserStatus = User;
|
||||
userDeleted#b29ad7cc id:int first_name:string last_name:string = User;
|
||||
|
||||
userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;
|
||||
userProfilePhoto#d559d8c8 photo_id:long photo_small:FileLocation photo_big:FileLocation = UserProfilePhoto;
|
||||
|
||||
userStatusEmpty#9d05049 = UserStatus;
|
||||
userStatusOnline#edb93949 expires:int = UserStatus;
|
||||
userStatusOffline#8c703f was_online:int = UserStatus;
|
||||
|
||||
chatEmpty#9ba2d800 id:int = Chat;
|
||||
chat#6e9c9bc7 id:int title:string photo:ChatPhoto participants_count:int date:int left:Bool version:int = Chat;
|
||||
chatForbidden#fb0ccc41 id:int title:string date:int = Chat;
|
||||
|
||||
chatFull#630e61be id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings = ChatFull;
|
||||
|
||||
chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;
|
||||
|
||||
chatParticipantsForbidden#fd2bb8a chat_id:int = ChatParticipants;
|
||||
chatParticipants#7841b415 chat_id:int admin_id:int participants:Vector<ChatParticipant> version:int = ChatParticipants;
|
||||
|
||||
chatPhotoEmpty#37c1011c = ChatPhoto;
|
||||
chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;
|
||||
|
||||
messageEmpty#83e5de54 id:int = Message;
|
||||
message#22eb6aba id:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
messageForwarded#5f46804 id:int fwd_from_id:int fwd_date:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
messageService#9f8d60bb id:int from_id:int to_id:Peer out:Bool unread:Bool date:int action:MessageAction = Message;
|
||||
|
||||
messageMediaEmpty#3ded6320 = MessageMedia;
|
||||
messageMediaPhoto#c8c45a2a photo:Photo = MessageMedia;
|
||||
messageMediaVideo#a2d24290 video:Video = MessageMedia;
|
||||
messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;
|
||||
messageMediaContact#5e7d2f39 phone_number:string first_name:string last_name:string user_id:int = MessageMedia;
|
||||
messageMediaUnsupported#29632a36 bytes:bytes = MessageMedia;
|
||||
|
||||
messageActionEmpty#b6aef7b0 = MessageAction;
|
||||
messageActionChatCreate#a6638b9a title:string users:Vector<int> = MessageAction;
|
||||
messageActionChatEditTitle#b5a1ce5a title:string = MessageAction;
|
||||
messageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction;
|
||||
messageActionChatDeletePhoto#95e3fbef = MessageAction;
|
||||
messageActionChatAddUser#5e3cfc4b user_id:int = MessageAction;
|
||||
messageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction;
|
||||
|
||||
dialog#214a8cdf peer:Peer top_message:int unread_count:int = Dialog;
|
||||
|
||||
photoEmpty#2331b22d id:long = Photo;
|
||||
photo#22b56751 id:long access_hash:long user_id:int date:int caption:string geo:GeoPoint sizes:Vector<PhotoSize> = Photo;
|
||||
|
||||
photoSizeEmpty#e17e23c type:string = PhotoSize;
|
||||
photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize;
|
||||
photoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize;
|
||||
|
||||
videoEmpty#c10658a8 id:long = Video;
|
||||
video#5a04a49f id:long access_hash:long user_id:int date:int caption:string duration:int size:int thumb:PhotoSize dc_id:int w:int h:int = Video;
|
||||
|
||||
geoPointEmpty#1117dd5f = GeoPoint;
|
||||
geoPoint#2049d70c long:double lat:double = GeoPoint;
|
||||
|
||||
auth.checkedPhone#e300cc3b phone_registered:Bool phone_invited:Bool = auth.CheckedPhone;
|
||||
|
||||
auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;
|
||||
|
||||
auth.authorization#f6b673a4 expires:int user:User = auth.Authorization;
|
||||
|
||||
auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization;
|
||||
|
||||
inputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer;
|
||||
inputNotifyUsers#193b4417 = InputNotifyPeer;
|
||||
inputNotifyChats#4a95e84e = InputNotifyPeer;
|
||||
inputNotifyAll#a429b886 = InputNotifyPeer;
|
||||
|
||||
inputPeerNotifyEventsEmpty#f03064d8 = InputPeerNotifyEvents;
|
||||
inputPeerNotifyEventsAll#e86a2c74 = InputPeerNotifyEvents;
|
||||
|
||||
inputPeerNotifySettings#46a2ce98 mute_until:int sound:string show_previews:Bool events_mask:int = InputPeerNotifySettings;
|
||||
|
||||
peerNotifyEventsEmpty#add53cb3 = PeerNotifyEvents;
|
||||
peerNotifyEventsAll#6d1ded88 = PeerNotifyEvents;
|
||||
|
||||
peerNotifySettingsEmpty#70a68512 = PeerNotifySettings;
|
||||
peerNotifySettings#8d5e11ee mute_until:int sound:string show_previews:Bool events_mask:int = PeerNotifySettings;
|
||||
|
||||
wallPaper#ccb03657 id:int title:string sizes:Vector<PhotoSize> color:int = WallPaper;
|
||||
|
||||
userFull#771095da user:User link:contacts.Link profile_photo:Photo notify_settings:PeerNotifySettings blocked:Bool real_first_name:string real_last_name:string = UserFull;
|
||||
|
||||
contact#f911c994 user_id:int mutual:Bool = Contact;
|
||||
|
||||
importedContact#d0028438 user_id:int client_id:long = ImportedContact;
|
||||
|
||||
contactBlocked#561bc879 user_id:int date:int = ContactBlocked;
|
||||
|
||||
contactFound#ea879f95 user_id:int = ContactFound;
|
||||
|
||||
contactSuggested#3de191a1 user_id:int mutual_contacts:int = ContactSuggested;
|
||||
|
||||
contactStatus#aa77b873 user_id:int expires:int = ContactStatus;
|
||||
|
||||
chatLocated#3631cf4c chat_id:int distance:int = ChatLocated;
|
||||
|
||||
contacts.foreignLinkUnknown#133421f8 = contacts.ForeignLink;
|
||||
contacts.foreignLinkRequested#a7801f47 has_phone:Bool = contacts.ForeignLink;
|
||||
contacts.foreignLinkMutual#1bea8ce1 = contacts.ForeignLink;
|
||||
|
||||
contacts.myLinkEmpty#d22a1c60 = contacts.MyLink;
|
||||
contacts.myLinkRequested#6c69efee contact:Bool = contacts.MyLink;
|
||||
contacts.myLinkContact#c240ebd9 = contacts.MyLink;
|
||||
|
||||
contacts.link#eccea3f5 my_link:contacts.MyLink foreign_link:contacts.ForeignLink user:User = contacts.Link;
|
||||
|
||||
contacts.contacts#6f8b8cb2 contacts:Vector<Contact> users:Vector<User> = contacts.Contacts;
|
||||
contacts.contactsNotModified#b74ba9d2 = contacts.Contacts;
|
||||
|
||||
contacts.importedContacts#d1cd0a4c imported:Vector<ImportedContact> users:Vector<User> = contacts.ImportedContacts;
|
||||
|
||||
contacts.blocked#1c138d15 blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
contacts.blockedSlice#900802a1 count:int blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
|
||||
contacts.found#566000e results:Vector<ContactFound> users:Vector<User> = contacts.Found;
|
||||
|
||||
contacts.suggested#5649dcc5 results:Vector<ContactSuggested> users:Vector<User> = contacts.Suggested;
|
||||
|
||||
messages.dialogs#15ba6c40 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
messages.dialogsSlice#71e094f3 count:int dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
|
||||
messages.messages#8c718e87 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
messages.messagesSlice#b446ae3 count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
|
||||
messages.messageEmpty#3f4e0648 = messages.Message;
|
||||
messages.message#ff90c417 message:Message chats:Vector<Chat> users:Vector<User> = messages.Message;
|
||||
|
||||
messages.statedMessages#969478bb messages:Vector<Message> chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessage#d07ae726 message:Message chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessage#d1f4d35c id:int date:int pts:int seq:int = messages.SentMessage;
|
||||
|
||||
messages.chat#40e9002a chat:Chat users:Vector<User> = messages.Chat;
|
||||
|
||||
messages.chats#8150cbd8 chats:Vector<Chat> users:Vector<User> = messages.Chats;
|
||||
|
||||
messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector<Chat> users:Vector<User> = messages.ChatFull;
|
||||
|
||||
messages.affectedHistory#b7de36f2 pts:int seq:int offset:int = messages.AffectedHistory;
|
||||
|
||||
inputMessagesFilterEmpty#57e2f66c = MessagesFilter;
|
||||
inputMessagesFilterPhotos#9609a51c = MessagesFilter;
|
||||
inputMessagesFilterVideo#9fc00e65 = MessagesFilter;
|
||||
inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter;
|
||||
inputMessagesFilterDocument#9eddf188 = MessagesFilter;
|
||||
inputMessagesFilterAudio#cfc87522 = MessagesFilter;
|
||||
|
||||
updateNewMessage#13abdb3 message:Message pts:int = Update;
|
||||
updateMessageID#4e90bfd6 id:int random_id:long = Update;
|
||||
updateReadMessages#c6649e31 messages:Vector<int> pts:int = Update;
|
||||
updateDeleteMessages#a92bfe26 messages:Vector<int> pts:int = Update;
|
||||
updateRestoreMessages#d15de04d messages:Vector<int> pts:int = Update;
|
||||
updateUserTyping#6baa8508 user_id:int = Update;
|
||||
updateChatUserTyping#3c46cfe6 chat_id:int user_id:int = Update;
|
||||
updateChatParticipants#7761198 participants:ChatParticipants = Update;
|
||||
updateUserStatus#1bfbd823 user_id:int status:UserStatus = Update;
|
||||
updateUserName#da22d9ad user_id:int first_name:string last_name:string = Update;
|
||||
updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update;
|
||||
updateContactRegistered#2575bbb9 user_id:int date:int = Update;
|
||||
updateContactLink#51a48a9a user_id:int my_link:contacts.MyLink foreign_link:contacts.ForeignLink = Update;
|
||||
updateActivation#6f690963 user_id:int = Update;
|
||||
updateNewAuthorization#8f06529a auth_key_id:long date:int device:string location:string = Update;
|
||||
|
||||
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
|
||||
|
||||
updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference;
|
||||
updates.difference#f49ca0 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> state:updates.State = updates.Difference;
|
||||
updates.differenceSlice#a8fb1981 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> intermediate_state:updates.State = updates.Difference;
|
||||
|
||||
updatesTooLong#e317af7e = Updates;
|
||||
updateShortMessage#d3f45784 id:int from_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShortChatMessage#2b2fbd4e id:int from_id:int chat_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShort#78d4dec1 update:Update date:int = Updates;
|
||||
updatesCombined#725b04c3 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq_start:int seq:int = Updates;
|
||||
updates#74ae4240 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq:int = Updates;
|
||||
|
||||
photos.photos#8dca6aa5 photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
photos.photosSlice#15051f54 count:int photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
|
||||
photos.photo#20212ca8 photo:Photo users:Vector<User> = photos.Photo;
|
||||
|
||||
upload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File;
|
||||
|
||||
dcOption#2ec2a43c id:int hostname:string ip_address:string port:int = DcOption;
|
||||
|
||||
config#2e54dd74 date:int test_mode:Bool this_dc:int dc_options:Vector<DcOption> chat_size_max:int broadcast_size_max:int = Config;
|
||||
|
||||
nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc;
|
||||
|
||||
help.appUpdate#8987f311 id:int critical:Bool url:string text:string = help.AppUpdate;
|
||||
help.noAppUpdate#c45a6536 = help.AppUpdate;
|
||||
|
||||
help.inviteText#18cb9f78 message:string = help.InviteText;
|
||||
|
||||
messages.statedMessagesLinks#3e74f5c6 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessageLink#a9af2881 message:Message chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessageLink#e9db4a3f id:int date:int pts:int seq:int links:Vector<contacts.Link> = messages.SentMessage;
|
||||
|
||||
inputGeoChat#74d456fa chat_id:int access_hash:long = InputGeoChat;
|
||||
|
||||
inputNotifyGeoChatPeer#4d8ddec8 peer:InputGeoChat = InputNotifyPeer;
|
||||
|
||||
geoChat#75eaea5a id:int access_hash:long title:string address:string venue:string geo:GeoPoint photo:ChatPhoto participants_count:int date:int checked_in:Bool version:int = Chat;
|
||||
|
||||
geoChatMessageEmpty#60311a9b chat_id:int id:int = GeoChatMessage;
|
||||
geoChatMessage#4505f8e1 chat_id:int id:int from_id:int date:int message:string media:MessageMedia = GeoChatMessage;
|
||||
geoChatMessageService#d34fa24e chat_id:int id:int from_id:int date:int action:MessageAction = GeoChatMessage;
|
||||
|
||||
geochats.statedMessage#17b1578b message:GeoChatMessage chats:Vector<Chat> users:Vector<User> seq:int = geochats.StatedMessage;
|
||||
|
||||
geochats.located#48feb267 results:Vector<ChatLocated> messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Located;
|
||||
|
||||
geochats.messages#d1526db1 messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
geochats.messagesSlice#bc5863e8 count:int messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
|
||||
messageActionGeoChatCreate#6f038ebc title:string address:string = MessageAction;
|
||||
messageActionGeoChatCheckin#c7d53de = MessageAction;
|
||||
|
||||
updateNewGeoChatMessage#5a68e3f7 message:GeoChatMessage = Update;
|
||||
|
||||
wallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper;
|
||||
|
||||
updateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update;
|
||||
updateEncryptedChatTyping#1710f156 chat_id:int = Update;
|
||||
updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update;
|
||||
updateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update;
|
||||
|
||||
encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat;
|
||||
encryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat;
|
||||
encryptedChatRequested#c878527e id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;
|
||||
encryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
encryptedChatDiscarded#13d6dd27 id:int = EncryptedChat;
|
||||
|
||||
inputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat;
|
||||
|
||||
encryptedFileEmpty#c21f497e = EncryptedFile;
|
||||
encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile;
|
||||
|
||||
inputEncryptedFileEmpty#1837c364 = InputEncryptedFile;
|
||||
inputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile;
|
||||
inputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile;
|
||||
|
||||
inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage;
|
||||
encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage;
|
||||
|
||||
decryptedMessageLayer#99a438cf layer:int message:DecryptedMessage = DecryptedMessageLayer;
|
||||
|
||||
decryptedMessage#1f814f1f random_id:long random_bytes:bytes message:string media:DecryptedMessageMedia = DecryptedMessage;
|
||||
decryptedMessageService#aa48327d random_id:long random_bytes:bytes action:DecryptedMessageAction = DecryptedMessage;
|
||||
|
||||
decryptedMessageMediaEmpty#89f5c4a = DecryptedMessageMedia;
|
||||
decryptedMessageMediaPhoto#32798a8c thumb:bytes thumb_w:int thumb_h:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaVideo#4cee6ef3 thumb:bytes thumb_w:int thumb_h:int duration:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaGeoPoint#35480a59 lat:double long:double = DecryptedMessageMedia;
|
||||
decryptedMessageMediaContact#588a0a97 phone_number:string first_name:string last_name:string user_id:int = DecryptedMessageMedia;
|
||||
|
||||
decryptedMessageActionSetMessageTTL#a1733aec ttl_seconds:int = DecryptedMessageAction;
|
||||
|
||||
messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig;
|
||||
messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig;
|
||||
|
||||
messages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage;
|
||||
messages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage;
|
||||
|
||||
inputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile;
|
||||
|
||||
inputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile;
|
||||
|
||||
updateChatParticipantAdd#3a0eeb22 chat_id:int user_id:int inviter_id:int version:int = Update;
|
||||
updateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update;
|
||||
updateDcOptions#8e5e9873 dc_options:Vector<DcOption> = Update;
|
||||
|
||||
inputMediaUploadedAudio#61a6d436 file:InputFile duration:int = InputMedia;
|
||||
inputMediaAudio#89938781 id:InputAudio = InputMedia;
|
||||
inputMediaUploadedDocument#34e794bd file:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaUploadedThumbDocument#3e46de5d file:InputFile thumb:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaDocument#d184e841 id:InputDocument = InputMedia;
|
||||
|
||||
messageMediaDocument#2fda2204 document:Document = MessageMedia;
|
||||
messageMediaAudio#c6b68300 audio:Audio = MessageMedia;
|
||||
|
||||
inputAudioEmpty#d95adc84 = InputAudio;
|
||||
inputAudio#77d440ff id:long access_hash:long = InputAudio;
|
||||
|
||||
inputDocumentEmpty#72f0eaae = InputDocument;
|
||||
inputDocument#18798952 id:long access_hash:long = InputDocument;
|
||||
|
||||
inputAudioFileLocation#74dc404d id:long access_hash:long = InputFileLocation;
|
||||
inputDocumentFileLocation#4e45abe9 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
decryptedMessageMediaDocument#b095434b thumb:bytes thumb_w:int thumb_h:int file_name:string mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaAudio#6080758f duration:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
|
||||
audioEmpty#586988d8 id:long = Audio;
|
||||
audio#427425e7 id:long access_hash:long user_id:int date:int duration:int size:int dc_id:int = Audio;
|
||||
|
||||
documentEmpty#36f8c871 id:long = Document;
|
||||
document#9efc6326 id:long access_hash:long user_id:int date:int file_name:string mime_type:string size:int thumb:PhotoSize dc_id:int = Document;
|
||||
|
||||
help.support#17c6b5f6 phone_number:string user:User = help.Support;
|
||||
|
||||
---functions---
|
||||
|
||||
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
|
||||
|
||||
invokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector<long> query:!X = X;
|
||||
|
||||
auth.checkPhone#6fe51dfb phone_number:string = auth.CheckedPhone;
|
||||
auth.sendCode#768d5f4d phone_number:string sms_type:int api_id:int api_hash:string lang_code:string = auth.SentCode;
|
||||
auth.sendCall#3c51564 phone_number:string phone_code_hash:string = Bool;
|
||||
auth.signUp#1b067634 phone_number:string phone_code_hash:string phone_code:string first_name:string last_name:string = auth.Authorization;
|
||||
auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization;
|
||||
auth.logOut#5717da40 = Bool;
|
||||
auth.resetAuthorizations#9fab0d1a = Bool;
|
||||
auth.sendInvites#771c1d97 phone_numbers:Vector<string> message:string = Bool;
|
||||
auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;
|
||||
auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;
|
||||
|
||||
account.registerDevice#446c712c token_type:int token:string device_model:string system_version:string app_version:string app_sandbox:Bool lang_code:string = Bool;
|
||||
account.unregisterDevice#65c55b40 token_type:int token:string = Bool;
|
||||
account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool;
|
||||
account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings;
|
||||
account.resetNotifySettings#db7e1747 = Bool;
|
||||
account.updateProfile#f0888d68 first_name:string last_name:string = User;
|
||||
account.updateStatus#6628562c offline:Bool = Bool;
|
||||
account.getWallPapers#c04cfac2 = Vector<WallPaper>;
|
||||
|
||||
users.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;
|
||||
users.getFullUser#ca30a5b1 id:InputUser = UserFull;
|
||||
|
||||
contacts.getStatuses#c4a353ee = Vector<ContactStatus>;
|
||||
contacts.getContacts#22c6aa08 hash:string = contacts.Contacts;
|
||||
contacts.importContacts#da30b32d contacts:Vector<InputContact> replace:Bool = contacts.ImportedContacts;
|
||||
contacts.search#11f812d8 q:string limit:int = contacts.Found;
|
||||
contacts.getSuggested#cd773428 limit:int = contacts.Suggested;
|
||||
contacts.deleteContact#8e953744 id:InputUser = contacts.Link;
|
||||
contacts.deleteContacts#59ab389e id:Vector<InputUser> = Bool;
|
||||
contacts.block#332b49fc id:InputUser = Bool;
|
||||
contacts.unblock#e54100bd id:InputUser = Bool;
|
||||
contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked;
|
||||
|
||||
messages.getMessages#4222fa74 id:Vector<int> = messages.Messages;
|
||||
messages.getDialogs#eccf1df6 offset:int max_id:int limit:int = messages.Dialogs;
|
||||
messages.getHistory#92a1df2f peer:InputPeer offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.search#7e9f2ab peer:InputPeer q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.readHistory#b04f2510 peer:InputPeer max_id:int offset:int = messages.AffectedHistory;
|
||||
messages.deleteHistory#f4f8fb61 peer:InputPeer offset:int = messages.AffectedHistory;
|
||||
messages.deleteMessages#14f2dd0a id:Vector<int> = Vector<int>;
|
||||
messages.restoreMessages#395f9d7e id:Vector<int> = Vector<int>;
|
||||
messages.receivedMessages#28abcb68 max_id:int = Vector<int>;
|
||||
messages.setTyping#719839e9 peer:InputPeer typing:Bool = Bool;
|
||||
messages.sendMessage#4cde0aab peer:InputPeer message:string random_id:long = messages.SentMessage;
|
||||
messages.sendMedia#a3c85d76 peer:InputPeer media:InputMedia random_id:long = messages.StatedMessage;
|
||||
messages.forwardMessages#514cd10f peer:InputPeer id:Vector<int> = messages.StatedMessages;
|
||||
messages.getChats#3c6aa187 id:Vector<int> = messages.Chats;
|
||||
messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;
|
||||
messages.editChatTitle#b4bc68b5 chat_id:int title:string = messages.StatedMessage;
|
||||
messages.editChatPhoto#d881821d chat_id:int photo:InputChatPhoto = messages.StatedMessage;
|
||||
messages.addChatUser#2ee9ee9e chat_id:int user_id:InputUser fwd_limit:int = messages.StatedMessage;
|
||||
messages.deleteChatUser#c3c5cd23 chat_id:int user_id:InputUser = messages.StatedMessage;
|
||||
messages.createChat#419d9aee users:Vector<InputUser> title:string = messages.StatedMessage;
|
||||
|
||||
updates.getState#edd4882a = updates.State;
|
||||
updates.getDifference#a041495 pts:int date:int qts:int = updates.Difference;
|
||||
|
||||
photos.updateProfilePhoto#eef579a0 id:InputPhoto crop:InputPhotoCrop = UserProfilePhoto;
|
||||
photos.uploadProfilePhoto#d50f9c88 file:InputFile caption:string geo_point:InputGeoPoint crop:InputPhotoCrop = photos.Photo;
|
||||
|
||||
upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool;
|
||||
upload.getFile#e3a6cfb5 location:InputFileLocation offset:int limit:int = upload.File;
|
||||
|
||||
help.getConfig#c4f9186b = Config;
|
||||
help.getNearestDc#1fb33026 = NearestDc;
|
||||
help.getAppUpdate#c812ac7e device_model:string system_version:string app_version:string lang_code:string = help.AppUpdate;
|
||||
help.saveAppLog#6f02f748 events:Vector<InputAppEvent> = Bool;
|
||||
help.getInviteText#a4a95186 lang_code:string = help.InviteText;
|
||||
|
||||
photos.getUserPhotos#b7ee553c user_id:InputUser offset:int max_id:int limit:int = photos.Photos;
|
||||
|
||||
messages.forwardMessage#3f3f4f2 peer:InputPeer id:int random_id:long = messages.StatedMessage;
|
||||
messages.sendBroadcast#41bb0972 contacts:Vector<InputUser> message:string media:InputMedia = messages.StatedMessages;
|
||||
|
||||
geochats.getLocated#7f192d8f geo_point:InputGeoPoint radius:int limit:int = geochats.Located;
|
||||
geochats.getRecents#e1427e6f offset:int limit:int = geochats.Messages;
|
||||
geochats.checkin#55b3e8fb peer:InputGeoChat = geochats.StatedMessage;
|
||||
geochats.getFullChat#6722dd6f peer:InputGeoChat = messages.ChatFull;
|
||||
geochats.editChatTitle#4c8e2273 peer:InputGeoChat title:string address:string = geochats.StatedMessage;
|
||||
geochats.editChatPhoto#35d81a95 peer:InputGeoChat photo:InputChatPhoto = geochats.StatedMessage;
|
||||
geochats.search#cfcdc44d peer:InputGeoChat q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.getHistory#b53f7a68 peer:InputGeoChat offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.setTyping#8b8a729 peer:InputGeoChat typing:Bool = Bool;
|
||||
geochats.sendMessage#61b0044 peer:InputGeoChat message:string random_id:long = geochats.StatedMessage;
|
||||
geochats.sendMedia#b8f0deff peer:InputGeoChat media:InputMedia random_id:long = geochats.StatedMessage;
|
||||
geochats.createGeoChat#e092e16 title:string geo_point:InputGeoPoint address:string venue:string = geochats.StatedMessage;
|
||||
|
||||
messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig;
|
||||
messages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat;
|
||||
messages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
messages.discardEncryption#edd923c5 chat_id:int = Bool;
|
||||
messages.setEncryptedTyping#791451ed peer:InputEncryptedChat typing:Bool = Bool;
|
||||
messages.readEncryptedHistory#7f4b690a peer:InputEncryptedChat max_date:int = Bool;
|
||||
messages.sendEncrypted#a9776773 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedFile#9a901b66 peer:InputEncryptedChat random_id:long data:bytes file:InputEncryptedFile = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.receivedQueue#55a5bb66 max_qts:int = Vector<long>;
|
||||
|
||||
upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool;
|
||||
|
||||
initConnection#69796de9 {X:Type} api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X;
|
||||
|
||||
help.getSupport#9cdf08cd = help.Support;
|
||||
|
||||
invokeWithLayer12#dda60d3c {X:Type} query:!X = X;
|
522
scheme15.tl
522
scheme15.tl
@ -1,522 +0,0 @@
|
||||
int ?= Int;
|
||||
long ?= Long;
|
||||
double ?= Double;
|
||||
string ?= String;
|
||||
|
||||
bytes string = Bytes;
|
||||
|
||||
boolFalse#bc799737 = Bool;
|
||||
boolTrue#997275b5 = Bool;
|
||||
|
||||
vector#1cb5c415 {t:Type} # [ t ] = Vector t;
|
||||
|
||||
error#c4b9f9bb code:int text:string = Error;
|
||||
|
||||
null#56730bcc = Null;
|
||||
|
||||
inputPeerEmpty#7f3b18ea = InputPeer;
|
||||
inputPeerSelf#7da07ec9 = InputPeer;
|
||||
inputPeerContact#1023dbe8 user_id:int = InputPeer;
|
||||
inputPeerForeign#9b447325 user_id:int access_hash:long = InputPeer;
|
||||
inputPeerChat#179be863 chat_id:int = InputPeer;
|
||||
|
||||
inputUserEmpty#b98886cf = InputUser;
|
||||
inputUserSelf#f7c1b13f = InputUser;
|
||||
inputUserContact#86e94f65 user_id:int = InputUser;
|
||||
inputUserForeign#655e74ff user_id:int access_hash:long = InputUser;
|
||||
|
||||
inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact;
|
||||
|
||||
inputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile;
|
||||
|
||||
inputMediaEmpty#9664f57f = InputMedia;
|
||||
inputMediaUploadedPhoto#2dc53a7d file:InputFile = InputMedia;
|
||||
inputMediaPhoto#8f2ab2ec id:InputPhoto = InputMedia;
|
||||
inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;
|
||||
inputMediaContact#a6e45987 phone_number:string first_name:string last_name:string = InputMedia;
|
||||
inputMediaUploadedVideo#133ad6f6 file:InputFile duration:int w:int h:int mime_type:string = InputMedia;
|
||||
inputMediaUploadedThumbVideo#9912dabf file:InputFile thumb:InputFile duration:int w:int h:int mime_type:string = InputMedia;
|
||||
inputMediaVideo#7f023ae6 id:InputVideo = InputMedia;
|
||||
|
||||
inputChatPhotoEmpty#1ca48f57 = InputChatPhoto;
|
||||
inputChatUploadedPhoto#94254732 file:InputFile crop:InputPhotoCrop = InputChatPhoto;
|
||||
inputChatPhoto#b2e1bf08 id:InputPhoto crop:InputPhotoCrop = InputChatPhoto;
|
||||
|
||||
inputGeoPointEmpty#e4c123d6 = InputGeoPoint;
|
||||
inputGeoPoint#f3b7acc9 lat:double long:double = InputGeoPoint;
|
||||
|
||||
inputPhotoEmpty#1cd7bf0d = InputPhoto;
|
||||
inputPhoto#fb95c6c4 id:long access_hash:long = InputPhoto;
|
||||
|
||||
inputVideoEmpty#5508ec75 = InputVideo;
|
||||
inputVideo#ee579652 id:long access_hash:long = InputVideo;
|
||||
|
||||
inputFileLocation#14637196 volume_id:long local_id:int secret:long = InputFileLocation;
|
||||
inputVideoFileLocation#3d0364ec id:long access_hash:long = InputFileLocation;
|
||||
|
||||
inputPhotoCropAuto#ade6b004 = InputPhotoCrop;
|
||||
inputPhotoCrop#d9915325 crop_left:double crop_top:double crop_width:double = InputPhotoCrop;
|
||||
|
||||
inputAppEvent#770656a8 time:double type:string peer:long data:string = InputAppEvent;
|
||||
|
||||
peerUser#9db1bc6d user_id:int = Peer;
|
||||
peerChat#bad0e5bb chat_id:int = Peer;
|
||||
|
||||
storage.fileUnknown#aa963b05 = storage.FileType;
|
||||
storage.fileJpeg#007efe0e = storage.FileType;
|
||||
storage.fileGif#cae1aadf = storage.FileType;
|
||||
storage.filePng#0a4f63c0 = storage.FileType;
|
||||
storage.filePdf#ae1e508d = storage.FileType;
|
||||
storage.fileMp3#528a0677 = storage.FileType;
|
||||
storage.fileMov#4b09ebbc = storage.FileType;
|
||||
storage.filePartial#40bc6f52 = storage.FileType;
|
||||
storage.fileMp4#b3cea0e4 = storage.FileType;
|
||||
storage.fileWebp#1081464c = storage.FileType;
|
||||
|
||||
fileLocationUnavailable#7c596b46 volume_id:long local_id:int secret:long = FileLocation;
|
||||
fileLocation#53d69076 dc_id:int volume_id:long local_id:int secret:long = FileLocation;
|
||||
|
||||
userEmpty#200250ba id:int = User;
|
||||
userSelf#720535ec id:int first_name:string last_name:string phone:string photo:UserProfilePhoto status:UserStatus inactive:Bool = User;
|
||||
userContact#f2fb8319 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userRequest#22e8ceb0 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userForeign#5214c89d id:int first_name:string last_name:string access_hash:long photo:UserProfilePhoto status:UserStatus = User;
|
||||
userDeleted#b29ad7cc id:int first_name:string last_name:string = User;
|
||||
|
||||
userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;
|
||||
userProfilePhoto#d559d8c8 photo_id:long photo_small:FileLocation photo_big:FileLocation = UserProfilePhoto;
|
||||
|
||||
userStatusEmpty#09d05049 = UserStatus;
|
||||
userStatusOnline#edb93949 expires:int = UserStatus;
|
||||
userStatusOffline#008c703f was_online:int = UserStatus;
|
||||
|
||||
chatEmpty#9ba2d800 id:int = Chat;
|
||||
chat#6e9c9bc7 id:int title:string photo:ChatPhoto participants_count:int date:int left:Bool version:int = Chat;
|
||||
chatForbidden#fb0ccc41 id:int title:string date:int = Chat;
|
||||
|
||||
chatFull#630e61be id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings = ChatFull;
|
||||
|
||||
chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;
|
||||
|
||||
chatParticipantsForbidden#0fd2bb8a chat_id:int = ChatParticipants;
|
||||
chatParticipants#7841b415 chat_id:int admin_id:int participants:Vector<ChatParticipant> version:int = ChatParticipants;
|
||||
|
||||
chatPhotoEmpty#37c1011c = ChatPhoto;
|
||||
chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;
|
||||
|
||||
messageEmpty#83e5de54 id:int = Message;
|
||||
message#22eb6aba id:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
messageForwarded#05f46804 id:int fwd_from_id:int fwd_date:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
messageService#9f8d60bb id:int from_id:int to_id:Peer out:Bool unread:Bool date:int action:MessageAction = Message;
|
||||
|
||||
messageMediaEmpty#3ded6320 = MessageMedia;
|
||||
messageMediaPhoto#c8c45a2a photo:Photo = MessageMedia;
|
||||
messageMediaVideo#a2d24290 video:Video = MessageMedia;
|
||||
messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;
|
||||
messageMediaContact#5e7d2f39 phone_number:string first_name:string last_name:string user_id:int = MessageMedia;
|
||||
messageMediaUnsupported#29632a36 bytes:bytes = MessageMedia;
|
||||
|
||||
messageActionEmpty#b6aef7b0 = MessageAction;
|
||||
messageActionChatCreate#a6638b9a title:string users:Vector<int> = MessageAction;
|
||||
messageActionChatEditTitle#b5a1ce5a title:string = MessageAction;
|
||||
messageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction;
|
||||
messageActionChatDeletePhoto#95e3fbef = MessageAction;
|
||||
messageActionChatAddUser#5e3cfc4b user_id:int = MessageAction;
|
||||
messageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction;
|
||||
|
||||
dialog#ab3a99ac peer:Peer top_message:int unread_count:int notify_settings:PeerNotifySettings = Dialog;
|
||||
|
||||
photoEmpty#2331b22d id:long = Photo;
|
||||
photo#22b56751 id:long access_hash:long user_id:int date:int caption:string geo:GeoPoint sizes:Vector<PhotoSize> = Photo;
|
||||
|
||||
photoSizeEmpty#0e17e23c type:string = PhotoSize;
|
||||
photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize;
|
||||
photoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize;
|
||||
|
||||
videoEmpty#c10658a8 id:long = Video;
|
||||
video#388fa391 id:long access_hash:long user_id:int date:int caption:string duration:int mime_type:string size:int thumb:PhotoSize dc_id:int w:int h:int = Video;
|
||||
|
||||
geoPointEmpty#1117dd5f = GeoPoint;
|
||||
geoPoint#2049d70c long:double lat:double = GeoPoint;
|
||||
|
||||
auth.checkedPhone#e300cc3b phone_registered:Bool phone_invited:Bool = auth.CheckedPhone;
|
||||
|
||||
auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;
|
||||
|
||||
auth.authorization#f6b673a4 expires:int user:User = auth.Authorization;
|
||||
|
||||
auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization;
|
||||
|
||||
inputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer;
|
||||
inputNotifyUsers#193b4417 = InputNotifyPeer;
|
||||
inputNotifyChats#4a95e84e = InputNotifyPeer;
|
||||
inputNotifyAll#a429b886 = InputNotifyPeer;
|
||||
|
||||
inputPeerNotifyEventsEmpty#f03064d8 = InputPeerNotifyEvents;
|
||||
inputPeerNotifyEventsAll#e86a2c74 = InputPeerNotifyEvents;
|
||||
|
||||
inputPeerNotifySettings#46a2ce98 mute_until:int sound:string show_previews:Bool events_mask:int = InputPeerNotifySettings;
|
||||
|
||||
peerNotifyEventsEmpty#add53cb3 = PeerNotifyEvents;
|
||||
peerNotifyEventsAll#6d1ded88 = PeerNotifyEvents;
|
||||
|
||||
peerNotifySettingsEmpty#70a68512 = PeerNotifySettings;
|
||||
peerNotifySettings#8d5e11ee mute_until:int sound:string show_previews:Bool events_mask:int = PeerNotifySettings;
|
||||
|
||||
wallPaper#ccb03657 id:int title:string sizes:Vector<PhotoSize> color:int = WallPaper;
|
||||
|
||||
userFull#771095da user:User link:contacts.Link profile_photo:Photo notify_settings:PeerNotifySettings blocked:Bool real_first_name:string real_last_name:string = UserFull;
|
||||
|
||||
contact#f911c994 user_id:int mutual:Bool = Contact;
|
||||
|
||||
importedContact#d0028438 user_id:int client_id:long = ImportedContact;
|
||||
|
||||
contactBlocked#561bc879 user_id:int date:int = ContactBlocked;
|
||||
|
||||
contactFound#ea879f95 user_id:int = ContactFound;
|
||||
|
||||
contactSuggested#3de191a1 user_id:int mutual_contacts:int = ContactSuggested;
|
||||
|
||||
contactStatus#aa77b873 user_id:int expires:int = ContactStatus;
|
||||
|
||||
chatLocated#3631cf4c chat_id:int distance:int = ChatLocated;
|
||||
|
||||
contacts.foreignLinkUnknown#133421f8 = contacts.ForeignLink;
|
||||
contacts.foreignLinkRequested#a7801f47 has_phone:Bool = contacts.ForeignLink;
|
||||
contacts.foreignLinkMutual#1bea8ce1 = contacts.ForeignLink;
|
||||
|
||||
contacts.myLinkEmpty#d22a1c60 = contacts.MyLink;
|
||||
contacts.myLinkRequested#6c69efee contact:Bool = contacts.MyLink;
|
||||
contacts.myLinkContact#c240ebd9 = contacts.MyLink;
|
||||
|
||||
contacts.link#eccea3f5 my_link:contacts.MyLink foreign_link:contacts.ForeignLink user:User = contacts.Link;
|
||||
|
||||
contacts.contacts#6f8b8cb2 contacts:Vector<Contact> users:Vector<User> = contacts.Contacts;
|
||||
contacts.contactsNotModified#b74ba9d2 = contacts.Contacts;
|
||||
|
||||
contacts.importedContacts#ad524315 imported:Vector<ImportedContact> retry_contacts:Vector<long> users:Vector<User> = contacts.ImportedContacts;
|
||||
|
||||
contacts.blocked#1c138d15 blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
contacts.blockedSlice#900802a1 count:int blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
|
||||
contacts.found#0566000e results:Vector<ContactFound> users:Vector<User> = contacts.Found;
|
||||
|
||||
contacts.suggested#5649dcc5 results:Vector<ContactSuggested> users:Vector<User> = contacts.Suggested;
|
||||
|
||||
messages.dialogs#15ba6c40 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
messages.dialogsSlice#71e094f3 count:int dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
|
||||
messages.messages#8c718e87 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
messages.messagesSlice#0b446ae3 count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
|
||||
messages.messageEmpty#3f4e0648 = messages.Message;
|
||||
messages.message#ff90c417 message:Message chats:Vector<Chat> users:Vector<User> = messages.Message;
|
||||
|
||||
messages.statedMessages#969478bb messages:Vector<Message> chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessage#d07ae726 message:Message chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessage#d1f4d35c id:int date:int pts:int seq:int = messages.SentMessage;
|
||||
|
||||
messages.chat#40e9002a chat:Chat users:Vector<User> = messages.Chat;
|
||||
|
||||
messages.chats#8150cbd8 chats:Vector<Chat> users:Vector<User> = messages.Chats;
|
||||
|
||||
messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector<Chat> users:Vector<User> = messages.ChatFull;
|
||||
|
||||
messages.affectedHistory#b7de36f2 pts:int seq:int offset:int = messages.AffectedHistory;
|
||||
|
||||
inputMessagesFilterEmpty#57e2f66c = MessagesFilter;
|
||||
inputMessagesFilterPhotos#9609a51c = MessagesFilter;
|
||||
inputMessagesFilterVideo#9fc00e65 = MessagesFilter;
|
||||
inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter;
|
||||
inputMessagesFilterDocument#9eddf188 = MessagesFilter;
|
||||
inputMessagesFilterAudio#cfc87522 = MessagesFilter;
|
||||
|
||||
updateNewMessage#013abdb3 message:Message pts:int = Update;
|
||||
updateMessageID#4e90bfd6 id:int random_id:long = Update;
|
||||
updateReadMessages#c6649e31 messages:Vector<int> pts:int = Update;
|
||||
updateDeleteMessages#a92bfe26 messages:Vector<int> pts:int = Update;
|
||||
updateRestoreMessages#d15de04d messages:Vector<int> pts:int = Update;
|
||||
updateUserTyping#6baa8508 user_id:int = Update;
|
||||
updateChatUserTyping#3c46cfe6 chat_id:int user_id:int = Update;
|
||||
updateChatParticipants#07761198 participants:ChatParticipants = Update;
|
||||
updateUserStatus#1bfbd823 user_id:int status:UserStatus = Update;
|
||||
updateUserName#da22d9ad user_id:int first_name:string last_name:string = Update;
|
||||
updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update;
|
||||
updateContactRegistered#2575bbb9 user_id:int date:int = Update;
|
||||
updateContactLink#51a48a9a user_id:int my_link:contacts.MyLink foreign_link:contacts.ForeignLink = Update;
|
||||
updateActivation#6f690963 user_id:int = Update;
|
||||
updateNewAuthorization#8f06529a auth_key_id:long date:int device:string location:string = Update;
|
||||
|
||||
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
|
||||
|
||||
updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference;
|
||||
updates.difference#00f49ca0 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> state:updates.State = updates.Difference;
|
||||
updates.differenceSlice#a8fb1981 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> intermediate_state:updates.State = updates.Difference;
|
||||
|
||||
updatesTooLong#e317af7e = Updates;
|
||||
updateShortMessage#d3f45784 id:int from_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShortChatMessage#2b2fbd4e id:int from_id:int chat_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShort#78d4dec1 update:Update date:int = Updates;
|
||||
updatesCombined#725b04c3 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq_start:int seq:int = Updates;
|
||||
updates#74ae4240 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq:int = Updates;
|
||||
|
||||
photos.photos#8dca6aa5 photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
photos.photosSlice#15051f54 count:int photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
|
||||
photos.photo#20212ca8 photo:Photo users:Vector<User> = photos.Photo;
|
||||
|
||||
upload.file#096a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File;
|
||||
|
||||
dcOption#2ec2a43c id:int hostname:string ip_address:string port:int = DcOption;
|
||||
|
||||
config#2e54dd74 date:int test_mode:Bool this_dc:int dc_options:Vector<DcOption> chat_size_max:int broadcast_size_max:int = Config;
|
||||
|
||||
nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc;
|
||||
|
||||
help.appUpdate#8987f311 id:int critical:Bool url:string text:string = help.AppUpdate;
|
||||
help.noAppUpdate#c45a6536 = help.AppUpdate;
|
||||
|
||||
help.inviteText#18cb9f78 message:string = help.InviteText;
|
||||
|
||||
messages.statedMessagesLinks#3e74f5c6 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessageLink#a9af2881 message:Message chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessageLink#e9db4a3f id:int date:int pts:int seq:int links:Vector<contacts.Link> = messages.SentMessage;
|
||||
|
||||
inputGeoChat#74d456fa chat_id:int access_hash:long = InputGeoChat;
|
||||
|
||||
inputNotifyGeoChatPeer#4d8ddec8 peer:InputGeoChat = InputNotifyPeer;
|
||||
|
||||
geoChat#75eaea5a id:int access_hash:long title:string address:string venue:string geo:GeoPoint photo:ChatPhoto participants_count:int date:int checked_in:Bool version:int = Chat;
|
||||
|
||||
geoChatMessageEmpty#60311a9b chat_id:int id:int = GeoChatMessage;
|
||||
geoChatMessage#4505f8e1 chat_id:int id:int from_id:int date:int message:string media:MessageMedia = GeoChatMessage;
|
||||
geoChatMessageService#d34fa24e chat_id:int id:int from_id:int date:int action:MessageAction = GeoChatMessage;
|
||||
|
||||
geochats.statedMessage#17b1578b message:GeoChatMessage chats:Vector<Chat> users:Vector<User> seq:int = geochats.StatedMessage;
|
||||
|
||||
geochats.located#48feb267 results:Vector<ChatLocated> messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Located;
|
||||
|
||||
geochats.messages#d1526db1 messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
geochats.messagesSlice#bc5863e8 count:int messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
|
||||
messageActionGeoChatCreate#6f038ebc title:string address:string = MessageAction;
|
||||
messageActionGeoChatCheckin#0c7d53de = MessageAction;
|
||||
|
||||
updateNewGeoChatMessage#5a68e3f7 message:GeoChatMessage = Update;
|
||||
|
||||
wallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper;
|
||||
|
||||
updateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update;
|
||||
updateEncryptedChatTyping#1710f156 chat_id:int = Update;
|
||||
updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update;
|
||||
updateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update;
|
||||
|
||||
encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat;
|
||||
encryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat;
|
||||
encryptedChatRequested#c878527e id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;
|
||||
encryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
encryptedChatDiscarded#13d6dd27 id:int = EncryptedChat;
|
||||
|
||||
inputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat;
|
||||
|
||||
encryptedFileEmpty#c21f497e = EncryptedFile;
|
||||
encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile;
|
||||
|
||||
inputEncryptedFileEmpty#1837c364 = InputEncryptedFile;
|
||||
inputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile;
|
||||
inputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile;
|
||||
|
||||
inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage;
|
||||
encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage;
|
||||
|
||||
decryptedMessageLayer#99a438cf layer:int message:DecryptedMessage = DecryptedMessageLayer;
|
||||
|
||||
decryptedMessage#1f814f1f random_id:long random_bytes:bytes message:string media:DecryptedMessageMedia = DecryptedMessage;
|
||||
decryptedMessageService#aa48327d random_id:long random_bytes:bytes action:DecryptedMessageAction = DecryptedMessage;
|
||||
|
||||
decryptedMessageMediaEmpty#089f5c4a = DecryptedMessageMedia;
|
||||
decryptedMessageMediaPhoto#32798a8c thumb:bytes thumb_w:int thumb_h:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaVideo#524a415d thumb:bytes thumb_w:int thumb_h:int duration:int mime_type:string w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaGeoPoint#35480a59 lat:double long:double = DecryptedMessageMedia;
|
||||
decryptedMessageMediaContact#588a0a97 phone_number:string first_name:string last_name:string user_id:int = DecryptedMessageMedia;
|
||||
|
||||
decryptedMessageActionSetMessageTTL#a1733aec ttl_seconds:int = DecryptedMessageAction;
|
||||
|
||||
messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig;
|
||||
messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig;
|
||||
|
||||
messages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage;
|
||||
messages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage;
|
||||
|
||||
inputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile;
|
||||
|
||||
inputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile;
|
||||
|
||||
updateChatParticipantAdd#3a0eeb22 chat_id:int user_id:int inviter_id:int version:int = Update;
|
||||
updateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update;
|
||||
updateDcOptions#8e5e9873 dc_options:Vector<DcOption> = Update;
|
||||
|
||||
inputMediaUploadedAudio#4e498cab file:InputFile duration:int mime_type:string = InputMedia;
|
||||
inputMediaAudio#89938781 id:InputAudio = InputMedia;
|
||||
inputMediaUploadedDocument#34e794bd file:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaUploadedThumbDocument#3e46de5d file:InputFile thumb:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaDocument#d184e841 id:InputDocument = InputMedia;
|
||||
|
||||
messageMediaDocument#2fda2204 document:Document = MessageMedia;
|
||||
messageMediaAudio#c6b68300 audio:Audio = MessageMedia;
|
||||
|
||||
inputAudioEmpty#d95adc84 = InputAudio;
|
||||
inputAudio#77d440ff id:long access_hash:long = InputAudio;
|
||||
|
||||
inputDocumentEmpty#72f0eaae = InputDocument;
|
||||
inputDocument#18798952 id:long access_hash:long = InputDocument;
|
||||
|
||||
inputAudioFileLocation#74dc404d id:long access_hash:long = InputFileLocation;
|
||||
inputDocumentFileLocation#4e45abe9 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
decryptedMessageMediaDocument#b095434b thumb:bytes thumb_w:int thumb_h:int file_name:string mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
decryptedMessageMediaAudio#57e0a9cb duration:int mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
|
||||
|
||||
audioEmpty#586988d8 id:long = Audio;
|
||||
audio#c7ac6496 id:long access_hash:long user_id:int date:int duration:int mime_type:string size:int dc_id:int = Audio;
|
||||
|
||||
documentEmpty#36f8c871 id:long = Document;
|
||||
document#9efc6326 id:long access_hash:long user_id:int date:int file_name:string mime_type:string size:int thumb:PhotoSize dc_id:int = Document;
|
||||
|
||||
help.support#17c6b5f6 phone_number:string user:User = help.Support;
|
||||
|
||||
decryptedMessageActionReadMessages#0c4f40be random_ids:Vector<long> = DecryptedMessageAction;
|
||||
decryptedMessageActionDeleteMessages#65614304 random_ids:Vector<long> = DecryptedMessageAction;
|
||||
decryptedMessageActionScreenshotMessages#8ac1f475 random_ids:Vector<long> = DecryptedMessageAction;
|
||||
decryptedMessageActionFlushHistory#6719e45c = DecryptedMessageAction;
|
||||
decryptedMessageActionNotifyLayer#f3048883 layer:int = DecryptedMessageAction;
|
||||
|
||||
notifyPeer#9fd40bd8 peer:Peer = NotifyPeer;
|
||||
notifyUsers#b4c83b4c = NotifyPeer;
|
||||
notifyChats#c007cec3 = NotifyPeer;
|
||||
notifyAll#74d07c60 = NotifyPeer;
|
||||
|
||||
updateUserBlocked#80ece81a user_id:int blocked:Bool = Update;
|
||||
updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update;
|
||||
|
||||
za int = Z 0;
|
||||
zb {n:#} int %(Vector int) = Z (n + 1);
|
||||
|
||||
---functions---
|
||||
|
||||
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
|
||||
|
||||
invokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector<long> query:!X = X;
|
||||
|
||||
auth.checkPhone#6fe51dfb phone_number:string = auth.CheckedPhone;
|
||||
auth.sendCode#768d5f4d phone_number:string sms_type:int api_id:int api_hash:string lang_code:string = auth.SentCode;
|
||||
auth.sendCall#03c51564 phone_number:string phone_code_hash:string = Bool;
|
||||
auth.signUp#1b067634 phone_number:string phone_code_hash:string phone_code:string first_name:string last_name:string = auth.Authorization;
|
||||
auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization;
|
||||
auth.logOut#5717da40 = Bool;
|
||||
auth.resetAuthorizations#9fab0d1a = Bool;
|
||||
auth.sendInvites#771c1d97 phone_numbers:Vector<string> message:string = Bool;
|
||||
auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;
|
||||
auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;
|
||||
|
||||
account.registerDevice#446c712c token_type:int token:string device_model:string system_version:string app_version:string app_sandbox:Bool lang_code:string = Bool;
|
||||
account.unregisterDevice#65c55b40 token_type:int token:string = Bool;
|
||||
account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool;
|
||||
account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings;
|
||||
account.resetNotifySettings#db7e1747 = Bool;
|
||||
account.updateProfile#f0888d68 first_name:string last_name:string = User;
|
||||
account.updateStatus#6628562c offline:Bool = Bool;
|
||||
account.getWallPapers#c04cfac2 = Vector<WallPaper>;
|
||||
|
||||
users.getUsers#0d91a548 id:Vector<InputUser> = Vector<User>;
|
||||
users.getFullUser#ca30a5b1 id:InputUser = UserFull;
|
||||
|
||||
contacts.getStatuses#c4a353ee = Vector<ContactStatus>;
|
||||
contacts.getContacts#22c6aa08 hash:string = contacts.Contacts;
|
||||
contacts.importContacts#da30b32d contacts:Vector<InputContact> replace:Bool = contacts.ImportedContacts;
|
||||
contacts.search#11f812d8 q:string limit:int = contacts.Found;
|
||||
contacts.getSuggested#cd773428 limit:int = contacts.Suggested;
|
||||
contacts.deleteContact#8e953744 id:InputUser = contacts.Link;
|
||||
contacts.deleteContacts#59ab389e id:Vector<InputUser> = Bool;
|
||||
contacts.block#332b49fc id:InputUser = Bool;
|
||||
contacts.unblock#e54100bd id:InputUser = Bool;
|
||||
contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked;
|
||||
|
||||
messages.getMessages#4222fa74 id:Vector<int> = messages.Messages;
|
||||
messages.getDialogs#eccf1df6 offset:int max_id:int limit:int = messages.Dialogs;
|
||||
messages.getHistory#92a1df2f peer:InputPeer offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.search#07e9f2ab peer:InputPeer q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.readHistory#b04f2510 peer:InputPeer max_id:int offset:int = messages.AffectedHistory;
|
||||
messages.deleteHistory#f4f8fb61 peer:InputPeer offset:int = messages.AffectedHistory;
|
||||
messages.deleteMessages#14f2dd0a id:Vector<int> = Vector<int>;
|
||||
messages.restoreMessages#395f9d7e id:Vector<int> = Vector<int>;
|
||||
messages.receivedMessages#28abcb68 max_id:int = Vector<int>;
|
||||
messages.setTyping#719839e9 peer:InputPeer typing:Bool = Bool;
|
||||
messages.sendMessage#4cde0aab peer:InputPeer message:string random_id:long = messages.SentMessage;
|
||||
messages.sendMedia#a3c85d76 peer:InputPeer media:InputMedia random_id:long = messages.StatedMessage;
|
||||
messages.forwardMessages#514cd10f peer:InputPeer id:Vector<int> = messages.StatedMessages;
|
||||
messages.getChats#3c6aa187 id:Vector<int> = messages.Chats;
|
||||
messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;
|
||||
messages.editChatTitle#b4bc68b5 chat_id:int title:string = messages.StatedMessage;
|
||||
messages.editChatPhoto#d881821d chat_id:int photo:InputChatPhoto = messages.StatedMessage;
|
||||
messages.addChatUser#2ee9ee9e chat_id:int user_id:InputUser fwd_limit:int = messages.StatedMessage;
|
||||
messages.deleteChatUser#c3c5cd23 chat_id:int user_id:InputUser = messages.StatedMessage;
|
||||
messages.createChat#419d9aee users:Vector<InputUser> title:string = messages.StatedMessage;
|
||||
|
||||
updates.getState#edd4882a = updates.State;
|
||||
updates.getDifference#0a041495 pts:int date:int qts:int = updates.Difference;
|
||||
|
||||
photos.updateProfilePhoto#eef579a0 id:InputPhoto crop:InputPhotoCrop = UserProfilePhoto;
|
||||
photos.uploadProfilePhoto#d50f9c88 file:InputFile caption:string geo_point:InputGeoPoint crop:InputPhotoCrop = photos.Photo;
|
||||
|
||||
upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool;
|
||||
upload.getFile#e3a6cfb5 location:InputFileLocation offset:int limit:int = upload.File;
|
||||
|
||||
help.getConfig#c4f9186b = Config;
|
||||
help.getNearestDc#1fb33026 = NearestDc;
|
||||
help.getAppUpdate#c812ac7e device_model:string system_version:string app_version:string lang_code:string = help.AppUpdate;
|
||||
help.saveAppLog#6f02f748 events:Vector<InputAppEvent> = Bool;
|
||||
help.getInviteText#a4a95186 lang_code:string = help.InviteText;
|
||||
|
||||
photos.getUserPhotos#b7ee553c user_id:InputUser offset:int max_id:int limit:int = photos.Photos;
|
||||
|
||||
messages.forwardMessage#03f3f4f2 peer:InputPeer id:int random_id:long = messages.StatedMessage;
|
||||
messages.sendBroadcast#41bb0972 contacts:Vector<InputUser> message:string media:InputMedia = messages.StatedMessages;
|
||||
|
||||
geochats.getLocated#7f192d8f geo_point:InputGeoPoint radius:int limit:int = geochats.Located;
|
||||
geochats.getRecents#e1427e6f offset:int limit:int = geochats.Messages;
|
||||
geochats.checkin#55b3e8fb peer:InputGeoChat = geochats.StatedMessage;
|
||||
geochats.getFullChat#6722dd6f peer:InputGeoChat = messages.ChatFull;
|
||||
geochats.editChatTitle#4c8e2273 peer:InputGeoChat title:string address:string = geochats.StatedMessage;
|
||||
geochats.editChatPhoto#35d81a95 peer:InputGeoChat photo:InputChatPhoto = geochats.StatedMessage;
|
||||
geochats.search#cfcdc44d peer:InputGeoChat q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.getHistory#b53f7a68 peer:InputGeoChat offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.setTyping#08b8a729 peer:InputGeoChat typing:Bool = Bool;
|
||||
geochats.sendMessage#061b0044 peer:InputGeoChat message:string random_id:long = geochats.StatedMessage;
|
||||
geochats.sendMedia#b8f0deff peer:InputGeoChat media:InputMedia random_id:long = geochats.StatedMessage;
|
||||
geochats.createGeoChat#0e092e16 title:string geo_point:InputGeoPoint address:string venue:string = geochats.StatedMessage;
|
||||
|
||||
messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig;
|
||||
messages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat;
|
||||
messages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
messages.discardEncryption#edd923c5 chat_id:int = Bool;
|
||||
messages.setEncryptedTyping#791451ed peer:InputEncryptedChat typing:Bool = Bool;
|
||||
messages.readEncryptedHistory#7f4b690a peer:InputEncryptedChat max_date:int = Bool;
|
||||
messages.sendEncrypted#a9776773 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedFile#9a901b66 peer:InputEncryptedChat random_id:long data:bytes file:InputEncryptedFile = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.receivedQueue#55a5bb66 max_qts:int = Vector<long>;
|
||||
|
||||
upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool;
|
||||
|
||||
initConnection#69796de9 {X:Type} api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X;
|
||||
|
||||
help.getSupport#9cdf08cd = help.Support;
|
||||
|
||||
invokeWithLayer15#b4418b64 {X:Type} query:!X = X;
|
504
scheme16.tl
504
scheme16.tl
@ -1,504 +0,0 @@
|
||||
int ?= Int;
|
||||
long ?= Long;
|
||||
double ?= Double;
|
||||
string ?= String;
|
||||
|
||||
bytes string = Bytes;
|
||||
|
||||
boolFalse#bc799737 = Bool;
|
||||
boolTrue#997275b5 = Bool;
|
||||
|
||||
vector#1cb5c415 {t:Type} # [ t ] = Vector t;
|
||||
|
||||
error#c4b9f9bb code:int text:string = Error;
|
||||
|
||||
null#56730bcc = Null;
|
||||
|
||||
inputPeerEmpty#7f3b18ea = InputPeer;
|
||||
inputPeerSelf#7da07ec9 = InputPeer;
|
||||
inputPeerContact#1023dbe8 user_id:int = InputPeer;
|
||||
inputPeerForeign#9b447325 user_id:int access_hash:long = InputPeer;
|
||||
inputPeerChat#179be863 chat_id:int = InputPeer;
|
||||
|
||||
inputUserEmpty#b98886cf = InputUser;
|
||||
inputUserSelf#f7c1b13f = InputUser;
|
||||
inputUserContact#86e94f65 user_id:int = InputUser;
|
||||
inputUserForeign#655e74ff user_id:int access_hash:long = InputUser;
|
||||
|
||||
inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact;
|
||||
|
||||
inputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile;
|
||||
|
||||
inputMediaEmpty#9664f57f = InputMedia;
|
||||
inputMediaUploadedPhoto#2dc53a7d file:InputFile = InputMedia;
|
||||
inputMediaPhoto#8f2ab2ec id:InputPhoto = InputMedia;
|
||||
inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;
|
||||
inputMediaContact#a6e45987 phone_number:string first_name:string last_name:string = InputMedia;
|
||||
inputMediaUploadedVideo#133ad6f6 file:InputFile duration:int w:int h:int mime_type:string = InputMedia;
|
||||
inputMediaUploadedThumbVideo#9912dabf file:InputFile thumb:InputFile duration:int w:int h:int mime_type:string = InputMedia;
|
||||
inputMediaVideo#7f023ae6 id:InputVideo = InputMedia;
|
||||
|
||||
inputChatPhotoEmpty#1ca48f57 = InputChatPhoto;
|
||||
inputChatUploadedPhoto#94254732 file:InputFile crop:InputPhotoCrop = InputChatPhoto;
|
||||
inputChatPhoto#b2e1bf08 id:InputPhoto crop:InputPhotoCrop = InputChatPhoto;
|
||||
|
||||
inputGeoPointEmpty#e4c123d6 = InputGeoPoint;
|
||||
inputGeoPoint#f3b7acc9 lat:double long:double = InputGeoPoint;
|
||||
|
||||
inputPhotoEmpty#1cd7bf0d = InputPhoto;
|
||||
inputPhoto#fb95c6c4 id:long access_hash:long = InputPhoto;
|
||||
|
||||
inputVideoEmpty#5508ec75 = InputVideo;
|
||||
inputVideo#ee579652 id:long access_hash:long = InputVideo;
|
||||
|
||||
inputFileLocation#14637196 volume_id:long local_id:int secret:long = InputFileLocation;
|
||||
inputVideoFileLocation#3d0364ec id:long access_hash:long = InputFileLocation;
|
||||
|
||||
inputPhotoCropAuto#ade6b004 = InputPhotoCrop;
|
||||
inputPhotoCrop#d9915325 crop_left:double crop_top:double crop_width:double = InputPhotoCrop;
|
||||
|
||||
inputAppEvent#770656a8 time:double type:string peer:long data:string = InputAppEvent;
|
||||
|
||||
peerUser#9db1bc6d user_id:int = Peer;
|
||||
peerChat#bad0e5bb chat_id:int = Peer;
|
||||
|
||||
storage.fileUnknown#aa963b05 = storage.FileType;
|
||||
storage.fileJpeg#7efe0e = storage.FileType;
|
||||
storage.fileGif#cae1aadf = storage.FileType;
|
||||
storage.filePng#a4f63c0 = storage.FileType;
|
||||
storage.filePdf#ae1e508d = storage.FileType;
|
||||
storage.fileMp3#528a0677 = storage.FileType;
|
||||
storage.fileMov#4b09ebbc = storage.FileType;
|
||||
storage.filePartial#40bc6f52 = storage.FileType;
|
||||
storage.fileMp4#b3cea0e4 = storage.FileType;
|
||||
storage.fileWebp#1081464c = storage.FileType;
|
||||
|
||||
fileLocationUnavailable#7c596b46 volume_id:long local_id:int secret:long = FileLocation;
|
||||
fileLocation#53d69076 dc_id:int volume_id:long local_id:int secret:long = FileLocation;
|
||||
|
||||
userEmpty#200250ba id:int = User;
|
||||
userSelf#720535ec id:int first_name:string last_name:string phone:string photo:UserProfilePhoto status:UserStatus inactive:Bool = User;
|
||||
userContact#f2fb8319 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userRequest#22e8ceb0 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userForeign#5214c89d id:int first_name:string last_name:string access_hash:long photo:UserProfilePhoto status:UserStatus = User;
|
||||
userDeleted#b29ad7cc id:int first_name:string last_name:string = User;
|
||||
|
||||
userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;
|
||||
userProfilePhoto#d559d8c8 photo_id:long photo_small:FileLocation photo_big:FileLocation = UserProfilePhoto;
|
||||
|
||||
userStatusEmpty#9d05049 = UserStatus;
|
||||
userStatusOnline#edb93949 expires:int = UserStatus;
|
||||
userStatusOffline#8c703f was_online:int = UserStatus;
|
||||
|
||||
chatEmpty#9ba2d800 id:int = Chat;
|
||||
chat#6e9c9bc7 id:int title:string photo:ChatPhoto participants_count:int date:int left:Bool version:int = Chat;
|
||||
chatForbidden#fb0ccc41 id:int title:string date:int = Chat;
|
||||
|
||||
chatFull#630e61be id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings = ChatFull;
|
||||
|
||||
chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;
|
||||
|
||||
chatParticipantsForbidden#fd2bb8a chat_id:int = ChatParticipants;
|
||||
chatParticipants#7841b415 chat_id:int admin_id:int participants:Vector<ChatParticipant> version:int = ChatParticipants;
|
||||
|
||||
chatPhotoEmpty#37c1011c = ChatPhoto;
|
||||
chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;
|
||||
|
||||
messageEmpty#83e5de54 id:int = Message;
|
||||
message#22eb6aba id:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
messageForwarded#5f46804 id:int fwd_from_id:int fwd_date:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
messageService#9f8d60bb id:int from_id:int to_id:Peer out:Bool unread:Bool date:int action:MessageAction = Message;
|
||||
|
||||
messageMediaEmpty#3ded6320 = MessageMedia;
|
||||
messageMediaPhoto#c8c45a2a photo:Photo = MessageMedia;
|
||||
messageMediaVideo#a2d24290 video:Video = MessageMedia;
|
||||
messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;
|
||||
messageMediaContact#5e7d2f39 phone_number:string first_name:string last_name:string user_id:int = MessageMedia;
|
||||
messageMediaUnsupported#29632a36 bytes:bytes = MessageMedia;
|
||||
|
||||
messageActionEmpty#b6aef7b0 = MessageAction;
|
||||
messageActionChatCreate#a6638b9a title:string users:Vector<int> = MessageAction;
|
||||
messageActionChatEditTitle#b5a1ce5a title:string = MessageAction;
|
||||
messageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction;
|
||||
messageActionChatDeletePhoto#95e3fbef = MessageAction;
|
||||
messageActionChatAddUser#5e3cfc4b user_id:int = MessageAction;
|
||||
messageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction;
|
||||
|
||||
dialog#ab3a99ac peer:Peer top_message:int unread_count:int notify_settings:PeerNotifySettings = Dialog;
|
||||
|
||||
photoEmpty#2331b22d id:long = Photo;
|
||||
photo#22b56751 id:long access_hash:long user_id:int date:int caption:string geo:GeoPoint sizes:Vector<PhotoSize> = Photo;
|
||||
|
||||
photoSizeEmpty#e17e23c type:string = PhotoSize;
|
||||
photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize;
|
||||
photoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize;
|
||||
|
||||
videoEmpty#c10658a8 id:long = Video;
|
||||
video#388fa391 id:long access_hash:long user_id:int date:int caption:string duration:int mime_type:string size:int thumb:PhotoSize dc_id:int w:int h:int = Video;
|
||||
|
||||
geoPointEmpty#1117dd5f = GeoPoint;
|
||||
geoPoint#2049d70c long:double lat:double = GeoPoint;
|
||||
|
||||
auth.checkedPhone#e300cc3b phone_registered:Bool phone_invited:Bool = auth.CheckedPhone;
|
||||
|
||||
auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;
|
||||
|
||||
auth.authorization#f6b673a4 expires:int user:User = auth.Authorization;
|
||||
|
||||
auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization;
|
||||
|
||||
inputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer;
|
||||
inputNotifyUsers#193b4417 = InputNotifyPeer;
|
||||
inputNotifyChats#4a95e84e = InputNotifyPeer;
|
||||
inputNotifyAll#a429b886 = InputNotifyPeer;
|
||||
|
||||
inputPeerNotifyEventsEmpty#f03064d8 = InputPeerNotifyEvents;
|
||||
inputPeerNotifyEventsAll#e86a2c74 = InputPeerNotifyEvents;
|
||||
|
||||
inputPeerNotifySettings#46a2ce98 mute_until:int sound:string show_previews:Bool events_mask:int = InputPeerNotifySettings;
|
||||
|
||||
peerNotifyEventsEmpty#add53cb3 = PeerNotifyEvents;
|
||||
peerNotifyEventsAll#6d1ded88 = PeerNotifyEvents;
|
||||
|
||||
peerNotifySettingsEmpty#70a68512 = PeerNotifySettings;
|
||||
peerNotifySettings#8d5e11ee mute_until:int sound:string show_previews:Bool events_mask:int = PeerNotifySettings;
|
||||
|
||||
wallPaper#ccb03657 id:int title:string sizes:Vector<PhotoSize> color:int = WallPaper;
|
||||
|
||||
userFull#771095da user:User link:contacts.Link profile_photo:Photo notify_settings:PeerNotifySettings blocked:Bool real_first_name:string real_last_name:string = UserFull;
|
||||
|
||||
contact#f911c994 user_id:int mutual:Bool = Contact;
|
||||
|
||||
importedContact#d0028438 user_id:int client_id:long = ImportedContact;
|
||||
|
||||
contactBlocked#561bc879 user_id:int date:int = ContactBlocked;
|
||||
|
||||
contactFound#ea879f95 user_id:int = ContactFound;
|
||||
|
||||
contactSuggested#3de191a1 user_id:int mutual_contacts:int = ContactSuggested;
|
||||
|
||||
contactStatus#aa77b873 user_id:int expires:int = ContactStatus;
|
||||
|
||||
chatLocated#3631cf4c chat_id:int distance:int = ChatLocated;
|
||||
|
||||
contacts.foreignLinkUnknown#133421f8 = contacts.ForeignLink;
|
||||
contacts.foreignLinkRequested#a7801f47 has_phone:Bool = contacts.ForeignLink;
|
||||
contacts.foreignLinkMutual#1bea8ce1 = contacts.ForeignLink;
|
||||
|
||||
contacts.myLinkEmpty#d22a1c60 = contacts.MyLink;
|
||||
contacts.myLinkRequested#6c69efee contact:Bool = contacts.MyLink;
|
||||
contacts.myLinkContact#c240ebd9 = contacts.MyLink;
|
||||
|
||||
contacts.link#eccea3f5 my_link:contacts.MyLink foreign_link:contacts.ForeignLink user:User = contacts.Link;
|
||||
|
||||
contacts.contacts#6f8b8cb2 contacts:Vector<Contact> users:Vector<User> = contacts.Contacts;
|
||||
contacts.contactsNotModified#b74ba9d2 = contacts.Contacts;
|
||||
|
||||
contacts.importedContacts#ad524315 imported:Vector<ImportedContact> retry_contacts:Vector<long> users:Vector<User> = contacts.ImportedContacts;
|
||||
|
||||
contacts.blocked#1c138d15 blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
contacts.blockedSlice#900802a1 count:int blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
|
||||
contacts.found#566000e results:Vector<ContactFound> users:Vector<User> = contacts.Found;
|
||||
|
||||
contacts.suggested#5649dcc5 results:Vector<ContactSuggested> users:Vector<User> = contacts.Suggested;
|
||||
|
||||
messages.dialogs#15ba6c40 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
messages.dialogsSlice#71e094f3 count:int dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
|
||||
messages.messages#8c718e87 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
messages.messagesSlice#b446ae3 count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
|
||||
messages.messageEmpty#3f4e0648 = messages.Message;
|
||||
messages.message#ff90c417 message:Message chats:Vector<Chat> users:Vector<User> = messages.Message;
|
||||
|
||||
messages.statedMessages#969478bb messages:Vector<Message> chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessage#d07ae726 message:Message chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessage#d1f4d35c id:int date:int pts:int seq:int = messages.SentMessage;
|
||||
|
||||
messages.chat#40e9002a chat:Chat users:Vector<User> = messages.Chat;
|
||||
|
||||
messages.chats#8150cbd8 chats:Vector<Chat> users:Vector<User> = messages.Chats;
|
||||
|
||||
messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector<Chat> users:Vector<User> = messages.ChatFull;
|
||||
|
||||
messages.affectedHistory#b7de36f2 pts:int seq:int offset:int = messages.AffectedHistory;
|
||||
|
||||
inputMessagesFilterEmpty#57e2f66c = MessagesFilter;
|
||||
inputMessagesFilterPhotos#9609a51c = MessagesFilter;
|
||||
inputMessagesFilterVideo#9fc00e65 = MessagesFilter;
|
||||
inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter;
|
||||
inputMessagesFilterDocument#9eddf188 = MessagesFilter;
|
||||
inputMessagesFilterAudio#cfc87522 = MessagesFilter;
|
||||
|
||||
updateNewMessage#13abdb3 message:Message pts:int = Update;
|
||||
updateMessageID#4e90bfd6 id:int random_id:long = Update;
|
||||
updateReadMessages#c6649e31 messages:Vector<int> pts:int = Update;
|
||||
updateDeleteMessages#a92bfe26 messages:Vector<int> pts:int = Update;
|
||||
updateRestoreMessages#d15de04d messages:Vector<int> pts:int = Update;
|
||||
updateUserTyping#6baa8508 user_id:int = Update;
|
||||
updateChatUserTyping#3c46cfe6 chat_id:int user_id:int = Update;
|
||||
updateChatParticipants#7761198 participants:ChatParticipants = Update;
|
||||
updateUserStatus#1bfbd823 user_id:int status:UserStatus = Update;
|
||||
updateUserName#da22d9ad user_id:int first_name:string last_name:string = Update;
|
||||
updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update;
|
||||
updateContactRegistered#2575bbb9 user_id:int date:int = Update;
|
||||
updateContactLink#51a48a9a user_id:int my_link:contacts.MyLink foreign_link:contacts.ForeignLink = Update;
|
||||
updateActivation#6f690963 user_id:int = Update;
|
||||
updateNewAuthorization#8f06529a auth_key_id:long date:int device:string location:string = Update;
|
||||
|
||||
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
|
||||
|
||||
updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference;
|
||||
updates.difference#f49ca0 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> state:updates.State = updates.Difference;
|
||||
updates.differenceSlice#a8fb1981 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> intermediate_state:updates.State = updates.Difference;
|
||||
|
||||
updatesTooLong#e317af7e = Updates;
|
||||
updateShortMessage#d3f45784 id:int from_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShortChatMessage#2b2fbd4e id:int from_id:int chat_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShort#78d4dec1 update:Update date:int = Updates;
|
||||
updatesCombined#725b04c3 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq_start:int seq:int = Updates;
|
||||
updates#74ae4240 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq:int = Updates;
|
||||
|
||||
photos.photos#8dca6aa5 photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
photos.photosSlice#15051f54 count:int photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
|
||||
photos.photo#20212ca8 photo:Photo users:Vector<User> = photos.Photo;
|
||||
|
||||
upload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File;
|
||||
|
||||
dcOption#2ec2a43c id:int hostname:string ip_address:string port:int = DcOption;
|
||||
|
||||
config#2e54dd74 date:int test_mode:Bool this_dc:int dc_options:Vector<DcOption> chat_size_max:int broadcast_size_max:int = Config;
|
||||
|
||||
nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc;
|
||||
|
||||
help.appUpdate#8987f311 id:int critical:Bool url:string text:string = help.AppUpdate;
|
||||
help.noAppUpdate#c45a6536 = help.AppUpdate;
|
||||
|
||||
help.inviteText#18cb9f78 message:string = help.InviteText;
|
||||
|
||||
messages.statedMessagesLinks#3e74f5c6 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessageLink#a9af2881 message:Message chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessageLink#e9db4a3f id:int date:int pts:int seq:int links:Vector<contacts.Link> = messages.SentMessage;
|
||||
|
||||
inputGeoChat#74d456fa chat_id:int access_hash:long = InputGeoChat;
|
||||
|
||||
inputNotifyGeoChatPeer#4d8ddec8 peer:InputGeoChat = InputNotifyPeer;
|
||||
|
||||
geoChat#75eaea5a id:int access_hash:long title:string address:string venue:string geo:GeoPoint photo:ChatPhoto participants_count:int date:int checked_in:Bool version:int = Chat;
|
||||
|
||||
geoChatMessageEmpty#60311a9b chat_id:int id:int = GeoChatMessage;
|
||||
geoChatMessage#4505f8e1 chat_id:int id:int from_id:int date:int message:string media:MessageMedia = GeoChatMessage;
|
||||
geoChatMessageService#d34fa24e chat_id:int id:int from_id:int date:int action:MessageAction = GeoChatMessage;
|
||||
|
||||
geochats.statedMessage#17b1578b message:GeoChatMessage chats:Vector<Chat> users:Vector<User> seq:int = geochats.StatedMessage;
|
||||
|
||||
geochats.located#48feb267 results:Vector<ChatLocated> messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Located;
|
||||
|
||||
geochats.messages#d1526db1 messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
geochats.messagesSlice#bc5863e8 count:int messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
|
||||
messageActionGeoChatCreate#6f038ebc title:string address:string = MessageAction;
|
||||
messageActionGeoChatCheckin#c7d53de = MessageAction;
|
||||
|
||||
updateNewGeoChatMessage#5a68e3f7 message:GeoChatMessage = Update;
|
||||
|
||||
wallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper;
|
||||
|
||||
updateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update;
|
||||
updateEncryptedChatTyping#1710f156 chat_id:int = Update;
|
||||
updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update;
|
||||
updateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update;
|
||||
|
||||
encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat;
|
||||
encryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat;
|
||||
encryptedChatRequested#c878527e id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;
|
||||
encryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
encryptedChatDiscarded#13d6dd27 id:int = EncryptedChat;
|
||||
|
||||
inputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat;
|
||||
|
||||
encryptedFileEmpty#c21f497e = EncryptedFile;
|
||||
encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile;
|
||||
|
||||
inputEncryptedFileEmpty#1837c364 = InputEncryptedFile;
|
||||
inputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile;
|
||||
inputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile;
|
||||
|
||||
inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage;
|
||||
encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage;
|
||||
|
||||
messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig;
|
||||
messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig;
|
||||
|
||||
messages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage;
|
||||
messages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage;
|
||||
|
||||
inputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile;
|
||||
|
||||
inputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile;
|
||||
|
||||
updateChatParticipantAdd#3a0eeb22 chat_id:int user_id:int inviter_id:int version:int = Update;
|
||||
updateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update;
|
||||
updateDcOptions#8e5e9873 dc_options:Vector<DcOption> = Update;
|
||||
|
||||
inputMediaUploadedAudio#4e498cab file:InputFile duration:int mime_type:string = InputMedia;
|
||||
inputMediaAudio#89938781 id:InputAudio = InputMedia;
|
||||
inputMediaUploadedDocument#34e794bd file:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaUploadedThumbDocument#3e46de5d file:InputFile thumb:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaDocument#d184e841 id:InputDocument = InputMedia;
|
||||
|
||||
messageMediaDocument#2fda2204 document:Document = MessageMedia;
|
||||
messageMediaAudio#c6b68300 audio:Audio = MessageMedia;
|
||||
|
||||
inputAudioEmpty#d95adc84 = InputAudio;
|
||||
inputAudio#77d440ff id:long access_hash:long = InputAudio;
|
||||
|
||||
inputDocumentEmpty#72f0eaae = InputDocument;
|
||||
inputDocument#18798952 id:long access_hash:long = InputDocument;
|
||||
|
||||
inputAudioFileLocation#74dc404d id:long access_hash:long = InputFileLocation;
|
||||
inputDocumentFileLocation#4e45abe9 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
audioEmpty#586988d8 id:long = Audio;
|
||||
audio#c7ac6496 id:long access_hash:long user_id:int date:int duration:int mime_type:string size:int dc_id:int = Audio;
|
||||
|
||||
documentEmpty#36f8c871 id:long = Document;
|
||||
document#9efc6326 id:long access_hash:long user_id:int date:int file_name:string mime_type:string size:int thumb:PhotoSize dc_id:int = Document;
|
||||
|
||||
help.support#17c6b5f6 phone_number:string user:User = help.Support;
|
||||
|
||||
notifyPeer#9fd40bd8 peer:Peer = NotifyPeer;
|
||||
notifyUsers#b4c83b4c = NotifyPeer;
|
||||
notifyChats#c007cec3 = NotifyPeer;
|
||||
notifyAll#74d07c60 = NotifyPeer;
|
||||
|
||||
updateUserBlocked#80ece81a user_id:int blocked:Bool = Update;
|
||||
updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update;
|
||||
|
||||
auth.sentAppCode#e325edcf phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;
|
||||
|
||||
---functions---
|
||||
|
||||
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
|
||||
|
||||
invokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector<long> query:!X = X;
|
||||
|
||||
auth.checkPhone#6fe51dfb phone_number:string = auth.CheckedPhone;
|
||||
auth.sendCode#768d5f4d phone_number:string sms_type:int api_id:int api_hash:string lang_code:string = auth.SentCode;
|
||||
auth.sendCall#3c51564 phone_number:string phone_code_hash:string = Bool;
|
||||
auth.signUp#1b067634 phone_number:string phone_code_hash:string phone_code:string first_name:string last_name:string = auth.Authorization;
|
||||
auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization;
|
||||
auth.logOut#5717da40 = Bool;
|
||||
auth.resetAuthorizations#9fab0d1a = Bool;
|
||||
auth.sendInvites#771c1d97 phone_numbers:Vector<string> message:string = Bool;
|
||||
auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;
|
||||
auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;
|
||||
auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool;
|
||||
|
||||
account.registerDevice#446c712c token_type:int token:string device_model:string system_version:string app_version:string app_sandbox:Bool lang_code:string = Bool;
|
||||
account.unregisterDevice#65c55b40 token_type:int token:string = Bool;
|
||||
account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool;
|
||||
account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings;
|
||||
account.resetNotifySettings#db7e1747 = Bool;
|
||||
account.updateProfile#f0888d68 first_name:string last_name:string = User;
|
||||
account.updateStatus#6628562c offline:Bool = Bool;
|
||||
account.getWallPapers#c04cfac2 = Vector<WallPaper>;
|
||||
|
||||
users.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;
|
||||
users.getFullUser#ca30a5b1 id:InputUser = UserFull;
|
||||
|
||||
contacts.getStatuses#c4a353ee = Vector<ContactStatus>;
|
||||
contacts.getContacts#22c6aa08 hash:string = contacts.Contacts;
|
||||
contacts.importContacts#da30b32d contacts:Vector<InputContact> replace:Bool = contacts.ImportedContacts;
|
||||
contacts.search#11f812d8 q:string limit:int = contacts.Found;
|
||||
contacts.getSuggested#cd773428 limit:int = contacts.Suggested;
|
||||
contacts.deleteContact#8e953744 id:InputUser = contacts.Link;
|
||||
contacts.deleteContacts#59ab389e id:Vector<InputUser> = Bool;
|
||||
contacts.block#332b49fc id:InputUser = Bool;
|
||||
contacts.unblock#e54100bd id:InputUser = Bool;
|
||||
contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked;
|
||||
contacts.exportCard#84e53737 = Vector<int>;
|
||||
contacts.importCard#4fe196fe export_card:Vector<int> = User;
|
||||
|
||||
messages.getMessages#4222fa74 id:Vector<int> = messages.Messages;
|
||||
messages.getDialogs#eccf1df6 offset:int max_id:int limit:int = messages.Dialogs;
|
||||
messages.getHistory#92a1df2f peer:InputPeer offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.search#7e9f2ab peer:InputPeer q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.readHistory#b04f2510 peer:InputPeer max_id:int offset:int = messages.AffectedHistory;
|
||||
messages.deleteHistory#f4f8fb61 peer:InputPeer offset:int = messages.AffectedHistory;
|
||||
messages.deleteMessages#14f2dd0a id:Vector<int> = Vector<int>;
|
||||
messages.restoreMessages#395f9d7e id:Vector<int> = Vector<int>;
|
||||
messages.receivedMessages#28abcb68 max_id:int = Vector<int>;
|
||||
messages.setTyping#719839e9 peer:InputPeer typing:Bool = Bool;
|
||||
messages.sendMessage#4cde0aab peer:InputPeer message:string random_id:long = messages.SentMessage;
|
||||
messages.sendMedia#a3c85d76 peer:InputPeer media:InputMedia random_id:long = messages.StatedMessage;
|
||||
messages.forwardMessages#514cd10f peer:InputPeer id:Vector<int> = messages.StatedMessages;
|
||||
messages.getChats#3c6aa187 id:Vector<int> = messages.Chats;
|
||||
messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;
|
||||
messages.editChatTitle#b4bc68b5 chat_id:int title:string = messages.StatedMessage;
|
||||
messages.editChatPhoto#d881821d chat_id:int photo:InputChatPhoto = messages.StatedMessage;
|
||||
messages.addChatUser#2ee9ee9e chat_id:int user_id:InputUser fwd_limit:int = messages.StatedMessage;
|
||||
messages.deleteChatUser#c3c5cd23 chat_id:int user_id:InputUser = messages.StatedMessage;
|
||||
messages.createChat#419d9aee users:Vector<InputUser> title:string = messages.StatedMessage;
|
||||
|
||||
updates.getState#edd4882a = updates.State;
|
||||
updates.getDifference#a041495 pts:int date:int qts:int = updates.Difference;
|
||||
|
||||
photos.updateProfilePhoto#eef579a0 id:InputPhoto crop:InputPhotoCrop = UserProfilePhoto;
|
||||
photos.uploadProfilePhoto#d50f9c88 file:InputFile caption:string geo_point:InputGeoPoint crop:InputPhotoCrop = photos.Photo;
|
||||
|
||||
upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool;
|
||||
upload.getFile#e3a6cfb5 location:InputFileLocation offset:int limit:int = upload.File;
|
||||
|
||||
help.getConfig#c4f9186b = Config;
|
||||
help.getNearestDc#1fb33026 = NearestDc;
|
||||
help.getAppUpdate#c812ac7e device_model:string system_version:string app_version:string lang_code:string = help.AppUpdate;
|
||||
help.saveAppLog#6f02f748 events:Vector<InputAppEvent> = Bool;
|
||||
help.getInviteText#a4a95186 lang_code:string = help.InviteText;
|
||||
|
||||
photos.getUserPhotos#b7ee553c user_id:InputUser offset:int max_id:int limit:int = photos.Photos;
|
||||
|
||||
messages.forwardMessage#3f3f4f2 peer:InputPeer id:int random_id:long = messages.StatedMessage;
|
||||
messages.sendBroadcast#41bb0972 contacts:Vector<InputUser> message:string media:InputMedia = messages.StatedMessages;
|
||||
|
||||
geochats.getLocated#7f192d8f geo_point:InputGeoPoint radius:int limit:int = geochats.Located;
|
||||
geochats.getRecents#e1427e6f offset:int limit:int = geochats.Messages;
|
||||
geochats.checkin#55b3e8fb peer:InputGeoChat = geochats.StatedMessage;
|
||||
geochats.getFullChat#6722dd6f peer:InputGeoChat = messages.ChatFull;
|
||||
geochats.editChatTitle#4c8e2273 peer:InputGeoChat title:string address:string = geochats.StatedMessage;
|
||||
geochats.editChatPhoto#35d81a95 peer:InputGeoChat photo:InputChatPhoto = geochats.StatedMessage;
|
||||
geochats.search#cfcdc44d peer:InputGeoChat q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.getHistory#b53f7a68 peer:InputGeoChat offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.setTyping#8b8a729 peer:InputGeoChat typing:Bool = Bool;
|
||||
geochats.sendMessage#61b0044 peer:InputGeoChat message:string random_id:long = geochats.StatedMessage;
|
||||
geochats.sendMedia#b8f0deff peer:InputGeoChat media:InputMedia random_id:long = geochats.StatedMessage;
|
||||
geochats.createGeoChat#e092e16 title:string geo_point:InputGeoPoint address:string venue:string = geochats.StatedMessage;
|
||||
|
||||
messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig;
|
||||
messages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat;
|
||||
messages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
messages.discardEncryption#edd923c5 chat_id:int = Bool;
|
||||
messages.setEncryptedTyping#791451ed peer:InputEncryptedChat typing:Bool = Bool;
|
||||
messages.readEncryptedHistory#7f4b690a peer:InputEncryptedChat max_date:int = Bool;
|
||||
messages.sendEncrypted#a9776773 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedFile#9a901b66 peer:InputEncryptedChat random_id:long data:bytes file:InputEncryptedFile = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.receivedQueue#55a5bb66 max_qts:int = Vector<long>;
|
||||
|
||||
upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool;
|
||||
|
||||
initConnection#69796de9 {X:Type} api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X;
|
||||
|
||||
help.getSupport#9cdf08cd = help.Support;
|
||||
|
||||
auth.sendSms#da9f3e8 phone_number:string phone_code_hash:string = Bool;
|
||||
|
||||
invokeWithLayer16#cf5f0987 {X:Type} query:!X = X;
|
528
scheme17.tl
528
scheme17.tl
@ -1,528 +0,0 @@
|
||||
int ?= Int;
|
||||
long ?= Long;
|
||||
double ?= Double;
|
||||
string ?= String;
|
||||
|
||||
bytes string = Bytes;
|
||||
|
||||
boolFalse#bc799737 = Bool;
|
||||
boolTrue#997275b5 = Bool;
|
||||
|
||||
vector#1cb5c415 {t:Type} # [ t ] = Vector t;
|
||||
|
||||
error#c4b9f9bb code:int text:string = Error;
|
||||
|
||||
null#56730bcc = Null;
|
||||
|
||||
inputPeerEmpty#7f3b18ea = InputPeer;
|
||||
inputPeerSelf#7da07ec9 = InputPeer;
|
||||
inputPeerContact#1023dbe8 user_id:int = InputPeer;
|
||||
inputPeerForeign#9b447325 user_id:int access_hash:long = InputPeer;
|
||||
inputPeerChat#179be863 chat_id:int = InputPeer;
|
||||
|
||||
inputUserEmpty#b98886cf = InputUser;
|
||||
inputUserSelf#f7c1b13f = InputUser;
|
||||
inputUserContact#86e94f65 user_id:int = InputUser;
|
||||
inputUserForeign#655e74ff user_id:int access_hash:long = InputUser;
|
||||
|
||||
inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact;
|
||||
|
||||
inputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile;
|
||||
|
||||
inputMediaEmpty#9664f57f = InputMedia;
|
||||
inputMediaUploadedPhoto#2dc53a7d file:InputFile = InputMedia;
|
||||
inputMediaPhoto#8f2ab2ec id:InputPhoto = InputMedia;
|
||||
inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;
|
||||
inputMediaContact#a6e45987 phone_number:string first_name:string last_name:string = InputMedia;
|
||||
inputMediaUploadedVideo#133ad6f6 file:InputFile duration:int w:int h:int mime_type:string = InputMedia;
|
||||
inputMediaUploadedThumbVideo#9912dabf file:InputFile thumb:InputFile duration:int w:int h:int mime_type:string = InputMedia;
|
||||
inputMediaVideo#7f023ae6 id:InputVideo = InputMedia;
|
||||
|
||||
inputChatPhotoEmpty#1ca48f57 = InputChatPhoto;
|
||||
inputChatUploadedPhoto#94254732 file:InputFile crop:InputPhotoCrop = InputChatPhoto;
|
||||
inputChatPhoto#b2e1bf08 id:InputPhoto crop:InputPhotoCrop = InputChatPhoto;
|
||||
|
||||
inputGeoPointEmpty#e4c123d6 = InputGeoPoint;
|
||||
inputGeoPoint#f3b7acc9 lat:double long:double = InputGeoPoint;
|
||||
|
||||
inputPhotoEmpty#1cd7bf0d = InputPhoto;
|
||||
inputPhoto#fb95c6c4 id:long access_hash:long = InputPhoto;
|
||||
|
||||
inputVideoEmpty#5508ec75 = InputVideo;
|
||||
inputVideo#ee579652 id:long access_hash:long = InputVideo;
|
||||
|
||||
inputFileLocation#14637196 volume_id:long local_id:int secret:long = InputFileLocation;
|
||||
inputVideoFileLocation#3d0364ec id:long access_hash:long = InputFileLocation;
|
||||
|
||||
inputPhotoCropAuto#ade6b004 = InputPhotoCrop;
|
||||
inputPhotoCrop#d9915325 crop_left:double crop_top:double crop_width:double = InputPhotoCrop;
|
||||
|
||||
inputAppEvent#770656a8 time:double type:string peer:long data:string = InputAppEvent;
|
||||
|
||||
peerUser#9db1bc6d user_id:int = Peer;
|
||||
peerChat#bad0e5bb chat_id:int = Peer;
|
||||
|
||||
storage.fileUnknown#aa963b05 = storage.FileType;
|
||||
storage.fileJpeg#7efe0e = storage.FileType;
|
||||
storage.fileGif#cae1aadf = storage.FileType;
|
||||
storage.filePng#a4f63c0 = storage.FileType;
|
||||
storage.filePdf#ae1e508d = storage.FileType;
|
||||
storage.fileMp3#528a0677 = storage.FileType;
|
||||
storage.fileMov#4b09ebbc = storage.FileType;
|
||||
storage.filePartial#40bc6f52 = storage.FileType;
|
||||
storage.fileMp4#b3cea0e4 = storage.FileType;
|
||||
storage.fileWebp#1081464c = storage.FileType;
|
||||
|
||||
fileLocationUnavailable#7c596b46 volume_id:long local_id:int secret:long = FileLocation;
|
||||
fileLocation#53d69076 dc_id:int volume_id:long local_id:int secret:long = FileLocation;
|
||||
|
||||
userEmpty#200250ba id:int = User;
|
||||
userSelf#720535ec id:int first_name:string last_name:string phone:string photo:UserProfilePhoto status:UserStatus inactive:Bool = User;
|
||||
userContact#f2fb8319 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userRequest#22e8ceb0 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userForeign#5214c89d id:int first_name:string last_name:string access_hash:long photo:UserProfilePhoto status:UserStatus = User;
|
||||
userDeleted#b29ad7cc id:int first_name:string last_name:string = User;
|
||||
|
||||
userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;
|
||||
userProfilePhoto#d559d8c8 photo_id:long photo_small:FileLocation photo_big:FileLocation = UserProfilePhoto;
|
||||
|
||||
userStatusEmpty#9d05049 = UserStatus;
|
||||
userStatusOnline#edb93949 expires:int = UserStatus;
|
||||
userStatusOffline#8c703f was_online:int = UserStatus;
|
||||
|
||||
chatEmpty#9ba2d800 id:int = Chat;
|
||||
chat#6e9c9bc7 id:int title:string photo:ChatPhoto participants_count:int date:int left:Bool version:int = Chat;
|
||||
chatForbidden#fb0ccc41 id:int title:string date:int = Chat;
|
||||
|
||||
chatFull#630e61be id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings = ChatFull;
|
||||
|
||||
chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;
|
||||
|
||||
chatParticipantsForbidden#fd2bb8a chat_id:int = ChatParticipants;
|
||||
chatParticipants#7841b415 chat_id:int admin_id:int participants:Vector<ChatParticipant> version:int = ChatParticipants;
|
||||
|
||||
chatPhotoEmpty#37c1011c = ChatPhoto;
|
||||
chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;
|
||||
|
||||
messageEmpty#83e5de54 id:int = Message;
|
||||
//message#22eb6aba id:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
//messageForwarded#5f46804 id:int fwd_from_id:int fwd_date:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
//messageService#9f8d60bb id:int from_id:int to_id:Peer out:Bool unread:Bool date:int action:MessageAction = Message;
|
||||
|
||||
messageMediaEmpty#3ded6320 = MessageMedia;
|
||||
messageMediaPhoto#c8c45a2a photo:Photo = MessageMedia;
|
||||
messageMediaVideo#a2d24290 video:Video = MessageMedia;
|
||||
messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;
|
||||
messageMediaContact#5e7d2f39 phone_number:string first_name:string last_name:string user_id:int = MessageMedia;
|
||||
messageMediaUnsupported#29632a36 bytes:bytes = MessageMedia;
|
||||
|
||||
messageActionEmpty#b6aef7b0 = MessageAction;
|
||||
messageActionChatCreate#a6638b9a title:string users:Vector<int> = MessageAction;
|
||||
messageActionChatEditTitle#b5a1ce5a title:string = MessageAction;
|
||||
messageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction;
|
||||
messageActionChatDeletePhoto#95e3fbef = MessageAction;
|
||||
messageActionChatAddUser#5e3cfc4b user_id:int = MessageAction;
|
||||
messageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction;
|
||||
|
||||
dialog#ab3a99ac peer:Peer top_message:int unread_count:int notify_settings:PeerNotifySettings = Dialog;
|
||||
|
||||
photoEmpty#2331b22d id:long = Photo;
|
||||
photo#22b56751 id:long access_hash:long user_id:int date:int caption:string geo:GeoPoint sizes:Vector<PhotoSize> = Photo;
|
||||
|
||||
photoSizeEmpty#e17e23c type:string = PhotoSize;
|
||||
photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize;
|
||||
photoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize;
|
||||
|
||||
videoEmpty#c10658a8 id:long = Video;
|
||||
video#388fa391 id:long access_hash:long user_id:int date:int caption:string duration:int mime_type:string size:int thumb:PhotoSize dc_id:int w:int h:int = Video;
|
||||
|
||||
geoPointEmpty#1117dd5f = GeoPoint;
|
||||
geoPoint#2049d70c long:double lat:double = GeoPoint;
|
||||
|
||||
auth.checkedPhone#e300cc3b phone_registered:Bool phone_invited:Bool = auth.CheckedPhone;
|
||||
|
||||
auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;
|
||||
|
||||
auth.authorization#f6b673a4 expires:int user:User = auth.Authorization;
|
||||
|
||||
auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization;
|
||||
|
||||
inputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer;
|
||||
inputNotifyUsers#193b4417 = InputNotifyPeer;
|
||||
inputNotifyChats#4a95e84e = InputNotifyPeer;
|
||||
inputNotifyAll#a429b886 = InputNotifyPeer;
|
||||
|
||||
inputPeerNotifyEventsEmpty#f03064d8 = InputPeerNotifyEvents;
|
||||
inputPeerNotifyEventsAll#e86a2c74 = InputPeerNotifyEvents;
|
||||
|
||||
inputPeerNotifySettings#46a2ce98 mute_until:int sound:string show_previews:Bool events_mask:int = InputPeerNotifySettings;
|
||||
|
||||
peerNotifyEventsEmpty#add53cb3 = PeerNotifyEvents;
|
||||
peerNotifyEventsAll#6d1ded88 = PeerNotifyEvents;
|
||||
|
||||
peerNotifySettingsEmpty#70a68512 = PeerNotifySettings;
|
||||
peerNotifySettings#8d5e11ee mute_until:int sound:string show_previews:Bool events_mask:int = PeerNotifySettings;
|
||||
|
||||
wallPaper#ccb03657 id:int title:string sizes:Vector<PhotoSize> color:int = WallPaper;
|
||||
|
||||
userFull#771095da user:User link:contacts.Link profile_photo:Photo notify_settings:PeerNotifySettings blocked:Bool real_first_name:string real_last_name:string = UserFull;
|
||||
|
||||
contact#f911c994 user_id:int mutual:Bool = Contact;
|
||||
|
||||
importedContact#d0028438 user_id:int client_id:long = ImportedContact;
|
||||
|
||||
contactBlocked#561bc879 user_id:int date:int = ContactBlocked;
|
||||
|
||||
contactFound#ea879f95 user_id:int = ContactFound;
|
||||
|
||||
contactSuggested#3de191a1 user_id:int mutual_contacts:int = ContactSuggested;
|
||||
|
||||
contactStatus#aa77b873 user_id:int expires:int = ContactStatus;
|
||||
|
||||
chatLocated#3631cf4c chat_id:int distance:int = ChatLocated;
|
||||
|
||||
contacts.foreignLinkUnknown#133421f8 = contacts.ForeignLink;
|
||||
contacts.foreignLinkRequested#a7801f47 has_phone:Bool = contacts.ForeignLink;
|
||||
contacts.foreignLinkMutual#1bea8ce1 = contacts.ForeignLink;
|
||||
|
||||
contacts.myLinkEmpty#d22a1c60 = contacts.MyLink;
|
||||
contacts.myLinkRequested#6c69efee contact:Bool = contacts.MyLink;
|
||||
contacts.myLinkContact#c240ebd9 = contacts.MyLink;
|
||||
|
||||
contacts.link#eccea3f5 my_link:contacts.MyLink foreign_link:contacts.ForeignLink user:User = contacts.Link;
|
||||
|
||||
contacts.contacts#6f8b8cb2 contacts:Vector<Contact> users:Vector<User> = contacts.Contacts;
|
||||
contacts.contactsNotModified#b74ba9d2 = contacts.Contacts;
|
||||
|
||||
contacts.importedContacts#ad524315 imported:Vector<ImportedContact> retry_contacts:Vector<long> users:Vector<User> = contacts.ImportedContacts;
|
||||
|
||||
contacts.blocked#1c138d15 blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
contacts.blockedSlice#900802a1 count:int blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
|
||||
contacts.found#566000e results:Vector<ContactFound> users:Vector<User> = contacts.Found;
|
||||
|
||||
contacts.suggested#5649dcc5 results:Vector<ContactSuggested> users:Vector<User> = contacts.Suggested;
|
||||
|
||||
messages.dialogs#15ba6c40 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
messages.dialogsSlice#71e094f3 count:int dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
|
||||
messages.messages#8c718e87 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
messages.messagesSlice#b446ae3 count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
|
||||
messages.messageEmpty#3f4e0648 = messages.Message;
|
||||
messages.message#ff90c417 message:Message chats:Vector<Chat> users:Vector<User> = messages.Message;
|
||||
|
||||
messages.statedMessages#969478bb messages:Vector<Message> chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessage#d07ae726 message:Message chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessage#d1f4d35c id:int date:int pts:int seq:int = messages.SentMessage;
|
||||
|
||||
messages.chat#40e9002a chat:Chat users:Vector<User> = messages.Chat;
|
||||
|
||||
messages.chats#8150cbd8 chats:Vector<Chat> users:Vector<User> = messages.Chats;
|
||||
|
||||
messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector<Chat> users:Vector<User> = messages.ChatFull;
|
||||
|
||||
messages.affectedHistory#b7de36f2 pts:int seq:int offset:int = messages.AffectedHistory;
|
||||
|
||||
inputMessagesFilterEmpty#57e2f66c = MessagesFilter;
|
||||
inputMessagesFilterPhotos#9609a51c = MessagesFilter;
|
||||
inputMessagesFilterVideo#9fc00e65 = MessagesFilter;
|
||||
inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter;
|
||||
inputMessagesFilterDocument#9eddf188 = MessagesFilter;
|
||||
inputMessagesFilterAudio#cfc87522 = MessagesFilter;
|
||||
|
||||
updateNewMessage#13abdb3 message:Message pts:int = Update;
|
||||
updateMessageID#4e90bfd6 id:int random_id:long = Update;
|
||||
updateReadMessages#c6649e31 messages:Vector<int> pts:int = Update;
|
||||
updateDeleteMessages#a92bfe26 messages:Vector<int> pts:int = Update;
|
||||
updateRestoreMessages#d15de04d messages:Vector<int> pts:int = Update;
|
||||
//updateUserTyping#6baa8508 user_id:int = Update;
|
||||
//updateChatUserTyping#3c46cfe6 chat_id:int user_id:int = Update;
|
||||
updateChatParticipants#7761198 participants:ChatParticipants = Update;
|
||||
updateUserStatus#1bfbd823 user_id:int status:UserStatus = Update;
|
||||
updateUserName#da22d9ad user_id:int first_name:string last_name:string = Update;
|
||||
updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update;
|
||||
updateContactRegistered#2575bbb9 user_id:int date:int = Update;
|
||||
updateContactLink#51a48a9a user_id:int my_link:contacts.MyLink foreign_link:contacts.ForeignLink = Update;
|
||||
updateActivation#6f690963 user_id:int = Update;
|
||||
updateNewAuthorization#8f06529a auth_key_id:long date:int device:string location:string = Update;
|
||||
|
||||
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
|
||||
|
||||
updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference;
|
||||
updates.difference#f49ca0 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> state:updates.State = updates.Difference;
|
||||
updates.differenceSlice#a8fb1981 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> intermediate_state:updates.State = updates.Difference;
|
||||
|
||||
updatesTooLong#e317af7e = Updates;
|
||||
updateShortMessage#d3f45784 id:int from_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShortChatMessage#2b2fbd4e id:int from_id:int chat_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShort#78d4dec1 update:Update date:int = Updates;
|
||||
updatesCombined#725b04c3 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq_start:int seq:int = Updates;
|
||||
updates#74ae4240 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq:int = Updates;
|
||||
|
||||
photos.photos#8dca6aa5 photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
photos.photosSlice#15051f54 count:int photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
|
||||
photos.photo#20212ca8 photo:Photo users:Vector<User> = photos.Photo;
|
||||
|
||||
upload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File;
|
||||
|
||||
dcOption#2ec2a43c id:int hostname:string ip_address:string port:int = DcOption;
|
||||
|
||||
config#2e54dd74 date:int test_mode:Bool this_dc:int dc_options:Vector<DcOption> chat_size_max:int broadcast_size_max:int = Config;
|
||||
|
||||
nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc;
|
||||
|
||||
help.appUpdate#8987f311 id:int critical:Bool url:string text:string = help.AppUpdate;
|
||||
help.noAppUpdate#c45a6536 = help.AppUpdate;
|
||||
|
||||
help.inviteText#18cb9f78 message:string = help.InviteText;
|
||||
|
||||
messages.statedMessagesLinks#3e74f5c6 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessageLink#a9af2881 message:Message chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessageLink#e9db4a3f id:int date:int pts:int seq:int links:Vector<contacts.Link> = messages.SentMessage;
|
||||
|
||||
inputGeoChat#74d456fa chat_id:int access_hash:long = InputGeoChat;
|
||||
|
||||
inputNotifyGeoChatPeer#4d8ddec8 peer:InputGeoChat = InputNotifyPeer;
|
||||
|
||||
geoChat#75eaea5a id:int access_hash:long title:string address:string venue:string geo:GeoPoint photo:ChatPhoto participants_count:int date:int checked_in:Bool version:int = Chat;
|
||||
|
||||
geoChatMessageEmpty#60311a9b chat_id:int id:int = GeoChatMessage;
|
||||
geoChatMessage#4505f8e1 chat_id:int id:int from_id:int date:int message:string media:MessageMedia = GeoChatMessage;
|
||||
geoChatMessageService#d34fa24e chat_id:int id:int from_id:int date:int action:MessageAction = GeoChatMessage;
|
||||
|
||||
geochats.statedMessage#17b1578b message:GeoChatMessage chats:Vector<Chat> users:Vector<User> seq:int = geochats.StatedMessage;
|
||||
|
||||
geochats.located#48feb267 results:Vector<ChatLocated> messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Located;
|
||||
|
||||
geochats.messages#d1526db1 messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
geochats.messagesSlice#bc5863e8 count:int messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
|
||||
messageActionGeoChatCreate#6f038ebc title:string address:string = MessageAction;
|
||||
messageActionGeoChatCheckin#c7d53de = MessageAction;
|
||||
|
||||
updateNewGeoChatMessage#5a68e3f7 message:GeoChatMessage = Update;
|
||||
|
||||
wallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper;
|
||||
|
||||
updateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update;
|
||||
updateEncryptedChatTyping#1710f156 chat_id:int = Update;
|
||||
updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update;
|
||||
updateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update;
|
||||
|
||||
encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat;
|
||||
encryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat;
|
||||
encryptedChatRequested#c878527e id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;
|
||||
encryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
encryptedChatDiscarded#13d6dd27 id:int = EncryptedChat;
|
||||
|
||||
inputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat;
|
||||
|
||||
encryptedFileEmpty#c21f497e = EncryptedFile;
|
||||
encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile;
|
||||
|
||||
inputEncryptedFileEmpty#1837c364 = InputEncryptedFile;
|
||||
inputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile;
|
||||
inputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile;
|
||||
|
||||
inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage;
|
||||
encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage;
|
||||
|
||||
messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig;
|
||||
messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig;
|
||||
|
||||
messages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage;
|
||||
messages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage;
|
||||
|
||||
inputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile;
|
||||
|
||||
inputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile;
|
||||
|
||||
updateChatParticipantAdd#3a0eeb22 chat_id:int user_id:int inviter_id:int version:int = Update;
|
||||
updateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update;
|
||||
updateDcOptions#8e5e9873 dc_options:Vector<DcOption> = Update;
|
||||
|
||||
inputMediaUploadedAudio#4e498cab file:InputFile duration:int mime_type:string = InputMedia;
|
||||
inputMediaAudio#89938781 id:InputAudio = InputMedia;
|
||||
inputMediaUploadedDocument#34e794bd file:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaUploadedThumbDocument#3e46de5d file:InputFile thumb:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaDocument#d184e841 id:InputDocument = InputMedia;
|
||||
|
||||
messageMediaDocument#2fda2204 document:Document = MessageMedia;
|
||||
messageMediaAudio#c6b68300 audio:Audio = MessageMedia;
|
||||
|
||||
inputAudioEmpty#d95adc84 = InputAudio;
|
||||
inputAudio#77d440ff id:long access_hash:long = InputAudio;
|
||||
|
||||
inputDocumentEmpty#72f0eaae = InputDocument;
|
||||
inputDocument#18798952 id:long access_hash:long = InputDocument;
|
||||
|
||||
inputAudioFileLocation#74dc404d id:long access_hash:long = InputFileLocation;
|
||||
inputDocumentFileLocation#4e45abe9 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
audioEmpty#586988d8 id:long = Audio;
|
||||
audio#c7ac6496 id:long access_hash:long user_id:int date:int duration:int mime_type:string size:int dc_id:int = Audio;
|
||||
|
||||
documentEmpty#36f8c871 id:long = Document;
|
||||
document#9efc6326 id:long access_hash:long user_id:int date:int file_name:string mime_type:string size:int thumb:PhotoSize dc_id:int = Document;
|
||||
|
||||
help.support#17c6b5f6 phone_number:string user:User = help.Support;
|
||||
|
||||
notifyPeer#9fd40bd8 peer:Peer = NotifyPeer;
|
||||
notifyUsers#b4c83b4c = NotifyPeer;
|
||||
notifyChats#c007cec3 = NotifyPeer;
|
||||
notifyAll#74d07c60 = NotifyPeer;
|
||||
|
||||
updateUserBlocked#80ece81a user_id:int blocked:Bool = Update;
|
||||
updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update;
|
||||
|
||||
auth.sentAppCode#e325edcf phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;
|
||||
|
||||
updateUserTyping#5c486927 user_id:int action:SendMessageAction = Update;
|
||||
updateChatUserTyping#9a65ea1f chat_id:int user_id:int action:SendMessageAction = Update;
|
||||
|
||||
|
||||
message#567699b3 flags:int id:int from_id:int to_id:Peer date:int message:string media:MessageMedia = Message;
|
||||
messageForwarded#a367e716 flags:int id:int fwd_from_id:int fwd_date:int from_id:int to_id:Peer date:int message:string media:MessageMedia = Message;
|
||||
messageService#1d86f70e flags:int id:int from_id:int to_id:Peer date:int action:MessageAction = Message;
|
||||
|
||||
|
||||
sendMessageTypingAction#16bf744e = SendMessageAction;
|
||||
sendMessageCancelAction#fd5ec8f5 = SendMessageAction;
|
||||
sendMessageRecordVideoAction#a187d66f = SendMessageAction;
|
||||
sendMessageUploadVideoAction#92042ff7 = SendMessageAction;
|
||||
sendMessageRecordAudioAction#d52f73f7 = SendMessageAction;
|
||||
sendMessageUploadAudioAction#e6ac8a6f = SendMessageAction;
|
||||
sendMessageUploadPhotoAction#990a3c1a = SendMessageAction;
|
||||
sendMessageUploadDocumentAction#8faee98e = SendMessageAction;
|
||||
sendMessageGeoLocationAction#176f8ba1 = SendMessageAction;
|
||||
sendMessageChooseContactAction#628cbc6f = SendMessageAction;
|
||||
|
||||
---functions---
|
||||
|
||||
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
|
||||
|
||||
invokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector<long> query:!X = X;
|
||||
|
||||
auth.checkPhone#6fe51dfb phone_number:string = auth.CheckedPhone;
|
||||
auth.sendCode#768d5f4d phone_number:string sms_type:int api_id:int api_hash:string lang_code:string = auth.SentCode;
|
||||
auth.sendCall#3c51564 phone_number:string phone_code_hash:string = Bool;
|
||||
auth.signUp#1b067634 phone_number:string phone_code_hash:string phone_code:string first_name:string last_name:string = auth.Authorization;
|
||||
auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization;
|
||||
auth.logOut#5717da40 = Bool;
|
||||
auth.resetAuthorizations#9fab0d1a = Bool;
|
||||
auth.sendInvites#771c1d97 phone_numbers:Vector<string> message:string = Bool;
|
||||
auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;
|
||||
auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;
|
||||
auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool;
|
||||
|
||||
account.registerDevice#446c712c token_type:int token:string device_model:string system_version:string app_version:string app_sandbox:Bool lang_code:string = Bool;
|
||||
account.unregisterDevice#65c55b40 token_type:int token:string = Bool;
|
||||
account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool;
|
||||
account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings;
|
||||
account.resetNotifySettings#db7e1747 = Bool;
|
||||
account.updateProfile#f0888d68 first_name:string last_name:string = User;
|
||||
account.updateStatus#6628562c offline:Bool = Bool;
|
||||
account.getWallPapers#c04cfac2 = Vector<WallPaper>;
|
||||
|
||||
users.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;
|
||||
users.getFullUser#ca30a5b1 id:InputUser = UserFull;
|
||||
|
||||
contacts.getStatuses#c4a353ee = Vector<ContactStatus>;
|
||||
contacts.getContacts#22c6aa08 hash:string = contacts.Contacts;
|
||||
contacts.importContacts#da30b32d contacts:Vector<InputContact> replace:Bool = contacts.ImportedContacts;
|
||||
contacts.search#11f812d8 q:string limit:int = contacts.Found;
|
||||
contacts.getSuggested#cd773428 limit:int = contacts.Suggested;
|
||||
contacts.deleteContact#8e953744 id:InputUser = contacts.Link;
|
||||
contacts.deleteContacts#59ab389e id:Vector<InputUser> = Bool;
|
||||
contacts.block#332b49fc id:InputUser = Bool;
|
||||
contacts.unblock#e54100bd id:InputUser = Bool;
|
||||
contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked;
|
||||
contacts.exportCard#84e53737 = Vector<int>;
|
||||
contacts.importCard#4fe196fe export_card:Vector<int> = User;
|
||||
|
||||
messages.getMessages#4222fa74 id:Vector<int> = messages.Messages;
|
||||
messages.getDialogs#eccf1df6 offset:int max_id:int limit:int = messages.Dialogs;
|
||||
messages.getHistory#92a1df2f peer:InputPeer offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.search#7e9f2ab peer:InputPeer q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.readHistory#eed884c6 peer:InputPeer max_id:int offset:int read_contents:Bool = messages.AffectedHistory;
|
||||
messages.deleteHistory#f4f8fb61 peer:InputPeer offset:int = messages.AffectedHistory;
|
||||
messages.deleteMessages#14f2dd0a id:Vector<int> = Vector<int>;
|
||||
messages.restoreMessages#395f9d7e id:Vector<int> = Vector<int>;
|
||||
messages.receivedMessages#28abcb68 max_id:int = Vector<int>;
|
||||
messages.setTyping#a3825e50 peer:InputPeer action:SendMessageAction = Bool;
|
||||
messages.sendMessage#4cde0aab peer:InputPeer message:string random_id:long = messages.SentMessage;
|
||||
messages.sendMedia#a3c85d76 peer:InputPeer media:InputMedia random_id:long = messages.StatedMessage;
|
||||
messages.forwardMessages#514cd10f peer:InputPeer id:Vector<int> = messages.StatedMessages;
|
||||
messages.getChats#3c6aa187 id:Vector<int> = messages.Chats;
|
||||
messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;
|
||||
messages.editChatTitle#b4bc68b5 chat_id:int title:string = messages.StatedMessage;
|
||||
messages.editChatPhoto#d881821d chat_id:int photo:InputChatPhoto = messages.StatedMessage;
|
||||
messages.addChatUser#2ee9ee9e chat_id:int user_id:InputUser fwd_limit:int = messages.StatedMessage;
|
||||
messages.deleteChatUser#c3c5cd23 chat_id:int user_id:InputUser = messages.StatedMessage;
|
||||
messages.createChat#419d9aee users:Vector<InputUser> title:string = messages.StatedMessage;
|
||||
|
||||
updates.getState#edd4882a = updates.State;
|
||||
updates.getDifference#a041495 pts:int date:int qts:int = updates.Difference;
|
||||
|
||||
photos.updateProfilePhoto#eef579a0 id:InputPhoto crop:InputPhotoCrop = UserProfilePhoto;
|
||||
photos.uploadProfilePhoto#d50f9c88 file:InputFile caption:string geo_point:InputGeoPoint crop:InputPhotoCrop = photos.Photo;
|
||||
|
||||
upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool;
|
||||
upload.getFile#e3a6cfb5 location:InputFileLocation offset:int limit:int = upload.File;
|
||||
|
||||
help.getConfig#c4f9186b = Config;
|
||||
help.getNearestDc#1fb33026 = NearestDc;
|
||||
help.getAppUpdate#c812ac7e device_model:string system_version:string app_version:string lang_code:string = help.AppUpdate;
|
||||
help.saveAppLog#6f02f748 events:Vector<InputAppEvent> = Bool;
|
||||
help.getInviteText#a4a95186 lang_code:string = help.InviteText;
|
||||
|
||||
photos.getUserPhotos#b7ee553c user_id:InputUser offset:int max_id:int limit:int = photos.Photos;
|
||||
|
||||
messages.forwardMessage#3f3f4f2 peer:InputPeer id:int random_id:long = messages.StatedMessage;
|
||||
messages.sendBroadcast#41bb0972 contacts:Vector<InputUser> message:string media:InputMedia = messages.StatedMessages;
|
||||
|
||||
geochats.getLocated#7f192d8f geo_point:InputGeoPoint radius:int limit:int = geochats.Located;
|
||||
geochats.getRecents#e1427e6f offset:int limit:int = geochats.Messages;
|
||||
geochats.checkin#55b3e8fb peer:InputGeoChat = geochats.StatedMessage;
|
||||
geochats.getFullChat#6722dd6f peer:InputGeoChat = messages.ChatFull;
|
||||
geochats.editChatTitle#4c8e2273 peer:InputGeoChat title:string address:string = geochats.StatedMessage;
|
||||
geochats.editChatPhoto#35d81a95 peer:InputGeoChat photo:InputChatPhoto = geochats.StatedMessage;
|
||||
geochats.search#cfcdc44d peer:InputGeoChat q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.getHistory#b53f7a68 peer:InputGeoChat offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.setTyping#8b8a729 peer:InputGeoChat typing:Bool = Bool;
|
||||
geochats.sendMessage#61b0044 peer:InputGeoChat message:string random_id:long = geochats.StatedMessage;
|
||||
geochats.sendMedia#b8f0deff peer:InputGeoChat media:InputMedia random_id:long = geochats.StatedMessage;
|
||||
geochats.createGeoChat#e092e16 title:string geo_point:InputGeoPoint address:string venue:string = geochats.StatedMessage;
|
||||
|
||||
messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig;
|
||||
messages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat;
|
||||
messages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
messages.discardEncryption#edd923c5 chat_id:int = Bool;
|
||||
messages.setEncryptedTyping#791451ed peer:InputEncryptedChat typing:Bool = Bool;
|
||||
messages.readEncryptedHistory#7f4b690a peer:InputEncryptedChat max_date:int = Bool;
|
||||
messages.sendEncrypted#a9776773 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedFile#9a901b66 peer:InputEncryptedChat random_id:long data:bytes file:InputEncryptedFile = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.receivedQueue#55a5bb66 max_qts:int = Vector<long>;
|
||||
|
||||
upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool;
|
||||
|
||||
initConnection#69796de9 {X:Type} api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X;
|
||||
|
||||
help.getSupport#9cdf08cd = help.Support;
|
||||
|
||||
auth.sendSms#da9f3e8 phone_number:string phone_code_hash:string = Bool;
|
||||
|
||||
messages.readMessageContents id:Vector<int> = Vector<int>;
|
||||
|
||||
|
||||
invokeWithLayer17#50858a19 {X:Type} query:!X = X;
|
||||
|
535
scheme18.tl
535
scheme18.tl
@ -1,535 +0,0 @@
|
||||
int ?= Int;
|
||||
long ?= Long;
|
||||
double ?= Double;
|
||||
string ?= String;
|
||||
|
||||
bytes string = Bytes;
|
||||
|
||||
boolFalse#bc799737 = Bool;
|
||||
boolTrue#997275b5 = Bool;
|
||||
|
||||
vector#1cb5c415 {t:Type} # [ t ] = Vector t;
|
||||
|
||||
error#c4b9f9bb code:int text:string = Error;
|
||||
|
||||
null#56730bcc = Null;
|
||||
|
||||
inputPeerEmpty#7f3b18ea = InputPeer;
|
||||
inputPeerSelf#7da07ec9 = InputPeer;
|
||||
inputPeerContact#1023dbe8 user_id:int = InputPeer;
|
||||
inputPeerForeign#9b447325 user_id:int access_hash:long = InputPeer;
|
||||
inputPeerChat#179be863 chat_id:int = InputPeer;
|
||||
|
||||
inputUserEmpty#b98886cf = InputUser;
|
||||
inputUserSelf#f7c1b13f = InputUser;
|
||||
inputUserContact#86e94f65 user_id:int = InputUser;
|
||||
inputUserForeign#655e74ff user_id:int access_hash:long = InputUser;
|
||||
|
||||
inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact;
|
||||
|
||||
inputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile;
|
||||
|
||||
inputMediaEmpty#9664f57f = InputMedia;
|
||||
inputMediaUploadedPhoto#2dc53a7d file:InputFile = InputMedia;
|
||||
inputMediaPhoto#8f2ab2ec id:InputPhoto = InputMedia;
|
||||
inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;
|
||||
inputMediaContact#a6e45987 phone_number:string first_name:string last_name:string = InputMedia;
|
||||
inputMediaUploadedVideo#133ad6f6 file:InputFile duration:int w:int h:int mime_type:string = InputMedia;
|
||||
inputMediaUploadedThumbVideo#9912dabf file:InputFile thumb:InputFile duration:int w:int h:int mime_type:string = InputMedia;
|
||||
inputMediaVideo#7f023ae6 id:InputVideo = InputMedia;
|
||||
|
||||
inputChatPhotoEmpty#1ca48f57 = InputChatPhoto;
|
||||
inputChatUploadedPhoto#94254732 file:InputFile crop:InputPhotoCrop = InputChatPhoto;
|
||||
inputChatPhoto#b2e1bf08 id:InputPhoto crop:InputPhotoCrop = InputChatPhoto;
|
||||
|
||||
inputGeoPointEmpty#e4c123d6 = InputGeoPoint;
|
||||
inputGeoPoint#f3b7acc9 lat:double long:double = InputGeoPoint;
|
||||
|
||||
inputPhotoEmpty#1cd7bf0d = InputPhoto;
|
||||
inputPhoto#fb95c6c4 id:long access_hash:long = InputPhoto;
|
||||
|
||||
inputVideoEmpty#5508ec75 = InputVideo;
|
||||
inputVideo#ee579652 id:long access_hash:long = InputVideo;
|
||||
|
||||
inputFileLocation#14637196 volume_id:long local_id:int secret:long = InputFileLocation;
|
||||
inputVideoFileLocation#3d0364ec id:long access_hash:long = InputFileLocation;
|
||||
|
||||
inputPhotoCropAuto#ade6b004 = InputPhotoCrop;
|
||||
inputPhotoCrop#d9915325 crop_left:double crop_top:double crop_width:double = InputPhotoCrop;
|
||||
|
||||
inputAppEvent#770656a8 time:double type:string peer:long data:string = InputAppEvent;
|
||||
|
||||
peerUser#9db1bc6d user_id:int = Peer;
|
||||
peerChat#bad0e5bb chat_id:int = Peer;
|
||||
|
||||
storage.fileUnknown#aa963b05 = storage.FileType;
|
||||
storage.fileJpeg#7efe0e = storage.FileType;
|
||||
storage.fileGif#cae1aadf = storage.FileType;
|
||||
storage.filePng#a4f63c0 = storage.FileType;
|
||||
storage.filePdf#ae1e508d = storage.FileType;
|
||||
storage.fileMp3#528a0677 = storage.FileType;
|
||||
storage.fileMov#4b09ebbc = storage.FileType;
|
||||
storage.filePartial#40bc6f52 = storage.FileType;
|
||||
storage.fileMp4#b3cea0e4 = storage.FileType;
|
||||
storage.fileWebp#1081464c = storage.FileType;
|
||||
|
||||
fileLocationUnavailable#7c596b46 volume_id:long local_id:int secret:long = FileLocation;
|
||||
fileLocation#53d69076 dc_id:int volume_id:long local_id:int secret:long = FileLocation;
|
||||
|
||||
userEmpty#200250ba id:int = User;
|
||||
userSelf#7007b451 id:int first_name:string last_name:string username:string phone:string photo:UserProfilePhoto status:UserStatus inactive:Bool = User;
|
||||
userContact#cab35e18 id:int first_name:string last_name:string username:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userRequest#d9ccc4ef id:int first_name:string last_name:string username:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
|
||||
userForeign#75cf7a8 id:int first_name:string last_name:string username:string access_hash:long photo:UserProfilePhoto status:UserStatus = User;
|
||||
userDeleted#d6016d7a id:int first_name:string last_name:string username:string = User;
|
||||
|
||||
|
||||
userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;
|
||||
userProfilePhoto#d559d8c8 photo_id:long photo_small:FileLocation photo_big:FileLocation = UserProfilePhoto;
|
||||
|
||||
userStatusEmpty#9d05049 = UserStatus;
|
||||
userStatusOnline#edb93949 expires:int = UserStatus;
|
||||
userStatusOffline#8c703f was_online:int = UserStatus;
|
||||
|
||||
chatEmpty#9ba2d800 id:int = Chat;
|
||||
chat#6e9c9bc7 id:int title:string photo:ChatPhoto participants_count:int date:int left:Bool version:int = Chat;
|
||||
chatForbidden#fb0ccc41 id:int title:string date:int = Chat;
|
||||
|
||||
chatFull#630e61be id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings = ChatFull;
|
||||
|
||||
chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;
|
||||
|
||||
chatParticipantsForbidden#fd2bb8a chat_id:int = ChatParticipants;
|
||||
chatParticipants#7841b415 chat_id:int admin_id:int participants:Vector<ChatParticipant> version:int = ChatParticipants;
|
||||
|
||||
chatPhotoEmpty#37c1011c = ChatPhoto;
|
||||
chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;
|
||||
|
||||
messageEmpty#83e5de54 id:int = Message;
|
||||
//message#22eb6aba id:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
//messageForwarded#5f46804 id:int fwd_from_id:int fwd_date:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
|
||||
//messageService#9f8d60bb id:int from_id:int to_id:Peer out:Bool unread:Bool date:int action:MessageAction = Message;
|
||||
|
||||
messageMediaEmpty#3ded6320 = MessageMedia;
|
||||
messageMediaPhoto#c8c45a2a photo:Photo = MessageMedia;
|
||||
messageMediaVideo#a2d24290 video:Video = MessageMedia;
|
||||
messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;
|
||||
messageMediaContact#5e7d2f39 phone_number:string first_name:string last_name:string user_id:int = MessageMedia;
|
||||
messageMediaUnsupported#29632a36 bytes:bytes = MessageMedia;
|
||||
|
||||
messageActionEmpty#b6aef7b0 = MessageAction;
|
||||
messageActionChatCreate#a6638b9a title:string users:Vector<int> = MessageAction;
|
||||
messageActionChatEditTitle#b5a1ce5a title:string = MessageAction;
|
||||
messageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction;
|
||||
messageActionChatDeletePhoto#95e3fbef = MessageAction;
|
||||
messageActionChatAddUser#5e3cfc4b user_id:int = MessageAction;
|
||||
messageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction;
|
||||
|
||||
dialog#ab3a99ac peer:Peer top_message:int unread_count:int notify_settings:PeerNotifySettings = Dialog;
|
||||
|
||||
photoEmpty#2331b22d id:long = Photo;
|
||||
photo#22b56751 id:long access_hash:long user_id:int date:int caption:string geo:GeoPoint sizes:Vector<PhotoSize> = Photo;
|
||||
|
||||
photoSizeEmpty#e17e23c type:string = PhotoSize;
|
||||
photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize;
|
||||
photoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize;
|
||||
|
||||
videoEmpty#c10658a8 id:long = Video;
|
||||
video#388fa391 id:long access_hash:long user_id:int date:int caption:string duration:int mime_type:string size:int thumb:PhotoSize dc_id:int w:int h:int = Video;
|
||||
|
||||
geoPointEmpty#1117dd5f = GeoPoint;
|
||||
geoPoint#2049d70c long:double lat:double = GeoPoint;
|
||||
|
||||
auth.checkedPhone#e300cc3b phone_registered:Bool phone_invited:Bool = auth.CheckedPhone;
|
||||
|
||||
auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;
|
||||
|
||||
auth.authorization#f6b673a4 expires:int user:User = auth.Authorization;
|
||||
|
||||
auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization;
|
||||
|
||||
inputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer;
|
||||
inputNotifyUsers#193b4417 = InputNotifyPeer;
|
||||
inputNotifyChats#4a95e84e = InputNotifyPeer;
|
||||
inputNotifyAll#a429b886 = InputNotifyPeer;
|
||||
|
||||
inputPeerNotifyEventsEmpty#f03064d8 = InputPeerNotifyEvents;
|
||||
inputPeerNotifyEventsAll#e86a2c74 = InputPeerNotifyEvents;
|
||||
|
||||
inputPeerNotifySettings#46a2ce98 mute_until:int sound:string show_previews:Bool events_mask:int = InputPeerNotifySettings;
|
||||
|
||||
peerNotifyEventsEmpty#add53cb3 = PeerNotifyEvents;
|
||||
peerNotifyEventsAll#6d1ded88 = PeerNotifyEvents;
|
||||
|
||||
peerNotifySettingsEmpty#70a68512 = PeerNotifySettings;
|
||||
peerNotifySettings#8d5e11ee mute_until:int sound:string show_previews:Bool events_mask:int = PeerNotifySettings;
|
||||
|
||||
wallPaper#ccb03657 id:int title:string sizes:Vector<PhotoSize> color:int = WallPaper;
|
||||
|
||||
userFull#771095da user:User link:contacts.Link profile_photo:Photo notify_settings:PeerNotifySettings blocked:Bool real_first_name:string real_last_name:string = UserFull;
|
||||
|
||||
contact#f911c994 user_id:int mutual:Bool = Contact;
|
||||
|
||||
importedContact#d0028438 user_id:int client_id:long = ImportedContact;
|
||||
|
||||
contactBlocked#561bc879 user_id:int date:int = ContactBlocked;
|
||||
|
||||
contactFound#ea879f95 user_id:int = ContactFound;
|
||||
|
||||
contactSuggested#3de191a1 user_id:int mutual_contacts:int = ContactSuggested;
|
||||
|
||||
contactStatus#aa77b873 user_id:int expires:int = ContactStatus;
|
||||
|
||||
chatLocated#3631cf4c chat_id:int distance:int = ChatLocated;
|
||||
|
||||
contacts.foreignLinkUnknown#133421f8 = contacts.ForeignLink;
|
||||
contacts.foreignLinkRequested#a7801f47 has_phone:Bool = contacts.ForeignLink;
|
||||
contacts.foreignLinkMutual#1bea8ce1 = contacts.ForeignLink;
|
||||
|
||||
contacts.myLinkEmpty#d22a1c60 = contacts.MyLink;
|
||||
contacts.myLinkRequested#6c69efee contact:Bool = contacts.MyLink;
|
||||
contacts.myLinkContact#c240ebd9 = contacts.MyLink;
|
||||
|
||||
contacts.link#eccea3f5 my_link:contacts.MyLink foreign_link:contacts.ForeignLink user:User = contacts.Link;
|
||||
|
||||
contacts.contacts#6f8b8cb2 contacts:Vector<Contact> users:Vector<User> = contacts.Contacts;
|
||||
contacts.contactsNotModified#b74ba9d2 = contacts.Contacts;
|
||||
|
||||
contacts.importedContacts#ad524315 imported:Vector<ImportedContact> retry_contacts:Vector<long> users:Vector<User> = contacts.ImportedContacts;
|
||||
|
||||
contacts.blocked#1c138d15 blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
contacts.blockedSlice#900802a1 count:int blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
|
||||
|
||||
contacts.found#566000e results:Vector<ContactFound> users:Vector<User> = contacts.Found;
|
||||
|
||||
contacts.suggested#5649dcc5 results:Vector<ContactSuggested> users:Vector<User> = contacts.Suggested;
|
||||
|
||||
messages.dialogs#15ba6c40 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
messages.dialogsSlice#71e094f3 count:int dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
|
||||
|
||||
messages.messages#8c718e87 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
messages.messagesSlice#b446ae3 count:int messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Messages;
|
||||
|
||||
messages.messageEmpty#3f4e0648 = messages.Message;
|
||||
messages.message#ff90c417 message:Message chats:Vector<Chat> users:Vector<User> = messages.Message;
|
||||
|
||||
messages.statedMessages#969478bb messages:Vector<Message> chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessage#d07ae726 message:Message chats:Vector<Chat> users:Vector<User> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessage#d1f4d35c id:int date:int pts:int seq:int = messages.SentMessage;
|
||||
|
||||
messages.chat#40e9002a chat:Chat users:Vector<User> = messages.Chat;
|
||||
|
||||
messages.chats#8150cbd8 chats:Vector<Chat> users:Vector<User> = messages.Chats;
|
||||
|
||||
messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector<Chat> users:Vector<User> = messages.ChatFull;
|
||||
|
||||
messages.affectedHistory#b7de36f2 pts:int seq:int offset:int = messages.AffectedHistory;
|
||||
|
||||
inputMessagesFilterEmpty#57e2f66c = MessagesFilter;
|
||||
inputMessagesFilterPhotos#9609a51c = MessagesFilter;
|
||||
inputMessagesFilterVideo#9fc00e65 = MessagesFilter;
|
||||
inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter;
|
||||
inputMessagesFilterDocument#9eddf188 = MessagesFilter;
|
||||
inputMessagesFilterAudio#cfc87522 = MessagesFilter;
|
||||
|
||||
updateNewMessage#13abdb3 message:Message pts:int = Update;
|
||||
updateMessageID#4e90bfd6 id:int random_id:long = Update;
|
||||
updateReadMessages#c6649e31 messages:Vector<int> pts:int = Update;
|
||||
updateDeleteMessages#a92bfe26 messages:Vector<int> pts:int = Update;
|
||||
updateRestoreMessages#d15de04d messages:Vector<int> pts:int = Update;
|
||||
//updateUserTyping#6baa8508 user_id:int = Update;
|
||||
//updateChatUserTyping#3c46cfe6 chat_id:int user_id:int = Update;
|
||||
updateChatParticipants#7761198 participants:ChatParticipants = Update;
|
||||
updateUserStatus#1bfbd823 user_id:int status:UserStatus = Update;
|
||||
updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update;
|
||||
updateContactRegistered#2575bbb9 user_id:int date:int = Update;
|
||||
updateContactLink#51a48a9a user_id:int my_link:contacts.MyLink foreign_link:contacts.ForeignLink = Update;
|
||||
updateActivation#6f690963 user_id:int = Update;
|
||||
updateNewAuthorization#8f06529a auth_key_id:long date:int device:string location:string = Update;
|
||||
|
||||
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
|
||||
|
||||
updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference;
|
||||
updates.difference#f49ca0 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> state:updates.State = updates.Difference;
|
||||
updates.differenceSlice#a8fb1981 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> intermediate_state:updates.State = updates.Difference;
|
||||
|
||||
updatesTooLong#e317af7e = Updates;
|
||||
updateShortMessage#d3f45784 id:int from_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShortChatMessage#2b2fbd4e id:int from_id:int chat_id:int message:string pts:int date:int seq:int = Updates;
|
||||
updateShort#78d4dec1 update:Update date:int = Updates;
|
||||
updatesCombined#725b04c3 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq_start:int seq:int = Updates;
|
||||
updates#74ae4240 updates:Vector<Update> users:Vector<User> chats:Vector<Chat> date:int seq:int = Updates;
|
||||
|
||||
photos.photos#8dca6aa5 photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
photos.photosSlice#15051f54 count:int photos:Vector<Photo> users:Vector<User> = photos.Photos;
|
||||
|
||||
photos.photo#20212ca8 photo:Photo users:Vector<User> = photos.Photo;
|
||||
|
||||
upload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File;
|
||||
|
||||
dcOption#2ec2a43c id:int hostname:string ip_address:string port:int = DcOption;
|
||||
|
||||
config#2e54dd74 date:int test_mode:Bool this_dc:int dc_options:Vector<DcOption> chat_size_max:int broadcast_size_max:int = Config;
|
||||
|
||||
nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc;
|
||||
|
||||
help.appUpdate#8987f311 id:int critical:Bool url:string text:string = help.AppUpdate;
|
||||
help.noAppUpdate#c45a6536 = help.AppUpdate;
|
||||
|
||||
help.inviteText#18cb9f78 message:string = help.InviteText;
|
||||
|
||||
messages.statedMessagesLinks#3e74f5c6 messages:Vector<Message> chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessages;
|
||||
|
||||
messages.statedMessageLink#a9af2881 message:Message chats:Vector<Chat> users:Vector<User> links:Vector<contacts.Link> pts:int seq:int = messages.StatedMessage;
|
||||
|
||||
messages.sentMessageLink#e9db4a3f id:int date:int pts:int seq:int links:Vector<contacts.Link> = messages.SentMessage;
|
||||
|
||||
inputGeoChat#74d456fa chat_id:int access_hash:long = InputGeoChat;
|
||||
|
||||
inputNotifyGeoChatPeer#4d8ddec8 peer:InputGeoChat = InputNotifyPeer;
|
||||
|
||||
geoChat#75eaea5a id:int access_hash:long title:string address:string venue:string geo:GeoPoint photo:ChatPhoto participants_count:int date:int checked_in:Bool version:int = Chat;
|
||||
|
||||
geoChatMessageEmpty#60311a9b chat_id:int id:int = GeoChatMessage;
|
||||
geoChatMessage#4505f8e1 chat_id:int id:int from_id:int date:int message:string media:MessageMedia = GeoChatMessage;
|
||||
geoChatMessageService#d34fa24e chat_id:int id:int from_id:int date:int action:MessageAction = GeoChatMessage;
|
||||
|
||||
geochats.statedMessage#17b1578b message:GeoChatMessage chats:Vector<Chat> users:Vector<User> seq:int = geochats.StatedMessage;
|
||||
|
||||
geochats.located#48feb267 results:Vector<ChatLocated> messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Located;
|
||||
|
||||
geochats.messages#d1526db1 messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
geochats.messagesSlice#bc5863e8 count:int messages:Vector<GeoChatMessage> chats:Vector<Chat> users:Vector<User> = geochats.Messages;
|
||||
|
||||
messageActionGeoChatCreate#6f038ebc title:string address:string = MessageAction;
|
||||
messageActionGeoChatCheckin#c7d53de = MessageAction;
|
||||
|
||||
updateNewGeoChatMessage#5a68e3f7 message:GeoChatMessage = Update;
|
||||
|
||||
wallPaperSolid#63117f24 id:int title:string bg_color:int color:int = WallPaper;
|
||||
|
||||
updateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update;
|
||||
updateEncryptedChatTyping#1710f156 chat_id:int = Update;
|
||||
updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update;
|
||||
updateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update;
|
||||
|
||||
encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat;
|
||||
encryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat;
|
||||
encryptedChatRequested#c878527e id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;
|
||||
encryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
encryptedChatDiscarded#13d6dd27 id:int = EncryptedChat;
|
||||
|
||||
inputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat;
|
||||
|
||||
encryptedFileEmpty#c21f497e = EncryptedFile;
|
||||
encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile;
|
||||
|
||||
inputEncryptedFileEmpty#1837c364 = InputEncryptedFile;
|
||||
inputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile;
|
||||
inputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile;
|
||||
|
||||
inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage;
|
||||
encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage;
|
||||
|
||||
messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig;
|
||||
messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig;
|
||||
|
||||
messages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage;
|
||||
messages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage;
|
||||
|
||||
inputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile;
|
||||
|
||||
inputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile;
|
||||
|
||||
updateChatParticipantAdd#3a0eeb22 chat_id:int user_id:int inviter_id:int version:int = Update;
|
||||
updateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update;
|
||||
updateDcOptions#8e5e9873 dc_options:Vector<DcOption> = Update;
|
||||
|
||||
inputMediaUploadedAudio#4e498cab file:InputFile duration:int mime_type:string = InputMedia;
|
||||
inputMediaAudio#89938781 id:InputAudio = InputMedia;
|
||||
inputMediaUploadedDocument#34e794bd file:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaUploadedThumbDocument#3e46de5d file:InputFile thumb:InputFile file_name:string mime_type:string = InputMedia;
|
||||
inputMediaDocument#d184e841 id:InputDocument = InputMedia;
|
||||
|
||||
messageMediaDocument#2fda2204 document:Document = MessageMedia;
|
||||
messageMediaAudio#c6b68300 audio:Audio = MessageMedia;
|
||||
|
||||
inputAudioEmpty#d95adc84 = InputAudio;
|
||||
inputAudio#77d440ff id:long access_hash:long = InputAudio;
|
||||
|
||||
inputDocumentEmpty#72f0eaae = InputDocument;
|
||||
inputDocument#18798952 id:long access_hash:long = InputDocument;
|
||||
|
||||
inputAudioFileLocation#74dc404d id:long access_hash:long = InputFileLocation;
|
||||
inputDocumentFileLocation#4e45abe9 id:long access_hash:long = InputFileLocation;
|
||||
|
||||
audioEmpty#586988d8 id:long = Audio;
|
||||
audio#c7ac6496 id:long access_hash:long user_id:int date:int duration:int mime_type:string size:int dc_id:int = Audio;
|
||||
|
||||
documentEmpty#36f8c871 id:long = Document;
|
||||
document#9efc6326 id:long access_hash:long user_id:int date:int file_name:string mime_type:string size:int thumb:PhotoSize dc_id:int = Document;
|
||||
|
||||
help.support#17c6b5f6 phone_number:string user:User = help.Support;
|
||||
|
||||
notifyPeer#9fd40bd8 peer:Peer = NotifyPeer;
|
||||
notifyUsers#b4c83b4c = NotifyPeer;
|
||||
notifyChats#c007cec3 = NotifyPeer;
|
||||
notifyAll#74d07c60 = NotifyPeer;
|
||||
|
||||
updateUserBlocked#80ece81a user_id:int blocked:Bool = Update;
|
||||
updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update;
|
||||
|
||||
auth.sentAppCode#e325edcf phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;
|
||||
|
||||
updateUserTyping#5c486927 user_id:int action:SendMessageAction = Update;
|
||||
updateChatUserTyping#9a65ea1f chat_id:int user_id:int action:SendMessageAction = Update;
|
||||
|
||||
updateUserName user_id:int first_name:string last_name:string username:string = Update;
|
||||
updateServiceNotification type:string message:string media:MessageMedia popup:Bool = Update;
|
||||
|
||||
message#567699b3 flags:int id:int from_id:int to_id:Peer date:int message:string media:MessageMedia = Message;
|
||||
messageForwarded#a367e716 flags:int id:int fwd_from_id:int fwd_date:int from_id:int to_id:Peer date:int message:string media:MessageMedia = Message;
|
||||
messageService#1d86f70e flags:int id:int from_id:int to_id:Peer date:int action:MessageAction = Message;
|
||||
|
||||
|
||||
sendMessageTypingAction#16bf744e = SendMessageAction;
|
||||
sendMessageCancelAction#fd5ec8f5 = SendMessageAction;
|
||||
sendMessageRecordVideoAction#a187d66f = SendMessageAction;
|
||||
sendMessageUploadVideoAction#92042ff7 = SendMessageAction;
|
||||
sendMessageRecordAudioAction#d52f73f7 = SendMessageAction;
|
||||
sendMessageUploadAudioAction#e6ac8a6f = SendMessageAction;
|
||||
sendMessageUploadPhotoAction#990a3c1a = SendMessageAction;
|
||||
sendMessageUploadDocumentAction#8faee98e = SendMessageAction;
|
||||
sendMessageGeoLocationAction#176f8ba1 = SendMessageAction;
|
||||
sendMessageChooseContactAction#628cbc6f = SendMessageAction;
|
||||
|
||||
---functions---
|
||||
|
||||
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
|
||||
|
||||
invokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector<long> query:!X = X;
|
||||
|
||||
auth.checkPhone#6fe51dfb phone_number:string = auth.CheckedPhone;
|
||||
auth.sendCode#768d5f4d phone_number:string sms_type:int api_id:int api_hash:string lang_code:string = auth.SentCode;
|
||||
auth.sendCall#3c51564 phone_number:string phone_code_hash:string = Bool;
|
||||
auth.signUp#1b067634 phone_number:string phone_code_hash:string phone_code:string first_name:string last_name:string = auth.Authorization;
|
||||
auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization;
|
||||
auth.logOut#5717da40 = Bool;
|
||||
auth.resetAuthorizations#9fab0d1a = Bool;
|
||||
auth.sendInvites#771c1d97 phone_numbers:Vector<string> message:string = Bool;
|
||||
auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;
|
||||
auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;
|
||||
auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool;
|
||||
|
||||
account.registerDevice#446c712c token_type:int token:string device_model:string system_version:string app_version:string app_sandbox:Bool lang_code:string = Bool;
|
||||
account.unregisterDevice#65c55b40 token_type:int token:string = Bool;
|
||||
account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool;
|
||||
account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings;
|
||||
account.resetNotifySettings#db7e1747 = Bool;
|
||||
account.updateProfile#f0888d68 first_name:string last_name:string = User;
|
||||
account.updateStatus#6628562c offline:Bool = Bool;
|
||||
account.getWallPapers#c04cfac2 = Vector<WallPaper>;
|
||||
|
||||
users.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;
|
||||
users.getFullUser#ca30a5b1 id:InputUser = UserFull;
|
||||
|
||||
contacts.getStatuses#c4a353ee = Vector<ContactStatus>;
|
||||
contacts.getContacts#22c6aa08 hash:string = contacts.Contacts;
|
||||
contacts.importContacts#da30b32d contacts:Vector<InputContact> replace:Bool = contacts.ImportedContacts;
|
||||
contacts.getSuggested#cd773428 limit:int = contacts.Suggested;
|
||||
contacts.deleteContact#8e953744 id:InputUser = contacts.Link;
|
||||
contacts.deleteContacts#59ab389e id:Vector<InputUser> = Bool;
|
||||
contacts.block#332b49fc id:InputUser = Bool;
|
||||
contacts.unblock#e54100bd id:InputUser = Bool;
|
||||
contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked;
|
||||
contacts.exportCard#84e53737 = Vector<int>;
|
||||
contacts.importCard#4fe196fe export_card:Vector<int> = User;
|
||||
|
||||
messages.getMessages#4222fa74 id:Vector<int> = messages.Messages;
|
||||
messages.getDialogs#eccf1df6 offset:int max_id:int limit:int = messages.Dialogs;
|
||||
messages.getHistory#92a1df2f peer:InputPeer offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.search#7e9f2ab peer:InputPeer q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = messages.Messages;
|
||||
messages.readHistory#eed884c6 peer:InputPeer max_id:int offset:int read_contents:Bool = messages.AffectedHistory;
|
||||
messages.deleteHistory#f4f8fb61 peer:InputPeer offset:int = messages.AffectedHistory;
|
||||
messages.deleteMessages#14f2dd0a id:Vector<int> = Vector<int>;
|
||||
messages.restoreMessages#395f9d7e id:Vector<int> = Vector<int>;
|
||||
messages.receivedMessages#28abcb68 max_id:int = Vector<int>;
|
||||
messages.setTyping#a3825e50 peer:InputPeer action:SendMessageAction = Bool;
|
||||
messages.sendMessage#4cde0aab peer:InputPeer message:string random_id:long = messages.SentMessage;
|
||||
messages.sendMedia#a3c85d76 peer:InputPeer media:InputMedia random_id:long = messages.StatedMessage;
|
||||
messages.forwardMessages#514cd10f peer:InputPeer id:Vector<int> = messages.StatedMessages;
|
||||
messages.getChats#3c6aa187 id:Vector<int> = messages.Chats;
|
||||
messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;
|
||||
messages.editChatTitle#b4bc68b5 chat_id:int title:string = messages.StatedMessage;
|
||||
messages.editChatPhoto#d881821d chat_id:int photo:InputChatPhoto = messages.StatedMessage;
|
||||
messages.addChatUser#2ee9ee9e chat_id:int user_id:InputUser fwd_limit:int = messages.StatedMessage;
|
||||
messages.deleteChatUser#c3c5cd23 chat_id:int user_id:InputUser = messages.StatedMessage;
|
||||
messages.createChat#419d9aee users:Vector<InputUser> title:string = messages.StatedMessage;
|
||||
|
||||
updates.getState#edd4882a = updates.State;
|
||||
updates.getDifference#a041495 pts:int date:int qts:int = updates.Difference;
|
||||
|
||||
photos.updateProfilePhoto#eef579a0 id:InputPhoto crop:InputPhotoCrop = UserProfilePhoto;
|
||||
photos.uploadProfilePhoto#d50f9c88 file:InputFile caption:string geo_point:InputGeoPoint crop:InputPhotoCrop = photos.Photo;
|
||||
|
||||
upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool;
|
||||
upload.getFile#e3a6cfb5 location:InputFileLocation offset:int limit:int = upload.File;
|
||||
|
||||
help.getConfig#c4f9186b = Config;
|
||||
help.getNearestDc#1fb33026 = NearestDc;
|
||||
help.getAppUpdate#c812ac7e device_model:string system_version:string app_version:string lang_code:string = help.AppUpdate;
|
||||
help.saveAppLog#6f02f748 events:Vector<InputAppEvent> = Bool;
|
||||
help.getInviteText#a4a95186 lang_code:string = help.InviteText;
|
||||
|
||||
photos.getUserPhotos#b7ee553c user_id:InputUser offset:int max_id:int limit:int = photos.Photos;
|
||||
|
||||
messages.forwardMessage#3f3f4f2 peer:InputPeer id:int random_id:long = messages.StatedMessage;
|
||||
messages.sendBroadcast#41bb0972 contacts:Vector<InputUser> message:string media:InputMedia = messages.StatedMessages;
|
||||
|
||||
geochats.getLocated#7f192d8f geo_point:InputGeoPoint radius:int limit:int = geochats.Located;
|
||||
geochats.getRecents#e1427e6f offset:int limit:int = geochats.Messages;
|
||||
geochats.checkin#55b3e8fb peer:InputGeoChat = geochats.StatedMessage;
|
||||
geochats.getFullChat#6722dd6f peer:InputGeoChat = messages.ChatFull;
|
||||
geochats.editChatTitle#4c8e2273 peer:InputGeoChat title:string address:string = geochats.StatedMessage;
|
||||
geochats.editChatPhoto#35d81a95 peer:InputGeoChat photo:InputChatPhoto = geochats.StatedMessage;
|
||||
geochats.search#cfcdc44d peer:InputGeoChat q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.getHistory#b53f7a68 peer:InputGeoChat offset:int max_id:int limit:int = geochats.Messages;
|
||||
geochats.setTyping#8b8a729 peer:InputGeoChat typing:Bool = Bool;
|
||||
geochats.sendMessage#61b0044 peer:InputGeoChat message:string random_id:long = geochats.StatedMessage;
|
||||
geochats.sendMedia#b8f0deff peer:InputGeoChat media:InputMedia random_id:long = geochats.StatedMessage;
|
||||
geochats.createGeoChat#e092e16 title:string geo_point:InputGeoPoint address:string venue:string = geochats.StatedMessage;
|
||||
|
||||
messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig;
|
||||
messages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat;
|
||||
messages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat;
|
||||
messages.discardEncryption#edd923c5 chat_id:int = Bool;
|
||||
messages.setEncryptedTyping#791451ed peer:InputEncryptedChat typing:Bool = Bool;
|
||||
messages.readEncryptedHistory#7f4b690a peer:InputEncryptedChat max_date:int = Bool;
|
||||
messages.sendEncrypted#a9776773 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedFile#9a901b66 peer:InputEncryptedChat random_id:long data:bytes file:InputEncryptedFile = messages.SentEncryptedMessage;
|
||||
messages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage;
|
||||
messages.receivedQueue#55a5bb66 max_qts:int = Vector<long>;
|
||||
|
||||
upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool;
|
||||
|
||||
initConnection#69796de9 {X:Type} api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X;
|
||||
|
||||
help.getSupport#9cdf08cd = help.Support;
|
||||
|
||||
auth.sendSms#da9f3e8 phone_number:string phone_code_hash:string = Bool;
|
||||
|
||||
messages.readMessageContents id:Vector<int> = Vector<int>;
|
||||
|
||||
|
||||
account.checkUsername username:string = Bool;
|
||||
account.updateUsername username:string = User;
|
||||
|
||||
contacts.search q:string limit:int = contacts.Found;
|
||||
|
||||
//invokeWithLayer18 {X:Type} query:!X = X;
|
||||
invokeWithLayer18#1c900537 {X:Type} query:!X = X;
|
||||
|
2039
structures.c
2039
structures.c
File diff suppressed because it is too large
Load Diff
57
structures.h
57
structures.h
@ -1,57 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
#ifndef __STRUCTURES_H__
|
||||
#define __STRUCTURES_H__
|
||||
|
||||
#include <assert.h>
|
||||
#include "tgl-layout.h"
|
||||
#include "tgl-fetch.h"
|
||||
#include "tgl.h"
|
||||
|
||||
char *tgls_default_create_print_name (struct tgl_state *TLS, tgl_peer_id_t id, const char *a1, const char *a2, const char *a3, const char *a4);
|
||||
|
||||
|
||||
void tgls_free_user (struct tgl_state *TLS, struct tgl_user *U);
|
||||
void tgls_free_chat (struct tgl_state *TLS, struct tgl_chat *U);
|
||||
void tgls_free_photo (struct tgl_state *TLS, struct tgl_photo *P);
|
||||
void tgls_free_message (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tgls_clear_message (struct tgl_state *TLS, struct tgl_message *M);
|
||||
|
||||
struct tgl_message *tglm_message_alloc (struct tgl_state *TLS, long long id);
|
||||
void tglm_message_insert_tree (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tglm_update_message_id (struct tgl_state *TLS, struct tgl_message *M, long long id);
|
||||
void tglm_message_insert (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tglm_message_insert_unsent (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tglm_message_remove_unsent (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tglm_send_all_unsent (struct tgl_state *TLS);
|
||||
void tglm_message_remove_tree (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tglm_message_add_peer (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tglm_message_del_peer (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tglm_message_del_use (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tglm_message_add_use (struct tgl_state *TLS, struct tgl_message *M);
|
||||
|
||||
void tglp_peer_insert_name (struct tgl_state *TLS, tgl_peer_t *P);
|
||||
void tglp_peer_delete_name (struct tgl_state *TLS, tgl_peer_t *P);
|
||||
void tglp_insert_encrypted_chat (struct tgl_state *TLS, tgl_peer_t *P);
|
||||
void tglp_insert_user (struct tgl_state *TLS, tgl_peer_t *P);
|
||||
void tglp_insert_chat (struct tgl_state *TLS, tgl_peer_t *P);
|
||||
enum tgl_typing_status tglf_fetch_typing (void);
|
||||
|
||||
#endif
|
1
tgl
Submodule
1
tgl
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 6a59fd311c1246aba4f6fb2c9a28e40e7abb3f2e
|
54
tgl-fetch.h
54
tgl-fetch.h
@ -1,54 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2014
|
||||
*/
|
||||
#ifndef __TGL_FETCH_H__
|
||||
#define __TGL_FETCH_H__
|
||||
#include "tgl.h"
|
||||
|
||||
int tglf_fetch_file_location (struct tgl_state *TLS, struct tgl_file_location *loc);
|
||||
int tglf_fetch_user_status (struct tgl_state *TLS, struct tgl_user_status *S, struct tgl_user *U);
|
||||
int tglf_fetch_user (struct tgl_state *TLS, struct tgl_user *U);
|
||||
struct tgl_user *tglf_fetch_alloc_user (struct tgl_state *TLS);
|
||||
struct tgl_user *tglf_fetch_alloc_user_full (struct tgl_state *TLS);
|
||||
struct tgl_chat *tglf_fetch_alloc_chat (struct tgl_state *TLS);
|
||||
struct tgl_chat *tglf_fetch_alloc_chat_full (struct tgl_state *TLS);
|
||||
struct tgl_secret_chat *tglf_fetch_alloc_encrypted_chat (struct tgl_state *TLS);
|
||||
struct tgl_message *tglf_fetch_alloc_message (struct tgl_state *TLS);
|
||||
struct tgl_message *tglf_fetch_alloc_geo_message (struct tgl_state *TLS);
|
||||
struct tgl_message *tglf_fetch_alloc_message_short (struct tgl_state *TLS);
|
||||
struct tgl_message *tglf_fetch_alloc_message_short_chat (struct tgl_state *TLS);
|
||||
struct tgl_message *tglf_fetch_alloc_encrypted_message (struct tgl_state *TLS);
|
||||
void tglf_fetch_encrypted_message_file (struct tgl_state *TLS, struct tgl_message_media *M);
|
||||
tgl_peer_id_t tglf_fetch_peer_id (struct tgl_state *TLS);
|
||||
|
||||
void tglf_fetch_message_media (struct tgl_state *TLS, struct tgl_message_media *M);
|
||||
void tglf_fetch_message_media_encrypted (struct tgl_state *TLS, struct tgl_message_media *M);
|
||||
void tglf_fetch_message_action (struct tgl_state *TLS, struct tgl_message_action *M);
|
||||
void tglf_fetch_message_action_encrypted (struct tgl_state *TLS, struct tgl_message_action *M);
|
||||
void tglf_fetch_photo (struct tgl_state *TLS, struct tgl_photo *P);
|
||||
|
||||
void tglf_fetch_chat (struct tgl_state *TLS, struct tgl_chat *C);
|
||||
void tglf_fetch_chat_full (struct tgl_state *TLS, struct tgl_chat *C);
|
||||
|
||||
void tglf_fetch_audio (struct tgl_state *TLS, struct tgl_audio *V);
|
||||
void tglf_fetch_video (struct tgl_state *TLS, struct tgl_video *V);
|
||||
void tglf_fetch_document (struct tgl_state *TLS, struct tgl_document *V);
|
||||
void tglf_fetch_message (struct tgl_state *TLS, struct tgl_message *M);
|
||||
void tglf_fetch_geo_message (struct tgl_state *TLS, struct tgl_message *M);
|
||||
#endif
|
31
tgl-inner.h
31
tgl-inner.h
@ -1,31 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2014
|
||||
*/
|
||||
|
||||
#ifndef __TGL_INNER_H__
|
||||
#define __TGL_INNER_H__
|
||||
|
||||
#define vlogprintf(verbosity_level,...) \
|
||||
do { \
|
||||
if (TLS->verbosity >= verbosity_level) { \
|
||||
TLS->callback.logprintf (__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif
|
447
tgl-layout.h
447
tgl-layout.h
@ -1,447 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2014
|
||||
*/
|
||||
#ifndef __TGL_LAYOUT_H__
|
||||
#define __TGL_LAYOUT_H__
|
||||
|
||||
#define FLAG_MESSAGE_EMPTY 1
|
||||
#define FLAG_DELETED 2
|
||||
#define FLAG_FORBIDDEN 4
|
||||
#define FLAG_HAS_PHOTO 8
|
||||
#define FLAG_CREATED 16
|
||||
|
||||
#define FLAG_USER_SELF 128
|
||||
#define FLAG_USER_FOREIGN 256
|
||||
#define FLAG_USER_CONTACT 512
|
||||
#define FLAG_USER_IN_CONTACT 1024
|
||||
#define FLAG_USER_OUT_CONTACT 2048
|
||||
|
||||
#define FLAG_CHAT_IN_CHAT 128
|
||||
|
||||
#define FLAG_ENCRYPTED 4096
|
||||
#define FLAG_PENDING 8192
|
||||
|
||||
#pragma pack(push,4)
|
||||
|
||||
typedef struct { int type; int id; } tgl_peer_id_t;
|
||||
|
||||
enum tgl_dc_state {
|
||||
st_init,
|
||||
st_reqpq_sent,
|
||||
st_reqdh_sent,
|
||||
st_client_dh_sent,
|
||||
st_init_temp,
|
||||
st_reqpq_sent_temp,
|
||||
st_reqdh_sent_temp,
|
||||
st_client_dh_sent_temp,
|
||||
st_authorized,
|
||||
st_error
|
||||
};
|
||||
|
||||
#define MAX_DC_SESSIONS 3
|
||||
|
||||
struct tgl_session {
|
||||
struct tgl_dc *dc;
|
||||
long long session_id;
|
||||
int seq_no;
|
||||
struct connection *c;
|
||||
struct tree_long *ack_tree;
|
||||
struct tgl_timer *ev;
|
||||
};
|
||||
|
||||
struct tgl_dc {
|
||||
int id;
|
||||
int port;
|
||||
int flags;
|
||||
enum tgl_dc_state state;
|
||||
char *ip;
|
||||
//char *user;
|
||||
struct tgl_session *sessions[MAX_DC_SESSIONS];
|
||||
char auth_key[256];
|
||||
char temp_auth_key[256];
|
||||
char nonce[256];
|
||||
char new_nonce[256];
|
||||
char server_nonce[256];
|
||||
long long auth_key_id;
|
||||
long long temp_auth_key_id;
|
||||
|
||||
long long server_salt;
|
||||
struct tgl_timer *ev;
|
||||
|
||||
int server_time_delta;
|
||||
double server_time_udelta;
|
||||
int has_auth;
|
||||
};
|
||||
|
||||
enum tgl_message_media_type {
|
||||
tgl_message_media_none,
|
||||
tgl_message_media_photo,
|
||||
tgl_message_media_video,
|
||||
tgl_message_media_audio,
|
||||
tgl_message_media_document,
|
||||
tgl_message_media_geo,
|
||||
tgl_message_media_contact,
|
||||
tgl_message_media_unsupported,
|
||||
tgl_message_media_photo_encr,
|
||||
tgl_message_media_video_encr,
|
||||
tgl_message_media_audio_encr,
|
||||
tgl_message_media_document_encr,
|
||||
};
|
||||
|
||||
enum tgl_message_action_type {
|
||||
tgl_message_action_none,
|
||||
tgl_message_action_geo_chat_create,
|
||||
tgl_message_action_geo_chat_checkin,
|
||||
tgl_message_action_chat_create,
|
||||
tgl_message_action_chat_edit_title,
|
||||
tgl_message_action_chat_edit_photo,
|
||||
tgl_message_action_chat_delete_photo,
|
||||
tgl_message_action_chat_add_user,
|
||||
tgl_message_action_chat_delete_user,
|
||||
tgl_message_action_set_message_ttl,
|
||||
tgl_message_action_read_messages,
|
||||
tgl_message_action_delete_messages,
|
||||
tgl_message_action_screenshot_messages,
|
||||
tgl_message_action_flush_history,
|
||||
tgl_message_action_resend,
|
||||
tgl_message_action_notify_layer,
|
||||
tgl_message_action_typing
|
||||
};
|
||||
|
||||
enum tgl_typing_status {
|
||||
tgl_typing_none,
|
||||
tgl_typing_typing,
|
||||
tgl_typing_cancel,
|
||||
tgl_typing_record_video,
|
||||
tgl_typing_upload_video,
|
||||
tgl_typing_record_audio,
|
||||
tgl_typing_upload_audio,
|
||||
tgl_typing_upload_photo,
|
||||
tgl_typing_upload_document,
|
||||
tgl_typing_geo,
|
||||
tgl_typing_choose_contact
|
||||
};
|
||||
|
||||
struct tgl_file_location {
|
||||
int dc;
|
||||
long long volume;
|
||||
int local_id;
|
||||
long long secret;
|
||||
};
|
||||
|
||||
struct tgl_photo_size {
|
||||
char *type;
|
||||
struct tgl_file_location loc;
|
||||
int w;
|
||||
int h;
|
||||
int size;
|
||||
char *data;
|
||||
};
|
||||
|
||||
struct tgl_geo {
|
||||
double longitude;
|
||||
double latitude;
|
||||
};
|
||||
|
||||
struct tgl_photo {
|
||||
long long id;
|
||||
long long access_hash;
|
||||
int user_id;
|
||||
int date;
|
||||
char *caption;
|
||||
struct tgl_geo geo;
|
||||
int sizes_num;
|
||||
struct tgl_photo_size *sizes;
|
||||
};
|
||||
|
||||
struct tgl_encr_photo {
|
||||
long long id;
|
||||
long long access_hash;
|
||||
int dc_id;
|
||||
int size;
|
||||
int key_fingerprint;
|
||||
|
||||
unsigned char *key;
|
||||
unsigned char *iv;
|
||||
int w;
|
||||
int h;
|
||||
};
|
||||
|
||||
struct tgl_encr_video {
|
||||
long long id;
|
||||
long long access_hash;
|
||||
int dc_id;
|
||||
int size;
|
||||
int key_fingerprint;
|
||||
|
||||
unsigned char *key;
|
||||
unsigned char *iv;
|
||||
int w;
|
||||
int h;
|
||||
int duration;
|
||||
char *mime_type;
|
||||
};
|
||||
|
||||
struct tgl_encr_audio {
|
||||
long long id;
|
||||
long long access_hash;
|
||||
int dc_id;
|
||||
int size;
|
||||
int key_fingerprint;
|
||||
|
||||
unsigned char *key;
|
||||
unsigned char *iv;
|
||||
int duration;
|
||||
char *mime_type;
|
||||
};
|
||||
|
||||
struct tgl_encr_document {
|
||||
long long id;
|
||||
long long access_hash;
|
||||
int dc_id;
|
||||
int size;
|
||||
int key_fingerprint;
|
||||
|
||||
unsigned char *key;
|
||||
unsigned char *iv;
|
||||
char *file_name;
|
||||
char *mime_type;
|
||||
};
|
||||
|
||||
struct tgl_encr_file {
|
||||
char *filename;
|
||||
unsigned char *key;
|
||||
unsigned char *iv;
|
||||
};
|
||||
|
||||
|
||||
struct tgl_user_status {
|
||||
int online;
|
||||
int when;
|
||||
struct tgl_timer *ev;
|
||||
};
|
||||
|
||||
struct tgl_user {
|
||||
tgl_peer_id_t id;
|
||||
int flags;
|
||||
struct tgl_message *last;
|
||||
char *print_name;
|
||||
int structure_version;
|
||||
struct tgl_file_location photo_big;
|
||||
struct tgl_file_location photo_small;
|
||||
long long photo_id;
|
||||
struct tgl_photo photo;
|
||||
char *first_name;
|
||||
char *last_name;
|
||||
char *phone;
|
||||
long long access_hash;
|
||||
struct tgl_user_status status;
|
||||
int blocked;
|
||||
char *real_first_name;
|
||||
char *real_last_name;
|
||||
char *username;
|
||||
};
|
||||
|
||||
struct tgl_chat_user {
|
||||
int user_id;
|
||||
int inviter_id;
|
||||
int date;
|
||||
};
|
||||
|
||||
struct tgl_chat {
|
||||
tgl_peer_id_t id;
|
||||
int flags;
|
||||
struct tgl_message *last;
|
||||
char *print_title;
|
||||
int structure_version;
|
||||
struct tgl_file_location photo_big;
|
||||
struct tgl_file_location photo_small;
|
||||
struct tgl_photo photo;
|
||||
char *title;
|
||||
int users_num;
|
||||
int user_list_size;
|
||||
int user_list_version;
|
||||
struct tgl_chat_user *user_list;
|
||||
int date;
|
||||
int version;
|
||||
int admin_id;
|
||||
};
|
||||
|
||||
enum tgl_secret_chat_state {
|
||||
sc_none,
|
||||
sc_waiting,
|
||||
sc_request,
|
||||
sc_ok,
|
||||
sc_deleted
|
||||
};
|
||||
|
||||
struct tgl_secret_chat {
|
||||
tgl_peer_id_t id;
|
||||
int flags;
|
||||
struct tgl_message *last;
|
||||
char *print_name;
|
||||
int structure_version;
|
||||
struct tgl_file_location photo_big;
|
||||
struct tgl_file_location photo_small;
|
||||
struct tgl_photo photo;
|
||||
int user_id;
|
||||
int admin_id;
|
||||
int date;
|
||||
int ttl;
|
||||
int layer;
|
||||
int in_seq_no;
|
||||
int out_seq_no;
|
||||
int last_in_seq_no;
|
||||
long long access_hash;
|
||||
unsigned char *g_key;
|
||||
unsigned char *nonce;
|
||||
|
||||
enum tgl_secret_chat_state state;
|
||||
int key[64];
|
||||
long long key_fingerprint;
|
||||
};
|
||||
|
||||
typedef union tgl_peer {
|
||||
struct {
|
||||
tgl_peer_id_t id;
|
||||
int flags;
|
||||
struct tgl_message *last;
|
||||
char *print_name;
|
||||
int structure_version;
|
||||
struct tgl_file_location photo_big;
|
||||
struct tgl_file_location photo_small;
|
||||
struct tgl_photo photo;
|
||||
};
|
||||
struct tgl_user user;
|
||||
struct tgl_chat chat;
|
||||
struct tgl_secret_chat encr_chat;
|
||||
} tgl_peer_t;
|
||||
|
||||
struct tgl_video {
|
||||
long long id;
|
||||
long long access_hash;
|
||||
int user_id;
|
||||
int date;
|
||||
int size;
|
||||
int dc_id;
|
||||
struct tgl_photo_size thumb;
|
||||
char *caption;
|
||||
int duration;
|
||||
int w;
|
||||
int h;
|
||||
char *mime_type;
|
||||
};
|
||||
|
||||
struct tgl_audio {
|
||||
long long id;
|
||||
long long access_hash;
|
||||
int user_id;
|
||||
int date;
|
||||
int size;
|
||||
int dc_id;
|
||||
int duration;
|
||||
char *mime_type;
|
||||
};
|
||||
|
||||
struct tgl_document {
|
||||
long long id;
|
||||
long long access_hash;
|
||||
int user_id;
|
||||
int date;
|
||||
int size;
|
||||
int dc_id;
|
||||
struct tgl_photo_size thumb;
|
||||
char *caption;
|
||||
char *mime_type;
|
||||
};
|
||||
|
||||
struct tgl_message_action {
|
||||
enum tgl_message_action_type type;
|
||||
union {
|
||||
struct {
|
||||
char *title;
|
||||
int user_num;
|
||||
int *users;
|
||||
};
|
||||
char *new_title;
|
||||
struct tgl_photo photo;
|
||||
int user;
|
||||
int ttl;
|
||||
int layer;
|
||||
int read_cnt;
|
||||
int delete_cnt;
|
||||
int screenshot_cnt;
|
||||
enum tgl_typing_status typing;
|
||||
struct {
|
||||
int start_seq_no;
|
||||
int end_seq_no;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
struct tgl_message_media {
|
||||
enum tgl_message_media_type type;
|
||||
union {
|
||||
struct tgl_photo photo;
|
||||
struct tgl_video video;
|
||||
struct tgl_audio audio;
|
||||
struct tgl_document document;
|
||||
struct tgl_geo geo;
|
||||
struct {
|
||||
char *phone;
|
||||
char *first_name;
|
||||
char *last_name;
|
||||
int user_id;
|
||||
};
|
||||
struct tgl_encr_photo encr_photo;
|
||||
struct tgl_encr_video encr_video;
|
||||
struct tgl_encr_audio encr_audio;
|
||||
struct tgl_encr_document encr_document;
|
||||
struct tgl_encr_file encr_file;
|
||||
struct {
|
||||
void *data;
|
||||
int data_size;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
struct tgl_message {
|
||||
struct tgl_message *next_use, *prev_use;
|
||||
struct tgl_message *next, *prev;
|
||||
long long id;
|
||||
int flags;
|
||||
tgl_peer_id_t fwd_from_id;
|
||||
int fwd_date;
|
||||
tgl_peer_id_t from_id;
|
||||
tgl_peer_id_t to_id;
|
||||
int out;
|
||||
int unread;
|
||||
int date;
|
||||
int service;
|
||||
union {
|
||||
struct tgl_message_action action;
|
||||
struct {
|
||||
char *message;
|
||||
int message_len;
|
||||
struct tgl_message_media media;
|
||||
};
|
||||
};
|
||||
};
|
||||
#pragma pack(pop)
|
||||
#endif
|
69
tgl-timers.c
69
tgl-timers.c
@ -1,69 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
#include "config.h"
|
||||
#ifdef EVENT_V2
|
||||
#include <event2/event.h>
|
||||
#include <event2/bufferevent.h>
|
||||
#include <event2/buffer.h>
|
||||
#else
|
||||
#include <event.h>
|
||||
#include "event-old.h"
|
||||
#endif
|
||||
|
||||
#include "tgl.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
static void timer_alarm (evutil_socket_t fd, short what, void *arg) {
|
||||
void **p = arg;
|
||||
((void (*)(struct tgl_state *, void *))p[1]) (p[0], p[2]);
|
||||
}
|
||||
|
||||
struct tgl_timer *tgl_timer_alloc (struct tgl_state *TLS, void (*cb)(struct tgl_state *TLS, void *arg), void *arg) {
|
||||
void **p = malloc (sizeof (void *) * 3);
|
||||
p[0] = TLS;
|
||||
p[1] = cb;
|
||||
p[2] = arg;
|
||||
return (void *)evtimer_new (TLS->ev_base, timer_alarm, p);
|
||||
}
|
||||
|
||||
void tgl_timer_insert (struct tgl_timer *t, double p) {
|
||||
if (p < 0) { p = 0; }
|
||||
double e = p - (int)p;
|
||||
if (e < 0) { e = 0; }
|
||||
struct timeval pv = { (int)p, (int)(e * 1e6)};
|
||||
event_add ((void *)t, &pv);
|
||||
}
|
||||
|
||||
void tgl_timer_delete (struct tgl_timer *t) {
|
||||
event_del ((void *)t);
|
||||
}
|
||||
|
||||
void tgl_timer_free (struct tgl_timer *t) {
|
||||
void *arg = event_get_callback_arg ((void *)t);
|
||||
free (arg);
|
||||
event_free ((void *)t);
|
||||
}
|
||||
|
||||
struct tgl_timer_methods tgl_libevent_timers = {
|
||||
.alloc = tgl_timer_alloc,
|
||||
.insert = tgl_timer_insert,
|
||||
.delete = tgl_timer_delete,
|
||||
.free = tgl_timer_free
|
||||
};
|
27
tgl-timers.h
27
tgl-timers.h
@ -1,27 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
|
||||
#ifndef __TGL_TIMERS_H__
|
||||
#define __TGL_TIMERS_H__
|
||||
|
||||
#include "tgl.h"
|
||||
extern struct tgl_timer_methods tgl_libevent_timers;
|
||||
|
||||
#endif
|
86
tgl.c
86
tgl.c
@ -1,86 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2014
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "tgl.h"
|
||||
#include "tools.h"
|
||||
#include "mtproto-client.h"
|
||||
#include "structures.h"
|
||||
//#include "net.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
struct tgl_state tgl_state;
|
||||
|
||||
|
||||
void tgl_set_binlog_mode (struct tgl_state *TLS, int mode) {
|
||||
TLS->binlog_enabled = mode;
|
||||
}
|
||||
|
||||
void tgl_set_binlog_path (struct tgl_state *TLS, const char *path) {
|
||||
TLS->binlog_name = tstrdup (path);
|
||||
}
|
||||
|
||||
void tgl_set_auth_file_path (struct tgl_state *TLS, const char *path) {
|
||||
TLS->auth_file = tstrdup (path);
|
||||
}
|
||||
|
||||
void tgl_set_download_directory (struct tgl_state *TLS, const char *path) {
|
||||
TLS->downloads_directory = tstrdup (path);
|
||||
}
|
||||
|
||||
void tgl_set_callback (struct tgl_state *TLS, struct tgl_update_callback *cb) {
|
||||
TLS->callback = *cb;
|
||||
}
|
||||
|
||||
void tgl_set_rsa_key (struct tgl_state *TLS, const char *key) {
|
||||
assert (TLS->rsa_key_num < TGL_MAX_RSA_KEYS_NUM);
|
||||
TLS->rsa_key_list[TLS->rsa_key_num ++] = tstrdup (key);
|
||||
}
|
||||
|
||||
void tgl_init (struct tgl_state *TLS) {
|
||||
assert (TLS->timer_methods);
|
||||
assert (TLS->net_methods);
|
||||
if (!TLS->callback.create_print_name) {
|
||||
TLS->callback.create_print_name = tgls_default_create_print_name;
|
||||
}
|
||||
if (!TLS->temp_key_expire_time) {
|
||||
TLS->temp_key_expire_time = 100000;
|
||||
}
|
||||
|
||||
TLS->message_list.next_use = &TLS->message_list;
|
||||
TLS->message_list.prev_use = &TLS->message_list;
|
||||
|
||||
tglmp_on_start (TLS);
|
||||
}
|
||||
|
||||
int tgl_authorized_dc (struct tgl_state *TLS, struct tgl_dc *DC) {
|
||||
assert (DC);
|
||||
return (DC->flags & 4) != 0;//DC->auth_key_id;
|
||||
}
|
||||
|
||||
int tgl_signed_dc (struct tgl_state *TLS, struct tgl_dc *DC) {
|
||||
assert (DC);
|
||||
return DC->has_auth;
|
||||
}
|
||||
|
395
tgl.h
395
tgl.h
@ -1,395 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2014
|
||||
*/
|
||||
#ifndef __TGL_H__
|
||||
#define __TGL_H__
|
||||
|
||||
#include <tgl-layout.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define TGL_MAX_DC_NUM 100
|
||||
#define TG_SERVER_1 "173.240.5.1"
|
||||
#define TG_SERVER_2 "149.154.167.51"
|
||||
#define TG_SERVER_3 "174.140.142.6"
|
||||
#define TG_SERVER_4 "149.154.167.91"
|
||||
#define TG_SERVER_5 "149.154.171.5"
|
||||
#define TG_SERVER_DEFAULT 4
|
||||
|
||||
#define TG_SERVER_TEST_1 "173.240.5.253"
|
||||
#define TG_SERVER_TEST_2 "149.154.167.40"
|
||||
#define TG_SERVER_TEST_3 "174.140.142.5"
|
||||
#define TG_SERVER_TEST_DEFAULT 2
|
||||
|
||||
// JUST RANDOM STRING
|
||||
#define TGL_BUILD "2590"
|
||||
#define TGL_VERSION "1.1.0"
|
||||
|
||||
#define TGL_ENCRYPTED_LAYER 17
|
||||
|
||||
struct connection;
|
||||
struct mtproto_methods;
|
||||
struct tgl_session;
|
||||
struct tgl_dc;
|
||||
|
||||
#define TGL_UPDATE_CREATED 1
|
||||
#define TGL_UPDATE_DELETED 2
|
||||
#define TGL_UPDATE_PHONE 4
|
||||
#define TGL_UPDATE_CONTACT 8
|
||||
#define TGL_UPDATE_PHOTO 16
|
||||
#define TGL_UPDATE_BLOCKED 32
|
||||
#define TGL_UPDATE_REAL_NAME 64
|
||||
#define TGL_UPDATE_NAME 128
|
||||
#define TGL_UPDATE_REQUESTED 256
|
||||
#define TGL_UPDATE_WORKING 512
|
||||
#define TGL_UPDATE_FLAGS 1024
|
||||
#define TGL_UPDATE_TITLE 2048
|
||||
#define TGL_UPDATE_ADMIN 4096
|
||||
#define TGL_UPDATE_MEMBERS 8192
|
||||
#define TGL_UPDATE_ACCESS_HASH 16384
|
||||
#define TGL_UPDATE_USERNAME (1 << 15)
|
||||
|
||||
struct tgl_allocator {
|
||||
void *(*alloc)(size_t size);
|
||||
void *(*realloc)(void *ptr, size_t old_size, size_t size);
|
||||
void (*free)(void *ptr, int size);
|
||||
void (*check)(void);
|
||||
void (*exists)(void *ptr, int size);
|
||||
};
|
||||
extern struct tgl_allocator tgl_allocator_release;
|
||||
extern struct tgl_allocator tgl_allocator_debug;
|
||||
struct tgl_state;
|
||||
|
||||
struct tgl_update_callback {
|
||||
void (*new_msg)(struct tgl_state *TLS, struct tgl_message *M);
|
||||
void (*marked_read)(struct tgl_state *TLS, int num, struct tgl_message *list[]);
|
||||
void (*logprintf)(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
void (*type_notification)(struct tgl_state *TLS, struct tgl_user *U, enum tgl_typing_status status);
|
||||
void (*type_in_chat_notification)(struct tgl_state *TLS, struct tgl_user *U, struct tgl_chat *C, enum tgl_typing_status status);
|
||||
void (*type_in_secret_chat_notification)(struct tgl_state *TLS, struct tgl_secret_chat *E);
|
||||
void (*status_notification)(struct tgl_state *TLS, struct tgl_user *U);
|
||||
void (*user_registered)(struct tgl_state *TLS, struct tgl_user *U);
|
||||
void (*user_activated)(struct tgl_state *TLS, struct tgl_user *U);
|
||||
void (*new_authorization)(struct tgl_state *TLS, const char *device, const char *location);
|
||||
void (*chat_update)(struct tgl_state *TLS, struct tgl_chat *C, unsigned flags);
|
||||
void (*user_update)(struct tgl_state *TLS, struct tgl_user *C, unsigned flags);
|
||||
void (*secret_chat_update)(struct tgl_state *TLS, struct tgl_secret_chat *C, unsigned flags);
|
||||
void (*msg_receive)(struct tgl_state *TLS, struct tgl_message *M);
|
||||
void (*our_id)(struct tgl_state *TLS, int id);
|
||||
void (*notification)(struct tgl_state *TLS, char *type, char *message);
|
||||
void (*user_status_update)(struct tgl_state *TLS, struct tgl_user *U);
|
||||
char *(*create_print_name) (struct tgl_state *TLS, tgl_peer_id_t id, const char *a1, const char *a2, const char *a3, const char *a4);
|
||||
};
|
||||
|
||||
struct tgl_net_methods {
|
||||
int (*write_out) (struct connection *c, const void *data, int len);
|
||||
int (*read_in) (struct connection *c, void *data, int len);
|
||||
int (*read_in_lookup) (struct connection *c, void *data, int len);
|
||||
void (*flush_out) (struct connection *c);
|
||||
void (*incr_out_packet_num) (struct connection *c);
|
||||
void (*free) (struct connection *c);
|
||||
struct tgl_dc *(*get_dc) (struct connection *c);
|
||||
struct tgl_session *(*get_session) (struct connection *c);
|
||||
|
||||
struct connection *(*create_connection) (struct tgl_state *TLS, const char *host, int port, struct tgl_session *session, struct tgl_dc *dc, struct mtproto_methods *methods);
|
||||
};
|
||||
|
||||
struct mtproto_methods {
|
||||
int (*ready) (struct tgl_state *TLS, struct connection *c);
|
||||
int (*close) (struct tgl_state *TLS, struct connection *c);
|
||||
int (*execute) (struct tgl_state *TLS, struct connection *c, int op, int len);
|
||||
};
|
||||
|
||||
struct tgl_timer;
|
||||
|
||||
struct tgl_timer_methods {
|
||||
struct tgl_timer *(*alloc) (struct tgl_state *TLS, void (*cb)(struct tgl_state *TLS, void *arg), void *arg);
|
||||
void (*insert) (struct tgl_timer *t, double timeout);
|
||||
void (*delete) (struct tgl_timer *t);
|
||||
void (*free) (struct tgl_timer *t);
|
||||
};
|
||||
|
||||
#define E_ERROR 0
|
||||
#define E_WARNING 1
|
||||
#define E_NOTICE 2
|
||||
#define E_DEBUG 6
|
||||
|
||||
#define TGL_LOCK_DIFF 1
|
||||
|
||||
#define TGL_MAX_RSA_KEYS_NUM 10
|
||||
// Do not modify this structure, unless you know what you do
|
||||
|
||||
#pragma pack(push,4)
|
||||
struct tgl_state {
|
||||
int our_id; // ID of logged in user
|
||||
int encr_root;
|
||||
unsigned char *encr_prime;
|
||||
int encr_param_version;
|
||||
int pts;
|
||||
int qts;
|
||||
int date;
|
||||
int seq;
|
||||
int binlog_enabled;
|
||||
int test_mode;
|
||||
int verbosity;
|
||||
int unread_messages;
|
||||
int active_queries;
|
||||
int max_msg_id;
|
||||
int started;
|
||||
|
||||
long long locks;
|
||||
struct tgl_dc *DC_list[TGL_MAX_DC_NUM];
|
||||
struct tgl_dc *DC_working;
|
||||
int max_dc_num;
|
||||
int dc_working_num;
|
||||
int enable_pfs;
|
||||
int temp_key_expire_time;
|
||||
|
||||
long long cur_uploading_bytes;
|
||||
long long cur_uploaded_bytes;
|
||||
long long cur_downloading_bytes;
|
||||
long long cur_downloaded_bytes;
|
||||
|
||||
char *binlog_name;
|
||||
char *auth_file;
|
||||
char *downloads_directory;
|
||||
|
||||
struct tgl_update_callback callback;
|
||||
struct tgl_net_methods *net_methods;
|
||||
void *ev_base;
|
||||
|
||||
char *rsa_key_list[TGL_MAX_RSA_KEYS_NUM];
|
||||
int rsa_key_num;
|
||||
struct bignum_ctx *BN_ctx;
|
||||
|
||||
struct tgl_allocator allocator;
|
||||
|
||||
struct tree_peer *peer_tree;
|
||||
struct tree_peer_by_name *peer_by_name_tree;
|
||||
struct tree_message *message_tree;
|
||||
struct tree_message *message_unsent_tree;
|
||||
|
||||
int users_allocated;
|
||||
int chats_allocated;
|
||||
int messages_allocated;
|
||||
int peer_num;
|
||||
int peer_size;
|
||||
int encr_chats_allocated;
|
||||
int geo_chats_allocated;
|
||||
|
||||
tgl_peer_t **Peers;
|
||||
struct tgl_message message_list;
|
||||
|
||||
int binlog_fd;
|
||||
|
||||
struct tgl_timer_methods *timer_methods;
|
||||
|
||||
void *pubKey;
|
||||
|
||||
struct tree_query *queries_tree;
|
||||
|
||||
char *base_path;
|
||||
|
||||
struct tree_user *online_updates;
|
||||
|
||||
struct tgl_timer *online_updates_timer;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
//extern struct tgl_state tgl_state;
|
||||
|
||||
void tgl_reopen_binlog_for_writing (struct tgl_state *TLS);
|
||||
void tgl_replay_log (struct tgl_state *TLS);
|
||||
|
||||
int tgl_print_stat (struct tgl_state *TLS, char *s, int len);
|
||||
tgl_peer_t *tgl_peer_get (struct tgl_state *TLS, tgl_peer_id_t id);
|
||||
tgl_peer_t *tgl_peer_get_by_name (struct tgl_state *TLS, const char *s);
|
||||
|
||||
struct tgl_message *tgl_message_get (struct tgl_state *TLS, long long id);
|
||||
void tgl_peer_iterator_ex (struct tgl_state *TLS, void (*it)(tgl_peer_t *P, void *extra), void *extra);
|
||||
|
||||
int tgl_complete_user_list (struct tgl_state *TLS, int index, const char *text, int len, char **R);
|
||||
int tgl_complete_chat_list (struct tgl_state *TLS, int index, const char *text, int len, char **R);
|
||||
int tgl_complete_encr_chat_list (struct tgl_state *TLS, int index, const char *text, int len, char **R);
|
||||
int tgl_complete_peer_list (struct tgl_state *TLS, int index, const char *text, int len, char **R);
|
||||
|
||||
#define TGL_PEER_USER 1
|
||||
#define TGL_PEER_CHAT 2
|
||||
#define TGL_PEER_GEO_CHAT 3
|
||||
#define TGL_PEER_ENCR_CHAT 4
|
||||
#define TGL_PEER_UNKNOWN 0
|
||||
|
||||
#define TGL_MK_USER(id) tgl_set_peer_id (TGL_PEER_USER,id)
|
||||
#define TGL_MK_CHAT(id) tgl_set_peer_id (TGL_PEER_CHAT,id)
|
||||
#define TGL_MK_GEO_CHAT(id) tgl_set_peer_id (TGL_PEER_GEO_CHAT,id)
|
||||
#define TGL_MK_ENCR_CHAT(id) tgl_set_peer_id (TGL_PEER_ENCR_CHAT,id)
|
||||
|
||||
void tgl_set_binlog_mode (struct tgl_state *TLS, int mode);
|
||||
void tgl_set_binlog_path (struct tgl_state *TLS, const char *path);
|
||||
void tgl_set_auth_file_path (struct tgl_state *TLS, const char *path);
|
||||
void tgl_set_download_directory (struct tgl_state *TLS, const char *path);
|
||||
void tgl_set_callback (struct tgl_state *TLS, struct tgl_update_callback *cb);
|
||||
void tgl_set_rsa_key (struct tgl_state *TLS, const char *key);
|
||||
|
||||
|
||||
static inline int tgl_get_peer_type (tgl_peer_id_t id) {
|
||||
return id.type;
|
||||
}
|
||||
|
||||
static inline int tgl_get_peer_id (tgl_peer_id_t id) {
|
||||
return id.id;
|
||||
}
|
||||
|
||||
static inline tgl_peer_id_t tgl_set_peer_id (int type, int id) {
|
||||
tgl_peer_id_t ID;
|
||||
ID.id = id;
|
||||
ID.type = type;
|
||||
return ID;
|
||||
}
|
||||
|
||||
static inline int tgl_cmp_peer_id (tgl_peer_id_t a, tgl_peer_id_t b) {
|
||||
return memcmp (&a, &b, sizeof (a));
|
||||
}
|
||||
|
||||
static inline void tgl_incr_verbosity (struct tgl_state *TLS) {
|
||||
TLS->verbosity ++;
|
||||
}
|
||||
|
||||
static inline void tgl_set_verbosity (struct tgl_state *TLS, int val) {
|
||||
TLS->verbosity = val;
|
||||
}
|
||||
|
||||
static inline void tgl_enable_pfs (struct tgl_state *TLS) {
|
||||
TLS->enable_pfs = 1;
|
||||
}
|
||||
|
||||
static inline void tgl_set_test_mode (struct tgl_state *TLS) {
|
||||
TLS->test_mode ++;
|
||||
}
|
||||
|
||||
static inline void tgl_set_net_methods (struct tgl_state *TLS, struct tgl_net_methods *methods) {
|
||||
TLS->net_methods = methods;
|
||||
}
|
||||
|
||||
static inline void tgl_set_timer_methods (struct tgl_state *TLS, struct tgl_timer_methods *methods) {
|
||||
TLS->timer_methods = methods;
|
||||
}
|
||||
|
||||
static inline void tgl_set_ev_base (struct tgl_state *TLS, void *ev_base) {
|
||||
TLS->ev_base = ev_base;
|
||||
}
|
||||
|
||||
//struct pollfd;
|
||||
//int tgl_connections_make_poll_array (struct tgl_state *TLS, struct pollfd *fds, int max);
|
||||
//void tgl_connections_poll_result (struct tgl_state *TLS, struct pollfd *fds, int max);
|
||||
|
||||
void tgl_do_help_get_config (struct tgl_state *TLS, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_send_code (struct tgl_state *TLS, const char *user, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, int registered, const char *hash), void *callback_extra);
|
||||
void tgl_do_phone_call (struct tgl_state *TLS, const char *user, const char *hash, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
int tgl_do_send_code_result (struct tgl_state *TLS, const char *user, const char *hash, const char *code, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_user *Self), void *callback_extra) ;
|
||||
int tgl_do_send_code_result_auth (struct tgl_state *TLS, const char *user, const char *hash, const char *code, const char *first_name, const char *last_name, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_user *Self), void *callback_extra);
|
||||
void tgl_do_update_contact_list (struct tgl_state *TLS, void (*callback) (struct tgl_state *TLS, void *callback_extra, int success, int size, struct tgl_user *contacts[]), void *callback_extra);
|
||||
void tgl_do_send_message (struct tgl_state *TLS, tgl_peer_id_t id, const char *msg, int len, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_send_msg (struct tgl_state *TLS, struct tgl_message *M, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_send_text (struct tgl_state *TLS, tgl_peer_id_t id, char *file, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_mark_read (struct tgl_state *TLS, tgl_peer_id_t id, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_get_history (struct tgl_state *TLS, tgl_peer_id_t id, int limit, int offline_mode, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, int size, struct tgl_message *list[]), void *callback_extra);
|
||||
void tgl_do_get_history_ext (struct tgl_state *TLS, tgl_peer_id_t id, int offset, int limit, int offline_mode, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, int size, struct tgl_message *list[]), void *callback_extra);
|
||||
void tgl_do_get_dialog_list (struct tgl_state *TLS, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, int size, tgl_peer_id_t peers[], int last_msg_id[], int unread_count[]), void *callback_extra);
|
||||
void tgl_do_send_photo (struct tgl_state *TLS, enum tgl_message_media_type type, tgl_peer_id_t to_id, char *file_name, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_set_chat_photo (struct tgl_state *TLS, tgl_peer_id_t chat_id, char *file_name, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_set_profile_photo (struct tgl_state *TLS, char *file_name, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_set_profile_name (struct tgl_state *TLS, char *first_name, char *last_name, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_user *U), void *callback_extra);
|
||||
void tgl_do_set_username (struct tgl_state *TLS, char *name, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_user *U), void *callback_extra);
|
||||
void tgl_do_forward_message (struct tgl_state *TLS, tgl_peer_id_t id, int n, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_rename_chat (struct tgl_state *TLS, tgl_peer_id_t id, char *name, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_get_chat_info (struct tgl_state *TLS, tgl_peer_id_t id, int offline_mode, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_chat *C), void *callback_extra);
|
||||
void tgl_do_get_user_info (struct tgl_state *TLS, tgl_peer_id_t id, int offline_mode, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_user *U), void *callback_extra);
|
||||
void tgl_do_load_photo (struct tgl_state *TLS, struct tgl_photo *photo, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_video_thumb (struct tgl_state *TLS, struct tgl_video *video, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_audio (struct tgl_state *TLS, struct tgl_audio *V, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_video (struct tgl_state *TLS, struct tgl_video *V, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_document (struct tgl_state *TLS, struct tgl_document *V, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_document_thumb (struct tgl_state *TLS, struct tgl_document *video, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_encr_video (struct tgl_state *TLS, struct tgl_encr_video *V, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_export_auth (struct tgl_state *TLS, int num, void (*callback) (struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_add_contact (struct tgl_state *TLS, const char *phone, int phone_len, const char *first_name, int first_name_len, const char *last_name, int last_name_len, int force, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, int size, struct tgl_user *users[]), void *callback_extra);
|
||||
void tgl_do_msg_search (struct tgl_state *TLS, tgl_peer_id_t id, int from, int to, int limit, int offset, const char *s, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, int size, struct tgl_message *list[]), void *callback_extra);
|
||||
//void tgl_do_contacts_search (int limit, const char *s, void (*callback) (struct tgl_state *TLS, void *callback_extra, int success, int size, struct tgl_user *users[]), void *callback_extra);
|
||||
void tgl_do_create_encr_chat_request (struct tgl_state *TLS, int user_id, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_secret_chat *E), void *callback_extra);
|
||||
void tgl_do_create_secret_chat (struct tgl_state *TLS, tgl_peer_id_t id, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_secret_chat *E), void *callback_extra);
|
||||
void tgl_do_accept_encr_chat_request (struct tgl_state *TLS, struct tgl_secret_chat *E, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_secret_chat *E), void *callback_extra);
|
||||
void tgl_do_get_difference (struct tgl_state *TLS, int sync_from_start, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_lookup_state (struct tgl_state *TLS);
|
||||
void tgl_do_add_user_to_chat (struct tgl_state *TLS, tgl_peer_id_t chat_id, tgl_peer_id_t id, int limit, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_del_user_from_chat (struct tgl_state *TLS, tgl_peer_id_t chat_id, tgl_peer_id_t id, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_create_group_chat (struct tgl_state *TLS, tgl_peer_id_t id, char *chat_topic, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_create_group_chat_ex (struct tgl_state *TLS, int users_num, tgl_peer_id_t ids[], char *chat_topic, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_delete_msg (struct tgl_state *TLS, long long id, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_restore_msg (struct tgl_state *TLS, long long id, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_update_status (struct tgl_state *TLS, int online, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_help_get_config_dc (struct tgl_state *TLS, struct tgl_dc *D, void (*callback)(struct tgl_state *TLS, void *, int), void *callback_extra);
|
||||
void tgl_do_export_card (struct tgl_state *TLS, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, int size, int *card), void *callback_extra);
|
||||
void tgl_do_import_card (struct tgl_state *TLS, int size, int *card, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_user *U), void *callback_extra);
|
||||
void tgl_do_send_contact (struct tgl_state *TLS, tgl_peer_id_t id, const char *phone, int phone_len, const char *first_name, int first_name_len, const char *last_name, int last_name_len, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_forward_media (struct tgl_state *TLS, tgl_peer_id_t id, int n, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_del_contact (struct tgl_state *TLS, tgl_peer_id_t id, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_set_encr_chat_ttl (struct tgl_state *TLS, struct tgl_secret_chat *E, int ttl, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_send_location (struct tgl_state *TLS, tgl_peer_id_t id, double latitude, double longitude, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_contact_search (struct tgl_state *TLS, char *name, int limit, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, int cnt, struct tgl_user *U[]), void *callback_extra);
|
||||
|
||||
|
||||
void tgl_do_visualize_key (struct tgl_state *TLS, tgl_peer_id_t id, unsigned char buf[16]);
|
||||
|
||||
void tgl_do_send_ping (struct tgl_state *TLS, struct connection *c);
|
||||
|
||||
void tgl_do_send_extf (struct tgl_state *TLS, char *data, int data_len, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, char *data), void *callback_extra);
|
||||
|
||||
int tgl_authorized_dc (struct tgl_state *TLS, struct tgl_dc *DC);
|
||||
int tgl_signed_dc (struct tgl_state *TLS, struct tgl_dc *DC);
|
||||
|
||||
//void tgl_do_get_suggested (void);
|
||||
|
||||
void tgl_do_create_keys_end (struct tgl_state *TLS, struct tgl_secret_chat *U);
|
||||
void tgl_do_send_encr_chat_layer (struct tgl_state *TLS, struct tgl_secret_chat *E);
|
||||
|
||||
void tgl_init (struct tgl_state *TLS);
|
||||
void tgl_dc_authorize (struct tgl_state *TLS, struct tgl_dc *DC);
|
||||
|
||||
void tgl_dc_iterator (struct tgl_state *TLS, void (*iterator)(struct tgl_dc *DC));
|
||||
void tgl_dc_iterator_ex (struct tgl_state *TLS, void (*iterator)(struct tgl_dc *DC, void *extra), void *extra);
|
||||
|
||||
double tglt_get_double_time (void);
|
||||
|
||||
void tgl_insert_empty_user (struct tgl_state *TLS, int id);
|
||||
void tgl_insert_empty_chat (struct tgl_state *TLS, int id);
|
||||
|
||||
int tglf_extf_autocomplete (struct tgl_state *TLS, const char *text, int text_len, int index, char **R, char *data, int data_len);
|
||||
struct paramed_type *tglf_extf_store (struct tgl_state *TLS, const char *data, int data_len);
|
||||
char *tglf_extf_fetch (struct tgl_state *TLS, struct paramed_type *T);
|
||||
|
||||
void tgl_free_all (struct tgl_state *TLS);
|
||||
|
||||
static inline struct tgl_state *tgl_state_alloc (void) {
|
||||
struct tgl_state *TLS = malloc (sizeof (*TLS));
|
||||
if (!TLS) { return NULL; }
|
||||
memset (TLS, 0, sizeof (*TLS));
|
||||
return TLS;
|
||||
}
|
||||
|
||||
#endif
|
297
tools.c
297
tools.c
@ -1,297 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/rand.h>
|
||||
#include <zlib.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
//#include "interface.h"
|
||||
#include "tools.h"
|
||||
|
||||
#ifdef __MACH__
|
||||
#include <mach/clock.h>
|
||||
#include <mach/mach.h>
|
||||
#endif
|
||||
|
||||
#ifdef __MACH__
|
||||
#define CLOCK_REALTIME 0
|
||||
#define CLOCK_MONOTONIC 1
|
||||
#endif
|
||||
|
||||
#define RES_PRE 8
|
||||
#define RES_AFTER 8
|
||||
#define MAX_BLOCKS 1000000
|
||||
static void *blocks[MAX_BLOCKS];
|
||||
static void *free_blocks[MAX_BLOCKS];
|
||||
static int used_blocks;
|
||||
static int free_blocks_cnt;
|
||||
|
||||
static long long total_allocated_bytes;
|
||||
|
||||
void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2), weak));
|
||||
void logprintf (const char *format, ...) {
|
||||
va_list ap;
|
||||
va_start (ap, format);
|
||||
vfprintf (stdout, format, ap);
|
||||
va_end (ap);
|
||||
}
|
||||
|
||||
//extern int verbosity;
|
||||
|
||||
//static long long total_allocated_bytes;
|
||||
|
||||
int tgl_snprintf (char *buf, int len, const char *format, ...) {
|
||||
va_list ap;
|
||||
va_start (ap, format);
|
||||
int r = vsnprintf (buf, len, format, ap);
|
||||
va_end (ap);
|
||||
assert (r <= len && "tsnprintf buffer overflow");
|
||||
return r;
|
||||
}
|
||||
|
||||
int tgl_asprintf (char **res, const char *format, ...) {
|
||||
va_list ap;
|
||||
va_start (ap, format);
|
||||
int r = vasprintf (res, format, ap);
|
||||
assert (r >= 0);
|
||||
va_end (ap);
|
||||
void *rs = talloc (strlen (*res) + 1);
|
||||
memcpy (rs, *res, strlen (*res) + 1);
|
||||
free (*res);
|
||||
*res = rs;
|
||||
return r;
|
||||
}
|
||||
|
||||
void tgl_free_debug (void *ptr, int size __attribute__ ((unused))) {
|
||||
total_allocated_bytes -= size;
|
||||
ptr -= RES_PRE;
|
||||
if (size != (int)((*(int *)ptr) ^ 0xbedabeda)) {
|
||||
logprintf ("size = %d, ptr = %d\n", size, (*(int *)ptr) ^ 0xbedabeda);
|
||||
}
|
||||
assert (*(int *)ptr == (int)((size) ^ 0xbedabeda));
|
||||
assert (*(int *)(ptr + RES_PRE + size) == (int)((size) ^ 0x7bed7bed));
|
||||
assert (*(int *)(ptr + 4) == size);
|
||||
int block_num = *(int *)(ptr + 4 + RES_PRE + size);
|
||||
if (block_num >= used_blocks) {
|
||||
logprintf ("block_num = %d, used = %d\n", block_num, used_blocks);
|
||||
}
|
||||
assert (block_num < used_blocks);
|
||||
if (block_num < used_blocks - 1) {
|
||||
void *p = blocks[used_blocks - 1];
|
||||
int s = (*(int *)p) ^ 0xbedabeda;
|
||||
*(int *)(p + 4 + RES_PRE + s) = block_num;
|
||||
blocks[block_num] = p;
|
||||
}
|
||||
blocks[--used_blocks] = 0;
|
||||
memset (ptr, 0, size + RES_PRE + RES_AFTER);
|
||||
*(int *)ptr = size + 12;
|
||||
free_blocks[free_blocks_cnt ++] = ptr;
|
||||
}
|
||||
|
||||
void tgl_free_release (void *ptr, int size) {
|
||||
free (ptr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void *tgl_realloc_debug (void *ptr, size_t old_size __attribute__ ((unused)), size_t size) {
|
||||
void *p = talloc (size);
|
||||
memcpy (p, ptr, size >= old_size ? old_size : size);
|
||||
tfree (ptr, old_size);
|
||||
return p;
|
||||
}
|
||||
|
||||
void *tgl_realloc_release (void *ptr, size_t old_size __attribute__ ((unused)), size_t size) {
|
||||
void *p = realloc (ptr, size);
|
||||
ensure_ptr (p);
|
||||
return p;
|
||||
}
|
||||
|
||||
void *tgl_alloc_debug (size_t size) {
|
||||
total_allocated_bytes += size;
|
||||
void *p = malloc (size + RES_PRE + RES_AFTER);
|
||||
ensure_ptr (p);
|
||||
*(int *)p = size ^ 0xbedabeda;
|
||||
*(int *)(p + 4) = size;
|
||||
*(int *)(p + RES_PRE + size) = size ^ 0x7bed7bed;
|
||||
*(int *)(p + RES_AFTER + 4 + size) = used_blocks;
|
||||
blocks[used_blocks ++] = p;
|
||||
|
||||
if (used_blocks - 1 == 24867) {
|
||||
assert (0);
|
||||
}
|
||||
tcheck ();
|
||||
return p + 8;
|
||||
}
|
||||
|
||||
void *tgl_alloc_release (size_t size) {
|
||||
void *p = malloc (size);
|
||||
ensure_ptr (p);
|
||||
return p;
|
||||
}
|
||||
|
||||
void *tgl_alloc0 (size_t size) {
|
||||
void *p = talloc (size);
|
||||
memset (p, 0, size);
|
||||
return p;
|
||||
}
|
||||
|
||||
char *tgl_strdup (const char *s) {
|
||||
int l = strlen (s);
|
||||
char *p = talloc (l + 1);
|
||||
memcpy (p, s, l + 1);
|
||||
return p;
|
||||
}
|
||||
|
||||
char *tgl_strndup (const char *s, size_t n) {
|
||||
size_t l = 0;
|
||||
for (l = 0; l < n && s[l]; l++) { }
|
||||
char *p = talloc (l + 1);
|
||||
memcpy (p, s, l);
|
||||
p[l] = 0;
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
int tgl_inflate (void *input, int ilen, void *output, int olen) {
|
||||
z_stream strm;
|
||||
memset (&strm, 0, sizeof (strm));
|
||||
assert (inflateInit2 (&strm, 16 + MAX_WBITS) == Z_OK);
|
||||
strm.avail_in = ilen;
|
||||
strm.next_in = input;
|
||||
strm.avail_out = olen ;
|
||||
strm.next_out = output;
|
||||
int err = inflate (&strm, Z_FINISH);
|
||||
int total_out = strm.total_out;
|
||||
|
||||
if (err != Z_OK && err != Z_STREAM_END) {
|
||||
logprintf ( "inflate error = %d\n", err);
|
||||
logprintf ( "inflated %d bytes\n", (int) strm.total_out);
|
||||
total_out = 0;
|
||||
}
|
||||
inflateEnd (&strm);
|
||||
return total_out;
|
||||
}
|
||||
|
||||
void tgl_check_debug (void) {
|
||||
int i;
|
||||
for (i = 0; i < used_blocks; i++) {
|
||||
void *ptr = blocks[i];
|
||||
int size = (*(int *)ptr) ^ 0xbedabeda;
|
||||
if (!(*(int *)(ptr + 4) == size) ||
|
||||
!(*(int *)(ptr + RES_PRE + size) == (size ^ 0x7bed7bed)) ||
|
||||
!(*(int *)(ptr + RES_PRE + 4 + size) == i)) {
|
||||
logprintf ("Bad block at address %p (size %d, num %d)\n", ptr, size, i);
|
||||
assert (0 && "Bad block");
|
||||
}
|
||||
}
|
||||
for (i = 0; i < free_blocks_cnt; i++) {
|
||||
void *ptr = free_blocks[i];
|
||||
int l = *(int *)ptr;
|
||||
int j = 0;
|
||||
for (j = 0; j < l; j++) {
|
||||
if (*(char *)(ptr + 4 + j)) {
|
||||
hexdump (ptr + 8, ptr + 8 + l + ((-l) & 3));
|
||||
logprintf ("Used freed memory size = %d. ptr = %p\n", l + 4 - RES_PRE - RES_AFTER, ptr);
|
||||
assert (0);
|
||||
}
|
||||
}
|
||||
}
|
||||
//logprintf ("ok. Used_blocks = %d. Free blocks = %d\n", used_blocks, free_blocks_cnt);
|
||||
}
|
||||
|
||||
void tgl_exists_debug (void *ptr, int size) {
|
||||
ptr -= RES_PRE;
|
||||
if (size != (int)((*(int *)ptr) ^ 0xbedabeda)) {
|
||||
logprintf ("size = %d, ptr = %d\n", size, (*(int *)ptr) ^ 0xbedabeda);
|
||||
}
|
||||
assert (*(int *)ptr == (int)((size) ^ 0xbedabeda));
|
||||
assert (*(int *)(ptr + RES_PRE + size) == (int)((size) ^ 0x7bed7bed));
|
||||
assert (*(int *)(ptr + 4) == size);
|
||||
int block_num = *(int *)(ptr + 4 + RES_PRE + size);
|
||||
if (block_num >= used_blocks) {
|
||||
logprintf ("block_num = %d, used = %d\n", block_num, used_blocks);
|
||||
}
|
||||
assert (block_num < used_blocks);
|
||||
}
|
||||
|
||||
void tgl_exists_release (void *ptr, int size) {}
|
||||
void tgl_check_release (void) {}
|
||||
|
||||
void tgl_my_clock_gettime (int clock_id, struct timespec *T) {
|
||||
#ifdef __MACH__
|
||||
// We are ignoring MONOTONIC and hope time doesn't go back too often
|
||||
clock_serv_t cclock;
|
||||
mach_timespec_t mts;
|
||||
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
|
||||
clock_get_time(cclock, &mts);
|
||||
mach_port_deallocate(mach_task_self(), cclock);
|
||||
T->tv_sec = mts.tv_sec;
|
||||
T->tv_nsec = mts.tv_nsec;
|
||||
#else
|
||||
assert (clock_gettime(clock_id, T) >= 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
double tglt_get_double_time (void) {
|
||||
struct timespec tv;
|
||||
tgl_my_clock_gettime (CLOCK_REALTIME, &tv);
|
||||
return tv.tv_sec + 1e-9 * tv.tv_nsec;
|
||||
}
|
||||
|
||||
void tglt_secure_random (void *s, int l) {
|
||||
if (RAND_bytes (s, l) <= 0) {
|
||||
/*if (allow_weak_random) {
|
||||
RAND_pseudo_bytes (s, l);
|
||||
} else {*/
|
||||
assert (0 && "End of random. If you want, you can start with -w");
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
struct tgl_allocator tgl_allocator_debug = {
|
||||
.alloc = tgl_alloc_debug,
|
||||
.realloc = tgl_realloc_debug,
|
||||
.free = tgl_free_debug,
|
||||
.check = tgl_check_debug,
|
||||
.exists = tgl_exists_debug
|
||||
};
|
||||
|
||||
struct tgl_allocator tgl_allocator_release = {
|
||||
.alloc = tgl_alloc_release,
|
||||
.realloc = tgl_realloc_release,
|
||||
.free = tgl_free_release,
|
||||
.check = tgl_check_release,
|
||||
.exists = tgl_exists_release
|
||||
};
|
||||
|
||||
struct tgl_allocator *tgl_allocator = &tgl_allocator_release;
|
119
tools.h
119
tools.h
@ -1,119 +0,0 @@
|
||||
/*
|
||||
This file is part of telegram-client.
|
||||
|
||||
Telegram-client is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Telegram-client is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this telegram-client. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2013
|
||||
*/
|
||||
|
||||
#ifndef __TOOLS_H__
|
||||
#define __TOOLS_H__
|
||||
#include <time.h>
|
||||
#include <openssl/err.h>
|
||||
#include <assert.h>
|
||||
#include "tgl.h"
|
||||
|
||||
#define talloc tgl_allocator->alloc
|
||||
#define talloc0 tgl_alloc0
|
||||
#define tfree tgl_allocator->free
|
||||
#define tfree_str tgl_free_str
|
||||
#define tfree_secure tgl_free_secure
|
||||
#define trealloc tgl_allocator->realloc
|
||||
#define tcheck tgl_allocator->check
|
||||
#define texists tgl_allocator->exists
|
||||
#define tstrdup tgl_strdup
|
||||
#define tstrndup tgl_strndup
|
||||
#define tasprintf tgl_asprintf
|
||||
#define tsnprintf tgl_snprintf
|
||||
|
||||
|
||||
struct tgl_allocator *tgl_allocator;
|
||||
double tglt_get_double_time (void);
|
||||
|
||||
int tgl_inflate (void *input, int ilen, void *output, int olen);
|
||||
//void ensure (int r);
|
||||
//void ensure_ptr (void *p);
|
||||
|
||||
static inline void out_of_memory (void) {
|
||||
fprintf (stderr, "Out of memory\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
static inline void ensure (int r) {
|
||||
if (!r) {
|
||||
fprintf (stderr, "Open SSL error\n");
|
||||
ERR_print_errors_fp (stderr);
|
||||
assert (0);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void ensure_ptr (void *p) {
|
||||
if (p == NULL) {
|
||||
out_of_memory ();
|
||||
}
|
||||
}
|
||||
|
||||
void *tgl_alloc_debug (size_t size);
|
||||
void *tgl_alloc_release (size_t size);
|
||||
|
||||
void *tgl_realloc_debug (void *ptr, size_t old_size, size_t size);
|
||||
void *tgl_realloc_release (void *ptr, size_t old_size, size_t size);
|
||||
|
||||
void *tgl_alloc0 (size_t size);
|
||||
char *tgl_strdup (const char *s);
|
||||
char *tgl_strndup (const char *s, size_t n);
|
||||
|
||||
void tgl_free_debug (void *ptr, int size);
|
||||
void tgl_free_release (void *ptr, int size);
|
||||
//void tgl_free_str (void *ptr);
|
||||
//void tgl_free_secure (void *ptr, int size);
|
||||
|
||||
void tgl_check_debug (void);
|
||||
void tgl_exists_debug (void *ptr, int size);
|
||||
void tgl_check_release (void);
|
||||
void tgl_exists_release (void *ptr, int size);
|
||||
|
||||
|
||||
int tgl_snprintf (char *buf, int len, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
|
||||
int tgl_asprintf (char **res, const char *format, ...) __attribute__ ((format (printf, 2, 3)));
|
||||
|
||||
void tglt_secure_random (void *s, int l);
|
||||
void tgl_my_clock_gettime (int clock_id, struct timespec *T);
|
||||
|
||||
static inline void tgl_free_str (void *ptr) {
|
||||
if (!ptr) { return; }
|
||||
tfree (ptr, strlen (ptr) + 1);
|
||||
}
|
||||
|
||||
static inline void tgl_free_secure (void *ptr, int size) {
|
||||
memset (ptr, 0, size);
|
||||
tfree (ptr, size);
|
||||
}
|
||||
|
||||
static inline void hexdump (void *ptr, void *end_ptr) {
|
||||
int total = 0;
|
||||
while (ptr < end_ptr) {
|
||||
fprintf (stderr, "%08x", (int)*(char *)ptr);
|
||||
ptr ++;
|
||||
total ++;
|
||||
if (total == 16) {
|
||||
fprintf (stderr, "\n");
|
||||
total = 0;
|
||||
}
|
||||
}
|
||||
if (total) { fprintf (stderr, "\n"); }
|
||||
}
|
||||
|
||||
|
||||
#endif
|
594
updates.c
594
updates.c
@ -1,594 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
#include "tgl.h"
|
||||
#include "updates.h"
|
||||
#include "mtproto-common.h"
|
||||
#include "binlog.h"
|
||||
#include "auto.h"
|
||||
#include "structures.h"
|
||||
#include "tree.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
void tglu_fetch_pts (struct tgl_state *TLS) {
|
||||
int p = fetch_int ();
|
||||
if (p <= TLS->pts) { return; }
|
||||
bl_do_set_pts (TLS, p);
|
||||
}
|
||||
|
||||
void tglu_fetch_qts (struct tgl_state *TLS) {
|
||||
int p = fetch_int ();
|
||||
if (p <= TLS->qts) { return; }
|
||||
bl_do_set_qts (TLS, p);
|
||||
}
|
||||
|
||||
void tglu_fetch_date (struct tgl_state *TLS) {
|
||||
int p = fetch_int ();
|
||||
if (p > TLS->date) {
|
||||
//TLS->date = p;
|
||||
bl_do_set_date (TLS, TLS->date);
|
||||
}
|
||||
}
|
||||
|
||||
static void fetch_dc_option (struct tgl_state *TLS) {
|
||||
assert (fetch_int () == CODE_dc_option);
|
||||
int id = fetch_int ();
|
||||
int l1 = prefetch_strlen ();
|
||||
char *name = fetch_str (l1);
|
||||
int l2 = prefetch_strlen ();
|
||||
char *ip = fetch_str (l2);
|
||||
int port = fetch_int ();
|
||||
vlogprintf (E_DEBUG, "id = %d, name = %.*s ip = %.*s port = %d\n", id, l1, name, l2, ip, port);
|
||||
|
||||
bl_do_dc_option (TLS, id, l1, name, l2, ip, port);
|
||||
}
|
||||
|
||||
void tglu_work_update (struct tgl_state *TLS, struct connection *c, long long msg_id) {
|
||||
unsigned op = fetch_int ();
|
||||
switch (op) {
|
||||
case CODE_update_new_message:
|
||||
{
|
||||
struct tgl_message *M = tglf_fetch_alloc_message (TLS);
|
||||
assert (M);
|
||||
tglu_fetch_pts (TLS);
|
||||
bl_do_msg_update (TLS, M->id);
|
||||
break;
|
||||
};
|
||||
case CODE_update_message_i_d:
|
||||
{
|
||||
int id = fetch_int (); // id
|
||||
int new = fetch_long (); // random_id
|
||||
struct tgl_message *M = tgl_message_get (TLS, new);
|
||||
if (M) {
|
||||
bl_do_set_msg_id (TLS, M, id);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_read_messages:
|
||||
{
|
||||
assert (fetch_int () == (int)CODE_vector);
|
||||
int n = fetch_int ();
|
||||
|
||||
//int p = 0;
|
||||
int i;
|
||||
for (i = 0; i < n; i++) {
|
||||
int id = fetch_int ();
|
||||
struct tgl_message *M = tgl_message_get (TLS, id);
|
||||
if (M) {
|
||||
bl_do_set_unread (TLS, M, 0);
|
||||
}
|
||||
}
|
||||
tglu_fetch_pts (TLS);
|
||||
}
|
||||
break;
|
||||
case CODE_update_user_typing:
|
||||
{
|
||||
//vlogprintf (E_ERROR, "user typing\n");
|
||||
tgl_peer_id_t id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *U = tgl_peer_get (TLS, id);
|
||||
enum tgl_typing_status status = tglf_fetch_typing ();
|
||||
|
||||
if (TLS->callback.type_notification && U) {
|
||||
TLS->callback.type_notification (TLS, (void *)U, status);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_chat_user_typing:
|
||||
{
|
||||
//vlogprintf (E_ERROR, "chat typing\n");
|
||||
tgl_peer_id_t chat_id = TGL_MK_CHAT (fetch_int ());
|
||||
tgl_peer_id_t id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *C = tgl_peer_get (TLS, chat_id);
|
||||
tgl_peer_t *U = tgl_peer_get (TLS, id);
|
||||
enum tgl_typing_status status = tglf_fetch_typing ();
|
||||
|
||||
if (U && C) {
|
||||
if (TLS->callback.type_in_chat_notification) {
|
||||
TLS->callback.type_in_chat_notification (TLS, (void *)U, (void *)C, status);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_user_status:
|
||||
{
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *U = tgl_peer_get (TLS, user_id);
|
||||
if (U) {
|
||||
tglf_fetch_user_status (TLS, &U->user.status, &U->user);
|
||||
|
||||
if (TLS->callback.status_notification) {
|
||||
TLS->callback.status_notification (TLS, (void *)U);
|
||||
}
|
||||
} else {
|
||||
assert (skip_type_any (TYPE_TO_PARAM (user_status)) >= 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_user_name:
|
||||
{
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *UC = tgl_peer_get (TLS, user_id);
|
||||
if (UC && (UC->flags & FLAG_CREATED)) {
|
||||
int l1 = prefetch_strlen ();
|
||||
char *f = fetch_str (l1);
|
||||
int l2 = prefetch_strlen ();
|
||||
char *l = fetch_str (l2);
|
||||
struct tgl_user *U = &UC->user;
|
||||
bl_do_user_set_real_name (TLS, U, f, l1, l, l2);
|
||||
int l3 = prefetch_strlen ();
|
||||
f = fetch_str (l3);
|
||||
bl_do_user_set_username (TLS, U, f, l3);
|
||||
} else {
|
||||
fetch_skip_str ();
|
||||
fetch_skip_str ();
|
||||
fetch_skip_str ();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_user_photo:
|
||||
{
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *UC = tgl_peer_get (TLS, user_id);
|
||||
tglu_fetch_date (TLS);
|
||||
if (UC && (UC->flags & FLAG_CREATED)) {
|
||||
struct tgl_user *U = &UC->user;
|
||||
unsigned y = fetch_int ();
|
||||
long long photo_id;
|
||||
struct tgl_file_location big;
|
||||
struct tgl_file_location small;
|
||||
memset (&big, 0, sizeof (big));
|
||||
memset (&small, 0, sizeof (small));
|
||||
if (y == CODE_user_profile_photo_empty) {
|
||||
photo_id = 0;
|
||||
big.dc = -2;
|
||||
small.dc = -2;
|
||||
} else {
|
||||
assert (y == CODE_user_profile_photo);
|
||||
photo_id = fetch_long ();
|
||||
tglf_fetch_file_location (TLS, &small);
|
||||
tglf_fetch_file_location (TLS, &big);
|
||||
}
|
||||
bl_do_set_user_profile_photo (TLS, U, photo_id, &big, &small);
|
||||
} else {
|
||||
struct tgl_file_location t;
|
||||
unsigned y = fetch_int ();
|
||||
if (y == CODE_user_profile_photo_empty) {
|
||||
} else {
|
||||
assert (y == CODE_user_profile_photo);
|
||||
fetch_long (); // photo_id
|
||||
tglf_fetch_file_location (TLS, &t);
|
||||
tglf_fetch_file_location (TLS, &t);
|
||||
}
|
||||
}
|
||||
fetch_bool ();
|
||||
}
|
||||
break;
|
||||
case CODE_update_restore_messages:
|
||||
{
|
||||
assert (fetch_int () == CODE_vector);
|
||||
int n = fetch_int ();
|
||||
fetch_skip (n);
|
||||
tglu_fetch_pts (TLS);
|
||||
}
|
||||
break;
|
||||
case CODE_update_delete_messages:
|
||||
{
|
||||
assert (fetch_int () == CODE_vector);
|
||||
int n = fetch_int ();
|
||||
fetch_skip (n);
|
||||
tglu_fetch_pts (TLS);
|
||||
}
|
||||
break;
|
||||
case CODE_update_chat_participants:
|
||||
{
|
||||
unsigned x = fetch_int ();
|
||||
assert (x == CODE_chat_participants || x == CODE_chat_participants_forbidden);
|
||||
tgl_peer_id_t chat_id = TGL_MK_CHAT (fetch_int ());
|
||||
int n = 0;
|
||||
tgl_peer_t *C = tgl_peer_get (TLS, chat_id);
|
||||
if (C && (C->flags & FLAG_CREATED)) {
|
||||
if (x == CODE_chat_participants) {
|
||||
bl_do_chat_set_admin (TLS, &C->chat, fetch_int ());
|
||||
assert (fetch_int () == CODE_vector);
|
||||
n = fetch_int ();
|
||||
struct tgl_chat_user *users = talloc (12 * n);
|
||||
int i;
|
||||
for (i = 0; i < n; i++) {
|
||||
assert (fetch_int () == (int)CODE_chat_participant);
|
||||
users[i].user_id = fetch_int ();
|
||||
users[i].inviter_id = fetch_int ();
|
||||
users[i].date = fetch_int ();
|
||||
}
|
||||
int version = fetch_int ();
|
||||
bl_do_chat_set_participants (TLS, &C->chat, version, n, users);
|
||||
}
|
||||
} else {
|
||||
if (x == CODE_chat_participants) {
|
||||
fetch_int (); // admin_id
|
||||
assert (fetch_int () == CODE_vector);
|
||||
n = fetch_int ();
|
||||
fetch_skip (n * 4);
|
||||
fetch_int (); // version
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_contact_registered:
|
||||
{
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *U = tgl_peer_get (TLS, user_id);
|
||||
fetch_int (); // date
|
||||
if (TLS->callback.user_registered && U) {
|
||||
TLS->callback.user_registered (TLS, (void *)U);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_contact_link:
|
||||
{
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *U = tgl_peer_get (TLS, user_id);
|
||||
unsigned t = fetch_int ();
|
||||
assert (t == CODE_contacts_my_link_empty || t == CODE_contacts_my_link_requested || t == CODE_contacts_my_link_contact);
|
||||
if (t == CODE_contacts_my_link_requested) {
|
||||
fetch_bool (); // has_phone
|
||||
}
|
||||
t = fetch_int ();
|
||||
assert (t == CODE_contacts_foreign_link_unknown || t == CODE_contacts_foreign_link_requested || t == CODE_contacts_foreign_link_mutual);
|
||||
if (t == CODE_contacts_foreign_link_requested) {
|
||||
fetch_bool (); // has_phone
|
||||
}
|
||||
if (U) {}
|
||||
}
|
||||
break;
|
||||
case CODE_update_activation:
|
||||
{
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *U = tgl_peer_get (TLS, user_id);
|
||||
|
||||
if (TLS->callback.user_activated && U) {
|
||||
TLS->callback.user_activated (TLS, (void *)U);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_new_authorization:
|
||||
{
|
||||
fetch_long (); // auth_key_id
|
||||
fetch_int (); // date
|
||||
char *s = fetch_str_dup ();
|
||||
char *location = fetch_str_dup ();
|
||||
if (TLS->callback.new_authorization) {
|
||||
TLS->callback.new_authorization (TLS, s, location);
|
||||
}
|
||||
tfree_str (s);
|
||||
tfree_str (location);
|
||||
}
|
||||
break;
|
||||
case CODE_update_new_geo_chat_message:
|
||||
{
|
||||
struct tgl_message *M = tglf_fetch_alloc_geo_message (TLS);
|
||||
assert (M);
|
||||
bl_do_msg_update (TLS, M->id);
|
||||
}
|
||||
break;
|
||||
case CODE_update_new_encrypted_message:
|
||||
{
|
||||
struct tgl_message *M = tglf_fetch_alloc_encrypted_message (TLS);
|
||||
assert (M);
|
||||
tglu_fetch_qts (TLS);
|
||||
bl_do_msg_update (TLS, M->id);
|
||||
}
|
||||
break;
|
||||
case CODE_update_encryption:
|
||||
{
|
||||
struct tgl_secret_chat *E = tglf_fetch_alloc_encrypted_chat (TLS);
|
||||
vlogprintf (E_DEBUG, "Secret chat state = %d\n", E->state);
|
||||
if (E->state == sc_ok) {
|
||||
tgl_do_send_encr_chat_layer (TLS, E);
|
||||
}
|
||||
fetch_int (); // date
|
||||
}
|
||||
break;
|
||||
case CODE_update_encrypted_chat_typing:
|
||||
{
|
||||
tgl_peer_id_t id = TGL_MK_ENCR_CHAT (fetch_int ());
|
||||
tgl_peer_t *P = tgl_peer_get (TLS, id);
|
||||
|
||||
if (P) {
|
||||
if (TLS->callback.type_in_secret_chat_notification) {
|
||||
TLS->callback.type_in_secret_chat_notification (TLS, (void *)P);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_encrypted_messages_read:
|
||||
{
|
||||
tgl_peer_id_t id = TGL_MK_ENCR_CHAT (fetch_int ()); // chat_id
|
||||
fetch_int (); // max_date
|
||||
fetch_int (); // date
|
||||
tgl_peer_t *P = tgl_peer_get (TLS, id);
|
||||
//int x = -1;
|
||||
if (P && P->last) {
|
||||
//x = 0;
|
||||
struct tgl_message *M = P->last;
|
||||
while (M && (!M->out || M->unread)) {
|
||||
if (M->out) {
|
||||
bl_do_set_unread (TLS, M, 0);
|
||||
}
|
||||
M = M->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_chat_participant_add:
|
||||
{
|
||||
tgl_peer_id_t chat_id = TGL_MK_CHAT (fetch_int ());
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_id_t inviter_id = TGL_MK_USER (fetch_int ());
|
||||
int version = fetch_int ();
|
||||
|
||||
tgl_peer_t *C = tgl_peer_get (TLS, chat_id);
|
||||
if (C && (C->flags & FLAG_CREATED)) {
|
||||
bl_do_chat_add_user (TLS, &C->chat, version, tgl_get_peer_id (user_id), tgl_get_peer_id (inviter_id), time (0));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_chat_participant_delete:
|
||||
{
|
||||
tgl_peer_id_t chat_id = TGL_MK_CHAT (fetch_int ());
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
int version = fetch_int ();
|
||||
|
||||
tgl_peer_t *C = tgl_peer_get (TLS, chat_id);
|
||||
if (C && (C->flags & FLAG_CREATED)) {
|
||||
bl_do_chat_del_user (TLS, &C->chat, version, tgl_get_peer_id (user_id));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_dc_options:
|
||||
{
|
||||
assert (fetch_int () == CODE_vector);
|
||||
int n = fetch_int ();
|
||||
assert (n >= 0);
|
||||
int i;
|
||||
for (i = 0; i < n; i++) {
|
||||
fetch_dc_option (TLS);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_user_blocked:
|
||||
{
|
||||
int id = fetch_int ();
|
||||
int blocked = fetch_bool ();
|
||||
tgl_peer_t *P = tgl_peer_get (TLS, TGL_MK_USER (id));
|
||||
if (P && (P->flags & FLAG_CREATED)) {
|
||||
bl_do_user_set_blocked (TLS, &P->user, blocked);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_notify_settings:
|
||||
{
|
||||
assert (skip_type_any (TYPE_TO_PARAM (notify_peer)) >= 0);
|
||||
assert (skip_type_any (TYPE_TO_PARAM (peer_notify_settings)) >= 0);
|
||||
}
|
||||
break;
|
||||
case CODE_update_service_notification:
|
||||
{
|
||||
int l1 = prefetch_strlen ();
|
||||
char *type = fetch_str (l1);
|
||||
int l2 = prefetch_strlen ();
|
||||
char *message = fetch_str (l2);
|
||||
skip_type_message_media (TYPE_TO_PARAM(message_media));
|
||||
fetch_bool ();
|
||||
vlogprintf (E_ERROR, "Notification %.*s: %.*s\n", l1, type, l2, message);
|
||||
if (TLS->callback.notification) {
|
||||
char *t = tstrndup (type, l1);
|
||||
char *m = tstrndup (message, l2);
|
||||
TLS->callback.notification (TLS, t, m);
|
||||
tfree_str (t);
|
||||
tfree_str (m);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
vlogprintf (E_ERROR, "Unknown update type %08x\n", op);
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
void tglu_work_update_short (struct tgl_state *TLS, struct connection *c, long long msg_id) {
|
||||
int *save = in_ptr;
|
||||
assert (!skip_type_any (TYPE_TO_PARAM (updates)));
|
||||
int *save_end = in_ptr;
|
||||
in_ptr = save;
|
||||
|
||||
assert (fetch_int () == CODE_update_short);
|
||||
tglu_work_update (TLS, c, msg_id);
|
||||
tglu_fetch_date (TLS);
|
||||
|
||||
assert (save_end == in_ptr);
|
||||
}
|
||||
|
||||
static int do_skip_seq (struct tgl_state *TLS, int seq) {
|
||||
if (TLS->seq) {
|
||||
if (seq <= TLS->seq) {
|
||||
vlogprintf (E_NOTICE, "Duplicate message with seq=%d\n", seq);
|
||||
return -1;
|
||||
}
|
||||
if (seq > TLS->seq + 1) {
|
||||
vlogprintf (E_NOTICE, "Hole in seq (seq = %d, cur_seq = %d)\n", seq, TLS->seq);
|
||||
//vlogprintf (E_NOTICE, "lock_diff = %s\n", (TLS->locks & TGL_LOCK_DIFF) ? "true" : "false");
|
||||
tgl_do_get_difference (TLS, 0, 0, 0);
|
||||
return -1;
|
||||
}
|
||||
if (TLS->locks & TGL_LOCK_DIFF) {
|
||||
vlogprintf (E_DEBUG, "Update during get_difference. seq = %d\n", seq);
|
||||
return -1;
|
||||
}
|
||||
vlogprintf (E_DEBUG, "Ok update. seq = %d\n", seq);
|
||||
return 0;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void tglu_work_updates (struct tgl_state *TLS, struct connection *c, long long msg_id) {
|
||||
int *save = in_ptr;
|
||||
assert (!skip_type_any (TYPE_TO_PARAM (updates)));
|
||||
if (do_skip_seq (TLS, *(in_ptr - 1)) < 0) {
|
||||
return;
|
||||
}
|
||||
int *save_end = in_ptr;
|
||||
in_ptr = save;
|
||||
assert (fetch_int () == CODE_updates);
|
||||
assert (fetch_int () == CODE_vector);
|
||||
int n = fetch_int ();
|
||||
int i;
|
||||
for (i = 0; i < n; i++) {
|
||||
tglu_work_update (TLS, c, msg_id);
|
||||
}
|
||||
assert (fetch_int () == CODE_vector);
|
||||
n = fetch_int ();
|
||||
for (i = 0; i < n; i++) {
|
||||
tglf_fetch_alloc_user (TLS);
|
||||
}
|
||||
assert (fetch_int () == CODE_vector);
|
||||
n = fetch_int ();
|
||||
for (i = 0; i < n; i++) {
|
||||
tglf_fetch_alloc_chat (TLS);
|
||||
}
|
||||
bl_do_set_date (TLS, fetch_int ());
|
||||
//bl_do_set_seq (fetch_int ());
|
||||
int seq = fetch_int ();
|
||||
assert (seq == TLS->seq + 1);
|
||||
bl_do_set_seq (TLS, seq);
|
||||
assert (save_end == in_ptr);
|
||||
}
|
||||
|
||||
void tglu_work_update_short_message (struct tgl_state *TLS, struct connection *c, long long msg_id) {
|
||||
int *save = in_ptr;
|
||||
assert (!skip_type_any (TYPE_TO_PARAM (updates)));
|
||||
if (do_skip_seq (TLS, *(in_ptr - 1)) < 0) {
|
||||
return;
|
||||
}
|
||||
int *save_end = in_ptr;
|
||||
in_ptr = save;
|
||||
|
||||
assert (fetch_int () == (int)CODE_update_short_message);
|
||||
struct tgl_message *M = tglf_fetch_alloc_message_short (TLS);
|
||||
assert (M);
|
||||
|
||||
assert (save_end == in_ptr);
|
||||
if (!(TLS->locks & TGL_LOCK_DIFF)) {
|
||||
bl_do_msg_seq_update (TLS, M->id);
|
||||
}
|
||||
}
|
||||
|
||||
void tglu_work_update_short_chat_message (struct tgl_state *TLS, struct connection *c, long long msg_id) {
|
||||
int *save = in_ptr;
|
||||
assert (!skip_type_any (TYPE_TO_PARAM (updates)));
|
||||
if (do_skip_seq (TLS, *(in_ptr - 1)) < 0) {
|
||||
return;
|
||||
}
|
||||
int *save_end = in_ptr;
|
||||
in_ptr = save;
|
||||
|
||||
assert (fetch_int () == CODE_update_short_chat_message);
|
||||
struct tgl_message *M = tglf_fetch_alloc_message_short_chat (TLS);
|
||||
assert (M);
|
||||
assert (save_end == in_ptr);
|
||||
|
||||
if (!(TLS->locks & TGL_LOCK_DIFF)) {
|
||||
bl_do_msg_seq_update (TLS, M->id);
|
||||
}
|
||||
}
|
||||
|
||||
void tglu_work_updates_to_long (struct tgl_state *TLS, struct connection *c, long long msg_id) {
|
||||
assert (fetch_int () == (int)CODE_updates_too_long);
|
||||
vlogprintf (E_NOTICE, "updates too long... Getting difference\n");
|
||||
tgl_do_get_difference (TLS, 0, 0, 0);
|
||||
}
|
||||
|
||||
#define user_cmp(a,b) (tgl_get_peer_id ((a)->id) - tgl_get_peer_id ((b)->id))
|
||||
DEFINE_TREE(user, struct tgl_user *,user_cmp,0)
|
||||
|
||||
static void notify_status (struct tgl_user *U, void *ex) {
|
||||
struct tgl_state *TLS = ex;
|
||||
if (TLS->callback.user_status_update) {
|
||||
TLS->callback.user_status_update (TLS, U);
|
||||
}
|
||||
}
|
||||
|
||||
static void status_notify (struct tgl_state *TLS, void *arg) {
|
||||
tree_act_ex_user (TLS->online_updates, notify_status, TLS);
|
||||
tree_clear_user (TLS->online_updates);
|
||||
TLS->online_updates = NULL;
|
||||
TLS->timer_methods->free (TLS->online_updates_timer);
|
||||
TLS->online_updates_timer = NULL;
|
||||
}
|
||||
|
||||
void tgl_insert_status_update (struct tgl_state *TLS, struct tgl_user *U) {
|
||||
if (!tree_lookup_user (TLS->online_updates, U)) {
|
||||
TLS->online_updates = tree_insert_user (TLS->online_updates, U, lrand48 ());
|
||||
}
|
||||
if (!TLS->online_updates_timer) {
|
||||
TLS->online_updates_timer = TLS->timer_methods->alloc (TLS, status_notify, 0);
|
||||
TLS->timer_methods->insert (TLS->online_updates_timer, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void user_expire (struct tgl_state *TLS, void *arg) {
|
||||
struct tgl_user *U = arg;
|
||||
TLS->timer_methods->free (U->status.ev);
|
||||
U->status.ev = 0;
|
||||
U->status.online = -1;
|
||||
U->status.when = tglt_get_double_time ();
|
||||
tgl_insert_status_update (TLS, U);
|
||||
}
|
||||
|
||||
void tgl_insert_status_expire (struct tgl_state *TLS, struct tgl_user *U) {
|
||||
assert (!U->status.ev);
|
||||
U->status.ev = TLS->timer_methods->alloc (TLS, user_expire, U);
|
||||
TLS->timer_methods->insert (U->status.ev, U->status.when - tglt_get_double_time ());
|
||||
}
|
||||
|
||||
void tgl_remove_status_expire (struct tgl_state *TLS, struct tgl_user *U) {
|
||||
TLS->timer_methods->free (U->status.ev);
|
||||
U->status.ev = 0;
|
||||
}
|
39
updates.h
39
updates.h
@ -1,39 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-library
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
*/
|
||||
|
||||
#ifndef __UPDATES_H__
|
||||
#define __UPDATES_H__
|
||||
struct connection;
|
||||
void tglu_work_update (struct tgl_state *TLS, struct connection *c, long long msg_id);
|
||||
void tglu_work_updates_to_long (struct tgl_state *TLS, struct connection *c, long long msg_id);
|
||||
void tglu_work_update_short_chat_message (struct tgl_state *TLS, struct connection *c, long long msg_id);
|
||||
void tglu_work_update_short_message (struct tgl_state *TLS, struct connection *c, long long msg_id);
|
||||
void tglu_work_update_short (struct tgl_state *TLS, struct connection *c, long long msg_id);
|
||||
void tglu_work_updates (struct tgl_state *TLS, struct connection *c, long long msg_id);
|
||||
|
||||
void tglu_fetch_pts (struct tgl_state *TLS);
|
||||
void tglu_fetch_qts (struct tgl_state *TLS);
|
||||
void tglu_fetch_seq (struct tgl_state *TLS);
|
||||
void tglu_fetch_date (struct tgl_state *TLS);
|
||||
|
||||
void tgl_insert_status_update (struct tgl_state *TLS, struct tgl_user *U);
|
||||
void tgl_insert_status_expire (struct tgl_state *TLS, struct tgl_user *U);
|
||||
void tgl_remove_status_expire (struct tgl_state *TLS, struct tgl_user *U);
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user