Fixed crash on leave chat

This commit is contained in:
Torsten Schulz
2024-02-21 16:09:28 +01:00
parent ab8f84f371
commit 064304a506
3 changed files with 12 additions and 7 deletions

View File

@@ -844,7 +844,7 @@ void App::addLeaveButton() {
}
void App::logout() {
server_.disconnect(this);
server_.addToDisconnectList(this);
userListContainer_->clear();
menuContainer_->clear();
userName = "";
@@ -1116,7 +1116,6 @@ void App::showPartnerSites() {
for (size_t i = 0; i < doc.GetRowCount(); ++i) {
auto url = doc.GetCell<std::string>(1, i);
auto name = doc.GetCell<std::string>(0, i);
std::cout << url << std::endl;
auto link = Wt::WLink(url);
link.setTarget(Wt::LinkTarget::NewWindow);
contentLayout->addNew<Wt::WAnchor>(link, name);

View File

@@ -42,6 +42,7 @@ void Broadcast::disconnect(Client *client) {
for (unsigned int i = 0; i < connections_.size(); ++ i) {
if (connections_[i]->client() == client) {
connections_.erase(connections_.begin() + i);
break;
}
}
Wt::Json::Object leftBroadcast{
@@ -63,6 +64,10 @@ void Broadcast::disconnect(Client *client) {
}
}
void Broadcast::addToDisconnectList(Client *client) {
toDisconnect_.push_back(client);
}
Wt::Json::Object Broadcast::reSetUser(std::string oldSessionId, std::string newSessionId) {
for (auto& connection : connections_) {
if (connection->setSessionId(oldSessionId, newSessionId)) {
@@ -145,13 +150,12 @@ void Broadcast::run() {
{"type", "timedout"},
{"data", "dummy"}
};
std::vector<Client *> toDisconnect;
for (;;) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
for (auto clientToDisconnect: toDisconnect) {
std::this_thread::sleep_for(std::chrono::milliseconds(200));
for (auto clientToDisconnect: toDisconnect_) {
disconnect(clientToDisconnect);
}
toDisconnect.clear();
toDisconnect_.clear();
if (stop_) {
return;
}
@@ -159,7 +163,7 @@ void Broadcast::run() {
for (auto &connection: connections_) {
if (connection->client()->activitiesTimedOut()) {
auto sessionId = connection->sessionId();
toDisconnect.push_back(connection->client());
toDisconnect_.push_back(connection->client());
addMessageToSessionBroadcast(sessionId, timedoutBroadcast);
}
if (connection->getBroadcasts().size() == 0) {

View File

@@ -72,6 +72,7 @@ public:
~Broadcast();
void connect(Client *client, const std::function<void ()> &fct);
void disconnect(Client *client);
void addToDisconnectList(Client *client);
Wt::Json::Object reSetUser(std::string oldSessionId, std::string newSessionId);
int count() const;
std::string userNameForSessionId(std::string sessionId);
@@ -132,6 +133,7 @@ private:
Wt::WDateTime lastTimeoutCheck_;
std::unordered_map<std::string, MessageQueue> conversations_;
std::unordered_map<std::string, std::set<std::string> > blockings_;
std::vector<Client *> toDisconnect_;
void run();
Wt::Json::Object logoutBroadcast();
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output);