From fbb418d58e87c59d9948d8058c3447365b4f27cb Mon Sep 17 00:00:00 2001 From: Lukasz Wojciechowski Date: Mon, 21 Jul 2014 16:38:26 +0200 Subject: [PATCH] Fix problem with passing references to local objects References are changed to shared pointers. Change-Id: I8bdd52e1ba04ce6625cf42810c68d19cdf006ecd --- src/service/storage/BucketDeserializer.cpp | 4 ++-- src/service/storage/BucketDeserializer.h | 9 ++++++--- src/service/storage/InMemoryStorageBackend.cpp | 22 ++++++++++++---------- src/service/storage/InMemoryStorageBackend.h | 4 ++-- src/service/storage/StorageDeserializer.cpp | 10 ++++++---- src/service/storage/StorageDeserializer.h | 7 ++++--- src/service/storage/StorageSerializer.cpp | 16 +++++++++------- src/service/storage/StorageSerializer.h | 15 +++++---------- 8 files changed, 46 insertions(+), 41 deletions(-) diff --git a/src/service/storage/BucketDeserializer.cpp b/src/service/storage/BucketDeserializer.cpp index 1bfac50..7ba7d4b 100644 --- a/src/service/storage/BucketDeserializer.cpp +++ b/src/service/storage/BucketDeserializer.cpp @@ -41,9 +41,9 @@ PolicyCollection BucketDeserializer::loadPolicies(void) { PolicyCollection policies; // TODO: Get someone smart to do error checking on stream - for (std::size_t lineNum = 1; !m_inStream.eof(); ++lineNum) { + for (std::size_t lineNum = 1; !m_inStream->eof(); ++lineNum) { std::string line; - std::getline(m_inStream, line, StorageSerializer::recordSeparator()); + std::getline(*m_inStream, line, StorageSerializer::recordSeparator()); if (line.empty()) break; diff --git a/src/service/storage/BucketDeserializer.h b/src/service/storage/BucketDeserializer.h index 393991e..ad54100 100644 --- a/src/service/storage/BucketDeserializer.h +++ b/src/service/storage/BucketDeserializer.h @@ -22,7 +22,8 @@ #ifndef SRC_SERVICE_STORAGE_BUCKETDESERIALIZER_H_ #define SRC_SERVICE_STORAGE_BUCKETDESERIALIZER_H_ -#include +#include +#include #include #include @@ -33,14 +34,16 @@ namespace Cynara { class BucketDeserializer { public: - BucketDeserializer(std::istream &inStream) : m_inStream(inStream) {} + BucketDeserializer(std::shared_ptr inStream) : m_inStream(inStream) { + } + PolicyCollection loadPolicies(void); protected: static PolicyKey parseKey(const std::string &line, std::size_t &beginToken); private: - std::istream &m_inStream; + std::shared_ptr m_inStream; }; } /* namespace Cynara */ diff --git a/src/service/storage/InMemoryStorageBackend.cpp b/src/service/storage/InMemoryStorageBackend.cpp index 5d18219..d04a6ff 100644 --- a/src/service/storage/InMemoryStorageBackend.cpp +++ b/src/service/storage/InMemoryStorageBackend.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -50,7 +51,7 @@ void InMemoryStorageBackend::load(void) { std::string indexFilename = m_dbPath + m_indexFileName; try { - std::ifstream indexStream; + std::shared_ptr indexStream = std::make_shared(); openFileStream(indexStream, indexFilename); StorageDeserializer storageDeserializer(indexStream, @@ -81,7 +82,7 @@ void InMemoryStorageBackend::save(void) { } } - std::ofstream indexStream; + std::shared_ptr indexStream = std::make_shared(); openDumpFileStream(indexStream, m_dbPath + m_indexFileName); StorageSerializer storageSerializer(indexStream); @@ -176,20 +177,21 @@ void InMemoryStorageBackend::deleteLinking(const PolicyBucketId &bucketId) { } } -void InMemoryStorageBackend::openFileStream(std::ifstream &stream, const std::string &filename) { +void InMemoryStorageBackend::openFileStream(std::shared_ptr stream, + const std::string &filename) { // TODO: Consider adding exceptions to streams and handling them: // stream.exceptions(std::ifstream::failbit | std::ifstream::badbit); - stream.open(filename); + stream->open(filename); - if (!stream.is_open()) + if (!stream->is_open()) throw FileNotFoundException(filename); } -void InMemoryStorageBackend::openDumpFileStream(std::ofstream &stream, +void InMemoryStorageBackend::openDumpFileStream(std::shared_ptr stream, const std::string &filename) { - stream.open(filename, std::ofstream::out | std::ofstream::trunc); + stream->open(filename, std::ofstream::out | std::ofstream::trunc); - if (!stream.is_open()) { + if (!stream->is_open()) { throw CannotCreateFileException(filename); return; } @@ -198,7 +200,7 @@ void InMemoryStorageBackend::openDumpFileStream(std::ofstream &stream, std::shared_ptr InMemoryStorageBackend::bucketStreamOpener( const PolicyBucketId &bucketId) { std::string bucketFilename = m_dbPath + "_" + bucketId; - std::ifstream bucketStream; + std::shared_ptr bucketStream = std::make_shared(); try { openFileStream(bucketStream, bucketFilename); return std::make_shared(bucketStream); @@ -210,7 +212,7 @@ std::shared_ptr InMemoryStorageBackend::bucketStreamOpener( std::shared_ptr InMemoryStorageBackend::bucketDumpStreamOpener( const PolicyBucketId &bucketId) { std::string bucketFilename = m_dbPath + "_" + bucketId; - std::ofstream bucketStream; + std::shared_ptr bucketStream = std::make_shared(); openDumpFileStream(bucketStream, bucketFilename); return std::make_shared(bucketStream); diff --git a/src/service/storage/InMemoryStorageBackend.h b/src/service/storage/InMemoryStorageBackend.h index 5127bc6..be2ba54 100644 --- a/src/service/storage/InMemoryStorageBackend.h +++ b/src/service/storage/InMemoryStorageBackend.h @@ -60,10 +60,10 @@ public: virtual void deleteLinking(const PolicyBucketId &bucketId); protected: - void openFileStream(std::ifstream &stream, const std::string &filename); + void openFileStream(std::shared_ptr stream, const std::string &filename); std::shared_ptr bucketStreamOpener(const PolicyBucketId &bucketId); - void openDumpFileStream(std::ofstream &stream, const std::string &filename); + void openDumpFileStream(std::shared_ptr stream, const std::string &filename); std::shared_ptr bucketDumpStreamOpener(const PolicyBucketId &bucketId); private: diff --git a/src/service/storage/StorageDeserializer.cpp b/src/service/storage/StorageDeserializer.cpp index 66c8ff0..9b34e5f 100644 --- a/src/service/storage/StorageDeserializer.cpp +++ b/src/service/storage/StorageDeserializer.cpp @@ -21,6 +21,7 @@ */ #include +#include #include #include @@ -35,16 +36,17 @@ namespace Cynara { -StorageDeserializer::StorageDeserializer(std::istream &inStream, +StorageDeserializer::StorageDeserializer(std::shared_ptr inStream, BucketStreamOpener bucketStreamOpener) - : m_inStream(inStream), m_bucketStreamOpener(bucketStreamOpener) {} + : m_inStream(inStream), m_bucketStreamOpener(bucketStreamOpener) { +} void StorageDeserializer::initBuckets(Buckets &buckets) { buckets.clear(); - for (std::size_t lineNum = 1; !m_inStream.eof(); ++lineNum) { + for (std::size_t lineNum = 1; !m_inStream->eof(); ++lineNum) { std::string line; - std::getline(m_inStream, line, StorageSerializer::recordSeparator()); + std::getline(*m_inStream, line, StorageSerializer::recordSeparator()); if (line.empty()) break; diff --git a/src/service/storage/StorageDeserializer.h b/src/service/storage/StorageDeserializer.h index c3680c4..d186ff7 100644 --- a/src/service/storage/StorageDeserializer.h +++ b/src/service/storage/StorageDeserializer.h @@ -23,7 +23,7 @@ #define SRC_SERVICE_STORAGE_STORAGEDESERIALIZER_H_ #include -#include +#include #include #include @@ -40,7 +40,8 @@ class StorageDeserializer { public: typedef std::function(const std::string &)> BucketStreamOpener; - StorageDeserializer(std::istream &inStream, BucketStreamOpener m_bucketStreamOpener); + StorageDeserializer(std::shared_ptr inStream, + BucketStreamOpener m_bucketStreamOpener); void initBuckets(Buckets &buckets); void loadBuckets(Buckets &buckets); @@ -50,7 +51,7 @@ public: std::size_t &beginToken); private: - std::istream &m_inStream; + std::shared_ptr m_inStream; BucketStreamOpener m_bucketStreamOpener; }; diff --git a/src/service/storage/StorageSerializer.cpp b/src/service/storage/StorageSerializer.cpp index f46d48e..2572a3b 100644 --- a/src/service/storage/StorageSerializer.cpp +++ b/src/service/storage/StorageSerializer.cpp @@ -20,8 +20,9 @@ * @brief Implementation of Cynara::StorageSerializer methods */ +#include +#include #include -#include #include #include @@ -37,7 +38,8 @@ namespace Cynara { char StorageSerializer::m_fieldSeparator = ';'; char StorageSerializer::m_recordSeparator = '\n'; -StorageSerializer::StorageSerializer(std::ostream &os) : m_outStream(os) {} +StorageSerializer::StorageSerializer(std::shared_ptr os) : m_outStream(os) { +} void StorageSerializer::dump(const Buckets &buckets, BucketStreamOpener streamOpener) { @@ -72,17 +74,17 @@ void StorageSerializer::dump(const PolicyBucket& bucket) { } void StorageSerializer::dump(const PolicyKey &key) { - outStream() << key.toString(); + *m_outStream << key.toString(); } void StorageSerializer::dump(const PolicyType &policyType) { - auto oldFormat = m_outStream.flags(); - outStream() << "0x" << std::uppercase << std::hex << policyType; - m_outStream.flags(oldFormat); + auto oldFormat = m_outStream->flags(); + *m_outStream << "0x" << std::uppercase << std::hex << policyType; + m_outStream->flags(oldFormat); } void StorageSerializer::dump(const PolicyResult::PolicyMetadata &metadata) { - outStream() << metadata; + *m_outStream << metadata; } void StorageSerializer::dump(const PolicyCollection::value_type &policy) { diff --git a/src/service/storage/StorageSerializer.h b/src/service/storage/StorageSerializer.h index 80966e9..f4397ba 100644 --- a/src/service/storage/StorageSerializer.h +++ b/src/service/storage/StorageSerializer.h @@ -24,8 +24,8 @@ #define SRC_SERVICE_STORAGE_STORAGESERIALIZER_H_ #include +#include #include -#include #include #include @@ -44,7 +44,7 @@ public: typedef std::function(const PolicyBucketId &)> BucketStreamOpener; - StorageSerializer(std::ostream &os); + StorageSerializer(std::shared_ptr os); virtual ~StorageSerializer() = default; virtual void dump(const Buckets &buckets, @@ -56,13 +56,13 @@ protected: inline void dumpFields(const Arg1 &arg1, const Args&... args) { dump(arg1); if (sizeof...(Args) > 0) { - outStream() << fieldSeparator(); + *m_outStream << fieldSeparator(); } dumpFields(args...); } inline void dumpFields(void) { - outStream() << recordSeparator(); + *m_outStream << recordSeparator(); } void dump(const PolicyKey &key); @@ -70,13 +70,8 @@ protected: void dump(const PolicyResult::PolicyMetadata &metadata); void dump(const PolicyCollection::value_type &policy); -protected: - std::ostream &outStream(void) { - return m_outStream; - } - private: - std::ostream &m_outStream; + std::shared_ptr m_outStream; static char m_fieldSeparator; static char m_recordSeparator; -- 2.7.4