summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2013-10-01 18:59:33 -0400
committerirungentoo <irungentoo@gmail.com>2013-10-01 18:59:33 -0400
commit6182af8449920a0256b91affe74d873066b17c99 (patch)
treec700118aa53c4fb9825dc77ecea12bb9bf0a15f2
parent6dbc8a54969421c5baeb0ec7bb50779c62ae2e44 (diff)
nTox updated with changes in core, some file sending things fixes.
-rw-r--r--testing/nTox.c60
-rw-r--r--toxcore/Messenger.c36
-rw-r--r--toxcore/Messenger.h16
3 files changed, 104 insertions, 8 deletions
diff --git a/testing/nTox.c b/testing/nTox.c
index cbf8d028..92827554 100644
--- a/testing/nTox.c
+++ b/testing/nTox.c
@@ -103,17 +103,26 @@ void send_filesenders(Tox *m)
103} 103}
104int add_filesender(Tox *m, uint16_t friendnum, char *filename) 104int add_filesender(Tox *m, uint16_t friendnum, char *filename)
105{ 105{
106 file_senders[numfilesenders].file = fopen(filename, "r"); 106 FILE *tempfile = fopen(filename, "r");
107 107
108 if (file_senders[numfilesenders].file == 0) 108 if (tempfile == 0)
109 return -1; 109 return -1;
110 110
111 fseek(tempfile, 0, SEEK_END);
112 uint64_t filesize = ftell(tempfile);
113 fseek(tempfile, 0, SEEK_SET);
114 int filenum = new_filesender(m, friendnum, filesize, filename, strlen(filename) + 1);
115
116 if (filenum == -1)
117 return -1;
118
119 file_senders[numfilesenders].file = tempfile;
111 file_senders[numfilesenders].piecelength = fread(file_senders[numfilesenders].nextpiece, 1, 1000, 120 file_senders[numfilesenders].piecelength = fread(file_senders[numfilesenders].nextpiece, 1, 1000,
112 file_senders[numfilesenders].file); 121 file_senders[numfilesenders].file);
113 file_senders[numfilesenders].friendnum = friendnum; 122 file_senders[numfilesenders].friendnum = friendnum;
114 file_senders[numfilesenders].filenumber = numfilesenders; 123 file_senders[numfilesenders].filenumber = filenum;
115 ++numfilesenders; 124 ++numfilesenders;
116 return (numfilesenders - 1); 125 return filenum;
117} 126}
118 127
119/* 128/*
@@ -421,7 +430,7 @@ void line_eval(Tox *m, char *line)
421 int friendnum = strtoul(line + prompt_offset, posi, 0); 430 int friendnum = strtoul(line + prompt_offset, posi, 0);
422 431
423 if (**posi != 0) { 432 if (**posi != 0) {
424 sprintf(msg, "[t] Sending file %s to friendnum %u returned %i (-1 means failure)", *posi + 1, friendnum, 433 sprintf(msg, "[t] Sending file %s to friendnum %u filenumber is %i (-1 means failure)", *posi + 1, friendnum,
425 add_filesender(m, friendnum, *posi + 1)); 434 add_filesender(m, friendnum, *posi + 1));
426 new_lines(msg); 435 new_lines(msg);
427 } 436 }
@@ -645,11 +654,48 @@ void print_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *messag
645 new_lines(msg); 654 new_lines(msg);
646} 655}
647 656
648void write_file(Tox *tox, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata) 657void file_request_accept(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename,
658 uint16_t filename_length, void *userdata)
659{
660 char msg[512];
661 sprintf(msg, "[t] %u is sending us: %s of size %llu", friendnumber, filename, filesize);
662 new_lines(msg);
663
664 if (file_control(m, friendnumber, filenumber, 0, 0, 0)) {
665 sprintf(msg, "Accepted file transfer. (saving file as: %u.%u.bin)", friendnumber, filenumber);
666 new_lines(msg);
667 } else
668 new_lines("Could not accept file transfer.");
669}
670
671void file_print_control(Tox *m, int friendnumber, uint8_t filenumber, uint8_t control_type, uint8_t *data,
672 uint16_t length, void *userdata)
673{
674 char msg[512] = {0};
675
676 if (control_type == 0)
677 sprintf(msg, "[t] %u accepted file transfer: %u", friendnumber, filenumber, friendnumber, filenumber);
678 else if (control_type == 3)
679 sprintf(msg, "[t] %u file transfer: %u completed", friendnumber, filenumber);
680 else
681 sprintf(msg, "[t] control %u received", control_type);
682
683 new_lines(msg);
684}
685
686void write_file(Tox *m, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata)
649{ 687{
650 char filename[256]; 688 char filename[256];
651 sprintf(filename, "%u.%u.bin", friendnumber, filenumber); 689 sprintf(filename, "%u.%u.bin", friendnumber, filenumber);
652 FILE *pFile = fopen(filename, "a"); 690 FILE *pFile = fopen(filename, "a");
691
692 if (file_dataremaining(m, friendnumber, filenumber, 1) == 0) {
693 file_control(m, friendnumber, filenumber, 3, 0, 0);
694 char msg[512];
695 sprintf(msg, "[t] %u file transfer: %u completed", friendnumber, filenumber);
696 new_lines(msg);
697 }
698
653 fwrite(data, length, 1, pFile); 699 fwrite(data, length, 1, pFile);
654 fclose(pFile); 700 fclose(pFile);
655} 701}
@@ -702,6 +748,8 @@ int main(int argc, char *argv[])
702 tox_callback_group_invite(m, print_invite, NULL); 748 tox_callback_group_invite(m, print_invite, NULL);
703 tox_callback_group_message(m, print_groupmessage, NULL); 749 tox_callback_group_message(m, print_groupmessage, NULL);
704 callback_file_data(m, write_file, NULL); 750 callback_file_data(m, write_file, NULL);
751 callback_file_control(m, file_print_control, NULL);
752 callback_file_sendrequest(m, file_request_accept, NULL);
705 753
706 initscr(); 754 initscr();
707 noecho(); 755 noecho();
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c
index 39bcd704..49be4a0a 100644
--- a/toxcore/Messenger.c
+++ b/toxcore/Messenger.c
@@ -1038,7 +1038,7 @@ int file_control(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t mes
1038 if (friend_not_valid(m, friendnumber)) 1038 if (friend_not_valid(m, friendnumber))
1039 return 0; 1039 return 0;
1040 1040
1041 if (m->friendlist[friendnumber].file_sending[filenumber].status == 0) 1041 if (m->friendlist[friendnumber].file_receiving[filenumber].status == 0)
1042 return 0; 1042 return 0;
1043 1043
1044 uint8_t packet[MAX_DATA_SIZE]; 1044 uint8_t packet[MAX_DATA_SIZE];
@@ -1097,6 +1097,34 @@ int file_data(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t *data,
1097 return 0; 1097 return 0;
1098 1098
1099} 1099}
1100
1101/* Give the number of bytes left to be sent/received.
1102 *
1103 * send_receive is 0 if we want the sending files, 1 if we want the receiving.
1104 *
1105 * return number of bytes remaining to be sent/received on success
1106 * return 0 on failure
1107 */
1108uint64_t file_dataremaining(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t send_receive)
1109{
1110 if (friend_not_valid(m, friendnumber))
1111 return 0;
1112
1113 if (send_receive == 0) {
1114 if (m->friendlist[friendnumber].file_sending[filenumber].status == 0)
1115 return 0;
1116
1117 return m->friendlist[friendnumber].file_sending[filenumber].size -
1118 m->friendlist[friendnumber].file_sending[filenumber].transferred;
1119 } else {
1120 if (m->friendlist[friendnumber].file_receiving[filenumber].status == 0)
1121 return 0;
1122
1123 return m->friendlist[friendnumber].file_receiving[filenumber].size -
1124 m->friendlist[friendnumber].file_receiving[filenumber].transferred;
1125 }
1126}
1127
1100/* Run this when the friend disconnects. 1128/* Run this when the friend disconnects.
1101 * Sets all current file transfers to broken. 1129 * Sets all current file transfers to broken.
1102 */ 1130 */
@@ -1427,9 +1455,11 @@ void doFriends(Messenger *m)
1427 uint8_t filenumber = data[0]; 1455 uint8_t filenumber = data[0];
1428 uint64_t filesize; 1456 uint64_t filesize;
1429 memcpy(&filesize, data + 1, sizeof(filesize)); 1457 memcpy(&filesize, data + 1, sizeof(filesize));
1430
1431 //TODO: 1458 //TODO:
1432 //filesize = ntohll(filesize); 1459 //filesize = ntohll(filesize);
1460 m->friendlist[i].file_receiving[filenumber].status = 1;
1461 m->friendlist[i].file_receiving[filenumber].size = filesize;
1462
1433 if (m->file_sendrequest) 1463 if (m->file_sendrequest)
1434 (*m->file_sendrequest)(m, i, filenumber, filesize, data + 1 + sizeof(uint64_t), data_length - 1 - sizeof(uint64_t), 1464 (*m->file_sendrequest)(m, i, filenumber, filesize, data + 1 + sizeof(uint64_t), data_length - 1 - sizeof(uint64_t),
1435 m->file_sendrequest_userdata); 1465 m->file_sendrequest_userdata);
@@ -1462,6 +1492,8 @@ void doFriends(Messenger *m)
1462 if (m->friendlist[i].file_receiving[filenumber].status == 0) 1492 if (m->friendlist[i].file_receiving[filenumber].status == 0)
1463 break; 1493 break;
1464 1494
1495 m->friendlist[i].file_receiving[filenumber].transferred += (data_length - 1);
1496
1465 if (m->file_filedata) 1497 if (m->file_filedata)
1466 (*m->file_filedata)(m, i, filenumber, data + 1, data_length - 1, m->file_filedata_userdata); 1498 (*m->file_filedata)(m, i, filenumber, data + 1, data_length - 1, m->file_filedata_userdata);
1467 1499
diff --git a/toxcore/Messenger.h b/toxcore/Messenger.h
index fbf4d767..ca99fa18 100644
--- a/toxcore/Messenger.h
+++ b/toxcore/Messenger.h
@@ -502,6 +502,13 @@ void callback_file_data(Messenger *m, void (*function)(Messenger *m, int, uint8_
502int file_sendrequest(Messenger *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, 502int file_sendrequest(Messenger *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename,
503 uint16_t filename_length); 503 uint16_t filename_length);
504 504
505/* Send a file send request.
506 * Maximum filename length is 256 bytes.
507 * return file number on success
508 * return -1 on failure
509 */
510int new_filesender(Messenger *m, int friendnumber, uint64_t filesize, uint8_t *filename, uint16_t filename_length);
511
505/* Send a file control request. 512/* Send a file control request.
506 * 513 *
507 * return 1 on success 514 * return 1 on success
@@ -517,6 +524,15 @@ int file_control(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t mes
517 */ 524 */
518int file_data(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length); 525int file_data(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length);
519 526
527/* Give the number of bytes left to be sent/received.
528 *
529 * send_receive is 0 if we want the sending files, 1 if we want the receiving.
530 *
531 * return number of bytes remaining to be sent/received on success
532 * return 0 on failure
533 */
534uint64_t file_dataremaining(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t send_receive);
535
520/*********************************/ 536/*********************************/
521 537
522/* Run this at startup. 538/* Run this at startup.