From f5a7c51c89567abc9b9c6b974a65e24ea616e1f4 Mon Sep 17 00:00:00 2001 From: Joursoir Date: Wed, 2 Dec 2020 17:59:46 +0000 Subject: refactor code; add class storing users --- src/server/ChatServer.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 2 deletions(-) (limited to 'src/server/ChatServer.cpp') diff --git a/src/server/ChatServer.cpp b/src/server/ChatServer.cpp index 6256e55..0800ee6 100644 --- a/src/server/ChatServer.cpp +++ b/src/server/ChatServer.cpp @@ -16,14 +16,23 @@ ChatServer::ChatServer(EventSelector *sel, DatabaseManager *db, int fd) { the_selector->Add(this); lobby = new ChatRoom(this, std_id_lobby, 0); + talkers = new StorageOfUsers(); } ChatServer::~ChatServer() { - if(room) - delete[] room; + // right delete this stuff? + if(room) { + for(int i = 0; i < room_len; i++) + DeleteRoom(i); + delete[] room; + } the_selector->Remove(this); + + while(talkers->Disconnect()) + ; + delete talkers; } ChatServer *ChatServer::Start(EventSelector *sel, DatabaseManager *db, int port) @@ -134,6 +143,7 @@ handle_room_enter ChatServer::ChangeSessionRoom(ChatRoom *cur_room, void ChatServer::CloseConnection(UserInfo *u) { + talkers->RemoveUser(u); the_selector->Remove(u); delete u; } @@ -150,6 +160,65 @@ void ChatServer::Handle(bool r, bool w) return; UserInfo *u = new UserInfo(lobby, sd); + talkers->AddUser(u); lobby->AddSession(u); the_selector->Add(u); +} + +/////////////////////////////////////////////////////////////// + +StorageOfUsers::~StorageOfUsers() +{ + while(first) { + item *tmp = first; + first = first->next; + delete tmp; + } +} + +void StorageOfUsers::SendAllUsers(const char *msg, UserInfo *except, + const int spec_msg) +{ + CONSOLE_LOG("Send message all: %s\n", msg); + item *p; + for(p = first; p; p = p->next) + if(p->u != except) + p->u->Send(msg, spec_msg); +} + +void StorageOfUsers::AddUser(UserInfo *u) +{ + item *p = new item; + p->next = first; + p->u = u; + first = p; + online++; +} + +void StorageOfUsers::RemoveUser(UserInfo *u) +{ + item **p; + for(p = &first; *p; p = &((*p)->next)) { + if( ((*p)->u) == u ) { + item *tmp = *p; + *p = tmp->next; + // not delete UserInfo! + online--; + delete tmp; + return; + } + } +} + +UserInfo *StorageOfUsers::Disconnect() +{ + if(first) { + item *tmp = first; + first = first->next; + UserInfo *rn = tmp->u; + online--; + delete tmp; + return rn; + } + return 0; } \ No newline at end of file -- cgit v1.2.3-18-g5258