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() { void App::logout() {
server_.disconnect(this); server_.addToDisconnectList(this);
userListContainer_->clear(); userListContainer_->clear();
menuContainer_->clear(); menuContainer_->clear();
userName = ""; userName = "";
@@ -1116,7 +1116,6 @@ void App::showPartnerSites() {
for (size_t i = 0; i < doc.GetRowCount(); ++i) { for (size_t i = 0; i < doc.GetRowCount(); ++i) {
auto url = doc.GetCell<std::string>(1, i); auto url = doc.GetCell<std::string>(1, i);
auto name = doc.GetCell<std::string>(0, i); auto name = doc.GetCell<std::string>(0, i);
std::cout << url << std::endl;
auto link = Wt::WLink(url); auto link = Wt::WLink(url);
link.setTarget(Wt::LinkTarget::NewWindow); link.setTarget(Wt::LinkTarget::NewWindow);
contentLayout->addNew<Wt::WAnchor>(link, name); 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) { for (unsigned int i = 0; i < connections_.size(); ++ i) {
if (connections_[i]->client() == client) { if (connections_[i]->client() == client) {
connections_.erase(connections_.begin() + i); connections_.erase(connections_.begin() + i);
break;
} }
} }
Wt::Json::Object leftBroadcast{ 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) { Wt::Json::Object Broadcast::reSetUser(std::string oldSessionId, std::string newSessionId) {
for (auto& connection : connections_) { for (auto& connection : connections_) {
if (connection->setSessionId(oldSessionId, newSessionId)) { if (connection->setSessionId(oldSessionId, newSessionId)) {
@@ -145,13 +150,12 @@ void Broadcast::run() {
{"type", "timedout"}, {"type", "timedout"},
{"data", "dummy"} {"data", "dummy"}
}; };
std::vector<Client *> toDisconnect;
for (;;) { for (;;) {
std::this_thread::sleep_for(std::chrono::milliseconds(100)); std::this_thread::sleep_for(std::chrono::milliseconds(200));
for (auto clientToDisconnect: toDisconnect) { for (auto clientToDisconnect: toDisconnect_) {
disconnect(clientToDisconnect); disconnect(clientToDisconnect);
} }
toDisconnect.clear(); toDisconnect_.clear();
if (stop_) { if (stop_) {
return; return;
} }
@@ -159,7 +163,7 @@ void Broadcast::run() {
for (auto &connection: connections_) { for (auto &connection: connections_) {
if (connection->client()->activitiesTimedOut()) { if (connection->client()->activitiesTimedOut()) {
auto sessionId = connection->sessionId(); auto sessionId = connection->sessionId();
toDisconnect.push_back(connection->client()); toDisconnect_.push_back(connection->client());
addMessageToSessionBroadcast(sessionId, timedoutBroadcast); addMessageToSessionBroadcast(sessionId, timedoutBroadcast);
} }
if (connection->getBroadcasts().size() == 0) { if (connection->getBroadcasts().size() == 0) {

View File

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