major change: Add security support & Adjust GUI
Change-Id: I7abef37169dec1ef4b68e760dee5214c147c1915
diff --git a/src/chat-dialog.h b/src/chat-dialog.h
new file mode 100644
index 0000000..f136b82
--- /dev/null
+++ b/src/chat-dialog.h
@@ -0,0 +1,329 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013, Regents of the University of California
+ * Yingdi Yu
+ *
+ * BSD license, See the LICENSE file for more information
+ *
+ * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ * Yingdi Yu <yingdi@cs.ucla.edu>
+ */
+
+#ifndef CHAT_DIALOG_H
+#define CHAT_DIALOG_H
+
+#include <QDialog>
+#include <QTextTable>
+#include <QStringListModel>
+#include <QSystemTrayIcon>
+#include <QMenu>
+#include <QTimer>
+
+#include "invite-list-dialog.h"
+
+#ifndef Q_MOC_RUN
+#include "contact-manager.h"
+#include "invitation.h"
+#include "contact.h"
+#include "chatbuf.pb.h"
+#include "intro-cert-list.pb.h"
+#include "digesttreescene.h"
+#include <sync-socket.h>
+#include <sync-seq-no.h>
+#include <ndn-cpp-dev/security/key-chain.hpp>
+#include "validator-invitation.h"
+
+#include <boost/thread/locks.hpp>
+#include <boost/thread/recursive_mutex.hpp>
+#include <boost/thread/thread.hpp>
+#endif
+
+#define MAX_HISTORY_ENTRY 20
+
+namespace Ui {
+class ChatDialog;
+}
+
+class ChatDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit
+ ChatDialog(chronos::ContactManager* contactManager,
+ ndn::shared_ptr<ndn::Face> face,
+ const ndn::IdentityCertificate& myCertificate,
+ const ndn::Name& chatroomPrefix,
+ const ndn::Name& localPrefix,
+ const std::string& nick,
+ bool witSecurity,
+ QWidget* parent = 0);
+
+ ~ChatDialog();
+
+ void
+ addSyncAnchor(const chronos::Invitation& invitation);
+
+ void
+ processTreeUpdateWrapper(const std::vector<Sync::MissingDataInfo>&, Sync::SyncSocket *);
+
+ void
+ processDataWrapper(const ndn::shared_ptr<const ndn::Data>& data);
+
+ void
+ processDataNoShowWrapper(const ndn::shared_ptr<const ndn::Data>& data);
+
+ void
+ processRemoveWrapper(std::string);
+
+protected:
+ void
+ closeEvent(QCloseEvent *e);
+
+ void
+ resizeEvent(QResizeEvent *);
+
+ void
+ showEvent(QShowEvent *);
+
+private:
+ void
+ updatePrefix();
+
+ void
+ updateLabels();
+
+ void
+ initializeSync();
+
+ void
+ sendInvitation(ndn::shared_ptr<chronos::Contact> contact, bool isIntroducer);
+
+ void
+ replyWrapper(const ndn::Interest& interest,
+ ndn::Data& data,
+ size_t routablePrefixOffset,
+ bool isIntroducer);
+
+ void
+ replyTimeoutWrapper(const ndn::Interest& interest,
+ size_t routablePrefixOffset);
+
+ void
+ onReplyValidated(const ndn::shared_ptr<const ndn::Data>& data,
+ size_t inviteeRoutablePrefixOffset,
+ bool isIntroduce);
+
+ void
+ onReplyValidationFailed(const ndn::shared_ptr<const ndn::Data>& data,
+ const std::string& failureInfo);
+
+ void
+ invitationRejected(const ndn::Name& identity);
+
+ void
+ invitationAccepted(const ndn::IdentityCertificate& inviteeCert,
+ const ndn::Name& inviteePrefix,
+ bool isIntroducer);
+
+ void
+ fetchIntroCert(const ndn::Name& identity, const ndn::Name& prefix);
+
+ void
+ onIntroCertList(const ndn::Interest& interest, const ndn::Data& data);
+
+ void
+ onIntroCertListTimeout(const ndn::Interest& interest, int retry, const std::string& msg);
+
+ void
+ introCertWrapper(const ndn::Interest& interest, ndn::Data& data);
+
+ void
+ introCertTimeoutWrapper(const ndn::Interest& interest, int retry, const QString& msg);
+
+ void
+ onCertListInterest(const ndn::Name& prefix, const ndn::Interest& interest);
+
+ void
+ onCertListRegisterFailed(const ndn::Name& prefix, const std::string& msg);
+
+ void
+ onCertSingleInterest(const ndn::Name& prefix, const ndn::Interest& interest);
+
+ void
+ onCertSingleRegisterFailed(const ndn::Name& prefix, const std::string& msg);
+
+
+ void
+ sendMsg(SyncDemo::ChatMessage &msg);
+
+ void
+ disableTreeDisplay();
+
+ void
+ appendMessage(const SyncDemo::ChatMessage msg, bool isHistory = false);
+
+ void
+ processRemove(QString prefix);
+
+ ndn::Name
+ getInviteeRoutablePrefix(const ndn::Name& invitee);
+
+ void
+ formChatMessage(const QString &text, SyncDemo::ChatMessage &msg);
+
+ void
+ formControlMessage(SyncDemo::ChatMessage &msg, SyncDemo::ChatMessage::ChatMessageType type);
+
+ QString
+ formatTime(time_t);
+
+ void
+ printTimeInCell(QTextTable *, time_t);
+
+ std::string
+ getRandomString();
+
+ void
+ showMessage(const QString&, const QString&);
+
+ void
+ fitView();
+
+ void
+ summonReaper();
+
+signals:
+ void
+ processData(const ndn::Data& data, bool show, bool isHistory);
+
+ void
+ processTreeUpdate(const std::vector<Sync::MissingDataInfo>);
+
+ void
+ closeChatDialog(const QString& chatroomName);
+
+ void
+ inivationRejection(const QString& msg);
+
+ void
+ showChatMessage(const QString& chatroomName, const QString& from, const QString& data);
+
+ void
+ reply(const ndn::Interest& interest, const ndn::Data& data, size_t routablePrefixOffset, bool isIntroducer);
+
+ void
+ replyTimeout(const ndn::Interest& interest, size_t routablePrefixOffset);
+
+ void
+ introCert(const ndn::Interest& interest, const ndn::Data& data);
+
+ void
+ introCertTimeout(const ndn::Interest& interest, int retry, const QString& msg);
+
+
+public slots:
+ void
+ onLocalPrefixUpdated(const QString& localPrefix);
+
+ void
+ onClose();
+
+private slots:
+ void
+ onReturnPressed();
+
+ void
+ onTreeButtonPressed();
+
+ void
+ onProcessData(const ndn::Data& data, bool show, bool isHistory);
+
+ void
+ onProcessTreeUpdate(const std::vector<Sync::MissingDataInfo>&);
+
+ void
+ onReplot();
+
+ void
+ onRosterChanged(QStringList);
+
+ void
+ onInviteListDialogRequested();
+
+ void
+ sendJoin();
+
+ void
+ sendHello();
+
+ void
+ sendLeave();
+
+ void
+ enableTreeDisplay();
+
+ void
+ reap();
+
+ void
+ onSendInvitation(QString);
+
+ void
+ onReply(const ndn::Interest& interest, const ndn::Data& data, size_t routablePrefixOffset, bool isIntroducer);
+
+ void
+ onReplyTimeout(const ndn::Interest& interest, size_t routablePrefixOffset);
+
+ void
+ onIntroCert(const ndn::Interest& interest, const ndn::Data& data);
+
+ void
+ onIntroCertTimeout(const ndn::Interest& interest, int retry, const QString& msg);
+
+private:
+ Ui::ChatDialog *ui;
+ ndn::KeyChain m_keyChain;
+
+ chronos::ContactManager* m_contactManager;
+ ndn::shared_ptr<ndn::Face> m_face;
+
+ ndn::IdentityCertificate m_myCertificate;
+ ndn::Name m_identity;
+
+ ndn::Name m_certListPrefix;
+ const ndn::RegisteredPrefixId* m_certListPrefixId;
+ ndn::Name m_certSinglePrefix;
+ const ndn::RegisteredPrefixId* m_certSinglePrefixId;
+
+ std::string m_chatroomName;
+ ndn::Name m_chatroomPrefix;
+ ndn::Name m_localPrefix;
+ bool m_useRoutablePrefix;
+ ndn::Name m_chatPrefix;
+ ndn::Name m_localChatPrefix;
+ std::string m_nick;
+ DigestTreeScene *m_scene;
+ QStringListModel *m_rosterModel;
+ QTimer* m_timer;
+
+
+ int64_t m_lastMsgTime;
+ int m_randomizedInterval;
+ bool m_joined;
+
+ Sync::SyncSocket *m_sock;
+ uint64_t m_session;
+ ndn::shared_ptr<ndn::SecRuleRelative> m_dataRule;
+
+ InviteListDialog* m_inviteListDialog;
+ ndn::shared_ptr<chronos::ValidatorInvitation> m_invitationValidator;
+
+ boost::recursive_mutex m_msgMutex;
+ boost::recursive_mutex m_sceneMutex;
+ QList<QString> m_zombieList;
+ int m_zombieIndex;
+};
+
+#endif // CHAT_DIALOG_H