Skip to content

Commit 4796375

Browse files
committed
Calculate file size on demand
IB-8711, Fixes #682 Signed-off-by: Raul Metsma <[email protected]>
1 parent 96dc74b commit 4796375

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

src/DataFile.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,17 @@ using namespace std;
8383
DataFile::DataFile() = default;
8484
DataFile::~DataFile() = default;
8585

86+
struct DataFilePrivate::Private {
87+
optional<unsigned long> size;
88+
};
8689

8790
DataFilePrivate::DataFilePrivate(unique_ptr<istream> &&is, string filename, string mediatype, string id)
88-
: m_is(std::move(is))
91+
: d(make_unique<Private>())
92+
, m_is(std::move(is))
8993
, m_id(std::move(id))
9094
, m_filename(std::move(filename))
9195
, m_mediatype(std::move(mediatype))
9296
{
93-
m_is->seekg(0, istream::end);
94-
istream::pos_type pos = m_is->tellg();
95-
m_size = pos < 0 ? 0 : (unsigned long)pos;
9697
}
9798

9899
void DataFilePrivate::digest(const Digest &digest) const
@@ -109,6 +110,17 @@ vector<unsigned char> DataFilePrivate::calcDigest(const string &method) const
109110
return d.result();
110111
}
111112

113+
unsigned long DataFilePrivate::fileSize() const
114+
{
115+
if(d->size.has_value())
116+
return d->size.value();
117+
m_is->clear();
118+
m_is->seekg(0, istream::end);
119+
istream::pos_type pos = m_is->tellg();
120+
d->size.emplace(pos < 0 ? 0 : (unsigned long)pos);
121+
return d->size.value();
122+
}
123+
112124
void DataFilePrivate::saveAs(const string& path) const
113125
{
114126
ofstream ofs(File::encodeName(path), ofstream::binary);

src/DataFile_p.h

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include <istream>
2525
#include <memory>
26+
#include <optional>
2627

2728
namespace digidoc
2829
{
@@ -31,20 +32,22 @@ class Digest;
3132
class DataFilePrivate final: public DataFile
3233
{
3334
public:
34-
DataFilePrivate(std::unique_ptr<std::istream> &&is, std::string filename, std::string mediatype, std::string id = {});
35+
DataFilePrivate(std::unique_ptr<std::istream> &&is, std::string filename, std::string mediatype, std::string id = {});
3536

36-
std::string id() const final { return m_id.empty() ? m_filename : m_id; }
37-
std::string fileName() const final { return m_filename; }
38-
unsigned long fileSize() const final { return m_size; }
39-
std::string mediaType() const final { return m_mediatype; }
37+
std::string id() const final { return m_id.empty() ? m_filename : m_id; }
38+
std::string fileName() const final { return m_filename; }
39+
unsigned long fileSize() const final;
40+
std::string mediaType() const final { return m_mediatype; }
4041

41-
void digest(const Digest &method) const;
42-
std::vector<unsigned char> calcDigest(const std::string &method) const final;
43-
void saveAs(std::ostream &os) const final;
44-
void saveAs(const std::string& path) const final;
42+
void digest(const Digest &method) const;
43+
std::vector<unsigned char> calcDigest(const std::string &method) const final;
44+
void saveAs(std::ostream &os) const final;
45+
void saveAs(const std::string& path) const final;
4546

46-
std::unique_ptr<std::istream> m_is;
47-
std::string m_id, m_filename, m_mediatype;
48-
unsigned long m_size;
47+
std::unique_ptr<std::istream> m_is;
48+
std::string m_id, m_filename, m_mediatype;
49+
50+
struct Private;
51+
std::unique_ptr<Private> d;
4952
};
5053
}

0 commit comments

Comments
 (0)