summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--testing/nTox.c95
-rw-r--r--toxcore/Messenger.c11
2 files changed, 65 insertions, 41 deletions
diff --git a/testing/nTox.c b/testing/nTox.c
index 22756957..e1e25b45 100644
--- a/testing/nTox.c
+++ b/testing/nTox.c
@@ -42,6 +42,7 @@
42 42
43#include <stdio.h> 43#include <stdio.h>
44#include <time.h> 44#include <time.h>
45#include <locale.h>
45 46
46#ifdef __WIN32__ 47#ifdef __WIN32__
47#define c_sleep(x) Sleep(1*x) 48#define c_sleep(x) Sleep(1*x)
@@ -237,6 +238,18 @@ void get_id(Tox *m, char *data)
237 } 238 }
238} 239}
239 240
241int getfriendname_terminated(Tox *m, int friendnum, char *namebuf)
242{
243 int res = tox_getname(m, friendnum, (uint8_t *)namebuf);
244
245 if (res >= 0)
246 namebuf[res] = 0;
247 else
248 namebuf[0] = 0;
249
250 return res;
251}
252
240void new_lines_mark(char *line, uint8_t special) 253void new_lines_mark(char *line, uint8_t special)
241{ 254{
242 int i = 0; 255 int i = 0;
@@ -261,11 +274,11 @@ void new_lines(char *line)
261const char ptrn_friend[] = "[i] Friend: %s\n+ id: %i"; 274const char ptrn_friend[] = "[i] Friend: %s\n+ id: %i";
262void print_friendlist(Tox *m) 275void print_friendlist(Tox *m)
263{ 276{
264 char name[TOX_MAX_NAME_LENGTH]; 277 char name[TOX_MAX_NAME_LENGTH + 1];
265 int i = 0; 278 int i = 0;
266 new_lines("[i] Friend List:"); 279 new_lines("[i] Friend List:");
267 280
268 while (tox_getname(m, i, (uint8_t *)name) != -1) { 281 while (getfriendname_terminated(m, i, name) != -1) {
269 /* account for the longest name and the longest "base" string and number (int) */ 282 /* account for the longest name and the longest "base" string and number (int) */
270 char fstring[TOX_MAX_NAME_LENGTH + strlen(ptrn_friend) + 21]; 283 char fstring[TOX_MAX_NAME_LENGTH + strlen(ptrn_friend) + 21];
271 284
@@ -283,34 +296,43 @@ void print_friendlist(Tox *m)
283 new_lines("+ no friends! D:"); 296 new_lines("+ no friends! D:");
284} 297}
285 298
286char *format_message(Tox *m, char *message, int friendnum) 299static int fmtmsg_tm_mday = -1;
287{
288 char name[TOX_MAX_NAME_LENGTH];
289 300
290 if (friendnum != -1) { 301static void print_formatted_message(Tox *m, char *message, int friendnum, uint8_t outgoing)
291 tox_getname(m, friendnum, (uint8_t *)name); 302{
292 } else { 303 char name[TOX_MAX_NAME_LENGTH + 1];
293 tox_getselfname(m, (uint8_t *)name, sizeof(name)); 304 getfriendname_terminated(m, friendnum, name);
294 }
295 305
296 char *msg = malloc(100 + strlen(message) + strlen(name) + 1); 306 char msg[100 + strlen(message) + strlen(name) + 1];
297 307
298 time_t rawtime; 308 time_t rawtime;
299 struct tm *timeinfo; 309 struct tm *timeinfo;
300 time ( &rawtime ); 310 time ( &rawtime );
301 timeinfo = localtime ( &rawtime ); 311 timeinfo = localtime ( &rawtime );
302 char *time = asctime(timeinfo);
303 size_t len = strlen(time);
304 time[len - 1] = '\0';
305 312
306 if (friendnum != -1) { 313 /* assume that printing the date once a day is enough */
307 sprintf(msg, "[%d] %s <%s> %s", friendnum, time, name, message); 314 if (fmtmsg_tm_mday != timeinfo->tm_mday) {
315 fmtmsg_tm_mday = timeinfo->tm_mday;
316 /* strftime(msg, 100, "Today is %a %b %d %Y.", timeinfo); */
317 /* %x is the locale's preferred date format */
318 strftime(msg, 100, "Today is %x.", timeinfo);
319 new_lines(msg);
320 }
321
322 char time[64];
323 /* strftime(time, 64, "%I:%M:%S %p", timeinfo); */
324 /* %X is the locale's preferred time format */
325 strftime(time, 64, "%X", timeinfo);
326
327 if (outgoing) {
328 /* tgt: friend */
329 sprintf(msg, "[%d] %s =>{%s} %s", friendnum, time, name, message);
308 } else { 330 } else {
309 // This message came from ourselves 331 /* src: friend */
310 sprintf(msg, "%s <%s> %s", time, name, message); 332 sprintf(msg, "[%d] %s <%s>: %s", friendnum, time, name, message);
311 } 333 }
312 334
313 return msg; 335 new_lines(msg);
314} 336}
315 337
316/* forward declaration */ 338/* forward declaration */
@@ -381,7 +403,7 @@ void line_eval(Tox *m, char *line)
381 sprintf(sss, "[i] could not send message to friend num %u", num); 403 sprintf(sss, "[i] could not send message to friend num %u", num);
382 new_lines(sss); 404 new_lines(sss);
383 } else { 405 } else {
384 new_lines(format_message(m, *posi + 1, -1)); 406 print_formatted_message(m, *posi + 1, num, 1);
385 } 407 }
386 } else 408 } else
387 new_lines("Error, bad input."); 409 new_lines("Error, bad input.");
@@ -429,9 +451,7 @@ void line_eval(Tox *m, char *line)
429 451
430 if (num != -1) { 452 if (num != -1) {
431 pending_requests[numf].accepted = 1; 453 pending_requests[numf].accepted = 1;
432 sprintf(numchar, "[i] friend request %u accepted", numf); 454 sprintf(numchar, "[i] friend request %u accepted as friend no. %d", numf, num);
433 new_lines(numchar);
434 sprintf(numchar, "[i] added friendnumber %d", num);
435 new_lines(numchar); 455 new_lines(numchar);
436 save_data(m); 456 save_data(m);
437 } else { 457 } else {
@@ -515,18 +535,13 @@ void wrap(char output[STRING_LENGTH], char input[STRING_LENGTH], int line_width)
515 k--; 535 k--;
516 } 536 }
517 537
518 if (k > 0) { 538 if (k > m) {
519 /* replace and set as new line start */ 539 /* replace and set as new line start */
520 output[k] = '\n'; 540 output[k] = '\n';
521 i = k + 1; 541 i = k + 1;
522 } else {
523 /* nothing found backwards: look forward */
524 while ((i < len) && (output[i] != ' '))
525 i++;
526
527 if (i < len)
528 output[i] = '\n';
529 } 542 }
543
544 /* else: nothing to do now, TODO shift string */
530 } 545 }
531} 546}
532 547
@@ -699,14 +714,16 @@ void print_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *us
699 714
700void print_message(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) 715void print_message(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata)
701{ 716{
702 new_lines(format_message(m, (char *)string, friendnumber)); 717 /* ensure null termination */
718 string[length - 1] = 0;
719 print_formatted_message(m, (char *)string, friendnumber, 0);
703} 720}
704 721
705void print_nickchange(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) 722void print_nickchange(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata)
706{ 723{
707 char name[TOX_MAX_NAME_LENGTH]; 724 char name[TOX_MAX_NAME_LENGTH + 1];
708 725
709 if (tox_getname(m, friendnumber, (uint8_t *)name) != -1) { 726 if (getfriendname_terminated(m, friendnumber, name) != -1) {
710 char msg[100 + length]; 727 char msg[100 + length];
711 sprintf(msg, "[i] [%d] %s is now known as %s.", friendnumber, name, string); 728 sprintf(msg, "[i] [%d] %s is now known as %s.", friendnumber, name, string);
712 new_lines(msg); 729 new_lines(msg);
@@ -715,9 +732,9 @@ void print_nickchange(Tox *m, int friendnumber, uint8_t *string, uint16_t length
715 732
716void print_statuschange(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) 733void print_statuschange(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata)
717{ 734{
718 char name[TOX_MAX_NAME_LENGTH]; 735 char name[TOX_MAX_NAME_LENGTH + 1];
719 736
720 if (tox_getname(m, friendnumber, (uint8_t *)name) != -1) { 737 if (getfriendname_terminated(m, friendnumber, name) != -1) {
721 char msg[100 + length + strlen(name) + 1]; 738 char msg[100 + length + strlen(name) + 1];
722 sprintf(msg, "[i] [%d] %s's status changed to %s.", friendnumber, name, string); 739 sprintf(msg, "[i] [%d] %s's status changed to %s.", friendnumber, name, string);
723 new_lines(msg); 740 new_lines(msg);
@@ -878,6 +895,9 @@ void write_file(Tox *m, int friendnumber, uint8_t filenumber, uint8_t *data, uin
878 895
879int main(int argc, char *argv[]) 896int main(int argc, char *argv[])
880{ 897{
898 /* minimalistic locale support (i.e. when printing dates) */
899 setlocale(LC_ALL, "");
900
881 if (argc < 4) { 901 if (argc < 4) {
882 if ((argc == 2) && !strcmp(argv[1], "-h")) { 902 if ((argc == 2) && !strcmp(argv[1], "-h")) {
883 print_help(argv[0]); 903 print_help(argv[0]);
@@ -950,8 +970,9 @@ int main(int argc, char *argv[])
950 nodelay(stdscr, TRUE); 970 nodelay(stdscr, TRUE);
951 971
952 new_lines("[i] change username with /n"); 972 new_lines("[i] change username with /n");
953 uint8_t name[TOX_MAX_NAME_LENGTH]; 973 uint8_t name[TOX_MAX_NAME_LENGTH + 1];
954 uint16_t namelen = tox_getselfname(m, name, sizeof(name)); 974 uint16_t namelen = tox_getselfname(m, name, sizeof(name));
975 name[namelen] = 0;
955 976
956 if (namelen > 0) { 977 if (namelen > 0) {
957 char whoami[128 + TOX_MAX_NAME_LENGTH]; 978 char whoami[128 + TOX_MAX_NAME_LENGTH];
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c
index 659c837b..66faa4db 100644
--- a/toxcore/Messenger.c
+++ b/toxcore/Messenger.c
@@ -1539,12 +1539,15 @@ void do_friends(Messenger *m)
1539 if (data_length >= MAX_NAME_LENGTH || data_length == 0) 1539 if (data_length >= MAX_NAME_LENGTH || data_length == 0)
1540 break; 1540 break;
1541 1541
1542 memcpy(m->friendlist[i].name, data, data_length); 1542 /* Make sure the NULL terminator is present. */
1543 m->friendlist[i].name_length = data_length; 1543 data[data_length - 1] = 0;
1544 m->friendlist[i].name[data_length - 1] = 0; /* Make sure the NULL terminator is present. */
1545 1544
1545 /* inform of namechange before we overwrite the old name */
1546 if (m->friend_namechange) 1546 if (m->friend_namechange)
1547 m->friend_namechange(m, i, m->friendlist[i].name, data_length, m->friend_namechange_userdata); 1547 m->friend_namechange(m, i, data, data_length, m->friend_namechange_userdata);
1548
1549 memcpy(m->friendlist[i].name, data, data_length);
1550 m->friendlist[i].name_length = data_length;
1548 1551
1549 break; 1552 break;
1550 } 1553 }