ewmscp  ..
inputHandler.h
Go to the documentation of this file.
1 #ifndef __inputHandler_h__
2 #define __inputHandler_h__
3 #include "ioHandle.h"
4 #include "pathHandler.h"
5 #include <unwindCheck.h>
6 #include <map>
7 #include <vector>
8 #include <memory>
9 #include <stdexcept>
10 
11 class block;
12 namespace copyRequest {
13  class stateType;
14 };
15 
22 class delayAdvisingError: public std::runtime_error {
23  public:
24  delayAdvisingError(const std::string& aWhat) : std::runtime_error(aWhat) {};
25  delayAdvisingError(const char* aWhat) : std::runtime_error(aWhat) {};
26  ~delayAdvisingError() override = default;
27 };
28 
29 namespace inputHandler {
35  class base: virtual public pathHandler {
36  // now follows some reflection magic
37  public:
38  class factoryClass;
39  protected:
40  static std::map<std::string, factoryClass*>& getFactoryMap() {
41  static std::remove_reference<decltype(getFactoryMap())>::type map;
42  return map;
43  }
44  public:
45  class factoryClass {
46  protected:
47  const std::string name;
48  factoryClass(const std::string& aName):
49  name(aName) {
50  getFactoryMap()[name] = this;
51  }
52  public:
53  virtual base* create() const = 0;
54  };
55  template <class T> class factoryTemplate: public factoryClass {
56  public:
57  factoryTemplate(const std::string& aName): factoryClass(aName) {};
58  base* create() const override {
59  return new T();
60  }
61  };
62  // end of reflection magic
63  protected:
64  base() = default;
65  public:
66  virtual ~base() override = default;
67 
72  class reader: protected unwindCheck, virtual public ioHandle {
73  protected:
75  std::remove_const<decltype(readInitialStat.size)>::type totalBytesRead = 0;
76  reader(const genericStat& inititalStat): readInitialStat(inititalStat) {};
77  public:
79  virtual ~reader() noexcept(false) = default;
80 
83  virtual bool setupSparseRegions(const std::string& /*sparseHandling*/) {
84  return false;
85  };
86 
91  virtual bool readBlock(block &b) = 0;
92 
93 
100  virtual void readBlockP(block& /*b*/, size_t /*bytesToRead*/, off_t /*offset*/) {
101  throw unimplementedActionError("parallel reading not implemented");
102  }
103 
107  virtual void checkUnchangedness() = 0;
108 
112  virtual void seek(size_t /*pos*/
113  ) {
114  throw unimplementedActionError("seek not implemented");
115  };
116  };
117 
123  virtual std::unique_ptr<reader> newReader(const std::string& path,
124  copyRequest::stateType &state,
125  const genericStat& inititalStat
126  ) = 0;
127 
129 
130  static base* newHandler(const std::string& name) {
131  auto it = getFactoryMap().find(name);
132  if (it != getFactoryMap().end()) {
133  return it->second->create();
134  }
135  throw std::runtime_error("no inputHandler factory called " + name);
136  }
137  template <class T> static void addAllowedNamesToOption(T& option) {
138  for (const auto& item : getFactoryMap()) {
139  option.fAddToRange(item.first);
140  }
141  };
142 
149  virtual bool readLinkTarget(const std::string& /*path*/,
150  std::vector<char>& /*target*/) {
151  throw unimplementedActionError("link reading not implemented");
152  }
153 
154 
155  virtual std::unique_ptr<acl::list> getAclData(const std::string& /*path*/) {
156  return nullptr;
157  }
158 
159  class Directory: protected unwindCheck {
160  protected:
161  const std::string path;
162  public:
163  class Entry {
164  const std::string name;
165  std::unique_ptr<const genericStat> stat;
166  public:
167  Entry(const std::string& aName,
168  std::unique_ptr<const genericStat>& aStat): name(aName),
169  stat(std::move(aStat)) {
170  };
171  Entry(const std::string& aName,
172  std::unique_ptr<genericStat>& aStat): name(aName),
173  stat(std::move(aStat)) {
174  };
175  ~Entry() = default;
176  const std::string& getName() const {
177  return name;
178  };
179  std::unique_ptr<const genericStat> getStat() {
180  return std::move(stat);
181  }
182  };
183  Directory(const std::string& aPath): path(aPath) {};
184  virtual ~Directory() noexcept(false) {};
185  virtual std::unique_ptr<Entry> getNextEntry(bool ignoreMissing) = 0;
186  };
187  virtual std::unique_ptr<Directory> getDirectory(const std::string& path) = 0;
188 
189  };
190 } // end namespace inputHandler
191 #endif
inputHandler::base::newHandler
static base * newHandler(const std::string &name)
create an instance of an inputHandler, select by name
Definition: inputHandler.h:130
delayAdvisingError
class for exceptions that advise for delays Exceptions of this kind are to be thrown when circumstanc...
Definition: inputHandler.h:22
inputHandler::base::getAclData
virtual std::unique_ptr< acl::list > getAclData(const std::string &)
Definition: inputHandler.h:155
inputHandler::base::factoryClass::name
const std::string name
Definition: inputHandler.h:47
inputHandler::base::Directory::Entry::Entry
Entry(const std::string &aName, std::unique_ptr< const genericStat > &aStat)
Definition: inputHandler.h:167
inputHandler::base::Directory::Entry::Entry
Entry(const std::string &aName, std::unique_ptr< genericStat > &aStat)
Definition: inputHandler.h:171
inputHandler
Definition: inputHandler.h:29
inputHandler::base::getDirectory
virtual std::unique_ptr< Directory > getDirectory(const std::string &path)=0
inputHandler::base::factoryClass
Definition: inputHandler.h:45
genericStat
generic stat abstraction class Used to abstract the variants of the stat structure.
Definition: genericStat.h:12
inputHandler::base::reader::readBlockP
virtual void readBlockP(block &, size_t, off_t)
read one block from the file, starting at offset.
Definition: inputHandler.h:100
unimplementedActionError
class for exceptions that result from unimplemented functions Exceptions of this kind are to be throw...
Definition: copyRequestTypes.h:32
unwindCheck
Definition: unwindCheck.h:5
inputHandler::base::reader::seek
virtual void seek(size_t)
like the standard seek, to be used only when appending new data to a file
Definition: inputHandler.h:112
inputHandler::base::factoryTemplate::factoryTemplate
factoryTemplate(const std::string &aName)
Definition: inputHandler.h:57
inputHandler::base::factoryTemplate
Definition: inputHandler.h:55
inputHandler::base::readLinkTarget
virtual bool readLinkTarget(const std::string &, std::vector< char > &)
read link target from a symlink
Definition: inputHandler.h:149
inputHandler::base::newReader
virtual std::unique_ptr< reader > newReader(const std::string &path, copyRequest::stateType &state, const genericStat &inititalStat)=0
get a reader for the file at path
copyRequest::stateType
Definition: copyRequestTypes.h:66
inputHandler::base::reader::readInitialStat
const genericStat & readInitialStat
stat at beginning, needed for unchngedness check
Definition: inputHandler.h:74
inputHandler::base::~base
virtual ~base() override=default
inputHandler::base::factoryTemplate::create
base * create() const override
Definition: inputHandler.h:58
inputHandler::base::Directory::Entry::getStat
std::unique_ptr< const genericStat > getStat()
Definition: inputHandler.h:179
delayAdvisingError::delayAdvisingError
delayAdvisingError(const char *aWhat)
Definition: inputHandler.h:25
inputHandler::base::Directory::Directory
Directory(const std::string &aPath)
Definition: inputHandler.h:183
genericStat::size
size_t size
Definition: genericStat.h:16
inputHandler::base::Directory::~Directory
virtual ~Directory() noexcept(false)
Definition: inputHandler.h:184
inputHandler::base::Directory::Entry::stat
std::unique_ptr< const genericStat > stat
Definition: inputHandler.h:165
inputHandler::base::reader::totalBytesRead
std::remove_const< decltype(readInitialStat.size)>::type totalBytesRead
number of bytes read so far, needed for check on growing files
Definition: inputHandler.h:75
block
data block, used to hold the data that are being copied (or checksummed).
Definition: block.h:7
ioHandle.h
delayAdvisingError::delayAdvisingError
delayAdvisingError(const std::string &aWhat)
Definition: inputHandler.h:24
inputHandler::base::Directory
Definition: inputHandler.h:159
inputHandler::base::Directory::getNextEntry
virtual std::unique_ptr< Entry > getNextEntry(bool ignoreMissing)=0
inputHandler::base::Directory::Entry::~Entry
~Entry()=default
inputHandler::base::Directory::path
const std::string path
Definition: inputHandler.h:161
pathHandler
Definition: pathHandler.h:6
inputHandler::base::reader::reader
reader(const genericStat &inititalStat)
Definition: inputHandler.h:76
inputHandler::base
class for handling input This is the (abstract) base class for handling input, both reading a file vi...
Definition: inputHandler.h:35
inputHandler::base::reader::checkUnchangedness
virtual void checkUnchangedness()=0
check if the file is unchanged by comparing cuttent stat to initial stat
pathHandler.h
inputHandler::base::factoryClass::create
virtual base * create() const =0
unwindCheck.h
inputHandler::base::addAllowedNamesToOption
static void addAllowedNamesToOption(T &option)
Definition: inputHandler.h:137
ioHandle
class as base for inputHandler::base::reader and outputHandler::base::writer containing the common pa...
Definition: ioHandle.h:15
inputHandler::base::getFactoryMap
static std::map< std::string, factoryClass * > & getFactoryMap()
Definition: inputHandler.h:40
inputHandler::base::Directory::Entry::name
const std::string name
Definition: inputHandler.h:164
inputHandler::base::reader::~reader
virtual ~reader() noexcept(false)=default
inputHandler::base::Directory::Entry::getName
const std::string & getName() const
Definition: inputHandler.h:176
copyRequest
Definition: checksumTestRequestProvider.cpp:25
inputHandler::base::Directory::Entry
Definition: inputHandler.h:163
inputHandler::base::reader::readBlock
virtual bool readBlock(block &b)=0
read one block from the file
delayAdvisingError::~delayAdvisingError
~delayAdvisingError() override=default
inputHandler::base::factoryClass::factoryClass
factoryClass(const std::string &aName)
Definition: inputHandler.h:48
inputHandler::base::reader::setupSparseRegions
virtual bool setupSparseRegions(const std::string &)
set up internal list of data and hole regions, normally does nothing
Definition: inputHandler.h:83
inputHandler::base::reader
(abstract) class for reading a file An instance of this class is used to read data from a file vie th...
Definition: inputHandler.h:72
inputHandler::base::base
base()=default