void GUI::timer() { int pos = -1; FILE* f = nullptr; if(!log.empty()) { f = fopen(log.c_str(), "a"); } std::unique_ptr<Message> messagePtr; while(messages.pop(messagePtr)) { auto& message = *messagePtr.get(); //TODO Handle filtering here /* DFilter filt(message); */ if(!(message.hubOrUser ? hubMessages : userMessages)) { continue; } auto ip = Util::toT(message.ip); if(!filterSel.empty() && ip != filterSel) { continue; } if(!regex.empty()) { try { if(!boost::regex_search(message.message, regex)) { continue; } } catch(const std::runtime_error&) { // most likely a stack overflow, ignore... continue; } } if(f) { fprintf(f, "%u [%s] [%s] %s:%u (%s): %s\n", counter, message.sending ? "Out" : "In", message.protocol.c_str(), message.ip.c_str(), message.port, message.peer.c_str(), message.message.c_str()); } auto item = new Item; item->index = Util::toT(boost::lexical_cast<string>(counter)); item->dir = message.sending ? _T("Out") : _T("In"); item->protocol = Util::toT(message.protocol); item->ip = move(ip); item->port = Util::toT(boost::lexical_cast<string>(message.port)); item->peer = Util::toT(message.peer); item->message = Util::toT(message.message); std::vector<tstring> row; row.push_back(item->index); row.push_back(item->dir); row.push_back(item->protocol); row.push_back(item->ip); row.push_back(item->port); row.push_back(item->peer); row.push_back(item->message); pos = table->insert(row, reinterpret_cast<LPARAM>(item)); ++counter; if(filter.find(item->ip) == filter.end()) { filterW->addValue(*filter.insert(item->ip).first); } } if(f) { fclose(f); } if(scroll && pos != -1) { // make sure something was added table->ensureVisible(pos); } }