| 
									
										
										
										
											2015-12-24 11:41:05 +00:00
										 |  |  | #ifndef FILE_NODE_HPP__
 | 
					
						
							|  |  |  | #define FILE_NODE_HPP__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QTreeWidgetItem>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "RemoteFile.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class QNetworkAccessManager; | 
					
						
							|  |  |  | class QString; | 
					
						
							|  |  |  | class QUrl; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // A holder for a RemoteFile object linked to a QTreeWidget row.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // It  renders  the file  name  in  first  column and  holds  download
 | 
					
						
							|  |  |  | // progress data in  the second column. The progress  information is a
 | 
					
						
							|  |  |  | // 64 bit integer number of bytes in the DisplayRole and a total bytes
 | 
					
						
							|  |  |  | // expected in the UserRole. The first column also renders a check box
 | 
					
						
							|  |  |  | // that downloads  the file  when checked  and removes  the downloaded
 | 
					
						
							|  |  |  | // file  when unchecked.  The URL  and  local absolute  file path  are
 | 
					
						
							|  |  |  | // stored in the UserData and UserData+1 roles of the first column.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | class FileNode final | 
					
						
							|  |  |  |   : public QTreeWidgetItem | 
					
						
							|  |  |  |   , protected RemoteFile::ListenerInterface | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   explicit FileNode (QTreeWidgetItem * parent | 
					
						
							|  |  |  |                      , QNetworkAccessManager * network_manager | 
					
						
							|  |  |  |                      , QString const& local_path | 
					
						
							|  |  |  |                      , QUrl const& url); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool local () const {return remote_file_.local ();} | 
					
						
							|  |  |  |   bool sync (bool local); | 
					
						
							|  |  |  |   void abort (); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-01 00:40:51 +00:00
										 |  |  |   static int constexpr Type {UserType + 1}; | 
					
						
							| 
									
										
										
										
											2015-12-24 11:41:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Clients may  use this RAII  class to  block nested calls  to sync
 | 
					
						
							|  |  |  |   // which may be troublesome, e.g. when UI updates cause recursion.
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   struct sync_blocker | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     sync_blocker (FileNode * node) : node_ {node} {node_->block_sync_ = true;} | 
					
						
							|  |  |  |     sync_blocker (sync_blocker const&) = delete; | 
					
						
							|  |  |  |     sync_blocker& operator = (sync_blocker const&) = delete; | 
					
						
							|  |  |  |     ~sync_blocker () {node_->block_sync_ = false;} | 
					
						
							|  |  |  |   private: | 
					
						
							|  |  |  |     FileNode * node_; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  |   void error (QString const& title, QString const& message) override; | 
					
						
							|  |  |  |   bool redirect_request (QUrl const&) override {return true;} // allow
 | 
					
						
							|  |  |  |   void download_progress (qint64 bytes_received, qint64 total_bytes) override; | 
					
						
							|  |  |  |   void download_finished (bool success) override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   RemoteFile remote_file_;      // active download
 | 
					
						
							|  |  |  |   bool block_sync_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   friend struct sync_blocker; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |