Chats added to binlog

This commit is contained in:
Vysheng 2013-11-23 03:26:35 +04:00
parent 03662e35af
commit 6fea158478
7 changed files with 289 additions and 36 deletions

166
binlog.c
View File

@ -543,6 +543,79 @@ void replay_log_event (void) {
rptr ++; rptr ++;
seq = *(rptr ++); seq = *(rptr ++);
break; break;
case CODE_binlog_chat_create:
in_ptr ++;
{
peer_id_t id = MK_CHAT (fetch_int ());
peer_t *_C = user_chat_get (id);
if (!_C) {
_C = malloc (sizeof (*_C));
memset (_C, 0, sizeof (*_C));
_C->id = id;
insert_chat (_C);
} else {
assert (!(_C->flags & FLAG_CREATED));
}
struct chat *C = &_C->chat;
C->flags = FLAG_CREATED | fetch_int ();
C->title = fetch_str_dup ();
C->print_title = create_print_name (id, C->title, 0, 0, 0);
C->users_num = fetch_int ();
C->date = fetch_int ();
C->version = fetch_int ();
fetch_data (&C->photo_big, sizeof (struct file_location));
fetch_data (&C->photo_small, sizeof (struct file_location));
};
rptr = in_ptr;
break;
case CODE_binlog_chat_change_flags:
rptr ++;
{
peer_t *C = user_chat_get (MK_CHAT (*(rptr ++)));
assert (C && (C->flags & FLAG_CREATED));
C->flags |= *(rptr ++);
C->flags &= ~*(rptr ++);
};
break;
case CODE_binlog_set_chat_title:
in_ptr ++;
{
peer_t *_C = user_chat_get (MK_CHAT (fetch_int ()));
assert (_C && (_C->flags & FLAG_CREATED));
struct chat *C = &_C->chat;
if (C->title) { free (C->title); }
C->title = fetch_str_dup ();
C->print_title = create_print_name (C->id, C->title, 0, 0, 0);
};
rptr = in_ptr;
break;
case CODE_binlog_set_chat_photo:
in_ptr ++;
{
peer_t *C = user_chat_get (MK_CHAT (fetch_int ()));
assert (C && (C->flags & FLAG_CREATED));
fetch_data (&C->photo_big, sizeof (struct file_location));
fetch_data (&C->photo_small, sizeof (struct file_location));
};
rptr = in_ptr;
break;
case CODE_binlog_set_chat_date:
rptr ++;
{
peer_t *C = user_chat_get (MK_CHAT (*(rptr ++)));
assert (C && (C->flags & FLAG_CREATED));
C->chat.date = *(rptr ++);
};
break;
case CODE_binlog_set_chat_version:
rptr ++;
{
peer_t *C = user_chat_get (MK_CHAT (*(rptr ++)));
assert (C && (C->flags & FLAG_CREATED));
C->chat.version = *(rptr ++);
C->chat.users_num = *(rptr ++);
};
break;
case CODE_update_user_photo: case CODE_update_user_photo:
case CODE_update_user_name: case CODE_update_user_name:
work_update_binlog (); work_update_binlog ();
@ -954,3 +1027,96 @@ void bl_do_set_seq (int seq) {
ev[1] = seq; ev[1] = seq;
add_log_event (ev, 8); add_log_event (ev, 8);
} }
void bl_do_create_chat (struct chat *C, int y, const char *s, int l, int users_num, int date, int version, struct file_location *big, struct file_location *small) {
clear_packet ();
out_int (CODE_binlog_chat_create);
out_int (get_peer_id (C->id));
out_int (y);
out_cstring (s, l);
out_int (users_num);
out_int (date);
out_int (version);
out_data (big, sizeof (struct file_location));
out_data (small, sizeof (struct file_location));
add_log_event (packet_buffer, 4 * (packet_ptr - packet_buffer));
}
void bl_do_chat_forbid (struct chat *C, int on) {
if (on) {
if (C->flags & FLAG_FORBIDDEN) { return; }
int *ev = alloc_log_event (16);
ev[0] = CODE_binlog_chat_change_flags;
ev[1] = get_peer_id (C->id);
ev[2] = FLAG_FORBIDDEN;
ev[3] = 0;
add_log_event (ev, 16);
} else {
if (!(C->flags & FLAG_FORBIDDEN)) { return; }
int *ev = alloc_log_event (16);
ev[0] = CODE_binlog_chat_change_flags;
ev[1] = get_peer_id (C->id);
ev[2] = 0;
ev[3] = FLAG_FORBIDDEN;
add_log_event (ev, 16);
}
}
void bl_do_set_chat_title (struct chat *C, const char *s, int l) {
if (C->title && (int)strlen (C->title) == l && !strncmp (C->title, s, l)) { return; }
clear_packet ();
out_int (CODE_binlog_set_chat_title);
out_int (get_peer_id (C->id));
out_cstring (s, l);
add_log_event (packet_buffer, 4 * (packet_ptr - packet_buffer));
}
void bl_do_set_chat_photo (struct chat *C, struct file_location *big, struct file_location *small) {
if (!memcmp (&C->photo_small, small, sizeof (struct file_location)) &&
!memcmp (&C->photo_big, big, sizeof (struct file_location))) { return; }
clear_packet ();
out_int (CODE_binlog_set_chat_photo);
out_int (get_peer_id (C->id));
out_data (big, sizeof (struct file_location));
out_data (small, sizeof (struct file_location));
add_log_event (packet_buffer, 4 * (packet_ptr - packet_buffer));
}
void bl_do_set_chat_date (struct chat *C, int date) {
if (C->date == date) { return; }
int *ev = alloc_log_event (12);
ev[0] = CODE_binlog_set_chat_date;
ev[1] = get_peer_id (C->id);
ev[2] = date;
add_log_event (ev, 12);
}
void bl_do_set_chat_set_in_chat (struct chat *C, int on) {
if (on) {
if (C->flags & FLAG_CHAT_IN_CHAT) { return; }
int *ev = alloc_log_event (16);
ev[0] = CODE_binlog_chat_change_flags;
ev[1] = get_peer_id (C->id);
ev[2] = FLAG_CHAT_IN_CHAT;
ev[3] = 0;
add_log_event (ev, 16);
} else {
if (!(C->flags & FLAG_CHAT_IN_CHAT)) { return; }
int *ev = alloc_log_event (16);
ev[0] = CODE_binlog_chat_change_flags;
ev[1] = get_peer_id (C->id);
ev[2] = 0;
ev[3] = FLAG_CHAT_IN_CHAT;
add_log_event (ev, 16);
}
}
void bl_do_set_chat_version (struct chat *C, int version, int user_num) {
if (C->version >= version) { return; }
int *ev = alloc_log_event (16);
ev[0] = CODE_binlog_set_chat_version;
ev[1] = get_peer_id (C->id);
ev[2] = version;
ev[3] = user_num;
add_log_event (ev, 16);
}

