Comparar commits
545 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 6547c0b21b | |||
| 443793df82 | |||
| ca8c525c39 | |||
| d1d7e04d10 | |||
| 47e816f58f | |||
| 2a1df8cd99 | |||
| 160231bdd7 | |||
| da669580a3 | |||
| 2b45dd6799 | |||
| e7d7bc5776 | |||
| 2bfcbf0ad0 | |||
| b7a0987d19 | |||
| c16ad44d5e | |||
| a7ade1b76e | |||
| bde3a39be9 | |||
| 04105bbf94 | |||
| 4801d1ca04 | |||
| cabeaaf97b | |||
| 0a23e238d9 | |||
| 5c926e45c4 | |||
| fc795a618a | |||
| 6af53f16ff | |||
| 59e5e8eeea | |||
| 1b54524bbb | |||
| 6e65073f73 | |||
| 3abec73950 | |||
| e0f5f16353 | |||
| ea86db505d | |||
| e35946fde6 | |||
| c61c8ba9fa | |||
| 5d29294c3b | |||
| 0881c5d0e7 | |||
| fec69314fe | |||
| 681b8e7900 | |||
| e7035d7dda | |||
| 666e69391e | |||
| 021e435e85 | |||
| fed99d9b18 | |||
| 5e9e5ce409 | |||
| c980f714e9 | |||
| 09d89efdb0 | |||
| 4b4a2053ad | |||
| aabdd3d6e2 | |||
| ffe31ad3ca | |||
| 3a898a42c1 | |||
| 3eed225772 | |||
| bcacfa0afa | |||
| ed75ad848f | |||
| 39dc7dc9c7 | |||
| ee63855415 | |||
| 186e6c007f | |||
| 5f266deaec | |||
| 68e3e1a4db | |||
| a773850882 | |||
| 865c0a933c | |||
| dd748e1be5 | |||
| 9fd8a07d33 | |||
| c69f2a2326 | |||
| a9983e01c8 | |||
| 1ff2a5f921 | |||
| ea42899671 | |||
| e7de7b9d73 | |||
| 7b1906deba | |||
| e641392b0f | |||
| 8682753c5d | |||
| de54c0038b | |||
| cde068c34b | |||
| c4ab8737b6 | |||
| c95ff0d0c5 | |||
| 350b4b1ea4 | |||
| d8a00541d8 | |||
| 3b897e260b | |||
| bf65b0e2b1 | |||
| bbf269283d | |||
| a21c8f87a0 | |||
| ef1e76bf0c | |||
| 957ad6e3ed | |||
| 1026f8fb47 | |||
| 7d2a318394 | |||
| 4554ced4cc | |||
| 9ea96439a9 | |||
| a73ca70adf | |||
| c6de6b20fe | |||
| cd85857a1f | |||
| 3bbd8e5255 | |||
| 70b0aed3b3 | |||
| f0a08e349f | |||
| 8a20db568d | |||
| 8815904e79 | |||
| af87493012 | |||
| 598b441488 | |||
| 17fc871f15 | |||
| 8b0ff90800 | |||
| d15b20d48c | |||
| 8fe867943d | |||
| d67c52184e | |||
| 4c27091706 | |||
| eb09533723 | |||
| f324a79ef8 | |||
| 2052f4b381 | |||
| 2cc75016aa | |||
| 224160d804 | |||
| a4758e8c11 | |||
| 9d5cfe3929 | |||
| b935097816 | |||
| 21c9df5b27 | |||
| f6d34bc3bf | |||
| f3eabae061 | |||
| 616f88c039 | |||
| cf6cb90230 | |||
| 08c4f4851d | |||
| 4723db989d | |||
| 524ab24e88 | |||
| 29a4fca882 | |||
| ba51b8e079 | |||
| 708b2ee432 | |||
| d3ffa5b2a3 | |||
| be1ac1f456 | |||
| 6c4c76bd4f | |||
| c1edf44171 | |||
| c4ffd8c342 | |||
| e36ec84bf5 | |||
| 7e0cd1cd74 | |||
| 3dab3ac555 | |||
| 97bfa253e2 | |||
| e250f55a13 | |||
| d6a2abcb9e | |||
| b43ab0a522 | |||
| b9447e6ae1 | |||
| 6148830dcb | |||
| e8c16c6c29 | |||
| 5bb5070c10 | |||
| 491deec2b0 | |||
| 3a63591250 | |||
| de5d6de0c8 | |||
| 0faf9f80b7 | |||
| da4d26fed6 | |||
| 78680bf72d | |||
| 141982f5e3 | |||
| 44286cd15e | |||
| 105ccd2821 | |||
| ae31d58d19 | |||
| 706aed07cb | |||
| 7600da7458 | |||
| 4c5f9b797a | |||
| 4afe21e98a | |||
| 82cf03158c | |||
| c33e8da795 | |||
| fbff266dca | |||
| aee4b248a3 | |||
| 6dd3951948 | |||
| 90ba941804 | |||
| 5285cf2bd2 | |||
| c31a7ef524 | |||
| c170e98bf7 | |||
| 45aa6bf35d | |||
| b979de81ed | |||
| f1ea76b9bb | |||
| c13880e07c | |||
| 495d33e92a | |||
| af9f7b6cfa | |||
| ce2debce38 | |||
| 0a1a3a9d7a | |||
| 2930a63f2b | |||
| 11090500b2 | |||
| 908e4463e5 | |||
| e14062ff83 | |||
| 0d0be7d079 | |||
| a433579dae | |||
| 0723957e93 | |||
| 5f7b5e4068 | |||
| 5af46bdcd1 | |||
| ff704275c3 | |||
| 49951819c5 | |||
| a515e0c9b4 | |||
| f37588b1b9 | |||
| 77cfd51d92 | |||
| d81da1fe8d | |||
| 6f8bb4ce0c | |||
| e3efc4f798 | |||
| 44a20ae419 | |||
| ba1fb083fb | |||
| 0c573a985f | |||
| 90927315a7 | |||
| f6b14f633c | |||
| 05c52fd498 | |||
| 63f64a8e70 | |||
| cbe442b7c6 | |||
| c2bb5346df | |||
| 13c22f3b06 | |||
| a06507d49c | |||
| 842fd9f0fb | |||
| 7ee1d57ed2 | |||
| 7c9f097877 | |||
| 0305e38f13 | |||
| e14cf95a7b | |||
| 3422ccdc0e | |||
| 72d903c3dc | |||
| 1b01314689 | |||
| 7c89e61bb1 | |||
| 1a112a90fd | |||
| a3c79800db | |||
| 452c30fc88 | |||
| 8ba66a8603 | |||
| f9a7f19564 | |||
| 27d219486f | |||
| 9268a89d45 | |||
| 3aae4ed7be | |||
| 66f1da63ce | |||
| b9cc048334 | |||
| 6ad4b23246 | |||
| f99a9944c8 | |||
| 9c00b7dc75 | |||
| 206c17e5bd | |||
| 9ce0ed310f | |||
| d594d718f2 | |||
| 825cfcd96f | |||
| f1a18dabfe | |||
| 8c3adff675 | |||
| 6aa4dabf5f | |||
| 0cf690a8aa | |||
| 622303ce91 | |||
| 8b5a1f98d7 | |||
| 964b210f50 | |||
| 9d9f89a1f9 | |||
| 16a12a7398 | |||
| dbdf81cfbe | |||
| ce34da49f4 | |||
| ce4d9aff00 | |||
| 99bf18283d | |||
| 91c4fcaf8f | |||
| 0e340af2a8 | |||
| 03bd7fbc50 | |||
| faec9c9251 | |||
| b0c092e7b8 | |||
| 95094949ce | |||
| 5576d7a094 | |||
| d30885e9dc | |||
| f1eda8acff | |||
| 354aa64ae1 | |||
| b547ca7158 | |||
| 7f2fc476eb | |||
| fe030a69e2 | |||
| 7c9129b0b4 | |||
| 25ed20429c | |||
| fa26c2b696 | |||
| d6dec6f881 | |||
| d6407a028e | |||
| 0a74621916 | |||
| 3963eca8ca | |||
| 548c2b18e0 | |||
| 8ff3b78577 | |||
| 50a654706b | |||
| da885d595a | |||
| 36d5465d81 | |||
| 1ca2fe6941 | |||
| 77081999c4 | |||
| d001bcd2ca | |||
| 3af44a3bf8 | |||
| a7f42ed42d | |||
| d89499bff2 | |||
| e1d65dad8f | |||
| 2e62498539 | |||
| 287011c116 | |||
| c9f38274f5 | |||
| 5131593da4 | |||
| 3c32cba05e | |||
| 2460901ba5 | |||
| dadc452a2b | |||
| 30518100f0 | |||
| 9e70eb1a13 | |||
| 8c00b44863 | |||
| a301e83129 | |||
| a30333b4ea | |||
| 319bd1d6ff | |||
| faaea75eec | |||
| 66aa288b3d | |||
| b674adbd20 | |||
| 8b10fe78a6 | |||
| 9ccc3016cf | |||
| ad904dbdc0 | |||
| 30f0a3b128 | |||
| 5994d34eef | |||
| 3a13f800c9 | |||
| b658b61773 | |||
| 1b2fb1e1fe | |||
| e0c739148b | |||
| 3c6b54c6e1 | |||
| 5fcb8254dc | |||
| db463be5f6 | |||
| b290af88d3 | |||
| 81b2a5accf | |||
| 1b3cdff3fd | |||
| 3ced7bbb27 | |||
| 8b8a69ec83 | |||
| 5935c97ed0 | |||
| a825b63209 | |||
| 1823005ff5 | |||
| 611211cc09 | |||
| 89e0a1e275 | |||
| 081c65ce8f | |||
| 26dba968c5 | |||
| df628264d5 | |||
| 5174d1399a | |||
| 4afd5d5ced | |||
| 4daf7781be | |||
| aad54b4c83 | |||
| 2ab3feb392 | |||
| 871fc440b7 | |||
| c263a93a8b | |||
| 000f767fa8 | |||
| 554d78274e | |||
| 402375ec43 | |||
| 76aec0bf15 | |||
| 38d0b97179 | |||
| fe0ae2a87f | |||
| 89d5b7f262 | |||
| 4b5c2556d0 | |||
| caacc3c584 | |||
| e2edb7cc26 | |||
| 87f014d3c2 | |||
| 8995e45862 | |||
| 2ea0da50f0 | |||
| 434ccdd5f8 | |||
| 8679ab2e0d | |||
| b3fbcaeb0a | |||
| f1c8af606f | |||
| 4f9cde9af7 | |||
| 9c13a7a491 | |||
| 8eaa6119b6 | |||
| 4734c8ba9d | |||
| 3f22df2a0c | |||
| 96325e2ecd | |||
| c7a66e649f | |||
| 3f2c13b93f | |||
| a240097bbb | |||
| 2a99ce59d1 | |||
| 0bf9979697 | |||
| 7d2cac9ea4 | |||
| 0f4ceaa200 | |||
| 35b5623eb1 | |||
| 76d1ee2475 | |||
| 31524068b6 | |||
| 775f417cc2 | |||
| 1a31a20a5a | |||
| b7128530f3 | |||
| 0e2db10aa9 | |||
| ba1988b530 | |||
| 69839f1266 | |||
| 4240f81f2c | |||
| 20ce2ae158 | |||
| 393b514225 | |||
| 86352f2985 | |||
| 3dedb4ac80 | |||
| c35619f697 | |||
| 4dff2a3f4f | |||
| 577c44cca6 | |||
| 8e647e5a92 | |||
| bd55cfdb1a | |||
| 20435fad1b | |||
| f144d3ff30 | |||
| ead522dc8a | |||
| 6e86f81e27 | |||
| 5da1506e21 | |||
| fe1c9e345c | |||
| 232a9f12d9 | |||
| 443412cded | |||
| 8bcd9378a0 | |||
| b4b7a8db48 | |||
| 944fae599e | |||
| c72df608bb | |||
| 6322b8e22d | |||
| ff1057eaae | |||
| 67ec7aa4b3 | |||
| 01f5d9a3b6 | |||
| bdc8dc24e6 | |||
| d96750aba3 | |||
| 048bcb2c91 | |||
| 39f65fc902 | |||
| 0c981c1b81 | |||
| ffa73d94b8 | |||
| 8fddfe2963 | |||
| 1977eb8346 | |||
| ca6942724a | |||
| 92f9e9f166 | |||
| 09c6686ad4 | |||
| e74a4e4717 | |||
| d434580d23 | |||
| 1ae2224933 | |||
| 025b04f2b5 | |||
| 886cc484c0 | |||
| 723416d333 | |||
| f59c2a8441 | |||
| b77c35666d | |||
| 4118547208 | |||
| 4630862924 | |||
| bb302b367e | |||
| e3dce286e5 | |||
| 5f81eb4a36 | |||
| fde3182b40 | |||
| 2409907c6b | |||
| 43146158aa | |||
| d74db187ef | |||
| 0867734cb5 | |||
| c9987d95bb | |||
| f50759239d | |||
| 717b01ff7f | |||
| 27c2bdd592 | |||
| 8a14cf168a | |||
| 9d6b4fc518 | |||
| 2ffbc94b2e | |||
| b2e7b8e517 | |||
| 0d8601b996 | |||
| ee6d54e60b | |||
| 77424201de | |||
| 1868bac474 | |||
| 10f3ede066 | |||
| 018775e3c0 | |||
| 4cc118d766 | |||
| 9c050b0de8 | |||
| f302863aaa | |||
| fcf8d159c0 | |||
| 696533785c | |||
| 13b2dafe6a | |||
| 62371377f0 | |||
| f31ef233dd | |||
| 7f83a1246e | |||
| cbf952493c | |||
| 5405d183f1 | |||
| f376ad1d50 | |||
| 9aca8feb80 | |||
| 99b86ce567 | |||
| a65dcf16a7 | |||
| 253b86377d | |||
| 8adacac026 | |||
| 0639b1d192 | |||
| 6be3cf0f64 | |||
| ee45b627ae | |||
| a9b5fbe642 | |||
| 2c340e59bf | |||
| f45458c321 | |||
| ba4e76ed96 | |||
| 9d57c85f20 | |||
| 47a12f1a2a | |||
| bdbf8997e0 | |||
| 52a8adbcc2 | |||
| 862ae34ba8 | |||
| 9bf0962f4e | |||
| 56f002a185 | |||
| 03b1dd8639 | |||
| 31bd174917 | |||
| dbb6d196b5 | |||
| 723756f3ae | |||
| b522658be2 | |||
| 824804be51 | |||
| 807da5b3fb | |||
| f25aa36076 | |||
| 40422736f0 | |||
| cc0a811699 | |||
| 655a3b3cdc | |||
| 35e8622d64 | |||
| 318f8d5828 | |||
| b416aeece8 | |||
| a8d6211be4 | |||
| 56fe7bed54 | |||
| c01eb11296 | |||
| ff2cb23a50 | |||
| 282b1c6a81 | |||
| f024b4bf2a | |||
| 5308d0c6af | |||
| edcfc99171 | |||
| fdb5a00c12 | |||
| 25a4a72140 | |||
| de08953038 | |||
| 84795ec066 | |||
| 3765e69dba | |||
| b1491d87c4 | |||
| a3a4e63a49 | |||
| 8d9861af5a | |||
| ca194bef13 | |||
| a6c00cde52 | |||
| 77f5822946 | |||
| 4882b0adb5 | |||
| d564c65350 | |||
| 30f7d8e202 | |||
| fc16f25ed7 | |||
| 27d904cce0 | |||
| e914359a18 | |||
| 09bb322d7e | |||
| fab13d7722 | |||
| 9804997b19 | |||
| 6132516d5a | |||
| 4604d4f374 | |||
| c182b6d210 | |||
| 54f6743db7 | |||
| a8a5de7489 | |||
| d7f573ca81 | |||
| 62d3c07f34 | |||
| 2867d3733b | |||
| 465657d67b | |||
| b9f1a9b629 | |||
| f04b938c34 | |||
| 8edda5d31c | |||
| 0fb69739f9 | |||
| 7f11cd568a | |||
| 60f4f504e7 | |||
| 7a9764f24a | |||
| 8fb606a7aa | |||
| 52470ce207 | |||
| f1d2ecc66e | |||
| 804bf0b82e | |||
| 6087ad4097 | |||
| e5419d2da6 | |||
| ecdec4620d | |||
| 59abeaa188 | |||
| 8a71a3cb51 | |||
| f159bd954a | |||
| 611338ee26 | |||
| 0917afe134 | |||
| eaf35cc6f6 | |||
| 2f0a7b9d74 | |||
| 4e960fdd7b | |||
| 641f9a8e88 | |||
| 67b6f2e714 | |||
| 3363c53a80 | |||
| 61c1ac9ab4 | |||
| a9139222fb | |||
| d7477ecc6e | |||
| ed322812a4 | |||
| 8e493a58ed | |||
| 4290ed97e9 | |||
| b964338980 | |||
| 2a1d38ac5d | |||
| 283b8672a2 | |||
| 33e973ee9d | |||
| d6db27b7d5 | |||
| 77ab47b638 | |||
| 75b0f3d223 | |||
| 0346b6036f | |||
| 3eeeb5d03e | |||
| 7affcd8968 | |||
| 11bf4177cc | |||
| b9cf49e96f | |||
| ddcd8ad44e | |||
| fe9bd8ca91 |
@@ -1,6 +1,7 @@
|
||||
telegram
|
||||
*.o
|
||||
Makefile
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
config.h
|
||||
config.log
|
||||
@@ -12,3 +13,9 @@ objs/
|
||||
dep/
|
||||
auto/
|
||||
libs/
|
||||
debian/telegram-cli.[a-z]
|
||||
debian/files
|
||||
debian/telegram-cli/*
|
||||
debian/telegram-cli.debhelper.log
|
||||
debian/telegram-cli.substvars
|
||||
__pycache__
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "tgl"]
|
||||
path = tgl
|
||||
url = https://github.com/vysheng/tgl.git
|
||||
@@ -5,12 +5,17 @@ compiler:
|
||||
- clang
|
||||
|
||||
install:
|
||||
- sudo apt-get update
|
||||
- sudo apt-get install libconfig8-dev
|
||||
- sudo apt-get install libreadline6-dev
|
||||
- sudo apt-get install libssl-dev
|
||||
- sudo apt-get install liblua5.2-dev lua5.2
|
||||
- sudo apt-get install python-dev python
|
||||
- sudo apt-get install libevent-dev
|
||||
- sudo apt-get install libjansson-dev
|
||||
|
||||
script:
|
||||
- git submodule update --init --recursive
|
||||
- ./configure
|
||||
- make
|
||||
|
||||
|
||||
+27
@@ -1,3 +1,30 @@
|
||||
1.3.3
|
||||
* support for sending custom keyboard
|
||||
* fixed contact_search
|
||||
* TGL-2.0.3
|
||||
1.3.2
|
||||
* use TGL-2.0.2
|
||||
* add block/unblock user methods
|
||||
* support for autocomplete for bot's commands
|
||||
1.3.1
|
||||
* added error codes
|
||||
1.3.0
|
||||
* layer 28 support (passwords, replies, webpages, other changes)
|
||||
* output in json format
|
||||
* support for lua functions in CLI mode (register_interface_function)
|
||||
* bugfixes
|
||||
* output error codes to socket
|
||||
* allow [reply=<num>], [disable_preview] and [enable_preview] prefixes to query
|
||||
1.2.1
|
||||
* fixed registration/login problem
|
||||
* added extension to downloads
|
||||
1.2.0
|
||||
* layer 22 support
|
||||
* new authorization code
|
||||
* fixed time-related problems
|
||||
* fixed crash after hibernation
|
||||
1.0.6
|
||||
* layer 18 support
|
||||
1.0.5
|
||||
* listening socket (tcp and unix) for commands
|
||||
1.0.4
|
||||
|
||||
+28
-60
@@ -4,87 +4,55 @@ CFLAGS=@CFLAGS@
|
||||
LDFLAGS=@LDFLAGS@ @OPENSSL_LDFLAGS@
|
||||
CPPFLAGS=@CPPFLAGS@ @OPENSSL_INCLUDES@
|
||||
DEFS=@DEFS@
|
||||
COMPILE_FLAGS=${CFLAGS} ${CPFLAGS} ${CPPFLAGS} ${DEFS} -Wall -Wextra -Werror -Wno-deprecated-declarations -fno-strict-aliasing -fno-omit-frame-pointer -ggdb -Wno-unused-parameter -fPIC
|
||||
|
||||
COMPILE_FLAGS=${CFLAGS} ${CPFLAGS} ${CPPFLAGS} ${DEFS} -Wall -Werror -Wextra -Wno-missing-field-initializers -Wno-deprecated-declarations -fno-strict-aliasing -fno-omit-frame-pointer -ggdb -Wno-unused-parameter -fPIC
|
||||
EXTRA_LIBS=@LIBS@ @EXTRA_LIBS@ @OPENSSL_LIBS@
|
||||
LOCAL_LDFLAGS=-rdynamic -ggdb -levent ${EXTRA_LIBS}
|
||||
LOCAL_LDFLAGS=-rdynamic -ggdb -levent ${EXTRA_LIBS} -ldl -lpthread -lutil
|
||||
LINK_FLAGS=${LDFLAGS} ${LOCAL_LDFLAGS}
|
||||
|
||||
DEP=${srcdir}/dep
|
||||
AUTO=${srcdir}/auto
|
||||
EXE=${srcdir}/bin
|
||||
OBJ=${srcdir}/objs
|
||||
LIB=${srcdir}/libs
|
||||
DIR_LIST=${DEP} ${AUTO} ${EXE} ${OBJ} ${LIB} ${DEP}/auto ${OBJ}/auto
|
||||
DEP=dep
|
||||
AUTO=auto
|
||||
EXE=bin
|
||||
OBJ=objs
|
||||
LIB=libs
|
||||
DIR_LIST=${DEP} ${AUTO} ${EXE} ${OBJ} ${LIB} ${DEP}/auto ${OBJ}/auto ${OBJ}/crypto ${DEP}/crypto
|
||||
|
||||
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}/lua-tg.o
|
||||
TGL_OBJECTS=${OBJ}/net.o ${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
|
||||
GENERATE_OBJECTS=${OBJ}/generate.o
|
||||
COMMON_OBJECTS=${OBJ}/tools.o
|
||||
OBJ_LIST=${TG_OBJECTS} ${TLC_OBJECTS} ${GENERATE_OBJECTS} ${COMMON_OBJECTS} ${TGL_OBJECTS}
|
||||
OBJ_C=${TLC_OBJECTS} ${GENERATE_OBJECTS} ${COMMON_OBJECTS} ${TGL_OBJECTS}
|
||||
TG_OBJECTS=${OBJ}/main.o ${OBJ}/loop.o ${OBJ}/interface.o ${OBJ}/lua-tg.o ${OBJ}/json-tg.o ${OBJ}/python-tg.o ${OBJ}/python-types.o
|
||||
|
||||
DEPENDENCE=$(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${OBJ_LIST}))
|
||||
DEPENDENCE_LIST=${DEPENDENCE}
|
||||
|
||||
INCLUDE=-I. -I${srcdir}
|
||||
INCLUDE=-I. -I${srcdir} -I${srcdir}/tgl
|
||||
CC=@CC@
|
||||
|
||||
.SUFFIXES:
|
||||
|
||||
.SUFFIXES: .c .h .o
|
||||
|
||||
all: ${EXE_LIST} ${DIR_LIST} ${LIB_LIST}
|
||||
create_dirs_and_headers: ${DIR_LIST} ${AUTO}/auto.c ${AUTO}/auto-header.h ${AUTO}/constants.h
|
||||
all: ${EXE_LIST} ${DIR_LIST}
|
||||
create_dirs_and_headers: ${DIR_LIST} ${AUTO}/auto-skip.h ${AUTO}/auto-fetch.h ${AUTO}/auto-store.h ${AUTO}/auto-autocomplete.h ${AUTO}/auto-types.h ${AUTO}/constants.h ${AUTO}/constants.h ${AUTO}/auto-skip.h ${AUTO}/auto-fetch.h ${AUTO}/auto-store.h ${AUTO}/auto-autocomplete.h ${AUTO}/auto-types.h ${AUTO}/auto-fetch-ds.h ${AUTO}/auto-free-ds.h ${AUTO}/auto-store-ds.h ${AUTO}/auto-print-ds.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 $@
|
||||
|
||||
OBJ_LIST=${TG_OBJECTS} ${TGL_OBJECTS} ${TGL_COMMON_OBJECTS} ${GENERATE_OBJECTS} ${TL_PARSER_OBJECTS} ${TGL_OBJECTS_AUTO}
|
||||
DEPENDENCE=$(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${OBJ_LIST}))
|
||||
DEPENDENCE_LIST=${DEPENDENCE}
|
||||
|
||||
-include ${DEPENDENCE_LIST}
|
||||
|
||||
${TG_OBJECTS} ${TGL_OBJECTS}: ${AUTO}/constants.h ${AUTO}/auto-header.h
|
||||
|
||||
${TG_OBJECTS}: ${OBJ}/%.o: %.c | create_dirs_and_headers
|
||||
${TG_OBJECTS}: ${OBJ}/%.o: ${srcdir}/%.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}/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"
|
||||
rm -rf ${DIR_LIST}
|
||||
|
||||
distclean:
|
||||
rm -rf ${DIR_LIST} config.h config.log config.status
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
TGL_OBJECTS=${OBJ}/mtproto-common.o ${OBJ}/mtproto-client.o ${OBJ}/mtproto-key.o ${OBJ}/queries.o ${OBJ}/structures.o ${OBJ}/binlog.o ${OBJ}/tgl.o ${OBJ}/updates.o ${OBJ}/tgl-net.o ${OBJ}/tgl-timers.o ${OBJ}/tg-mime-types.o ${OBJ}/mtproto-utils.o ${OBJ}/crypto/bn_openssl.o ${OBJ}/crypto/bn_altern.o ${OBJ}/crypto/rsa_pem_openssl.o ${OBJ}/crypto/rsa_pem_altern.o ${OBJ}/crypto/md5_openssl.o ${OBJ}/crypto/md5_altern.o ${OBJ}/crypto/sha_openssl.o ${OBJ}/crypto/sha_altern.o ${OBJ}/crypto/aes_openssl.o ${OBJ}/crypto/aes_altern.o
|
||||
|
||||
TGL_OBJECTS_AUTO=${OBJ}/auto/auto-skip.o ${OBJ}/auto/auto-fetch.o ${OBJ}/auto/auto-store.o ${OBJ}/auto/auto-autocomplete.o ${OBJ}/auto/auto-types.o ${OBJ}/auto/auto-fetch-ds.o ${OBJ}/auto/auto-free-ds.o ${OBJ}/auto/auto-store-ds.o ${OBJ}/auto/auto-print-ds.o
|
||||
|
||||
|
||||
TLD_OBJECTS=${OBJ}/dump-tl-file.o
|
||||
GENERATE_OBJECTS=${OBJ}/generate.o
|
||||
TGL_COMMON_OBJECTS=${OBJ}/tools.o ${OBJ}/crypto/rand_openssl.o ${OBJ}/crypto/rand_altern.o ${OBJ}/crypto/err_openssl.o ${OBJ}/crypto/err_altern.o
|
||||
TGL_OBJ_C=${GENERATE_OBJECTS} ${TGL_COMMON_OBJECTS} ${TGL_OBJECTS} ${TLD_OBJECTS}
|
||||
|
||||
.SUFFIXES:
|
||||
|
||||
.SUFFIXES: .c .h .o
|
||||
|
||||
dump-tl: ${EXE}/dump-tl-file
|
||||
|
||||
${TGL_OBJECTS}: ${AUTO}/constants.h ${AUTO}/auto-skip.h ${AUTO}/auto-fetch.h ${AUTO}/auto-store.h ${AUTO}/auto-autocomplete.h ${AUTO}/auto-types.h ${AUTO}/auto-fetch-ds.h ${AUTO}/auto-free-ds.h ${AUTO}/auto-store-ds.h ${AUTO}/auto-print-ds.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 $@ $<
|
||||
|
||||
${TGL_OBJECTS_AUTO}: ${OBJ}/auto/%.o: ${AUTO}/%.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} ${TGL_OBJECTS_AUTO}
|
||||
rm -f $@ && 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 ${srcdir}/tgl/mtproto.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 auto/constants.h ${AUTO}/auto-%.h | create_dirs_and_headers
|
||||
${EXE}/generate -g $(patsubst ${AUTO}/auto-%.c,%,$@) ${AUTO}/scheme.tlo > $@ || ( rm $@ && false )
|
||||
|
||||
${AUTO}/auto-%.h: ${AUTO}/scheme.tlo ${EXE}/generate
|
||||
${EXE}/generate -g $(patsubst ${AUTO}/auto-%.h,%-header,$@) ${AUTO}/scheme.tlo > $@ || ( rm $@ && false )
|
||||
|
||||
${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 $@
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
TL_PARSER_OBJECTS=${OBJ}/tl-parser.o ${OBJ}/tlc.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 $@
|
||||
Arquivo executável
+57
@@ -0,0 +1,57 @@
|
||||
### Installation on Windows
|
||||
To use telegram-cli in Windows, you should compile with Cygwin which has POSIX API functionality.
|
||||
|
||||
Install [Cygwin](https://www.cygwin.com/) and cygwin's package manager, [apt-cyg](https://github.com/transcode-open/apt-cyg).
|
||||
|
||||
In Cygwin Terminal, install compiler and tools :
|
||||
|
||||
apt-cyg install cygwin32-gcc-core cygwin32-gcc-g++ gcc-core gcc-g++ make wget patch diffutils grep tar gzip
|
||||
|
||||
Now you have a compiler, but no libraries. You need readline, openssl, libconfig, liblua, python and libjansson to use telegram-cli's full functionality.
|
||||
|
||||
|
||||
Then Clone GitHub Repository in Cygwin Terminal
|
||||
|
||||
git clone --recursive https://github.com/vysheng/tg.git
|
||||
|
||||
|
||||
In Cygwin Terminal, type:
|
||||
|
||||
apt-cyg install libevent-devel openssl-devel libreadline-devel lua-devel python3
|
||||
(Install package 'python' to use Python 2.7, or install package 'python3' to use Python 3)
|
||||
|
||||
libconfig and libjansson is not in cygwin's package, so you should compile yourself.
|
||||
|
||||
Compile libconfig
|
||||
|
||||
wget http://www.hyperrealm.com/libconfig/libconfig-1.5.tar.gz
|
||||
tar xvf libconfig-1.5.tar.gz && cd libconfig-1.5
|
||||
./configure
|
||||
make && make install && cd ..
|
||||
|
||||
Compile libjansson
|
||||
|
||||
wget http://www.digip.org/jansson/releases/jansson-2.7.tar.gz
|
||||
tar xvf jansson-2.7.tar.gz && cd jansson-2.7
|
||||
./configure
|
||||
make && make install && cd ..
|
||||
|
||||
Then, go to tg directory then generate Makefile.
|
||||
|
||||
cd tg
|
||||
./configure
|
||||
|
||||
We need to patch Makefile and loop.c to compile in cygwin. Download this [patch](https://gist.github.com/ied206/d774a445f36004d263ab) then untar. Then, patch in tg directory.
|
||||
|
||||
patch -p1 < telegram-cli-cygwin.patch
|
||||
|
||||
Then
|
||||
make
|
||||
|
||||
After compile is done, **telegram-cli.exe** will be generated in **bin** directory.
|
||||
|
||||
To run telegram-cli, type
|
||||
|
||||
bin/telegram-cli -k tg-server.pub
|
||||
|
||||
**Caution**: A binary compiled with Cygwin should be run in Cygwin Terminal.
|
||||
+9
-2
@@ -31,6 +31,9 @@ Function_list (arguments are listed aside from cb_function and cb_extra, :
|
||||
rename_chat (chat, new_name)
|
||||
chat_set_photo (chat, file)
|
||||
|
||||
send_typing (peer)
|
||||
send_typing_abort (peer)
|
||||
|
||||
send_msg (peer, text)
|
||||
fwd_msg (peer, msg)
|
||||
|
||||
@@ -48,6 +51,7 @@ Function_list (arguments are listed aside from cb_function and cb_extra, :
|
||||
load_document_thumb(msg)
|
||||
|
||||
chat_info (chat)
|
||||
channel_info (channel)
|
||||
user_info (user)
|
||||
|
||||
get_history (peer, limit)
|
||||
@@ -55,8 +59,8 @@ Function_list (arguments are listed aside from cb_function and cb_extra, :
|
||||
chat_add_user (chat, user)
|
||||
chat_del_user (chat, user)
|
||||
|
||||
add_contactt (phone, first_name, last_name)
|
||||
rename_contactt (phone, first_name, last_name)
|
||||
add_contact (phone, first_name, last_name)
|
||||
rename_contact (phone, first_name, last_name)
|
||||
|
||||
msg_search (peer, text)
|
||||
msg_global_search (text)
|
||||
@@ -74,5 +78,8 @@ Function_list (arguments are listed aside from cb_function and cb_extra, :
|
||||
status_online ()
|
||||
status_offline ()
|
||||
|
||||
send_location (peer, latitude, longitude)
|
||||
|
||||
Also, you have function
|
||||
postpone (cb_function, cb_extra, timeout). It will call your cb_function in specified number of seconds (number of seconds may be double).
|
||||
register_interface_function (name, cb_function, cb_arg, description, arg1_type, arg2_type, ...) adds function to CLI interface
|
||||
|
||||
+175
@@ -0,0 +1,175 @@
|
||||
Python Bindings
|
||||
====================
|
||||
All of the functions and methods are executed in the network loop of tg, ***NOT IMMEDIATELY***. What this means is all calls should be considered async, and so there is an optional callback parameter for every function/method as the last parameter. For many uses, you won't care about the return value, so you can leave out the callback. Note there are a few cases where the callback is considered mandatory when the function is considered an information query and has no functionality without returned data. These will explicitly have the callback in the parameter list and will be noted in the description.
|
||||
|
||||
You can specify the python script from config ("python_script" option) or from command_line [-Z].
|
||||
|
||||
Version Notes
|
||||
=====================
|
||||
The python integration is written with Python 2/3 in mind, however, there is a bias to Python 3. Because of this, there are a few caveats:
|
||||
- I am only testing against Python 2.7, and have no intention to support/test < 2.7 but am more than happy to accept PRs for fixes as long as it does not break 2.7/3
|
||||
- repr/print of native types is dumbed down for < 2.7.9, I highly recommend using this version or newer. (This is due to a [bug](http://bugs.python.org/issue22023) in python)
|
||||
|
||||
TGL Callbacks
|
||||
=============
|
||||
Assign python fuctions to the following tgl attributes to set callbacks from TG.
|
||||
|
||||
| Callback | Description |
|
||||
|--------- | ---------------------|
|
||||
|`tgl.on_binlog_replay_end()` | This is called when replay of old events end. Any updates prior this call were already received by this client some time ago.|
|
||||
|`tgl.on_get_difference_end()`| This is called after first get_difference call. So we received all updates after last client execute.|
|
||||
|`tgl.on_our_id(our_id)`|Informs about id of currently logged in user.|
|
||||
|`tgl.on_msg_receive(msg)`| This is called when we receive new `tgl.Msg` object (*may be called before on_binlog_replay_end, than it is old msg*).|
|
||||
|`tgl.on_user_update(peer, what_changed)`|updated info about user. peer is a `tgl.Peer` object representing the user, and what_changed is array of strings.|
|
||||
|`tgl.on_chat_update(peer, what_changed)`|updated info about chat. peer is a `tgl.Peer` object representing the chat, and what_changed is array of strings.|
|
||||
|`tgl.on_secret_chat_update(peer, what_changed)`|updated info about secret chat. peer is a `tgl.Peer` object representing the secret chat, and what_changed is array of strings.|
|
||||
|
||||
Python Callback Signatures
|
||||
=========================
|
||||
As mentioned, all methods and functions have callbacks. The following are the different signatures that may be required (*The description of the method will mention which is used*)
|
||||
|
||||
| Type | Signature | Description |
|
||||
|----- | ------------------ | ------------|
|
||||
|empty_cb|`(success)`|This just indicated the success of the call. All other callback types have this as well.|
|
||||
|contact_list_cb|`(success, peer_list)`|`peer_list` is a list of `tgl.Peer` objects|
|
||||
|dialog_list_cb|`(success, dialog_list)`|`dialog_list` is a list of dicts, with keys: 'peer': `tgl.Peer`, 'message': `tgl.Msg`|
|
||||
|msg_cb|`(success, msg)`|`msg` is a `tgl.Msg`|
|
||||
|msg_list_cb|`(success, msg_list)`|`msg_list` is a list of `tgl.Msg` objects|
|
||||
|file_cb|`(success, file_path)`|`file_path` is a string with an absolute path|
|
||||
|chat_cb|`(success, peer)`|`peer` is a `tgl.Peer` that will have the type of `tgl.PEER_CHAT`|
|
||||
|peer_cb|`(success, peer)`|`peer` is a `tgl.Peer`|
|
||||
|secret_chat_cb|`(success, peer)`|`peer` is a `tgl.Peer` that will have the type of `tgl.PEER_ENCR_CHAT`|
|
||||
|user_cb|`(success, peer)`|`peer` is a `tgl.Peer` that will have the type of `tgl.PEER_USER`|
|
||||
|str_cb|`(success, string)`|`string` is a simple string|
|
||||
|
||||
TGL Module Level Fuctions
|
||||
=========================
|
||||
All of these functions are accessed by importing the `tgl` module.
|
||||
|
||||
| Function | Description | Callback Type |
|
||||
|--------- | ---------------------| ------------- |
|
||||
|`tgl.get_contact_list (callback)`|Retrieve peers stored in the contact list. *requires callback*|`contact_list_cb`|
|
||||
|`tgl.get_dialog_list (callback)`|Get a list of current conversations with the `tgl.Peer` and the most recent `tgl.Msg`. *requires callback*|`dialog_list_cb`|
|
||||
|`tgl.add_contact (phone, first_name, last_name)`|Adds contact to contact list, last name is optional|`contact_list_cb`|
|
||||
|`tgl.del_contact (peer)`|Removes contact from contact list|`empty_cb`|
|
||||
|`tgl.rename_contact (phone, first_name, last_name) `|Renaming a contact means sending the first/last name with the same phone number of an existing contact|`contact_list_cb`|
|
||||
|`tgl.msg_global_search (text, callback)`|Get all messages that match the search text. *requires callback*|`msg_list_cb`|
|
||||
|`tgl.set_profile_photo (file_path)`|Sets avatar to image found at `file_path`, no checking on the file.|`empty_cb`|
|
||||
|`tgl.create_secret_chat (user)`|Creates secret chat with user, callback recommended to get new peer for the secret chat.|`secret_chat_cb`|
|
||||
|`tgl.create_group_chat (peer_list, name)`|`peer_list` contains users to create group with, must be more than 1 peer.|`empty_cb`|
|
||||
|`tgl.restore_msg (msg_id)`|Restore a deleted message by message id.|`empty_cb`|
|
||||
|`tgl.status_online ()`|Sets status as online|`empty_cb`|
|
||||
|`tgl.status_offline ()`|Sets status as offline|`empty_cb`|
|
||||
|`tgl.import_chat_link (link)`|Join channel using the `link`.|`empty_cb`|
|
||||
|`tgl.safe_exit (exit_status)`|Exception to the rule about callbacks, no callback parameter is accepted. Causes the bot to quit after cleaning up. `exit_status` is an optional parameter with the exit status (On glibc, this must be 0-255)|NONE|
|
||||
|
||||
Peer
|
||||
====
|
||||
## Attributes
|
||||
| Attribute | Type | Description |
|
||||
|---------- | ---- | ----------------------|
|
||||
|`id`|`int`|Telegram peer id|
|
||||
|`type`|`int`|Peer type, you can compare this with `tgl.PEER_CHAT`, `tgl.PEER_USER`, or `tgl.PEER_ENCR_CHAT`|
|
||||
|`type_name`|`string`|Text representation of the type of the peer, `'chat'`, `'user'`, or `'secret_chat'`|
|
||||
|`name`|`string`|Returns the tg print version of the name. Usually `FirstName_LastName` for user, and the chatname with spaces replaced with `_`|
|
||||
|`user_id`|`int`|Used in secret chats, since a secret chat has it's own id, this is the id of the user at the endpoint.|
|
||||
|`user_list`|`peer_list`|Only used in `tgl.PEER_CHAT` peers, contains list of users. This currently does not work, it is not populating properly.|
|
||||
|`user_status`|`dict`|Only used in `tgl.PEER_USER` peers. Dictionary with the current status, keys: 'online': `bool`, 'when': `datetime`|
|
||||
|`phone`|`string`|Only used in `tgl.PEER_USER` peers. Phone number, only available if user is on contact list.|
|
||||
|`username`|`string`|Only used in `tgl.PEER_USER` peers. Will be `None` if username is not set.|
|
||||
|`first_name`|`string`|Only used in `tgl.PEER_USER` peers.|
|
||||
|`last_name`|`string`|Only used in `tgl.PEER_USER` peers.|
|
||||
|
||||
## Methods
|
||||
| Method | Description | Callback Type |
|
||||
|------- | ---------------------| ------------- |
|
||||
|`peer.rename_chat (new_name)`||`empty_cb`|
|
||||
|`peer.chat_set_photo (file)`|Sets avatar for the group to image found at `file_path`, no checking on the file. The calling peer must be of type `tgl.PEER_CHAT`.|`msg_cb`|
|
||||
|`peer.send_typing ()`|Tell peer that you are typing.|`empty_cb`|
|
||||
|`peer.send_typing_abort ()`|Tell peer you are done typing.|`empty_cb`|
|
||||
|`peer.send_msg (text, reply=msg_id, preview=bool)`|Sends message to peer. Optional keyword arguments: reply is the message id we are replying to, preview is a boolean that forces URL preview on or off.|`msg_cb`|
|
||||
|`peer.fwd_msg (msg_id)`|Forwards msg with message id to peer.|`msg_cb`|
|
||||
|`peer.fwd_media (msg_id)`|Forwards media with message id to peer.|`msg_cb`|
|
||||
|`peer.send_photo (file)`|Send media to peer using `file`. No checking is done on the contents of the file.|`msg_cb`|
|
||||
|`peer.send_video (file)`|Send media to peer using `file`. No checking is done on the contents of the file.|`msg_cb`|
|
||||
|`peer.send_audio (file)`|Send media to peer using `file`. No checking is done on the contents of the file.|`msg_cb`|
|
||||
|`peer.send_document (file)`|Send media to peer using `file`. No checking is done on the contents of the file.|`msg_cb`|
|
||||
|`peer.send_text (file)`|Send media to peer using `file`. No checking is done on the contents of the file.|`msg_cb`|
|
||||
|`peer.send_location (latitude, longitude)`|Sends location media message to peer, `longitude` and `latitude` should be specified as double.|`msg_cb`|
|
||||
|`peer.chat_add_user (user)`|Adds `user`(`tgl.Peer`) to the group. The calling peer must be of type `tgl.PEER_CHAT`|`empty_cb`|
|
||||
|`peer.chat_del_user (user)`|Removes `user`(`tgl.Peer`) from the group. The calling peer must be of type `tgl.PEER_CHAT`|`empty_cb`|
|
||||
|`peer.mark_read ()`|Marks the dialog with the peer as read. This cannot be done on message level.|`empty_cb`|
|
||||
|`peer.msg_search (text, callback)`|Get all messages that match the search text with the peer. *requires callback*|`msg_list_cb`|
|
||||
|`peer.get_history (offset, limit, callback)`|Get all messages with the peer. `offset` specifies what message to start at, and `limit` specifies how many messages to retrieve. See example below for one method to get the entire history. *requires callback*|`msg_list_cb`|
|
||||
|`peer.info ()`|Gets peer info.|`peer_cb`|
|
||||
|
||||
Example usage for `peer.get_history`:
|
||||
```
|
||||
from functools import partial
|
||||
history = []
|
||||
# Get all the history, 100 msgs at a time
|
||||
peer.get_history(0, 100, partial(history_callback, 100, peer))
|
||||
|
||||
def history_callback(msg_count, peer, success, msgs)
|
||||
history.extend(msgs)
|
||||
if len(msgs) == msg_count:
|
||||
peer.get_history(len(history), msg_count, partial(history_callback, msg_count, peer))
|
||||
```
|
||||
|
||||
Msg
|
||||
====
|
||||
## Attributes
|
||||
| Attribute | Type | Description |
|
||||
|---------- | ---- | ----------------------|
|
||||
|`id`|`int`|Message id|
|
||||
|`flags`|`int`|tgl flags, see source code for tgl for various possible flags. This is a bitfield in an int.|
|
||||
|`mention`|`bool`|`True` if you are @mentioned.|
|
||||
|`out`|`bool`|`True` if you sent this message.|
|
||||
|`unread`|`bool`|`True` if you have not marked this as read.|
|
||||
|`service`|`bool`|`True` if the message is a service messages, see tgl.Msg.action for the type.|
|
||||
|`src`|`tgl.Peer`|Peer who sent the message|
|
||||
|`dest`|`tgl.Peer`|Peer who the message was sent too. In a group, this will be the chat peer. Otherwise it will be you.|
|
||||
|`text`|`string`|Text contents of the message. This may be `None` if it's media without caption.|
|
||||
|`media`|`dict`|Dictionary that varies based on the media type.|
|
||||
|`date`|`datetime`|When the message was sent.|
|
||||
|`fwd_src`|`tgl.Peer`|The user that sent the forwarded message.|
|
||||
|`fwd_date`|`datetime`|When the forwarded message was originally sent.|
|
||||
|`reply`|`tgl.Msg`|Message that this message is replying to.|
|
||||
|`reply_id`|`int`|Message id that this message is replying to.|
|
||||
|`action`|`int`|Action enum for the message if `msg.service == True`. See all the possible values below|
|
||||
|
||||
## Action Type Constants
|
||||
- tgl.ACTION_NONE
|
||||
- tgl.ACTION_GEO_CHAT_CREATE
|
||||
- tgl.ACTION_GEO_CHAT_CHECKIN
|
||||
- tgl.ACTION_CHAT_CREATE
|
||||
- tgl.ACTION_CHAT_EDIT_TITLE
|
||||
- tgl.ACTION_CHAT_EDIT_PHOTO
|
||||
- tgl.ACTION_CHAT_DELETE_PHOTO
|
||||
- tgl.ACTION_CHAT_ADD_USER
|
||||
- tgl.ACTION_CHAT_ADD_USER_BY_LINK
|
||||
- tgl.ACTION_CHAT_DELETE_USER
|
||||
- tgl.ACTION_SET_MESSAGE_TTL
|
||||
- tgl.ACTION_READ_MESSAGES
|
||||
- tgl.ACTION_DELETE_MESSAGES
|
||||
- tgl.ACTION_SCREENSHOT_MESSAGES
|
||||
- tgl.ACTION_FLUSH_HISTORY
|
||||
- tgl.ACTION_RESEND
|
||||
- tgl.ACTION_NOTIFY_LAYER
|
||||
- tgl.ACTION_TYPING
|
||||
- tgl.ACTION_NOOP
|
||||
- tgl.ACTION_COMMIT_KEY
|
||||
- tgl.ACTION_ABORT_KEY
|
||||
- tgl.ACTION_REQUEST_KEY
|
||||
- tgl.ACTION_ACCEPT_KEY
|
||||
|
||||
## Methods
|
||||
| Method | Description | Callback Type |
|
||||
|------- | ---------------------| ------------- |
|
||||
|`msg.load_photo(callback)`|Saves the media and returns the path to the file in the callback. *requires callback*|`file_cb`|
|
||||
|`msg.load_video(callback)`|Saves the media and returns the path to the file in the callback. *requires callback*|`file_cb`|
|
||||
|`msg.load_video_thumb(callback)`|Saves the media and returns the path to the file in the callback. *requires callback*|`file_cb`|
|
||||
|`msg.load_audio(callback)`|Saves the media and returns the path to the file in the callback. *requires callback*|`file_cb`|
|
||||
|`msg.load_document(callback)`|Saves the media and returns the path to the file in the callback. *requires callback*|`file_cb`|
|
||||
|`msg.load_document_thumb(callback)`|Saves the media and returns the path to the file in the callback. *requires callback*|`file_cb`|
|
||||
|`msg.delete_msg ()`|Deletes the message from the local history|`empty_cb`|
|
||||
+29
-21
@@ -22,37 +22,44 @@ 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
|
||||
git clone --recursive https://github.com/vysheng/tg.git && cd tg
|
||||
|
||||
or download and extract zip
|
||||
### Python Support
|
||||
|
||||
wget https://github.com/vysheng/tg/archive/master.zip -O tg-master.zip
|
||||
unzip tg-master.zip && cd tg-master
|
||||
Python support is currently limited to Python 2.7 or Python 3.1+. Other versions may work but are not tested.
|
||||
|
||||
#### Linux and BSDs
|
||||
|
||||
Install libs: readline or libedit, openssl and (if you want to use config) libconfig and liblua.
|
||||
If you do not want to use them pass options --disable-libconfig and --disable-liblua respectively.
|
||||
Install libs: readline, openssl and (if you want to use config) libconfig, liblua, python and libjansson.
|
||||
If you do not want to use them pass options --disable-libconfig, --disable-liblua, --disable-python and --disable-json respectively.
|
||||
|
||||
On Ubuntu/Debian use:
|
||||
|
||||
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev
|
||||
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev libpython-dev make
|
||||
|
||||
On gentoo:
|
||||
|
||||
sudo emerge -av sys-libs/readline dev-libs/libconfig dev-libs/openssl dev-lang/lua dev-libs/libevent
|
||||
sudo emerge -av sys-libs/readline dev-libs/libconfig dev-libs/openssl dev-lang/lua dev-libs/libevent dev-libs/jansson dev-lang/python
|
||||
|
||||
On Fedora:
|
||||
|
||||
sudo yum install lua-devel openssl-devel libconfig-devel readline-devel
|
||||
sudo dnf install lua-devel openssl-devel libconfig-devel readline-devel libevent-devel libjansson-devel python-devel
|
||||
|
||||
On Archlinux:
|
||||
|
||||
yaourt -S telegram-cli-git
|
||||
|
||||
On FreeBSD:
|
||||
|
||||
pkg install libconfig libexecinfo lua52
|
||||
pkg install libconfig libexecinfo lua52 python
|
||||
|
||||
On OpenBSD:
|
||||
|
||||
pkg_add libconfig libexecinfo lua
|
||||
pkg_add libconfig libexecinfo lua python
|
||||
|
||||
On openSUSE:
|
||||
|
||||
sudo zypper in lua-devel libconfig-devel readline-devel libevent-devel libjansson-devel python-devel libopenssl-devel
|
||||
|
||||
Then,
|
||||
|
||||
@@ -63,7 +70,7 @@ Then,
|
||||
|
||||
On Gentoo: use ebuild provided.
|
||||
|
||||
On Arch: https://aur.archlinux.org/packages/telegram-git/
|
||||
On Arch: https://aur.archlinux.org/packages/telegram-cli-git
|
||||
|
||||
#### Mac OS X
|
||||
|
||||
@@ -71,11 +78,9 @@ The client depends on [readline library](http://cnswww.cns.cwru.edu/php/chet/rea
|
||||
|
||||
If using [Homebrew](http://brew.sh/):
|
||||
|
||||
brew install libconfig
|
||||
brew install readline
|
||||
brew install lua
|
||||
export CFLAGS="-I/usr/local/include -I/usr/local/Cellar/readline/6.2.4/include"
|
||||
export LDFLAGS="-L/usr/local/lib -L/usr/local/Cellar/readline/6.2.4/lib"
|
||||
brew install libconfig readline lua python libevent jansson
|
||||
export CFLAGS="-I/usr/local/include -I/usr/local/Cellar/readline/6.3.8/include"
|
||||
export LDFLAGS="-L/usr/local/lib -L/usr/local/Cellar/readline/6.3.8/lib"
|
||||
./configure && make
|
||||
|
||||
Thanks to [@jfontan](https://github.com/vysheng/tg/issues/3#issuecomment-28293731) for this solution.
|
||||
@@ -85,8 +90,10 @@ If using [MacPorts](https://www.macports.org):
|
||||
sudo port install libconfig-hr
|
||||
sudo port install readline
|
||||
sudo port install lua51
|
||||
export CFLAGS="-I/usr/local/include -I/opt/local/include"
|
||||
export LDFLAGS="-L/usr/local/lib -L/opt/local/lib/"
|
||||
sudo port install python34
|
||||
sudo port install libevent
|
||||
export CFLAGS="-I/usr/local/include -I/opt/local/include -I/opt/local/include/lua-5.1"
|
||||
export LDFLAGS="-L/usr/local/lib -L/opt/local/lib -L/opt/local/lib/lua-5.1"
|
||||
./configure && make
|
||||
|
||||
Install these ports:
|
||||
@@ -112,7 +119,7 @@ If you would like to ask a question, you can write to my telegram or to the gith
|
||||
|
||||
bin/telegram-cli -k <public-server-key>
|
||||
|
||||
By default public key is stored in the same folder named tg-server.pub or in /etc/telegram-cli/server.pub, if it's not, specify where to find it:
|
||||
By default, the public key is stored in tg-server.pub in the same folder or in /etc/telegram-cli/server.pub. If not, specify where to find it:
|
||||
|
||||
bin/telegram-cli -k tg-server.pub
|
||||
|
||||
@@ -155,7 +162,7 @@ If two or more peers have same name, <sharp>number is appended to the name. (for
|
||||
* **chat_add_user** \<chat\> \<user\> - add user to chat
|
||||
* **chat_del_user** \<chat\> \<user\> - remove user from chat
|
||||
* **rename_chat** \<chat\> \<new-name\>
|
||||
* **create_group_chat** \<user\> \<chat topic\> - creates a groupchat with user, use chat_add_user to add more users
|
||||
* **create_group_chat** \<chat topic\> \<user1\> \<user2\> \<user3\> ... - creates a groupchat with users, use chat_add_user to add more users
|
||||
* **chat_set_photo** \<chat\> \<photo-file-name\> - sets group chat photo. Same limits as for profile photos.
|
||||
|
||||
#### Search
|
||||
@@ -180,6 +187,7 @@ If two or more peers have same name, <sharp>number is appended to the name. (for
|
||||
* **stats** - just for debugging
|
||||
* **show_license** - prints contents of GPLv2
|
||||
* **help** - prints this help
|
||||
* **get_self** - get our user info
|
||||
|
||||
#### Card
|
||||
* **export_card** - print your 'card' that anyone can later use to import your contact
|
||||
|
||||
@@ -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;
|
||||
-437
@@ -1,437 +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
|
||||
*/
|
||||
|
||||
#include "mtproto-common.h"
|
||||
#include <string.h>
|
||||
|
||||
static int cur_token_len;
|
||||
static char *cur_token;
|
||||
static int cur_token_real_len;
|
||||
static int cur_token_quoted;
|
||||
static int multiline_output = 1;
|
||||
static int multiline_offset;
|
||||
static int multiline_offset_size = 2;
|
||||
|
||||
static int disable_field_names;
|
||||
|
||||
#define expect_token(token,len) \
|
||||
if (len != cur_token_len || memcmp (cur_token, token, cur_token_len)) { return -1; } \
|
||||
local_next_token ();
|
||||
|
||||
#define expect_token_ptr(token,len) \
|
||||
if (len != cur_token_len || memcmp (cur_token, token, cur_token_len)) { return 0; } \
|
||||
local_next_token ();
|
||||
|
||||
#define expect_token_autocomplete(token,len) \
|
||||
if (cur_token_len == -3 && len >= cur_token_real_len && !memcmp (cur_token, token, cur_token_real_len)) { set_autocomplete_string (token); return -1; }\
|
||||
if (len != cur_token_len || memcmp (cur_token, token, cur_token_len)) { return -1; } \
|
||||
local_next_token ();
|
||||
|
||||
#define expect_token_ptr_autocomplete(token,len) \
|
||||
if (cur_token_len == -3 && len >= cur_token_real_len && !memcmp (cur_token, token, cur_token_real_len)) { set_autocomplete_string (token); return 0; }\
|
||||
if (len != cur_token_len || memcmp (cur_token, token, cur_token_len)) { return 0; } \
|
||||
local_next_token ();
|
||||
|
||||
|
||||
static int autocomplete_mode;
|
||||
static char *autocomplete_string;
|
||||
static int (*autocomplete_fun)(const char *, int, int, char **);
|
||||
|
||||
static void set_autocomplete_string (const char *s) {
|
||||
if (autocomplete_string) { free (autocomplete_string); }
|
||||
autocomplete_string = strdup (s);
|
||||
assert (autocomplete_string);
|
||||
autocomplete_mode = 1;
|
||||
}
|
||||
|
||||
static void set_autocomplete_type (int (*f)(const char *, int, int, char **)) {
|
||||
autocomplete_fun = f;
|
||||
autocomplete_mode = 2;
|
||||
}
|
||||
|
||||
static int is_int (void) {
|
||||
if (cur_token_len <= 0) { return 0; }
|
||||
char c = cur_token[cur_token_len];
|
||||
cur_token[cur_token_len] = 0;
|
||||
char *p = 0;
|
||||
|
||||
if (strtoll (cur_token, &p, 10)) {}
|
||||
cur_token[cur_token_len] = c;
|
||||
|
||||
return p == cur_token + cur_token_len;
|
||||
}
|
||||
|
||||
static long long get_int (void) {
|
||||
if (cur_token_len <= 0) { return 0; }
|
||||
char c = cur_token[cur_token_len];
|
||||
cur_token[cur_token_len] = 0;
|
||||
char *p = 0;
|
||||
|
||||
long long val = strtoll (cur_token, &p, 0);
|
||||
cur_token[cur_token_len] = c;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static int is_double (void) {
|
||||
if (cur_token_len <= 0) { return 0; }
|
||||
char c = cur_token[cur_token_len];
|
||||
cur_token[cur_token_len] = 0;
|
||||
char *p = 0;
|
||||
|
||||
if (strtod (cur_token, &p)) {}
|
||||
cur_token[cur_token_len] = c;
|
||||
|
||||
return p == cur_token + cur_token_len;
|
||||
}
|
||||
|
||||
static double get_double (void) {
|
||||
if (cur_token_len <= 0) { return 0; }
|
||||
char c = cur_token[cur_token_len];
|
||||
cur_token[cur_token_len] = 0;
|
||||
char *p = 0;
|
||||
|
||||
double val = strtod (cur_token, &p);
|
||||
cur_token[cur_token_len] = c;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static struct paramed_type *paramed_type_dup (struct paramed_type *P) {
|
||||
if (ODDP (P)) { return P; }
|
||||
struct paramed_type *R = malloc (sizeof (*R));
|
||||
assert (R);
|
||||
R->type = malloc (sizeof (*R->type));
|
||||
assert (R->type);
|
||||
memcpy (R->type, P->type, sizeof (*P->type));
|
||||
R->type->id = strdup (P->type->id);
|
||||
assert (R->type->id);
|
||||
|
||||
if (P->type->params_num) {
|
||||
R->params = malloc (sizeof (void *) * P->type->params_num);
|
||||
assert (R->params);
|
||||
int i;
|
||||
for (i = 0; i < P->type->params_num; i++) {
|
||||
R->params[i] = paramed_type_dup (P->params[i]);
|
||||
}
|
||||
}
|
||||
return R;
|
||||
}
|
||||
|
||||
void tgl_paramed_type_free (struct paramed_type *P) {
|
||||
if (ODDP (P)) { return; }
|
||||
if (P->type->params_num) {
|
||||
int i;
|
||||
for (i = 0; i < P->type->params_num; i++) {
|
||||
tgl_paramed_type_free (P->params[i]);
|
||||
}
|
||||
free (P->params);
|
||||
}
|
||||
free (P->type->id);
|
||||
free (P->type);
|
||||
free (P);
|
||||
}
|
||||
|
||||
static char *buffer_pos, *buffer_end;
|
||||
|
||||
static int is_wspc (char c) {
|
||||
return c <= 32 && c > 0;
|
||||
}
|
||||
|
||||
static void skip_wspc (void) {
|
||||
while (buffer_pos < buffer_end && is_wspc (*buffer_pos)) {
|
||||
buffer_pos ++;
|
||||
}
|
||||
}
|
||||
|
||||
static int is_letter (char c) {
|
||||
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '.' || c == '_' || c == '-';
|
||||
}
|
||||
|
||||
|
||||
static char exp_buffer[1 << 25];;
|
||||
static int exp_buffer_pos;
|
||||
|
||||
static inline int is_hex (char c) {
|
||||
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
|
||||
}
|
||||
|
||||
static inline int hex2dec (char c) {
|
||||
if (c >= '0' && c <= '9') { return c - '0'; }
|
||||
else { return c - 'a' + 10; }
|
||||
}
|
||||
|
||||
static void expand_backslashed (char *s, int len) {
|
||||
int backslashed = 0;
|
||||
exp_buffer_pos = 0;
|
||||
int i = 0;
|
||||
while (i < len) {
|
||||
assert (i + 3 <= (1 << 25));
|
||||
if (backslashed) {
|
||||
backslashed = 0;
|
||||
switch (s[i ++]) {
|
||||
case 'n':
|
||||
exp_buffer[exp_buffer_pos ++] = '\n';
|
||||
break;
|
||||
case 'r':
|
||||
exp_buffer[exp_buffer_pos ++] = '\r';
|
||||
break;
|
||||
case 't':
|
||||
exp_buffer[exp_buffer_pos ++] = '\t';
|
||||
break;
|
||||
case 'b':
|
||||
exp_buffer[exp_buffer_pos ++] = '\b';
|
||||
break;
|
||||
case 'a':
|
||||
exp_buffer[exp_buffer_pos ++] = '\a';
|
||||
break;
|
||||
case '\\':
|
||||
exp_buffer[exp_buffer_pos ++] = '\\';
|
||||
break;
|
||||
case 'x':
|
||||
if (i + 2 > len || !is_hex (s[i]) || !is_hex (s[i + 1])) {
|
||||
exp_buffer_pos = -1;
|
||||
return;
|
||||
}
|
||||
exp_buffer[exp_buffer_pos ++] = hex2dec (s[i]) * 16 + hex2dec (s[i + 1]);
|
||||
i += 2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (s[i] == '\\') {
|
||||
backslashed = 1;
|
||||
i ++;
|
||||
} else {
|
||||
exp_buffer[exp_buffer_pos ++] = s[i ++];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void local_next_token (void) {
|
||||
skip_wspc ();
|
||||
cur_token_quoted = 0;
|
||||
if (buffer_pos >= buffer_end) {
|
||||
cur_token_len = -3;
|
||||
cur_token_real_len = 0;
|
||||
return;
|
||||
}
|
||||
char c = *buffer_pos;
|
||||
if (is_letter (c)) {
|
||||
cur_token = buffer_pos;
|
||||
while (buffer_pos < buffer_end && is_letter (*buffer_pos)) {
|
||||
buffer_pos ++;
|
||||
}
|
||||
if (buffer_pos < buffer_end) {
|
||||
cur_token_len = buffer_pos - cur_token;
|
||||
} else {
|
||||
cur_token_real_len = buffer_pos - cur_token;
|
||||
cur_token_len = -3;
|
||||
}
|
||||
return;
|
||||
} else if (c == '"') {
|
||||
cur_token_quoted = 1;
|
||||
cur_token = buffer_pos ++;
|
||||
int backslashed = 0;
|
||||
while (buffer_pos < buffer_end && (*buffer_pos != '"' || backslashed)) {
|
||||
if (*buffer_pos == '\\') {
|
||||
backslashed ^= 1;
|
||||
} else {
|
||||
backslashed = 0;
|
||||
}
|
||||
buffer_pos ++;
|
||||
}
|
||||
if (*buffer_pos == '"') {
|
||||
buffer_pos ++;
|
||||
expand_backslashed (cur_token + 1, buffer_pos - cur_token - 2);
|
||||
if (exp_buffer_pos < 0) {
|
||||
cur_token_len = -2;
|
||||
} else {
|
||||
cur_token_len = exp_buffer_pos;
|
||||
cur_token = exp_buffer;
|
||||
}
|
||||
} else {
|
||||
cur_token_len = -2;
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
if (c) {
|
||||
cur_token = buffer_pos ++;
|
||||
cur_token_len = 1;
|
||||
} else {
|
||||
cur_token_len = -3;
|
||||
cur_token_real_len = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define MAX_FVARS 100
|
||||
static struct paramed_type *fvars[MAX_FVARS];
|
||||
static int fvars_pos;
|
||||
|
||||
static void add_var_to_be_freed (struct paramed_type *P) {
|
||||
assert (fvars_pos < MAX_FVARS);
|
||||
fvars[fvars_pos ++] = P;
|
||||
}
|
||||
|
||||
static void free_vars_to_be_freed (void) {
|
||||
int i;
|
||||
for (i = 0; i < fvars_pos; i++) {
|
||||
tgl_paramed_type_free (fvars[i]);
|
||||
}
|
||||
fvars_pos = 0;
|
||||
}
|
||||
|
||||
int tglf_extf_autocomplete (const char *text, int text_len, int index, char **R, char *data, int data_len) {
|
||||
if (index == -1) {
|
||||
buffer_pos = data;
|
||||
buffer_end = data + data_len;
|
||||
autocomplete_mode = 0;
|
||||
local_next_token ();
|
||||
struct paramed_type *P = autocomplete_function_any ();
|
||||
free_vars_to_be_freed ();
|
||||
if (P) { tgl_paramed_type_free (P); }
|
||||
}
|
||||
if (autocomplete_mode == 0) { return -1; }
|
||||
int len = strlen (text);
|
||||
if (autocomplete_mode == 1) {
|
||||
if (index >= 0) { return -1; }
|
||||
index = 0;
|
||||
if (!strncmp (text, autocomplete_string, len)) {
|
||||
*R = strdup (autocomplete_string);
|
||||
assert (*R);
|
||||
return index;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
return autocomplete_fun (text, len, index, R);
|
||||
}
|
||||
}
|
||||
|
||||
struct paramed_type *tglf_extf_store (const char *data, int data_len) {
|
||||
buffer_pos = (char *)data;
|
||||
buffer_end = (char *)(data + data_len);
|
||||
local_next_token ();
|
||||
return store_function_any ();
|
||||
}
|
||||
|
||||
#define OUT_BUF_SIZE (1 << 25)
|
||||
static char out_buf[OUT_BUF_SIZE];
|
||||
static int out_buf_pos;
|
||||
|
||||
#define eprintf(...) \
|
||||
do { \
|
||||
out_buf_pos += snprintf (out_buf + out_buf_pos, OUT_BUF_SIZE - out_buf_pos, __VA_ARGS__);\
|
||||
assert (out_buf_pos < OUT_BUF_SIZE);\
|
||||
} while (0)\
|
||||
|
||||
static int valid_utf8_char (const char *str) {
|
||||
unsigned char c = (unsigned char) *str;
|
||||
int n = 0;
|
||||
|
||||
if ((c & 0x80) == 0x00) {
|
||||
n = 0;
|
||||
} else if ((c & 0xe0) == 0xc0) {
|
||||
n = 1;
|
||||
} else if ((c & 0xf0) == 0xe0) {
|
||||
n = 2;
|
||||
} else if ((c & 0xf8) == 0xf0) {
|
||||
n = 3;
|
||||
} else if ((c & 0xfc) == 0xf8) {
|
||||
n = 4;
|
||||
} else if ((c & 0xfe) == 0xfc) {
|
||||
n = 5;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int i;
|
||||
for (i = 0; i < n; i ++) {
|
||||
if ((((unsigned char)(str[i + 1])) & 0xc0) != 0x80) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return n + 1;
|
||||
}
|
||||
|
||||
static void print_escaped_string (const char *str, int len) {
|
||||
eprintf ("\"");
|
||||
const char *end = str + len;
|
||||
while (str < end) {
|
||||
int n = valid_utf8_char (str);
|
||||
if (n < 0) {
|
||||
eprintf ("\\x%02x", (int)(unsigned char)*str);
|
||||
str ++;
|
||||
} else if (n >= 2) {
|
||||
int i;
|
||||
for (i = 0; i < n; i++) {
|
||||
eprintf ("%c", *(str ++));
|
||||
}
|
||||
} else if (((unsigned char)*str) >= ' ' && *str != '"' && *str != '\\') {
|
||||
eprintf ("%c", *str);
|
||||
str ++;
|
||||
} else {
|
||||
switch (*str) {
|
||||
case '\n':
|
||||
eprintf("\\n");
|
||||
break;
|
||||
case '\r':
|
||||
eprintf("\\r");
|
||||
break;
|
||||
case '\t':
|
||||
eprintf("\\t");
|
||||
break;
|
||||
case '\b':
|
||||
eprintf("\\b");
|
||||
break;
|
||||
case '\a':
|
||||
eprintf("\\a");
|
||||
break;
|
||||
case '\\':
|
||||
eprintf ("\\\\");
|
||||
break;
|
||||
case '"':
|
||||
eprintf ("\\\"");
|
||||
break;
|
||||
default:
|
||||
eprintf ("\\x%02x", (int)(unsigned char)*str);
|
||||
break;
|
||||
}
|
||||
str ++;
|
||||
}
|
||||
}
|
||||
eprintf ("\"");
|
||||
}
|
||||
|
||||
static void print_offset (void) {
|
||||
int i;
|
||||
for (i = 0; i < multiline_offset; i++) {
|
||||
eprintf (" ");
|
||||
}
|
||||
}
|
||||
|
||||
char *tglf_extf_fetch (struct paramed_type *T) {
|
||||
out_buf_pos = 0;
|
||||
fetch_type_any (T);
|
||||
return out_buf;
|
||||
}
|
||||
-48
@@ -1,48 +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 __AUTO_H__
|
||||
#define __AUTO_H__
|
||||
|
||||
struct tl_type_descr {
|
||||
unsigned name;
|
||||
char *id;
|
||||
int params_num;
|
||||
long long params_types;
|
||||
};
|
||||
|
||||
struct paramed_type {
|
||||
struct tl_type_descr *type;
|
||||
struct paramed_type **params;
|
||||
};
|
||||
|
||||
#define NAME_ARRAY 0x89932ad9
|
||||
|
||||
#define TYPE_TO_PARAM(NAME) (&(struct paramed_type) {.type = &tl_type_## NAME, .params=0})
|
||||
#define TYPE_TO_PARAM_1(NAME,PARAM1) (&(struct paramed_type) {.type = &tl_type_## NAME, .params=(struct paramed_type *[1]){PARAM1}})
|
||||
#define ODDP(x) (((long)(x)) & 1)
|
||||
#define EVENP(x) (!ODDP(x))
|
||||
#define INT2PTR(x) (void *)(long)(((long)x) * 2 + 1)
|
||||
#define PTR2INT(x) ((((long)x) - 1) / 2)
|
||||
|
||||
void tgl_paramed_type_free (struct paramed_type *P);
|
||||
|
||||
#include "auto/auto-header.h"
|
||||
|
||||
#endif
|
||||
+112
@@ -0,0 +1,112 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_python.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_PYTHON
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro does a complete Python development environment check.
|
||||
#
|
||||
# It recurses through several python versions (from 2.1 to 2.6 in this
|
||||
# version), looking for an executable. When it finds an executable, it
|
||||
# looks to find the header files and library.
|
||||
#
|
||||
# It sets PYTHON_BIN to the name of the python executable,
|
||||
# PYTHON_INCLUDE_DIR to the directory holding the header files, and
|
||||
# PYTHON_LIB to the name of the Python library.
|
||||
#
|
||||
# This macro calls AC_SUBST on PYTHON_BIN (via AC_CHECK_PROG),
|
||||
# PYTHON_INCLUDE_DIR and PYTHON_LIB.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Michael Tindal
|
||||
#
|
||||
# This program 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.
|
||||
#
|
||||
# This program 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 14
|
||||
|
||||
AC_DEFUN([AX_PYTHON],
|
||||
[AC_MSG_CHECKING(for python build information)
|
||||
AC_MSG_RESULT([])
|
||||
for python in python3.5 python3.4 python3.3 python3.2 python3.1 python3 python2.7 python2.6 python2 python; do
|
||||
AC_CHECK_PROGS(PYTHON_BIN, [$python])
|
||||
ax_python_bin=$PYTHON_BIN
|
||||
if test x$ax_python_bin != x; then
|
||||
AC_CHECK_LIB($ax_python_bin, main, ax_python_lib=$ax_python_bin, ax_python_lib=no)
|
||||
if test x$ax_python_lib == xno; then
|
||||
AC_CHECK_LIB(${ax_python_bin}m, main, ax_python_lib=${ax_python_bin}m, ax_python_lib=no)
|
||||
fi
|
||||
if test x$ax_python_lib == xno; then
|
||||
AC_CHECK_LIB(${ax_python_bin}mu, main, ax_python_lib=${ax_python_bin}mu, ax_python_lib=no)
|
||||
fi
|
||||
if test x$ax_python_lib != xno; then
|
||||
ax_python_header=`$ax_python_bin -c "from distutils.sysconfig import *; print(get_config_var('CONFINCLUDEPY'))"`
|
||||
if test x$ax_python_header != x; then
|
||||
break;
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
unset ac_cv_prog_PYTHON_BIN
|
||||
unset PYTHON_BIN
|
||||
done
|
||||
if test x$ax_python_bin = x; then
|
||||
ax_python_bin=no
|
||||
fi
|
||||
if test x$ax_python_header = x; then
|
||||
ax_python_header=no
|
||||
fi
|
||||
if test x$ax_python_lib = x; then
|
||||
ax_python_lib=no
|
||||
fi
|
||||
|
||||
AC_MSG_RESULT([ results of the Python check:])
|
||||
AC_MSG_RESULT([ Binary: $ax_python_bin])
|
||||
AC_MSG_RESULT([ Library: $ax_python_lib])
|
||||
AC_MSG_RESULT([ Include Dir: $ax_python_header])
|
||||
|
||||
|
||||
PYTHON_FOUND=yes
|
||||
if test x$ax_python_header != xno; then
|
||||
PYTHON_INCLUDE_DIR=$ax_python_header
|
||||
AC_SUBST(PYTHON_INCLUDE_DIR)
|
||||
else
|
||||
PYTHON_FOUND=no
|
||||
fi
|
||||
|
||||
if test x$ax_python_lib != xno; then
|
||||
PYTHON_LIB=$ax_python_lib
|
||||
AC_SUBST(PYTHON_LIB)
|
||||
else
|
||||
PYTHON_FOUND=no
|
||||
fi
|
||||
AC_SUBST(PYTHON_FOUND)
|
||||
|
||||
])dnl
|
||||
-2132
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
-99
@@ -1,99 +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 __BINLOG_H__
|
||||
#define __BINLOG_H__
|
||||
|
||||
//#include "structures.h"
|
||||
#include "tgl.h"
|
||||
|
||||
void bl_do_set_auth_key_id (int num, unsigned char *buf);
|
||||
|
||||
void bl_do_dc_option (int id, int l1, const char *name, int l2, const char *ip, int port);
|
||||
|
||||
void bl_do_set_our_id (int id);
|
||||
void bl_do_user_add (int id, const char *f, int fl, const char *l, int ll, long long access_token, const char *p, int pl, int contact);
|
||||
void bl_do_user_delete (struct tgl_user *U);
|
||||
void bl_do_set_user_profile_photo (struct tgl_user *U, long long photo_id, struct tgl_file_location *big, struct tgl_file_location *small);
|
||||
void bl_do_user_set_name (struct tgl_user *U, const char *f, int fl, const char *l, int ll);
|
||||
void bl_do_user_set_access_hash (struct tgl_user *U, long long access_token);
|
||||
void bl_do_user_set_phone (struct tgl_user *U, const char *p, int pl);
|
||||
void bl_do_user_set_friend (struct tgl_user *U, int friend);
|
||||
void bl_do_user_set_full_photo (struct tgl_user *U, const int *start, int len);
|
||||
void bl_do_user_set_blocked (struct tgl_user *U, int blocked);
|
||||
void bl_do_user_set_real_name (struct tgl_user *U, const char *f, int fl, const char *l, int ll);
|
||||
|
||||
void bl_do_encr_chat_delete (struct tgl_secret_chat *U);
|
||||
void bl_do_encr_chat_requested (struct tgl_secret_chat *U, long long access_hash, int date, int admin_id, int user_id, unsigned char g_key[], unsigned char nonce[]);
|
||||
void bl_do_encr_chat_create (int id, int user_id, int admin_id, char *name, int name_len);
|
||||
void bl_do_encr_chat_set_access_hash (struct tgl_secret_chat *U, long long access_hash);
|
||||
void bl_do_encr_chat_set_date (struct tgl_secret_chat *U, int date);
|
||||
void bl_do_encr_chat_set_state (struct tgl_secret_chat *U, enum tgl_secret_chat_state state);
|
||||
void bl_do_encr_chat_set_ttl (struct tgl_secret_chat *U, int ttl);
|
||||
void bl_do_encr_chat_set_layer (struct tgl_secret_chat *U, int layer);
|
||||
void bl_do_encr_chat_accepted (struct tgl_secret_chat *U, const unsigned char g_key[], const unsigned char nonce[], long long key_fingerprint);
|
||||
void bl_do_encr_chat_set_key (struct tgl_secret_chat *E, unsigned char key[], long long key_fingerprint);
|
||||
void bl_do_encr_chat_init (int id, int user_id, unsigned char random[], unsigned char g_a[]);
|
||||
|
||||
void bl_do_dc_signed (int id);
|
||||
void bl_do_set_working_dc (int num);
|
||||
void bl_do_set_dh_params (int root, unsigned char prime[], int version);
|
||||
|
||||
void bl_do_set_pts (int pts);
|
||||
void bl_do_set_qts (int qts);
|
||||
void bl_do_set_seq (int seq);
|
||||
void bl_do_set_date (int date);
|
||||
|
||||
void bl_do_create_chat (struct tgl_chat *C, int y, const char *s, int l, int users_num, int date, int version, struct tgl_file_location *big, struct tgl_file_location *small);
|
||||
void bl_do_chat_forbid (struct tgl_chat *C, int on);
|
||||
void bl_do_chat_set_title (struct tgl_chat *C, const char *s, int l);
|
||||
void bl_do_chat_set_photo (struct tgl_chat *C, struct tgl_file_location *big, struct tgl_file_location *small);
|
||||
void bl_do_chat_set_date (struct tgl_chat *C, int date);
|
||||
void bl_do_chat_set_set_in_chat (struct tgl_chat *C, int on);
|
||||
void bl_do_chat_set_version (struct tgl_chat *C, int version, int user_num);
|
||||
void bl_do_chat_set_admin (struct tgl_chat *C, int admin);
|
||||
void bl_do_chat_set_participants (struct tgl_chat *C, int version, int user_num, struct tgl_chat_user *users);
|
||||
void bl_do_chat_set_full_photo (struct tgl_chat *U, const int *start, int len);
|
||||
void bl_do_chat_add_user (struct tgl_chat *C, int version, int user, int inviter, int date);
|
||||
void bl_do_chat_del_user (struct tgl_chat *C, int version, int user);
|
||||
|
||||
void bl_do_create_message_text (int msg_id, int from_id, int to_type, int to_id, int date, int unread, int l, const char *s);
|
||||
void bl_do_create_message_text_fwd (int msg_id, int from_id, int to_type, int to_id, int date, int fwd, int fwd_date, int unread, int l, const char *s);
|
||||
void bl_do_create_message_service (int msg_id, int from_id, int to_type, int to_id, int date, int unread, const int *data, int len);
|
||||
void bl_do_create_message_service_fwd (int msg_id, int from_id, int to_type, int to_id, int date, int fwd, int fwd_date, int unread, const int *data, int len);
|
||||
void bl_do_create_message_media (int msg_id, int from_id, int to_type, int to_id, int date, int unread, int l, const char *s, const int *data, int len);
|
||||
void bl_do_create_message_media_encr_pending (long long msg_id, int from_id, int to_type, int to_id, int date, int l, const char *s, const int *data, int len);
|
||||
void bl_do_create_message_media_encr_sent (long long msg_id, const int *data, int len);
|
||||
void bl_do_create_message_media_fwd (int msg_id, int from_id, int to_type, int to_id, int date, int fwd, int fwd_date, int unread, int l, const char *s, const int *data, int len);
|
||||
void bl_do_create_message_media_encr (long long msg_id, int from_id, int to_type, int to_id, int date, int l, const char *s, const int *data, int len, const int *data2, int len2);
|
||||
void bl_do_create_message_service_encr (long long msg_id, int from_id, int to_type, int to_id, int date, const int *data, int len);
|
||||
void bl_do_send_message_text (long long msg_id, int from_id, int to_type, int to_id, int date, int l, const char *s);
|
||||
void bl_do_send_message_action_encr (long long msg_id, int from_id, int to_type, int to_id, int date, int l, const int *s);
|
||||
void bl_do_set_unread (struct tgl_message *M, int unread);
|
||||
void bl_do_set_message_sent (struct tgl_message *M);
|
||||
void bl_do_set_msg_id (struct tgl_message *M, int id);
|
||||
void bl_do_delete_msg (struct tgl_message *M);
|
||||
|
||||
void bl_do_msg_seq_update (long long id);
|
||||
void bl_do_msg_update (long long id);
|
||||
|
||||
void bl_do_reset_authorization (void);
|
||||
|
||||
//void bl_do_add_dc (int id, const char *ip, int l, int port, long long auth_key_id, const char *auth_key);
|
||||
#endif
|
||||
-79
@@ -1,79 +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.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.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;
|
||||
Arquivo executável
+6
@@ -0,0 +1,6 @@
|
||||
#! /bin/sh
|
||||
|
||||
aclocal
|
||||
autoheader
|
||||
automake --gnu --add-missing
|
||||
autoconf
|
||||
+21
-2
@@ -1,5 +1,8 @@
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* disable extf queries */
|
||||
#undef DISABLE_EXTF
|
||||
|
||||
/* Use libevent v1 */
|
||||
#undef EVENT_V1
|
||||
|
||||
@@ -33,8 +36,11 @@
|
||||
/* Define to 1 if you have the `event' library (-levent). */
|
||||
#undef HAVE_LIBEVENT
|
||||
|
||||
/* Define to 1 if you have the `m' library (-lm). */
|
||||
#undef HAVE_LIBM
|
||||
/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
|
||||
#undef HAVE_LIBGCRYPT
|
||||
|
||||
/* Define to 1 if you have the `jansson' library (-ljansson). */
|
||||
#undef HAVE_LIBJANSSON
|
||||
|
||||
/* Define to 1 if you have `z' library (-lz) */
|
||||
#undef HAVE_LIBZ
|
||||
@@ -152,9 +158,22 @@
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* avoid OpenSSL entirely, use libgcrypt instead (this can't read *.pub files,
|
||||
though.) */
|
||||
#undef TGL_AVOID_OPENSSL
|
||||
|
||||
/* use json */
|
||||
#undef USE_JSON
|
||||
|
||||
/* use lua */
|
||||
#undef USE_LUA
|
||||
|
||||
/* use python */
|
||||
#undef USE_PYTHON
|
||||
|
||||
/* fixed for correct valgrind work */
|
||||
#undef VALGRIND_FIXES
|
||||
|
||||
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||
#undef gid_t
|
||||
|
||||
|
||||
+1
-6
@@ -7,14 +7,12 @@ test_dc1 = {
|
||||
config_directory = ".telegram/test_dc1";
|
||||
test = true;
|
||||
msg_num = true;
|
||||
binlog_enabled = true;
|
||||
};
|
||||
|
||||
binlog = {
|
||||
config_directory = ".telegram/binlog";
|
||||
test = false;
|
||||
msg_num = true;
|
||||
binlog_enabled = true;
|
||||
log_level = 2;
|
||||
};
|
||||
|
||||
@@ -22,7 +20,6 @@ binlog_mts = {
|
||||
config_directory = ".telegram/binlog_mts";
|
||||
test = false;
|
||||
msg_num = true;
|
||||
binlog_enabled = true;
|
||||
log_level = 2;
|
||||
};
|
||||
|
||||
@@ -30,7 +27,6 @@ mega = {
|
||||
config_directory = ".telegram/mega";
|
||||
test = false;
|
||||
msg_num = true;
|
||||
binlog_enabled = true;
|
||||
log_level = 2;
|
||||
};
|
||||
|
||||
@@ -55,12 +51,11 @@ test = {
|
||||
test1 = {
|
||||
config_directory = ".telegram/test1";
|
||||
msg_num = true;
|
||||
binlog_enabled = true;
|
||||
};
|
||||
|
||||
test2 = {
|
||||
config_directory = ".telegram/test2";
|
||||
msg_num = true;
|
||||
binlog_enabled = true;
|
||||
pfs_enabled = true;
|
||||
};
|
||||
|
||||
|
||||
externo
+691
-46
@@ -622,6 +622,12 @@ ac_includes_default="\
|
||||
ac_subst_vars='LTLIBOBJS
|
||||
EXTRA_LIBS
|
||||
LIBOBJS
|
||||
PYTHON_CFLAGS
|
||||
PYTHON_LIBS
|
||||
PYTHON_FOUND
|
||||
PYTHON_LIB
|
||||
PYTHON_INCLUDE_DIR
|
||||
PYTHON_BIN
|
||||
LUA_LIB
|
||||
LUA_INCLUDE
|
||||
pkgluaexecdir
|
||||
@@ -689,11 +695,16 @@ SHELL'
|
||||
ac_subst_files=''
|
||||
ac_user_opts='
|
||||
enable_option_checking
|
||||
enable_openssl
|
||||
with_openssl
|
||||
with_zlib
|
||||
enable_libconfig
|
||||
enable_extf
|
||||
enable_liblua
|
||||
enable_python
|
||||
enable_json
|
||||
with_progname
|
||||
enable_valgrind
|
||||
'
|
||||
ac_precious_vars='build_alias
|
||||
host_alias
|
||||
@@ -1316,8 +1327,14 @@ Optional Features:
|
||||
--disable-option-checking ignore unrecognized --enable/--with options
|
||||
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
|
||||
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
||||
--disable-openssl disables OpenSSL, and don't link against it
|
||||
(this can't read *.pub files, though.)
|
||||
--enable-libconfig/--disable-libconfig
|
||||
--enable-extf/--disable-extf
|
||||
--enable-liblua/--disable-liblua
|
||||
--enable-python/--disable-python
|
||||
--enable-json/--disable-json
|
||||
--enable-valgrind/--disable-valgrind
|
||||
|
||||
Optional Packages:
|
||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||
@@ -2387,6 +2404,62 @@ ac_config_headers="$ac_config_headers config.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_python.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_PYTHON
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro does a complete Python development environment check.
|
||||
#
|
||||
# It recurses through several python versions (from 2.1 to 2.6 in this
|
||||
# version), looking for an executable. When it finds an executable, it
|
||||
# looks to find the header files and library.
|
||||
#
|
||||
# It sets PYTHON_BIN to the name of the python executable,
|
||||
# PYTHON_INCLUDE_DIR to the directory holding the header files, and
|
||||
# PYTHON_LIB to the name of the Python library.
|
||||
#
|
||||
# This macro calls AC_SUBST on PYTHON_BIN (via AC_CHECK_PROG),
|
||||
# PYTHON_INCLUDE_DIR and PYTHON_LIB.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Michael Tindal
|
||||
#
|
||||
# This program 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.
|
||||
#
|
||||
# This program 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 14
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
@@ -3427,51 +3500,6 @@ LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
|
||||
# Checks for libraries.
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrt in -lm" >&5
|
||||
$as_echo_n "checking for sqrt in -lm... " >&6; }
|
||||
if ${ac_cv_lib_m_sqrt+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lm $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
char sqrt ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return sqrt ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
ac_cv_lib_m_sqrt=yes
|
||||
else
|
||||
ac_cv_lib_m_sqrt=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrt" >&5
|
||||
$as_echo "$ac_cv_lib_m_sqrt" >&6; }
|
||||
if test "x$ac_cv_lib_m_sqrt" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_LIBM 1
|
||||
_ACEOF
|
||||
|
||||
LIBS="-lm $LIBS"
|
||||
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
|
||||
$as_echo_n "checking for library containing clock_gettime... " >&6; }
|
||||
if ${ac_cv_search_clock_gettime+:} false; then :
|
||||
@@ -4059,6 +4087,62 @@ EXTRA_LIBS=""
|
||||
# OPENSSL_LIBS to the -l directives required
|
||||
# OPENSSL_LDFLAGS to the -L or -R flags required
|
||||
|
||||
# Check whether --enable-openssl was given.
|
||||
if test "${enable_openssl+set}" = set; then :
|
||||
enableval=$enable_openssl;
|
||||
if test "x$enableval" = "xno" ; then
|
||||
|
||||
$as_echo "#define TGL_AVOID_OPENSSL 1" >>confdefs.h
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcry_mpi_snatch in -lgcrypt" >&5
|
||||
$as_echo_n "checking for gcry_mpi_snatch in -lgcrypt... " >&6; }
|
||||
if ${ac_cv_lib_gcrypt_gcry_mpi_snatch+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lgcrypt $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
char gcry_mpi_snatch ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return gcry_mpi_snatch ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
ac_cv_lib_gcrypt_gcry_mpi_snatch=yes
|
||||
else
|
||||
ac_cv_lib_gcrypt_gcry_mpi_snatch=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcrypt_gcry_mpi_snatch" >&5
|
||||
$as_echo "$ac_cv_lib_gcrypt_gcry_mpi_snatch" >&6; }
|
||||
if test "x$ac_cv_lib_gcrypt_gcry_mpi_snatch" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_LIBGCRYPT 1
|
||||
_ACEOF
|
||||
|
||||
LIBS="-lgcrypt $LIBS"
|
||||
|
||||
else
|
||||
as_fn_error $? "\"Need libgcrypt >= 1.60\"" "$LINENO" 5
|
||||
fi
|
||||
|
||||
else
|
||||
# Don't be annoying, so don't inform the user about --disable-openssl
|
||||
|
||||
found=false
|
||||
|
||||
@@ -4197,7 +4281,7 @@ else
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
as_fn_error $? "No openssl found" "$LINENO" 5
|
||||
as_fn_error $? "No openssl found." "$LINENO" 5
|
||||
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
@@ -4210,6 +4294,164 @@ rm -f core conftest.err conftest.$ac_objext \
|
||||
|
||||
|
||||
|
||||
fi
|
||||
|
||||
else
|
||||
|
||||
|
||||
found=false
|
||||
|
||||
# Check whether --with-openssl was given.
|
||||
if test "${with_openssl+set}" = set; then :
|
||||
withval=$with_openssl;
|
||||
case "$withval" in
|
||||
"" | y | ye | yes | n | no)
|
||||
as_fn_error $? "Invalid --with-openssl value" "$LINENO" 5
|
||||
;;
|
||||
*) ssldirs="$withval"
|
||||
;;
|
||||
esac
|
||||
|
||||
else
|
||||
|
||||
# if pkg-config is installed and openssl has installed a .pc file,
|
||||
# then use that information and don't search ssldirs
|
||||
# Extract the first word of "pkg-config", so it can be a program name with args.
|
||||
set dummy pkg-config; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_path_PKG_CONFIG+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
case $PKG_CONFIG in
|
||||
[\\/]* | ?:[\\/]*)
|
||||
ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
|
||||
;;
|
||||
*)
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
PKG_CONFIG=$ac_cv_path_PKG_CONFIG
|
||||
if test -n "$PKG_CONFIG"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
|
||||
$as_echo "$PKG_CONFIG" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
if test x"$PKG_CONFIG" != x""; then
|
||||
OPENSSL_LDFLAGS=`$PKG_CONFIG openssl --libs-only-L 2>/dev/null`
|
||||
if test $? = 0; then
|
||||
OPENSSL_LIBS=`$PKG_CONFIG openssl --libs-only-l 2>/dev/null`
|
||||
OPENSSL_INCLUDES=`$PKG_CONFIG openssl --cflags-only-I 2>/dev/null`
|
||||
found=true
|
||||
fi
|
||||
fi
|
||||
|
||||
# no such luck; use some default ssldirs
|
||||
if ! $found; then
|
||||
ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr"
|
||||
fi
|
||||
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# note that we #include <openssl/foo.h>, so the OpenSSL headers have to be in
|
||||
# an 'openssl' subdirectory
|
||||
|
||||
if ! $found; then
|
||||
OPENSSL_INCLUDES=
|
||||
for ssldir in $ssldirs; do
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openssl/ssl.h in $ssldir" >&5
|
||||
$as_echo_n "checking for openssl/ssl.h in $ssldir... " >&6; }
|
||||
if test -f "$ssldir/include/openssl/ssl.h"; then
|
||||
OPENSSL_INCLUDES="-I$ssldir/include"
|
||||
OPENSSL_LDFLAGS="-L$ssldir/lib"
|
||||
OPENSSL_LIBS="-lssl -lcrypto"
|
||||
found=true
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
break
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
done
|
||||
|
||||
# if the file wasn't found, well, go ahead and try the link anyway -- maybe
|
||||
# it will just work!
|
||||
fi
|
||||
|
||||
# try the preprocessor and linker with our new flags,
|
||||
# being careful not to pollute the global LIBS, LDFLAGS, and CPPFLAGS
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiling and linking against OpenSSL works" >&5
|
||||
$as_echo_n "checking whether compiling and linking against OpenSSL works... " >&6; }
|
||||
echo "Trying link with OPENSSL_LDFLAGS=$OPENSSL_LDFLAGS;" \
|
||||
"OPENSSL_LIBS=$OPENSSL_LIBS; OPENSSL_INCLUDES=$OPENSSL_INCLUDES" >&5
|
||||
|
||||
save_LIBS="$LIBS"
|
||||
save_LDFLAGS="$LDFLAGS"
|
||||
save_CPPFLAGS="$CPPFLAGS"
|
||||
LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS"
|
||||
LIBS="$OPENSSL_LIBS $LIBS"
|
||||
CPPFLAGS="$OPENSSL_INCLUDES $CPPFLAGS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
#include <openssl/ssl.h>
|
||||
int
|
||||
main ()
|
||||
{
|
||||
SSL_new(NULL)
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
|
||||
|
||||
else
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
as_fn_error $? "No openssl found. With --disable-openssl, libtgl will use libgcrypt instead." "$LINENO" 5
|
||||
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
CPPFLAGS="$save_CPPFLAGS"
|
||||
LDFLAGS="$save_LDFLAGS"
|
||||
LIBS="$save_LIBS"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
fi
|
||||
|
||||
#
|
||||
# Handle user hints
|
||||
#
|
||||
@@ -4502,6 +4744,18 @@ fi
|
||||
fi
|
||||
|
||||
|
||||
# Check whether --enable-extf was given.
|
||||
if test "${enable_extf+set}" = set; then :
|
||||
enableval=$enable_extf;
|
||||
if test "x$enableval" = "xno" ; then
|
||||
|
||||
$as_echo "#define DISABLE_EXTF 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for liblua" >&5
|
||||
$as_echo_n "checking for liblua... " >&6; }
|
||||
# Check whether --enable-liblua was given.
|
||||
@@ -5849,7 +6103,380 @@ fi
|
||||
fi
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python" >&5
|
||||
$as_echo_n "checking for python... " >&6; }
|
||||
# Check whether --enable-python was given.
|
||||
if test "${enable_python+set}" = set; then :
|
||||
enableval=$enable_python;
|
||||
if test "x$enableval" = "xyes" ; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
|
||||
$as_echo "disabled" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
|
||||
$as_echo "enabled" >&6; }
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python build information" >&5
|
||||
$as_echo_n "checking for python build information... " >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
|
||||
$as_echo "" >&6; }
|
||||
for python in python3.5 python3.4 python3.3 python3.2 python3.1 python3 python2.7 python2.6 python2 python; do
|
||||
for ac_prog in $python
|
||||
do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_prog_PYTHON_BIN+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if test -n "$PYTHON_BIN"; then
|
||||
ac_cv_prog_PYTHON_BIN="$PYTHON_BIN" # Let the user override the test.
|
||||
else
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
ac_cv_prog_PYTHON_BIN="$ac_prog"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
fi
|
||||
fi
|
||||
PYTHON_BIN=$ac_cv_prog_PYTHON_BIN
|
||||
if test -n "$PYTHON_BIN"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_BIN" >&5
|
||||
$as_echo "$PYTHON_BIN" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
test -n "$PYTHON_BIN" && break
|
||||
done
|
||||
|
||||
ax_python_bin=$PYTHON_BIN
|
||||
if test x$ax_python_bin != x; then
|
||||
as_ac_Lib=`$as_echo "ac_cv_lib_$ax_python_bin''_main" | $as_tr_sh`
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -l$ax_python_bin" >&5
|
||||
$as_echo_n "checking for main in -l$ax_python_bin... " >&6; }
|
||||
if eval \${$as_ac_Lib+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-l$ax_python_bin $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return main ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
eval "$as_ac_Lib=yes"
|
||||
else
|
||||
eval "$as_ac_Lib=no"
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
eval ac_res=\$$as_ac_Lib
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||
$as_echo "$ac_res" >&6; }
|
||||
if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
|
||||
ax_python_lib=$ax_python_bin
|
||||
else
|
||||
ax_python_lib=no
|
||||
fi
|
||||
|
||||
if test x$ax_python_lib == xno; then
|
||||
as_ac_Lib=`$as_echo "ac_cv_lib_${ax_python_bin}m''_main" | $as_tr_sh`
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -l${ax_python_bin}m" >&5
|
||||
$as_echo_n "checking for main in -l${ax_python_bin}m... " >&6; }
|
||||
if eval \${$as_ac_Lib+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-l${ax_python_bin}m $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return main ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
eval "$as_ac_Lib=yes"
|
||||
else
|
||||
eval "$as_ac_Lib=no"
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
eval ac_res=\$$as_ac_Lib
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||
$as_echo "$ac_res" >&6; }
|
||||
if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
|
||||
ax_python_lib=${ax_python_bin}m
|
||||
else
|
||||
ax_python_lib=no
|
||||
fi
|
||||
|
||||
fi
|
||||
if test x$ax_python_lib == xno; then
|
||||
as_ac_Lib=`$as_echo "ac_cv_lib_${ax_python_bin}mu''_main" | $as_tr_sh`
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -l${ax_python_bin}mu" >&5
|
||||
$as_echo_n "checking for main in -l${ax_python_bin}mu... " >&6; }
|
||||
if eval \${$as_ac_Lib+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-l${ax_python_bin}mu $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return main ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
eval "$as_ac_Lib=yes"
|
||||
else
|
||||
eval "$as_ac_Lib=no"
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
eval ac_res=\$$as_ac_Lib
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||
$as_echo "$ac_res" >&6; }
|
||||
if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
|
||||
ax_python_lib=${ax_python_bin}mu
|
||||
else
|
||||
ax_python_lib=no
|
||||
fi
|
||||
|
||||
fi
|
||||
if test x$ax_python_lib != xno; then
|
||||
ax_python_header=`$ax_python_bin -c "from distutils.sysconfig import *; print(get_config_var('CONFINCLUDEPY'))"`
|
||||
if test x$ax_python_header != x; then
|
||||
break;
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
unset ac_cv_prog_PYTHON_BIN
|
||||
unset PYTHON_BIN
|
||||
done
|
||||
if test x$ax_python_bin = x; then
|
||||
ax_python_bin=no
|
||||
fi
|
||||
if test x$ax_python_header = x; then
|
||||
ax_python_header=no
|
||||
fi
|
||||
if test x$ax_python_lib = x; then
|
||||
ax_python_lib=no
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: results of the Python check:" >&5
|
||||
$as_echo " results of the Python check:" >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Binary: $ax_python_bin" >&5
|
||||
$as_echo " Binary: $ax_python_bin" >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Library: $ax_python_lib" >&5
|
||||
$as_echo " Library: $ax_python_lib" >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Include Dir: $ax_python_header" >&5
|
||||
$as_echo " Include Dir: $ax_python_header" >&6; }
|
||||
|
||||
|
||||
PYTHON_FOUND=yes
|
||||
if test x$ax_python_header != xno; then
|
||||
PYTHON_INCLUDE_DIR=$ax_python_header
|
||||
|
||||
else
|
||||
PYTHON_FOUND=no
|
||||
fi
|
||||
|
||||
if test x$ax_python_lib != xno; then
|
||||
PYTHON_LIB=$ax_python_lib
|
||||
|
||||
else
|
||||
PYTHON_FOUND=no
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
if test $PYTHON_FOUND = no ; then
|
||||
as_fn_error $? "No supported python lib version found. Try --disable-python" "$LINENO" 5
|
||||
else
|
||||
|
||||
|
||||
EXTRA_LIBS="${EXTRA_LIBS} -l${PYTHON_LIB}"
|
||||
CPPFLAGS="${CPPFLAGS} -I${PYTHON_INCLUDE_DIR}"
|
||||
|
||||
$as_echo "#define USE_PYTHON 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
else
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
|
||||
$as_echo "disabled" >&6; }
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libjansson" >&5
|
||||
$as_echo_n "checking for libjansson... " >&6; }
|
||||
# Check whether --enable-json was given.
|
||||
if test "${enable_json+set}" = set; then :
|
||||
enableval=$enable_json;
|
||||
if test "x$enableval" = "xno" ; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
|
||||
$as_echo "disabled" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
|
||||
$as_echo "enabled" >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for json_array_set_new in -ljansson" >&5
|
||||
$as_echo_n "checking for json_array_set_new in -ljansson... " >&6; }
|
||||
if ${ac_cv_lib_jansson_json_array_set_new+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-ljansson $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
char json_array_set_new ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return json_array_set_new ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
ac_cv_lib_jansson_json_array_set_new=yes
|
||||
else
|
||||
ac_cv_lib_jansson_json_array_set_new=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jansson_json_array_set_new" >&5
|
||||
$as_echo "$ac_cv_lib_jansson_json_array_set_new" >&6; }
|
||||
if test "x$ac_cv_lib_jansson_json_array_set_new" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_LIBJANSSON 1
|
||||
_ACEOF
|
||||
|
||||
LIBS="-ljansson $LIBS"
|
||||
|
||||
else
|
||||
as_fn_error $? "No libjansson found. Try --disable-json" "$LINENO" 5
|
||||
fi
|
||||
|
||||
|
||||
$as_echo "#define USE_JSON 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
else
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
|
||||
$as_echo "enabled" >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for json_array_set_new in -ljansson" >&5
|
||||
$as_echo_n "checking for json_array_set_new in -ljansson... " >&6; }
|
||||
if ${ac_cv_lib_jansson_json_array_set_new+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-ljansson $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
char json_array_set_new ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return json_array_set_new ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
ac_cv_lib_jansson_json_array_set_new=yes
|
||||
else
|
||||
ac_cv_lib_jansson_json_array_set_new=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jansson_json_array_set_new" >&5
|
||||
$as_echo "$ac_cv_lib_jansson_json_array_set_new" >&6; }
|
||||
if test "x$ac_cv_lib_jansson_json_array_set_new" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_LIBJANSSON 1
|
||||
_ACEOF
|
||||
|
||||
LIBS="-ljansson $LIBS"
|
||||
|
||||
else
|
||||
as_fn_error $? "No libjansson found. Try --disable-json" "$LINENO" 5
|
||||
fi
|
||||
|
||||
|
||||
$as_echo "#define USE_JSON 1" >>confdefs.h
|
||||
|
||||
|
||||
fi
|
||||
|
||||
|
||||
#check for custom prog name
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking progname" >&5
|
||||
$as_echo_n "checking progname... " >&6; }
|
||||
|
||||
# Check whether --with-progname was given.
|
||||
if test "${with_progname+set}" = set; then :
|
||||
@@ -5878,6 +6505,24 @@ $as_echo "default" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
# Check whether --enable-valgrind was given.
|
||||
if test "${enable_valgrind+set}" = set; then :
|
||||
enableval=$enable_valgrind;
|
||||
if test "x$enableval" = "xyes" ; then
|
||||
ac_fn_c_check_header_mongrel "$LINENO" "valgrind/memcheck.h" "ac_cv_header_valgrind_memcheck_h" "$ac_includes_default"
|
||||
if test "x$ac_cv_header_valgrind_memcheck_h" = xyes; then :
|
||||
|
||||
$as_echo "#define VALGRIND_FIXES 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Checks for header files.
|
||||
for ac_header in execinfo.h fcntl.h malloc.h netdb.h stdlib.h string.h unistd.h arpa/inet.h mach/mach.h netinet/in.h sys/file.h sys/socket.h termios.h
|
||||
do :
|
||||
|
||||
+75
-2
@@ -4,6 +4,7 @@ AC_CONFIG_SRCDIR([config.h.in])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
m4_include([ax_lua.m4])
|
||||
m4_include([ax_python.m4])
|
||||
m4_include([m4_ax_check_openssl.m4])
|
||||
m4_include([m4_ax_check_zlib.m4])
|
||||
m4_include([m4-ax_gcc_builtin.m4])
|
||||
@@ -16,7 +17,6 @@ CPPFLAGS="$CPPFLAGS -I/usr/local/include"
|
||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
|
||||
# Checks for libraries.
|
||||
AC_CHECK_LIB([m], [sqrt])
|
||||
AC_SEARCH_LIBS([clock_gettime], [rt])
|
||||
AC_SEARCH_LIBS([backtrace], [execinfo])
|
||||
AC_CHECK_LIB([event], [event_base_new], [], [AC_MSG_ERROR([no libevent found])])
|
||||
@@ -33,7 +33,19 @@ EXTRA_LIBS=""
|
||||
# OPENSSL_LIBS to the -l directives required
|
||||
# OPENSSL_LDFLAGS to the -L or -R flags required
|
||||
|
||||
AX_CHECK_OPENSSL(,[AC_MSG_ERROR([No openssl found])])
|
||||
AC_ARG_ENABLE(openssl,[ --disable-openssl disables OpenSSL, and don't link against it
|
||||
(this can't read *.pub files, though.)],
|
||||
[
|
||||
if test "x$enableval" = "xno" ; then
|
||||
AC_DEFINE([TGL_AVOID_OPENSSL],[1],[avoid OpenSSL entirely, use libgcrypt instead (this can't read *.pub files, though.)])
|
||||
AC_CHECK_LIB([gcrypt], [gcry_mpi_snatch], [], [AC_MSG_ERROR(["Need libgcrypt >= 1.60"])])
|
||||
else
|
||||
# Don't be annoying, so don't inform the user about --disable-openssl
|
||||
AX_CHECK_OPENSSL(,[AC_MSG_ERROR([No openssl found.])])
|
||||
fi
|
||||
],[
|
||||
AX_CHECK_OPENSSL(,[AC_MSG_ERROR([No openssl found. With --disable-openssl, libtgl will use libgcrypt instead.])])
|
||||
])
|
||||
AX_CHECK_ZLIB(, [AC_MSG_ERROR([No zlib found])])
|
||||
|
||||
AC_CHECK_LIB([readline], [rl_save_prompt], [ EXTRA_LIBS="${EXTRA_LIBS} -lreadline" ; ], [AC_MSG_ERROR([no libreadline found])])
|
||||
@@ -52,6 +64,14 @@ AC_ARG_ENABLE(libconfig,[--enable-libconfig/--disable-libconfig],
|
||||
AC_CHECK_LIB([config],[config_init],[],AC_MSG_ERROR([No libconfig found. Try --disable-libconfig]))
|
||||
])
|
||||
|
||||
AC_ARG_ENABLE(extf,[--enable-extf/--disable-extf],
|
||||
[
|
||||
if test "x$enableval" = "xno" ; then
|
||||
AC_DEFINE([DISABLE_EXTF],[1],[disable extf queries])
|
||||
fi
|
||||
],[
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([for liblua])
|
||||
AC_ARG_ENABLE(liblua,[--enable-liblua/--disable-liblua],
|
||||
[
|
||||
@@ -86,7 +106,50 @@ AC_ARG_ENABLE(liblua,[--enable-liblua/--disable-liblua],
|
||||
])
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([for python])
|
||||
AC_ARG_ENABLE(python,[--enable-python/--disable-python],
|
||||
[
|
||||
if test "x$enableval" = "xyes" ; then
|
||||
AC_MSG_RESULT([disabled])
|
||||
else
|
||||
AC_MSG_RESULT([enabled])
|
||||
|
||||
AX_PYTHON()
|
||||
AC_SUBST([PYTHON_FOUND])
|
||||
if test $PYTHON_FOUND = no ; then
|
||||
AC_MSG_ERROR([No supported python lib version found. Try --disable-python])
|
||||
else
|
||||
AC_SUBST([PYTHON_LIBS])
|
||||
AC_SUBST([PYTHON_CFLAGS])
|
||||
EXTRA_LIBS="${EXTRA_LIBS} -l${PYTHON_LIB}"
|
||||
CPPFLAGS="${CPPFLAGS} -I${PYTHON_INCLUDE_DIR}"
|
||||
AC_DEFINE(USE_PYTHON,1,[use python])
|
||||
fi
|
||||
fi
|
||||
],[
|
||||
AC_MSG_RESULT([disabled])
|
||||
])
|
||||
|
||||
|
||||
|
||||
AC_MSG_CHECKING([for libjansson])
|
||||
AC_ARG_ENABLE(json,[--enable-json/--disable-json],
|
||||
[
|
||||
if test "x$enableval" = "xno" ; then
|
||||
AC_MSG_RESULT([disabled])
|
||||
else
|
||||
AC_MSG_RESULT([enabled])
|
||||
AC_CHECK_LIB([jansson],[json_array_set_new],[],AC_MSG_ERROR([No libjansson found. Try --disable-json]))
|
||||
AC_DEFINE(USE_JSON,1,[use json])
|
||||
fi
|
||||
],[
|
||||
AC_MSG_RESULT([enabled])
|
||||
AC_CHECK_LIB([jansson],[json_array_set_new],[],AC_MSG_ERROR([No libjansson found. Try --disable-json]))
|
||||
AC_DEFINE(USE_JSON,1,[use json])
|
||||
])
|
||||
|
||||
#check for custom prog name
|
||||
AC_MSG_CHECKING([progname])
|
||||
AC_ARG_WITH(progname,[--with-progname=<name>],
|
||||
[
|
||||
if test "x$with_progname" = "xno" ; then
|
||||
@@ -100,6 +163,16 @@ AC_ARG_WITH(progname,[--with-progname=<name>],
|
||||
],[
|
||||
AC_MSG_RESULT([default])
|
||||
])
|
||||
|
||||
AC_ARG_ENABLE(valgrind,[--enable-valgrind/--disable-valgrind],
|
||||
[
|
||||
if test "x$enableval" = "xyes" ; then
|
||||
AC_CHECK_HEADER(valgrind/memcheck.h, [AC_DEFINE([VALGRIND_FIXES], [1], [fixed for correct valgrind work])], [
|
||||
])
|
||||
fi
|
||||
],[
|
||||
])
|
||||
|
||||
|
||||
# Checks for header files.
|
||||
AC_CHECK_HEADERS([execinfo.h fcntl.h malloc.h netdb.h stdlib.h string.h unistd.h arpa/inet.h mach/mach.h netinet/in.h sys/file.h sys/socket.h termios.h])
|
||||
|
||||
-668
@@ -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
@@ -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
|
||||
externo
+10
-3
@@ -1,5 +1,12 @@
|
||||
telegram-cli (0.1-1) unstable; urgency=low
|
||||
telegram-cli (1.0.6-1) unstable; urgency=low
|
||||
|
||||
* Initial release (Closes #737563)
|
||||
* Upstream update version
|
||||
* Inpliment -e option
|
||||
|
||||
-- Cleto Martín <cleto@debian.org> Mon, 03 Feb 2014 20:00:03 +0000
|
||||
-- Steve Illichevsky <still.ru@gmail.com> Sat, 11 Oct 2014 08:47:07 +0400
|
||||
|
||||
telegram-cli (1.0.5.1-1) unstable; urgency=low
|
||||
|
||||
* Initial release
|
||||
|
||||
-- Steve Illichevsky <still.ru@gmail.com> Sun, 05 Oct 2014 09:37:06 +0400
|
||||
|
||||
externo
+13
-11
@@ -1,16 +1,18 @@
|
||||
Source: telegram-cli
|
||||
Section: net
|
||||
Priority: optional
|
||||
Maintainer: Cleto Martín <cleto@debian.org>
|
||||
Build-Depends: debhelper (>= 8.0.0),
|
||||
autotools-dev,
|
||||
autoconf-archive,
|
||||
libreadline-dev,
|
||||
libconfig-dev,
|
||||
libssl-dev,
|
||||
lua5.2,
|
||||
liblua5.2-dev
|
||||
Standards-Version: 3.9.4
|
||||
Priority: extra
|
||||
Maintainer: Steve Illichevsky <still.ru@gmail.com>
|
||||
Build-Depends: debhelper (>= 8.0.0),
|
||||
autotools-dev,
|
||||
autoconf-archive,
|
||||
libreadline-dev,
|
||||
libconfig-dev,
|
||||
libssl-dev,
|
||||
lua5.1,
|
||||
liblua5.1-dev,
|
||||
lua-lgi,
|
||||
libevent-dev
|
||||
Standards-Version: 3.9.5
|
||||
Homepage: https://github.com/vysheng/tg
|
||||
Vcs-Git: git://github.com/vysheng/tg.git
|
||||
Vcs-Browser: https://github.com/vysheng/tg
|
||||
|
||||
externo
+13
-10
@@ -1,19 +1,19 @@
|
||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Format: http://dep.debian.net/deps/dep5
|
||||
Upstream-Name: telegram-cli
|
||||
Source: https://github.com/vysheng/tg
|
||||
|
||||
Files: *
|
||||
Copyright: 2013 Vitaly Valtman
|
||||
License: GPL-2.0+
|
||||
Copyright: 2013-2014 Vitaly Valtman <https://github.com/vysheng>
|
||||
License: GPL-3.0+
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2014 Cleto Martín <cleto@debian.org>
|
||||
License: GPL-2.0+
|
||||
Copyright: 2014 Steve Illichevsky <still.ru@gmail.com>
|
||||
License: GPL-3.0+
|
||||
|
||||
License: GPL-2.0+
|
||||
This package is free software; you can redistribute it and/or modify
|
||||
License: GPL-3.0+
|
||||
This program 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
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This package is distributed in the hope that it will be useful,
|
||||
@@ -22,7 +22,10 @@ License: GPL-2.0+
|
||||
GNU General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General
|
||||
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
|
||||
Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
|
||||
|
||||
# Please also look if there are files or directories which have a
|
||||
# different copyright/license attached and list them here.
|
||||
|
||||
externo
+3
@@ -1 +1,4 @@
|
||||
README.es
|
||||
README-LUA
|
||||
README.md
|
||||
#telegram-cli.8
|
||||
|
||||
externo
+7
-1
@@ -1 +1,7 @@
|
||||
telegram usr/bin
|
||||
bin/telegram-cli usr/bin
|
||||
server.pub etc/telegram-cli
|
||||
|
||||
#bin/telegram-cli usr/share/telegram-daemon/bin
|
||||
#start-telegram-daemon /usr/share/telegram-daemon/bin
|
||||
test.lua var/lib/telegram-cli/
|
||||
#telegram-daemon etc/init.d
|
||||
|
||||
externo
+16
-10
@@ -1,17 +1,23 @@
|
||||
#!/usr/bin/make -f
|
||||
# -*- makefile -*-
|
||||
# Sample debian/rules that uses debhelper.
|
||||
# This file was originally written by Joey Hess and Craig Small.
|
||||
# As a special exception, when this file is copied by dh-make into a
|
||||
# dh-make output file, you may use that output file without restriction.
|
||||
# This special exception was added by Craig Small in version 0.37 of dh-make.
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
export DH_VERBOSE=1
|
||||
|
||||
VERSION=$(shell dpkg-parsechangelog | sed -n 's/^Version: //p' | cut -f1 -d'-')
|
||||
PACKAGE_NAME=$(shell dpkg-parsechangelog | sed -n 's/^Source: //p')
|
||||
|
||||
%:
|
||||
dh $@ --with autotools-dev
|
||||
|
||||
dh $@ --with autotools-dev
|
||||
build-orig:
|
||||
mkdir -p $(PACKAGE_NAME)-$(VERSION)
|
||||
tar --exclude=ax_lua.m4 --exclude=debian --exclude=\.pc \
|
||||
--exclude=$(PACKAGE_NAME)-$(VERSION) -cf - . \
|
||||
| ( cd $(PACKAGE_NAME)-$(VERSION) && tar xf - )
|
||||
tar -cf ../$(PACKAGE_NAME)_$(VERSION).orig.tar $(PACKAGE_NAME)-$(VERSION)
|
||||
$(RM) -r $(PACKAGE_NAME)-$(VERSION)
|
||||
xz ../$(PACKAGE_NAME)_$(VERSION).orig.tar
|
||||
mkdir -p $(PACKAGE_NAME)-$(VERSION)
|
||||
tar --exclude=ax_lua.m4 --exclude=debian --exclude=\.pc \
|
||||
--exclude=$(PACKAGE_NAME)-$(VERSION) -cf - . \
|
||||
| ( cd $(PACKAGE_NAME)-$(VERSION) && tar xf - )
|
||||
tar -cf ../$(PACKAGE_NAME)_$(VERSION).orig.tar $(PACKAGE_NAME)-$(VERSION)
|
||||
$(RM) -r $(PACKAGE_NAME)-$(VERSION)
|
||||
xz ../$(PACKAGE_NAME)_$(VERSION).orig.tar
|
||||
|
||||
externo
+48
@@ -0,0 +1,48 @@
|
||||
.TH man 8 "02 October 2014" "1.0.5.1" "telegram-cli man page"
|
||||
.SH NAME
|
||||
telegram-cli \- Command-line interface for Telegram messenger
|
||||
.SH SYNOPSIS
|
||||
telegram-cli -k [keyfile]
|
||||
.SH DESCRIPTION
|
||||
Telegram messenger is a cloud-based instant messaging designed for
|
||||
smart phones and similar to Whatsapp but more flexible, and
|
||||
powerful. You can send messages, photos, videos and documents to
|
||||
people who are in your phone contacts (and have Telegram). Telegram
|
||||
also supports secret chats whose provide a private (encrypted) way of
|
||||
communication.
|
||||
.
|
||||
This package contains a command-line based client for Telegram with
|
||||
the following features:
|
||||
* Colored terminal messages.
|
||||
* Message management: history, stats, etc.
|
||||
* Group chat: create and manage groups.
|
||||
* Secret chat: secured and encrypted conversations.
|
||||
* Contact management: add/edit/remove contacts.
|
||||
* Multimedia support: send/load photos and videos.
|
||||
.SH OPTIONS
|
||||
Telegram-cli Usage
|
||||
-u specify username (would not be asked during authorization)
|
||||
-k specify location of public key (possible multiple entries)
|
||||
-v increase verbosity (0-ERROR 1-WARNIN 2-NOTICE 3+-DEBUG-levels)
|
||||
-N message num mode
|
||||
-c config file name
|
||||
-p use specified profile
|
||||
-l log level
|
||||
-f during authorization fetch all messages since registration
|
||||
-E diable auto accept of encrypted chats
|
||||
-s lua script file
|
||||
-W send dialog_list query and wait for answer before reading input
|
||||
-C disable color output
|
||||
-R disable readline
|
||||
-d daemon mode
|
||||
-L <log-name> log file name
|
||||
-U <user-name> change uid after start
|
||||
-G <group-name> change gid after start
|
||||
-D disable output
|
||||
-P <port> port to listen for input commands
|
||||
-S <socket-name> unix socket to create
|
||||
.SH SEE ALSO
|
||||
.SH BUGS
|
||||
No known bugs.
|
||||
.SH AUTHOR
|
||||
Vitaliy Vatman (-@-)
|
||||
externo
+8
@@ -0,0 +1,8 @@
|
||||
/var/lib/telegram-cli/*.log {
|
||||
daily
|
||||
missingok
|
||||
rotate 31
|
||||
compress
|
||||
notifempty
|
||||
nocreate
|
||||
}
|
||||
externo
+1
@@ -0,0 +1 @@
|
||||
debian/telegram-cli.8
|
||||
@@ -0,0 +1,8 @@
|
||||
# Automatically added by dh_installinit
|
||||
if [ -e "/etc/init/telegram-cli.conf" ]; then
|
||||
invoke-rc.d telegram-cli start || exit $?
|
||||
fi
|
||||
# End automatically added section
|
||||
# Automatically added by dh_installinit
|
||||
update-rc.d -f telegram-cli remove >/dev/null || exit $?
|
||||
# End automatically added section
|
||||
externo
+1
@@ -0,0 +1 @@
|
||||
adduser --system --home /var/lib/telegram-cli --gecos "Telegram Daemon User" --group telegramd
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
# Automatically added by dh_installinit
|
||||
if [ "$1" = install ] || [ "$1" = upgrade ]; then
|
||||
if [ -e "/etc/init.d/telegram-cli" ] && [ ! -L "/etc/init.d/telegram-cli" ]; then
|
||||
if [ "`md5sum \"/etc/init.d/telegram-cli\" | sed -e \"s/ .*//\"`" != \
|
||||
"`dpkg-query -W -f='${Conffiles}' telegram-cli | sed -n -e \"\\\\' /etc/init.d/telegram-cli '{s/ obsolete$//;s/.* //p}\"`" ]
|
||||
then
|
||||
echo "Obsolete conffile /etc/init.d/telegram-cli has been modified by you, renaming to .dpkg-bak"
|
||||
mv -f "/etc/init.d/telegram-cli" "/etc/init.d/telegram-cli.dpkg-bak"
|
||||
else
|
||||
rm -f "/etc/init.d/telegram-cli"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
# End automatically added section
|
||||
externo
+7
@@ -0,0 +1,7 @@
|
||||
# Automatically added by dh_installinit
|
||||
if [ -e "/etc/init/telegram-cli.conf" ]; then
|
||||
invoke-rc.d telegram-cli stop || exit $?
|
||||
fi
|
||||
# End automatically added section
|
||||
|
||||
deluser --remove-home telegramd
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
# Automatically added by dh_installinit
|
||||
if [ -e "/etc/init/telegram-cli.conf" ]; then
|
||||
invoke-rc.d telegram-cli stop || exit $?
|
||||
fi
|
||||
# End automatically added section
|
||||
externo
+10
@@ -0,0 +1,10 @@
|
||||
# Service
|
||||
|
||||
setuid telegramd
|
||||
setgid telegramd
|
||||
|
||||
script
|
||||
exec /usr/bin/telegram-cli -s /var/lib/telegram-cli/test.lua -W -d -C -vvvv -l 0 -L /var/lib/telegram-cli/telegram-cli.log -P 8002
|
||||
# This example for Daemon wich keep log in his home directory
|
||||
# This daemon can listen localhost:8002 tcp port
|
||||
end script
|
||||
@@ -1 +0,0 @@
|
||||
encrypted_scheme16.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---
|
||||
@@ -2,6 +2,7 @@
|
||||
#define __EVENT_OLD_H__
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define BEV_EVENT_READ EVBUFFER_READ
|
||||
#define BEV_EVENT_WRITE EVBUFFER_WRITE
|
||||
@@ -40,4 +41,8 @@ static struct bufferevent *bufferevent_socket_new (struct event_base *base, int
|
||||
bufferevent_base_set (base, bev);
|
||||
return bev;
|
||||
}
|
||||
|
||||
static inline void *event_get_callback_arg(const struct event *ev) {
|
||||
return ev->ev_arg;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
-1812
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
-171
@@ -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
|
||||
@@ -1 +1 @@
|
||||
EBUILD telegram-cli-9999.ebuild 665 SHA256 446cf5cd54f60485dda2f47e5c027b78f182053ef88cd09d7327603e2d5f3d86 SHA512 8a3673de91ec60e89391956523a4b61872161a23a7e0babdbd90cbdd8602104ba1855d09bd0af1d2092890eb202f498750610bf71e3bd0562e37ec984deb333e WHIRLPOOL e943b8870f461c62e3dc7f061dcad264c25758d1d50a0c34f5232d3be6ae26e9dd2ca1289e65b6153ff5b8800194969f1c53e3adc81aa4e47bf25c2f7e6aab7c
|
||||
EBUILD telegram-cli-9999.ebuild 926 SHA256 d9c959af30c77afe8e6b1cee162e5362edfb9da6980b53ef71c3cae5f621bf05 SHA512 eeef9e1d2d7cd0b600be0d44de39e9c38207d5fb8f675e7ba239c1e907ab5df6e198a5810e6bb08445c7c2a98cc50bf78554f52b4c7c0534f111bfa3256b8186 WHIRLPOOL 700a6fd9930074ec36dfb3f4b248a43e6d7c0ab0f97ed6b56343e79fb15a087d99eb52ad67a818e67cbb1a848d65cc395f60b319f3fda60c87c10e9f4e132838
|
||||
|
||||
@@ -5,9 +5,10 @@
|
||||
EAPI=5
|
||||
|
||||
EGIT_REPO_URI="https://github.com/vysheng/tg.git"
|
||||
EGIT_BRANCH="test"
|
||||
EGIT_BRANCH="master"
|
||||
EGIT_HAS_SUBMODULES=1
|
||||
inherit git-2
|
||||
IUSE="lua"
|
||||
IUSE="+lua +json +python"
|
||||
DESCRIPTION="Command line interface client for Telegram"
|
||||
HOMEPAGE="https://github.com/vysheng/tg"
|
||||
LICENSE="GPL-2"
|
||||
@@ -19,10 +20,20 @@ DEPEND="sys-libs/zlib
|
||||
dev-libs/libconfig
|
||||
dev-libs/openssl
|
||||
dev-libs/libevent
|
||||
lua? ( dev-lang/lua )"
|
||||
lua? ( dev-lang/lua )
|
||||
json? ( dev-libs/jansson )
|
||||
python? ( dev-lang/python )"
|
||||
|
||||
src_unpack() {
|
||||
git-2_src_unpack
|
||||
cd $EGIT_SOURCEDIR
|
||||
git submodule update --init --recursive
|
||||
}
|
||||
|
||||
src_configure() {
|
||||
econf $(use_enable lua liblua )
|
||||
econf $(use_enable python python )
|
||||
econf $(use_enable json json )
|
||||
}
|
||||
|
||||
src_install() {
|
||||
|
||||
-24
@@ -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
|
||||
+2788
-852
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+10
-4
@@ -14,12 +14,12 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this telegram-cli. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
Copyright Vitaly Valtman 2013-2015
|
||||
*/
|
||||
#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"
|
||||
@@ -45,7 +45,7 @@ void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2)))
|
||||
|
||||
#define vlogprintf(v,...) \
|
||||
do { \
|
||||
if (tgl_state.verbosity >= (v)) {\
|
||||
if (TLS->verbosity >= (v)) {\
|
||||
logprintf (__VA_ARGS__);\
|
||||
}\
|
||||
} while (0);\
|
||||
@@ -68,6 +68,7 @@ struct tgl_message;
|
||||
struct in_ev;
|
||||
void print_message (struct in_ev *ev, struct tgl_message *M);
|
||||
void print_chat_name (struct in_ev *ev, tgl_peer_id_t id, tgl_peer_t *C);
|
||||
void print_channel_name (struct in_ev *ev, tgl_peer_id_t id, tgl_peer_t *C);
|
||||
void print_user_name (struct in_ev *ev, tgl_peer_id_t id, tgl_peer_t *U);
|
||||
void print_encr_chat_name_full (struct in_ev *ev, tgl_peer_id_t id, tgl_peer_t *C);
|
||||
void print_encr_chat_name (struct in_ev *ev, tgl_peer_id_t id, tgl_peer_t *C);
|
||||
@@ -83,4 +84,9 @@ void print_date (struct in_ev *ev, long t);
|
||||
void play_sound (void);
|
||||
void update_prompt (void);
|
||||
void set_interface_callbacks (void);
|
||||
|
||||
char *print_permanent_msg_id (tgl_message_id_t id);
|
||||
char *print_permanent_peer_id (tgl_peer_id_t id);
|
||||
tgl_peer_id_t parse_input_peer_id (const char *s, int l, int mask);
|
||||
tgl_message_id_t parse_input_msg_id (const char *s, int l);
|
||||
#endif
|
||||
|
||||
+509
@@ -0,0 +1,509 @@
|
||||
#include "config.h"
|
||||
#ifdef USE_JSON
|
||||
|
||||
#include <jansson.h>
|
||||
#include "json-tg.h"
|
||||
#include <tgl/tgl.h>
|
||||
#include <tgl/tgl-layout.h>
|
||||
#include "interface.h"
|
||||
#include <assert.h>
|
||||
//format time:
|
||||
#include <time.h>
|
||||
|
||||
#ifndef json_boolean
|
||||
#define json_boolean(val) ((val) ? json_true() : json_false())
|
||||
#endif
|
||||
|
||||
extern struct tgl_state *TLS;
|
||||
|
||||
void json_pack_peer_type (json_t *res, tgl_peer_id_t id) {
|
||||
int x = tgl_get_peer_type (id);
|
||||
switch (x) {
|
||||
case TGL_PEER_USER:
|
||||
assert (json_object_set (res, "peer_type", json_string ("user")) >= 0);
|
||||
break;
|
||||
case TGL_PEER_CHAT:
|
||||
assert (json_object_set (res, "peer_type", json_string ("chat")) >= 0);
|
||||
break;
|
||||
case TGL_PEER_ENCR_CHAT:
|
||||
assert (json_object_set (res, "peer_type", json_string ("encr_chat")) >= 0);
|
||||
break;
|
||||
case TGL_PEER_CHANNEL:
|
||||
assert (json_object_set (res, "peer_type", json_string ("channel")) >= 0);
|
||||
break;
|
||||
default:
|
||||
assert (0);
|
||||
}
|
||||
}
|
||||
|
||||
int str_format_time(long when, char* string)
|
||||
{
|
||||
struct tm *tm = localtime ((void *)&when);
|
||||
return sprintf (string, "%04d-%02d-%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||
}
|
||||
|
||||
void json_pack_user (json_t *res, tgl_peer_t *P) {
|
||||
if (P->user.first_name) {
|
||||
assert (json_object_set (res, "first_name", json_string (P->user.first_name)) >= 0);
|
||||
}
|
||||
|
||||
if (P->user.status.when) {
|
||||
static char s[20];
|
||||
str_format_time(P->user.status.when, s);
|
||||
assert (json_object_set (res, "when", json_string (s)) >= 0);
|
||||
}
|
||||
|
||||
if (P->user.last_name) {
|
||||
assert (json_object_set (res, "last_name", json_string (P->user.last_name)) >= 0);
|
||||
}
|
||||
if (P->user.real_first_name) {
|
||||
assert (json_object_set (res, "real_first_name", json_string (P->user.real_first_name)) >= 0);
|
||||
}
|
||||
if (P->user.real_last_name) {
|
||||
assert (json_object_set (res, "real_last_name", json_string (P->user.real_last_name)) >= 0);
|
||||
}
|
||||
if (P->user.phone) {
|
||||
assert (json_object_set (res, "phone", json_string (P->user.phone)) >= 0);
|
||||
}
|
||||
if (P->user.username) {
|
||||
assert (json_object_set (res, "username", json_string (P->user.username)) >= 0);
|
||||
}
|
||||
}
|
||||
|
||||
void json_pack_chat (json_t *res, tgl_peer_t *P) {
|
||||
assert (P->chat.title);
|
||||
assert (json_object_set (res, "title", json_string (P->chat.title)) >= 0);
|
||||
tgl_peer_id_t admin_id = TGL_MK_USER (P->chat.admin_id);
|
||||
assert (json_object_set (res, "admin", json_pack_peer (admin_id)) >= 0);
|
||||
assert (json_object_set (res, "members_num", json_integer (P->chat.users_num)) >= 0);
|
||||
if (P->chat.user_list) {
|
||||
json_t *m = json_array ();
|
||||
assert (m);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < P->chat.users_num; i++) {
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (P->chat.user_list[i].user_id);
|
||||
tgl_peer_id_t inviter_id = TGL_MK_USER (P->chat.user_list[i].inviter_id);
|
||||
json_t *peer = json_pack_peer (user_id);
|
||||
assert (json_object_set (peer, "inviter", json_pack_peer (inviter_id)) >= 0);
|
||||
assert (json_array_append (m, peer) >= 0);
|
||||
}
|
||||
|
||||
assert (json_object_set (res, "members", m) >= 0);
|
||||
}
|
||||
}
|
||||
|
||||
void json_pack_channel (json_t *res, tgl_peer_t *P) {
|
||||
assert (P->channel.title);
|
||||
assert (json_object_set (res, "title", json_string (P->channel.title)) >= 0);
|
||||
assert (json_object_set (res, "participants_count", json_integer (P->channel.participants_count)) >= 0);
|
||||
assert (json_object_set (res, "admins_count", json_integer (P->channel.admins_count)) >= 0);
|
||||
assert (json_object_set (res, "kicked_count", json_integer (P->channel.kicked_count)) >= 0);
|
||||
}
|
||||
|
||||
|
||||
void json_pack_encr_chat (json_t *res, tgl_peer_t *P) {
|
||||
assert (json_object_set (res, "user", json_pack_peer (TGL_MK_USER (P->encr_chat.user_id))) >= 0);
|
||||
}
|
||||
|
||||
json_t *json_pack_peer (tgl_peer_id_t id) {
|
||||
tgl_peer_t *P = tgl_peer_get (TLS, id);
|
||||
//assert (P);
|
||||
json_t *res = json_object ();
|
||||
assert (json_object_set (res, "id", json_string (print_permanent_peer_id (id))) >= 0);
|
||||
|
||||
json_pack_peer_type (res, id);
|
||||
assert (json_object_set (res, "peer_id", json_integer (tgl_get_peer_id (id))) >= 0);
|
||||
|
||||
assert (res);
|
||||
|
||||
if (!P || !(P->flags & TGLPF_CREATED)) {
|
||||
static char s[100];
|
||||
switch (tgl_get_peer_type (id)) {
|
||||
case TGL_PEER_USER:
|
||||
sprintf (s, "user#%d", tgl_get_peer_id (id));
|
||||
break;
|
||||
case TGL_PEER_CHAT:
|
||||
sprintf (s, "chat#%d", tgl_get_peer_id (id));
|
||||
break;
|
||||
case TGL_PEER_CHANNEL:
|
||||
sprintf (s, "channel#%d", tgl_get_peer_id (id));
|
||||
break;
|
||||
case TGL_PEER_ENCR_CHAT:
|
||||
sprintf (s, "encr_chat#%d", tgl_get_peer_id (id));
|
||||
break;
|
||||
default:
|
||||
assert (0);
|
||||
}
|
||||
|
||||
assert (json_object_set (res, "print_name", json_string (s)) >= 0);
|
||||
return res;
|
||||
}
|
||||
if(P->print_name != NULL){
|
||||
assert (json_object_set (res, "print_name", json_string (P->print_name)) >= 0);
|
||||
} else {
|
||||
assert (json_object_set (res, "print_name", json_string ("")) >= 0);
|
||||
}
|
||||
assert (json_object_set (res, "flags", json_integer (P->flags)) >= 0);
|
||||
|
||||
switch (tgl_get_peer_type (id)) {
|
||||
case TGL_PEER_USER:
|
||||
json_pack_user (res, P);
|
||||
break;
|
||||
case TGL_PEER_CHAT:
|
||||
json_pack_chat (res, P);
|
||||
break;
|
||||
case TGL_PEER_ENCR_CHAT:
|
||||
json_pack_encr_chat (res, P);
|
||||
break;
|
||||
case TGL_PEER_CHANNEL:
|
||||
json_pack_channel (res, P);
|
||||
break;
|
||||
default:
|
||||
assert (0);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
json_t *json_pack_updates (unsigned flags) {
|
||||
json_t *a = json_array ();
|
||||
|
||||
if (flags & TGL_UPDATE_CREATED) {
|
||||
assert (json_array_append (a, json_string ("created")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_DELETED) {
|
||||
assert (json_array_append (a, json_string ("deleted")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_PHONE) {
|
||||
assert (json_array_append (a, json_string ("phone")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_CONTACT) {
|
||||
assert (json_array_append (a, json_string ("contact")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_PHOTO) {
|
||||
assert (json_array_append (a, json_string ("photo")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_BLOCKED) {
|
||||
assert (json_array_append (a, json_string ("blocked")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_REAL_NAME) {
|
||||
assert (json_array_append (a, json_string ("real_name")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_NAME) {
|
||||
assert (json_array_append (a, json_string ("name")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_REQUESTED) {
|
||||
assert (json_array_append (a, json_string ("requested")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_WORKING) {
|
||||
assert (json_array_append (a, json_string ("working")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_FLAGS) {
|
||||
assert (json_array_append (a, json_string ("flags")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_TITLE) {
|
||||
assert (json_array_append (a, json_string ("title")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_ADMIN) {
|
||||
assert (json_array_append (a, json_string ("admin")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_MEMBERS) {
|
||||
assert (json_array_append (a, json_string ("members")) >= 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_USERNAME) {
|
||||
assert (json_array_append (a, json_string ("username")) >= 0);
|
||||
}
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
|
||||
json_t *json_pack_media (struct tgl_message_media *M) {
|
||||
json_t *res = json_object ();
|
||||
|
||||
switch (M->type) {
|
||||
case tgl_message_media_photo:
|
||||
assert (json_object_set (res, "type", json_string ("photo")) >= 0);
|
||||
if (M->caption) {
|
||||
assert (json_object_set (res, "caption", json_string (M->caption)) >= 0);
|
||||
}
|
||||
break;
|
||||
case tgl_message_media_document:
|
||||
case tgl_message_media_audio:
|
||||
case tgl_message_media_video:
|
||||
case tgl_message_media_document_encr:
|
||||
assert (json_object_set (res, "type", json_string ("document")) >= 0);
|
||||
break;
|
||||
case tgl_message_media_unsupported:
|
||||
assert (json_object_set (res, "type", json_string ("unsupported")) >= 0);
|
||||
break;
|
||||
case tgl_message_media_geo:
|
||||
assert (json_object_set (res, "type", json_string ("geo")) >= 0);
|
||||
assert (json_object_set (res, "longitude", json_real (M->geo.longitude)) >= 0);
|
||||
assert (json_object_set (res, "latitude", json_real (M->geo.latitude)) >= 0);
|
||||
break;
|
||||
case tgl_message_media_contact:
|
||||
assert (json_object_set (res, "type", json_string ("contact")) >= 0);
|
||||
assert (json_object_set (res, "phone", json_string (M->phone)) >= 0);
|
||||
assert (json_object_set (res, "first_name", json_string (M->first_name)) >= 0);
|
||||
assert (json_object_set (res, "last_name", json_string (M->last_name)) >= 0);
|
||||
assert (json_object_set (res, "user_id", json_integer (M->user_id)) >= 0);
|
||||
break;
|
||||
case tgl_message_media_webpage:
|
||||
assert (json_object_set (res, "type", json_string ("webpage")) >= 0);
|
||||
if (M->webpage->url) {
|
||||
assert (json_object_set (res, "url", json_string (M->webpage->url)) >= 0);
|
||||
}
|
||||
if (M->webpage->title) {
|
||||
assert (json_object_set (res, "title", json_string (M->webpage->title)) >= 0);
|
||||
}
|
||||
if (M->webpage->description) {
|
||||
assert (json_object_set (res, "description", json_string (M->webpage->description)) >= 0);
|
||||
}
|
||||
if (M->webpage->author) {
|
||||
assert (json_object_set (res, "author", json_string (M->webpage->author)) >= 0);
|
||||
}
|
||||
break;
|
||||
case tgl_message_media_venue:
|
||||
assert (json_object_set (res, "type", json_string ("venue")) >= 0);
|
||||
assert (json_object_set (res, "longitude", json_real (M->venue.geo.longitude)) >= 0);
|
||||
assert (json_object_set (res, "latitude", json_real (M->venue.geo.latitude)) >= 0);
|
||||
if (M->venue.title) {
|
||||
assert (json_object_set (res, "type", json_string (M->venue.title)) >= 0);
|
||||
}
|
||||
if (M->venue.address) {
|
||||
assert (json_object_set (res, "address", json_string (M->venue.address)) >= 0);
|
||||
}
|
||||
if (M->venue.provider) {
|
||||
assert (json_object_set (res, "provider", json_string (M->venue.provider)) >= 0);
|
||||
}
|
||||
if (M->venue.venue_id) {
|
||||
assert (json_object_set (res, "venue_id", json_string (M->venue.venue_id)) >= 0);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert (json_object_set (res, "type", json_string ("???")) >= 0);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
json_t *json_pack_typing (enum tgl_typing_status status) {
|
||||
json_t *res = json_object ();
|
||||
switch (status) {
|
||||
case tgl_typing_none:
|
||||
assert (json_object_set (res, "status", json_string ("doing nothing")) >= 0);
|
||||
break;
|
||||
case tgl_typing_typing:
|
||||
assert (json_object_set (res, "status", json_string ("typing")) >= 0);
|
||||
break;
|
||||
case tgl_typing_cancel:
|
||||
assert (json_object_set (res, "status", json_string ("deleting typed message")) >= 0);
|
||||
break;
|
||||
case tgl_typing_record_video:
|
||||
assert (json_object_set (res, "status", json_string ("recording video")) >= 0);
|
||||
break;
|
||||
case tgl_typing_upload_video:
|
||||
assert (json_object_set (res, "status", json_string ("uploading video")) >= 0);
|
||||
break;
|
||||
case tgl_typing_record_audio:
|
||||
assert (json_object_set (res, "status", json_string ("recording audio")) >= 0);
|
||||
break;
|
||||
case tgl_typing_upload_audio:
|
||||
assert (json_object_set (res, "status", json_string ("uploading audio")) >= 0);
|
||||
break;
|
||||
case tgl_typing_upload_photo:
|
||||
assert (json_object_set (res, "status", json_string ("uploading photo")) >= 0);
|
||||
break;
|
||||
case tgl_typing_upload_document:
|
||||
assert (json_object_set (res, "status", json_string ("uploading document")) >= 0);
|
||||
break;
|
||||
case tgl_typing_geo:
|
||||
assert (json_object_set (res, "status", json_string ("choosing location")) >= 0);
|
||||
break;
|
||||
case tgl_typing_choose_contact:
|
||||
assert (json_object_set (res, "status", json_string ("choosing contact")) >= 0);
|
||||
break;
|
||||
default:
|
||||
assert (json_object_set (res, "status", json_string ("???")) >= 0);
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
json_t *json_pack_service (struct tgl_message *M) {
|
||||
json_t *res = json_object ();
|
||||
switch (M->action.type) {
|
||||
case tgl_message_action_geo_chat_create:
|
||||
assert (json_object_set (res, "type", json_string ("geo_created")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_geo_chat_checkin:
|
||||
assert (json_object_set (res, "type", json_string ("geo_checkin")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_chat_create:
|
||||
assert (json_object_set (res, "type", json_string ("chat_created")) >= 0);
|
||||
assert (json_object_set (res, "title", json_string (M->action.title)) >= 0);
|
||||
break;
|
||||
case tgl_message_action_chat_edit_title:
|
||||
assert (json_object_set (res, "type", json_string ("chat_rename")) >= 0);
|
||||
assert (json_object_set (res, "title", json_string (M->action.title)) >= 0);
|
||||
break;
|
||||
case tgl_message_action_chat_edit_photo:
|
||||
assert (json_object_set (res, "type", json_string ("chat_change_photo")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_chat_delete_photo:
|
||||
assert (json_object_set (res, "type", json_string ("chat_delete_photo")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_chat_add_users:
|
||||
assert (json_object_set (res, "type", json_string ("chat_add_user")) >= 0);
|
||||
assert (json_object_set (res, "user", json_pack_peer (tgl_set_peer_id (TGL_PEER_USER, M->action.users[0]))) >= 0);
|
||||
break;
|
||||
case tgl_message_action_chat_add_user_by_link:
|
||||
assert (json_object_set (res, "type", json_string ("chat_add_user_link")) >= 0);
|
||||
assert (json_object_set (res, "user", json_pack_peer (tgl_set_peer_id (TGL_PEER_USER, M->action.user))) >= 0);
|
||||
break;
|
||||
case tgl_message_action_chat_delete_user:
|
||||
assert (json_object_set (res, "type", json_string ("chat_del_user")) >= 0);
|
||||
assert (json_object_set (res, "user", json_pack_peer (tgl_set_peer_id (TGL_PEER_USER, M->action.user))) >= 0);
|
||||
break;
|
||||
case tgl_message_action_set_message_ttl:
|
||||
assert (json_object_set (res, "type", json_string ("set_ttl")) >= 0);
|
||||
assert (json_object_set (res, "ttl", json_integer (M->action.ttl)) >= 0);
|
||||
break;
|
||||
case tgl_message_action_read_messages:
|
||||
assert (json_object_set (res, "type", json_string ("read")) >= 0);
|
||||
assert (json_object_set (res, "count", json_integer (M->action.read_cnt)) >= 0);
|
||||
break;
|
||||
case tgl_message_action_delete_messages:
|
||||
assert (json_object_set (res, "type", json_string ("delete")) >= 0);
|
||||
assert (json_object_set (res, "count", json_integer (M->action.delete_cnt)) >= 0);
|
||||
break;
|
||||
case tgl_message_action_screenshot_messages:
|
||||
assert (json_object_set (res, "type", json_string ("screenshot")) >= 0);
|
||||
assert (json_object_set (res, "count", json_integer (M->action.screenshot_cnt)) >= 0);
|
||||
break;
|
||||
case tgl_message_action_flush_history:
|
||||
assert (json_object_set (res, "type", json_string ("flush")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_resend:
|
||||
assert (json_object_set (res, "type", json_string ("resend")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_notify_layer:
|
||||
assert (json_object_set (res, "type", json_string ("notify_layer")) >= 0);
|
||||
assert (json_object_set (res, "layer", json_integer (M->action.layer)) >= 0);
|
||||
break;
|
||||
case tgl_message_action_typing:
|
||||
assert (json_object_set (res, "type", json_string ("typing")) >= 0);
|
||||
assert (json_array_append (res, json_pack_typing (M->action.typing)) >= 0);
|
||||
break;
|
||||
case tgl_message_action_noop:
|
||||
assert (json_object_set (res, "type", json_string ("noop")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_request_key:
|
||||
assert (json_object_set (res, "type", json_string ("request_key")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_accept_key:
|
||||
assert (json_object_set (res, "type", json_string ("accept_key")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_commit_key:
|
||||
assert (json_object_set (res, "type", json_string ("commit_key")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_abort_key:
|
||||
assert (json_object_set (res, "type", json_string ("abort_key")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_channel_create:
|
||||
assert (json_object_set (res, "type", json_string ("channel_created")) >= 0);
|
||||
assert (json_object_set (res, "title", json_string (M->action.title)) >= 0);
|
||||
break;
|
||||
case tgl_message_action_migrated_to:
|
||||
assert (json_object_set (res, "type", json_string ("migrated_to")) >= 0);
|
||||
break;
|
||||
case tgl_message_action_migrated_from:
|
||||
assert (json_object_set (res, "type", json_string ("migrated_from")) >= 0);
|
||||
break;
|
||||
default:
|
||||
assert (json_object_set (res, "type", json_string ("???")) >= 0);
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
json_t *json_pack_message (struct tgl_message *M) {
|
||||
json_t *res = json_object ();
|
||||
assert (json_object_set (res, "event", json_string ("message")) >= 0);
|
||||
//will overwriten to service, if service.
|
||||
|
||||
assert (json_object_set (res, "id", json_string (print_permanent_msg_id (M->permanent_id))) >= 0);
|
||||
if (!(M->flags & TGLMF_CREATED)) { return res; }
|
||||
|
||||
assert (json_object_set (res, "flags", json_integer (M->flags)) >= 0);
|
||||
|
||||
if (tgl_get_peer_type (M->fwd_from_id)) {
|
||||
assert (json_object_set (res, "fwd_from", json_pack_peer (M->fwd_from_id)) >= 0);
|
||||
assert (json_object_set (res, "fwd_date", json_integer (M->fwd_date)) >= 0);
|
||||
}
|
||||
|
||||
if (M->reply_id) {
|
||||
tgl_message_id_t msg_id = M->permanent_id;
|
||||
msg_id.id = M->reply_id;
|
||||
|
||||
assert (json_object_set (res, "reply_id", json_string (print_permanent_msg_id (msg_id))) >= 0);
|
||||
}
|
||||
|
||||
if (M->flags & TGLMF_MENTION) {
|
||||
assert (json_object_set (res, "mention", json_true ()) >= 0);
|
||||
}
|
||||
|
||||
assert (json_object_set (res, "from", json_pack_peer (M->from_id)) >= 0);
|
||||
assert (json_object_set (res, "to", json_pack_peer (M->to_id)) >= 0);
|
||||
|
||||
assert (json_object_set (res, "out", json_boolean (M->flags & TGLMF_OUT)) >= 0);
|
||||
assert (json_object_set (res, "unread", json_boolean (M->flags & TGLMF_UNREAD)) >= 0);
|
||||
assert (json_object_set (res, "service", json_boolean (M->flags & TGLMF_SERVICE)) >= 0);
|
||||
assert (json_object_set (res, "date", json_integer (M->date)) >= 0);
|
||||
|
||||
if (!(M->flags & TGLMF_SERVICE)) {
|
||||
if (M->message_len && M->message) {
|
||||
assert (json_object_set (res, "text", json_string (M->message)) >= 0);
|
||||
}
|
||||
if (M->media.type && M->media.type != tgl_message_media_none) {
|
||||
assert (json_object_set (res, "media", json_pack_media (&M->media)) >= 0);
|
||||
}
|
||||
} else {
|
||||
assert (json_object_set (res, "event", json_string ("service")) >= 0);
|
||||
assert (json_object_set (res, "action", json_pack_service (M)) >= 0);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
json_t *json_pack_read (struct tgl_message *M) {
|
||||
json_t *res = json_pack_message (M);
|
||||
assert (json_object_set (res, "event", json_string ("read")) >= 0);
|
||||
//this will overwrite "event":"message" to "event":"read".
|
||||
return res;
|
||||
}
|
||||
|
||||
json_t *json_pack_user_status (struct tgl_user *U) {
|
||||
json_t *res = json_object ();
|
||||
assert (json_object_set (res, "user", json_pack_peer (U->id)) >= 0);
|
||||
struct tgl_user_status *S = &U->status;
|
||||
assert (json_object_set (res, "online", json_boolean (S->online == 1)) >= 0);
|
||||
assert (json_object_set (res, "state", json_integer (S->online)) >= 0);
|
||||
if (S->online > 0 || S->online == -1) {
|
||||
static char s[20];
|
||||
str_format_time(S->when, s);
|
||||
assert (json_object_set (res, "when", json_string (s)) >= 0);
|
||||
} else if (S->online == 0) {
|
||||
assert (json_object_set(res, "when", json_string("long time ago")) >= 0);
|
||||
} else if (S->online == -2) {
|
||||
assert (json_object_set(res, "when", json_string("recently")) >= 0);
|
||||
} else if (S->online == -3) {
|
||||
assert (json_object_set(res, "when", json_string("last week")) >= 0);
|
||||
} else if (S->online == -4) {
|
||||
assert (json_object_set (res, "when", json_string ("last month")) >= 0);
|
||||
}
|
||||
assert (json_object_set (res, "event", json_string ("online-status")) >= 0);
|
||||
//this will overwrite "event":"message" to "event":"read".
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
#ifndef __JSON_TG_H__
|
||||
#define __JSON_TG_H__
|
||||
#include "config.h"
|
||||
#ifdef USE_JSON
|
||||
#include <jansson.h>
|
||||
#include <tgl/tgl.h>
|
||||
#include <tgl/tgl-layout.h>
|
||||
json_t *json_pack_message (struct tgl_message *M);
|
||||
json_t *json_pack_updates (unsigned flags);
|
||||
json_t *json_pack_peer (tgl_peer_id_t id);
|
||||
json_t *json_pack_read (struct tgl_message *M);
|
||||
json_t *json_pack_user_status (struct tgl_user *U);
|
||||
#endif
|
||||
#endif
|
||||
+397
-377
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+4
-2
@@ -14,13 +14,15 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this telegram-cli. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
Copyright Vitaly Valtman 2013-2015
|
||||
*/
|
||||
#ifndef __LOOP_H__
|
||||
#define __LOOP_H__
|
||||
#define TELEGRAM_CLI_APP_HASH "36722c72256a24c1225de00eb6a1ca74"
|
||||
#define TELEGRAM_CLI_APP_ID 2899
|
||||
|
||||
int loop (void);
|
||||
void do_halt (int error);
|
||||
void net_loop (int flags, int (*end)(void));
|
||||
void write_auth_file (void);
|
||||
void write_state_file (void);
|
||||
void write_secret_chat_file (void);
|
||||
|
||||
+771
-279
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+3
-4
@@ -14,18 +14,17 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this telegram-cli. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
Copyright Vitaly Valtman 2013-2015
|
||||
*/
|
||||
#ifndef __LUA_TG_H__
|
||||
#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);
|
||||
void lua_our_id (int id);
|
||||
void lua_our_id (tgl_peer_id_t id);
|
||||
void lua_secret_chat_update (struct tgl_secret_chat *U, unsigned flags);
|
||||
void lua_user_update (struct tgl_user *U, unsigned flags);
|
||||
void lua_chat_update (struct tgl_chat *C, unsigned flags);
|
||||
|
||||
+285
-87
@@ -14,13 +14,17 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this telegram-cli. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
Copyright Vitaly Valtman 2013-2015
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#ifdef USE_PYTHON
|
||||
# include "python-tg.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
@@ -29,19 +33,11 @@
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#if (READLINE == GNU)
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#include <readline/readline.h>
|
||||
#else
|
||||
#include <editline/readline.h>
|
||||
#endif
|
||||
#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 <sys/stat.h>
|
||||
#include <sys/socket.h>
|
||||
@@ -59,17 +55,21 @@
|
||||
|
||||
#include <grp.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "telegram.h"
|
||||
#include "loop.h"
|
||||
#include "interface.h"
|
||||
#include "tools.h"
|
||||
#include <tgl/tools.h>
|
||||
#include <getopt.h>
|
||||
#include <tgl/mtproto-key.h>
|
||||
|
||||
#ifdef USE_LUA
|
||||
# include "lua-tg.h"
|
||||
#endif
|
||||
|
||||
#include "tgl.h"
|
||||
|
||||
#include <tgl/tgl.h>
|
||||
|
||||
#define PROGNAME "telegram-cli"
|
||||
#define VERSION "0.07"
|
||||
@@ -89,6 +89,7 @@
|
||||
"# This is an empty config file\n" \
|
||||
"# Feel free to put something here\n"
|
||||
|
||||
int bot_mode;
|
||||
int verbosity;
|
||||
int msg_num_mode;
|
||||
char *default_username;
|
||||
@@ -101,6 +102,7 @@ char *downloads_directory;
|
||||
char *config_directory;
|
||||
char *binlog_file_name;
|
||||
char *lua_file;
|
||||
char *python_file;
|
||||
int binlog_enabled;
|
||||
extern int log_level;
|
||||
int sync_from_start;
|
||||
@@ -110,6 +112,18 @@ int readline_disabled;
|
||||
int disable_output;
|
||||
int reset_authorization;
|
||||
int port;
|
||||
int use_ids;
|
||||
int ipv6_enabled;
|
||||
char *start_command;
|
||||
int disable_link_preview;
|
||||
int enable_json;
|
||||
int alert_sound;
|
||||
int exit_code;
|
||||
int permanent_msg_id_mode;
|
||||
int permanent_peer_id_mode;
|
||||
char *home_directory;
|
||||
|
||||
struct tgl_state *TLS;
|
||||
|
||||
void set_default_username (const char *s) {
|
||||
if (default_username) {
|
||||
@@ -149,11 +163,16 @@ void set_terminal_attributes (void) {
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
int str_empty (char *str) {
|
||||
return ((str == NULL) || (strlen(str) < 1));
|
||||
}
|
||||
|
||||
char *get_home_directory (void) {
|
||||
static char *home_directory = NULL;
|
||||
if (home_directory != NULL) {
|
||||
return home_directory;
|
||||
}
|
||||
if (home_directory) { return home_directory; }
|
||||
home_directory = getenv("TELEGRAM_HOME");
|
||||
if (!str_empty (home_directory)) { return home_directory = tstrdup (home_directory); }
|
||||
home_directory = getenv("HOME");
|
||||
if (!str_empty (home_directory)) { return home_directory = tstrdup (home_directory); }
|
||||
struct passwd *current_passwd;
|
||||
uid_t user_id;
|
||||
setpwent ();
|
||||
@@ -165,14 +184,23 @@ char *get_home_directory (void) {
|
||||
}
|
||||
}
|
||||
endpwent ();
|
||||
if (home_directory == NULL) {
|
||||
home_directory = tstrdup (".");
|
||||
}
|
||||
if (str_empty (home_directory)) { home_directory = tstrdup ("."); }
|
||||
return home_directory;
|
||||
}
|
||||
|
||||
char *get_config_directory (void) {
|
||||
char *config_directory;
|
||||
config_directory = getenv("TELEGRAM_CONFIG_DIR");
|
||||
if (!str_empty (config_directory)) { return tstrdup (config_directory); }
|
||||
// XDG: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
config_directory = getenv("XDG_CONFIG_HOME");
|
||||
if (!str_empty (config_directory)) {
|
||||
tasprintf (&config_directory, "%s/" PROG_NAME, config_directory);
|
||||
// :TODO: someone check whether it could be required to pass tasprintf
|
||||
// a tstrdup()ed config_directory instead; works for me without.
|
||||
// should work b/c this scope's lifespan encompasses tasprintf()
|
||||
return config_directory;
|
||||
}
|
||||
tasprintf (&config_directory, "%s/" CONFIG_DIRECTORY, get_home_directory ());
|
||||
return config_directory;
|
||||
}
|
||||
@@ -223,14 +251,21 @@ void check_type_sizes (void) {
|
||||
|
||||
void running_for_first_time (void) {
|
||||
check_type_sizes ();
|
||||
if (config_filename) {
|
||||
if (!str_empty (config_filename)) {
|
||||
return; // Do not create custom config file
|
||||
}
|
||||
tasprintf (&config_filename, "%s/%s/%s", get_home_directory (), CONFIG_DIRECTORY, CONFIG_FILE);
|
||||
if (str_empty (config_directory)) {
|
||||
config_directory = get_config_directory ();
|
||||
}
|
||||
tasprintf (&config_filename, "%s/%s", config_directory, CONFIG_FILE);
|
||||
config_filename = make_full_path (config_filename);
|
||||
if (!disable_output) {
|
||||
printf ("I: config dir=[%s]\n", config_directory);
|
||||
}
|
||||
// printf ("I: config file=[%s]\n", config_filename);
|
||||
|
||||
int config_file_fd;
|
||||
char *config_directory = get_config_directory ();
|
||||
//char *config_directory = get_config_directory ();
|
||||
//char *downloads_directory = get_downloads_directory ();
|
||||
|
||||
if (!mkdir (config_directory, CONFIG_DIRECTORY_MODE)) {
|
||||
@@ -247,6 +282,7 @@ void running_for_first_time (void) {
|
||||
config_file_fd = open (config_filename, O_CREAT | O_RDWR, 0600);
|
||||
if (config_file_fd == -1) {
|
||||
perror ("open[config_file]");
|
||||
printf ("I: config_file=[%s]\n", config_filename);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
if (write (config_file_fd, DEFAULT_CONFIG_CONTENTS, strlen (DEFAULT_CONFIG_CONTENTS)) <= 0) {
|
||||
@@ -254,18 +290,6 @@ void running_for_first_time (void) {
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
close (config_file_fd);
|
||||
/*int auth_file_fd = open (get_auth_key_filename (), O_CREAT | O_RDWR, 0600);
|
||||
int x = -1;
|
||||
assert (write (auth_file_fd, &x, 4) == 4);
|
||||
close (auth_file_fd);
|
||||
|
||||
printf ("[%s] created\n", config_filename);*/
|
||||
|
||||
/* create downloads directory */
|
||||
/*if (mkdir (downloads_directory, 0755) !=0) {
|
||||
perror ("creating download directory");
|
||||
exit (EXIT_FAILURE);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,7 +307,7 @@ void parse_config_val (config_t *conf, char **s, char *param_name, const char *d
|
||||
strcpy (buf + l, param_name);
|
||||
config_lookup_string (conf, buf, &r);
|
||||
if (r) {
|
||||
if (path) {
|
||||
if (path && *r != '/') {
|
||||
tasprintf (s, "%s/%s", path, r);
|
||||
} else {
|
||||
*s = tstrdup (r);
|
||||
@@ -323,7 +347,7 @@ void parse_config (void) {
|
||||
strcpy (buf + l, "test");
|
||||
config_lookup_bool (&conf, buf, &test_mode);
|
||||
if (test_mode) {
|
||||
tgl_set_test_mode ();
|
||||
tgl_set_test_mode (TLS);
|
||||
}
|
||||
|
||||
strcpy (buf + l, "log_level");
|
||||
@@ -346,27 +370,35 @@ void parse_config (void) {
|
||||
parse_config_val (&conf, &lua_file, "lua_script", 0, config_directory);
|
||||
}
|
||||
|
||||
if (!python_file) {
|
||||
parse_config_val (&conf, &python_file, "python_script", 0, config_directory);
|
||||
}
|
||||
|
||||
#if 0
|
||||
strcpy (buf + l, "binlog_enabled");
|
||||
config_lookup_bool (&conf, buf, &binlog_enabled);
|
||||
#else
|
||||
binlog_enabled = 0;
|
||||
#endif
|
||||
|
||||
int pfs_enabled = 0;
|
||||
strcpy (buf + l, "pfs_enabled");
|
||||
config_lookup_bool (&conf, buf, &pfs_enabled);
|
||||
if (pfs_enabled) {
|
||||
tgl_enable_pfs ();
|
||||
tgl_enable_pfs (TLS);
|
||||
}
|
||||
|
||||
if (binlog_enabled) {
|
||||
parse_config_val (&conf, &binlog_file_name, "binlog", BINLOG_FILE, config_directory);
|
||||
tgl_set_binlog_mode (1);
|
||||
tgl_set_binlog_path (binlog_file_name);
|
||||
tgl_set_binlog_mode (TLS, 1);
|
||||
tgl_set_binlog_path (TLS, binlog_file_name);
|
||||
} else {
|
||||
tgl_set_binlog_mode (0);
|
||||
tgl_set_binlog_mode (TLS, 0);
|
||||
parse_config_val (&conf, &state_file_name, "state_file", STATE_FILE, config_directory);
|
||||
parse_config_val (&conf, &secret_chat_file_name, "secret", SECRET_CHAT_FILE, config_directory);
|
||||
//tgl_set_auth_file_path (auth_file_name);
|
||||
}
|
||||
tgl_set_download_directory (downloads_directory);
|
||||
tgl_set_download_directory (TLS, downloads_directory);
|
||||
|
||||
if (!mkdir (config_directory, CONFIG_DIRECTORY_MODE)) {
|
||||
if (!disable_output) {
|
||||
@@ -378,6 +410,8 @@ void parse_config (void) {
|
||||
printf ("[%s] created\n", downloads_directory);
|
||||
}
|
||||
}
|
||||
tfree_str (config_directory);
|
||||
config_directory = NULL;
|
||||
config_destroy (&conf);
|
||||
}
|
||||
#else
|
||||
@@ -386,19 +420,24 @@ void parse_config (void) {
|
||||
printf ("libconfig not enabled\n");
|
||||
}
|
||||
tasprintf (&downloads_directory, "%s/%s/%s", get_home_directory (), CONFIG_DIRECTORY, DOWNLOADS_DIRECTORY);
|
||||
|
||||
|
||||
if (binlog_enabled) {
|
||||
tasprintf (&binlog_file_name, "%s/%s/%s", get_home_directory (), CONFIG_DIRECTORY, BINLOG_FILE);
|
||||
tgl_set_binlog_mode (1);
|
||||
tgl_set_binlog_path (binlog_file_name);
|
||||
tgl_set_binlog_mode (TLS, 1);
|
||||
tgl_set_binlog_path (TLS, binlog_file_name);
|
||||
} else {
|
||||
tgl_set_binlog_mode (0);
|
||||
tgl_set_binlog_mode (TLS, 0);
|
||||
//tgl_set_auth_file_path (auth_file_name;
|
||||
tasprintf (&auth_file_name, "%s/%s/%s", get_home_directory (), CONFIG_DIRECTORY, AUTH_KEY_FILE);
|
||||
tasprintf (&state_file_name, "%s/%s/%s", get_home_directory (), CONFIG_DIRECTORY, STATE_FILE);
|
||||
tasprintf (&secret_chat_file_name, "%s/%s/%s", get_home_directory (), CONFIG_DIRECTORY, SECRET_CHAT_FILE);
|
||||
}
|
||||
tgl_set_download_directory (downloads_directory);
|
||||
tgl_set_download_directory (TLS, downloads_directory);
|
||||
if (!mkdir (downloads_directory, CONFIG_DIRECTORY_MODE)) {
|
||||
if (!disable_output) {
|
||||
printf ("[%s] created\n", downloads_directory);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -409,32 +448,50 @@ void inner_main (void) {
|
||||
void usage (void) {
|
||||
printf ("%s Usage\n", PROGNAME);
|
||||
|
||||
printf (" -u specify username (would not be asked during authorization)\n");
|
||||
printf (" -k specify location of public key (possible multiple entries)\n");
|
||||
printf (" -v increase verbosity (0-ERROR 1-WARNIN 2-NOTICE 3+-DEBUG-levels)\n");
|
||||
printf (" -N message num mode\n");
|
||||
printf (" --phone/-u specify username (would not be asked during authorization)\n");
|
||||
printf (" --rsa-key/-k specify location of public key (possible multiple entries)\n");
|
||||
printf (" --verbosity/-v increase verbosity (0-ERROR 1-WARNIN 2-NOTICE 3+-DEBUG-levels)\n");
|
||||
printf (" --enable-msg-id/-N message num mode\n");
|
||||
#ifdef HAVE_LIBCONFIG
|
||||
printf (" -c config file name\n");
|
||||
printf (" -p use specified profile\n");
|
||||
printf (" --config/-c config file name\n");
|
||||
printf (" --profile/-p use specified profile\n");
|
||||
#else
|
||||
printf (" -B enable binlog\n");
|
||||
#if 0
|
||||
printf (" --enable-binlog/-B enable binlog\n");
|
||||
#endif
|
||||
printf (" -l log level\n");
|
||||
printf (" -f during authorization fetch all messages since registration\n");
|
||||
printf (" -E diable auto accept of encrypted chats\n");
|
||||
#endif
|
||||
printf (" --log-level/-l log level\n");
|
||||
printf (" --sync-from-start/-f during authorization fetch all messages since registration\n");
|
||||
printf (" --disable-auto-accept/-E disable auto accept of encrypted chats\n");
|
||||
#ifdef USE_LUA
|
||||
printf (" -s lua script file\n");
|
||||
printf (" --lua-script/-s lua script file\n");
|
||||
#endif
|
||||
printf (" -W send dialog_list query and wait for answer before reading input\n");
|
||||
printf (" -C disable color output\n");
|
||||
printf (" -R disable readline\n");
|
||||
printf (" -d daemon mode\n");
|
||||
printf (" -L <log-name> log file name\n");
|
||||
printf (" -U <user-name> change uid after start\n");
|
||||
printf (" -G <group-name> change gid after start\n");
|
||||
printf (" -D disable output\n");
|
||||
printf (" -P <port> port to listen for input commands\n");
|
||||
printf (" -S <socket-name> unix socket to create\n");
|
||||
printf (" --wait-dialog-list/-W send dialog_list query and wait for answer before reading input\n");
|
||||
printf (" --disable-colors/-C disable color output\n");
|
||||
printf (" --disable-readline/-R disable readline\n");
|
||||
printf (" --alert/-A enable bell notifications\n");
|
||||
printf (" --daemonize/-d daemon mode\n");
|
||||
printf (" --logname/-L <log-name> log file name\n");
|
||||
printf (" --username/-U <user-name> change uid after start\n");
|
||||
printf (" --groupname/-G <group-name> change gid after start\n");
|
||||
printf (" --disable-output/-D disable output\n");
|
||||
printf (" --tcp-port/-P <port> port to listen for input commands\n");
|
||||
printf (" --udp-socket/-S <socket-name> unix socket to create\n");
|
||||
printf (" --exec/-e <commands> make commands end exit\n");
|
||||
printf (" --disable-names/-I use user and chat IDs in updates instead of names\n");
|
||||
printf (" --enable-ipv6/-6 use ipv6 (may be unstable)\n");
|
||||
printf (" --help/-h prints this help\n");
|
||||
printf (" --accept-any-tcp accepts tcp connections from any src (only loopback by default)\n");
|
||||
printf (" --disable-link-preview disables server-side previews to links\n");
|
||||
printf (" --bot/-b bot mode\n");
|
||||
#ifdef USE_JSON
|
||||
printf (" --json prints answers and values in json format\n");
|
||||
#endif
|
||||
#ifdef USE_PYTHON
|
||||
printf (" --python-script/-Z <script-name> python script file\n");
|
||||
#endif
|
||||
printf (" --permanent-msg-ids use permanent msg ids\n");
|
||||
printf (" --permanent-peer-ids use permanent peer ids\n");
|
||||
|
||||
exit (1);
|
||||
}
|
||||
@@ -453,7 +510,7 @@ int disable_auto_accept;
|
||||
int wait_dialog_list;
|
||||
|
||||
char *logname;
|
||||
int daemonize;
|
||||
int daemonize=0;
|
||||
|
||||
|
||||
void reopen_logs (void) {
|
||||
@@ -491,6 +548,8 @@ static void sighup_handler (const int sig) {
|
||||
|
||||
char *set_user_name;
|
||||
char *set_group_name;
|
||||
int accept_any_tcp;
|
||||
char *bot_hash;
|
||||
|
||||
int change_user_group () {
|
||||
char *username = set_user_name;
|
||||
@@ -528,6 +587,11 @@ int change_user_group () {
|
||||
if (setuid (pw->pw_uid) < 0) {
|
||||
fprintf (stderr, "change_user_group: failed to assume identity of user %s\n", username);
|
||||
return -1;
|
||||
} else {
|
||||
pw = getpwuid(getuid());
|
||||
setenv("USER", pw->pw_name, 1);
|
||||
setenv("HOME", pw->pw_dir, 1);
|
||||
setenv("SHELL", pw->pw_shell, 1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -536,28 +600,97 @@ int change_user_group () {
|
||||
char *unix_socket;
|
||||
|
||||
void args_parse (int argc, char **argv) {
|
||||
TLS = tgl_state_alloc ();
|
||||
|
||||
static struct option long_options[] = {
|
||||
{"debug-allocator", no_argument, 0, 1000 },
|
||||
{"phone", required_argument, 0, 'u'},
|
||||
{"rsa-key", required_argument, 0, 'k'},
|
||||
{"verbosity", no_argument, 0, 'v'},
|
||||
{"enable-msg-id", no_argument, 0, 'N'},
|
||||
#ifdef HAVE_LIBCONFIG
|
||||
{"config", required_argument, 0, 'c'},
|
||||
{"profile", required_argument, 0, 'p'},
|
||||
#else
|
||||
#if 0
|
||||
{"enable-binlog", no_argument, 0, 'B'},
|
||||
#endif
|
||||
#endif
|
||||
{"log-level", required_argument, 0, 'l'},
|
||||
{"sync-from-start", no_argument, 0, 'f'},
|
||||
{"disable-auto-accept", no_argument, 0, 'E'},
|
||||
{"allow-weak-random", no_argument, 0, 'w'},
|
||||
#ifdef USE_LUA
|
||||
{"lua-script", required_argument, 0, 's'},
|
||||
#endif
|
||||
{"wait-dialog-list", no_argument, 0, 'W'},
|
||||
{"disable-colors", no_argument, 0, 'C'},
|
||||
{"disable-readline", no_argument, 0, 'R'},
|
||||
{"alert", no_argument, 0, 'A'},
|
||||
{"daemonize", no_argument, 0, 'd'},
|
||||
{"logname", required_argument, 0, 'L'},
|
||||
{"username", required_argument, 0, 'U'},
|
||||
{"groupname", required_argument, 0, 'G'},
|
||||
{"disable-output", no_argument, 0, 'D'},
|
||||
{"reset-authorization", no_argument, 0, 'q'},
|
||||
{"tcp-port", required_argument, 0, 'P'},
|
||||
{"unix-socket", required_argument, 0, 'S'},
|
||||
{"exec", required_argument, 0, 'e'},
|
||||
{"disable-names", no_argument, 0, 'I'},
|
||||
{"enable-ipv6", no_argument, 0, '6'},
|
||||
{"bot", optional_argument, 0, 'b'},
|
||||
{"help", no_argument, 0, 'h'},
|
||||
{"accept-any-tcp", no_argument, 0, 1001},
|
||||
{"disable-link-preview", no_argument, 0, 1002},
|
||||
{"json", no_argument, 0, 1003},
|
||||
{"python-script", required_argument, 0, 'Z'},
|
||||
{"permanent-msg-ids", no_argument, 0, 1004},
|
||||
{"permanent-peer-ids", no_argument, 0, 1005},
|
||||
{0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
|
||||
|
||||
int opt = 0;
|
||||
while ((opt = getopt (argc, argv, "u:hk:vNl:fEwWCRdL:DU:G:qP:S:"
|
||||
while ((opt = getopt_long (argc, argv, "u:hk:vNl:fEwWCRAdL:DU:G:qP:S:e:I6b"
|
||||
#ifdef HAVE_LIBCONFIG
|
||||
"c:p:"
|
||||
#else
|
||||
#if 0
|
||||
"B"
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_LUA
|
||||
"s:"
|
||||
#endif
|
||||
#ifdef USE_PYTHON
|
||||
"Z:"
|
||||
#endif
|
||||
, long_options, NULL
|
||||
|
||||
)) != -1) {
|
||||
switch (opt) {
|
||||
case 'b':
|
||||
bot_mode ++;
|
||||
if (optarg) {
|
||||
bot_hash = optarg;
|
||||
}
|
||||
break;
|
||||
case 1000:
|
||||
tgl_allocator = &tgl_allocator_debug;
|
||||
break;
|
||||
case 1001:
|
||||
accept_any_tcp = 1;
|
||||
break;
|
||||
case 'u':
|
||||
set_default_username (optarg);
|
||||
break;
|
||||
case 'k':
|
||||
//rsa_public_key_name = tstrdup (optarg);
|
||||
tgl_set_rsa_key (optarg);
|
||||
tgl_set_rsa_key (TLS, optarg);
|
||||
break;
|
||||
case 'v':
|
||||
tgl_incr_verbosity ();
|
||||
tgl_incr_verbosity (TLS);
|
||||
verbosity ++;
|
||||
break;
|
||||
case 'N':
|
||||
@@ -568,13 +701,15 @@ void args_parse (int argc, char **argv) {
|
||||
config_filename = tstrdup (optarg);
|
||||
break;
|
||||
case 'p':
|
||||
prefix = tstrdup (optarg);
|
||||
prefix = optarg;
|
||||
assert (strlen (prefix) <= 100);
|
||||
break;
|
||||
#else
|
||||
#if 0
|
||||
case 'B':
|
||||
binlog_enabled = 1;
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
case 'l':
|
||||
log_level = atoi (optarg);
|
||||
@@ -596,12 +731,20 @@ void args_parse (int argc, char **argv) {
|
||||
case 'W':
|
||||
wait_dialog_list = 1;
|
||||
break;
|
||||
#ifdef USE_PYTHON
|
||||
case 'Z':
|
||||
python_file = strdup (optarg);
|
||||
break;
|
||||
#endif
|
||||
case 'C':
|
||||
disable_colors ++;
|
||||
break;
|
||||
case 'R':
|
||||
readline_disabled ++;
|
||||
break;
|
||||
case 'A':
|
||||
alert_sound = 1;
|
||||
break;
|
||||
case 'd':
|
||||
daemonize ++;
|
||||
break;
|
||||
@@ -626,6 +769,27 @@ void args_parse (int argc, char **argv) {
|
||||
case 'S':
|
||||
unix_socket = optarg;
|
||||
break;
|
||||
case 'e':
|
||||
start_command = optarg;
|
||||
break;
|
||||
case 'I':
|
||||
use_ids ++;
|
||||
break;
|
||||
case '6':
|
||||
ipv6_enabled = 1;
|
||||
break;
|
||||
case 1002:
|
||||
disable_link_preview = 2;
|
||||
break;
|
||||
case 1003:
|
||||
enable_json = 1;
|
||||
break;
|
||||
case 1004:
|
||||
permanent_msg_id_mode = 1;
|
||||
break;
|
||||
case 1005:
|
||||
permanent_peer_id_mode = 1;
|
||||
break;
|
||||
case 'h':
|
||||
default:
|
||||
usage ();
|
||||
@@ -684,18 +848,23 @@ void sig_term_handler (int signum __attribute__ ((unused))) {
|
||||
if (write (1, "SIGTERM/SIGINT received\n", 25) < 0) {
|
||||
// Sad thing
|
||||
}
|
||||
if (tgl_state.ev_base) {
|
||||
event_base_loopbreak(tgl_state.ev_base);
|
||||
}
|
||||
//if (TLS && TLS->ev_base) {
|
||||
// event_base_loopbreak (TLS->ev_base);
|
||||
//}
|
||||
sigterm_cnt ++;
|
||||
}
|
||||
|
||||
void do_halt (int error) {
|
||||
int retval;
|
||||
if (daemonize) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!readline_disabled) {
|
||||
rl_free_line_state ();
|
||||
rl_cleanup_after_signal ();
|
||||
}
|
||||
|
||||
|
||||
if (write (1, "halt\n", 5) < 0) {
|
||||
// Sad thing
|
||||
}
|
||||
@@ -710,8 +879,14 @@ void do_halt (int error) {
|
||||
if (sfd > 0) {
|
||||
close (sfd);
|
||||
}
|
||||
|
||||
exit (error ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
|
||||
if (exit_code) {
|
||||
retval = exit_code;
|
||||
} else {
|
||||
retval = error ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
exit (retval);
|
||||
}
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
@@ -737,17 +912,21 @@ int main (int argc, char **argv) {
|
||||
|
||||
if (port > 0) {
|
||||
struct sockaddr_in serv_addr;
|
||||
|
||||
int yes = 1;
|
||||
sfd = socket (AF_INET, SOCK_STREAM, 0);
|
||||
if (sfd < 0) {
|
||||
perror ("socket");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0) {
|
||||
perror("setsockopt");
|
||||
exit(1);
|
||||
}
|
||||
memset (&serv_addr, 0, sizeof (serv_addr));
|
||||
|
||||
serv_addr.sin_family = AF_INET;
|
||||
serv_addr.sin_addr.s_addr = htonl (0x7f000001);
|
||||
serv_addr.sin_addr.s_addr = accept_any_tcp ? INADDR_ANY : htonl (0x7f000001);
|
||||
serv_addr.sin_port = htons (port);
|
||||
|
||||
if (bind (sfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) {
|
||||
@@ -774,7 +953,7 @@ int main (int argc, char **argv) {
|
||||
|
||||
serv_addr.sun_family = AF_UNIX;
|
||||
|
||||
snprintf (serv_addr.sun_path, 108, "%s", unix_socket);
|
||||
snprintf (serv_addr.sun_path, sizeof(serv_addr.sun_path), "%s", unix_socket);
|
||||
|
||||
if (bind (usfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) {
|
||||
perror ("bind");
|
||||
@@ -794,18 +973,31 @@ int main (int argc, char **argv) {
|
||||
|
||||
if (!disable_output) {
|
||||
printf (
|
||||
"Telegram-cli version " TGL_VERSION ", Copyright (C) 2013-2014 Vitaly Valtman\n"
|
||||
"Telegram-cli version " TELEGRAM_CLI_VERSION ", Copyright (C) 2013-2015 Vitaly Valtman\n"
|
||||
"Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.\n"
|
||||
"This is free software, and you are welcome to redistribute it\n"
|
||||
"under certain conditions; type `show_license' for details.\n"
|
||||
"Telegram-cli uses libtgl version " TGL_VERSION "\n"
|
||||
#ifndef TGL_AVOID_OPENSSL
|
||||
"Telegram-cli includes software developed by the OpenSSL Project\n"
|
||||
"for use in the OpenSSL Toolkit. (http://www.openssl.org/)\n"
|
||||
#endif
|
||||
#ifdef USE_PYTHON
|
||||
"Telegram-cli uses libpython version " PY_VERSION "\n"
|
||||
#endif
|
||||
);
|
||||
}
|
||||
running_for_first_time ();
|
||||
parse_config ();
|
||||
|
||||
tgl_set_rsa_key ("/etc/" PROG_NAME "/server.pub");
|
||||
tgl_set_rsa_key ("tg-server.pub");
|
||||
#ifdef __FreeBSD__
|
||||
tgl_set_rsa_key (TLS, "/usr/local/etc/" PROG_NAME "/server.pub");
|
||||
#else
|
||||
tgl_set_rsa_key (TLS, "/etc/" PROG_NAME "/server.pub");
|
||||
#endif
|
||||
tgl_set_rsa_key (TLS, "tg-server.pub");
|
||||
|
||||
tgl_set_rsa_key_direct (TLS, tglmp_get_default_e (), tglmp_get_default_key_len (), tglmp_get_default_key ());
|
||||
|
||||
get_terminal_attributes ();
|
||||
|
||||
@@ -814,6 +1006,12 @@ int main (int argc, char **argv) {
|
||||
lua_init (lua_file);
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_PYTHON
|
||||
if (python_file) {
|
||||
py_init (python_file);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
inner_main ();
|
||||
|
||||
|
||||
Link simbólico
+1
@@ -0,0 +1 @@
|
||||
tgl/mime.types
|
||||
-1449
Diferenças do arquivo suprimidas por serem muito extensas
Carregar 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 connection *c, int *msg, int msg_ints, int flags);
|
||||
void tglmp_dc_create_session (struct tgl_dc *DC);
|
||||
int tglmp_check_g (unsigned char p[256], BIGNUM *g);
|
||||
int tglmp_check_DH_params (BIGNUM *p, int g);
|
||||
struct tgl_dc *tglmp_alloc_dc (int id, char *ip, int port);
|
||||
void tglmp_regenerate_temp_auth_key (struct tgl_dc *D);
|
||||
|
||||
void tgln_insert_msg_id (struct tgl_session *S, long long id);
|
||||
void tglmp_on_start (void);
|
||||
void tgl_dc_authorize (struct tgl_dc *DC);
|
||||
void tgls_free_dc (struct tgl_dc *DC);
|
||||
void tgls_free_pubkey (void);
|
||||
#endif
|
||||
@@ -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 (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 (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 (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);
|
||||
}
|
||||
}
|
||||
tgl_state.BN_ctx = BN_CTX_new ();
|
||||
ensure_ptr (tgl_state.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 (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, tgl_state.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 (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, tgl_state.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;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,387 +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 (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);
|
||||
vlogprintf (E_DEBUG + 3, "fetch_string: len = %d\n", len);
|
||||
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);
|
||||
vlogprintf (E_DEBUG + 3, "fetch_int: 0x%08x (%d)\n", *in_ptr, *in_ptr);
|
||||
return *(in_ptr ++);
|
||||
}
|
||||
|
||||
static inline int fetch_bool (void) {
|
||||
vlogprintf (E_DEBUG + 3, "fetch_bool: 0x%08x (%d)\n", *in_ptr, *in_ptr);
|
||||
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 (char *from, int from_len, char *to, int size, BIGNUM *N, BIGNUM *E);
|
||||
int tgl_pad_rsa_decrypt (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
|
||||
-609
@@ -1,609 +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 <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/types.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;
|
||||
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);
|
||||
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) {
|
||||
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;
|
||||
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;
|
||||
if (c->state == conn_connecting) {
|
||||
c->state = conn_ready;
|
||||
c->methods->ready (c);
|
||||
}
|
||||
try_write (c);
|
||||
if (c->out_bytes) {
|
||||
event_add (c->write_ev, 0);
|
||||
}
|
||||
}
|
||||
|
||||
struct connection *tgln_create_connection (const char *host, int port, struct tgl_session *session, struct tgl_dc *dc, struct mtproto_methods *methods) {
|
||||
struct connection *c = talloc0 (sizeof (*c));
|
||||
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 (tgl_state.ev_base, ping_alarm, c);
|
||||
c->fail_ev = evtimer_new (tgl_state.ev_base, fail_alarm, c);
|
||||
c->write_ev = event_new (tgl_state.ev_base, c->fd, EV_WRITE, conn_try_write, c);
|
||||
|
||||
struct timeval tv = {5, 0};
|
||||
c->read_ev = event_new (tgl_state.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) {
|
||||
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);
|
||||
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 (tgl_state.ev_base, c->fd, EV_WRITE, conn_try_write, c);
|
||||
|
||||
struct timeval tv = {5, 0};
|
||||
c->read_ev = event_new (tgl_state.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) {
|
||||
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) {
|
||||
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);
|
||||
|
||||
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 (c, op, len);
|
||||
}
|
||||
}
|
||||
|
||||
static void try_read (struct connection *c) {
|
||||
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
|
||||
};
|
||||
-103
@@ -1,103 +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__
|
||||
|
||||
#include <poll.h>
|
||||
|
||||
#define DC_SERIALIZED_MAGIC 0x64582faa
|
||||
#define DC_SERIALIZED_MAGIC_V2 0x94032abb
|
||||
#define STATE_FILE_MAGIC 0x84217a0d
|
||||
#define SECRET_CHAT_FILE_MAGIC 0xa9840add
|
||||
|
||||
struct tgl_dc_serialized {
|
||||
int magic;
|
||||
int port;
|
||||
char ip[64];
|
||||
char user[64];
|
||||
char auth_key[256];
|
||||
long long auth_key_id, server_salt;
|
||||
int authorized;
|
||||
};
|
||||
|
||||
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_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 (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
@@ -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};
|
||||
+1378
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
This file is part of telegram-cli.
|
||||
|
||||
Telegram-cli 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-cli 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-cli. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2013-2015
|
||||
Copyright Vincent Castellano 2015
|
||||
*/
|
||||
#ifndef __PYTHON_TG_H__
|
||||
#define __PYTHON_TG_H__
|
||||
|
||||
#include <Python.h>
|
||||
#include <string.h>
|
||||
#include <tgl/tgl.h>
|
||||
|
||||
// Python functions
|
||||
void py_init (const char *file);
|
||||
void py_new_msg (struct tgl_message *M);
|
||||
void py_our_id (int id);
|
||||
void py_secret_chat_update (struct tgl_secret_chat *U, unsigned flags);
|
||||
void py_user_update (struct tgl_user *U, unsigned flags);
|
||||
void py_chat_update (struct tgl_chat *C, unsigned flags);
|
||||
void py_binlog_end (void);
|
||||
void py_diff_end (void);
|
||||
void py_do_all (void);
|
||||
|
||||
// Binding functions
|
||||
PyObject* py_contact_list(PyObject *self, PyObject *args);
|
||||
PyObject* py_dialog_list(PyObject *self, PyObject *args);
|
||||
PyObject* py_rename_chat(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_msg(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_typing(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_typing_abort(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_photo(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_video(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_audio(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_document(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_file(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_text(PyObject *self, PyObject *args);
|
||||
PyObject* py_chat_set_photo(PyObject *self, PyObject *args);
|
||||
PyObject* py_load_photo(PyObject *self, PyObject *args);
|
||||
PyObject* py_load_video(PyObject *self, PyObject *args);
|
||||
PyObject* py_load_video_thumb(PyObject *self, PyObject *args);
|
||||
PyObject* py_load_audio(PyObject *self, PyObject *args);
|
||||
PyObject* py_load_document(PyObject *self, PyObject *args);
|
||||
PyObject* py_load_document_thumb(PyObject *self, PyObject *args);
|
||||
PyObject* py_fwd(PyObject *self, PyObject *args);
|
||||
PyObject* py_fwd_media(PyObject *self, PyObject *args);
|
||||
PyObject* py_chat_info(PyObject *self, PyObject *args);
|
||||
PyObject* py_user_info(PyObject *self, PyObject *args);
|
||||
PyObject* py_history(PyObject *self, PyObject *args);
|
||||
PyObject* py_chat_add_user(PyObject *self, PyObject *args);
|
||||
PyObject* py_chat_del_user(PyObject *self, PyObject *args);
|
||||
PyObject* py_add_contact(PyObject *self, PyObject *args);
|
||||
PyObject* py_del_contact(PyObject *self, PyObject *args);
|
||||
PyObject* py_rename_contact(PyObject *self, PyObject *args);
|
||||
PyObject* py_search(PyObject *self, PyObject *args);
|
||||
PyObject* py_global_search(PyObject *self, PyObject *args);
|
||||
PyObject* py_mark_read(PyObject *self, PyObject *args);
|
||||
PyObject* py_set_profile_photo(PyObject *self, PyObject *args);
|
||||
PyObject* py_set_profile_name(PyObject *self, PyObject *args);
|
||||
PyObject* py_create_secret_chat(PyObject *self, PyObject *args);
|
||||
PyObject* py_create_group_chat(PyObject *self, PyObject *args);
|
||||
PyObject* py_delete_msg(PyObject *self, PyObject *args);
|
||||
PyObject* py_restore_msg(PyObject *self, PyObject *args);
|
||||
PyObject* py_accept_secret_chat(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_contact(PyObject *self, PyObject *args);
|
||||
PyObject* py_status_online(PyObject *self, PyObject *args);
|
||||
PyObject* py_status_offline(PyObject *self, PyObject *args);
|
||||
PyObject* py_send_location(PyObject *self, PyObject *args);
|
||||
PyObject* py_extf(PyObject *self, PyObject *args);
|
||||
|
||||
|
||||
// Util Functions
|
||||
void py_add_string_field (PyObject* dict, char *name, const char *value);
|
||||
void py_add_string_field_arr (PyObject* list, int num, const char *value);
|
||||
void py_add_num_field (PyObject* dict, const char *name, double value);
|
||||
#endif
|
||||
+1570
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -0,0 +1,21 @@
|
||||
#ifndef __PYTHON_TYPES_H__
|
||||
#define __PYTHON_TYPES_H__
|
||||
|
||||
#include <Python.h>
|
||||
#include <tgl/tgl.h>
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
tgl_peer_t *peer;
|
||||
} tgl_Peer;
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
struct tgl_message *msg;
|
||||
} tgl_Msg;
|
||||
|
||||
|
||||
PyObject * tgl_Peer_FromTglPeer(tgl_peer_t *peer);
|
||||
PyObject * tgl_Msg_FromTglMsg(struct tgl_message *peer);
|
||||
|
||||
#endif
|
||||
-3779
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
-77
@@ -1,77 +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"
|
||||
|
||||
struct event;
|
||||
|
||||
#define QUERY_ACK_RECEIVED 1
|
||||
#define QUERY_FORCE_SEND 2
|
||||
|
||||
struct query;
|
||||
struct query_methods {
|
||||
int (*on_answer)(struct query *q);
|
||||
int (*on_error)(struct query *q, int error_code, int len, char *error);
|
||||
int (*on_timeout)(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 event *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_dc *DC, int len, void *data, struct query_methods *methods, void *extra, void *callback, void *callback_extra);
|
||||
void tglq_query_ack (long long id);
|
||||
void tglq_query_error (long long id);
|
||||
void tglq_query_result (long long id);
|
||||
void tglq_query_restart (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_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
|
||||
@@ -1 +0,0 @@
|
||||
scheme16.tl
|
||||
-505
@@ -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
@@ -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
@@ -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;
|
||||
@@ -0,0 +1,8 @@
|
||||
-----BEGIN RSA PUBLIC KEY-----
|
||||
MIIBCgKCAQEAwVACPi9w23mF3tBkdZz+zwrzKOaaQdr01vAbU4E1pvkfj4sqDsm6
|
||||
lyDONS789sVoD/xCS9Y0hkkC3gtL1tSfTlgCMOOul9lcixlEKzwKENj1Yz/s7daS
|
||||
an9tqw3bfUV/nqgbhGX81v/+7RFAEd+RwFnK7a+XYl9sluzHRyVVaTTveB2GazTw
|
||||
Efzk2DWgkBluml8OREmvfraX3bkHZJTKX4EQSjBbbdJ2ZXIsRrYOXfaA+xayEGB+
|
||||
8hdlLmAjbCVfaigxX0CDqWeR1yFL9kwd9P0NsZRPsmoqVwMbMu7mStFai6aIhc3n
|
||||
Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
|
||||
-----END RSA PUBLIC KEY-----
|
||||
@@ -96,7 +96,7 @@ if(open $etchandle, $etcfile)
|
||||
$line =~ s/\s+$//g;
|
||||
$line =~ s/^\s+//g;
|
||||
next unless $line;
|
||||
next if $line =~ /^\-[dh]/;
|
||||
next if $line =~ /^\-[h]/;
|
||||
|
||||
if($line =~ /^[^\-]/)
|
||||
{
|
||||
@@ -112,7 +112,7 @@ if(open $etchandle, $etcfile)
|
||||
|
||||
$have_l = 1 if $line =~ /^-L\s/;
|
||||
$have_c = 1 if $line =~ /^-c\s/;
|
||||
$have_u = 1 if $line =~ /^-u\s/;
|
||||
$have_u = 1 if $line =~ /^-U\s/;
|
||||
push @$params, $line;
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ if(open $etchandle, $etcfile)
|
||||
$params = [];
|
||||
}
|
||||
|
||||
push @$params, "-u telegramd" unless($have_u);
|
||||
push @$params, "-U telegramd" unless($have_u);
|
||||
push @$params, "-L $fd_reopened" unless($have_l);
|
||||
push @$params, "-c config$idl" unless($have_c);
|
||||
$params = join " ", @$params;
|
||||
|
||||
-1903
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -1,55 +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"
|
||||
|
||||
char *tgls_default_create_print_name (tgl_peer_id_t id, const char *a1, const char *a2, const char *a3, const char *a4);
|
||||
|
||||
|
||||
void tgls_free_user (struct tgl_user *U);
|
||||
void tgls_free_chat (struct tgl_chat *U);
|
||||
void tgls_free_photo (struct tgl_photo *P);
|
||||
void tgls_free_message (struct tgl_message *M);
|
||||
void tgls_clear_message (struct tgl_message *M);
|
||||
|
||||
struct tgl_message *tglm_message_alloc (long long id);
|
||||
void tglm_message_insert_tree (struct tgl_message *M);
|
||||
void tglm_update_message_id (struct tgl_message *M, long long id);
|
||||
void tglm_message_insert (struct tgl_message *M);
|
||||
void tglm_message_insert_unsent (struct tgl_message *M);
|
||||
void tglm_message_remove_unsent (struct tgl_message *M);
|
||||
void tglm_send_all_unsent (void);
|
||||
void tglm_message_remove_tree (struct tgl_message *M);
|
||||
void tglm_message_add_peer (struct tgl_message *M);
|
||||
void tglm_message_del_peer (struct tgl_message *M);
|
||||
void tglm_message_del_use (struct tgl_message *M);
|
||||
void tglm_message_add_use (struct tgl_message *M);
|
||||
|
||||
void tglp_peer_insert_name (tgl_peer_t *P);
|
||||
void tglp_peer_delete_name (tgl_peer_t *P);
|
||||
void tglp_insert_encrypted_chat (tgl_peer_t *P);
|
||||
void tglp_insert_user (tgl_peer_t *P);
|
||||
void tglp_insert_chat (tgl_peer_t *P);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,16 @@
|
||||
Binary files tg/.git/index and tg-cygwin/.git/index differ
|
||||
diff -urN tg/Makefile tg-cygwin/Makefile
|
||||
--- tg/Makefile 2015-06-16 12:39:34.931053900 +0900
|
||||
+++ tg-cygwin/Makefile 2015-06-16 12:44:12.584342300 +0900
|
||||
@@ -4,9 +4,9 @@
|
||||
LDFLAGS= -L/usr/local/lib -L/usr/lib -L/usr/lib -L/usr/lib
|
||||
CPPFLAGS= -I/usr/local/include -I/usr/include -I/usr/include -I/usr/include/python3.4m -I/usr/include
|
||||
DEFS=-DHAVE_CONFIG_H
|
||||
-COMPILE_FLAGS=${CFLAGS} ${CPFLAGS} ${CPPFLAGS} ${DEFS} -Wall -Werror -Wextra -Wno-missing-field-initializers -Wno-deprecated-declarations -fno-strict-aliasing -fno-omit-frame-pointer -ggdb -Wno-unused-parameter -fPIC
|
||||
+COMPILE_FLAGS=${CFLAGS} ${CPFLAGS} ${CPPFLAGS} ${DEFS} -Wall -Werror -Wextra -Wno-missing-field-initializers -Wno-deprecated-declarations -fno-strict-aliasing -fno-omit-frame-pointer -ggdb -Wno-unused-parameter
|
||||
EXTRA_LIBS=-ljansson -lconfig -lz -levent -lm -lreadline -llua-5.2 -lpython3.4m -lssl -lcrypto
|
||||
-LOCAL_LDFLAGS=-rdynamic -ggdb -levent ${EXTRA_LIBS} -ldl -lpthread -lutil
|
||||
+LOCAL_LDFLAGS=-ggdb -levent ${EXTRA_LIBS} -ldl -lpthread -lutil
|
||||
LINK_FLAGS=${LDFLAGS} ${LOCAL_LDFLAGS}
|
||||
|
||||
DEP=dep
|
||||
+3
-1
@@ -14,9 +14,11 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this telegram-cli. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Copyright Vitaly Valtman 2013-2014
|
||||
Copyright Vitaly Valtman 2013-2015
|
||||
*/
|
||||
|
||||
#ifndef PROG_NAME
|
||||
#define PROG_NAME "telegram-cli"
|
||||
#endif
|
||||
|
||||
#define TELEGRAM_CLI_VERSION "1.4.1"
|
||||
|
||||
+2
-2
@@ -88,9 +88,9 @@ function on_msg_receive (msg)
|
||||
end
|
||||
if (msg.text == 'PING') then
|
||||
if (msg.to.id == our_id) then
|
||||
fwd_msg (msg.from.print_name, msg.id)
|
||||
fwd_msg (msg.from.print_name, msg.id, ok_cb, false)
|
||||
else
|
||||
fwd_msg (msg.to.print_name, msg.id)
|
||||
fwd_msg (msg.to.print_name, msg.id, ok_cb, false)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
import tgl
|
||||
import pprint
|
||||
from functools import partial
|
||||
|
||||
|
||||
our_id = 0
|
||||
pp = pprint.PrettyPrinter(indent=4)
|
||||
|
||||
binlog_done = False;
|
||||
|
||||
def on_binlog_replay_end():
|
||||
binlog_done = True;
|
||||
|
||||
def on_get_difference_end():
|
||||
pass
|
||||
|
||||
def on_our_id(id):
|
||||
our_id = id
|
||||
return "Set ID: " + str(our_id)
|
||||
|
||||
def msg_cb(success, msg):
|
||||
pp.pprint(success)
|
||||
pp.pprint(msg)
|
||||
|
||||
HISTORY_QUERY_SIZE = 100
|
||||
|
||||
def history_cb(msg_list, peer, success, msgs):
|
||||
print(len(msgs))
|
||||
msg_list.extend(msgs)
|
||||
print(len(msg_list))
|
||||
if len(msgs) == HISTORY_QUERY_SIZE:
|
||||
tgl.get_history(peer, len(msg_list), HISTORY_QUERY_SIZE, partial(history_cb, msg_list, peer));
|
||||
|
||||
|
||||
def cb(success):
|
||||
print(success)
|
||||
|
||||
def on_msg_receive(msg):
|
||||
if msg.out and not binlog_done:
|
||||
return;
|
||||
|
||||
if msg.dest.id == our_id: # direct message
|
||||
peer = msg.src
|
||||
else: # chatroom
|
||||
peer = msg.dest
|
||||
|
||||
pp.pprint(msg)
|
||||
if msg.text.startswith("!ping"):
|
||||
peer.send_msg("PONG! google.com", preview=False, reply=msg.id)
|
||||
|
||||
|
||||
def on_secret_chat_update(peer, types):
|
||||
return "on_secret_chat_update"
|
||||
|
||||
def on_user_update():
|
||||
pass
|
||||
|
||||
def on_chat_update():
|
||||
pass
|
||||
|
||||
# Set callbacks
|
||||
tgl.set_on_binlog_replay_end(on_binlog_replay_end)
|
||||
tgl.set_on_get_difference_end(on_get_difference_end)
|
||||
tgl.set_on_our_id(on_our_id)
|
||||
tgl.set_on_msg_receive(on_msg_receive)
|
||||
tgl.set_on_secret_chat_update(on_secret_chat_update)
|
||||
tgl.set_on_user_update(on_user_update)
|
||||
tgl.set_on_chat_update(on_chat_update)
|
||||
|
||||
Submódulo
+1
Submodule tgl added at ffb04caca7
@@ -1,53 +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__
|
||||
|
||||
int tglf_fetch_file_location (struct tgl_file_location *loc);
|
||||
int tglf_fetch_user_status (struct tgl_user_status *S);
|
||||
int tglf_fetch_user (struct tgl_user *U);
|
||||
struct tgl_user *tglf_fetch_alloc_user (void);
|
||||
struct tgl_user *tglf_fetch_alloc_user_full (void);
|
||||
struct tgl_chat *tglf_fetch_alloc_chat (void);
|
||||
struct tgl_chat *tglf_fetch_alloc_chat_full (void);
|
||||
struct tgl_secret_chat *tglf_fetch_alloc_encrypted_chat (void);
|
||||
struct tgl_message *tglf_fetch_alloc_message (void);
|
||||
struct tgl_message *tglf_fetch_alloc_geo_message (void);
|
||||
struct tgl_message *tglf_fetch_alloc_message_short (void);
|
||||
struct tgl_message *tglf_fetch_alloc_message_short_chat (void);
|
||||
struct tgl_message *tglf_fetch_alloc_encrypted_message (void);
|
||||
void tglf_fetch_encrypted_message_file (struct tgl_message_media *M);
|
||||
tgl_peer_id_t tglf_fetch_peer_id (void);
|
||||
|
||||
void tglf_fetch_message_media (struct tgl_message_media *M);
|
||||
void tglf_fetch_message_media_encrypted (struct tgl_message_media *M);
|
||||
void tglf_fetch_message_action (struct tgl_message_action *M);
|
||||
void tglf_fetch_message_action_encrypted (struct tgl_message_action *M);
|
||||
void tglf_fetch_photo (struct tgl_photo *P);
|
||||
|
||||
void tglf_fetch_chat (struct tgl_chat *C);
|
||||
void tglf_fetch_chat_full (struct tgl_chat *C);
|
||||
|
||||
void tglf_fetch_audio (struct tgl_audio *V);
|
||||
void tglf_fetch_video (struct tgl_video *V);
|
||||
void tglf_fetch_document (struct tgl_document *V);
|
||||
void tglf_fetch_message (struct tgl_message *M);
|
||||
void tglf_fetch_geo_message (struct tgl_message *M);
|
||||
#endif
|
||||
@@ -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 (tgl_state.verbosity >= verbosity_level) { \
|
||||
tgl_state.callback.logprintf (__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
-422
@@ -1,422 +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 event *ev;
|
||||
//struct event_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 event *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_notify_layer
|
||||
};
|
||||
|
||||
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_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;
|
||||
};
|
||||
|
||||
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;
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
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
|
||||
-93
@@ -1,93 +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"
|
||||
|
||||
#ifdef EVENT_V2
|
||||
#include <event2/event.h>
|
||||
#else
|
||||
#include <event.h>
|
||||
#include "event-old.h"
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
struct tgl_state tgl_state;
|
||||
|
||||
|
||||
void tgl_set_binlog_mode (int mode) {
|
||||
tgl_state.binlog_enabled = mode;
|
||||
}
|
||||
|
||||
void tgl_set_binlog_path (const char *path) {
|
||||
tgl_state.binlog_name = tstrdup (path);
|
||||
}
|
||||
|
||||
void tgl_set_auth_file_path (const char *path) {
|
||||
tgl_state.auth_file = tstrdup (path);
|
||||
}
|
||||
|
||||
void tgl_set_download_directory (const char *path) {
|
||||
tgl_state.downloads_directory = tstrdup (path);
|
||||
}
|
||||
|
||||
void tgl_set_callback (struct tgl_update_callback *cb) {
|
||||
tgl_state.callback = *cb;
|
||||
}
|
||||
|
||||
void tgl_set_rsa_key (const char *key) {
|
||||
assert (tgl_state.rsa_key_num < TGL_MAX_RSA_KEYS_NUM);
|
||||
tgl_state.rsa_key_list[tgl_state.rsa_key_num ++] = tstrdup (key);
|
||||
}
|
||||
|
||||
void tgl_init (void) {
|
||||
tgl_state.ev_base = event_base_new ();
|
||||
|
||||
if (!tgl_state.net_methods) {
|
||||
tgl_state.net_methods = &tgl_conn_methods;
|
||||
}
|
||||
if (!tgl_state.callback.create_print_name) {
|
||||
tgl_state.callback.create_print_name = tgls_default_create_print_name;
|
||||
}
|
||||
if (!tgl_state.temp_key_expire_time) {
|
||||
tgl_state.temp_key_expire_time = 100000;
|
||||
}
|
||||
|
||||
tglmp_on_start ();
|
||||
}
|
||||
|
||||
int tgl_authorized_dc (struct tgl_dc *DC) {
|
||||
assert (DC);
|
||||
return (DC->flags & 4) != 0;//DC->auth_key_id;
|
||||
}
|
||||
|
||||
int tgl_signed_dc (struct tgl_dc *DC) {
|
||||
assert (DC);
|
||||
return DC->has_auth;
|
||||
}
|
||||
|
||||
-330
@@ -1,330 +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>
|
||||
|
||||
#define TGL_MAX_DC_NUM 100
|
||||
#define TG_SERVER "149.154.167.50"
|
||||
#define TG_SERVER_TEST "149.154.167.40"
|
||||
#define TG_SERVER_DC 2
|
||||
#define TG_SERVER_TEST_DC 2
|
||||
|
||||
// JUST RANDOM STRING
|
||||
#define TGL_BUILD "2014"
|
||||
#define TGL_VERSION "1.0.5"
|
||||
|
||||
#define TGL_ENCRYPTED_LAYER 16
|
||||
|
||||
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
|
||||
|
||||
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_update_callback {
|
||||
void (*new_msg)(struct tgl_message *M);
|
||||
void (*marked_read)(int num, struct tgl_message *list[]);
|
||||
void (*logprintf)(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
void (*type_notification)(struct tgl_user *U);
|
||||
void (*type_in_chat_notification)(struct tgl_user *U, struct tgl_chat *C);
|
||||
void (*type_in_secret_chat_notification)(struct tgl_secret_chat *E);
|
||||
void (*status_notification)(struct tgl_user *U);
|
||||
void (*user_registered)(struct tgl_user *U);
|
||||
void (*user_activated)(struct tgl_user *U);
|
||||
void (*new_authorization)(const char *device, const char *location);
|
||||
//void (*secret_chat_created)(struct tgl_secret_chat *E);
|
||||
//void (*secret_chat_request)(struct tgl_secret_chat *E);
|
||||
//void (*secret_chat_established)(struct tgl_secret_chat *E);
|
||||
//void (*secret_chat_deleted)(struct tgl_secret_chat *E);
|
||||
//void (*secret_chat_accepted)(struct tgl_secret_chat *E);
|
||||
//void (*new_user)(struct tgl_user *U);
|
||||
//void (*delete_user)(struct tgl_user *U);
|
||||
//void (*update_user_info)(struct tgl_user *U);
|
||||
//void (*secret_chat_delete)(struct tgl_secret_chat *U);
|
||||
//void (*secret_chat_requested)(struct tgl_secret_chat *U);
|
||||
//void (*secret_chat_accepted)(struct tgl_secret_chat *U);
|
||||
//void (*secret_chat_created)(struct tgl_secret_chat *U);
|
||||
void (*chat_update)(struct tgl_chat *C, unsigned flags);
|
||||
void (*user_update)(struct tgl_user *C, unsigned flags);
|
||||
void (*secret_chat_update)(struct tgl_secret_chat *C, unsigned flags);
|
||||
void (*msg_receive)(struct tgl_message *M);
|
||||
void (*our_id)(int id);
|
||||
char *(*create_print_name) (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) (const char *host, int port, struct tgl_session *session, struct tgl_dc *dc, struct mtproto_methods *methods);
|
||||
};
|
||||
|
||||
|
||||
#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
|
||||
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;
|
||||
struct event_base *ev_base;
|
||||
|
||||
char *rsa_key_list[TGL_MAX_RSA_KEYS_NUM];
|
||||
int rsa_key_num;
|
||||
struct bignum_ctx *BN_ctx;
|
||||
|
||||
struct tgl_allocator allocator;
|
||||
};
|
||||
extern struct tgl_state tgl_state;
|
||||
|
||||
void tgl_reopen_binlog_for_writing (void);
|
||||
void tgl_replay_log (void);
|
||||
|
||||
int tgl_print_stat (char *s, int len);
|
||||
tgl_peer_t *tgl_peer_get (tgl_peer_id_t id);
|
||||
tgl_peer_t *tgl_peer_get_by_name (const char *s);
|
||||
|
||||
struct tgl_message *tgl_message_get (long long id);
|
||||
void tgl_peer_iterator_ex (void (*it)(tgl_peer_t *P, void *extra), void *extra);
|
||||
|
||||
int tgl_complete_user_list (int index, const char *text, int len, char **R);
|
||||
int tgl_complete_chat_list (int index, const char *text, int len, char **R);
|
||||
int tgl_complete_encr_chat_list (int index, const char *text, int len, char **R);
|
||||
int tgl_complete_peer_list (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 (int mode);
|
||||
void tgl_set_binlog_path (const char *path);
|
||||
void tgl_set_auth_file_path (const char *path);
|
||||
void tgl_set_download_directory (const char *path);
|
||||
void tgl_set_callback (struct tgl_update_callback *cb);
|
||||
void tgl_set_rsa_key (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 (void) {
|
||||
tgl_state.verbosity ++;
|
||||
}
|
||||
|
||||
static inline void tgl_set_verbosity (int val) {
|
||||
tgl_state.verbosity = val;
|
||||
}
|
||||
|
||||
static inline void tgl_enable_pfs (void) {
|
||||
tgl_state.enable_pfs = 1;
|
||||
}
|
||||
|
||||
static inline void tgl_set_test_mode (void) {
|
||||
tgl_state.test_mode ++;
|
||||
}
|
||||
|
||||
struct pollfd;
|
||||
int tgl_connections_make_poll_array (struct pollfd *fds, int max);
|
||||
void tgl_connections_poll_result (struct pollfd *fds, int max);
|
||||
|
||||
void tgl_do_help_get_config (void (*callback)(void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_send_code (const char *user, void (*callback)(void *callback_extra, int success, int registered, const char *hash), void *callback_extra);
|
||||
void tgl_do_phone_call (const char *user, const char *hash, void (*callback)(void *callback_extra, int success), void *callback_extra);
|
||||
int tgl_do_send_code_result (const char *user, const char *hash, const char *code, void (*callback)(void *callback_extra, int success, struct tgl_user *Self), void *callback_extra) ;
|
||||
int tgl_do_send_code_result_auth (const char *user, const char *hash, const char *code, const char *first_name, const char *last_name, void (*callback)(void *callback_extra, int success, struct tgl_user *Self), void *callback_extra);
|
||||
void tgl_do_update_contact_list (void (*callback) (void *callback_extra, int success, int size, struct tgl_user *contacts[]), void *callback_extra);
|
||||
void tgl_do_send_message (tgl_peer_id_t id, const char *msg, int len, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_send_msg (struct tgl_message *M, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_send_text (tgl_peer_id_t id, char *file, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_mark_read (tgl_peer_id_t id, void (*callback)(void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_get_history (tgl_peer_id_t id, int limit, int offline_mode, void (*callback)(void *callback_extra, int success, int size, struct tgl_message *list[]), void *callback_extra);
|
||||
void tgl_do_get_history_ext (tgl_peer_id_t id, int offset, int limit, int offline_mode, void (*callback)(void *callback_extra, int success, int size, struct tgl_message *list[]), void *callback_extra);
|
||||
void tgl_do_get_dialog_list (void (*callback)(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 (enum tgl_message_media_type type, tgl_peer_id_t to_id, char *file_name, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_set_chat_photo (tgl_peer_id_t chat_id, char *file_name, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_set_profile_photo (char *file_name, void (*callback)(void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_forward_message (tgl_peer_id_t id, int n, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_rename_chat (tgl_peer_id_t id, char *name, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_get_chat_info (tgl_peer_id_t id, int offline_mode, void (*callback)(void *callback_extra, int success, struct tgl_chat *C), void *callback_extra);
|
||||
void tgl_do_get_user_info (tgl_peer_id_t id, int offline_mode, void (*callback)(void *callback_extra, int success, struct tgl_user *U), void *callback_extra);
|
||||
void tgl_do_load_photo (struct tgl_photo *photo, void (*callback)(void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_video_thumb (struct tgl_video *video, void (*callback)(void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_audio (struct tgl_audio *V, void (*callback)(void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_video (struct tgl_video *V, void (*callback)(void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_document (struct tgl_document *V, void (*callback)(void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_document_thumb (struct tgl_document *video, void (*callback)(void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_load_encr_video (struct tgl_encr_video *V, void (*callback)(void *callback_extra, int success, char *filename), void *callback_extra);
|
||||
void tgl_do_export_auth (int num, void (*callback) (void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_add_contact (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)(void *callback_extra, int success, int size, struct tgl_user *users[]), void *callback_extra);
|
||||
void tgl_do_msg_search (tgl_peer_id_t id, int from, int to, int limit, int offset, const char *s, void (*callback)(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) (void *callback_extra, int success, int size, struct tgl_user *users[]), void *callback_extra);
|
||||
void tgl_do_create_encr_chat_request (int user_id, void (*callback)(void *callback_extra, int success, struct tgl_secret_chat *E), void *callback_extra);
|
||||
void tgl_do_create_secret_chat (tgl_peer_id_t id, void (*callback)(void *callback_extra, int success, struct tgl_secret_chat *E), void *callback_extra);
|
||||
void tgl_do_accept_encr_chat_request (struct tgl_secret_chat *E, void (*callback)(void *callback_extra, int success, struct tgl_secret_chat *E), void *callback_extra);
|
||||
void tgl_do_get_difference (int sync_from_start, void (*callback)(void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_lookup_state (void);
|
||||
void tgl_do_add_user_to_chat (tgl_peer_id_t chat_id, tgl_peer_id_t id, int limit, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_del_user_from_chat (tgl_peer_id_t chat_id, tgl_peer_id_t id, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_create_group_chat (tgl_peer_id_t id, char *chat_topic, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_create_group_chat_ex (int users_num, tgl_peer_id_t ids[], char *chat_topic, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_delete_msg (long long id, void (*callback)(void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_restore_msg (long long id, void (*callback)(void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_update_status (int online, void (*callback)(void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_help_get_config_dc (struct tgl_dc *D, void (*callback)(void *, int), void *callback_extra);
|
||||
void tgl_do_export_card (void (*callback)(void *callback_extra, int success, int size, int *card), void *callback_extra);
|
||||
void tgl_do_import_card (int size, int *card, void (*callback)(void *callback_extra, int success, struct tgl_user *U), void *callback_extra);
|
||||
void tgl_do_send_contact (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)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_forward_media (tgl_peer_id_t id, int n, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
void tgl_do_del_contact (tgl_peer_id_t id, void (*callback)(void *callback_extra, int success), void *callback_extra);
|
||||
void tgl_do_set_encr_chat_ttl (struct tgl_secret_chat *E, int ttl, void (*callback)(void *callback_extra, int success, struct tgl_message *M), void *callback_extra);
|
||||
|
||||
|
||||
void tgl_do_visualize_key (tgl_peer_id_t id, unsigned char buf[16]);
|
||||
|
||||
void tgl_do_send_ping (struct connection *c);
|
||||
|
||||
int tgl_authorized_dc (struct tgl_dc *DC);
|
||||
int tgl_signed_dc (struct tgl_dc *DC);
|
||||
|
||||
//void tgl_do_get_suggested (void);
|
||||
|
||||
void tgl_do_create_keys_end (struct tgl_secret_chat *U);
|
||||
void tgl_do_send_encr_chat_layer (struct tgl_secret_chat *E);
|
||||
|
||||
struct mtproto_methods {
|
||||
int (*ready) (struct connection *c);
|
||||
int (*close) (struct connection *c);
|
||||
int (*execute) (struct connection *c, int op, int len);
|
||||
};
|
||||
|
||||
void tgl_init (void);
|
||||
void tgl_dc_authorize (struct tgl_dc *DC);
|
||||
|
||||
void tgl_dc_iterator (void (*iterator)(struct tgl_dc *DC));
|
||||
void tgl_dc_iterator_ex (void (*iterator)(struct tgl_dc *DC, void *extra), void *extra);
|
||||
|
||||
double tglt_get_double_time (void);
|
||||
|
||||
void tgl_insert_empty_user (int id);
|
||||
void tgl_insert_empty_chat (int id);
|
||||
|
||||
int tglf_extf_autocomplete (const char *text, int text_len, int index, char **R, char *data, int data_len);
|
||||
struct paramed_type *tglf_extf_store (const char *data, int data_len);
|
||||
void tgl_do_send_extf (char *data, int data_len, void (*callback)(void *callback_extra, int success, char *data), void *callback_extra);
|
||||
char *tglf_extf_fetch (struct paramed_type *T);
|
||||
|
||||
void tgl_free_all (void);
|
||||
|
||||
#endif
|
||||
-3077
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
-206
@@ -1,206 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-libary/tlc
|
||||
|
||||
Tgl-library/tlc 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/tlc 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/tlc. 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 __TL_PARSER_NEW_H__
|
||||
#define __TL_PARSER_NEW_H__
|
||||
enum lex_type {
|
||||
lex_error,
|
||||
lex_char,
|
||||
lex_triple_minus,
|
||||
lex_uc_ident,
|
||||
lex_lc_ident,
|
||||
lex_eof,
|
||||
lex_final,
|
||||
lex_new,
|
||||
lex_none,
|
||||
lex_num,
|
||||
lex_empty
|
||||
};
|
||||
|
||||
|
||||
struct curlex {
|
||||
char *ptr;
|
||||
int len;
|
||||
enum lex_type type;
|
||||
int flags;
|
||||
};
|
||||
|
||||
struct parse {
|
||||
char *text;
|
||||
int pos;
|
||||
int len;
|
||||
int line;
|
||||
int line_pos;
|
||||
struct curlex lex;
|
||||
};
|
||||
|
||||
|
||||
enum tree_type {
|
||||
type_tl_program,
|
||||
type_fun_declarations,
|
||||
type_constr_declarations,
|
||||
type_declaration,
|
||||
type_combinator_decl,
|
||||
type_equals,
|
||||
type_partial_app_decl,
|
||||
type_final_decl,
|
||||
type_full_combinator_id,
|
||||
type_opt_args,
|
||||
type_args,
|
||||
type_args1,
|
||||
type_args2,
|
||||
type_args3,
|
||||
type_args4,
|
||||
type_boxed_type_ident,
|
||||
type_subexpr,
|
||||
type_partial_comb_app_decl,
|
||||
type_partial_type_app_decl,
|
||||
type_final_new,
|
||||
type_final_final,
|
||||
type_final_empty,
|
||||
// type_type,
|
||||
type_var_ident,
|
||||
type_var_ident_opt,
|
||||
type_multiplicity,
|
||||
type_type_term,
|
||||
type_term,
|
||||
type_percent,
|
||||
type_result_type,
|
||||
type_expr,
|
||||
type_nat_term,
|
||||
type_combinator_id,
|
||||
type_nat_const,
|
||||
type_type_ident,
|
||||
type_builtin_combinator_decl,
|
||||
type_exclam,
|
||||
type_optional_arg_def
|
||||
};
|
||||
|
||||
struct tree {
|
||||
char *text;
|
||||
int len;
|
||||
enum tree_type type;
|
||||
int lex_line;
|
||||
int lex_line_pos;
|
||||
int flags;
|
||||
int size;
|
||||
int nc;
|
||||
struct tree **c;
|
||||
};
|
||||
|
||||
|
||||
#define TL_ACT(x) (x == act_var ? "act_var" : x == act_field ? "act_field" : x == act_plus ? "act_plus" : x == act_type ? "act_type" : x == act_nat_const ? "act_nat_const" : x == act_array ? "act_array" : x == act_question_mark ? "act_question_mark" : \
|
||||
x == act_union ? "act_union" : x == act_arg ? "act_arg" : x == act_opt_field ? "act_opt_field" : "act_unknown")
|
||||
|
||||
#define TL_TYPE(x) (x == type_num ? "type_num" : x == type_type ? "type_type" : x == type_list_item ? "type_list_item" : x == type_list ? "type_list" : x == type_num_value ? "type_num_value" : "type_unknown")
|
||||
enum combinator_tree_action {
|
||||
act_var,
|
||||
act_field,
|
||||
act_plus,
|
||||
act_type,
|
||||
act_nat_const,
|
||||
act_array,
|
||||
act_question_mark,
|
||||
act_union,
|
||||
act_arg,
|
||||
act_opt_field
|
||||
};
|
||||
|
||||
enum combinator_tree_type {
|
||||
type_num,
|
||||
type_num_value,
|
||||
type_type,
|
||||
type_list_item,
|
||||
type_list
|
||||
};
|
||||
|
||||
struct tl_combinator_tree {
|
||||
enum combinator_tree_action act;
|
||||
struct tl_combinator_tree *left, *right;
|
||||
char *name;
|
||||
void *data;
|
||||
long long flags;
|
||||
enum combinator_tree_type type;
|
||||
int type_len;
|
||||
long long type_flags;
|
||||
};
|
||||
|
||||
|
||||
struct tl_program {
|
||||
int types_num;
|
||||
int functions_num;
|
||||
int constructors_num;
|
||||
struct tl_type **types;
|
||||
struct tl_function **functions;
|
||||
// struct tl_constuctor **constructors;
|
||||
};
|
||||
|
||||
struct tl_type {
|
||||
char *id;
|
||||
char *print_id;
|
||||
char *real_id;
|
||||
unsigned name;
|
||||
int flags;
|
||||
|
||||
int params_num;
|
||||
long long params_types;
|
||||
|
||||
int constructors_num;
|
||||
struct tl_constructor **constructors;
|
||||
};
|
||||
|
||||
struct tl_constructor {
|
||||
char *id;
|
||||
char *print_id;
|
||||
char *real_id;
|
||||
unsigned name;
|
||||
struct tl_type *type;
|
||||
|
||||
struct tl_combinator_tree *left;
|
||||
struct tl_combinator_tree *right;
|
||||
};
|
||||
|
||||
struct tl_var {
|
||||
char *id;
|
||||
struct tl_combinator_tree *ptr;
|
||||
int type;
|
||||
int flags;
|
||||
};
|
||||
|
||||
struct parse *tl_init_parse_file (const char *fname);
|
||||
struct tree *tl_parse_lex (struct parse *P);
|
||||
void tl_print_parse_error (void);
|
||||
struct tl_program *tl_parse (struct tree *T);
|
||||
|
||||
void write_types (int f);
|
||||
|
||||
#define FLAG_BARE 1
|
||||
#define FLAG_OPT_VAR (1 << 17)
|
||||
#define FLAG_EXCL (1 << 18)
|
||||
#define FLAG_OPT_FIELD (1 << 20)
|
||||
#define FLAG_IS_VAR (1 << 21)
|
||||
#define FLAG_DEFAULT_CONSTRUCTOR (1 << 25)
|
||||
#define FLAG_EMPTY (1 << 10)
|
||||
|
||||
#endif
|
||||
-52
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
This file is part of VK/KittenPHP-DB-Engine.
|
||||
|
||||
VK/KittenPHP-DB-Engine 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.
|
||||
|
||||
VK/KittenPHP-DB-Engine 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 VK/KittenPHP-DB-Engine. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
This program is released under the GPL with the additional exemption
|
||||
that compiling, linking, and/or using OpenSSL is allowed.
|
||||
You are free to remove this exemption from derived works.
|
||||
|
||||
Copyright 2012-2013 Vkontakte Ltd
|
||||
2012-2013 Vitaliy Valtman
|
||||
*/
|
||||
|
||||
#ifndef __TL_TL_H__
|
||||
#define __TL_TL_H__
|
||||
|
||||
#define TLS_SCHEMA 0xf19d9e38
|
||||
#define TLS_TYPE 0x12eb4386
|
||||
#define TLS_COMBINATOR 0x5c0a1ed5
|
||||
#define TLS_COMBINATOR_LEFT_BUILTIN 0xcd211f63
|
||||
#define TLS_COMBINATOR_LEFT 0x4c12c6d9
|
||||
#define TLS_COMBINATOR_RIGHT 0xd325b367
|
||||
#define TLS_ARG 0x46afe232
|
||||
#define TLS_TREE_NAT_CONST 0xc09f07d7
|
||||
#define TLS_TREE_NAT_VAR 0x90ea6f58
|
||||
#define TLS_TREE_TYPE_VAR 0x1caa237a
|
||||
#define TLS_TREE_ARRAY 0x80479360
|
||||
#define TLS_TREE_TYPE 0x10f32190
|
||||
|
||||
#define TLS_SCHEMA_V2 0x3a2f9be2
|
||||
#define TLS_COMBINATOR_RIGHT_V2 0x2c064372
|
||||
#define TLS_ARG_V2 0x29dfe61b
|
||||
#define TLS_EXPR_TYPE 0xecc9da78
|
||||
#define TLS_EXPR_NAT 0xdcb49bd8
|
||||
|
||||
#define TLS_NAT_CONST 0xdcb49bd8
|
||||
#define TLS_NAT_VAR 0x4e8a14f0
|
||||
#define TLS_TYPE_VAR 0x0142ceae
|
||||
#define TLS_ARRAY 0xd9fb20de
|
||||
#define TLS_TYPE_EXPR 0xc1863d08
|
||||
#endif
|
||||
-165
@@ -1,165 +0,0 @@
|
||||
/*
|
||||
This file is part of tgl-libary/tlc
|
||||
|
||||
Tgl-library/tlc 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/tlc 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/tlc. 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
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "tl-parser.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <signal.h>
|
||||
#include "config.h"
|
||||
#include <execinfo.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
int verbosity;
|
||||
int output_expressions;
|
||||
int schema_version = 2;
|
||||
void usage (void) {
|
||||
printf ("usage: tlc [-v] [-h] <TL-schema-file>\n"
|
||||
"\tTL compiler\n"
|
||||
"\t-v\toutput statistical and debug information into stderr\n"
|
||||
"\t-E\twhenever is possible output to stdout expressions\n"
|
||||
"\t-e <file>\texport serialized schema to file\n"
|
||||
"\t-w\t custom version of serialized schema (0 - very old, 1 - old, 2 - current (default))\n"
|
||||
);
|
||||
exit (2);
|
||||
}
|
||||
|
||||
int vkext_write (const char *filename) {
|
||||
int f = open (filename, O_CREAT | O_WRONLY | O_TRUNC, 0640);
|
||||
assert (f >= 0);
|
||||
write_types (f);
|
||||
close (f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
void logprintf (const char *format __attribute__ ((unused)), ...) {
|
||||
va_list ap;
|
||||
va_start (ap, format);
|
||||
vfprintf (stderr, format, ap);
|
||||
va_end (ap);
|
||||
}
|
||||
|
||||
void hexdump (int *in_ptr, int *in_end) {
|
||||
int *ptr = in_ptr;
|
||||
while (ptr < in_end) { printf (" %08x", *(ptr ++)); }
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
#ifdef HAVE_EXECINFO_H
|
||||
void print_backtrace (void) {
|
||||
void *buffer[255];
|
||||
const int calls = backtrace (buffer, sizeof (buffer) / sizeof (void *));
|
||||
backtrace_symbols_fd (buffer, calls, 1);
|
||||
}
|
||||
#else
|
||||
void print_backtrace (void) {
|
||||
if (write (1, "No libexec. Backtrace disabled\n", 32) < 0) {
|
||||
// Sad thing
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void sig_segv_handler (int signum __attribute__ ((unused))) {
|
||||
if (write (1, "SIGSEGV received\n", 18) < 0) {
|
||||
// Sad thing
|
||||
}
|
||||
print_backtrace ();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
void sig_abrt_handler (int signum __attribute__ ((unused))) {
|
||||
if (write (1, "SIGABRT received\n", 18) < 0) {
|
||||
// Sad thing
|
||||
}
|
||||
print_backtrace ();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
signal (SIGSEGV, sig_segv_handler);
|
||||
signal (SIGABRT, sig_abrt_handler);
|
||||
int i;
|
||||
char *vkext_file = 0;
|
||||
while ((i = getopt (argc, argv, "Ehve:w:")) != -1) {
|
||||
switch (i) {
|
||||
case 'E':
|
||||
output_expressions++;
|
||||
break;
|
||||
case 'h':
|
||||
usage ();
|
||||
return 2;
|
||||
case 'e':
|
||||
vkext_file = optarg;
|
||||
break;
|
||||
case 'w':
|
||||
schema_version = atoi (optarg);
|
||||
break;
|
||||
case 'v':
|
||||
verbosity++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (argc != optind + 1) {
|
||||
usage ();
|
||||
}
|
||||
|
||||
|
||||
struct parse *P = tl_init_parse_file (argv[optind]);
|
||||
if (!P) {
|
||||
return 0;
|
||||
}
|
||||
struct tree *T;
|
||||
if (!(T = tl_parse_lex (P))) {
|
||||
fprintf (stderr, "Error in parse:\n");
|
||||
tl_print_parse_error ();
|
||||
return 0;
|
||||
} else {
|
||||
if (verbosity) {
|
||||
fprintf (stderr, "Parse ok\n");
|
||||
}
|
||||
if (!tl_parse (T)) {
|
||||
if (verbosity) {
|
||||
fprintf (stderr, "Fail\n");
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
if (verbosity) {
|
||||
fprintf (stderr, "Ok\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (vkext_file) {
|
||||
vkext_write (vkext_file);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
-297
@@ -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
@@ -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
|
||||
-179
@@ -1,179 +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 __TREE_H__
|
||||
#define __TREE_H__
|
||||
#include <stdio.h>
|
||||
|
||||
#include <memory.h>
|
||||
#include <assert.h>
|
||||
#include "tools.h"
|
||||
|
||||
#pragma pack(push,4)
|
||||
#define DEFINE_TREE(X_NAME, X_TYPE, X_CMP, X_UNSET) \
|
||||
struct tree_ ## X_NAME { \
|
||||
struct tree_ ## X_NAME *left, *right;\
|
||||
X_TYPE x;\
|
||||
int y;\
|
||||
};\
|
||||
\
|
||||
static struct tree_ ## X_NAME *new_tree_node_ ## X_NAME (X_TYPE x, int y) {\
|
||||
struct tree_ ## X_NAME *T = talloc (sizeof (*T));\
|
||||
T->x = x;\
|
||||
T->y = y;\
|
||||
T->left = T->right = 0;\
|
||||
return T;\
|
||||
}\
|
||||
\
|
||||
static void delete_tree_node_ ## X_NAME (struct tree_ ## X_NAME *T) {\
|
||||
tfree (T, sizeof (*T));\
|
||||
}\
|
||||
\
|
||||
static void tree_split_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x, struct tree_ ## X_NAME **L, struct tree_ ## X_NAME **R) {\
|
||||
if (!T) {\
|
||||
*L = *R = 0;\
|
||||
} else {\
|
||||
int c = X_CMP (x, T->x);\
|
||||
if (c < 0) {\
|
||||
tree_split_ ## X_NAME (T->left, x, L, &T->left);\
|
||||
*R = T;\
|
||||
} else {\
|
||||
tree_split_ ## X_NAME (T->right, x, &T->right, R);\
|
||||
*L = T;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
static struct tree_ ## X_NAME *tree_insert_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x, int y) __attribute__ ((warn_unused_result,unused));\
|
||||
static struct tree_ ## X_NAME *tree_insert_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x, int y) {\
|
||||
if (!T) {\
|
||||
return new_tree_node_ ## X_NAME (x, y);\
|
||||
} else {\
|
||||
if (y > T->y) {\
|
||||
struct tree_ ## X_NAME *N = new_tree_node_ ## X_NAME (x, y);\
|
||||
tree_split_ ## X_NAME (T, x, &N->left, &N->right);\
|
||||
return N;\
|
||||
} else {\
|
||||
int c = X_CMP (x, T->x);\
|
||||
assert (c);\
|
||||
if (c < 0) { \
|
||||
T->left = tree_insert_ ## X_NAME (T->left, x, y);\
|
||||
} else { \
|
||||
T->right = tree_insert_ ## X_NAME (T->right, x, y);\
|
||||
} \
|
||||
return T; \
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
static struct tree_ ## X_NAME *tree_merge_ ## X_NAME (struct tree_ ## X_NAME *L, struct tree_ ## X_NAME *R) {\
|
||||
if (!L || !R) {\
|
||||
return L ? L : R;\
|
||||
} else {\
|
||||
if (L->y > R->y) {\
|
||||
L->right = tree_merge_ ## X_NAME (L->right, R);\
|
||||
return L;\
|
||||
} else {\
|
||||
R->left = tree_merge_ ## X_NAME (L, R->left);\
|
||||
return R;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
\
|
||||
static struct tree_ ## X_NAME *tree_delete_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) __attribute__ ((warn_unused_result,unused));\
|
||||
static struct tree_ ## X_NAME *tree_delete_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) {\
|
||||
assert (T);\
|
||||
int c = X_CMP (x, T->x);\
|
||||
if (!c) {\
|
||||
struct tree_ ## X_NAME *N = tree_merge_ ## X_NAME (T->left, T->right);\
|
||||
delete_tree_node_ ## X_NAME (T);\
|
||||
return N;\
|
||||
} else {\
|
||||
if (c < 0) { \
|
||||
T->left = tree_delete_ ## X_NAME (T->left, x); \
|
||||
} else { \
|
||||
T->right = tree_delete_ ## X_NAME (T->right, x); \
|
||||
} \
|
||||
return T; \
|
||||
}\
|
||||
}\
|
||||
\
|
||||
static X_TYPE tree_get_min_ ## X_NAME (struct tree_ ## X_NAME *t) __attribute__ ((unused));\
|
||||
static X_TYPE tree_get_min_ ## X_NAME (struct tree_ ## X_NAME *T) {\
|
||||
if (!T) { return X_UNSET; } \
|
||||
while (T->left) { T = T->left; }\
|
||||
return T->x; \
|
||||
} \
|
||||
\
|
||||
static X_TYPE tree_lookup_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) __attribute__ ((unused));\
|
||||
static X_TYPE tree_lookup_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) {\
|
||||
int c;\
|
||||
while (T && (c = X_CMP (x, T->x))) {\
|
||||
T = (c < 0 ? T->left : T->right);\
|
||||
}\
|
||||
return T ? T->x : X_UNSET;\
|
||||
}\
|
||||
\
|
||||
static void tree_act_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE)) __attribute__ ((unused));\
|
||||
static void tree_act_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE)) {\
|
||||
if (!T) { return; } \
|
||||
tree_act_ ## X_NAME (T->left, act); \
|
||||
act (T->x); \
|
||||
tree_act_ ## X_NAME (T->right, act); \
|
||||
}\
|
||||
\
|
||||
static void tree_act_ex_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE, void *), void *extra) __attribute__ ((unused));\
|
||||
static void tree_act_ex_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE, void *), void *extra) {\
|
||||
if (!T) { return; } \
|
||||
tree_act_ex_ ## X_NAME (T->left, act, extra); \
|
||||
act (T->x, extra); \
|
||||
tree_act_ex_ ## X_NAME (T->right, act, extra); \
|
||||
}\
|
||||
\
|
||||
static int tree_count_ ## X_NAME (struct tree_ ## X_NAME *T) __attribute__ ((unused));\
|
||||
static int tree_count_ ## X_NAME (struct tree_ ## X_NAME *T) { \
|
||||
if (!T) { return 0; }\
|
||||
return 1 + tree_count_ ## X_NAME (T->left) + tree_count_ ## X_NAME (T->right); \
|
||||
}\
|
||||
static void tree_check_ ## X_NAME (struct tree_ ## X_NAME *T) __attribute__ ((unused));\
|
||||
static void tree_check_ ## X_NAME (struct tree_ ## X_NAME *T) { \
|
||||
if (!T) { return; }\
|
||||
if (T->left) { \
|
||||
assert (T->left->y <= T->y);\
|
||||
assert (X_CMP (T->left->x, T->x) < 0); \
|
||||
}\
|
||||
if (T->right) { \
|
||||
assert (T->right->y <= T->y);\
|
||||
assert (X_CMP (T->right->x, T->x) > 0); \
|
||||
}\
|
||||
tree_check_ ## X_NAME (T->left); \
|
||||
tree_check_ ## X_NAME (T->right); \
|
||||
}\
|
||||
static struct tree_ ## X_NAME *tree_clear_ ## X_NAME (struct tree_ ## X_NAME *T) __attribute__ ((unused));\
|
||||
static struct tree_ ## X_NAME *tree_clear_ ## X_NAME (struct tree_ ## X_NAME *T) { \
|
||||
if (!T) { return 0; }\
|
||||
tree_clear_ ## X_NAME (T->left); \
|
||||
tree_clear_ ## X_NAME (T->right); \
|
||||
delete_tree_node_ ## X_NAME (T); \
|
||||
return 0; \
|
||||
} \
|
||||
|
||||
#define int_cmp(a,b) ((a) - (b))
|
||||
#pragma pack(pop)
|
||||
#endif
|
||||
-520
@@ -1,520 +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 <assert.h>
|
||||
|
||||
void tglu_fetch_pts (void) {
|
||||
int p = fetch_int ();
|
||||
if (p <= tgl_state.pts) { return; }
|
||||
bl_do_set_pts (p);
|
||||
}
|
||||
|
||||
void tglu_fetch_qts (void) {
|
||||
int p = fetch_int ();
|
||||
if (p <= tgl_state.qts) { return; }
|
||||
bl_do_set_qts (p);
|
||||
}
|
||||
|
||||
void tglu_fetch_date (void) {
|
||||
int p = fetch_int ();
|
||||
if (p > tgl_state.date) {
|
||||
//tgl_state.date = p;
|
||||
bl_do_set_date (tgl_state.date);
|
||||
}
|
||||
}
|
||||
|
||||
static void fetch_dc_option (void) {
|
||||
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 (id, l1, name, l2, ip, port);
|
||||
}
|
||||
|
||||
void tglu_work_update (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 ();
|
||||
assert (M);
|
||||
tglu_fetch_pts ();
|
||||
bl_do_msg_update (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 (new);
|
||||
if (M) {
|
||||
bl_do_set_msg_id (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 (id);
|
||||
if (M) {
|
||||
bl_do_set_unread (M, 0);
|
||||
}
|
||||
}
|
||||
tglu_fetch_pts ();
|
||||
}
|
||||
break;
|
||||
case CODE_update_user_typing:
|
||||
{
|
||||
tgl_peer_id_t id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *U = tgl_peer_get (id);
|
||||
|
||||
if (tgl_state.callback.type_notification && U) {
|
||||
tgl_state.callback.type_notification ((void *)U);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_chat_user_typing:
|
||||
{
|
||||
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 (chat_id);
|
||||
tgl_peer_t *U = tgl_peer_get (id);
|
||||
|
||||
if (U && C) {
|
||||
if (tgl_state.callback.type_in_chat_notification) {
|
||||
tgl_state.callback.type_in_chat_notification ((void *)U, (void *)C);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_user_status:
|
||||
{
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *U = tgl_peer_get (user_id);
|
||||
if (U) {
|
||||
tglf_fetch_user_status (&U->user.status);
|
||||
|
||||
if (tgl_state.callback.status_notification) {
|
||||
tgl_state.callback.status_notification ((void *)U);
|
||||
}
|
||||
} else {
|
||||
struct tgl_user_status t;
|
||||
tglf_fetch_user_status (&t);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_user_name:
|
||||
{
|
||||
tgl_peer_id_t user_id = TGL_MK_USER (fetch_int ());
|
||||
tgl_peer_t *UC = tgl_peer_get (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 (U, f, l1, l, l2);
|
||||
} else {
|
||||
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 (user_id);
|
||||
tglu_fetch_date ();
|
||||
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 (&small);
|
||||
tglf_fetch_file_location (&big);
|
||||
}
|
||||
bl_do_set_user_profile_photo (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 (&t);
|
||||
tglf_fetch_file_location (&t);
|
||||
}
|
||||
}
|
||||
fetch_bool ();
|
||||
}
|
||||
break;
|
||||
case CODE_update_restore_messages:
|
||||
{
|
||||
assert (fetch_int () == CODE_vector);
|
||||
int n = fetch_int ();
|
||||
fetch_skip (n);
|
||||
tglu_fetch_pts ();
|
||||
}
|
||||
break;
|
||||
case CODE_update_delete_messages:
|
||||
{
|
||||
assert (fetch_int () == CODE_vector);
|
||||
int n = fetch_int ();
|
||||
fetch_skip (n);
|
||||
tglu_fetch_pts ();
|
||||
}
|
||||
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 (chat_id);
|
||||
if (C && (C->flags & FLAG_CREATED)) {
|
||||
if (x == CODE_chat_participants) {
|
||||
bl_do_chat_set_admin (&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 (&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 (user_id);
|
||||
fetch_int (); // date
|
||||
if (tgl_state.callback.user_registered && U) {
|
||||
tgl_state.callback.user_registered ((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 (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 (user_id);
|
||||
|
||||
if (tgl_state.callback.user_activated && U) {
|
||||
tgl_state.callback.user_activated ((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 (tgl_state.callback.new_authorization) {
|
||||
tgl_state.callback.new_authorization (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 ();
|
||||
assert (M);
|
||||
bl_do_msg_update (M->id);
|
||||
}
|
||||
break;
|
||||
case CODE_update_new_encrypted_message:
|
||||
{
|
||||
struct tgl_message *M = tglf_fetch_alloc_encrypted_message ();
|
||||
assert (M);
|
||||
tglu_fetch_qts ();
|
||||
bl_do_msg_update (M->id);
|
||||
}
|
||||
break;
|
||||
case CODE_update_encryption:
|
||||
{
|
||||
struct tgl_secret_chat *E = tglf_fetch_alloc_encrypted_chat ();
|
||||
vlogprintf (E_DEBUG, "Secret chat state = %d\n", E->state);
|
||||
if (E->state == sc_ok) {
|
||||
tgl_do_send_encr_chat_layer (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 (id);
|
||||
|
||||
if (P) {
|
||||
if (tgl_state.callback.type_in_secret_chat_notification) {
|
||||
tgl_state.callback.type_in_secret_chat_notification ((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 (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 (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 (chat_id);
|
||||
if (C && (C->flags & FLAG_CREATED)) {
|
||||
bl_do_chat_add_user (&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 (chat_id);
|
||||
if (C && (C->flags & FLAG_CREATED)) {
|
||||
bl_do_chat_del_user (&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 ();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CODE_update_user_blocked:
|
||||
{
|
||||
int id = fetch_int ();
|
||||
int blocked = fetch_bool ();
|
||||
tgl_peer_t *P = tgl_peer_get (TGL_MK_USER (id));
|
||||
if (P && (P->flags & FLAG_CREATED)) {
|
||||
bl_do_user_set_blocked (&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;
|
||||
default:
|
||||
vlogprintf (E_ERROR, "Unknown update type %08x\n", op);
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
void tglu_work_update_short (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 (c, msg_id);
|
||||
tglu_fetch_date ();
|
||||
|
||||
assert (save_end == in_ptr);
|
||||
}
|
||||
|
||||
static int do_skip_seq (int seq) {
|
||||
if (tgl_state.seq) {
|
||||
if (seq <= tgl_state.seq) {
|
||||
vlogprintf (E_NOTICE, "Duplicate message with seq=%d\n", seq);
|
||||
return -1;
|
||||
}
|
||||
if (seq > tgl_state.seq + 1) {
|
||||
vlogprintf (E_NOTICE, "Hole in seq (seq = %d, cur_seq = %d)\n", seq, tgl_state.seq);
|
||||
//vlogprintf (E_NOTICE, "lock_diff = %s\n", (tgl_state.locks & TGL_LOCK_DIFF) ? "true" : "false");
|
||||
tgl_do_get_difference (0, 0, 0);
|
||||
return -1;
|
||||
}
|
||||
if (tgl_state.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 connection *c, long long msg_id) {
|
||||
int *save = in_ptr;
|
||||
assert (!skip_type_any (TYPE_TO_PARAM (updates)));
|
||||
if (do_skip_seq (*(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 (c, msg_id);
|
||||
}
|
||||
assert (fetch_int () == CODE_vector);
|
||||
n = fetch_int ();
|
||||
for (i = 0; i < n; i++) {
|
||||
tglf_fetch_alloc_user ();
|
||||
}
|
||||
assert (fetch_int () == CODE_vector);
|
||||
n = fetch_int ();
|
||||
for (i = 0; i < n; i++) {
|
||||
tglf_fetch_alloc_chat ();
|
||||
}
|
||||
bl_do_set_date (fetch_int ());
|
||||
//bl_do_set_seq (fetch_int ());
|
||||
int seq = fetch_int ();
|
||||
assert (seq == tgl_state.seq + 1);
|
||||
bl_do_set_seq (seq);
|
||||
assert (save_end == in_ptr);
|
||||
}
|
||||
|
||||
void tglu_work_update_short_message (struct connection *c, long long msg_id) {
|
||||
int *save = in_ptr;
|
||||
assert (!skip_type_any (TYPE_TO_PARAM (updates)));
|
||||
if (do_skip_seq (*(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 ();
|
||||
assert (M);
|
||||
|
||||
assert (save_end == in_ptr);
|
||||
if (!(tgl_state.locks & TGL_LOCK_DIFF)) {
|
||||
bl_do_msg_seq_update (M->id);
|
||||
}
|
||||
}
|
||||
|
||||
void tglu_work_update_short_chat_message (struct connection *c, long long msg_id) {
|
||||
int *save = in_ptr;
|
||||
assert (!skip_type_any (TYPE_TO_PARAM (updates)));
|
||||
if (do_skip_seq (*(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 ();
|
||||
assert (M);
|
||||
assert (save_end == in_ptr);
|
||||
|
||||
if (!(tgl_state.locks & TGL_LOCK_DIFF)) {
|
||||
bl_do_msg_seq_update (M->id);
|
||||
}
|
||||
}
|
||||
|
||||
void tglu_work_updates_to_long (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 (0, 0, 0);
|
||||
}
|
||||
-35
@@ -1,35 +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 connection *c, long long msg_id);
|
||||
void tglu_work_updates_to_long (struct connection *c, long long msg_id);
|
||||
void tglu_work_update_short_chat_message (struct connection *c, long long msg_id);
|
||||
void tglu_work_update_short_message (struct connection *c, long long msg_id);
|
||||
void tglu_work_update_short (struct connection *c, long long msg_id);
|
||||
void tglu_work_updates (struct connection *c, long long msg_id);
|
||||
|
||||
void tglu_fetch_pts (void);
|
||||
void tglu_fetch_qts (void);
|
||||
void tglu_fetch_seq (void);
|
||||
void tglu_fetch_date (void);
|
||||
#endif
|
||||
Referência em uma Nova Issue
Bloquear um usuário