blob: d41b65d12489f490e65cb38d68150e8c3e53c4f0 [file] [log] [blame]
Yingdi Yu348f5ea2014-03-01 14:47:25 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2013, Regents of the University of California
4 * Yingdi Yu
5 *
6 * BSD license, See the LICENSE file for more information
7 *
8 * Author: Yingdi Yu <yingdi@cs.ucla.edu>
Yingdi Yuf3401182015-02-02 20:21:07 -08009 * Qiuhan Ding <qiuhanding@cs.ucla.edu>
Yingdi Yu348f5ea2014-03-01 14:47:25 -080010 */
11
12#include <QApplication>
13#include <QMessageBox>
14#include <QDir>
15#include <QTimer>
Yingdi Yu0b0a7362014-08-05 16:31:30 -070016#include "controller.hpp"
Yingdi Yu348f5ea2014-03-01 14:47:25 -080017
18#ifndef Q_MOC_RUN
19#include <boost/filesystem.hpp>
20#include <boost/lexical_cast.hpp>
Yingdi Yufa0b6a02014-04-30 14:26:42 -070021#include <ndn-cxx/util/random.hpp>
Yingdi Yu0b0a7362014-08-05 16:31:30 -070022#include "cryptopp.hpp"
Yingdi Yu348f5ea2014-03-01 14:47:25 -080023#include "logging.h"
Qiuhan Ding0cfc1512015-02-17 17:44:11 -080024#include "conf.hpp"
25#include "endorse-info.hpp"
Yingdi Yu348f5ea2014-03-01 14:47:25 -080026#endif
27
Yingdi Yueb692ac2015-02-10 18:46:18 -080028INIT_LOGGER("chronochat.Controller");
Yingdi Yu348f5ea2014-03-01 14:47:25 -080029
30Q_DECLARE_METATYPE(ndn::Name)
Varun Patil3d850902020-11-23 12:19:14 +053031Q_DECLARE_METATYPE(ndn::security::Certificate)
Yingdi Yueb692ac2015-02-10 18:46:18 -080032Q_DECLARE_METATYPE(chronochat::EndorseInfo)
Yingdi Yu233a9722014-03-07 15:47:09 -080033Q_DECLARE_METATYPE(ndn::Interest)
34Q_DECLARE_METATYPE(size_t)
Yingdi Yueb692ac2015-02-10 18:46:18 -080035Q_DECLARE_METATYPE(chronochat::ChatroomInfo)
36Q_DECLARE_METATYPE(chronochat::Invitation)
Qiuhan Ding43c8e162015-02-02 15:16:48 -080037Q_DECLARE_METATYPE(std::string)
38Q_DECLARE_METATYPE(ndn::Name::Component)
Yingdi Yu348f5ea2014-03-01 14:47:25 -080039
Yingdi Yueb692ac2015-02-10 18:46:18 -080040namespace chronochat {
Yingdi Yu348f5ea2014-03-01 14:47:25 -080041
Yingdi Yu0b0a7362014-08-05 16:31:30 -070042using std::string;
43
Yingdi Yu348f5ea2014-03-01 14:47:25 -080044// constructor & destructor
Yingdi Yu2c9e7712014-10-20 11:55:05 -070045Controller::Controller(QWidget* parent)
Yingdi Yu348f5ea2014-03-01 14:47:25 -080046 : QDialog(parent)
Yingdi Yubaaaec02014-09-02 22:05:32 -070047 , m_localPrefixDetected(false)
Yingdi Yuf3401182015-02-02 20:21:07 -080048 , m_isInConnectionDetection(false)
Qiuhan Ding43c8e162015-02-02 15:16:48 -080049 , m_settingDialog(new SettingDialog(this))
50 , m_startChatDialog(new StartChatDialog(this))
51 , m_profileEditor(new ProfileEditor(this))
52 , m_invitationDialog(new InvitationDialog(this))
Qiuhan Dingba3e57a2015-01-08 19:07:39 -080053 , m_invitationRequestDialog(new InvitationRequestDialog(this))
Qiuhan Ding43c8e162015-02-02 15:16:48 -080054 , m_contactPanel(new ContactPanel(this))
55 , m_browseContactDialog(new BrowseContactDialog(this))
56 , m_addContactPanel(new AddContactPanel(this))
57 , m_discoveryPanel(new DiscoveryPanel(this))
Yingdi Yu348f5ea2014-03-01 14:47:25 -080058{
59 qRegisterMetaType<ndn::Name>("ndn.Name");
Varun Patil3d850902020-11-23 12:19:14 +053060 qRegisterMetaType<ndn::security::Certificate>("ndn.security.v2.Certificate");
61 qRegisterMetaType<chronochat::EndorseInfo>("EndorseInfo");
Yingdi Yu233a9722014-03-07 15:47:09 -080062 qRegisterMetaType<ndn::Interest>("ndn.Interest");
63 qRegisterMetaType<size_t>("size_t");
Qiuhan Ding43c8e162015-02-02 15:16:48 -080064 qRegisterMetaType<chronochat::ChatroomInfo>("chronochat.Chatroom");
65 qRegisterMetaType<chronochat::Invitation>("chronochat.Invitation");
66 qRegisterMetaType<std::string>("std.string");
67 qRegisterMetaType<ndn::Name::Component>("ndn.Component");
68
Yingdi Yu348f5ea2014-03-01 14:47:25 -080069
70 // Connection to ContactManager
Yingdi Yu2c9e7712014-10-20 11:55:05 -070071 connect(m_backend.getContactManager(), SIGNAL(warning(const QString&)),
Yingdi Yu348f5ea2014-03-01 14:47:25 -080072 this, SLOT(onWarning(const QString&)));
73 connect(this, SIGNAL(refreshBrowseContact()),
Yingdi Yu2c9e7712014-10-20 11:55:05 -070074 m_backend.getContactManager(), SLOT(onRefreshBrowseContact()));
75 connect(m_backend.getContactManager(), SIGNAL(contactInfoFetchFailed(const QString&)),
Yingdi Yu348f5ea2014-03-01 14:47:25 -080076 this, SLOT(onWarning(const QString&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -080077
78 // Connection to SettingDialog
79 connect(this, SIGNAL(identityUpdated(const QString&)),
80 m_settingDialog, SLOT(onIdentityUpdated(const QString&)));
81 connect(m_settingDialog, SIGNAL(identityUpdated(const QString&)),
82 this, SLOT(onIdentityUpdated(const QString&)));
83 connect(m_settingDialog, SIGNAL(nickUpdated(const QString&)),
84 this, SLOT(onNickUpdated(const QString&)));
Yingdi Yubaaaec02014-09-02 22:05:32 -070085 connect(m_settingDialog, SIGNAL(prefixUpdated(const QString&)),
86 this, SLOT(onLocalPrefixConfigured(const QString&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -080087
88 // Connection to ProfileEditor
89 connect(this, SIGNAL(closeDBModule()),
90 m_profileEditor, SLOT(onCloseDBModule()));
91 connect(this, SIGNAL(identityUpdated(const QString&)),
92 m_profileEditor, SLOT(onIdentityUpdated(const QString&)));
93 connect(m_profileEditor, SIGNAL(updateProfile()),
Yingdi Yu2c9e7712014-10-20 11:55:05 -070094 m_backend.getContactManager(), SLOT(onUpdateProfile()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -080095
96 // Connection to StartChatDialog
97 connect(m_startChatDialog, SIGNAL(startChatroom(const QString&, bool)),
98 this, SLOT(onStartChatroom(const QString&, bool)));
99
100 // Connection to InvitationDialog
101 connect(m_invitationDialog, SIGNAL(invitationResponded(const ndn::Name&, bool)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700102 &m_backend, SLOT(onInvitationResponded(const ndn::Name&, bool)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800103
Qiuhan Dingba3e57a2015-01-08 19:07:39 -0800104 // Connection to InvitationRequestDialog
105 connect(m_invitationRequestDialog, SIGNAL(invitationRequestResponded(const ndn::Name&, bool)),
106 &m_backend, SLOT(onInvitationRequestResponded(const ndn::Name&, bool)));
107
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800108 // Connection to AddContactPanel
109 connect(m_addContactPanel, SIGNAL(fetchInfo(const QString&)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700110 m_backend.getContactManager(), SLOT(onFetchContactInfo(const QString&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800111 connect(m_addContactPanel, SIGNAL(addContact(const QString&)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700112 m_backend.getContactManager(), SLOT(onAddFetchedContact(const QString&)));
113 connect(m_backend.getContactManager(),
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800114 SIGNAL(contactEndorseInfoReady(const EndorseInfo&)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700115 m_addContactPanel,
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800116 SLOT(onContactEndorseInfoReady(const EndorseInfo&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800117
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800118 // Connection to BrowseContactDialog
119 connect(m_browseContactDialog, SIGNAL(directAddClicked()),
120 this, SLOT(onDirectAdd()));
121 connect(m_browseContactDialog, SIGNAL(fetchIdCert(const QString&)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700122 m_backend.getContactManager(), SLOT(onFetchIdCert(const QString&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800123 connect(m_browseContactDialog, SIGNAL(addContact(const QString&)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700124 m_backend.getContactManager(), SLOT(onAddFetchedContactIdCert(const QString&)));
125 connect(m_backend.getContactManager(), SIGNAL(idCertNameListReady(const QStringList&)),
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800126 m_browseContactDialog, SLOT(onIdCertNameListReady(const QStringList&)));
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700127 connect(m_backend.getContactManager(), SIGNAL(nameListReady(const QStringList&)),
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800128 m_browseContactDialog, SLOT(onNameListReady(const QStringList&)));
Varun Patil3d850902020-11-23 12:19:14 +0530129 connect(m_backend.getContactManager(), SIGNAL(idCertReady(const ndn::security::Certificate&)),
130 m_browseContactDialog, SLOT(onIdCertReady(const ndn::security::Certificate&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800131
132 // Connection to ContactPanel
133 connect(m_contactPanel, SIGNAL(waitForContactList()),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700134 m_backend.getContactManager(), SLOT(onWaitForContactList()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800135 connect(m_contactPanel, SIGNAL(waitForContactInfo(const QString&)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700136 m_backend.getContactManager(), SLOT(onWaitForContactInfo(const QString&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800137 connect(m_contactPanel, SIGNAL(removeContact(const QString&)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700138 m_backend.getContactManager(), SLOT(onRemoveContact(const QString&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800139 connect(m_contactPanel, SIGNAL(updateAlias(const QString&, const QString&)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700140 m_backend.getContactManager(), SLOT(onUpdateAlias(const QString&, const QString&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800141 connect(m_contactPanel, SIGNAL(updateIsIntroducer(const QString&, bool)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700142 m_backend.getContactManager(), SLOT(onUpdateIsIntroducer(const QString&, bool)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800143 connect(m_contactPanel, SIGNAL(updateEndorseCertificate(const QString&)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700144 m_backend.getContactManager(), SLOT(onUpdateEndorseCertificate(const QString&)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800145 connect(m_contactPanel, SIGNAL(warning(const QString&)),
146 this, SLOT(onWarning(const QString&)));
147 connect(this, SIGNAL(closeDBModule()),
148 m_contactPanel, SLOT(onCloseDBModule()));
149 connect(this, SIGNAL(identityUpdated(const QString&)),
150 m_contactPanel, SLOT(onIdentityUpdated(const QString&)));
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700151 connect(m_backend.getContactManager(), SIGNAL(contactAliasListReady(const QStringList&)),
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800152 m_contactPanel, SLOT(onContactAliasListReady(const QStringList&)));
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700153 connect(m_backend.getContactManager(), SIGNAL(contactIdListReady(const QStringList&)),
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800154 m_contactPanel, SLOT(onContactIdListReady(const QStringList&)));
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700155 connect(m_backend.getContactManager(), SIGNAL(contactInfoReady(const QString&, const QString&,
156 const QString&, bool)),
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700157 m_contactPanel, SLOT(onContactInfoReady(const QString&, const QString&,
158 const QString&, bool)));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800159
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700160 // Connection to backend thread
Yingdi Yuf3401182015-02-02 20:21:07 -0800161 connect(&m_backend, SIGNAL(nfdError()),
162 this, SLOT(onNfdError()));
163 connect(this, SIGNAL(nfdReconnect()),
164 &m_backend, SLOT(onNfdReconnect()));
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700165 connect(this, SIGNAL(shutdownBackend()),
166 &m_backend, SLOT(shutdown()));
167 connect(this, SIGNAL(updateLocalPrefix()),
168 &m_backend, SLOT(onUpdateLocalPrefixAction()));
169 connect(this, SIGNAL(identityUpdated(const QString&)),
170 &m_backend, SLOT(onIdentityChanged(const QString&)));
171 connect(this, SIGNAL(addChatroom(QString)),
172 &m_backend, SLOT(addChatroom(QString)));
173 connect(this, SIGNAL(removeChatroom(QString)),
174 &m_backend, SLOT(removeChatroom(QString)));
175
176 // Thread notifications:
177 // on local prefix udpated:
178 connect(&m_backend, SIGNAL(localPrefixUpdated(const QString&)),
179 this, SLOT(onLocalPrefixUpdated(const QString&)));
180 connect(&m_backend, SIGNAL(localPrefixUpdated(const QString&)),
181 m_settingDialog, SLOT(onLocalPrefixUpdated(const QString&)));
182
183 // on invitation validated:
Qiuhan Dingba3e57a2015-01-08 19:07:39 -0800184 connect(&m_backend, SIGNAL(invitationValidated(QString, QString, ndn::Name)),
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700185 m_invitationDialog, SLOT(onInvitationReceived(QString, QString, ndn::Name)));
Qiuhan Dingba3e57a2015-01-08 19:07:39 -0800186 connect(&m_backend, SIGNAL(startChatroom(const QString&, bool)),
187 this, SLOT(onStartChatroom(const QString&, bool)));
188
189 // on invitation request received
190 connect(&m_backend, SIGNAL(invitationRequestReceived(QString, QString, ndn::Name)),
191 m_invitationRequestDialog, SLOT(onInvitationRequestReceived(QString, QString,
192 ndn::Name)));
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700193
194 // on invitation accepted:
Yingdi Yueb692ac2015-02-10 18:46:18 -0800195 connect(&m_backend, SIGNAL(startChatroomOnInvitation(chronochat::Invitation, bool)),
196 this, SLOT(onStartChatroom2(chronochat::Invitation, bool)));
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700197
198 m_backend.start();
Mengjin Yan391d7242014-08-28 20:51:55 -0700199
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800200 initialize();
201
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800202 m_chatroomDiscoveryBackend
203 = new ChatroomDiscoveryBackend(m_localPrefix,
204 m_identity,
205 this);
206
207 // connect to chatroom discovery back end
208 connect(&m_backend, SIGNAL(localPrefixUpdated(const QString&)),
209 m_chatroomDiscoveryBackend, SLOT(updateRoutingPrefix(const QString&)));
210 connect(this, SIGNAL(localPrefixConfigured(const QString&)),
211 m_chatroomDiscoveryBackend, SLOT(updateRoutingPrefix(const QString&)));
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800212 connect(m_chatroomDiscoveryBackend, SIGNAL(chatroomInfoRequest(std::string, bool)),
213 this, SLOT(onChatroomInfoRequest(std::string, bool)));
214 connect(this, SIGNAL(respondChatroomInfoRequest(ChatroomInfo, bool)),
215 m_chatroomDiscoveryBackend, SLOT(onRespondChatroomInfoRequest(ChatroomInfo, bool)));
216 connect(this, SIGNAL(shutdownDiscoveryBackend()),
217 m_chatroomDiscoveryBackend, SLOT(shutdown()));
218 connect(this, SIGNAL(identityUpdated(const QString&)),
219 m_chatroomDiscoveryBackend, SLOT(onIdentityUpdated(const QString&)));
Yingdi Yuf3401182015-02-02 20:21:07 -0800220 connect(this, SIGNAL(nfdReconnect()),
221 m_chatroomDiscoveryBackend, SLOT(onNfdReconnect()));
222 connect(m_chatroomDiscoveryBackend, SIGNAL(nfdError()),
223 this, SLOT(onNfdError()));
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800224
225 // connect chatroom discovery back end with front end
226 connect(m_discoveryPanel, SIGNAL(waitForChatroomInfo(const QString&)),
227 m_chatroomDiscoveryBackend, SLOT(onWaitForChatroomInfo(const QString&)));
228 connect(m_discoveryPanel, SIGNAL(warning(const QString&)),
229 this, SLOT(onWarning(const QString&)));
230 connect(this, SIGNAL(identityUpdated(const QString&)),
231 m_discoveryPanel, SLOT(onIdentityUpdated(const QString&)));
232 connect(m_chatroomDiscoveryBackend, SIGNAL(chatroomListReady(const QStringList&)),
233 m_discoveryPanel, SLOT(onChatroomListReady(const QStringList&)));
Qiuhan Dingba3e57a2015-01-08 19:07:39 -0800234 connect(m_chatroomDiscoveryBackend, SIGNAL(chatroomInfoReady(const ChatroomInfo&, bool)),
235 m_discoveryPanel, SLOT(onChatroomInfoReady(const ChatroomInfo&, bool)));
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800236 connect(m_discoveryPanel, SIGNAL(startChatroom(const QString&, bool)),
237 this, SLOT(onStartChatroom(const QString&, bool)));
Qiuhan Dingba3e57a2015-01-08 19:07:39 -0800238 connect(m_discoveryPanel, SIGNAL(sendInvitationRequest(const QString&, const QString&)),
239 &m_backend, SLOT(onSendInvitationRequest(const QString&, const QString&)));
240 connect(&m_backend, SIGNAL(invitationRequestResult(const std::string&)),
241 m_discoveryPanel, SLOT(onInvitationRequestResult(const std::string&)));
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800242
243 m_chatroomDiscoveryBackend->start();
244
Yingdi Yu233a9722014-03-07 15:47:09 -0800245 createTrayIcon();
246
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700247 emit updateLocalPrefix();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800248}
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700249
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800250Controller::~Controller()
251{
252 saveConf();
253}
254
255// public methods
256
257
258// private methods
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700259string
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800260Controller::getDBName()
261{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700262 string dbName("chronos-");
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800263
264 std::stringstream ss;
265 {
266 using namespace CryptoPP;
267
268 SHA256 hash;
269 StringSource(m_identity.wireEncode().wire(), m_identity.wireEncode().size(), true,
270 new HashFilter(hash, new HexEncoder(new FileSink(ss), false)));
271 }
272 dbName.append(ss.str()).append(".db");
273
274 return dbName;
275}
276
277void
278Controller::openDB()
279{
280 m_db = QSqlDatabase::addDatabase("QSQLITE");
281 QString path = (QDir::home().path());
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700282 path.append(QDir::separator())
283 .append(".chronos")
284 .append(QDir::separator())
285 .append(getDBName().c_str());
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800286 m_db.setDatabaseName(path);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800287
Yingdi Yu42125862014-08-07 17:04:28 -0700288 m_db.open();
289
290 // bool ok = m_db.open();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700291 // _LOG_DEBUG("DB opened: " << std::boolalpha << ok );
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800292}
293
294void
295Controller::initialize()
296{
297 loadConf();
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700298
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800299 openDB();
300
301 emit identityUpdated(QString(m_identity.toUri().c_str()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800302}
303
304void
305Controller::loadConf()
306{
307 namespace fs = boost::filesystem;
308
309 fs::path chronosDir = fs::path(getenv("HOME")) / ".chronos";
310 fs::create_directories (chronosDir);
311
312 std::ifstream is((chronosDir / "config").c_str ());
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800313 Conf conf;
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800314 Block confBlock;
315 try {
316 confBlock = ndn::Block::fromStream(is);
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800317 conf.wireDecode(confBlock);
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700318 m_identity.clear();
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800319 m_identity.append(conf.getIdentity());
320 if (conf.getNick().length() != 0)
321 m_nick = conf.getNick();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700322 else
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800323 m_nick = m_identity.get(-1).toUri();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700324 }
Varun Patil3d850902020-11-23 12:19:14 +0530325 catch (tlv::Error&) {
Qiuhan Dinge86f3192015-04-07 17:52:59 -0700326 try {
327 ndn::KeyChain keyChain;
Varun Patil3d850902020-11-23 12:19:14 +0530328 m_identity = keyChain.getPib().getDefaultIdentity().getName();
Qiuhan Dinge86f3192015-04-07 17:52:59 -0700329 }
Varun Patil3d850902020-11-23 12:19:14 +0530330 catch (ndn::security::pib::Pib::Error&) {
Qiuhan Dinge86f3192015-04-07 17:52:59 -0700331 m_identity.clear();
332 m_identity.append("chronochat-tmp-identity")
Varun Patil3d850902020-11-23 12:19:14 +0530333 .append(getRandomString());
Qiuhan Dinge86f3192015-04-07 17:52:59 -0700334 }
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700335 m_nick = m_identity.get(-1).toUri();
336 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800337}
338
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700339void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800340Controller::saveConf()
341{
342 namespace fs = boost::filesystem;
343
344 fs::path chronosDir = fs::path(getenv("HOME")) / ".chronos";
345 fs::create_directories (chronosDir);
346
347 std::ofstream os((chronosDir / "config").c_str ());
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800348 Conf conf;
349 conf.setIdentity(m_identity);
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700350 if (!m_nick.empty())
Qiuhan Ding0cfc1512015-02-17 17:44:11 -0800351 conf.setNick(m_nick);
352 Block confWire = conf.wireEncode();
353 os.write(reinterpret_cast<const char*>(confWire.wire()), confWire.size());
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800354
355 os.close();
356}
357
358void
359Controller::createActions()
360{
361 m_startChatroom = new QAction(tr("Start new chat"), this);
362 connect(m_startChatroom, SIGNAL(triggered()), this, SLOT(onStartChatAction()));
363
364 m_settingsAction = new QAction(tr("Settings"), this);
365 connect(m_settingsAction, SIGNAL(triggered()), this, SLOT(onSettingsAction()));
366
367 m_editProfileAction = new QAction(tr("Edit profile"), this);
368 connect(m_editProfileAction, SIGNAL(triggered()), this, SLOT(onProfileEditorAction()));
369
370 m_contactListAction = new QAction(tr("Contact List"), this);
371 connect(m_contactListAction, SIGNAL(triggered()), this, SLOT(onContactListAction()));
372
373 m_addContactAction = new QAction(tr("Add contact"), this);
374 connect(m_addContactAction, SIGNAL(triggered()), this, SLOT(onAddContactAction()));
375
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800376 m_chatroomDiscoveryAction = new QAction(tr("Chatroom Discovery"), this);
377 connect(m_chatroomDiscoveryAction, SIGNAL(triggered()), this, SLOT(onChatroomDiscoveryAction()));
378
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800379 m_updateLocalPrefixAction = new QAction(tr("Update local prefix"), this);
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700380 connect(m_updateLocalPrefixAction, SIGNAL(triggered()),
381 &m_backend, SLOT(onUpdateLocalPrefixAction()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800382
383 m_minimizeAction = new QAction(tr("Mi&nimize"), this);
384 connect(m_minimizeAction, SIGNAL(triggered()), this, SLOT(onMinimizeAction()));
385
386 m_quitAction = new QAction(tr("Quit"), this);
387 connect(m_quitAction, SIGNAL(triggered()), this, SLOT(onQuitAction()));
Mengjin Yan391d7242014-08-28 20:51:55 -0700388
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800389}
390
391void
392Controller::createTrayIcon()
393{
394 createActions();
395
396 m_trayIconMenu = new QMenu(this);
397 m_trayIconMenu->addAction(m_startChatroom);
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800398 m_trayIconMenu->addAction(m_chatroomDiscoveryAction);
Mengjin Yan391d7242014-08-28 20:51:55 -0700399
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800400 m_trayIconMenu->addSeparator();
401 m_trayIconMenu->addAction(m_settingsAction);
402 m_trayIconMenu->addAction(m_editProfileAction);
403 m_trayIconMenu->addSeparator();
404 m_trayIconMenu->addAction(m_contactListAction);
405 m_trayIconMenu->addAction(m_addContactAction);
406 m_trayIconMenu->addSeparator();
407 m_trayIconMenu->addAction(m_updateLocalPrefixAction);
408 m_trayIconMenu->addSeparator();
409 m_trayIconMenu->addAction(m_minimizeAction);
410 m_closeMenu = m_trayIconMenu->addMenu("Close chatroom");
411 m_closeMenu->setEnabled(false);
412 m_trayIconMenu->addSeparator();
413 m_trayIconMenu->addAction(m_quitAction);
414
415 m_trayIcon = new QSystemTrayIcon(this);
416 m_trayIcon->setContextMenu(m_trayIconMenu);
417
418 m_trayIcon->setIcon(QIcon(":/images/icon_small.png"));
419 m_trayIcon->setToolTip("ChronoChat System Tray Icon");
420 m_trayIcon->setVisible(true);
421}
422
423void
424Controller::updateMenu()
425{
Varun Patil3d850902020-11-23 12:19:14 +0530426 m_trayIconMenu->clear();
427 QMenu* menu = m_trayIconMenu;
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700428
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800429 menu->addAction(m_startChatroom);
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800430 menu->addAction(m_chatroomDiscoveryAction);
Mengjin Yan391d7242014-08-28 20:51:55 -0700431
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800432 menu->addSeparator();
433 menu->addAction(m_settingsAction);
434 menu->addAction(m_editProfileAction);
435 menu->addSeparator();
Yingdi Yu233a9722014-03-07 15:47:09 -0800436 menu->addAction(m_contactListAction);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800437 menu->addAction(m_addContactAction);
438 menu->addSeparator();
439 {
440 ChatActionList::const_iterator it = m_chatActionList.begin();
441 ChatActionList::const_iterator end = m_chatActionList.end();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700442 if (it != end) {
443 for (; it != end; it++)
444 menu->addAction(it->second);
445 menu->addSeparator();
446 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800447 }
448 menu->addAction(m_updateLocalPrefixAction);
449 menu->addSeparator();
450 menu->addAction(m_minimizeAction);
Varun Patil3d850902020-11-23 12:19:14 +0530451 m_closeMenu = menu->addMenu("Close chatroom");
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800452 {
453 ChatActionList::const_iterator it = m_closeActionList.begin();
454 ChatActionList::const_iterator end = m_closeActionList.end();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700455 if (it == end)
Varun Patil3d850902020-11-23 12:19:14 +0530456 m_closeMenu->setEnabled(false);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800457 else
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700458 for (; it != end; it++)
Varun Patil3d850902020-11-23 12:19:14 +0530459 m_closeMenu->addAction(it->second);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800460 }
461 menu->addSeparator();
462 menu->addAction(m_quitAction);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800463}
464
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700465string
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800466Controller::getRandomString()
467{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700468 uint32_t r = ndn::random::generateWord32();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800469 std::stringstream ss;
470 {
471 using namespace CryptoPP;
472 StringSource(reinterpret_cast<uint8_t*>(&r), 4, true,
473 new HexEncoder(new FileSink(ss), false));
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700474
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800475 }
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700476 // for (int i = 0; i < 8; i++)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800477 // {
478 // uint32_t t = r & mask;
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700479 // if (t < 10)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800480 // ss << static_cast<char>(t + 0x30);
481 // else
482 // ss << static_cast<char>(t + 0x57);
483 // r = r >> 4;
484 // }
485
486 return ss.str();
487}
488
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800489void
490Controller::addChatDialog(const QString& chatroomName, ChatDialog* chatDialog)
491{
492 m_chatDialogList[chatroomName.toStdString()] = chatDialog;
493 connect(chatDialog, SIGNAL(closeChatDialog(const QString&)),
494 this, SLOT(onRemoveChatDialog(const QString&)));
495 connect(chatDialog, SIGNAL(showChatMessage(const QString&, const QString&, const QString&)),
496 this, SLOT(onShowChatMessage(const QString&, const QString&, const QString&)));
Yingdi Yu233a9722014-03-07 15:47:09 -0800497 connect(chatDialog, SIGNAL(resetIcon()),
498 this, SLOT(onResetIcon()));
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700499 connect(&m_backend, SIGNAL(localPrefixUpdated(const QString&)),
Yingdi Yud45777b2014-10-16 23:54:11 -0700500 chatDialog->getBackend(), SLOT(updateRoutingPrefix(const QString&)));
Yingdi Yubaaaec02014-09-02 22:05:32 -0700501 connect(this, SIGNAL(localPrefixConfigured(const QString&)),
Yingdi Yud45777b2014-10-16 23:54:11 -0700502 chatDialog->getBackend(), SLOT(updateRoutingPrefix(const QString&)));
Yingdi Yuf3401182015-02-02 20:21:07 -0800503 connect(this, SIGNAL(nfdReconnect()),
504 chatDialog->getBackend(), SLOT(onNfdReconnect()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800505
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800506 // connect chat dialog with discovery backend
Yingdi Yuf3401182015-02-02 20:21:07 -0800507 connect(chatDialog->getBackend(), SIGNAL(nfdError()),
508 this, SLOT(onNfdError()));
509 connect(chatDialog->getBackend(), SIGNAL(newChatroomForDiscovery(ndn::Name::Component)),
510 m_chatroomDiscoveryBackend, SLOT(onNewChatroomForDiscovery(ndn::Name::Component)));
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800511 connect(chatDialog->getBackend(), SIGNAL(addInRoster(ndn::Name, ndn::Name::Component)),
512 m_chatroomDiscoveryBackend, SLOT(onAddInRoster(ndn::Name, ndn::Name::Component)));
513 connect(chatDialog->getBackend(), SIGNAL(eraseInRoster(ndn::Name, ndn::Name::Component)),
514 m_chatroomDiscoveryBackend, SLOT(onEraseInRoster(ndn::Name, ndn::Name::Component)));
515
516
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800517 QAction* chatAction = new QAction(chatroomName, this);
518 m_chatActionList[chatroomName.toStdString()] = chatAction;
Mengjin Yan391d7242014-08-28 20:51:55 -0700519 connect(chatAction, SIGNAL(triggered()),
Yingdi Yue8323b62014-09-02 17:24:15 -0700520 chatDialog, SLOT(onShow()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800521
522 QAction* closeAction = new QAction(chatroomName, this);
523 m_closeActionList[chatroomName.toStdString()] = closeAction;
Yingdi Yud45777b2014-10-16 23:54:11 -0700524 connect(closeAction, SIGNAL(triggered()),
525 chatDialog, SLOT(shutdown()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800526
527 updateMenu();
528}
529
Mengjin Yan391d7242014-08-28 20:51:55 -0700530void
531Controller::updateDiscoveryList(const ChatroomInfo& info, bool isAdd)
532{
533 emit discoverChatroomChanged(info, isAdd);
534}
535
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800536void
537Controller::onIdentityUpdated(const QString& identity)
538{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700539 while (!m_chatDialogList.empty()) {
540 ChatDialogList::const_iterator it = m_chatDialogList.begin();
Yingdi Yu1fd4e4a2015-02-02 13:37:50 -0800541 it->second->shutdown();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700542 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800543
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800544 emit closeDBModule();
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700545
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700546 Name identityName(identity.toStdString());
547 m_identity = identityName;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800548
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700549 QTimer::singleShot(500, this, SLOT(onIdentityUpdatedContinued()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800550}
551
552void
553Controller::onIdentityUpdatedContinued()
554{
555 QString connection = m_db.connectionName();
556 // _LOG_DEBUG("connection name: " << connection.toStdString());
557 QSqlDatabase::removeDatabase(connection);
558 m_db.close();
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700559
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800560 openDB();
561
562 emit identityUpdated(QString(m_identity.toUri().c_str()));
563}
564
565void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800566Controller::onNickUpdated(const QString& nick)
567{
568 m_nick = nick.toStdString();
569}
570
571void
572Controller::onLocalPrefixUpdated(const QString& localPrefix)
573{
Yingdi Yubaaaec02014-09-02 22:05:32 -0700574 QString privateLocalPrefix("/private/local");
575
Yingdi Yubaaaec02014-09-02 22:05:32 -0700576 if (privateLocalPrefix != localPrefix)
577 m_localPrefixDetected = true;
578 else
579 m_localPrefixDetected = false;
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700580
581 m_localPrefix = Name(localPrefix.toStdString());
Yingdi Yubaaaec02014-09-02 22:05:32 -0700582}
583
584void
585Controller::onLocalPrefixConfigured(const QString& prefix)
586{
587 if (!m_localPrefixDetected) {
588 m_localPrefix = Name(prefix.toStdString());
589 emit localPrefixConfigured(prefix);
590 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800591}
592
593void
594Controller::onStartChatAction()
595{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700596 string chatroom = "chatroom-" + getRandomString();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800597
598 m_startChatDialog->setChatroom(chatroom);
599 m_startChatDialog->show();
600 m_startChatDialog->raise();
601}
602
603void
604Controller::onSettingsAction()
605{
606 m_settingDialog->setNick(QString(m_nick.c_str()));
607 m_settingDialog->show();
608 m_settingDialog->raise();
609}
610
611void
612Controller::onProfileEditorAction()
613{
Varun Patil3d850902020-11-23 12:19:14 +0530614 m_profileEditor->resetPanel();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800615 m_profileEditor->show();
616 m_profileEditor->raise();
617}
618
619void
620Controller::onAddContactAction()
621{
622 emit refreshBrowseContact();
623 m_browseContactDialog->show();
624 m_browseContactDialog->raise();
625}
626
627void
628Controller::onContactListAction()
629{
630 m_contactPanel->show();
631 m_contactPanel->raise();
632}
633
634void
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800635Controller::onChatroomDiscoveryAction()
636{
637 m_discoveryPanel->show();
638 m_discoveryPanel->raise();
639}
640
641void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800642Controller::onDirectAdd()
643{
644 m_addContactPanel->show();
645 m_addContactPanel->raise();
646}
647
648void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800649Controller::onMinimizeAction()
650{
651 m_settingDialog->hide();
652 m_startChatDialog->hide();
653 m_profileEditor->hide();
654 m_invitationDialog->hide();
655 m_addContactPanel->hide();
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800656 m_discoveryPanel->hide();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800657
658 ChatDialogList::iterator it = m_chatDialogList.begin();
659 ChatDialogList::iterator end = m_chatDialogList.end();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700660 for (; it != end; it++)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800661 it->second->hide();
662}
663
664void
665Controller::onQuitAction()
666{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700667 while (!m_chatDialogList.empty()) {
668 ChatDialogList::const_iterator it = m_chatDialogList.begin();
Yingdi Yud45777b2014-10-16 23:54:11 -0700669 it->second->shutdown();
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700670 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800671
672 delete m_settingDialog;
673 delete m_startChatDialog;
674 delete m_profileEditor;
675 delete m_invitationDialog;
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700676 delete m_browseContactDialog;
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800677 delete m_addContactPanel;
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800678 delete m_discoveryPanel;
679 if (m_chatroomDiscoveryBackend->isRunning()) {
680 emit shutdownDiscoveryBackend();
681 m_chatroomDiscoveryBackend->wait();
682 }
683 delete m_chatroomDiscoveryBackend;
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700684
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700685 if (m_backend.isRunning()) {
686 emit shutdownBackend();
687 m_backend.wait();
688 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800689
Yingdi Yuf3401182015-02-02 20:21:07 -0800690 if (m_nfdConnectionChecker != nullptr && m_nfdConnectionChecker->isRunning()) {
691 emit shutdownNfdChecker();
692 m_nfdConnectionChecker->wait();
693 }
694
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800695 QApplication::quit();
696}
697
698void
699Controller::onStartChatroom(const QString& chatroomName, bool secured)
700{
701 Name chatroomPrefix;
702 chatroomPrefix.append("ndn")
703 .append("broadcast")
704 .append("ChronoChat")
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800705 .append("Chatroom")
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800706 .append(chatroomName.toStdString());
707
708 // check if the chatroom exists
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700709 if (m_chatDialogList.find(chatroomName.toStdString()) != m_chatDialogList.end()) {
710 QMessageBox::information(this, tr("ChronoChat"),
711 tr("You are creating an existing chatroom."
712 "You can check it in the context memu."));
713 return;
714 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800715
Mengjin Yan391d7242014-08-28 20:51:55 -0700716 // TODO: We should create a chatroom specific key/cert
717 //(which should be created in the first half of this method
718 //, but let's use the default one for now.
Yingdi Yud45777b2014-10-16 23:54:11 -0700719 Name chatPrefix;
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800720 chatPrefix.append(m_identity).append("CHRONOCHAT-CHATDATA").append(chatroomName.toStdString());
Yingdi Yud45777b2014-10-16 23:54:11 -0700721
Mengjin Yan391d7242014-08-28 20:51:55 -0700722 ChatDialog* chatDialog
Yingdi Yud45777b2014-10-16 23:54:11 -0700723 = new ChatDialog(chatroomPrefix,
724 chatPrefix,
725 m_localPrefix,
726 chatroomName.toStdString(),
Yingdi Yu45da92a2015-02-02 13:17:03 -0800727 m_nick,
728 true,
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800729 m_identity,
730 this);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800731
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700732 addChatDialog(chatroomName, chatDialog);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800733 chatDialog->show();
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700734
735 emit addChatroom(chatroomName);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800736}
737
738void
Yingdi Yueb692ac2015-02-10 18:46:18 -0800739Controller::onStartChatroom2(chronochat::Invitation invitation, bool secured)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800740{
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700741 QString chatroomName = QString::fromStdString(invitation.getChatroom());
742 onStartChatroom(chatroomName, secured);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800743
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700744 ChatDialogList::iterator it = m_chatDialogList.find(chatroomName.toStdString());
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800745
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700746 BOOST_ASSERT(it != m_chatDialogList.end());
747 it->second->addSyncAnchor(invitation);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800748}
749
Yingdi Yu2c9e7712014-10-20 11:55:05 -0700750
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800751void
752Controller::onShowChatMessage(const QString& chatroomName, const QString& from, const QString& data)
753{
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700754 m_trayIcon->showMessage(QString("Chatroom %1 has a new message").arg(chatroomName),
755 QString("<%1>: %2").arg(from).arg(data),
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800756 QSystemTrayIcon::Information, 20000);
757 m_trayIcon->setIcon(QIcon(":/images/note.png"));
758}
759
760void
Yingdi Yu233a9722014-03-07 15:47:09 -0800761Controller::onResetIcon()
762{
763 m_trayIcon->setIcon(QIcon(":/images/icon_small.png"));
764}
765
766void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800767Controller::onRemoveChatDialog(const QString& chatroomName)
768{
Varun Patil3d850902020-11-23 12:19:14 +0530769 emit removeChatroom(chatroomName);
770
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800771 ChatDialogList::iterator it = m_chatDialogList.find(chatroomName.toStdString());
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700772 if (it != m_chatDialogList.end()) {
773 ChatDialog* deletedChat = it->second;
774 if (deletedChat)
775 delete deletedChat;
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800776
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700777 m_chatDialogList.erase(it);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800778
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700779 QAction* chatAction = m_chatActionList[chatroomName.toStdString()];
780 QAction* closeAction = m_closeActionList[chatroomName.toStdString()];
781 if (chatAction)
782 delete chatAction;
783 if (closeAction)
784 delete closeAction;
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700785
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700786 m_chatActionList.erase(chatroomName.toStdString());
787 m_closeActionList.erase(chatroomName.toStdString());
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700788
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700789 updateMenu();
790 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800791}
792
793void
794Controller::onWarning(const QString& msg)
795{
796 QMessageBox::information(this, tr("ChronoChat"), msg);
797}
798
799void
Yingdi Yuf3401182015-02-02 20:21:07 -0800800Controller::onNfdError()
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800801{
Yingdi Yuf3401182015-02-02 20:21:07 -0800802 if (m_isInConnectionDetection)
803 return;
804 // begin a thread
Varun Patil3d850902020-11-23 12:19:14 +0530805
Yingdi Yuf3401182015-02-02 20:21:07 -0800806 m_isInConnectionDetection = true;
807 m_nfdConnectionChecker = new NfdConnectionChecker(this);
808
809 connect(m_nfdConnectionChecker, SIGNAL(nfdConnected()),
810 this, SLOT(onNfdReconnect()));
811 connect(this, SIGNAL(shutdownNfdChecker()),
812 m_nfdConnectionChecker, SLOT(shutdown()));
813
814 m_nfdConnectionChecker->start();
815 QMessageBox::information(this, tr("ChronoChat"), "Nfd is not running");
816}
817
818void
819Controller::onNfdReconnect()
820{
821 if (m_nfdConnectionChecker != nullptr && m_nfdConnectionChecker->isRunning()) {
822 m_nfdConnectionChecker->wait();
823 }
824 delete m_nfdConnectionChecker;
825 m_nfdConnectionChecker = nullptr;
826 m_isInConnectionDetection = false;
827 emit nfdReconnect();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800828}
829
Yingdi Yu233a9722014-03-07 15:47:09 -0800830void
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800831Controller::onChatroomInfoRequest(std::string chatroomName, bool isManager)
Mengjin Yan391d7242014-08-28 20:51:55 -0700832{
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800833 auto it = m_chatDialogList.find(chatroomName);
834 if (it != m_chatDialogList.end())
835 emit respondChatroomInfoRequest(it->second->getChatroomInfo(), isManager);
Mengjin Yan391d7242014-08-28 20:51:55 -0700836}
837
Yingdi Yueb692ac2015-02-10 18:46:18 -0800838} // namespace chronochat
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800839
840#if WAF
841#include "controller.moc"
Yingdi Yu42125862014-08-07 17:04:28 -0700842// #include "controller.cpp.moc"
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800843#endif