diff --git a/src/friendlist.c b/src/friendlist.c index 5962c6c..90f5b9a 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -98,6 +98,12 @@ static int save_blocklist(char *path) tmp.namelength = Blocked_Contacts.list[i].namelength; memcpy(tmp.name, Blocked_Contacts.list[i].name, Blocked_Contacts.list[i].namelength + 1); memcpy(tmp.pub_key, Blocked_Contacts.list[i].pub_key, TOX_CLIENT_ID_SIZE); + + uint8_t lastonline[sizeof(uint64_t)]; + memcpy(lastonline, &Blocked_Contacts.list[i].last_on, sizeof(uint64_t)); + host_to_net(lastonline, sizeof(uint64_t)); + memcpy(&tmp.last_on, lastonline, sizeof(uint64_t)); + memcpy(data + count * sizeof(BlockedFriend), &tmp, sizeof(BlockedFriend)); ++count; } @@ -166,6 +172,12 @@ int load_blocklist(char *path) Blocked_Contacts.list[i].namelength = tmp.namelength; memcpy(Blocked_Contacts.list[i].name, tmp.name, tmp.namelength + 1); memcpy(Blocked_Contacts.list[i].pub_key, tmp.pub_key, TOX_CLIENT_ID_SIZE); + + uint8_t lastonline[sizeof(uint64_t)]; + memcpy(lastonline, &tmp.last_on, sizeof(uint64_t)); + net_to_host(lastonline, sizeof(uint64_t)); + memcpy(&Blocked_Contacts.list[i].last_on, lastonline, sizeof(uint64_t)); + ++Blocked_Contacts.num_blocked; } @@ -360,6 +372,7 @@ static void friendlist_add_blocked(Tox *m, int32_t fnum, int32_t bnum) friends[i].status = TOX_USERSTATUS_NONE; friends[i].logging_on = (bool) user_settings_->autolog == AUTOLOG_ON; friends[i].namelength = Blocked_Contacts.list[bnum].namelength; + update_friend_last_online(i, Blocked_Contacts.list[bnum].last_on); memcpy(friends[i].name, Blocked_Contacts.list[bnum].name, friends[i].namelength + 1); memcpy(friends[i].pub_key, Blocked_Contacts.list[bnum].pub_key, TOX_CLIENT_ID_SIZE); @@ -516,7 +529,7 @@ static void delete_blocked_friend(int32_t bnum) int i; - for (i = Blocked_Contacts.max_index; i >= 0; --i) { + for (i = Blocked_Contacts.max_index; i > 0; --i) { if (Blocked_Contacts.list[i - 1].active) break; } @@ -544,6 +557,7 @@ void block_friend(Tox *m, int32_t fnum) Blocked_Contacts.list[i].active = true; Blocked_Contacts.list[i].num = i; Blocked_Contacts.list[i].namelength = friends[fnum].namelength; + Blocked_Contacts.list[i].last_on = friends[fnum].last_online.last_on; memcpy(Blocked_Contacts.list[i].pub_key, friends[fnum].pub_key, TOX_CLIENT_ID_SIZE); memcpy(Blocked_Contacts.list[i].name, friends[fnum].name, friends[fnum].namelength + 1); diff --git a/src/friendlist.h b/src/friendlist.h index 2a2b1dd..24cf943 100644 --- a/src/friendlist.h +++ b/src/friendlist.h @@ -70,6 +70,7 @@ typedef struct { char pub_key[TOX_CLIENT_ID_SIZE]; int32_t num; bool active; + uint64_t last_on; } BlockedFriend; ToxWindow new_friendlist(void); diff --git a/src/misc_tools.c b/src/misc_tools.c index a0315c3..c26c6a0 100644 --- a/src/misc_tools.c +++ b/src/misc_tools.c @@ -37,6 +37,21 @@ extern struct user_settings *user_settings_; static uint64_t current_unix_time; +void host_to_net(uint8_t *num, uint16_t numbytes) +{ +#ifndef WORDS_BIGENDIAN + uint32_t i; + uint8_t buff[numbytes]; + + for (i = 0; i < numbytes; ++i) { + buff[i] = num[numbytes - i - 1]; + } + + memcpy(num, buff, numbytes); +#endif + return; +} + void update_unix_time(void) { current_unix_time = (uint64_t) time(NULL); diff --git a/src/misc_tools.h b/src/misc_tools.h index bea928b..1e92f8c 100644 --- a/src/misc_tools.h +++ b/src/misc_tools.h @@ -33,6 +33,12 @@ #define MAX(x, y) (((x) > (y)) ? (x) : (y)) #endif +#ifndef net_to_host +#define net_to_host(x, y) host_to_net(x, y) +#endif + +void host_to_net(uint8_t *num, uint16_t numbytes); + /* convert a hex string to binary */ char *hex_string_to_bin(const char *hex_string);