Fixed crash on leave chat
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user