コード例 #1
0
ファイル: GUI.cpp プロジェクト: iceman50/dc-dev-plugin
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);
	}
}