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