ewmscp  ..
outputHandler.h
Go to the documentation of this file.
1 #ifndef __outputHandler_h__
2 #define __outputHandler_h__
3 
4 #include "ioHandle.h"
5 #include "pathHandler.h"
6 #include "inputHandler.h"
7 #include <map>
8 #include <vector>
9 #include <memory>
10 #include <unwindCheck.h>
11 class block;
12 namespace copyRequest {
13  class stateType;
14 };
15 
16 namespace outputHandler {
17  class base: virtual public pathHandler {
18  // now follows some reflection magic
19  public:
20  class factoryClass;
21  protected:
22  static std::map<std::string, factoryClass*>& getFactoryMap() {
23  static std::remove_reference<decltype(getFactoryMap())>::type map;
24  return map;
25  }
26  public:
28  class factoryClass {
29  protected:
30  const std::string name;
31  factoryClass(const std::string& aName):
32  name(aName) {
33  getFactoryMap()[name] = this;
34  }
35  public:
36  virtual base* create() const = 0;
37  };
39  template <class T> class factoryTemplate: public factoryClass {
40  public:
41  factoryTemplate(const std::string& aName): factoryClass(aName) {};
42  base* create() const override {
43  return new T();
44  }
45  };
46  // end of reflection magic
47  protected:
48  base() = default;
49  public:
50  ~base() override = default;
51 
52  class writer: protected unwindCheck, virtual public ioHandle {
53  public:
54  writer() = default;
55  virtual ~writer() = default;
56  virtual void closeAndRemoveBadCopy() = 0;
57  virtual void seek(size_t position);
58  virtual size_t getSize() const;
59  virtual void writeBlock(const block& b) = 0;
60  virtual void writeBlockP(const block& /*b*/) {
61  throw unimplementedActionError("parallel writing not implemented");
62  }
63  virtual void doAttributePreservations(const genericStat& readInitialStat) = 0;
64  virtual void sync() = 0;
65  };
66 
67  virtual std::unique_ptr<writer> newWriter(const std::string& path,
68  bool mightAppend,
69  size_t sourceSize,
70  size_t readBlockSize,
72  bool noWrite,
73  std::unique_ptr<ioHandle::attrDataType> attrData,
74  std::unique_ptr<acl::list> aclData) = 0;
75  virtual std::unique_ptr<writer> newTmpWriter(std::string& path,
76  size_t sourceSize,
77  bool noWrite,
78  std::unique_ptr<ioHandle::attrDataType> attrData,
79  std::unique_ptr<acl::list> aclData);
80  static base* newHandler(const std::string& name) {
81  auto it = getFactoryMap().find(name);
82  if (it != getFactoryMap().end()) {
83  return it->second->create();
84  }
85  throw std::runtime_error("no outputHandler factory called " + name);
86  }
87  template <class T> static void addAllowedNamesToOption(T& option) {
88  for (const auto& item : getFactoryMap()) {
89  option.fAddToRange(item.first);
90  }
91  };
92 
93  // methods to abstract some file handling
94  virtual void ensureParentDirs(const std::string& path,
95  const std::string& srcPath,
96  inputHandler::base* InputHandler) = 0;
97  virtual void remove(const std::string& path, copyRequest::stateType &state) = 0;
98  virtual bool renameSimple(const std::string& fromPath,
99  const std::string& toPath) = 0;
100  virtual void createSymlink(const std::vector<char>& /*target*/,
101  const std::string& /*path*/,
102  uid_t /*uid*/, gid_t /*gid*/) {
103  throw unimplementedActionError("symlink creation not implemented");
104  }
105 
106  enum class renameRetvalType {
107  ok,
108  fileChanged,
109  fileVanished,
110  cantHappen
111  };
112 
113  virtual renameRetvalType rename(const std::string& fromPath,
114  const std::unique_ptr<const genericStat>& readInitialStat,
115  const std::string& toPath,
116  copyRequest::stateType& state) = 0;
117  virtual void doAttributePreservations(const std::string& /*path*/,
118  const genericStat& /*stat*/) {
119  throw unimplementedActionError("setMtime not implemented");
120  }
121  virtual size_t getMaxNameLength(const std::string& dirPath);
122  template <class C> void shortenNameToMax(const std::string& path,
123  C& pathBuf,
124  const std::string& suffix) {
125  auto lastSlash = path.find_last_of('/');
126  std::string dirPath;
127  size_t fileNameLength;
128  if (lastSlash != std::string::npos) {
129  fileNameLength = path.size() - lastSlash - 1;
130  dirPath = path.substr(0,lastSlash);
131  } else {
132  fileNameLength = path.size();
133  dirPath="./";
134  }
135  if (fileNameLength + suffix.size() > getMaxNameLength(dirPath)) {
136  pathBuf.resize(path.size() - suffix.size());
137  }
138  }
139  };
140 }; // end namespace outputHandler
141 #endif
outputHandler::base::ensureParentDirs
virtual void ensureParentDirs(const std::string &path, const std::string &srcPath, inputHandler::base *InputHandler)=0
outputHandler::base::writer::writer
writer()=default
outputHandler::base::rename
virtual renameRetvalType rename(const std::string &fromPath, const std::unique_ptr< const genericStat > &readInitialStat, const std::string &toPath, copyRequest::stateType &state)=0
genericStat
generic stat abstraction class Used to abstract the variants of the stat structure.
Definition: genericStat.h:12
outputHandler::base::factoryClass::factoryClass
factoryClass(const std::string &aName)
Definition: outputHandler.h:31
outputHandler::base::newHandler
static base * newHandler(const std::string &name)
Definition: outputHandler.h:80
outputHandler::base::writer::writeBlockP
virtual void writeBlockP(const block &)
Definition: outputHandler.h:60
outputHandler::base::newWriter
virtual std::unique_ptr< writer > newWriter(const std::string &path, bool mightAppend, size_t sourceSize, size_t readBlockSize, copyRequest::stateType &state, bool noWrite, std::unique_ptr< ioHandle::attrDataType > attrData, std::unique_ptr< acl::list > aclData)=0
outputHandler::base::newTmpWriter
virtual std::unique_ptr< writer > newTmpWriter(std::string &path, size_t sourceSize, bool noWrite, std::unique_ptr< ioHandle::attrDataType > attrData, std::unique_ptr< acl::list > aclData)
Definition: outputHandler.cpp:9
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
outputHandler::base::writer::closeAndRemoveBadCopy
virtual void closeAndRemoveBadCopy()=0
outputHandler::base::renameRetvalType::cantHappen
@ cantHappen
outputHandler::base::renameRetvalType::fileChanged
@ fileChanged
outputHandler
Definition: ioHandle.h:9
copyRequest::stateType
Definition: copyRequestTypes.h:66
outputHandler::base::addAllowedNamesToOption
static void addAllowedNamesToOption(T &option)
Definition: outputHandler.h:87
outputHandler::base::writer::~writer
virtual ~writer()=default
outputHandler::base::~base
~base() override=default
outputHandler::base::renameRetvalType::fileVanished
@ fileVanished
outputHandler::base
Definition: outputHandler.h:17
outputHandler::base::renameRetvalType::ok
@ ok
outputHandler::base::writer
Definition: outputHandler.h:52
outputHandler::base::renameRetvalType
renameRetvalType
Definition: outputHandler.h:106
block
data block, used to hold the data that are being copied (or checksummed).
Definition: block.h:7
ioHandle.h
outputHandler::base::factoryClass::name
const std::string name
Definition: outputHandler.h:30
outputHandler::base::remove
virtual void remove(const std::string &path, copyRequest::stateType &state)=0
outputHandler::base::getFactoryMap
static std::map< std::string, factoryClass * > & getFactoryMap()
Definition: outputHandler.h:22
outputHandler::base::renameSimple
virtual bool renameSimple(const std::string &fromPath, const std::string &toPath)=0
outputHandler::base::base
base()=default
outputHandler::base::factoryTemplate::factoryTemplate
factoryTemplate(const std::string &aName)
Definition: outputHandler.h:41
outputHandler::base::factoryTemplate::create
base * create() const override
Definition: outputHandler.h:42
outputHandler::base::writer::seek
virtual void seek(size_t position)
Definition: outputHandler.cpp:27
pathHandler
Definition: pathHandler.h:6
inputHandler::base
class for handling input This is the (abstract) base class for handling input, both reading a file vi...
Definition: inputHandler.h:35
outputHandler::base::factoryClass
factory class to create outputHandler::base* objects
Definition: outputHandler.h:28
outputHandler::base::factoryTemplate
template for factoryClass-derived factories
Definition: outputHandler.h:39
outputHandler::base::getMaxNameLength
virtual size_t getMaxNameLength(const std::string &dirPath)
Definition: outputHandler.cpp:34
outputHandler::base::writer::doAttributePreservations
virtual void doAttributePreservations(const genericStat &readInitialStat)=0
pathHandler.h
outputHandler::base::shortenNameToMax
void shortenNameToMax(const std::string &path, C &pathBuf, const std::string &suffix)
Definition: outputHandler.h:122
outputHandler::base::writer::getSize
virtual size_t getSize() const
Definition: outputHandler.cpp:30
outputHandler::base::writer::sync
virtual void sync()=0
unwindCheck.h
outputHandler::base::factoryClass::create
virtual base * create() const =0
ioHandle
class as base for inputHandler::base::reader and outputHandler::base::writer containing the common pa...
Definition: ioHandle.h:15
outputHandler::base::writer::writeBlock
virtual void writeBlock(const block &b)=0
copyRequest
Definition: checksumTestRequestProvider.cpp:25
outputHandler::base::createSymlink
virtual void createSymlink(const std::vector< char > &, const std::string &, uid_t, gid_t)
Definition: outputHandler.h:100
outputHandler::base::doAttributePreservations
virtual void doAttributePreservations(const std::string &, const genericStat &)
Definition: outputHandler.h:117
inputHandler.h