View File

@ -40,6 +40,13 @@
#define CODE_binlog_set_qts 0x3cf22b79 #define CODE_binlog_set_qts 0x3cf22b79
#define CODE_binlog_set_date 0x33dfe392 #define CODE_binlog_set_date 0x33dfe392
#define CODE_binlog_set_seq 0xb9294837 #define CODE_binlog_set_seq 0xb9294837
#define CODE_binlog_chat_create 0xbaa75791
#define CODE_binlog_chat_change_flags 0x1e494031
#define CODE_binlog_set_chat_title 0x7dd9bea8
#define CODE_binlog_set_chat_photo 0xb4ea1fd2
#define CODE_binlog_set_chat_date 0x78d1114e
#define CODE_binlog_set_chat_version 0xa5d3504f
void *alloc_log_event (int l); void *alloc_log_event (int l);
void replay_log (void); void replay_log (void);
@ -78,4 +85,12 @@ void bl_do_set_pts (int pts);
void bl_do_set_qts (int qts); void bl_do_set_qts (int qts);
void bl_do_set_seq (int seq); void bl_do_set_seq (int seq);
void bl_do_set_date (int date); void bl_do_set_date (int date);
void bl_do_create_chat (struct chat *C, int y, const char *s, int l, int users_num, int date, int version, struct file_location *big, struct file_location *small);
void bl_do_chat_forbid (struct chat *C, int on);
void bl_do_set_chat_title (struct chat *C, const char *s, int l);
void bl_do_set_chat_photo (struct chat *C, struct file_location *big, struct file_location *small);
void bl_do_set_chat_date (struct chat *C, int date);
void bl_do_set_chat_set_in_chat (struct chat *C, int on);
void bl_do_set_chat_version (struct chat *C, int version, int user_num);
#endif #endif

