diff options
author | Joursoir <chat@joursoir.net> | 2020-12-02 17:59:46 +0000 |
---|---|---|
committer | Joursoir <chat@joursoir.net> | 2020-12-02 17:59:46 +0000 |
commit | f5a7c51c89567abc9b9c6b974a65e24ea616e1f4 (patch) | |
tree | 07d4aeacdeb80447c85a29f168fb1ddb48fea41c /src/server/ChatServer.cpp | |
parent | ad0a2dc909fbb772d42ab6faf13bba74fbc2483d (diff) | |
download | want-chat-f5a7c51c89567abc9b9c6b974a65e24ea616e1f4.tar.gz want-chat-f5a7c51c89567abc9b9c6b974a65e24ea616e1f4.tar.bz2 want-chat-f5a7c51c89567abc9b9c6b974a65e24ea616e1f4.zip |
refactor code; add class storing users
Diffstat (limited to 'src/server/ChatServer.cpp')
-rw-r--r-- | src/server/ChatServer.cpp | 73 |
1 files changed, 71 insertions, 2 deletions
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 |