blob: c23fcf90ffd8ad79401e8d4d2e9aaeda159184d5 [file] [log] [blame]
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Lijing Wang152449c2015-05-31 16:25:16 -07003 * Copyright (c) 2013-2017, Regents of the University of California.
Jared Lindblom06405c42013-01-17 20:48:39 -08004 *
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -08005 * This file is part of ChronoShare, a decentralized file sharing application over NDN.
Jared Lindblom06405c42013-01-17 20:48:39 -08006 *
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -08007 * ChronoShare is free software: you can redistribute it and/or modify it under the terms
8 * of the GNU General Public License as published by the Free Software Foundation, either
9 * version 3 of the License, or (at your option) any later version.
Jared Lindblom06405c42013-01-17 20:48:39 -080010 *
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -080011 * ChronoShare is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU General Public License for more details.
Jared Lindblom06405c42013-01-17 20:48:39 -080014 *
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -080015 * You should have received copies of the GNU General Public License along with
16 * ChronoShare, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * See AUTHORS.md for complete list of ChronoShare authors and contributors.
Jared Lindblom06405c42013-01-17 20:48:39 -080019 */
20
Lijing Wang152449c2015-05-31 16:25:16 -070021#ifndef CHRONOSHARE_GUI_CHRONOSHAREGUI_HPP
22#define CHRONOSHARE_GUI_CHRONOSHAREGUI_HPP
Jared Lindblom06405c42013-01-17 20:48:39 -080023
Lijing Wang152449c2015-05-31 16:25:16 -070024#include "core/chronoshare-common.hpp"
Zhenkai Zhuaca6cb52013-02-24 23:34:03 -080025
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080026#include <QApplication>
27#include <QCloseEvent>
Jared Lindblom06405c42013-01-17 20:48:39 -080028#include <QDebug>
Jared Lindblomb4032e22013-01-17 23:50:51 -080029#include <QDir>
30#include <QFileDialog>
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080031#include <QMenu>
Jared Lindblom5d7e51e2013-01-18 00:59:34 -080032#include <QMessageBox>
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080033#include <QProcess>
34#include <QSettings>
35#include <QSystemTrayIcon>
Lijing Wang152449c2015-05-31 16:25:16 -070036#include <QtWidgets>
Jared Lindblom06405c42013-01-17 20:48:39 -080037
Lijing Wang152449c2015-05-31 16:25:16 -070038#ifndef Q_MOC_RUN
Alexander Afanasyevf4cde4e2016-12-25 13:42:57 -080039#include "dispatcher.hpp"
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080040#include "fs-watcher.hpp"
Yukai Tu05126792016-10-11 15:03:30 -070041#include "io-service-manager.hpp"
Zhenkai Zhud9429222013-02-25 22:34:09 -080042#include "server.hpp"
Lijing Wang152449c2015-05-31 16:25:16 -070043#endif // Q_MOC_RUN
44
45#if __APPLE__ && HAVE_SPARKLE
46#define SPARKLE_SUPPORTED 1
47#include "sparkle-auto-update.hpp"
48#endif
49
50#include <thread>
51
52namespace ndn {
53namespace chronoshare {
Alexander Afanasyev9e5a4702013-01-24 13:15:23 -080054
Jared Lindblomc8ffd592013-01-25 00:00:30 -080055class ChronoShareGui : public QDialog
Jared Lindblom06405c42013-01-17 20:48:39 -080056{
Alexander Afanasyev83a53002013-01-24 11:12:01 -080057 Q_OBJECT
Jared Lindblom06405c42013-01-17 20:48:39 -080058
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080059public:
Yukai Tu73287f52017-02-06 15:46:40 -080060 class Error : public std::runtime_error
61 {
62 public:
63 explicit Error(const std::string& what)
64 : std::runtime_error(what)
65 {
66 }
67 };
68
69public:
Alexander Afanasyev83a53002013-01-24 11:12:01 -080070 // constructor
71 explicit ChronoShareGui(QWidget* parent = 0);
72
Yukai Tu73287f52017-02-06 15:46:40 -080073 explicit ChronoShareGui(QString dirPath, QString username, QString sharedFolderName, QWidget* parent = 0);
74
Alexander Afanasyev83a53002013-01-24 11:12:01 -080075 // destructor
76 ~ChronoShareGui();
Jared Lindblomb4032e22013-01-17 23:50:51 -080077
Jared Lindblom06405c42013-01-17 20:48:39 -080078private slots:
Alexander Afanasyev83a53002013-01-24 11:12:01 -080079 // open the shared folder
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080080 void
81 openSharedFolder();
Jared Lindblomb4032e22013-01-17 23:50:51 -080082
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080083 void
84 openFile();
Zhenkai Zhu25e13582013-02-27 15:33:01 -080085
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080086 void
87 openInWebBrowser();
Zhenkai Zhu25e13582013-02-27 15:33:01 -080088
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080089 void
90 updateRecentFilesMenu();
Zhenkai Zhu25e13582013-02-27 15:33:01 -080091
Alexander Afanasyev83a53002013-01-24 11:12:01 -080092 // open file dialog
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080093 void
94 openFileDialog();
Jared Lindblomb4032e22013-01-17 23:50:51 -080095
Alexander Afanasyev83a53002013-01-24 11:12:01 -080096 // handle left click of tray icon
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080097 void
98 trayIconClicked(QSystemTrayIcon::ActivationReason reason);
Jared Lindblom06405c42013-01-17 20:48:39 -080099
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800100 // view chronoshare settings
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800101 void
102 viewSettings();
Jared Lindblom5d7e51e2013-01-18 00:59:34 -0800103
Jared Lindblomc8ffd592013-01-25 00:00:30 -0800104 // change chronoshare settings
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800105 void
106 changeSettings();
Jared Lindblomc8ffd592013-01-25 00:00:30 -0800107
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800108 void
109 onCheckForUpdates();
Alexander Afanasyev85a4ba02013-02-24 16:30:17 -0800110
Jared Lindblom06405c42013-01-17 20:48:39 -0800111private:
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800112 void
113 checkFileAction(const std::string&, int, int);
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800114 // create actions that result from clicking a menu option
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800115 void
116 createActionsAndMenu();
Jared Lindblom06405c42013-01-17 20:48:39 -0800117
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800118 // create tray icon
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800119 void
120 createTrayIcon();
Jared Lindblom06405c42013-01-17 20:48:39 -0800121
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800122 // set icon image
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800123 void
124 setIcon();
Jared Lindblom06405c42013-01-17 20:48:39 -0800125
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800126 // load persistent settings
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800127 bool
128 loadSettings();
Jared Lindblomb4032e22013-01-17 23:50:51 -0800129
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800130 // save persistent settings
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800131 void
132 saveSettings();
Jared Lindblomb4032e22013-01-17 23:50:51 -0800133
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800134 // prompt user dialog box
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800135 void
136 openMessageBox(QString title, QString text);
Jared Lindblom5d7e51e2013-01-18 00:59:34 -0800137
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800138 // overload
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800139 void
140 openMessageBox(QString title, QString text, QString infotext);
Jared Lindblom5d7e51e2013-01-18 00:59:34 -0800141
Yukai Tu05126792016-10-11 15:03:30 -0700142 void
143 openWarningMessageBox(QString title, QString text, QString infotext);
144
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800145 // capture close event
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800146 void
147 closeEvent(QCloseEvent* event);
Jared Lindblom06405c42013-01-17 20:48:39 -0800148
Alexander Afanasyevd437ffc2013-03-04 12:29:23 -0800149 // starts/restarts fs watcher and dispatcher
Zhenkai Zhud5756312013-01-31 13:49:45 -0800150 void
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800151 startBackend(bool restart = false);
Zhenkai Zhud5756312013-01-31 13:49:45 -0800152
Jared Lindblom06405c42013-01-17 20:48:39 -0800153private:
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800154 QSystemTrayIcon* m_trayIcon; // tray icon
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800155 QMenu* m_trayIconMenu; // tray icon menu
Jared Lindblom06405c42013-01-17 20:48:39 -0800156
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800157 QAction* m_openFolder; // open the shared folder action
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800158 QAction* m_viewSettings; // chronoShare settings
159 QAction* m_changeFolder; // change the shared folder action
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800160 QAction* m_quitProgram; // quit program action
161 QAction* m_checkForUpdates;
162 QAction* m_openWeb;
163 QMenu* m_recentFilesMenu;
164 QAction* m_fileActions[5];
Jared Lindblom06405c42013-01-17 20:48:39 -0800165
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800166 QString m_dirPath; // shared directory
167 QString m_username; // username
Jared Lindblomc8ffd592013-01-25 00:00:30 -0800168 QString m_sharedFolderName; // shared folder name
Jared Lindblomb4032e22013-01-17 23:50:51 -0800169
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800170 http::server::server* m_httpServer;
Yukai Tu73287f52017-02-06 15:46:40 -0800171 IoServiceManager* m_ioServiceManager;
Lijing Wang152449c2015-05-31 16:25:16 -0700172 std::thread m_httpServerThread;
Jared Lindblomc8ffd592013-01-25 00:00:30 -0800173
174 QLabel* labelUsername;
175 QPushButton* button;
176 QLabel* labelSharedFolder;
177 QLabel* labelSharedFolderPath;
178 QLineEdit* editUsername;
179 QLineEdit* editSharedFolder;
180 QLineEdit* editSharedFolderPath;
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800181 QLabel* label;
182 QVBoxLayout* mainLayout;
Jared Lindblomc8ffd592013-01-25 00:00:30 -0800183
Zhenkai Zhuaca6cb52013-02-24 23:34:03 -0800184#ifdef SPARKLE_SUPPORTED
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -0800185 AutoUpdate* m_autoUpdate;
Zhenkai Zhuaca6cb52013-02-24 23:34:03 -0800186#endif
Alexander Afanasyev83a53002013-01-24 11:12:01 -0800187 // QString m_settingsFilePath; // settings file path
188 // QString m_settings;
Lijing Wang152449c2015-05-31 16:25:16 -0700189
Yukai Tu05126792016-10-11 15:03:30 -0700190 std::thread m_NetworkThread;
Lijing Wang152449c2015-05-31 16:25:16 -0700191 std::unique_ptr<boost::asio::io_service> m_ioService;
Yukai Tu05126792016-10-11 15:03:30 -0700192 std::unique_ptr<boost::asio::io_service::work> m_ioServiceWork;
193
Lijing Wang152449c2015-05-31 16:25:16 -0700194 std::unique_ptr<Face> m_face;
195 std::unique_ptr<FsWatcher> m_watcher;
196 std::unique_ptr<Dispatcher> m_dispatcher;
Jared Lindblom06405c42013-01-17 20:48:39 -0800197};
198
Lijing Wang152449c2015-05-31 16:25:16 -0700199} // namespace chronoshare
200} // namespace ndn
201
202#endif // CHRONOSHARE_GUI_CHRONOSHAREGUI_HPP