Example #1
0
User registerUser(NetReceiver& receiver)
{
	User user;
	vector<string> tokens;
	string user_name;
	NetMessage msg;
	NetAddr src;
	bool ret;
	char header;

	msg = receiver.recv();
	if(msg.getErrCode() < 0)
		error("recv");	

	header = netToHostHeader(msg.getContent());
	if(header != REGISTER)
		return User(hostToNetHeader(INVALID_REQUEST_ERR), NetAddr());
	
	user_name = netToHostRegister(msg.getContent());
	if(user_name.empty())
		return User(hostToNetHeader(INVALID_REQUEST_ERR), NetAddr());

	//trying to add user to chat
	chat_mtx.lock();
	ret = chat.addUser(User(user_name, src), receiver.getSocket());
	user = chat.getUser(user_name);
	chat_mtx.unlock();

	if(!ret)
	{
		//user is being used by another host
		if(user.getAddr().getIp() != src.getIp())
			return User(hostToNetHeader(USER_EXISTS_ERR), NetAddr());
		//user is getting online again
		chat_mtx.lock();
		chat.delUser(user_name);
		user = User(user_name, src);
		chat.addUser(user, receiver.getSocket());
		chat.delUserFromGroup(user_name, OFFLINE_GROUP);
		chat.addUserToGroup(user_name, ONLINE_GROUP);
		chat_mtx.unlock();
		return user;
	}
	else
	{
		chat_mtx.lock();
		chat.addUserToGroup(user_name, ONLINE_GROUP);
		chat_mtx.unlock();
	}

	return user;
}
Example #2
0
/*
The worker thread.
Interacts with each client, providing necessary services
*/
void userInteraction(int id, int sock)
{
	NetAddr src;
	NetMessage msg;
	string answer;
	User user;
	NetReceiver receiver;
	char header;

	//creating receiver object
	receiver = NetReceiver(sock);

	//registering user
	user = registerUser(receiver);
	header = netToHostHeader(msg.getContent());
	if(header == USER_EXISTS_ERR || header == INVALID_REQUEST_ERR)
		answer = hostToNetMsg(header);
	else
		answer = hostToNetMsg(OK);
	if(send(sock, answer) < 0)
		error("send");	

	//main loop
	if(answer == hostToNetMsg(OK))
	{
		while(true)
		{
			//receiving message from client
			msg = receiver.recv();
			if(msg.getErrCode() < 0)
				error("recv");	
			if(msg.getErrCode() == 0)
				break;

			//displaying message
			src = msg.getSrcAddr();
			//cout << "[" << id << "]"
			//	<< "[" << src.getIp() << ":" << src.getPort() << "]"
			//	<< " " << msg.getContent() << endl;

			//handling request
			if(handle(sock, msg.getContent(), user) < 0)
				break;
		}	

		//unregistering user
		chat_mtx.lock();
		chat.delUserFromGroup(user.getName(), ONLINE_GROUP);
		chat.addUserToGroup(user.getName(), OFFLINE_GROUP);
		chat_mtx.unlock();
	}

	cout << "[" << id << "] connection ended." << endl;	

	close(sock);
	//marking itself as free at the end
	free_thread_mtx.lock();
	free_thread[id] = true;
	free_thread_mtx.unlock();
}
Example #3
0
/*
The worker thread.
Interacts with each client, providing necessary services
*/
void userInteraction(int id, int sock, NetAddr src)
{
	NetMessage msg;
	string answer = OK;
	//string answer;
	User user;

	//registering user
	/*user = registerUser(sock);
	if(user.getName() == USER_EXISTS_ERR || user.getName() == INVALID_CMD_ERR)
		answer = user.getName();
	else
		answer = OK;
	if(send(sock, answer) < 0)
		error("send");	*/

	//main loop
	if(answer == OK)
	{
		while(true)
		{
			//receiving message from client
			msg = recvFrom(sock);
			if(msg.getErrCode() < 0)
				error("recv");	
			if(msg.getErrCode() == 0)
				break;
			cout << "boss" << endl;

			//displaying message
			cout << "[" << id << "]"
				<< "[" << src.getIp() << ":" << src.getPort() << "]"
				<< " " << msg.getContent() << endl;

			if(sendTo(sock, msg.getSrcAddr(), msg.getContent()) < 0)
				error("sendTo");
			if(sendTo(sock, msg.getSrcAddr(), "ey b0ss") < 0)
				error("sendTo");
			if(sendTo(sock, msg.getSrcAddr(), "edjfh") < 0)
				error("sendTo");
			//handling request
			//handle(sock, msg.getContent(), user);
		}	

		//unregistering user
		chat_mtx.lock();
		chat.delUserFromGroup(user.getName(), ONLINE_GROUP);
		chat.addUserToGroup(user.getName(), OFFLINE_GROUP);
		chat_mtx.unlock();
	}

	cout << "[" << id << "] connection ended." << endl;	

	close(sock);
	//marking itself as free at the end
	free_thread_mtx.lock();
	free_thread[id] = true;
	free_thread_mtx.unlock();
}
Example #4
0
User registerUser(int sock)
{
	User user;
	vector<string> tokens;
	string user_name;
	NetMessage msg;
	NetAddr src;
	bool ret;

	msg = recv(sock);
	if(msg.getErrCode() < 0)
		error("recv");	

	tokens = preProcess(msg.getContent());
	if(tokens.size() < 2 || lower(tokens[0]) != REGISTER_CMD)
		return User(INVALID_CMD_ERR, NetAddr());
	
	src = msg.getSrcAddr();
	user_name = tokens[1];
	//trying to add user to chat
	chat_mtx.lock();
	ret = chat.addUser(User(user_name, src));
	user = chat.getUser(user_name);
	chat_mtx.unlock();

	if(!ret)
	{
		//user is being used by another host
		if(user.getAddr().getIp() != src.getIp())
			return User(USER_EXISTS_ERR, NetAddr());
		//user is getting online again
		chat_mtx.lock();
		chat.delUserFromGroup(user_name, OFFLINE_GROUP);
		chat.addUserToGroup(user_name, ONLINE_GROUP);
		chat_mtx.unlock();
		return User(user_name, src);
	}
	else
	{
		chat_mtx.lock();
		chat.addUserToGroup(user_name, ONLINE_GROUP);
		chat_mtx.unlock();
	}

	return user;
}
Example #5
0
inline void addUserToGroupCheck(Chat& chat, const string& user_name,
	const string& group_name)
{
	if(!chat.addUserToGroup(user_name, group_name))
		cout << "user '" << user_name << "' could not be added to group '" << 
		group_name << "'" << endl;
	else
		cout << "user '" << user_name << "' added to group '" << 
		group_name << "'" << endl;
}
Example #6
0
int handle(int socket, const string& str, const User& user)
{
	char header;
	string answer;
	int ret = 0;

	header = netToHostHeader(str);

	switch(header)
	{
		case EXIT:
		{
			answer = hostToNetMsg(OK);
			ret = -1;
			break;
		}
		case WHO:
		{
			stringstream ss;
			vector<string> header = {"user", "status"};

			chat_mtx.lock();
			ChatView view(chat, ss);
			view.printUsersFromGroup(ONLINE_GROUP, header);	
			view.printUsersFromGroup(OFFLINE_GROUP, false);	
			chat_mtx.unlock();
			
			answer = hostToNetUsersList(ss.str());
			break;
		}
		case SEND_MSG:
		{
			Message msg = netToHostSendMsg(str);		
			/*cout << "src | dst | content: " 
				<< msg.getSrcUserName() << " | " 
				<< msg.getDstUserName() << " | "
				<< msg.getContent() << endl;*/
			if(msg.getSrcUserName().empty())
			{
				answer = hostToNetMsg(INVALID_REQUEST_ERR);	
				break;
			}

			bool has_user, add_msg=true;

			chat_mtx.lock();
			has_user = chat.hasUser(msg.getDstUserName());
			if(has_user)
				add_msg = chat.addMessage(msg);
			chat_mtx.unlock();

			if(!has_user)
				answer = hostToNetMsg(NO_MSG_DST_ERR);
			else if(!add_msg)
				answer = hostToNetMsg(MSG_EXISTS);
			else
			{
				size_t msg_id;
				msg_id = hash<Message>{}(msg);
				//cout << msg_id << endl;
				answer = hostToNetMsgQueued(msg_id);
			}
			break;
		}
		case SEND_FILE:
		{
			Message msg = netToHostSendFile(str);		
			/*cout << "src | dst | content: " 
				<< msg.getSrcUserName() << " | " 
				<< msg.getDstUserName() << " | "
				<< msg.getContent() << endl;*/
			if(msg.getSrcUserName().empty())
			{
				answer = hostToNetMsg(INVALID_REQUEST_ERR);	
				break;
			}

			bool has_user, add_msg=true;

			chat_mtx.lock();
			has_user = chat.hasUser(msg.getDstUserName());
			if(has_user)
				add_msg = chat.addMessage(msg);
			chat_mtx.unlock();

			if(!has_user)
				answer = hostToNetMsg(NO_MSG_DST_ERR);
			else if(!add_msg)
				answer = hostToNetMsg(MSG_EXISTS);
			else
			{
				size_t msg_id;
				msg_id = hash<Message>{}(msg);
				//cout << msg_id << endl;
				answer = hostToNetFileQueued(msg_id);
			}
			break;
		}
		case CREATE_GROUP:
		{
			string group_name = netToHostCreateGroup(str);
			if(group_name.empty())
			{
				answer = hostToNetMsg(INVALID_REQUEST_ERR);
				break;
			}
			bool has_group;
			chat_mtx.lock();
			has_group = chat.hasGroup(group_name);
			chat.addGroup(group_name);
			chat_mtx.unlock();

			if(has_group)
				answer = hostToNetMsg(GROUP_EXISTS);
			else
				answer = hostToNetMsg(GROUP_CREATED);	
			break;
		}	
		case JOIN_GROUP:
		{
			string group_name = netToHostJoinGroup(str);
			if(group_name.empty())
			{
				answer = hostToNetMsg(INVALID_REQUEST_ERR);
				break;
			}

			bool has_group, add_user;
			chat_mtx.lock();
			has_group = chat.hasGroup(group_name);
			add_user = chat.addUserToGroup(user.getName(), group_name);
			chat_mtx.unlock();

			if(!has_group)
				answer = hostToNetMsg(NO_GROUP_ERR);	
			else if(!add_user)
				answer = hostToNetMsg(USER_ALREADY_IN_GROUP);	
			else
				answer = hostToNetMsg(USER_ADDED_TO_GROUP);
			break;
		}
		case SEND_GROUP:
		{
			pair<string, string> group_msg = netToHostSendGroup(str);	
			if(group_msg.first.empty())
			{
				answer = hostToNetMsg(INVALID_REQUEST_ERR);
				break;
			}

			Group group;
			bool in_group, has_group;
			string user_name = user.getName();
			string group_name = group_msg.first;
			string group_msg_c = group_msg.second;

			chat_mtx.lock();
			has_group = chat.hasGroup(group_name);
			if(has_group)
			{
				group = chat.getGroup(group_name);
				in_group = group.has(user_name);
				if(in_group)
					for(auto const& name: group.getUsersNames())
						if(name != user_name)
						{
							Message msg = Message(user_name, name, group_msg_c);
							chat.addMessage(msg);
						}
			}
			chat_mtx.unlock();

			if(has_group)
			{
				if(!in_group)
					answer = hostToNetMsg(NOT_IN_GROUP_ERR);
				else
				{
					size_t msg_id;
					Message msg = Message(user_name, group_name, group_msg_c);
					msg_id = hash<Message>{}(msg);
					//cout << msg_id << endl;
					answer = hostToNetMsgQueued(msg_id);
				}
			}
			else
				answer = hostToNetMsg(NO_GROUP_ERR);

			break;
		}
		default:
			answer = hostToNetMsg(INVALID_REQUEST_ERR);
			break;
	}

	if(send(socket, answer) < 0)
		error("send");

	return ret;
}