ewmscp  ..
genericStat.cpp
Go to the documentation of this file.
1 #include "genericStat.h"
2 #include <algorithm>
3 #include <chrono>
4 #include <sys/stat.h>
5 #include <sys/types.h>
6 #include <iostream>
7 #include <sstream>
8 #include <iomanip>
9 
10 genericStat::genericStat(const struct stat& statBuf, const clock_type::duration& aTimeResolution):
11  device(statBuf.st_dev),
12  size(statBuf.st_size),
13  sizeOnDisk(statBuf.st_blocks * 512),
14  blksize(statBuf.st_blksize),
15  aTime(std::chrono::seconds(statBuf.st_atim.tv_sec)
16  + std::chrono::nanoseconds(statBuf.st_atim.tv_nsec)),
17  mTime(std::chrono::seconds(statBuf.st_mtim.tv_sec)
18  + std::chrono::nanoseconds(statBuf.st_mtim.tv_nsec)),
19  timeResolution(aTimeResolution),
20  mode(statBuf.st_mode),
21  ownerUid(statBuf.st_uid),
22  ownerGid(statBuf.st_gid) {
23 }
24 genericStat::genericStat(const struct stat64& statBuf, const clock_type::duration& aTimeResolution):
25  device(statBuf.st_dev),
26  size(statBuf.st_size),
27  sizeOnDisk(statBuf.st_blocks * 512),
28  blksize(statBuf.st_blksize),
29  aTime(std::chrono::seconds(statBuf.st_atim.tv_sec)
30  + std::chrono::nanoseconds(statBuf.st_atim.tv_nsec)),
31  mTime(std::chrono::seconds(statBuf.st_mtim.tv_sec)
32  + std::chrono::nanoseconds(statBuf.st_mtim.tv_nsec)),
33  timeResolution(aTimeResolution),
34  mode(statBuf.st_mode),
35  ownerUid(statBuf.st_uid),
36  ownerGid(statBuf.st_gid) {
37 }
38 genericStat::genericStat() = default;
39 void genericStat::chronoToTimespec(struct timespec& spec, const clock_type::time_point& Chrono) {
40  spec.tv_sec = std::chrono::duration_cast<std::chrono::seconds>(Chrono.time_since_epoch()).count();
41  spec.tv_nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(Chrono.time_since_epoch()).count() % 1000000000;
42 }
43 void genericStat::chronoToTimeval(struct timeval& spec, const clock_type::time_point& Chrono) {
44  spec.tv_sec = std::chrono::duration_cast<std::chrono::seconds>(Chrono.time_since_epoch()).count();
45  spec.tv_usec = std::chrono::duration_cast<std::chrono::microseconds>(Chrono.time_since_epoch()).count() % 1000000;
46 }
47 void genericStat::chronoToString(std::string& spec, const clock_type::time_point& Chrono) {
48  struct tm time;
49  time_t t = std::chrono::duration_cast<std::chrono::seconds>(Chrono.time_since_epoch()).count();
50  gmtime_r(&t, &time);
51  char buffer[123];
52  strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S.", &time);
53  spec = buffer;
54  std::ostringstream buf2;
55  buf2 << std::setw(6) << std::setfill('0')
56  << std::chrono::duration_cast<std::chrono::microseconds>(Chrono.time_since_epoch()).count() % 1000000;
57  // std::sprintf(buffer, "%06ld", std::chrono::duration_cast<std::chrono::microseconds>(Chrono.time_since_epoch()).count() % 1000000);
58  spec += buf2.str();
59 }
60 
61 
62 void genericStat::getAtime(struct timespec& spec) const {
63  chronoToTimespec(spec, aTime);
64 }
65 void genericStat::getMtime(struct timespec& spec) const {
66  chronoToTimespec(spec, mTime);
67 }
68 void genericStat::getAtime(struct timeval& spec) const {
69  chronoToTimeval(spec, aTime);
70 }
71 void genericStat::getMtime(struct timeval& spec) const {
72  chronoToTimeval(spec, mTime);
73 }
74 void genericStat::getAtime(std::string& spec) const {
75  chronoToString(spec, aTime);
76 }
77 void genericStat::getMtime(std::string& spec) const {
78  chronoToString(spec, mTime);
79 }
80 genericStat::clock_type::time_point genericStat::getMtime() const {
81  return mTime;
82 }
83 
84 bool genericStat::isNewerThan(const genericStat& that) const {
85  return that.mTime - mTime < std::max(timeResolution, that.timeResolution);
86 }
87 bool genericStat::isSameMtimeAs(const genericStat& that) const {
88  return (that.mTime - mTime < std::max(timeResolution, that.timeResolution)) &&
89  (mTime - that.mTime < std::max(timeResolution, that.timeResolution));
90 }
91 
92 bool genericStat::isDir() const {
93  return S_ISDIR(mode);
94 };
95 bool genericStat::isLink() const {
96  return S_ISLNK(mode);
97 };
99  return S_ISREG(mode);
100 };
101 
102 std::ostream& operator<<(std::ostream& stream, const genericStat& aStat) {
103  stream << "stat:{\"device\":" << aStat.device;
104  stream << ", \"size\":" << aStat.size;
105  stream << ", \"sizeOnDisk\":" << aStat.sizeOnDisk;
106  stream << ", \"blksize\":" << aStat.blksize;
107  //stream << ", \"aTime\":" << aStat.aTime;
108  //stream << ", \"mTime\":" << aStat.mTime;
109  stream << ", \"mode\":" << aStat.mode;
110  stream << ", \"owner\":" << aStat.ownerUid;
111  stream << ", \"group\":" << aStat.ownerGid;
112  return stream;
113 }
genericStat::ownerGid
gid_t ownerGid
Definition: genericStat.h:24
genericStat::mode
mode_t mode
Definition: genericStat.h:22
genericStat.h
genericStat::getAtime
void getAtime(struct timespec &spec) const
Definition: genericStat.cpp:62
genericStat
generic stat abstraction class Used to abstract the variants of the stat structure.
Definition: genericStat.h:12
genericStat::isLink
bool isLink() const
Definition: genericStat.cpp:95
genericStat::mTime
clock_type::time_point mTime
Definition: genericStat.h:20
genericStat::isRegularFile
bool isRegularFile() const
Definition: genericStat.cpp:98
genericStat::sizeOnDisk
size_t sizeOnDisk
Definition: genericStat.h:17
genericStat::isSameMtimeAs
bool isSameMtimeAs(const genericStat &that) const
Definition: genericStat.cpp:87
genericStat::aTime
clock_type::time_point aTime
Definition: genericStat.h:19
genericStat::isDir
bool isDir() const
Definition: genericStat.cpp:92
genericStat::blksize
size_t blksize
Definition: genericStat.h:18
genericStat::size
size_t size
Definition: genericStat.h:16
genericStat::chronoToTimeval
static void chronoToTimeval(struct timeval &spec, const clock_type::time_point &Chrono)
Definition: genericStat.cpp:43
genericStat::device
dev_t device
Definition: genericStat.h:15
genericStat::genericStat
genericStat()
genericStat::getMtime
clock_type::time_point getMtime() const
Definition: genericStat.cpp:80
operator<<
std::ostream & operator<<(std::ostream &stream, const genericStat &aStat)
Definition: genericStat.cpp:102
genericStat::timeResolution
clock_type::duration timeResolution
Definition: genericStat.h:21
genericStat::isNewerThan
bool isNewerThan(const genericStat &that) const
Definition: genericStat.cpp:84
genericStat::ownerUid
uid_t ownerUid
Definition: genericStat.h:23
genericStat::chronoToString
static void chronoToString(std::string &str, const clock_type::time_point &Chrono)
Definition: genericStat.cpp:47
genericStat::chronoToTimespec
static void chronoToTimespec(struct timespec &spec, const clock_type::time_point &Chrono)
Definition: genericStat.cpp:39