Node.h
1 /*
2  * Copyright 2016 Gigatribe
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef GIGA_CORE_NODE_H_
18 #define GIGA_CORE_NODE_H_
19 
20 #include "FileUploader.h"
21 #include "FileDownloader.h"
22 #include "../utils/EnumConvertor.h"
23 #include "Sha1Calculator.h"
24 
25 #include <cpprest/details/basic_types.h>
26 #include <chrono>
27 #include <memory>
28 #include <utility>
29 #include <vector>
30 
31 namespace giga
32 {
33 class Application;
34 
35 namespace data
36 {
37 struct Node;
38 }
39 
40 namespace core
41 {
42 class FolderNode;
43 class FileNodeData;
44 
50 class Node
51 {
52 public:
53  enum class Type
54  {
55  root = 0, folder, file
56  };
57  static const utils::EnumConvertor<core::Node::Type, 3> typeCvrt;
58 
59  enum class MediaType
60  {
61  audio = 0, document, video, image, unknown, folder //, user
62  };
63  static const utils::EnumConvertor<MediaType, 6> mediaTypeCvrt;
64 
89  enum class MergePolicy
90  {
91  override = 0, ignore, renameSource, renameDest
92  };
93  static const utils::EnumConvertor<MergePolicy, 4> mergePolicyCvrt;
94 
95 public:
96  Node() = default;
97  virtual ~Node() = default;
98  Node(Node&&) = default;
99  Node& operator=(Node&&) = default;
100 
101  Node(const Node& rhs);
102  Node& operator=(const Node& rhs);
103 
104  static std::unique_ptr<Node>
105  create(std::shared_ptr<data::Node> n, const Application& app);
106 
107  static std::unique_ptr<Node>
108  create(const Node& node);
109 
110 protected:
111  explicit Node(std::shared_ptr<data::Node> n, const Application& app);
112 
113 public:
114  const std::string&
115  id() const;
116 
117  Type
118  type() const;
119 
120  const utility::string_t&
121  name() const;
122 
123  const std::string&
124  parentId() const;
125 
126  const std::vector<std::string>&
127  ancestors() const;
128 
129  uint64_t
130  ownerId() const;
131 
132  std::chrono::system_clock::time_point
133  creationDate () const;
134 
135  std::chrono::system_clock::time_point
136  lastUpdateDate () const;
137 
138  uint64_t
139  nbChildren () const;
140 
141  uint64_t
142  nbFiles () const;
143 
144  uint64_t
145  size () const;
146 
154  virtual const std::vector<std::unique_ptr<Node>>&
155  getChildren() const = 0;
156 
162  virtual FolderNode&
163  addChildFolder(const utility::string_t& name) = 0;
164 
170  virtual FolderNode
171  createChildFolder(const utility::string_t& name) const = 0;
172 
173  typedef std::unique_ptr<
174  std::pair<
175  std::unique_ptr<Sha1Calculator>,
176  pplx::task<std::shared_ptr<FileUploader>>
177  >
178  > UploadingFile;
179 
188  virtual UploadingFile
189  uploadFile(const boost::filesystem::path& filepath, pplx::cancellation_token_source cts = pplx::cancellation_token_source{}) = 0;
190 
200  virtual FileDownloader
201  download(const utility::string_t& destinationPath, FileDownloader::Policy policy = FileDownloader::Policy::ignore) = 0;
202 
207  virtual const FileNodeData&
208  fileData() const = 0;
209 
214  void
215  remove();
216 
226  const utility::string_t&
227  rename(const utility::string_t& name);
228 
232  std::unique_ptr<core::Node>
233  copyTo(const FolderNode& node, MergePolicy policy = MergePolicy::renameSource) const;
234 
238  std::unique_ptr<core::Node>
239  moveTo(const FolderNode& node, MergePolicy policy = MergePolicy::renameSource) const;
240 
258  std::unique_ptr<core::Node>
259  copyOrMoveTo(const FolderNode& node, bool isMove, MergePolicy policy = MergePolicy::renameSource) const;
260 
261  const std::shared_ptr<data::Node>
262  handle() const;
263 
264 protected:
265  std::shared_ptr<data::Node> _data;
266  const Application* _app;
267 };
268 
269 } /* namespace core */
270 } /* namespace giga */
271 
272 #endif /* GIGA_CORE_NODE_H_ */
virtual const std::vector< std::unique_ptr< Node > > & getChildren() const =0
Load the children node if needed then return them. The children nodes are stored in a local cache var...
Definition: Node.h:50
virtual const FileNodeData & fileData() const =0
Get the data associated with a FileNode.
Policy
Definition: FileDownloader.h:41
std::unique_ptr< core::Node > copyTo(const FolderNode &node, MergePolicy policy=MergePolicy::renameSource) const
Shortcut for copyOrMoveTo(const FolderNode&, false, MergePolicy)
Definition: Node.cpp:219
virtual FolderNode & addChildFolder(const utility::string_t &name)=0
Create a new FolderNode and add it to the children list.
MergePolicy
Definition: Node.h:89
std::unique_ptr< core::Node > moveTo(const FolderNode &node, MergePolicy policy=MergePolicy::renameSource) const
Shortcut for copyOrMoveTo(const FolderNode&, bool, MergePolicy)
Definition: Node.cpp:213
Definition: EnumConvertor.h:29
virtual UploadingFile uploadFile(const boost::filesystem::path &filepath, pplx::cancellation_token_source cts=pplx::cancellation_token_source{})=0
Upload a file into this FolderNode.
const utility::string_t & rename(const utility::string_t &name)
Rename this node.
Definition: Node.cpp:197
std::unique_ptr< core::Node > copyOrMoveTo(const FolderNode &node, bool isMove, MergePolicy policy=MergePolicy::renameSource) const
Copy or move a node.
Definition: Node.cpp:225
virtual FileDownloader download(const utility::string_t &destinationPath, FileDownloader::Policy policy=FileDownloader::Policy::ignore)=0
Download a FileNode.
virtual FolderNode createChildFolder(const utility::string_t &name) const =0
Create a new FolderNode (Do not add it to the local children list)
Definition: FolderNode.h:27
Definition: Application.h:45