#include "MessageMessageBox.h"
#include "PdGraph.h"
message::Object *MessageMessageBox::new_object(pd::Message *initString, PdGraph *graph) {
return new MessageMessageBox(initString->get_symbol(0), graph);
}
MessageMessageBox::MessageMessageBox(char *initString, PdGraph *graph) : message::Object(1, 1, graph) {
vector<string> messageInitListAll = utils::tokenize_string(initString, "\\;");
vector<string> messageInitList = utils::tokenize_string((char *) messageInitListAll[0].c_str(), "\\,");
for (int i = 0; i < messageInitList.size(); i++) {
string initString = messageInitList[i];
int maxElements = (initString.size()/2)+1;
pd::Message *message = PD_MESSAGE_ON_STACK(maxElements);
if (strcmp(initString.c_str(), ";") != 0) {
char str[initString.size()+1]; strcpy(str, initString.c_str());
message->from_string(0.0, maxElements, str);
localMessageList.push_back(message->clone_on_heap());
}
}
for (int i = 1; i < messageInitListAll.size(); i++) {
string initString = messageInitListAll[i];
if (strcmp(initString.c_str(), ";") != 0) {
initString = string(initString, initString.find_first_not_of(" "));
string name = string(initString, 0, initString.find(" "));
string messageString = string(initString, initString.find(" ")+1);
int maxElements = (messageString.size()/2)+1;
pd::Message *message = PD_MESSAGE_ON_STACK(maxElements);
char str[messageString.size()+1]; strcpy(str, messageString.c_str());
message->from_string(0.0, maxElements, str);
MessageNamedDestination namedDestination =
Connection::new(utils::copy_string(name.c_str()), message->clone_on_heap());
remoteMessageList.push_back(namedDestination);
}
}
}
MessageMessageBox::~MessageMessageBox() {
for (int i = 0; i < localMessageList.size(); i++) {
localMessageList.at(i)->free_message();
}
for (int i = 0; i < remoteMessageList.size(); i++) {
MessageNamedDestination namedDestination = remoteMessageList.at(i);
free(namedDestination.first);
namedDestination.second->free_message();
}
}
void MessageMessageBox::process_message(int inlet_index, pd::Message *message) {
#define RES_BUFFER_LENGTH 64
char resolvedName[RES_BUFFER_LENGTH];
pd::Message *outgoing_message = PD_MESSAGE_ON_STACK(64);
for (int i = 0; i < localMessageList.size(); i++) {
pd::Message *messageTemplate = localMessageList.at(i);
int numElements = messageTemplate->get_num_elements();
outgoing_message->from_timestamp(message->get_timestamp(), numElements);
memcpy(outgoing_message->get_element(0), messageTemplate->get_element(0), numElements*sizeof(pd::message::Atom));
for (int i = 0; i < numElements; i++) {
if (messageTemplate->is_symbol(i)) {
char *buffer = (char *) alloca(RES_BUFFER_LENGTH * sizeof(char));
pd::Message::resolve_string(messageTemplate->get_symbol(i), message, 1, buffer, RES_BUFFER_LENGTH);
outgoing_message->parseAndSetMessageElement(i, buffer); }
}
send_message(0, outgoing_message);
}
for (int i = 0; i < remoteMessageList.size(); i++) {
MessageNamedDestination namedDestination = remoteMessageList.at(i);
pd::Message::resolve_string(namedDestination.first, message, 1, resolvedName, RES_BUFFER_LENGTH);
pd::Message *messageTemplate = namedDestination.second;
int numElements = messageTemplate->get_num_elements();
outgoing_message->from_timestamp(message->get_timestamp(), numElements);
memcpy(outgoing_message->get_element(0), messageTemplate->get_element(0), numElements*sizeof(pd::message::Atom));
for (int i = 0; i < numElements; i++) {
if (messageTemplate->is_symbol(i)) {
char *buffer = (char *) alloca(RES_BUFFER_LENGTH * sizeof(char));
pd::Message::resolve_string(messageTemplate->get_symbol(i), message, 1, buffer, RES_BUFFER_LENGTH);
outgoing_message->set_symbol(i, buffer);
}
}
graph->send_message_to_named_receivers(resolvedName, outgoing_message);
}
}