src: Add chatroom discovery

Change-Id: I45e17a8d8bbcdef6dc5f93c528cde91181f3b578
diff --git a/src/discovery-panel.hpp b/src/discovery-panel.hpp
new file mode 100644
index 0000000..1776d37
--- /dev/null
+++ b/src/discovery-panel.hpp
@@ -0,0 +1,127 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013, Regents of the University of California
+ *
+ * BSD license, See the LICENSE file for more information
+ *
+ * Author: Qiuhan Ding <qiuhanding@cs.ucla.edu>
+ *         Yingdi Yu <yingdi@cs.ucla.edu>
+ */
+
+#ifndef CHRONOCHAT_DISCOVERY_PANEL_HPP
+#define CHRONOCHAT_DISCOVERY_PANEL_HPP
+
+#include <QDialog>
+#include <QStringListModel>
+
+#ifndef Q_MOC_RUN
+#include "chatroom-info.hpp"
+#endif
+
+namespace Ui {
+class DiscoveryPanel;
+}
+
+namespace chronochat {
+
+class DiscoveryPanel : public QDialog
+{
+  Q_OBJECT
+
+public:
+  explicit
+  DiscoveryPanel(QWidget* parent = 0);
+
+  virtual
+  ~DiscoveryPanel();
+
+private:
+  void
+  resetPanel();
+
+  void
+  refreshPanel();
+
+signals:
+  /**
+   * @brief get chatroom info from discovery backend
+   *
+   * @param chatroomName the name of chatroom we want to get info from
+   */
+  void
+  waitForChatroomInfo(const QString& chatroomName);
+
+  /**
+   * @brief send warning if strange things happen
+   *
+   * @param msg the message that print in the warning
+   */
+  void
+  warning(const QString& msg);
+
+  /**
+   * @brief join the chatroom the user clicked
+   *
+   * This function will be called if the join button is clicked. The join button is enabled
+   * when there is no trust model for the chatroom.
+   * The user will join the chatroom he choose directly.
+   *
+   * @param chatroomName the chatroom to join
+   * @param secured if security is enabled in this chatroom
+   */
+  void
+  startChatroom(const QString& chatroomName, bool secured);
+
+public slots:
+  /**
+   * @brief reset the panel when identity is updated
+   *
+   */
+  void
+  onIdentityUpdated(const QString& identity);
+
+  /**
+   * @brief print the chatroom list on the panel
+   *
+   * @param list list of chatroom name get from discovery backend
+   */
+  void
+  onChatroomListReady(const QStringList& list);
+
+  /**
+   * @brief print the chatroom info on the panel
+   *
+   * @param info chatroom info get from discovery backend
+   */
+  void
+  onChatroomInfoReady(const ChatroomInfo& info);
+
+private slots:
+  void
+  onSelectedChatroomChanged(const QItemSelection& selected,
+                     const QItemSelection& deselected);
+
+  void
+  onSelectedParticipantChanged(const QItemSelection& selected,
+                                const QItemSelection& deselected);
+
+  void
+  onJoinClicked();
+
+private:
+  Ui::DiscoveryPanel* ui;
+
+  // Models.
+  QStringListModel* m_chatroomListModel;
+  QStringListModel* m_rosterListModel;
+
+  // Internal data structure.
+  QStringList m_chatroomList;
+  QStringList m_rosterList;
+  QString     m_chatroom;
+  QString     m_participant;
+};
+
+} // namespace chronochat
+
+#endif // CHRONOCHAT_DISCOVERY_PANEL_HPP