View File

@ -1237,6 +1237,12 @@ void print_service_message (struct message *M) {
case CODE_message_action_empty: case CODE_message_action_empty:
printf ("\n"); printf ("\n");
break; break;
case CODE_message_action_geo_chat_create:
printf ("Created geo chat\n");
break;
case CODE_message_action_geo_chat_checkin:
printf ("Checkin in geochat\n");
break;
case CODE_message_action_chat_create: case CODE_message_action_chat_create:
printf (" created chat %s. %d users\n", M->action.title, M->action.user_num); printf (" created chat %s. %d users\n", M->action.title, M->action.user_num);
break; break;

View File

@ -221,7 +221,7 @@ void out_cstring_careful (const char *str, long len) {
} }
void out_data (const char *data, long len) { void out_data (const void *data, long len) {
assert (len >= 0 && len < (1 << 24) && !(len & 3)); assert (len >= 0 && len < (1 << 24) && !(len & 3));
assert ((char *) packet_ptr + len + 8 < (char *) (packet_buffer + PACKET_BUFFER_SIZE)); assert ((char *) packet_ptr + len + 8 < (char *) (packet_buffer + PACKET_BUFFER_SIZE));
memcpy (packet_ptr, data, len); memcpy (packet_ptr, data, len);

View File

@ -249,7 +249,7 @@ static inline void clear_packet (void) {
void out_cstring (const char *str, long len); void out_cstring (const char *str, long len);
void out_cstring_careful (const char *str, long len); void out_cstring_careful (const char *str, long len);
void out_data (const char *data, long len); void out_data (const void *data, long len);
static inline void out_string (const char *str) { static inline void out_string (const char *str) {
out_cstring (str, strlen (str)); out_cstring (str, strlen (str));
@ -394,6 +394,12 @@ static inline void prefetch_data (void *data, int size) {
memcpy (data, in_ptr, size); memcpy (data, in_ptr, size);
} }
static inline void fetch_data (void *data, int size) {
memcpy (data, in_ptr, size);
assert (!(size & 3));
in_ptr += (size >> 2);
}
static inline long long fetch_long (void) { static inline long long fetch_long (void) {
long long r = *(long long *)in_ptr; long long r = *(long long *)in_ptr;
in_ptr += 2; in_ptr += 2;

View File

@ -414,37 +414,81 @@ void fetch_chat (struct chat *C) {
if (x == CODE_chat_empty) { if (x == CODE_chat_empty) {
return; return;
} }
C->flags |= FLAG_CREATED; int new = !(C->flags & FLAG_CREATED);
C->flags &= ~(FLAG_DELETED | FLAG_FORBIDDEN | FLAG_CHAT_IN_CHAT); if (new) {
if (x == CODE_chat_forbidden) { int y = 0;
C->flags |= FLAG_FORBIDDEN; if (x == CODE_chat_forbidden) {
} y |= FLAG_FORBIDDEN;
if (C->title) { free (C->title); } }
if (C->print_title) { free (C->print_title); } int l = prefetch_strlen ();
C->title = fetch_str_dup (); char *s = fetch_str (l);
C->print_title = create_print_name (C->id, C->title, 0, 0, 0);
if (x == CODE_chat) { struct file_location small;
unsigned y = fetch_int (); struct file_location big;
if (y == CODE_chat_photo_empty) { memset (&small, 0, sizeof (small));
C->photo_small.dc = -2; memset (&big, 0, sizeof (big));
C->photo_big.dc = -2; int users_num = -1;
int date = 0;
int version = -1;
if (x == CODE_chat) {
unsigned y = fetch_int ();
if (y == CODE_chat_photo_empty) {
small.dc = -2;
big.dc = -2;
} else {
assert (y == CODE_chat_photo);
fetch_file_location (&small);
fetch_file_location (&big);
}
users_num = fetch_int ();
date = fetch_int ();
if (fetch_bool ()) {
y |= FLAG_CHAT_IN_CHAT;
}
version = fetch_int ();
} else { } else {
assert (y == CODE_chat_photo); small.dc = -2;
fetch_file_location (&C->photo_small); big.dc = -2;
fetch_file_location (&C->photo_big); users_num = -1;
date = fetch_int ();
version = -1;
} }
C->users_num = fetch_int ();
C->date = fetch_int (); bl_do_create_chat (C, y, s, l, users_num, date, version, &big, &small);
if (fetch_int () == (int)CODE_bool_true) {
C->flags |= FLAG_CHAT_IN_CHAT;
}
C->version = fetch_int ();
} else { } else {
C->photo_small.dc = -2; if (x == CODE_chat_forbidden) {
C->photo_big.dc = -2; bl_do_chat_forbid (C, 1);
C->users_num = -1; } else {
C->date = fetch_int (); bl_do_chat_forbid (C, 0);
C->version = -1; }
int l = prefetch_strlen ();
char *s = fetch_str (l);
bl_do_set_chat_title (C, s, l);
struct file_location small;
struct file_location big;
memset (&small, 0, sizeof (small));
memset (&big, 0, sizeof (big));
if (x == CODE_chat) {
unsigned y = fetch_int ();
if (y == CODE_chat_photo_empty) {
small.dc = -2;
big.dc = -2;
} else {
assert (y == CODE_chat_photo);
fetch_file_location (&small);
fetch_file_location (&big);
}
bl_do_set_chat_photo (C, &big, &small);
int users_num = fetch_int ();
bl_do_set_chat_date (C, fetch_int ());
bl_do_set_chat_set_in_chat (C, fetch_bool ());
bl_do_set_chat_version (C, users_num, fetch_int ());
} else {
bl_do_set_chat_date (C, fetch_int ());
}
} }
} }
@ -663,6 +707,17 @@ void fetch_message_action (struct message_action *M) {
switch (x) { switch (x) {
case CODE_message_action_empty: case CODE_message_action_empty:
break; break;
case CODE_message_action_geo_chat_create:
{
int l = prefetch_strlen (); // title
char *s = fetch_str (l);
int l2 = prefetch_strlen (); // checkin
char *s2 = fetch_str (l2);
logprintf ("Message action: Created geochat %.*s in address %.*s\n", l, s, l2, s2);
}
break;
case CODE_message_action_geo_chat_checkin:
break;
case CODE_message_action_chat_create: case CODE_message_action_chat_create:
M->title = fetch_str_dup (); M->title = fetch_str_dup ();
assert (fetch_int () == (int)CODE_vector); assert (fetch_int () == (int)CODE_vector);
@ -1185,6 +1240,12 @@ void insert_user (peer_t *P) {
Peers[peer_num ++] = P; Peers[peer_num ++] = P;
} }
void insert_chat (peer_t *P) {
chats_allocated ++;
peer_tree = tree_insert_peer (peer_tree, P, lrand48 ());
Peers[peer_num ++] = P;
}
struct user *fetch_alloc_user_full (void) { struct user *fetch_alloc_user_full (void) {
int data[3]; int data[3];
prefetch_data (data, 12); prefetch_data (data, 12);
@ -1505,18 +1566,16 @@ struct chat *fetch_alloc_chat (void) {
int data[2]; int data[2];
prefetch_data (data, 8); prefetch_data (data, 8);
peer_t *U = user_chat_get (MK_CHAT (data[1])); peer_t *U = user_chat_get (MK_CHAT (data[1]));
if (U) { if (!U) {
fetch_chat (&U->chat);
return &U->chat;
} else {
chats_allocated ++; chats_allocated ++;
U = malloc (sizeof (*U)); U = malloc (sizeof (*U));
memset (U, 0, sizeof (*U)); memset (U, 0, sizeof (*U));
fetch_chat (&U->chat); U->id = MK_CHAT (data[1]);
peer_tree = tree_insert_peer (peer_tree, U, lrand48 ()); peer_tree = tree_insert_peer (peer_tree, U, lrand48 ());
Peers[peer_num ++] = U; Peers[peer_num ++] = U;
return &U->chat;
} }
fetch_chat (&U->chat);
return &U->chat;
} }
struct chat *fetch_alloc_chat_full (void) { struct chat *fetch_alloc_chat_full (void) {

View File

@ -351,6 +351,7 @@ void free_photo (struct photo *P);
void fetch_photo (struct photo *P); void fetch_photo (struct photo *P);
void insert_encrypted_chat (peer_t *P); void insert_encrypted_chat (peer_t *P);
void insert_user (peer_t *P); void insert_user (peer_t *P);
void insert_chat (peer_t *P);
void fetch_photo (struct photo *P); void fetch_photo (struct photo *P);
void free_photo (struct photo *P); void free_photo (struct photo *P);