diff --git a/binlog.c b/binlog.c index 1b16644..5736d03 100644 --- a/binlog.c +++ b/binlog.c @@ -82,6 +82,7 @@ static int fetch_comb_binlog_dc_option (void *extra) { vlogprintf (E_NOTICE, "DC%d '%.*s' update: %.*s:%d\n", id, l1, name, l2, ip, port); tglmp_alloc_dc (id, tstrndup (ip, l2), port); + return 0; } diff --git a/binlog.h b/binlog.h index af22f6e..1dbcdb8 100644 --- a/binlog.h +++ b/binlog.h @@ -19,7 +19,7 @@ #ifndef __BINLOG_H__ #define __BINLOG_H__ -#include "structures.h" +//#include "structures.h" void bl_do_set_auth_key_id (int num, unsigned char *buf); diff --git a/loop.c b/loop.c index b266e2c..29b7eb6 100644 --- a/loop.c +++ b/loop.c @@ -43,12 +43,16 @@ #include #include +#include + #include "interface.h" #include "telegram.h" #include "loop.h" #include "lua-tg.h" #include "tgl.h" +int verbosity; + extern char *default_username; extern char *auth_token; void set_default_username (const char *s); @@ -61,37 +65,27 @@ extern int safe_quit; extern int queries_num; void got_it (char *line, int len); -void net_loop (int flags, int (*is_end)(void)) { - while (!is_end ()) { - struct pollfd fds[101]; - int cc = 0; - if (flags & 3) { - fds[0].fd = 0; - fds[0].events = POLLIN; - cc ++; - } - //write_state_file (); - int x = connections_make_poll_array (fds + cc, 101 - cc) + cc; - double timer = next_timer_in (); - if (timer > 1000) { timer = 1000; } - if (poll (fds, x, timer) < 0) { - work_timers (); - continue; - } - work_timers (); - if ((flags & 3) && (fds[0].revents & POLLIN)) { - tgl_state.unread_messages = 0; - if (flags & 1) { - rl_callback_read_char (); - } else { - char *line = 0; - size_t len = 0; - assert (getline (&line, &len, stdin) >= 0); - got_it (line, strlen (line)); - } - } - connections_poll_result (fds + cc, x - cc); +static void stdin_read_callback (evutil_socket_t fd, short what, void *arg) { + if (((long)arg) & 1) { + rl_callback_read_char (); + } else { + char *line = 0; + size_t len = 0; + assert (getline (&line, &len, stdin) >= 0); + got_it (line, strlen (line)); + } +} +void net_loop (int flags, int (*is_end)(void)) { + struct event *ev = 0; + if (flags & 3) { + ev = event_new (tgl_state.ev_base, 0, EV_READ | EV_PERSIST, stdin_read_callback, (void *)(long)flags); + event_add (ev, 0); + } + while (!is_end || !is_end ()) { + + event_base_loop (tgl_state.ev_base, EVLOOP_ONCE); + #ifdef USE_LUA lua_do_all (); #endif @@ -101,10 +95,17 @@ void net_loop (int flags, int (*is_end)(void)) { exit (0); } if (unknown_user_list_pos) { - tgl_do_get_user_list_info_silent (unknown_user_list_pos, unknown_user_list); + int i; + for (i = 0; i < unknown_user_list_pos; i++) { + tgl_do_get_user_info (TGL_MK_USER (unknown_user_list[i]), 0, 0, 0); + } unknown_user_list_pos = 0; } } + + if (ev) { + event_free (ev); + } } char **_s; @@ -134,30 +135,74 @@ int net_getline (char **s, size_t *l) { return 0; } -int ret1 (void) { return 0; } - int main_loop (void) { - net_loop (1, ret1); + net_loop (1, 0); return 0; } -char *get_auth_key_filename (void); -char *get_state_filename (void); -char *get_secret_chat_filename (void); +struct dc *cur_a_dc; +int is_authorized (void) { + return tgl_authorized_dc (cur_a_dc); +} + +int config_got; + +int got_config (void) { + return config_got; +} + +void on_get_config (void *extra, int success) { + if (!success) { + logprintf ("Can not get config.\n"); + exit (1); + } + config_got = 1; + +} + +int should_register; +char *hash; +void sign_in_callback (void *extra, int success, int registered, const char *mhash) { + if (!success) { + logprintf ("Can not send code\n"); + exit (1); + } + should_register = !registered; + hash = strdup (mhash); +} + + +int signed_in_ok; + +void sign_in_result (void *extra, int success, struct tgl_user *U) { + if (!success) { + logprintf ("Can not login\n"); + exit (1); + } + signed_in_ok = 1; +} + +int signed_in (void) { + return signed_in_ok; +} + +int sent_code (void) { + return hash != 0; +} + +int dc_signed_in (void) { + return tgl_signed_dc (cur_a_dc); +} + +void export_auth_callback (void *DC, int success) { + if (!success) { + logprintf ("Can not export auth\n"); + exit (1); + } +} + int zero[512]; -extern int max_chat_size; -int mcs (void) { - return max_chat_size; -} - -extern int difference_got; -int dgot (void) { - return difference_got; -} -int dlgot (void) { - return dialog_list_got; -} int readline_active; int new_dc_num; @@ -167,43 +212,37 @@ int loop (void) { //on_start (); tgl_init (); - double t = get_double_time (); + double t = tglt_get_double_time (); logprintf ("replay log start\n"); tgl_replay_log (); - logprintf ("replay log end in %lf seconds\n", get_double_time () - t); + logprintf ("replay log end in %lf seconds\n", tglt_get_double_time () - t); tgl_reopen_binlog_for_writing (); #ifdef USE_LUA lua_binlog_end (); #endif update_prompt (); - assert (DC_list[dc_working_num]); - if (!DC_working || !DC_working->auth_key_id) { -// if (auth_state == 0) { - DC_working = DC_list[dc_working_num]; - assert (!DC_working->auth_key_id); - dc_authorize (DC_working); - assert (DC_working->auth_key_id); - auth_state = 100; - write_auth_file (); + if (!tgl_authorized_dc (tgl_state.DC_working)) { + cur_a_dc = tgl_state.DC_working; + tgl_dc_authorize (tgl_state.DC_working); + net_loop (0, is_authorized); } - if (verbosity) { - logprintf ("Requesting info about DC...\n"); - } - tgl_do_help_get_config (); - net_loop (0, mcs); + tgl_do_help_get_config (on_get_config, 0); + net_loop (0, got_config); + if (verbosity) { logprintf ("DC_info: %d new DC got\n", new_dc_num); } + int i; - for (i = 0; i <= MAX_DC_NUM; i++) if (DC_list[i] && !DC_list[i]->auth_key_id) { - dc_authorize (DC_list[i]); - assert (DC_list[i]->auth_key_id); - write_auth_file (); + for (i = 0; i <= tgl_state.max_dc_num; i++) if (tgl_state.DC_list[i] && !tgl_authorized_dc (tgl_state.DC_list[i])) { + cur_a_dc = tgl_state.DC_list[i]; + tgl_dc_authorize (cur_a_dc); + net_loop (0, is_authorized); } - if (auth_state == 100 || !(DC_working->has_auth)) { + if (!tgl_signed_dc (tgl_state.DC_working)) { if (!default_username) { size_t size = 0; char *user = 0; @@ -217,11 +256,11 @@ int loop (void) { set_default_username (user); } } - int res = tgl_do_auth_check_phone (default_username); - assert (res >= 0); - logprintf ("%s\n", res > 0 ? "phone registered" : "phone not registered"); - if (res > 0 && !register_mode) { - tgl_do_send_code (default_username); + tgl_do_send_code (default_username, sign_in_callback, 0); + net_loop (0, sent_code); + + logprintf ("%s\n", should_register ? "phone not registered" : "phone registered"); + if (!should_register) { char *code = 0; size_t size = 0; printf ("Code from sms (if you did not receive an SMS and want to be called, type \"call\"): "); @@ -232,17 +271,16 @@ int loop (void) { } if (!strcmp (code, "call")) { printf ("You typed \"call\", switching to phone system.\n"); - tgl_do_phone_call (default_username); + tgl_do_phone_call (default_username, hash, 0, 0); printf ("Calling you! Code: "); continue; } - if (tgl_do_send_code_result (code) >= 0) { + if (tgl_do_send_code_result (default_username, hash, code, sign_in_result, 0) >= 0) { break; } printf ("Invalid code. Try again: "); - tfree_str (code); + free (code); } - auth_state = 300; } else { printf ("User is not registered. Do you want to register? [Y/n] "); char *code; @@ -269,13 +307,6 @@ int loop (void) { perror ("getline()"); exit (EXIT_FAILURE); } - - int dc_num = tgl_do_get_nearest_dc (); - assert (dc_num >= 0 && dc_num <= MAX_DC_NUM && DC_list[dc_num]); - dc_working_num = dc_num; - DC_working = DC_list[dc_working_num]; - - tgl_do_send_code (default_username); printf ("Code from sms (if you did not receive an SMS and want to be called, type \"call\"): "); while (1) { if (net_getline (&code, &size) == -1) { @@ -284,37 +315,38 @@ int loop (void) { } if (!strcmp (code, "call")) { printf ("You typed \"call\", switching to phone system.\n"); - tgl_do_phone_call (default_username); + tgl_do_phone_call (default_username, hash, 0, 0); printf ("Calling you! Code: "); continue; } - if (tgl_do_send_code_result_auth (code, first_name, last_name) >= 0) { + if (tgl_do_send_code_result_auth (default_username, hash, code, first_name, last_name, sign_in_result, 0) >= 0) { break; } printf ("Invalid code. Try again: "); - tfree_str (code); + free (code); } - auth_state = 300; } + + net_loop (0, signed_in); + bl_do_dc_signed (tgl_state.DC_working); } - for (i = 0; i <= MAX_DC_NUM; i++) if (DC_list[i] && !DC_list[i]->has_auth) { - tgl_do_export_auth (i); - tgl_do_import_auth (i); - bl_do_dc_signed (i); - write_auth_file (); + for (i = 0; i <= tgl_state.max_dc_num; i++) if (tgl_state.DC_list[i] && !tgl_signed_dc (tgl_state.DC_list[i])) { + tgl_do_export_auth (i, export_auth_callback, (void*)(long)tgl_state.DC_list[i]); + cur_a_dc = tgl_state.DC_working; + net_loop (0, dc_signed_in); } - write_auth_file (); + //write_auth_file (); fflush (stdout); fflush (stderr); - read_state_file (); - read_secret_chat_file (); + //read_state_file (); + //read_secret_chat_file (); set_interface_callbacks (); - tgl_do_get_difference (); + tgl_do_get_difference (0, 0); net_loop (0, dgot); #ifdef USE_LUA lua_diff_end (); diff --git a/main.c b/main.c index 0f5195b..c479804 100644 --- a/main.c +++ b/main.c @@ -374,7 +374,6 @@ void usage (void) { printf (" -N message num mode\n"); printf (" -c config-file specify config file\n"); printf (" -p prefix specify prefix\n"); - printf (" -R register mode\n"); printf (" -f sync from start\n"); printf (" -B enable binlog\n"); printf (" -E disable auto accept\n"); @@ -400,7 +399,7 @@ char *lua_file; void args_parse (int argc, char **argv) { int opt = 0; - while ((opt = getopt (argc, argv, "u:hk:vn:Nc:p:l:RfBL:Es:wW")) != -1) { + while ((opt = getopt (argc, argv, "u:hk:vn:Nc:p:l:fBEs:wW")) != -1) { switch (opt) { case 'u': set_default_username (optarg); @@ -425,23 +424,23 @@ void args_parse (int argc, char **argv) { case 'l': log_level = atoi (optarg); break; - case 'R': - register_mode = 1; - break; + //case 'R': + // register_mode = 1; + // break; case 'f': sync_from_start = 1; break; case 'B': binlog_enabled = 1; break; - case 'L': - if (log_net_file) { - usage (); - } - log_net_file = tstrdup (optarg); - log_net_f = fopen (log_net_file, "a"); - assert (log_net_f); - break; + //case 'L': + // if (log_net_file) { + // usage (); + // } + // log_net_file = tstrdup (optarg); + // log_net_f = fopen (log_net_file, "a"); + // assert (log_net_f); + // break; case 'E': disable_auto_accept = 1; break; diff --git a/mtproto-client.c b/mtproto-client.c index ce641f2..6949f00 100644 --- a/mtproto-client.c +++ b/mtproto-client.c @@ -1158,6 +1158,9 @@ struct dc *tglmp_alloc_dc (int id, char *ip, int port UU) { DC->ip = ip; DC->port = port; tgl_state.DC_list[id] = DC; + if (id > tgl_state.max_dc_num) { + tgl_state.max_dc_num = id; + } return DC; } @@ -1171,7 +1174,7 @@ void tglmp_dc_create_session (struct dc *DC) { struct session *S = talloc0 (sizeof (*S)); assert (RAND_pseudo_bytes ((unsigned char *) &S->session_id, 8) >= 0); S->dc = DC; - S->c = tgl_state.net_methods->create_connection (DC->ip, DC->port, DC, S, &mtproto_methods); + S->c = tgl_state.net_methods->create_connection (DC->ip, DC->port, S, DC, &mtproto_methods); if (!S->c) { vlogprintf (E_DEBUG, "Can not create connection to DC. Is network down?\n"); exit (1); diff --git a/net.c b/net.c index 16ff6c9..52113ab 100644 --- a/net.c +++ b/net.c @@ -244,7 +244,7 @@ static void conn_try_write (evutil_socket_t fd, short what, void *arg) { } } -struct connection *tgln_create_connection (const char *host, int port, struct session *session, struct mtproto_methods *methods) { +struct connection *tgln_create_connection (const char *host, int port, struct session *session, struct dc *dc, struct mtproto_methods *methods) { struct connection *c = talloc0 (sizeof (*c)); int fd = socket (AF_INET, SOCK_STREAM, 0); if (fd == -1) { @@ -294,6 +294,10 @@ struct connection *tgln_create_connection (const char *host, int port, struct se 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); @@ -569,3 +573,26 @@ void tgl_connections_poll_result (struct pollfd *fds, int max) { } } } + +static void incr_out_packet_num (struct connection *c) { + c->out_packet_num ++; +} + +static struct dc *get_dc (struct connection *c) { + return c->dc; +} + +static struct session *get_session (struct connection *c) { + return c->session; +} + +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 +}; diff --git a/net.h b/net.h index 563bdb5..ca90624 100644 --- a/net.h +++ b/net.h @@ -71,6 +71,7 @@ struct connection { int in_fail_timer; struct mtproto_methods *methods; struct session *session; + struct dc *dc; void *extra; struct event *ping_ev; struct event *fail_ev; @@ -88,13 +89,14 @@ int tgln_read_in_lookup (struct connection *c, void *data, int len); void tgln_insert_msg_id (struct 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 session *session, struct connection_methods *methods); struct dc *tgln_alloc_dc (int id, char *ip, int port); void tgln_dc_create_session (struct dc *DC, struct mtproto_methods *methods); -struct connection *tgln_create_connection (const char *host, int port, struct session *session, struct mtproto_methods *methods); +struct connection *tgln_create_connection (const char *host, int port, struct session *session, struct dc *dc, struct mtproto_methods *methods); #define GET_DC(c) (c->session->dc) #endif diff --git a/queries.c b/queries.c index 0a30112..20e4951 100644 --- a/queries.c +++ b/queries.c @@ -368,8 +368,8 @@ void tgl_do_help_get_config (void (*callback)(void *, int), void *callback_extra /* }}} */ /* {{{ Send code */ -static char *phone_code_hash; static int send_code_on_answer (struct query *q UU) { + static char *phone_code_hash; assert (fetch_int () == (int)CODE_auth_sent_code); int registered = fetch_bool (); int l = prefetch_strlen (); @@ -380,7 +380,8 @@ static int send_code_on_answer (struct query *q UU) { phone_code_hash = tstrndup (s, l); fetch_int (); fetch_bool (); - want_dc_num = -1; + tfree_str (q->extra); + if (q->callback) { ((void (*)(void *, int, int, const char *))(q->callback)) (q->callback_extra, 1, registered, phone_code_hash); } @@ -390,6 +391,7 @@ static int send_code_on_answer (struct query *q UU) { static int send_code_on_error (struct query *q UU, int error_code, int l, char *error) { int s = strlen ("PHONE_MIGRATE_"); int s2 = strlen ("NETWORK_MIGRATE_"); + int want_dc_num = 0; if (l >= s && !memcmp (error, "PHONE_MIGRATE_", s)) { int i = error[s] - '0'; want_dc_num = i; @@ -400,9 +402,13 @@ static int send_code_on_error (struct query *q UU, int error_code, int l, char * vlogprintf (E_ERROR, "error_code = %d, error = %.*s\n", error_code, l, error); assert (0); } - if (q->callback) { - ((void (*)(void *, int, int, const char *))(q->callback)) (q->callback_extra, 0, 0, 0); - } + bl_do_set_working_dc (want_dc_num); + //if (q->callback) { + // ((void (*)(void *, int, int, const char *))(q->callback)) (q->callback_extra, 0, 0, 0); + //} + assert (DC_working->id == want_dc_num); + tgl_do_send_code (q->extra, q->callback, q->callback_extra); + tfree_str (q->extra); return 0; } @@ -413,11 +419,10 @@ static struct query_methods send_code_methods = { }; //char *suser; -extern int dc_working_num; +//extern int dc_working_num; void tgl_do_send_code (const char *user, void (*callback)(void *callback_extra, int success, int registered, const char *hash), void *callback_extra) { - vlogprintf (E_DEBUG, "sending code to dc %d\n", dc_working_num); + vlogprintf (E_DEBUG, "sending code to dc %d\n", tgl_state.dc_working_num); //suser = tstrdup (user); - want_dc_num = 0; clear_packet (); tgl_do_insert_header (); out_int (CODE_auth_send_code); @@ -427,7 +432,7 @@ void tgl_do_send_code (const char *user, void (*callback)(void *callback_extra, out_string (TG_APP_HASH); out_string ("en"); - tglq_send_query (DC_working, packet_ptr - packet_buffer, packet_buffer, &send_code_methods, 0, callback, callback_extra); + tglq_send_query (DC_working, packet_ptr - packet_buffer, packet_buffer, &send_code_methods, tstrdup (user), callback, callback_extra); } @@ -444,7 +449,7 @@ static struct query_methods phone_call_methods = { .type = TYPE_TO_PARAM(bool) }; -void tgl_do_phone_call (const char *user, void (*callback)(void *callback_extra, int success), void *callback_extra) { +void tgl_do_phone_call (const char *user, const char *hash,void (*callback)(void *callback_extra, int success), void *callback_extra) { vlogprintf (E_DEBUG, "calling user\n"); //suser = tstrdup (user); want_dc_num = 0; @@ -452,7 +457,7 @@ void tgl_do_phone_call (const char *user, void (*callback)(void *callback_extra, tgl_do_insert_header (); out_int (CODE_auth_send_call); out_string (user); - out_string (phone_code_hash); + out_string (hash); tglq_send_query (DC_working, packet_ptr - packet_buffer, packet_buffer, &phone_call_methods, 0, callback, callback_extra); } @@ -581,21 +586,21 @@ static struct query_methods sign_in_methods = { .type = TYPE_TO_PARAM(auth_authorization) }; -int tgl_do_send_code_result (const char *user, const char *code, void (*callback)(void *callback_extra, int success, struct tgl_user *Self), 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) { clear_packet (); out_int (CODE_auth_sign_in); out_string (user); - out_string (phone_code_hash); + out_string (hash); out_string (code); tglq_send_query (DC_working, packet_ptr - packet_buffer, packet_buffer, &sign_in_methods, 0, callback, callback_extra); return 0; } -int tgl_do_send_code_result_auth (const char *user, 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) { +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) { clear_packet (); out_int (CODE_auth_sign_up); out_string (user); - out_string (phone_code_hash); + out_string (hash); out_string (code); out_string (first_name); out_string (last_name); @@ -2115,6 +2120,8 @@ static int import_auth_on_answer (struct query *q UU) { assert (fetch_int () == (int)CODE_auth_authorization); fetch_int (); // expires tglf_fetch_alloc_user (); + + bl_do_dc_signed (((struct dc *)q->extra)->id); if (q->callback) { ((void (*)(void *, int))q->callback) (q->callback_extra, 1); @@ -2140,7 +2147,7 @@ static int export_auth_on_answer (struct query *q UU) { out_int (CODE_auth_import_authorization); out_int (tgl_state.our_id); out_cstring (s, l); - tglq_send_query (q->extra, packet_ptr - packet_buffer, packet_buffer, &import_auth_methods, 0, q->callback, q->callback_extra); + tglq_send_query (q->extra, packet_ptr - packet_buffer, packet_buffer, &import_auth_methods, q->extra, q->callback, q->callback_extra); tfree (s, l); return 0; } diff --git a/tgl.c b/tgl.c index d6c400d..dc9c730 100644 --- a/tgl.c +++ b/tgl.c @@ -5,6 +5,7 @@ #include "tgl.h" #include "tools.h" #include "mtproto-client.h" +#include "net.h" #include struct tgl_state tgl_state; @@ -36,5 +37,19 @@ void tgl_set_rsa_key (const char *key) { void tgl_init (void) { tgl_state.ev_base = event_base_new (); + + if (!tgl_state.net_methods) { + tgl_state.net_methods = &tgl_conn_methods; + } tglmp_on_start (tgl_state.rsa_key); } + +int tgl_authorized_dc (struct dc *DC) { + assert (DC); + return DC->auth_key_id; +} + +int tgl_signed_dc (struct dc *DC) { + assert (DC); + return DC->has_auth; +} diff --git a/tgl.h b/tgl.h index 5fcec37..f9fe339 100644 --- a/tgl.h +++ b/tgl.h @@ -31,15 +31,15 @@ struct tgl_update_callback { }; struct tgl_net_methods { - int (*write_out) (struct connection *c, void *data, int len); + 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); - int (*flush_out) (struct connection *c); + void (*flush_out) (struct connection *c); void (*incr_out_packet_num) (struct connection *c); struct dc *(*get_dc) (struct connection *c); struct session *(*get_session) (struct connection *c); - struct connection *(*create_connection) (const char *host, int port, struct dc *dc, struct session *session, struct mtproto_methods *methods); + struct connection *(*create_connection) (const char *host, int port, struct session *session, struct dc *dc, struct mtproto_methods *methods); }; @@ -64,6 +64,7 @@ struct tgl_state { struct dc *DC_list[TGL_MAX_DC_NUM]; struct dc *DC_working; + int max_dc_num; int dc_working_num; long long cur_uploading_bytes; @@ -154,9 +155,9 @@ 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, void (*callback)(void *callback_extra, int success), void *callback_extra); -int tgl_do_send_code_result (const char *user, 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 *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_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); @@ -195,6 +196,9 @@ 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 dc *DC); +int tgl_signed_dc (struct dc *DC); + //void tgl_do_get_suggested (void); void tgl_do_create_keys_end (struct tgl_secret_chat *U); @@ -208,4 +212,7 @@ struct mtproto_methods { void tgl_init (void); void tgl_dc_authorize (struct dc *DC); + + +double tglt_get_double_time (void); #endif diff --git a/tools.h b/tools.h index f4097cc..48aaf30 100644 --- a/tools.h +++ b/tools.h @@ -20,7 +20,7 @@ #ifndef __TOOLS_H__ #define __TOOLS_H__ -double get_double_time (void); +double tglt_get_double_time (void); void *talloc (size_t size); void *trealloc (void *ptr, size_t old_size, size_t size);