diff --git a/mtproto-client.c b/mtproto-client.c index 88fc17b..c2a66d8 100644 --- a/mtproto-client.c +++ b/mtproto-client.c @@ -1052,6 +1052,16 @@ void work_packed (struct connection *c, long long msg_id) { in_gzip = 0; } +void work_bad_server_salt (struct connection *c UU, long long msg_id UU) { + assert (fetch_int () == (int)CODE_bad_server_salt); + long long id = fetch_long (); + query_restart (id); + fetch_int (); // seq_no + fetch_int (); // error_code + long long new_server_salt = fetch_long (); + GET_DC(c)->server_salt = new_server_salt; +} + void rpc_execute_answer (struct connection *c, long long msg_id UU) { if (verbosity >= 5) { hexdump_in (); @@ -1085,6 +1095,9 @@ void rpc_execute_answer (struct connection *c, long long msg_id UU) { case CODE_gzip_packed: work_packed (c, msg_id); return; + case CODE_bad_server_salt: + work_bad_server_salt (c, msg_id); + return; } logprintf ( "Unknown message: \n"); hexdump_in (); diff --git a/queries.c b/queries.c index 073188e..f265931 100644 --- a/queries.c +++ b/queries.c @@ -74,6 +74,14 @@ int alarm_query (struct query *q) { return 0; } +void query_restart (long long id) { + struct query *q = query_get (id); + if (q) { + remove_event_timer (&q->ev); + alarm_query (q); + } +} + struct query *send_query (struct dc *DC, int ints, void *data, struct query_methods *methods, void *extra) { assert (DC); assert (DC->auth_key_id); diff --git a/queries.h b/queries.h index 191e4ac..ea58741 100644 --- a/queries.h +++ b/queries.h @@ -53,6 +53,7 @@ struct query *send_query (struct dc *DC, int len, void *data, struct query_metho void query_ack (long long id); void query_error (long long id); void query_result (long long id); +void query_restart (long long id); void insert_event_timer (struct event_timer *ev); void remove_event_timer (struct event_timer *ev);