summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/Messenger.c41
-rw-r--r--core/Messenger.h12
-rw-r--r--testing/nTox.c21
-rw-r--r--testing/toxic/CMakeLists.txt1
-rw-r--r--testing/toxic/chat.c7
-rw-r--r--testing/toxic/chat.h6
-rw-r--r--testing/toxic/friendlist.c18
-rw-r--r--testing/toxic/friendlist.h12
-rw-r--r--testing/toxic/main.c258
-rw-r--r--testing/toxic/prompt.c21
-rw-r--r--testing/toxic/prompt.h14
-rw-r--r--testing/toxic/windows.c235
-rw-r--r--testing/toxic/windows.h23
13 files changed, 353 insertions, 316 deletions
diff --git a/core/Messenger.c b/core/Messenger.c
index 2721f8f6..690a81b1 100644
--- a/core/Messenger.c
+++ b/core/Messenger.c
@@ -75,9 +75,9 @@ int getclient_id(Messenger *m, int friend_id, uint8_t *client_id)
75 75
76 return -1; 76 return -1;
77} 77}
78/* 78/*
79 * returns a uint16_t that represents the checksum of address of length len 79 * returns a uint16_t that represents the checksum of address of length len
80 * 80 *
81 * TODO: Another checksum algorithm might be better. 81 * TODO: Another checksum algorithm might be better.
82 */ 82 */
83static uint16_t address_checksum(uint8_t *address, uint32_t len) 83static uint16_t address_checksum(uint8_t *address, uint32_t len)
@@ -94,7 +94,7 @@ static uint16_t address_checksum(uint8_t *address, uint32_t len)
94/* 94/*
95 * returns a FRIEND_ADDRESS_SIZE byte address to give to others. 95 * returns a FRIEND_ADDRESS_SIZE byte address to give to others.
96 * format: [client_id (32 bytes)][nospam number (4 bytes)][checksum (2 bytes)] 96 * format: [client_id (32 bytes)][nospam number (4 bytes)][checksum (2 bytes)]
97 * 97 *
98 */ 98 */
99void getaddress(Messenger *m, uint8_t *address) 99void getaddress(Messenger *m, uint8_t *address)
100{ 100{
@@ -118,7 +118,7 @@ void getaddress(Messenger *m, uint8_t *address)
118 * return FAERR_ALREADYSENT if friend request already sent or already a friend 118 * return FAERR_ALREADYSENT if friend request already sent or already a friend
119 * return FAERR_UNKNOWN for unknown error 119 * return FAERR_UNKNOWN for unknown error
120 * return FAERR_BADCHECKSUM if bad checksum in address 120 * return FAERR_BADCHECKSUM if bad checksum in address
121 * return FAERR_SETNEWNOSPAM if the friend was already there but the nospam was different 121 * return FAERR_SETNEWNOSPAM if the friend was already there but the nospam was different
122 * (the nospam for that friend was set to the new one) 122 * (the nospam for that friend was set to the new one)
123 */ 123 */
124int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length) 124int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length)
@@ -449,8 +449,7 @@ void m_set_sends_receipts(Messenger *m, int friendnumber, int yesno)
449 m->friendlist[friendnumber].receives_read_receipts = yesno; 449 m->friendlist[friendnumber].receives_read_receipts = yesno;
450} 450}
451 451
452/* static void (*friend_request)(uint8_t *, uint8_t *, uint16_t); 452/* static void (*friend_request)(uint8_t *, uint8_t *, uint16_t); */
453static uint8_t friend_request_isset = 0; */
454/* set the function that will be executed when a friend request is received. */ 453/* set the function that will be executed when a friend request is received. */
455void m_callback_friendrequest(Messenger *m, void (*function)(uint8_t *, uint8_t *, uint16_t, void*), void* userdata) 454void m_callback_friendrequest(Messenger *m, void (*function)(uint8_t *, uint8_t *, uint16_t, void*), void* userdata)
456{ 455{
@@ -461,55 +460,48 @@ void m_callback_friendrequest(Messenger *m, void (*function)(uint8_t *, uint8_t
461void m_callback_friendmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata) 460void m_callback_friendmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata)
462{ 461{
463 m->friend_message = function; 462 m->friend_message = function;
464 m->friend_message_isset = 1;
465 m->friend_message_userdata = userdata; 463 m->friend_message_userdata = userdata;
466} 464}
467 465
468void m_callback_action(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata) 466void m_callback_action(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata)
469{ 467{
470 m->friend_action = function; 468 m->friend_action = function;
471 m->friend_action_isset = 1;
472 m->friend_action_userdata = userdata; 469 m->friend_action_userdata = userdata;
473} 470}
474 471
475void m_callback_namechange(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata) 472void m_callback_namechange(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata)
476{ 473{
477 m->friend_namechange = function; 474 m->friend_namechange = function;
478 m->friend_namechange_isset = 1;
479 m->friend_namechange_userdata = userdata; 475 m->friend_namechange_userdata = userdata;
480} 476}
481 477
482void m_callback_statusmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata) 478void m_callback_statusmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata)
483{ 479{
484 m->friend_statusmessagechange = function; 480 m->friend_statusmessagechange = function;
485 m->friend_statusmessagechange_isset = 1;
486 m->friend_statuschange_userdata = userdata; 481 m->friend_statuschange_userdata = userdata;
487} 482}
488 483
489void m_callback_userstatus(Messenger *m, void (*function)(Messenger *m, int, USERSTATUS, void*), void* userdata) 484void m_callback_userstatus(Messenger *m, void (*function)(Messenger *m, int, USERSTATUS, void*), void* userdata)
490{ 485{
491 m->friend_userstatuschange = function; 486 m->friend_userstatuschange = function;
492 m->friend_userstatuschange_isset = 1;
493 m->friend_userstatuschange_userdata = userdata; 487 m->friend_userstatuschange_userdata = userdata;
494} 488}
495 489
496void m_callback_read_receipt(Messenger *m, void (*function)(Messenger *m, int, uint32_t, void*), void* userdata) 490void m_callback_read_receipt(Messenger *m, void (*function)(Messenger *m, int, uint32_t, void*), void* userdata)
497{ 491{
498 m->read_receipt = function; 492 m->read_receipt = function;
499 m->read_receipt_isset = 1;
500 m->read_receipt_userdata = userdata; 493 m->read_receipt_userdata = userdata;
501} 494}
502 495
503void m_callback_connectionstatus(Messenger *m, void (*function)(Messenger *m, int, uint8_t, void*), void* userdata) 496void m_callback_connectionstatus(Messenger *m, void (*function)(Messenger *m, int, uint8_t, void*), void* userdata)
504{ 497{
505 m->friend_connectionstatuschange = function; 498 m->friend_connectionstatuschange = function;
506 m->friend_connectionstatuschange_isset = 1;
507 m->friend_connectionstatuschange_userdata = userdata; 499 m->friend_connectionstatuschange_userdata = userdata;
508} 500}
509 501
510static void check_friend_connectionstatus(Messenger *m, int friendnumber, uint8_t status) 502static void check_friend_connectionstatus(Messenger *m, int friendnumber, uint8_t status)
511{ 503{
512 if (!m->friend_connectionstatuschange_isset) 504 if (!m->friend_connectionstatuschange)
513 return; 505 return;
514 if (status == NOFRIEND) 506 if (status == NOFRIEND)
515 return; 507 return;
@@ -580,7 +572,10 @@ Messenger * initMessenger(void)
580 572
581/* run this before closing shop */ 573/* run this before closing shop */
582void cleanupMessenger(Messenger *m){ 574void cleanupMessenger(Messenger *m){
583 /* FIXME TODO it seems no one frees friendlist or all the elements status */ 575 /* FIXME TODO ideally cleanupMessenger will mirror initMessenger
576 * this requires the other modules to expose cleanup functions
577 */
578 free(m->friendlist);
584 free(m); 579 free(m);
585} 580}
586 581
@@ -648,7 +643,7 @@ void doFriends(Messenger *m)
648 case PACKET_ID_NICKNAME: { 643 case PACKET_ID_NICKNAME: {
649 if (data_length >= MAX_NAME_LENGTH || data_length == 0) 644 if (data_length >= MAX_NAME_LENGTH || data_length == 0)
650 break; 645 break;
651 if(m->friend_namechange_isset) 646 if(m->friend_namechange)
652 m->friend_namechange(m, i, data, data_length, m->friend_namechange_userdata); 647 m->friend_namechange(m, i, data, data_length, m->friend_namechange_userdata);
653 memcpy(m->friendlist[i].name, data, data_length); 648 memcpy(m->friendlist[i].name, data, data_length);
654 m->friendlist[i].name[data_length - 1] = 0; /* make sure the NULL terminator is present. */ 649 m->friendlist[i].name[data_length - 1] = 0; /* make sure the NULL terminator is present. */
@@ -659,7 +654,7 @@ void doFriends(Messenger *m)
659 break; 654 break;
660 uint8_t *status = calloc(MIN(data_length, MAX_STATUSMESSAGE_LENGTH), 1); 655 uint8_t *status = calloc(MIN(data_length, MAX_STATUSMESSAGE_LENGTH), 1);
661 memcpy(status, data, MIN(data_length, MAX_STATUSMESSAGE_LENGTH)); 656 memcpy(status, data, MIN(data_length, MAX_STATUSMESSAGE_LENGTH));
662 if (m->friend_statusmessagechange_isset) 657 if (m->friend_statusmessagechange)
663 m->friend_statusmessagechange(m, i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH), 658 m->friend_statusmessagechange(m, i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH),
664 m->friend_statuschange_userdata); 659 m->friend_statuschange_userdata);
665 set_friend_statusmessage(m, i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH)); 660 set_friend_statusmessage(m, i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH));
@@ -670,7 +665,7 @@ void doFriends(Messenger *m)
670 if (data_length != 1) 665 if (data_length != 1)
671 break; 666 break;
672 USERSTATUS status = data[0]; 667 USERSTATUS status = data[0];
673 if (m->friend_userstatuschange_isset) 668 if (m->friend_userstatuschange)
674 m->friend_userstatuschange(m, i, status, m->friend_userstatuschange_userdata); 669 m->friend_userstatuschange(m, i, status, m->friend_userstatuschange_userdata);
675 set_friend_userstatus(m, i, status); 670 set_friend_userstatus(m, i, status);
676 break; 671 break;
@@ -683,12 +678,12 @@ void doFriends(Messenger *m)
683 if (m->friendlist[i].receives_read_receipts) { 678 if (m->friendlist[i].receives_read_receipts) {
684 write_cryptpacket_id(m, i, PACKET_ID_RECEIPT, message_id, message_id_length); 679 write_cryptpacket_id(m, i, PACKET_ID_RECEIPT, message_id, message_id_length);
685 } 680 }
686 if (m->friend_message_isset) 681 if (m->friend_message)
687 (*m->friend_message)(m, i, message, message_length, m->friend_message_userdata); 682 (*m->friend_message)(m, i, message, message_length, m->friend_message_userdata);
688 break; 683 break;
689 } 684 }
690 case PACKET_ID_ACTION: { 685 case PACKET_ID_ACTION: {
691 if (m->friend_action_isset) 686 if (m->friend_action)
692 (*m->friend_action)(m, i, data, data_length, m->friend_action_userdata); 687 (*m->friend_action)(m, i, data, data_length, m->friend_action_userdata);
693 break; 688 break;
694 } 689 }
@@ -698,7 +693,7 @@ void doFriends(Messenger *m)
698 break; 693 break;
699 memcpy(&msgid, data, sizeof(msgid)); 694 memcpy(&msgid, data, sizeof(msgid));
700 msgid = ntohl(msgid); 695 msgid = ntohl(msgid);
701 if (m->read_receipt_isset) 696 if (m->read_receipt)
702 (*m->read_receipt)(m, i, msgid, m->read_receipt_userdata); 697 (*m->read_receipt)(m, i, msgid, m->read_receipt_userdata);
703 break; 698 break;
704 } 699 }
@@ -744,14 +739,14 @@ void doMessenger(Messenger *m)
744 doNetCrypto(); 739 doNetCrypto();
745 doInbound(m); 740 doInbound(m);
746 doFriends(m); 741 doFriends(m);
747 742
748 timer_poll(); 743 timer_poll();
749} 744}
750 745
751/* returns the size of the messenger data (for saving) */ 746/* returns the size of the messenger data (for saving) */
752uint32_t Messenger_size(Messenger *m) 747uint32_t Messenger_size(Messenger *m)
753{ 748{
754 return crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES 749 return crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t)
755 + sizeof(uint32_t) + DHT_size() + sizeof(uint32_t) + sizeof(Friend) * m->numfriends; 750 + sizeof(uint32_t) + DHT_size() + sizeof(uint32_t) + sizeof(Friend) * m->numfriends;
756} 751}
757 752
diff --git a/core/Messenger.h b/core/Messenger.h
index 9621176f..a2add19d 100644
--- a/core/Messenger.h
+++ b/core/Messenger.h
@@ -111,28 +111,20 @@ typedef struct Messenger {
111 uint32_t numfriends; 111 uint32_t numfriends;
112 112
113 void (*friend_message)(struct Messenger *m, int, uint8_t *, uint16_t, void*); 113 void (*friend_message)(struct Messenger *m, int, uint8_t *, uint16_t, void*);
114 uint8_t friend_message_isset;
115 void* friend_message_userdata; 114 void* friend_message_userdata;
116 void (*friend_action)(struct Messenger *m, int, uint8_t *, uint16_t, void*); 115 void (*friend_action)(struct Messenger *m, int, uint8_t *, uint16_t, void*);
117 uint8_t friend_action_isset;
118 void* friend_action_userdata; 116 void* friend_action_userdata;
119 void (*friend_namechange)(struct Messenger *m, int, uint8_t *, uint16_t, void*); 117 void (*friend_namechange)(struct Messenger *m, int, uint8_t *, uint16_t, void*);
120 uint8_t friend_namechange_isset;
121 void* friend_namechange_userdata; 118 void* friend_namechange_userdata;
122 void (*friend_statusmessagechange)(struct Messenger *m, int, uint8_t *, uint16_t, void*); 119 void (*friend_statusmessagechange)(struct Messenger *m, int, uint8_t *, uint16_t, void*);
123 uint8_t friend_statusmessagechange_isset;
124 void* friend_statusmessagechange_userdata; 120 void* friend_statusmessagechange_userdata;
125 void (*friend_userstatuschange)(struct Messenger *m, int, USERSTATUS, void*); 121 void (*friend_userstatuschange)(struct Messenger *m, int, USERSTATUS, void*);
126 uint8_t friend_userstatuschange_isset;
127 void* friend_userstatuschange_userdata; 122 void* friend_userstatuschange_userdata;
128 void (*read_receipt)(struct Messenger *m, int, uint32_t, void*); 123 void (*read_receipt)(struct Messenger *m, int, uint32_t, void*);
129 uint8_t read_receipt_isset;
130 void* read_receipt_userdata; 124 void* read_receipt_userdata;
131 void (*friend_statuschange)(struct Messenger *m, int, uint8_t, void*); 125 void (*friend_statuschange)(struct Messenger *m, int, uint8_t, void*);
132 uint8_t friend_statuschange_isset;
133 void* friend_statuschange_userdata; 126 void* friend_statuschange_userdata;
134 void (*friend_connectionstatuschange)(struct Messenger *m, int, uint8_t, void*); 127 void (*friend_connectionstatuschange)(struct Messenger *m, int, uint8_t, void*);
135 uint8_t friend_connectionstatuschange_isset;
136 void* friend_connectionstatuschange_userdata; 128 void* friend_connectionstatuschange_userdata;
137 129
138 130
@@ -141,7 +133,7 @@ typedef struct Messenger {
141/* 133/*
142 * returns a FRIEND_ADDRESS_SIZE byte address to give to others. 134 * returns a FRIEND_ADDRESS_SIZE byte address to give to others.
143 * format: [client_id (32 bytes)][nospam number (4 bytes)][checksum (2 bytes)] 135 * format: [client_id (32 bytes)][nospam number (4 bytes)][checksum (2 bytes)]
144 * 136 *
145 */ 137 */
146void getaddress(Messenger *m, uint8_t *address); 138void getaddress(Messenger *m, uint8_t *address);
147 139
@@ -157,7 +149,7 @@ void getaddress(Messenger *m, uint8_t *address);
157 * return -4 if friend request already sent or already a friend 149 * return -4 if friend request already sent or already a friend
158 * return -5 for unknown error 150 * return -5 for unknown error
159 * return -6 if bad checksum in address 151 * return -6 if bad checksum in address
160 * return -7 if the friend was already there but the nospam was different 152 * return -7 if the friend was already there but the nospam was different
161 * (the nospam for that friend was set to the new one) 153 * (the nospam for that friend was set to the new one)
162 */ 154 */
163int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length); 155int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length);
diff --git a/testing/nTox.c b/testing/nTox.c
index cab2d158..ead4fd21 100644
--- a/testing/nTox.c
+++ b/testing/nTox.c
@@ -52,28 +52,15 @@ uint8_t num_requests = 0;
52 52
53void get_id(Messenger *m, char *data) 53void get_id(Messenger *m, char *data)
54{ 54{
55 char idstring0[200]; 55 sprintf(data, "[i] ID: ");
56 char idstring1[FRIEND_ADDRESS_SIZE][5]; 56 int offset = strlen(data);
57 char idstring2[FRIEND_ADDRESS_SIZE][5];
58 int i = 0; 57 int i = 0;
59 uint8_t address[FRIEND_ADDRESS_SIZE]; 58 uint8_t address[FRIEND_ADDRESS_SIZE];
60 getaddress(m, address); 59 getaddress(m, address);
61 for(i = 0; i < FRIEND_ADDRESS_SIZE; i++) 60 for(; i < FRIEND_ADDRESS_SIZE; i++)
62 { 61 {
63 if (address[i] < (FRIEND_ADDRESS_SIZE / 2)) 62 sprintf(data + 2*i + offset, "%02X ", address[i]);
64 strcpy(idstring1[i],"0");
65 else
66 strcpy(idstring1[i], "");
67 sprintf(idstring2[i], "%hhX",address[i]);
68 } 63 }
69 strcpy(idstring0,"[i] ID: ");
70 int j = 0;
71 for (j = 0; j < FRIEND_ADDRESS_SIZE; j++) {
72 strcat(idstring0,idstring1[j]);
73 strcat(idstring0,idstring2[j]);
74 }
75
76 memcpy(data, idstring0, strlen(idstring0));
77} 64}
78 65
79void new_lines(char *line) 66void new_lines(char *line)
diff --git a/testing/toxic/CMakeLists.txt b/testing/toxic/CMakeLists.txt
index 13b8692d..dd811b97 100644
--- a/testing/toxic/CMakeLists.txt
+++ b/testing/toxic/CMakeLists.txt
@@ -8,6 +8,7 @@ set(exe_name toxic)
8 8
9add_executable(${exe_name} 9add_executable(${exe_name}
10 main.c 10 main.c
11 windows.c
11 prompt.c 12 prompt.c
12 friendlist.c 13 friendlist.c
13 chat.c 14 chat.c
diff --git a/testing/toxic/chat.c b/testing/toxic/chat.c
index 1b5e743d..e4da9484 100644
--- a/testing/toxic/chat.c
+++ b/testing/toxic/chat.c
@@ -13,6 +13,8 @@
13#include "../../core/network.h" 13#include "../../core/network.h"
14 14
15#include "windows.h" 15#include "windows.h"
16#include "friendlist.h"
17#include "chat.h"
16 18
17#define CURS_Y_OFFSET 3 19#define CURS_Y_OFFSET 3
18 20
@@ -24,10 +26,6 @@ typedef struct {
24 WINDOW* linewin; 26 WINDOW* linewin;
25} ChatContext; 27} ChatContext;
26 28
27extern int active_window;
28
29extern void del_window(ToxWindow *w, int f_num);
30extern void fix_name(uint8_t *name);
31void print_help(ChatContext *self); 29void print_help(ChatContext *self);
32void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd); 30void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd);
33 31
@@ -320,7 +318,6 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd)
320 } 318 }
321 319
322 else if (strcmp(ctx->line, "/close") == 0) { 320 else if (strcmp(ctx->line, "/close") == 0) {
323 active_window = 0; // Go to prompt screen
324 int f_num = ctx->friendnum; 321 int f_num = ctx->friendnum;
325 delwin(ctx->linewin); 322 delwin(ctx->linewin);
326 del_window(self, f_num); 323 del_window(self, f_num);
diff --git a/testing/toxic/chat.h b/testing/toxic/chat.h
new file mode 100644
index 00000000..7599d462
--- /dev/null
+++ b/testing/toxic/chat.h
@@ -0,0 +1,6 @@
1#ifndef CHAT_H_6489PZ13
2#define CHAT_H_6489PZ13
3
4ToxWindow new_chat(Messenger *m, int friendnum);
5
6#endif /* end of include guard: CHAT_H_6489PZ13 */
diff --git a/testing/toxic/friendlist.c b/testing/toxic/friendlist.c
index 56061cf9..e7504fbf 100644
--- a/testing/toxic/friendlist.c
+++ b/testing/toxic/friendlist.c
@@ -11,12 +11,9 @@
11#include "../../core/network.h" 11#include "../../core/network.h"
12 12
13#include "windows.h" 13#include "windows.h"
14#include "friendlist.h"
14 15
15extern char WINDOW_STATUS[TOXWINDOWS_MAX_NUM]; 16static char * WINDOW_STATUS;
16extern int add_window(ToxWindow w, int n);
17extern ToxWindow new_chat(Messenger *m, int friendnum);
18
19extern int active_window;
20 17
21typedef struct { 18typedef struct {
22 uint8_t name[MAX_NAME_LENGTH]; 19 uint8_t name[MAX_NAME_LENGTH];
@@ -54,8 +51,7 @@ void friendlist_onMessage(ToxWindow *self, Messenger *m, int num, uint8_t *str,
54 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { 51 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
55 if (WINDOW_STATUS[i] == -1) { 52 if (WINDOW_STATUS[i] == -1) {
56 WINDOW_STATUS[i] = num; 53 WINDOW_STATUS[i] = num;
57 add_window(new_chat(m, num), i); 54 add_window(m, new_chat(m, num), i);
58 active_window = i;
59 break; 55 break;
60 } 56 }
61 } 57 }
@@ -111,7 +107,7 @@ static void friendlist_onKey(ToxWindow *self, Messenger *m, int key)
111 int i; 107 int i;
112 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { 108 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
113 if (WINDOW_STATUS[i] == num_selected) { 109 if (WINDOW_STATUS[i] == num_selected) {
114 active_window = i; 110 set_active_window(i);
115 break; 111 break;
116 } 112 }
117 } 113 }
@@ -121,8 +117,7 @@ static void friendlist_onKey(ToxWindow *self, Messenger *m, int key)
121 if (WINDOW_STATUS[i] == -1) { 117 if (WINDOW_STATUS[i] == -1) {
122 WINDOW_STATUS[i] = num_selected; 118 WINDOW_STATUS[i] = num_selected;
123 friends[num_selected].chatwin = num_selected; 119 friends[num_selected].chatwin = num_selected;
124 add_window(new_chat(m, num_selected), i); 120 add_window(m, new_chat(m, num_selected), i);
125 active_window = i;
126 break; 121 break;
127 } 122 }
128 } 123 }
@@ -169,7 +164,8 @@ static void friendlist_onInit(ToxWindow *self, Messenger *m)
169 164
170} 165}
171 166
172ToxWindow new_friendlist() { 167ToxWindow new_friendlist(char * ws) {
168 WINDOW_STATUS = ws;
173 ToxWindow ret; 169 ToxWindow ret;
174 memset(&ret, 0, sizeof(ret)); 170 memset(&ret, 0, sizeof(ret));
175 171
diff --git a/testing/toxic/friendlist.h b/testing/toxic/friendlist.h
new file mode 100644
index 00000000..c3d8dac7
--- /dev/null
+++ b/testing/toxic/friendlist.h
@@ -0,0 +1,12 @@
1#ifndef FRIENDLIST_H_53I41IM
2#define FRIENDLIST_H_53I41IM
3
4#include "windows.h"
5#include "chat.h"
6
7ToxWindow new_friendlist(char * ws);
8int friendlist_onFriendAdded(Messenger *m, int num);
9void disable_chatwin(int f_num);
10void fix_name(uint8_t *name);
11
12#endif /* end of include guard: FRIENDLIST_H_53I41IM */
diff --git a/testing/toxic/main.c b/testing/toxic/main.c
index 40ff5d09..063c1483 100644
--- a/testing/toxic/main.c
+++ b/testing/toxic/main.c
@@ -21,93 +21,9 @@
21 21
22#include "configdir.h" 22#include "configdir.h"
23#include "windows.h" 23#include "windows.h"
24#include "prompt.h"
25#include "friendlist.h"
24 26
25extern ToxWindow new_prompt();
26extern ToxWindow new_friendlist();
27
28extern int friendlist_onFriendAdded(Messenger *m, int num);
29extern void disable_chatwin(int f_num);
30extern int add_req(uint8_t *public_key); // XXX
31extern unsigned char *hex_string_to_bin(char hex_string[]);
32
33/* Holds status of chat windows */
34char WINDOW_STATUS[MAX_WINDOW_SLOTS];
35
36#ifndef TOXICVER
37#define TOXICVER "NOVER" //Use the -D flag to set this
38#endif
39
40static ToxWindow windows[MAX_WINDOW_SLOTS];
41static ToxWindow* prompt;
42
43static Messenger *m;
44
45int w_num;
46int active_window;
47
48/* CALLBACKS START */
49void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userdata)
50{
51 int n = add_req(public_key);
52 wprintw(prompt->window, "\nFriend request from:\n");
53
54 int i;
55 for (i = 0; i < KEY_SIZE_BYTES; ++i) {
56 wprintw(prompt->window, "%02x", public_key[i] & 0xff);
57 }
58
59 wprintw(prompt->window, "\nWith the message: %s\n", data);
60 wprintw(prompt->window, "\nUse \"accept %d\" to accept it.\n", n);
61
62 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
63 if (windows[i].onFriendRequest != NULL)
64 windows[i].onFriendRequest(&windows[i], public_key, data, length);
65 }
66}
67
68void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
69{
70 int i;
71 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
72 if (windows[i].onMessage != NULL)
73 windows[i].onMessage(&windows[i], m, friendnumber, string, length);
74 }
75}
76
77void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
78{
79 int i;
80 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
81 if (windows[i].onAction != NULL)
82 windows[i].onAction(&windows[i], m, friendnumber, string, length);
83 }
84}
85
86void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
87{
88 wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string);
89 int i;
90 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
91 if (windows[i].onNickChange != NULL)
92 windows[i].onNickChange(&windows[i], friendnumber, string, length);
93 }
94}
95
96void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
97{
98 wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string);
99 int i;
100 for (i=0; i<MAX_WINDOW_SLOTS; ++i) {
101 if (windows[i].onStatusChange != NULL)
102 windows[i].onStatusChange(&windows[i], friendnumber, string, length);
103 }
104}
105
106void on_friendadded(int friendnumber)
107{
108 friendlist_onFriendAdded(m, friendnumber);
109}
110/* CALLBACKS END */
111 27
112static void init_term() 28static void init_term()
113{ 29{
@@ -129,10 +45,10 @@ static void init_term()
129 refresh(); 45 refresh();
130} 46}
131 47
132static void init_tox() 48static Messenger * init_tox()
133{ 49{
134 /* Init core */ 50 /* Init core */
135 m = initMessenger(); 51 Messenger *m = initMessenger();
136 52
137 /* Callbacks */ 53 /* Callbacks */
138 m_callback_friendrequest(m, on_request, NULL); 54 m_callback_friendrequest(m, on_request, NULL);
@@ -147,6 +63,7 @@ static void init_tox()
147#else 63#else
148 setname(m, (uint8_t*) "Hipster", sizeof("Hipster")); 64 setname(m, (uint8_t*) "Hipster", sizeof("Hipster"));
149#endif 65#endif
66 return m;
150} 67}
151 68
152#define MAXLINE 90 /* Approx max number of chars in a sever line (IP + port + key) */ 69#define MAXLINE 90 /* Approx max number of chars in a sever line (IP + port + key) */
@@ -195,67 +112,7 @@ int init_connection(void)
195 return 0; 112 return 0;
196} 113}
197 114
198void init_window_status() 115static void do_tox(Messenger *m, ToxWindow * prompt)
199{
200 /* Default window values decrement from -2 */
201 int i;
202 for (i = 0; i < N_DEFAULT_WINS; ++i)
203 WINDOW_STATUS[i] = -(i+2);
204
205 int j;
206 for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++)
207 WINDOW_STATUS[j] = -1;
208}
209
210int add_window(ToxWindow w, int n)
211{
212 if (w_num >= TOXWINDOWS_MAX_NUM)
213 return -1;
214
215 if (LINES < 2)
216 return -1;
217
218 w.window = newwin(LINES - 2, COLS, 0, 0);
219 if (w.window == NULL)
220 return -1;
221
222 windows[n] = w;
223 w.onInit(&w, m);
224 w_num++;
225 return n;
226}
227
228/* Deletes window w and cleans up */
229void del_window(ToxWindow *w, int f_num)
230{
231 delwin(w->window);
232 int i;
233 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
234 if (WINDOW_STATUS[i] == f_num) {
235 WINDOW_STATUS[i] = -1;
236 disable_chatwin(f_num);
237 break;
238 }
239 }
240 clear();
241 refresh();
242}
243
244static void init_windows()
245{
246 w_num = 0;
247 int n_prompt = 0;
248 int n_friendslist = 1;
249 if (add_window(new_prompt(), n_prompt) == -1
250 || add_window(new_friendlist(), n_friendslist) == -1) {
251 fprintf(stderr, "add_window() failed.\n");
252 endwin();
253 exit(1);
254 }
255 prompt = &windows[n_prompt];
256}
257
258static void do_tox()
259{ 116{
260 static int conn_try = 0; 117 static int conn_try = 0;
261 static int conn_err = 0; 118 static int conn_err = 0;
@@ -279,7 +136,7 @@ static void do_tox()
279 doMessenger(m); 136 doMessenger(m);
280} 137}
281 138
282static void load_data(char *path) 139static void load_data(Messenger *m, char *path)
283{ 140{
284 FILE *fd; 141 FILE *fd;
285 size_t len; 142 size_t len;
@@ -336,88 +193,8 @@ static void load_data(char *path)
336 fclose(fd); 193 fclose(fd);
337} 194}
338 195
339static void draw_bar()
340{
341 static int odd = 0;
342 int blinkrate = 30;
343
344 attron(COLOR_PAIR(4));
345 mvhline(LINES - 2, 0, '_', COLS);
346 attroff(COLOR_PAIR(4));
347
348 move(LINES - 1, 0);
349
350 attron(COLOR_PAIR(4) | A_BOLD);
351 printw(" TOXIC " TOXICVER "|");
352 attroff(COLOR_PAIR(4) | A_BOLD);
353
354 int i;
355 for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) {
356 if (WINDOW_STATUS[i] != -1) {
357 if (i == active_window)
358 attron(A_BOLD);
359
360 odd = (odd+1) % blinkrate;
361 if (windows[i].blink && (odd < (blinkrate/2)))
362 attron(COLOR_PAIR(3));
363
364 printw(" %s", windows[i].title);
365 if (windows[i].blink && (odd < (blinkrate/2)))
366 attroff(COLOR_PAIR(3));
367
368 if (i == active_window) {
369 attroff(A_BOLD);
370 }
371 }
372 }
373 refresh();
374}
375
376void prepare_window(WINDOW *w)
377{
378 mvwin(w, 0, 0);
379 wresize(w, LINES-2, COLS);
380}
381
382/* Shows next window when tab or back-tab is pressed */
383void set_active_window(int ch)
384{
385 int f_inf = 0;
386 int max = MAX_WINDOW_SLOTS-1;
387 if (ch == '\t') {
388 int i = (active_window + 1) % max;
389 while (true) {
390 if (WINDOW_STATUS[i] != -1) {
391 active_window = i;
392 return;
393 }
394 i = (i + 1) % max;
395 if (f_inf++ > max) { // infinite loop check
396 endwin();
397 exit(2);
398 }
399 }
400 }else {
401 int i = active_window - 1;
402 if (i < 0) i = max;
403 while (true) {
404 if (WINDOW_STATUS[i] != -1) {
405 active_window = i;
406 return;
407 }
408 if (--i < 0) i = max;
409 if (f_inf++ > max) {
410 endwin();
411 exit(2);
412 }
413 }
414 }
415}
416
417int main(int argc, char *argv[]) 196int main(int argc, char *argv[])
418{ 197{
419 int ch;
420 ToxWindow* a;
421 char *user_config_dir = get_user_config_dir(); 198 char *user_config_dir = get_user_config_dir();
422 char *DATA_FILE; 199 char *DATA_FILE;
423 int config_err = create_user_config_dir(user_config_dir); 200 int config_err = create_user_config_dir(user_config_dir);
@@ -451,12 +228,12 @@ int main(int argc, char *argv[])
451 } 228 }
452 229
453 init_term(); 230 init_term();
454 init_tox(); 231 Messenger *m = init_tox();
455 init_windows(); 232 ToxWindow * prompt = init_windows(m);
456 init_window_status(); 233 init_window_status();
457 234
458 if(f_loadfromfile) 235 if(f_loadfromfile)
459 load_data(DATA_FILE); 236 load_data(m, DATA_FILE);
460 free(DATA_FILE); 237 free(DATA_FILE);
461 238
462 if (f_flag == -1) { 239 if (f_flag == -1) {
@@ -474,21 +251,10 @@ int main(int argc, char *argv[])
474 } 251 }
475 while(true) { 252 while(true) {
476 /* Update tox */ 253 /* Update tox */
477 do_tox(); 254 do_tox(m, prompt);
478 255
479 /* Draw */ 256 /* Draw */
480 a = &windows[active_window]; 257 draw_active_window(m);
481 prepare_window(a->window);
482 a->blink = false;
483 draw_bar();
484 a->onDraw(a);
485
486 /* Handle input */
487 ch = getch();
488 if (ch == '\t' || ch == KEY_BTAB)
489 set_active_window(ch);
490 else if (ch != ERR)
491 a->onKey(a, m, ch);
492 } 258 }
493 cleanupMessenger(m); 259 cleanupMessenger(m);
494 return 0; 260 return 0;
diff --git a/testing/toxic/prompt.c b/testing/toxic/prompt.c
index e1a7d75c..fb8a5090 100644
--- a/testing/toxic/prompt.c
+++ b/testing/toxic/prompt.c
@@ -11,11 +11,12 @@
11#include "../../core/network.h" 11#include "../../core/network.h"
12 12
13#include "windows.h" 13#include "windows.h"
14#include "prompt.h"
14 15
15uint8_t pending_requests[MAX_STR_SIZE][CLIENT_ID_SIZE]; // XXX 16uint8_t pending_requests[MAX_STR_SIZE][CLIENT_ID_SIZE]; // XXX
16uint8_t num_requests=0; // XXX 17uint8_t num_requests=0; // XXX
17 18
18extern void on_friendadded(int friendnumber); 19static friendAddedFn *on_friendadded;
19static char prompt_buf[MAX_STR_SIZE] = {0}; 20static char prompt_buf[MAX_STR_SIZE] = {0};
20static int prompt_buf_pos = 0; 21static int prompt_buf_pos = 0;
21 22
@@ -87,7 +88,7 @@ void cmd_accept(ToxWindow *self, Messenger *m, char **args)
87 wprintw(self->window, "Failed to add friend.\n"); 88 wprintw(self->window, "Failed to add friend.\n");
88 else { 89 else {
89 wprintw(self->window, "Friend accepted as: %d.\n", num); 90 wprintw(self->window, "Friend accepted as: %d.\n", num);
90 on_friendadded(num); 91 on_friendadded(m, num);
91 } 92 }
92} 93}
93 94
@@ -121,6 +122,11 @@ void cmd_add(ToxWindow *self, Messenger *m, char **args)
121 } 122 }
122 id_bin[i] = x; 123 id_bin[i] = x;
123 } 124 }
125
126 for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) {
127 id[i] = toupper(id[i]);
128 }
129
124 int num = m_addfriend(m, id_bin, (uint8_t*) msg, strlen(msg)+1); 130 int num = m_addfriend(m, id_bin, (uint8_t*) msg, strlen(msg)+1);
125 switch (num) { 131 switch (num) {
126 case FAERR_TOOLONG: 132 case FAERR_TOOLONG:
@@ -138,9 +144,15 @@ void cmd_add(ToxWindow *self, Messenger *m, char **args)
138 case FAERR_UNKNOWN: 144 case FAERR_UNKNOWN:
139 wprintw(self->window, "Undefined error when adding friend.\n"); 145 wprintw(self->window, "Undefined error when adding friend.\n");
140 break; 146 break;
147 case FAERR_BADCHECKSUM:
148 wprintw(self->window, "Bad checksum in address.\n");
149 break;
150 case FAERR_SETNEWNOSPAM:
151 wprintw(self->window, "Nospam was different.\n");
152 break;
141 default: 153 default:
142 wprintw(self->window, "Friend added as %d.\n", num); 154 wprintw(self->window, "Friend added as %d.\n", num);
143 on_friendadded(num); 155 on_friendadded(m, num);
144 break; 156 break;
145 } 157 }
146} 158}
@@ -422,8 +434,9 @@ static void prompt_onInit(ToxWindow *self, Messenger *m)
422 wclrtoeol(self->window); 434 wclrtoeol(self->window);
423} 435}
424 436
425ToxWindow new_prompt() 437ToxWindow new_prompt(friendAddedFn *f)
426{ 438{
439 on_friendadded = f;
427 ToxWindow ret; 440 ToxWindow ret;
428 memset(&ret, 0, sizeof(ret)); 441 memset(&ret, 0, sizeof(ret));
429 ret.onKey = &prompt_onKey; 442 ret.onKey = &prompt_onKey;
diff --git a/testing/toxic/prompt.h b/testing/toxic/prompt.h
new file mode 100644
index 00000000..6c5320ab
--- /dev/null
+++ b/testing/toxic/prompt.h
@@ -0,0 +1,14 @@
1#ifndef PROMPT_H_UZYGWFFL
2#define PROMPT_H_UZYGWFFL
3
4#include "windows.h"
5
6typedef void (friendAddedFn)(Messenger *m, int friendnumber);
7
8ToxWindow new_prompt(friendAddedFn *f);
9int add_req(uint8_t *public_key);
10unsigned char *hex_string_to_bin(char hex_string[]);
11
12#endif /* end of include guard: PROMPT_H_UZYGWFFL */
13
14
diff --git a/testing/toxic/windows.c b/testing/toxic/windows.c
new file mode 100644
index 00000000..d19392ac
--- /dev/null
+++ b/testing/toxic/windows.c
@@ -0,0 +1,235 @@
1#include "friendlist.h"
2#include "prompt.h"
3#include "windows.h"
4
5/* Holds status of chat windows */
6char WINDOW_STATUS[MAX_WINDOW_SLOTS];
7
8static int w_num;
9static ToxWindow windows[MAX_WINDOW_SLOTS];
10static Messenger *m;
11int active_window;
12
13static ToxWindow* prompt;
14
15/* CALLBACKS START */
16void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userdata)
17{
18 int n = add_req(public_key);
19 wprintw(prompt->window, "\nFriend request from:\n");
20
21 int i;
22 for (i = 0; i < KEY_SIZE_BYTES; ++i) {
23 wprintw(prompt->window, "%02x", public_key[i] & 0xff);
24 }
25
26 wprintw(prompt->window, "\nWith the message: %s\n", data);
27 wprintw(prompt->window, "\nUse \"accept %d\" to accept it.\n", n);
28
29 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
30 if (windows[i].onFriendRequest != NULL)
31 windows[i].onFriendRequest(&windows[i], public_key, data, length);
32 }
33}
34
35void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
36{
37 int i;
38 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
39 if (windows[i].onMessage != NULL)
40 windows[i].onMessage(&windows[i], m, friendnumber, string, length);
41 }
42}
43
44void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
45{
46 int i;
47 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
48 if (windows[i].onAction != NULL)
49 windows[i].onAction(&windows[i], m, friendnumber, string, length);
50 }
51}
52
53void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
54{
55 wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string);
56 int i;
57 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
58 if (windows[i].onNickChange != NULL)
59 windows[i].onNickChange(&windows[i], friendnumber, string, length);
60 }
61}
62
63void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
64{
65 wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string);
66 int i;
67 for (i=0; i<MAX_WINDOW_SLOTS; ++i) {
68 if (windows[i].onStatusChange != NULL)
69 windows[i].onStatusChange(&windows[i], friendnumber, string, length);
70 }
71}
72
73void on_friendadded(Messenger *m, int friendnumber)
74{
75 friendlist_onFriendAdded(m, friendnumber);
76}
77/* CALLBACKS END */
78
79int add_window(Messenger *m, ToxWindow w, int n)
80{
81 if (w_num >= TOXWINDOWS_MAX_NUM)
82 return -1;
83
84 if (LINES < 2)
85 return -1;
86
87 w.window = newwin(LINES - 2, COLS, 0, 0);
88 if (w.window == NULL)
89 return -1;
90
91 windows[n] = w;
92 w.onInit(&w, m);
93 w_num++;
94 active_window = n;
95 return n;
96}
97
98/* Deletes window w and cleans up */
99void del_window(ToxWindow *w, int f_num)
100{
101 active_window = 0; // Go to prompt screen
102 delwin(w->window);
103 int i;
104 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
105 if (WINDOW_STATUS[i] == f_num) {
106 WINDOW_STATUS[i] = -1;
107 disable_chatwin(f_num);
108 break;
109 }
110 }
111 clear();
112 refresh();
113}
114
115/* Shows next window when tab or back-tab is pressed */
116void set_active_window(int ch)
117{
118 int f_inf = 0;
119 int max = MAX_WINDOW_SLOTS-1;
120 if (ch == '\t') {
121 int i = (active_window + 1) % max;
122 while (true) {
123 if (WINDOW_STATUS[i] != -1) {
124 active_window = i;
125 return;
126 }
127 i = (i + 1) % max;
128 if (f_inf++ > max) { // infinite loop check
129 endwin();
130 exit(2);
131 }
132 }
133 }else {
134 int i = active_window - 1;
135 if (i < 0) i = max;
136 while (true) {
137 if (WINDOW_STATUS[i] != -1) {
138 active_window = i;
139 return;
140 }
141 if (--i < 0) i = max;
142 if (f_inf++ > max) {
143 endwin();
144 exit(2);
145 }
146 }
147 }
148}
149
150void init_window_status()
151{
152 /* Default window values decrement from -2 */
153 int i;
154 for (i = 0; i < N_DEFAULT_WINS; ++i)
155 WINDOW_STATUS[i] = -(i+2);
156
157 int j;
158 for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++)
159 WINDOW_STATUS[j] = -1;
160}
161
162ToxWindow * init_windows()
163{
164 w_num = 0;
165 int n_prompt = 0;
166 int n_friendslist = 1;
167 if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1
168 || add_window(m, new_friendlist(WINDOW_STATUS), n_friendslist) == -1) {
169 fprintf(stderr, "add_window() failed.\n");
170 endwin();
171 exit(1);
172 }
173 prompt = &windows[n_prompt];
174 return prompt;
175}
176
177static void draw_bar()
178{
179 static int odd = 0;
180 int blinkrate = 30;
181
182 attron(COLOR_PAIR(4));
183 mvhline(LINES - 2, 0, '_', COLS);
184 attroff(COLOR_PAIR(4));
185
186 move(LINES - 1, 0);
187
188 attron(COLOR_PAIR(4) | A_BOLD);
189 printw(" TOXIC " TOXICVER "|");
190 attroff(COLOR_PAIR(4) | A_BOLD);
191
192 int i;
193 for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) {
194 if (WINDOW_STATUS[i] != -1) {
195 if (i == active_window)
196 attron(A_BOLD);
197
198 odd = (odd+1) % blinkrate;
199 if (windows[i].blink && (odd < (blinkrate/2)))
200 attron(COLOR_PAIR(3));
201
202 printw(" %s", windows[i].title);
203 if (windows[i].blink && (odd < (blinkrate/2)))
204 attroff(COLOR_PAIR(3));
205
206 if (i == active_window) {
207 attroff(A_BOLD);
208 }
209 }
210 }
211 refresh();
212}
213
214void prepare_window(WINDOW *w)
215{
216 mvwin(w, 0, 0);
217 wresize(w, LINES-2, COLS);
218}
219
220void draw_active_window(Messenger * m)
221{
222
223 ToxWindow *a = &windows[active_window];
224 prepare_window(a->window);
225 a->blink = false;
226 draw_bar();
227 a->onDraw(a);
228
229 /* Handle input */
230 int ch = getch();
231 if (ch == '\t' || ch == KEY_BTAB)
232 set_active_window(ch);
233 else if (ch != ERR)
234 a->onKey(a, m, ch);
235}
diff --git a/testing/toxic/windows.h b/testing/toxic/windows.h
index 648243d0..7d81e814 100644
--- a/testing/toxic/windows.h
+++ b/testing/toxic/windows.h
@@ -1,8 +1,13 @@
1/* 1/*
2 * Toxic -- Tox Curses Client 2 * Toxic -- Tox Curses Client
3 */ 3 */
4#ifndef _windows_h
5#define _windows_h
4 6
7#include <curses.h>
8#include <stdint.h>
5#include <stdbool.h> 9#include <stdbool.h>
10#include "../../core/Messenger.h"
6#define TOXWINDOWS_MAX_NUM 32 11#define TOXWINDOWS_MAX_NUM 32
7#define MAX_FRIENDS_NUM 100 12#define MAX_FRIENDS_NUM 100
8#define MAX_STR_SIZE 256 13#define MAX_STR_SIZE 256
@@ -14,6 +19,10 @@
14/* maximum window slots for WINDOW_STATUS array */ 19/* maximum window slots for WINDOW_STATUS array */
15#define MAX_WINDOW_SLOTS N_DEFAULT_WINS+MAX_FRIENDS_NUM 20#define MAX_WINDOW_SLOTS N_DEFAULT_WINS+MAX_FRIENDS_NUM
16 21
22#ifndef TOXICVER
23#define TOXICVER "NOVER" //Use the -D flag to set this
24#endif
25
17typedef struct ToxWindow_ ToxWindow; 26typedef struct ToxWindow_ ToxWindow;
18 27
19struct ToxWindow_ { 28struct ToxWindow_ {
@@ -32,3 +41,17 @@ struct ToxWindow_ {
32 41
33 WINDOW* window; 42 WINDOW* window;
34}; 43};
44
45void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userdata);
46void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata);
47void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata);
48void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata);
49void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata);
50void init_window_status();
51ToxWindow * init_windows();
52void draw_active_window(Messenger * m);
53int add_window(Messenger *m, ToxWindow w, int n);
54void del_window(ToxWindow *w, int f_num);
55void set_active_window(int ch);
56#endif
57