diff options
author | irungentoo <irungentoo@gmail.com> | 2013-10-02 20:53:48 -0400 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2013-10-02 20:53:48 -0400 |
commit | c014cebbe5753287c2d0657e0ebe002a520017b0 (patch) | |
tree | 5ac34c6c9e75bf35b90b464231cfb2e8ab7b83e0 /testing/nTox.c | |
parent | efa3c79699c4d0af21b7fcdc30b6117adfdc1e9d (diff) | |
parent | fbd494a8b44d58911a6329761d48a85f71fc1718 (diff) |
Merge branch 'file-transfers'
File transfers are now working and in public api.
Diffstat (limited to 'testing/nTox.c')
-rw-r--r-- | testing/nTox.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/testing/nTox.c b/testing/nTox.c index 6ac663a6..f82c0fba 100644 --- a/testing/nTox.c +++ b/testing/nTox.c | |||
@@ -67,6 +67,68 @@ typedef struct { | |||
67 | Friend_request pending_requests[256]; | 67 | Friend_request pending_requests[256]; |
68 | uint8_t num_requests = 0; | 68 | uint8_t num_requests = 0; |
69 | 69 | ||
70 | #define NUM_FILE_SENDERS 256 | ||
71 | typedef struct { | ||
72 | FILE *file; | ||
73 | uint16_t friendnum; | ||
74 | uint8_t filenumber; | ||
75 | uint8_t nextpiece[1024]; | ||
76 | uint16_t piecelength; | ||
77 | } File_Sender; | ||
78 | File_Sender file_senders[NUM_FILE_SENDERS]; | ||
79 | uint8_t numfilesenders; | ||
80 | |||
81 | void send_filesenders(Tox *m) | ||
82 | { | ||
83 | uint32_t i; | ||
84 | |||
85 | for (i = 0; i < NUM_FILE_SENDERS; ++i) { | ||
86 | if (file_senders[i].file == 0) | ||
87 | continue; | ||
88 | |||
89 | while (1) { | ||
90 | if (!tox_file_senddata(m, file_senders[i].friendnum, file_senders[i].filenumber, file_senders[i].nextpiece, | ||
91 | file_senders[i].piecelength)) | ||
92 | break; | ||
93 | |||
94 | file_senders[i].piecelength = fread(file_senders[i].nextpiece, 1, 1000, file_senders[i].file); | ||
95 | |||
96 | if (file_senders[i].piecelength == 0) { | ||
97 | fclose(file_senders[i].file); | ||
98 | file_senders[i].file = 0; | ||
99 | tox_file_sendcontrol(m, file_senders[i].friendnum, 0, file_senders[i].filenumber, 3, 0, 0); | ||
100 | char msg[512]; | ||
101 | sprintf(msg, "[t] %u file transfer: %u completed", file_senders[i].friendnum, file_senders[i].filenumber); | ||
102 | new_lines(msg); | ||
103 | break; | ||
104 | } | ||
105 | } | ||
106 | } | ||
107 | } | ||
108 | int add_filesender(Tox *m, uint16_t friendnum, char *filename) | ||
109 | { | ||
110 | FILE *tempfile = fopen(filename, "r"); | ||
111 | |||
112 | if (tempfile == 0) | ||
113 | return -1; | ||
114 | |||
115 | fseek(tempfile, 0, SEEK_END); | ||
116 | uint64_t filesize = ftell(tempfile); | ||
117 | fseek(tempfile, 0, SEEK_SET); | ||
118 | int filenum = tox_new_filesender(m, friendnum, filesize, (uint8_t *)filename, strlen(filename) + 1); | ||
119 | |||
120 | if (filenum == -1) | ||
121 | return -1; | ||
122 | |||
123 | file_senders[numfilesenders].file = tempfile; | ||
124 | file_senders[numfilesenders].piecelength = fread(file_senders[numfilesenders].nextpiece, 1, 1000, | ||
125 | file_senders[numfilesenders].file); | ||
126 | file_senders[numfilesenders].friendnum = friendnum; | ||
127 | file_senders[numfilesenders].filenumber = filenum; | ||
128 | ++numfilesenders; | ||
129 | return filenum; | ||
130 | } | ||
131 | |||
70 | /* | 132 | /* |
71 | resolve_addr(): | 133 | resolve_addr(): |
72 | address should represent IPv4 or a hostname with A record | 134 | address should represent IPv4 or a hostname with A record |
@@ -366,6 +428,16 @@ void line_eval(Tox *m, char *line) | |||
366 | tox_group_message_send(m, groupnumber, (uint8_t *)*posi + 1, strlen(*posi + 1) + 1)); | 428 | tox_group_message_send(m, groupnumber, (uint8_t *)*posi + 1, strlen(*posi + 1) + 1)); |
367 | new_lines(msg); | 429 | new_lines(msg); |
368 | } | 430 | } |
431 | } else if (inpt_command == 't') { | ||
432 | char msg[512]; | ||
433 | char *posi[1]; | ||
434 | int friendnum = strtoul(line + prompt_offset, posi, 0); | ||
435 | |||
436 | if (**posi != 0) { | ||
437 | sprintf(msg, "[t] Sending file %s to friendnum %u filenumber is %i (-1 means failure)", *posi + 1, friendnum, | ||
438 | add_filesender(m, friendnum, *posi + 1)); | ||
439 | new_lines(msg); | ||
440 | } | ||
369 | } else if (inpt_command == 'q') { //exit | 441 | } else if (inpt_command == 'q') { //exit |
370 | save_data(m); | 442 | save_data(m); |
371 | endwin(); | 443 | endwin(); |
@@ -586,6 +658,53 @@ void print_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *messag | |||
586 | new_lines(msg); | 658 | new_lines(msg); |
587 | } | 659 | } |
588 | 660 | ||
661 | void file_request_accept(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, | ||
662 | uint16_t filename_length, void *userdata) | ||
663 | { | ||
664 | char msg[512]; | ||
665 | sprintf(msg, "[t] %u is sending us: %s of size %llu", friendnumber, filename, filesize); | ||
666 | new_lines(msg); | ||
667 | |||
668 | if (tox_file_sendcontrol(m, friendnumber, 1, filenumber, 0, 0, 0)) { | ||
669 | sprintf(msg, "Accepted file transfer. (saving file as: %u.%u.bin)", friendnumber, filenumber); | ||
670 | new_lines(msg); | ||
671 | } else | ||
672 | new_lines("Could not accept file transfer."); | ||
673 | } | ||
674 | |||
675 | void file_print_control(Tox *m, int friendnumber, uint8_t send_recieve, uint8_t filenumber, uint8_t control_type, | ||
676 | uint8_t *data, | ||
677 | uint16_t length, void *userdata) | ||
678 | { | ||
679 | char msg[512] = {0}; | ||
680 | |||
681 | if (control_type == 0) | ||
682 | sprintf(msg, "[t] %u accepted file transfer: %u", friendnumber, filenumber); | ||
683 | else if (control_type == 3) | ||
684 | sprintf(msg, "[t] %u file transfer: %u completed", friendnumber, filenumber); | ||
685 | else | ||
686 | sprintf(msg, "[t] control %u received", control_type); | ||
687 | |||
688 | new_lines(msg); | ||
689 | } | ||
690 | |||
691 | void write_file(Tox *m, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata) | ||
692 | { | ||
693 | char filename[256]; | ||
694 | sprintf(filename, "%u.%u.bin", friendnumber, filenumber); | ||
695 | FILE *pFile = fopen(filename, "a"); | ||
696 | |||
697 | if (tox_file_dataremaining(m, friendnumber, filenumber, 1) == 0) { | ||
698 | //file_control(m, friendnumber, 1, filenumber, 3, 0, 0); | ||
699 | char msg[512]; | ||
700 | sprintf(msg, "[t] %u file transfer: %u completed", friendnumber, filenumber); | ||
701 | new_lines(msg); | ||
702 | } | ||
703 | |||
704 | fwrite(data, length, 1, pFile); | ||
705 | fclose(pFile); | ||
706 | } | ||
707 | |||
589 | 708 | ||
590 | int main(int argc, char *argv[]) | 709 | int main(int argc, char *argv[]) |
591 | { | 710 | { |
@@ -633,6 +752,9 @@ int main(int argc, char *argv[]) | |||
633 | tox_callback_statusmessage(m, print_statuschange, NULL); | 752 | tox_callback_statusmessage(m, print_statuschange, NULL); |
634 | tox_callback_group_invite(m, print_invite, NULL); | 753 | tox_callback_group_invite(m, print_invite, NULL); |
635 | tox_callback_group_message(m, print_groupmessage, NULL); | 754 | tox_callback_group_message(m, print_groupmessage, NULL); |
755 | tox_callback_file_data(m, write_file, NULL); | ||
756 | tox_callback_file_control(m, file_print_control, NULL); | ||
757 | tox_callback_file_sendrequest(m, file_request_accept, NULL); | ||
636 | 758 | ||
637 | initscr(); | 759 | initscr(); |
638 | noecho(); | 760 | noecho(); |
@@ -668,6 +790,7 @@ int main(int argc, char *argv[]) | |||
668 | } | 790 | } |
669 | 791 | ||
670 | time_t timestamp0 = time(NULL); | 792 | time_t timestamp0 = time(NULL); |
793 | |||
671 | while (1) { | 794 | while (1) { |
672 | if (on == 0) { | 795 | if (on == 0) { |
673 | if (tox_isconnected(m)) { | 796 | if (tox_isconnected(m)) { |
@@ -675,6 +798,7 @@ int main(int argc, char *argv[]) | |||
675 | on = 1; | 798 | on = 1; |
676 | } else { | 799 | } else { |
677 | time_t timestamp1 = time(NULL); | 800 | time_t timestamp1 = time(NULL); |
801 | |||
678 | if (timestamp0 + 10 < timestamp1) { | 802 | if (timestamp0 + 10 < timestamp1) { |
679 | timestamp0 = timestamp1; | 803 | timestamp0 = timestamp1; |
680 | tox_bootstrap_from_address(m, argv[argvoffset + 1], ipv6enabled, port, binary_string); | 804 | tox_bootstrap_from_address(m, argv[argvoffset + 1], ipv6enabled, port, binary_string); |
@@ -682,6 +806,7 @@ int main(int argc, char *argv[]) | |||
682 | } | 806 | } |
683 | } | 807 | } |
684 | 808 | ||
809 | send_filesenders(m); | ||
685 | tox_do(m); | 810 | tox_do(m); |
686 | c_sleep(1); | 811 | c_sleep(1); |
687 | do_refresh(); | 812 | do_refresh(); |