#include <iostream>
#include <thread>
#include <boost/chrono.hpp>
#include <boost/thread.hpp>
extern "C" {
struct ReceivedMessage {
const uint8_t* message;
size_t size;
const char* sender_tag;
};
void* init_logging();
char init_ephemeral();
char get_self_address(void (*callback)(const char*));
char send_message(const char*, const char*);
char listen_for_incoming(void (*callback)(ReceivedMessage));
char reply(const char*, const char*);
}
char return_code = 0;
char sender_tag[22];
char addr[134];
char message[14] = "Hello World";
char reply_message[14] = "Reply World";
void string_callback_function(const char* c_string) {
std::cout << "(c++) callback received: " << c_string << std::endl;
strcpy(addr, c_string);
}
void incoming_message_callback(ReceivedMessage received) {
std::cout << "(c++) sender tag: " << received.sender_tag << std::endl;
std::cout << "(c++) message: " << received.message << std::endl;
std::cout << "(c++) message length : " << received.size << std::endl;
const char* incoming_sender_tag = received.sender_tag;
strcpy(sender_tag, incoming_sender_tag);
}
int handle(char return_code) {
if (return_code == 0) {
return 0;
} else {
return -1;
}
}
int main() {
init_logging();
boost::packaged_task<char> init(boost::bind(init_ephemeral));
boost::unique_future<char> init_future = init.get_future();
init();
return_code = init_future.get();
handle(return_code);
return_code = get_self_address(string_callback_function);
handle(return_code);
std::cout << "(c++) message to send through mixnet: " << message << std::endl;
boost::packaged_task<char> send(boost::bind(send_message, addr, message));
boost::unique_future<char> send_future = send.get_future();
send();
return_code = send_future.get();
handle(return_code);
boost::packaged_task<char> listen(boost::bind(listen_for_incoming, incoming_message_callback));
boost::unique_future<char> listen_future = listen.get_future();
listen();
return_code = listen_future.get();
handle(return_code);
boost::packaged_task<char> reply_fn(boost::bind(reply, sender_tag, reply_message));
boost::unique_future<char> reply_future = reply_fn.get_future();
reply_fn();
return_code = reply_future.get();
handle(return_code);
std::this_thread::sleep_for(std::chrono::seconds(40));
return 0;
}