Example #1
0
bool HandlePacket (Packet& request, Packet& response) {
	int uid, mid;
	if (request.getType() == PacketType::LOGIN_REQUEST) {
		response.setType(PacketType::LOGIN_RESPONSE);
		if (request.getData().size() == 2 && (uid = db.logIn(request.getData()[0], request.getData()[1])) != -1) {
			__uint64_t sid = ((((__uint64_t) rand () & 0x77777777) << 32) | (rand () & 0x77777777));
			sids [sid] = uid;
			response.setSID(sid);
			response.getData().push_back("1");
		} else {
			response.getData().push_back("0");
		}
		return true;
	}
	auto it = sids.find(request.getSID());
	if (it == sids.end ()) {
		response.setType(request.getType() + 1);
		response.setSID (0);
		return true;
	}
	response.setSID(request.getSID());
	uid = it-> second;
	switch (request.getType()) {
	case PacketType::LOGOUT_REQUEST:
		response.setType(PacketType::LOGOUT_RESPONSE);
		sids.erase(request.getSID());
		response.getData().push_back("1");
		return true;
	case PacketType::LATEST_REQUEST:
		response.setType(PacketType::LATEST_RESPONSE);
		response.getData().push_back(db.latestCheck(uid));
		return true;
	case PacketType::PULL_REQUEST:
		response.setType(PacketType::PULL_RESPONSE);
		if (request.getData().size() == 1) {
			try {
				mid = stoi (request.getData()[0]);
				string msg = db.readMessage(uid, mid);
				response.getData().push_back(msg);
			} catch (exception& ex) { printf ("%s\r\n", ex. what ()); }
		}
		return true;
	case PacketType::REMOVE_REQUEST:
		response.setType(PacketType::REMOVE_RESPONSE);
		if (request.getData().size() == 1) {
			try {
				mid = stoi (request.getData()[0]);
				if (db.removeMessage(uid, mid)) {
					response.getData().push_back("1");
					return true;
				}
			} catch (exception& ex) { printf ("%s\r\n", ex. what ()); }
		}
		response.getData().push_back("0");
		return true;
	case PacketType::SEND_REQUEST:
		response.setType(PacketType::SEND_RESPONSE);
		if (request.getData().size() == 2 && db.sendMessage(uid, request.getData()[0], request.getData()[1])) {
			response.getData().push_back("1");
			return true;
		}
		response.getData().push_back("0");
		return true;
	case PacketType::NEWMESSAGES_REQUEST:
		response.setType(PacketType::NEWMESSAGES_RESPONSE);
		for (string id : db.listUnreadMessages(uid)) {
			response.getData().push_back(id);
		}
		return true;
	case PacketType::LISTMESSAGES_REQUEST:
		response.setType(PacketType::LISTMESSAGES_RESPONSE);
		for (string id : db.listAllMessages(uid)) {
			response.getData().push_back(id);
		}
		return true;
	case PacketType::LISTSENTMESSAGES_REQUEST:
		response.setType(PacketType::LISTSENTMESSAGES_RESPONSE);
		for (string id : db.listSentMessages(uid)) {
			response.getData().push_back(id);
		}
		return true;
	default:
		return false;
	}
}