blob: 4e7ab592ae579b7b2d452647227a558111159ae2 [file] [log] [blame]
Alexander Afanasyevb4b92292013-07-09 13:54:59 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2013, Regents of the University of California
Yingdi Yu5b989132013-10-23 14:03:09 -07004 * Yingdi Yu
Alexander Afanasyevb4b92292013-07-09 13:54:59 -07005 *
Yingdi Yu5b989132013-10-23 14:03:09 -07006 * BSD license, See the LICENSE file for more information
Alexander Afanasyevb4b92292013-07-09 13:54:59 -07007 *
Yingdi Yu7989eb22013-10-31 17:38:22 -07008 * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
9 * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
10 * Yingdi Yu <yingdi@cs.ucla.edu>
Alexander Afanasyevb4b92292013-07-09 13:54:59 -070011 */
12
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -070013#ifndef CHATDIALOG_H
14#define CHATDIALOG_H
Alexander Afanasyevf829f4d2013-05-07 15:59:36 -070015
Yingdi Yu5b989132013-10-23 14:03:09 -070016#include <QDialog>
Yingdi Yu7989eb22013-10-31 17:38:22 -070017#include <QTextTable>
18#include <QStringListModel>
19#include <QTimer>
Yingdi Yu83eae842013-11-06 22:07:38 -080020#include <QSystemTrayIcon>
Yingdi Yu702d6f12013-11-07 17:00:54 -080021#include <QMenu>
Yingdi Yu7989eb22013-10-31 17:38:22 -070022
23#include "invitelistdialog.h"
Alexander Afanasyevf829f4d2013-05-07 15:59:36 -070024
Yingdi Yu5b989132013-10-23 14:03:09 -070025#ifndef Q_MOC_RUN
26#include <ndn.cxx/data.h>
Yingdi Yueda39aa2013-10-23 23:07:29 -070027#include <ndn.cxx/security/keychain.h>
28#include <ndn.cxx/wrapper/wrapper.h>
Yingdi Yu7989eb22013-10-31 17:38:22 -070029#include "invitation-policy-manager.h"
Yingdi Yueda39aa2013-10-23 23:07:29 -070030#include "contact-item.h"
Yingdi Yu7989eb22013-10-31 17:38:22 -070031
Alexander Afanasyev4a979312013-11-07 15:30:05 -080032#include <sync-socket.h>
Yingdi Yu7989eb22013-10-31 17:38:22 -070033#include <sync-seq-no.h>
34#include "chatbuf.pb.h"
35#include "digesttreescene.h"
Alexander Afanasyevf829f4d2013-05-07 15:59:36 -070036#endif
37
Yingdi Yu7989eb22013-10-31 17:38:22 -070038#define MAX_HISTORY_ENTRY 20
39
Yingdi Yu5b989132013-10-23 14:03:09 -070040namespace Ui {
41class ChatDialog;
42}
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -070043
Yingdi Yu5b989132013-10-23 14:03:09 -070044class ChatDialog : public QDialog
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -070045{
Yingdi Yu5b989132013-10-23 14:03:09 -070046 Q_OBJECT
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -070047
48public:
Yingdi Yu7989eb22013-10-31 17:38:22 -070049 explicit ChatDialog(ndn::Ptr<ContactManager> contactManager,
50 const ndn::Name& chatroomPrefix,
Yingdi Yu5b989132013-10-23 14:03:09 -070051 const ndn::Name& localPrefix,
Yingdi Yueda39aa2013-10-23 23:07:29 -070052 const ndn::Name& defaultIdentity,
Yingdi Yu46948282013-11-06 18:43:31 -080053 const std::string& nick,
54 bool trial = false,
Yingdi Yu5b989132013-10-23 14:03:09 -070055 QWidget *parent = 0);
Yingdi Yu7989eb22013-10-31 17:38:22 -070056
57 // explicit ChatDialog(const ndn::Name& chatroomPrefix,
58 // const ndn::Name& localPrefix,
59 // const ndn::Name& defaultIdentity,
60 // const ndn::security::IdentityCertificate& identityCertificate,
61 // QWidget *parent = 0);
62
Zhenkai Zhu82a62752012-06-04 17:11:04 -070063 ~ChatDialog();
Zhenkai Zhub45e38a2012-06-01 15:44:36 -070064
Yingdi Yu5b989132013-10-23 14:03:09 -070065 const ndn::Name&
66 getChatroomPrefix() const
67 { return m_chatroomPrefix; }
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -070068
Yingdi Yu5b989132013-10-23 14:03:09 -070069 const ndn::Name&
70 getLocalPrefix() const
71 { return m_localPrefix; }
72
73 void
Yingdi Yu7989eb22013-10-31 17:38:22 -070074 sendInvitation(ndn::Ptr<ContactItem> contact, bool isIntroducer);
75
76 void
77 addTrustAnchor(const EndorseCertificate& selfEndorseCertificate);
78
79 void
80 addChatDataRule(const ndn::Name& prefix,
81 const ndn::security::IdentityCertificate& identityCertificate,
82 bool isIntroducer);
83
84 void
85 appendMessage(const SyncDemo::ChatMessage msg, bool isHistory = false);
86
87 void
88 processTreeUpdateWrapper(const std::vector<Sync::MissingDataInfo>, Sync::SyncSocket *);
89
90 void
91 processDataWrapper(ndn::Ptr<ndn::Data> data);
92
93 void
94 processDataNoShowWrapper(ndn::Ptr<ndn::Data> data);
95
96 void
97 processRemoveWrapper(std::string);
Zhenkai Zhu10ccb5a2012-06-04 21:55:14 -070098
Yingdi Yu83eae842013-11-06 22:07:38 -080099 void
100 publishIntroCert(const ndn::security::IdentityCertificate& dskCertificate, bool isIntroducer);
101
Yingdi Yu46948282013-11-06 18:43:31 -0800102protected:
Yingdi Yu83eae842013-11-06 22:07:38 -0800103 void
104 closeEvent(QCloseEvent *e);
105
106 void
107 changeEvent(QEvent *e);
Yingdi Yu46948282013-11-06 18:43:31 -0800108
Zhenkai Zhub45e38a2012-06-01 15:44:36 -0700109private:
Yingdi Yu7989eb22013-10-31 17:38:22 -0700110
111 void
112 initializeSetting();
113
114 void
115 updateLabels();
116
Yingdi Yueda39aa2013-10-23 23:07:29 -0700117 void
Yingdi Yu46948282013-11-06 18:43:31 -0800118 setWrapper(bool trial);
Yingdi Yu7989eb22013-10-31 17:38:22 -0700119
120 void
121 initializeSync();
Yingdi Yueda39aa2013-10-23 23:07:29 -0700122
123 void
Yingdi Yu7989eb22013-10-31 17:38:22 -0700124 onInviteReplyVerified(ndn::Ptr<ndn::Data> data, const ndn::Name& identity, bool isIntroducer);
Yingdi Yueda39aa2013-10-23 23:07:29 -0700125
126 void
127 onInviteTimeout(ndn::Ptr<ndn::Closure> closure,
128 ndn::Ptr<ndn::Interest> interest,
129 const ndn::Name& identity,
130 int retry);
131
132 void
133 invitationRejected(const ndn::Name& identity);
134
135 void
Yingdi Yu7989eb22013-10-31 17:38:22 -0700136 invitationAccepted(const ndn::Name& identity,
137 ndn::Ptr<ndn::Data> data,
138 const std::string& inviteePrefix,
139 bool isIntroducer);
Yingdi Yueda39aa2013-10-23 23:07:29 -0700140
141 void
142 onUnverified(ndn::Ptr<ndn::Data> data);
Yingdi Yu7989eb22013-10-31 17:38:22 -0700143
Yingdi Yu46948282013-11-06 18:43:31 -0800144 void
145 onTimeout(ndn::Ptr<ndn::Closure> closure,
146 ndn::Ptr<ndn::Interest> interest);
Yingdi Yu7989eb22013-10-31 17:38:22 -0700147
148
149 // void
150 // fetchHistory(std::string name);
151
152 void
153 formChatMessage(const QString &text, SyncDemo::ChatMessage &msg);
154
155 void
156 formControlMessage(SyncDemo::ChatMessage &msg, SyncDemo::ChatMessage::ChatMessageType type);
157
158 void
159 sendMsg(SyncDemo::ChatMessage &msg);
160
161 void
162 resizeEvent(QResizeEvent *);
163
164 void
165 showEvent(QShowEvent *);
166
167 void
168 fitView();
169
Yingdi Yu83eae842013-11-06 22:07:38 -0800170 void
171 createActions();
172
173 void
174 createTrayIcon();
175
Yingdi Yu7989eb22013-10-31 17:38:22 -0700176 QString
177 formatTime(time_t);
178
179 void
180 printTimeInCell(QTextTable *, time_t);
181
182 void
183 disableTreeDisplay();
184
185signals:
186 void
187 dataReceived(QString name, const char *buf, size_t len, bool show, bool isHistory);
188
189 void
190 treeUpdated(const std::vector<Sync::MissingDataInfo>);
191
192 void
193 removeReceived(QString prefix);
194
Yingdi Yu46948282013-11-06 18:43:31 -0800195 void
196 closeChatDialog(const ndn::Name& chatroomPrefix);
197
Yingdi Yu7989eb22013-10-31 17:38:22 -0700198public slots:
199 void
200 processTreeUpdate(const std::vector<Sync::MissingDataInfo>);
201
202 void
203 processData(QString name, const char *buf, size_t len, bool show, bool isHistory);
204
205 void
206 processRemove(QString prefix);
207
208private slots:
209 void
210 returnPressed();
211
212 void
213 treeButtonPressed();
214
215 void
216 sendJoin();
217
218 void
219 sendHello();
220
221 void
222 sendLeave();
223
224 void
225 replot();
226
227 void
228 updateRosterList(QStringList);
229
230 void
231 enableTreeDisplay();
232
233 void
234 summonReaper();
235
236 void
237 reap();
238
239 void
Yingdi Yu83eae842013-11-06 22:07:38 -0800240 iconActivated(QSystemTrayIcon::ActivationReason reason);
241
242 void
243 messageClicked();
244
245 void
Yingdi Yu7989eb22013-10-31 17:38:22 -0700246 showMessage(QString, QString);
247
248 void
249 openInviteListDialog();
250
251 void
252 sendInvitationWrapper(QString, bool);
Yingdi Yu702d6f12013-11-07 17:00:54 -0800253
254 void
255 quit();
Yingdi Yueda39aa2013-10-23 23:07:29 -0700256
257private:
Yingdi Yu5b989132013-10-23 14:03:09 -0700258 Ui::ChatDialog *ui;
Yingdi Yu7989eb22013-10-31 17:38:22 -0700259 ndn::Ptr<ContactManager> m_contactManager;
Yingdi Yu5b989132013-10-23 14:03:09 -0700260 ndn::Name m_chatroomPrefix;
261 ndn::Name m_localPrefix;
Yingdi Yu7989eb22013-10-31 17:38:22 -0700262 ndn::Name m_localChatPrefix;
Yingdi Yueda39aa2013-10-23 23:07:29 -0700263 ndn::Name m_defaultIdentity;
Yingdi Yu7989eb22013-10-31 17:38:22 -0700264 ndn::Ptr<InvitationPolicyManager> m_invitationPolicyManager;
265 ndn::Ptr<SyncPolicyManager> m_syncPolicyManager;
Yingdi Yueda39aa2013-10-23 23:07:29 -0700266 ndn::Ptr<ndn::security::IdentityManager> m_identityManager;
267 ndn::Ptr<ndn::security::Keychain> m_keychain;
268 ndn::Ptr<ndn::Wrapper> m_handler;
Yingdi Yu7989eb22013-10-31 17:38:22 -0700269
270 User m_user;
Yingdi Yu46948282013-11-06 18:43:31 -0800271 std::string m_nick;
Yingdi Yu7989eb22013-10-31 17:38:22 -0700272 Sync::SyncSocket *m_sock;
273 uint32_t m_session;
274 DigestTreeScene *m_scene;
275 boost::recursive_mutex m_msgMutex;
276 boost::recursive_mutex m_sceneMutex;
277 time_t m_lastMsgTime;
278 int m_randomizedInterval;
279 QTimer *m_timer;
280 QStringListModel *m_rosterModel;
Yingdi Yu83eae842013-11-06 22:07:38 -0800281 QSystemTrayIcon *trayIcon;
Yingdi Yu7989eb22013-10-31 17:38:22 -0700282
Yingdi Yu702d6f12013-11-07 17:00:54 -0800283 QAction *minimizeAction;
284 QAction *maximizeAction;
285 QAction *restoreAction;
286 QAction *quitAction;
287 QMenu *trayIconMenu;
288
Yingdi Yu7989eb22013-10-31 17:38:22 -0700289 // QQueue<SyncDemo::ChatMessage> m_history;
290 // bool m_historyInitialized;
291 bool m_joined;
292
293 QList<QString> m_zombieList;
294 int m_zombieIndex;
295
296 InviteListDialog* m_inviteListDialog;
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -0700297};
Yingdi Yu5b989132013-10-23 14:03:09 -0700298
299#endif // ChatDIALOG_H