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; }
inline void addUserCheck(Chat& chat, const string& name) { if(!chat.addUser(User(name, NetAddr()), users++)) cout << "user '" << name << "' could not be added to chat" << endl; else cout << "user '" << name << "' added to chat" << endl; }
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; }