diff --git a/include/dindexer-machinery/scantask/singlefile.hpp b/include/dindexer-machinery/scantask/singlefile.hpp
new file mode 100644
index 0000000..e56fe2f
--- /dev/null
+++ b/include/dindexer-machinery/scantask/singlefile.hpp
@@ -0,0 +1,41 @@
+/* Copyright 2015, 2016, Michele Santullo
+ * This file is part of "dindexer".
+ *
+ * "dindexer" is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * "dindexer" is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with "dindexer". If not, see .
+ */
+
+#include "dindexer-machinery/scantask/dirtree.hpp"
+#include
+
+struct stat;
+
+namespace mchlib {
+ namespace scantask {
+ class SingleFileTask : public Base> {
+ public:
+ typedef std::vector PathList;
+
+ explicit SingleFileTask ( std::string parPath );
+ explicit SingleFileTask ( std::string parPath, const struct stat* parStat );
+ virtual ~SingleFileTask ( void ) noexcept = default;
+
+ private:
+ virtual void on_data_destroy ( PathList& parData ) override;
+ virtual void on_data_create ( PathList& parData ) override;
+
+ std::string m_path;
+ const struct stat* m_stat;
+ };
+ } //namespace scantask
+} //namespace mchlib
diff --git a/src/locate/hash.cpp b/src/locate/hash.cpp
index 43f1708..52d1b56 100644
--- a/src/locate/hash.cpp
+++ b/src/locate/hash.cpp
@@ -17,7 +17,7 @@
#include "hash.hpp"
#include "dindexer-machinery/scantask/hashing.hpp"
-#include "dindexer-machinery/scantask/dirtree.hpp"
+#include "dindexer-machinery/scantask/singlefile.hpp"
#include "dindexer-machinery/recorddata.hpp"
#include "dindexer-machinery/make_filerecord_tree.hpp"
#include
@@ -31,48 +31,6 @@ namespace stask = mchlib::scantask;
namespace din {
namespace {
- class SingleFileTask : public stask::Base> {
- public:
- typedef std::vector PathList;
-
- SingleFileTask ( std::string parPath, const struct stat* parStat );
- virtual ~SingleFileTask ( void ) noexcept = default;
-
- private:
- virtual void on_data_destroy ( PathList& parData ) override;
- virtual void on_data_create ( PathList& parData ) override;
-
- std::string m_path;
- const struct stat* m_stat;
- };
-
- SingleFileTask::SingleFileTask (std::string parPath, const struct stat* parStat) :
- m_path(std::move(parPath)),
- m_stat(parStat)
- {
- assert(not m_path.empty());
- assert(m_stat);
- }
-
- void SingleFileTask::on_data_destroy (PathList& parData) {
- assert(not parData.empty());
- parData.clear();
- }
-
- void SingleFileTask::on_data_create (PathList& parData) {
- assert(parData.empty());
- parData.reserve(1);
- parData.push_back(mchlib::FileRecordData(
- std::string(m_path),
- 0,
- m_stat->st_atime,
- m_stat->st_mtime,
- 0,
- false,
- false
- ));
- }
-
void fill_hash_nodes (
const std::vector& parRefData,
const std::vector& parNodesIn,
@@ -99,6 +57,7 @@ namespace din {
std::vector hash (const std::string& parPath) {
using mchlib::FileRecordData;
using HashingTaskPtr = std::shared_ptr;
+ using stask::SingleFileTask;
struct stat path_stat;
{
diff --git a/src/machinery/CMakeLists.txt b/src/machinery/CMakeLists.txt
index 2c8ac3e..dc9a8fd 100644
--- a/src/machinery/CMakeLists.txt
+++ b/src/machinery/CMakeLists.txt
@@ -24,6 +24,7 @@ add_library(${PROJECT_NAME} SHARED
scantask/contenttype.cpp
scantask/mime.cpp
scantask/setbasic.cpp
+ scantask/singlefile.cpp
make_filerecord_tree.cpp
)
diff --git a/src/machinery/scantask/singlefile.cpp b/src/machinery/scantask/singlefile.cpp
new file mode 100644
index 0000000..e74b835
--- /dev/null
+++ b/src/machinery/scantask/singlefile.cpp
@@ -0,0 +1,68 @@
+/* Copyright 2015, 2016, Michele Santullo
+ * This file is part of "dindexer".
+ *
+ * "dindexer" is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * "dindexer" is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with "dindexer". If not, see .
+ */
+
+#include "dindexer-machinery/scantask/singlefile.hpp"
+#include "dindexer-machinery/recorddata.hpp"
+#include
+#include
+#include
+
+namespace mchlib {
+ namespace scantask {
+ SingleFileTask::SingleFileTask (std::string parPath) :
+ SingleFileTask(parPath, nullptr)
+ {
+ }
+
+ SingleFileTask::SingleFileTask (std::string parPath, const struct stat* parStat) :
+ m_path(std::move(parPath)),
+ m_stat(parStat)
+ {
+ assert(not m_path.empty());
+ }
+
+ void SingleFileTask::on_data_destroy (PathList& parData) {
+ assert(not parData.empty());
+ parData.clear();
+ }
+
+ void SingleFileTask::on_data_create (PathList& parData) {
+ struct stat path_stat;
+ const struct stat* stat_to_use = m_stat;
+
+ if (not stat_to_use) {
+ const int retval = stat(m_path.c_str(), &path_stat);
+ if (retval) {
+ throw std::runtime_error("Can't access file \"" + m_path + "\"");
+ }
+ stat_to_use = &path_stat;
+ }
+
+ assert(parData.empty());
+ parData.reserve(1);
+ parData.push_back(mchlib::FileRecordData(
+ std::string(m_path),
+ 0,
+ stat_to_use->st_atime,
+ stat_to_use->st_mtime,
+ 0,
+ false,
+ false
+ ));
+ }
+ } //namespace scantask
+} //namespace mchlib