1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
|
/*
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-2015
*/
#ifndef __TGL_H__
#define __TGL_H__
#include "crypto/bn.h"
#include "tgl-layout.h"
#include <string.h>
#include <stdlib.h>
#define TGL_MAX_DC_NUM 100
#define TG_SERVER_1 "149.154.175.50"
#define TG_SERVER_2 "149.154.167.51"
#define TG_SERVER_3 "149.154.175.100"
#define TG_SERVER_4 "149.154.167.91"
#define TG_SERVER_5 "149.154.171.5"
#define TG_SERVER_IPV6_1 "2001:b28:f23d:f001::a"
#define TG_SERVER_IPV6_2 "2001:67c:4e8:f002::a"
#define TG_SERVER_IPV6_3 "2001:b28:f23d:f003::a"
#define TG_SERVER_IPV6_4 "2001:67c:4e8:f004::a"
#define TG_SERVER_IPV6_5 "2001:b28:f23f:f005::a"
#define TG_SERVER_DEFAULT 2
#define TG_SERVER_TEST_1 "149.154.175.10"
#define TG_SERVER_TEST_2 "149.154.167.40"
#define TG_SERVER_TEST_3 "149.154.175.117"
#define TG_SERVER_TEST_IPV6_1 "2001:b28:f23d:f001::e"
#define TG_SERVER_TEST_IPV6_2 "2001:67c:4e8:f002::e"
#define TG_SERVER_TEST_IPV6_3 "2001:b28:f23d:f003::e"
#define TG_SERVER_TEST_DEFAULT 2
#define TGL_VERSION "2.1.0"
#define TGL_ENCRYPTED_LAYER 17
#define TGL_SCHEME_LAYER 45
struct connection;
struct mtproto_methods;
struct tgl_session;
struct tgl_dc;
#define TGL_UPDATE_CREATED 1
#define TGL_UPDATE_DELETED 2
#define TGL_UPDATE_PHONE 4
#define TGL_UPDATE_CONTACT 8
#define TGL_UPDATE_PHOTO 16
#define TGL_UPDATE_BLOCKED 32
#define TGL_UPDATE_REAL_NAME 64
#define TGL_UPDATE_NAME 128
#define TGL_UPDATE_REQUESTED 256
#define TGL_UPDATE_WORKING 512
#define TGL_UPDATE_FLAGS 1024
#define TGL_UPDATE_TITLE 2048
#define TGL_UPDATE_ADMIN 4096
#define TGL_UPDATE_MEMBERS 8192
#define TGL_UPDATE_ACCESS_HASH 16384
#define TGL_UPDATE_USERNAME (1 << 15)
/*struct tgl_allocator {
void *(*alloc)(size_t size);
void *(*realloc)(void *ptr, size_t old_size, size_t size);
void (*free)(void *ptr, int size);
void (*check)(void);
void (*exists)(void *ptr, int size);
};*/
struct tgl_allocator;
extern struct tgl_allocator tgl_allocator_release;
extern struct tgl_allocator tgl_allocator_debug;
struct tgl_state;
enum tgl_value_type {
tgl_phone_number, // user phone number
tgl_code, // telegram login code, or 'call' for phone call request
tgl_register_info, // "Y/n" register?, first name, last name
tgl_new_password, // new pass, confirm new pass
tgl_cur_and_new_password, // curr pass, new pass, confirm new pass
tgl_cur_password, // current pass
tgl_bot_hash
};
struct tgl_update_callback {
void (*new_msg)(struct tgl_state *TLS, struct tgl_message *M);
void (*marked_read)(struct tgl_state *TLS, int num, struct tgl_message *list[]);
void (*logprintf)(const char *format, ...) __attribute__ ((format (__printf__, 1, 2)));
void (*get_values)(struct tgl_state *TLS, enum tgl_value_type type, const char *prompt, int num_values,
void (*callback)(struct tgl_state *TLS, const char *string[], void *arg), void *arg);
void (*logged_in)(struct tgl_state *TLS);
void (*started)(struct tgl_state *TLS);
void (*type_notification)(struct tgl_state *TLS, struct tgl_user *U, enum tgl_typing_status status);
void (*type_in_chat_notification)(struct tgl_state *TLS, struct tgl_user *U, struct tgl_chat *C, enum tgl_typing_status status);
void (*type_in_secret_chat_notification)(struct tgl_state *TLS, struct tgl_secret_chat *E);
void (*status_notification)(struct tgl_state *TLS, struct tgl_user *U);
void (*user_registered)(struct tgl_state *TLS, struct tgl_user *U);
void (*user_activated)(struct tgl_state *TLS, struct tgl_user *U);
void (*new_authorization)(struct tgl_state *TLS, const char *device, const char *location);
void (*chat_update)(struct tgl_state *TLS, struct tgl_chat *C, unsigned flags);
void (*channel_update)(struct tgl_state *TLS, struct tgl_channel *C, unsigned flags);
void (*user_update)(struct tgl_state *TLS, struct tgl_user *C, unsigned flags);
void (*secret_chat_update)(struct tgl_state *TLS, struct tgl_secret_chat *C, unsigned flags);
void (*msg_receive)(struct tgl_state *TLS, struct tgl_message *M);
void (*our_id)(struct tgl_state *TLS, tgl_peer_id_t id);
void (*notification)(struct tgl_state *TLS, const char *type, const char *message);
void (*user_status_update)(struct tgl_state *TLS, struct tgl_user *U);
char *(*create_print_name) (struct tgl_state *TLS, tgl_peer_id_t id, const char *a1, const char *a2, const char *a3, const char *a4);
void (*on_failed_login) (struct tgl_state *TLS);
};
struct tgl_net_methods {
int (*write_out) (struct connection *c, const void *data, int len);
int (*read_in) (struct connection *c, void *data, int len);
int (*read_in_lookup) (struct connection *c, void *data, int len);
void (*flush_out) (struct connection *c);
void (*incr_out_packet_num) (struct connection *c);
void (*free) (struct connection *c);
struct tgl_dc *(*get_dc) (struct connection *c);
struct tgl_session *(*get_session) (struct connection *c);
struct connection *(*create_connection) (struct tgl_state *TLS, const char *host, int port, struct tgl_session *session, struct tgl_dc *dc, struct mtproto_methods *methods);
};
struct mtproto_methods {
int (*ready) (struct tgl_state *TLS, struct connection *c);
int (*close) (struct tgl_state *TLS, struct connection *c);
int (*execute) (struct tgl_state *TLS, struct connection *c, int op, int len);
};
struct tgl_timer;
struct tree_random_id;
struct tree_temp_id;
struct tgl_timer_methods {
struct tgl_timer *(*alloc) (struct tgl_state *TLS, void (*cb)(struct tgl_state *TLS, void *arg), void *arg);
void (*insert) (struct tgl_timer *t, double timeout);
void (*remove) (struct tgl_timer *t);
void (*free) (struct tgl_timer *t);
};
#define E_ERROR 0
#define E_WARNING 1
#define E_NOTICE 2
#define E_DEBUG 6
#define TGL_LOCK_DIFF 1
#define TGL_LOCK_PASSWORD 2
#define TGL_MAX_RSA_KEYS_NUM 10
// Do not modify this structure, unless you know what you do
#pragma pack(push,4)
struct tgl_state {
tgl_peer_id_t our_id;
int encr_root;
unsigned char *encr_prime;
TGLC_bn *encr_prime_bn;
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;
int disable_link_preview;
long long locks;
struct tgl_dc *DC_list[TGL_MAX_DC_NUM];
struct tgl_dc *DC_working;
int max_dc_num;
int dc_working_num;
int enable_pfs;
int temp_key_expire_time;
long long cur_uploading_bytes;
long long cur_uploaded_bytes;
long long cur_downloading_bytes;
long long cur_downloaded_bytes;
char *binlog_name;
char *auth_file;
char *downloads_directory;
struct tgl_update_callback callback;
struct tgl_net_methods *net_methods;
void *ev_base;
char *rsa_key_list[TGL_MAX_RSA_KEYS_NUM];
// (TGLC_rsa *)
void *rsa_key_loaded[TGL_MAX_RSA_KEYS_NUM];
long long rsa_key_fingerprint[TGL_MAX_RSA_KEYS_NUM];
int rsa_key_num;
TGLC_bn_ctx *TGLC_bn_ctx;
struct tgl_allocator *allocator;
struct tree_peer *peer_tree;
struct tree_peer_by_name *peer_by_name_tree;
struct tree_message *message_tree;
struct tree_message *message_unsent_tree;
struct tree_photo *photo_tree;
struct tree_document *document_tree;
struct tree_webpage *webpage_tree;
struct tree_encr_document *encr_document_tree;
int users_allocated;
int chats_allocated;
int messages_allocated;
int channels_allocated;
int peer_num;
int peer_size;
int encr_chats_allocated;
int geo_chats_allocated;
tgl_peer_t **Peers;
struct tgl_message message_list;
int binlog_fd;
struct tgl_timer_methods *timer_methods;
struct tree_query *queries_tree;
char *base_path;
struct tree_user *online_updates;
struct tgl_timer *online_updates_timer;
int app_id;
char *app_hash;
void *ev_login;
char *app_version;
int ipv6_enabled;
struct tree_random_id *random_id_tree;
struct tree_temp_id *temp_id_tree;
char *error;
int error_code;
int is_bot;
int last_temp_id;
};
#pragma pack(pop)
//extern struct tgl_state tgl_state;
#ifdef __cplusplus
extern "C" {
#endif
void tgl_reopen_binlog_for_writing (struct tgl_state *TLS);
void tgl_replay_log (struct tgl_state *TLS);
int tgl_print_stat (struct tgl_state *TLS, char *s, int len);
tgl_peer_t *tgl_peer_get (struct tgl_state *TLS, tgl_peer_id_t id);
tgl_peer_t *tgl_peer_get_by_name (struct tgl_state *TLS, const char *s);
struct tgl_message *tgl_message_get (struct tgl_state *TLS, tgl_message_id_t *id);
void tgl_peer_iterator_ex (struct tgl_state *TLS, void (*it)(tgl_peer_t *P, void *extra), void *extra);
int tgl_complete_user_list (struct tgl_state *TLS, int index, const char *text, int len, char **R);
int tgl_complete_chat_list (struct tgl_state *TLS, int index, const char *text, int len, char **R);
int tgl_complete_encr_chat_list (struct tgl_state *TLS, int index, const char *text, int len, char **R);
int tgl_complete_peer_list (struct tgl_state *TLS, int index, const char *text, int len, char **R);
int tgl_complete_channel_list (struct tgl_state *TLS, int index, const char *text, int len, char **R);
int tgl_secret_chat_for_user (struct tgl_state *TLS, tgl_peer_id_t user_id);
int tgl_do_send_bot_auth (struct tgl_state *TLS, const char *code, int code_len, void (*callback)(struct tgl_state *TLS, void *callback_extra, int success, struct tgl_user *Self), void *callback_extra);
#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_CHANNEL 5
#define TGL_PEER_TEMP_ID 100
#define TGL_PEER_RANDOM_ID 101
#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_CHANNEL(id) tgl_set_peer_id (TGL_PEER_CHANNEL,id)
#define TGL_MK_GEO_CHAT(id) tgl_set_peer_id (TGL_PEER_GEO_CHAT,id)
#define TGL_MK_ENCR_CHAT(id) tgl_set_peer_id (TGL_PEER_ENCR_CHAT,id)
void tgl_set_binlog_mode (struct tgl_state *TLS, int mode);
void tgl_set_binlog_path (struct tgl_state *TLS, const char *path);
void tgl_set_auth_file_path (struct tgl_state *TLS, const char *path);
void tgl_set_download_directory (struct tgl_state *TLS, const char *path);
void tgl_set_callback (struct tgl_state *TLS, struct tgl_update_callback *cb);
void tgl_set_rsa_key (struct tgl_state *TLS, const char *key);
void tgl_set_rsa_key_direct (struct tgl_state *TLS, unsigned long e, int n_bytes, const unsigned char *n);
void tgl_set_app_version (struct tgl_state *TLS, const char *app_version);
static inline int tgl_get_peer_type (tgl_peer_id_t id) {
return id.peer_type;
}
static inline int tgl_get_peer_id (tgl_peer_id_t id) {
return id.peer_id;
}
static inline tgl_peer_id_t tgl_set_peer_id (int type, int id) {
tgl_peer_id_t ID;
ID.peer_id = id;
ID.peer_type = type;
ID.access_hash = 0;
return ID;
}
static inline int tgl_cmp_peer_id (tgl_peer_id_t a, tgl_peer_id_t b) {
return memcmp (&a, &b, 8);
}
void tgl_incr_verbosity (struct tgl_state *TLS);
void tgl_set_verbosity (struct tgl_state *TLS, int val);
void tgl_enable_pfs (struct tgl_state *TLS);
void tgl_set_test_mode (struct tgl_state *TLS);
void tgl_set_net_methods (struct tgl_state *TLS, struct tgl_net_methods *methods);
void tgl_set_timer_methods (struct tgl_state *TLS, struct tgl_timer_methods *methods);
void tgl_set_ev_base (struct tgl_state *TLS, void *ev_base);
int tgl_authorized_dc (struct tgl_state *TLS, struct tgl_dc *DC);
int tgl_signed_dc (struct tgl_state *TLS, struct tgl_dc *DC);
int tgl_init (struct tgl_state *TLS);
void tgl_dc_authorize (struct tgl_state *TLS, struct tgl_dc *DC);
void tgl_dc_iterator (struct tgl_state *TLS, void (*iterator)(struct tgl_dc *DC));
void tgl_dc_iterator_ex (struct tgl_state *TLS, void (*iterator)(struct tgl_dc *DC, void *extra), void *extra);
#define TGL_SEND_MSG_FLAG_DISABLE_PREVIEW 1
#define TGL_SEND_MSG_FLAG_ENABLE_PREVIEW 2
#define TGL_SEND_MSG_FLAG_DOCUMENT_IMAGE TGLDF_IMAGE
#define TGL_SEND_MSG_FLAG_DOCUMENT_STICKER TGLDF_STICKER
#define TGL_SEND_MSG_FLAG_DOCUMENT_ANIMATED TGLDF_ANIMATED
#define TGL_SEND_MSG_FLAG_DOCUMENT_AUDIO TGLDF_AUDIO
#define TGL_SEND_MSG_FLAG_DOCUMENT_VIDEO TGLDF_VIDEO
#define TGL_SEND_MSG_FLAG_DOCUMENT_AUTO 32
#define TGL_SEND_MSG_FLAG_DOCUMENT_PHOTO 64
#define TGL_SEND_MSG_FLAG_REPLY(x) (((unsigned long long)x) << 32)
typedef tgl_peer_id_t tgl_user_id_t;
typedef tgl_peer_id_t tgl_chat_id_t;
typedef tgl_peer_id_t tgl_secret_chat_id_t;
typedef tgl_peer_id_t tgl_user_or_chat_id_t;
void tgl_insert_empty_user (struct tgl_state *TLS, int id);
void tgl_insert_empty_chat (struct tgl_state *TLS, int id);
void tgl_free_all (struct tgl_state *TLS);
void tgl_register_app_id (struct tgl_state *TLS, int app_id, const char *app_hash);
void tgl_login (struct tgl_state *TLS);
void tgl_enable_ipv6 (struct tgl_state *TLS);
void tgl_enable_bot (struct tgl_state *TLS);
struct tgl_state *tgl_state_alloc (void);
void tgl_disable_link_preview (struct tgl_state *TLS);
void tgl_do_lookup_state (struct tgl_state *TLS);
long long tgl_get_allocated_bytes (void);
#ifdef __cplusplus
}
#endif
#endif
|