[Pkg-running-devel] [antpm] 25/31: antpm: add device database discovery functionality
Kristof Ralovich
ralovich-guest at moszumanska.debian.org
Fri Mar 24 23:19:38 UTC 2017
This is an automated email from the git hooks/post-receive script.
ralovich-guest pushed a commit to branch master
in repository antpm.
commit 9d058f8641a8d5ecb114491d0173c39dc9eef5b0
Author: RALOVICH, Kristof <tade60 at freemail.hu>
Date: Fri Mar 24 12:54:09 2017 +0100
antpm: add device database discovery functionality
---
src/DeviceSettings.cpp | 98 +++++++++++++++++++++++++++++++++++++++-
src/DeviceSettings.hpp | 17 +++++++
src/tests/testDeviceSettings.cpp | 22 ++++++++-
3 files changed, 135 insertions(+), 2 deletions(-)
diff --git a/src/DeviceSettings.cpp b/src/DeviceSettings.cpp
index eb69152..7d60f36 100644
--- a/src/DeviceSettings.cpp
+++ b/src/DeviceSettings.cpp
@@ -26,6 +26,11 @@
#include <boost/date_time/posix_time/posix_time.hpp>
#include "Log.hpp"
+#include <boost/filesystem.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+
+namespace fs=boost::filesystem;
namespace antpm {
@@ -62,7 +67,62 @@ DeviceSettings::getFolder() const
return getConfigFolder() + "/" + mDevId + "/";
}
-/// Both inpout and output are represented in GMT/UTC.
+// std::vector<DatabaseEntity>
+// DeviceSettings::getDatabaseFiles(size_t count) const
+// {
+// std::vector<DatabaseEntity> files;
+// std::string root = getFolder();
+// // for all folders
+// // for all fit files
+// //
+// return files;
+// }
+
+Database
+DeviceSettings::getDatabaseFiles(size_t count) const
+{
+ Database files;
+ std::string root = getFolder();
+ // for all folders
+ // for all fit files
+ //
+
+ fs::path p(root);
+
+ if(!fs::is_directory(p))
+ {
+ return files;
+ }
+ //std::cout << p << " is a directory containing:\n";
+
+ for(auto& entry : boost::make_iterator_range(fs::directory_iterator(p), {}))
+ {
+ if(!fs::is_directory(entry))
+ {
+ continue;
+ }
+ //std::cout << entry << "\n";
+ for(auto& fit : boost::make_iterator_range(fs::directory_iterator(entry), {}))
+ {
+ if(boost::algorithm::ends_with(fit.path().string(), ".fit"))
+ {
+ int value=0;
+ sscanf(fit.path().stem().c_str(), "%x", &value);
+ //std::cout << "\t" << fit.path().stem() << std::endl;
+ if(value == 0) // skip directory file
+ {
+ continue;
+ }
+ files.insert(DatabaseEntity(static_cast<ushort>(value),
+ FITEntity(fit.path().string(), fs::file_size(fit.path()))));
+ }
+ }
+ }
+
+ return files;
+}
+
+/// Both input and output are represented in GMT/UTC.
std::time_t
DeviceSettings::str2time(const char* from)
{
@@ -115,6 +175,42 @@ DeviceSettings::time2str(const std::time_t t)
return outstr;
}
+
+bool is_number(const std::string& s)
+{
+ return !s.empty() && std::find_if(s.begin(),
+ s.end(), [](char c) { return !std::isdigit(c); }) == s.end();
+}
+
+
+std::vector<std::string>
+DeviceSettings::getDatabases(const char* root)
+{
+ std::string root_folder = root ? root : getConfigFolder();
+ std::vector<std::string> devices;
+
+ fs::path p(root_folder);
+
+ if(!fs::is_directory(p))
+ {
+ return devices;
+ }
+
+ for(auto& entry : boost::make_iterator_range(fs::directory_iterator(p), {}))
+ {
+ entry.path();
+
+ if(!fs::is_directory(entry) || !is_number(entry.path().stem().string()))
+ {
+ continue;
+ }
+ //std::cout << entry.path().stem() << "\n";
+ devices.push_back(entry.path().stem().string());
+ }
+
+ return devices;
+}
+
bool
DeviceSettings::saveToFile(const char *fname)
{
diff --git a/src/DeviceSettings.hpp b/src/DeviceSettings.hpp
index 22b0a90..d3e6cc8 100644
--- a/src/DeviceSettings.hpp
+++ b/src/DeviceSettings.hpp
@@ -19,9 +19,23 @@
#include <ctime>
#include <string>
+#include <vector>
+#include <map>
namespace antpm {
+// struct DatabaseEntity
+// {
+// std::string path;
+// ushort fileIdx;
+// size_t bytes;
+// };
+
+// <fileIdx, <path, bytes> >
+typedef std::pair<std::string, size_t> FITEntity;
+typedef std::multimap<ushort, FITEntity> Database;
+typedef std::pair<ushort, FITEntity> DatabaseEntity;
+
class DeviceSettings
{
public:
@@ -30,6 +44,8 @@ public:
void loadDefaultValues();
const std::string getConfigFileName() const;
const std::string getFolder() const;
+ //std::vector<DatabaseEntity> getDatabaseFiles(size_t count) const;
+ Database getDatabaseFiles(size_t count = 0) const;
bool saveToFile(const char* fname);
bool saveToFile(const std::string& fname) { return saveToFile(fname.c_str()); }
bool loadFromFile(const char* fname);
@@ -39,6 +55,7 @@ public:
static std::time_t str2time(const char* from);
static const std::string time2str(const std::time_t t);
+ static std::vector<std::string> getDatabases(const char* root = nullptr);
unsigned int MaxFileDownloads;
std::time_t LastUserProfileTime; // date of the latest activity successfully downloaded fromt the device, represented as GMT/UTC
diff --git a/src/tests/testDeviceSettings.cpp b/src/tests/testDeviceSettings.cpp
index ae79cbb..8920421 100644
--- a/src/tests/testDeviceSettings.cpp
+++ b/src/tests/testDeviceSettings.cpp
@@ -141,9 +141,29 @@ BOOST_AUTO_TEST_CASE(load_save)
BOOST_CHECK(m_ds->LastUserProfileTime == 946684800);
BOOST_CHECK(m_ds->LastTransferredTime == 946684800);
BOOST_CHECK(m_ds->SerialWriteDelayMs == 3);
+}
-}
+BOOST_AUTO_TEST_CASE(load_db)
+{
+ // uint clientSN = 1279010136;
+ // const char* fname = TEST_ROOT"/config.ini";
+ // std::cout << fname << "\n";
+ // const char* fname_tmp = TEST_ROOT"/config_tmp.ini";
+
+ std::vector<std::string> devices = DeviceSettings::getDatabases();
+ for(size_t i = 0; i < devices.size(); i++)
+ {
+ boost::scoped_ptr<DeviceSettings> ds;
+ //ds.reset(new DeviceSettings(toStringDec<uint>(clientSN).c_str()));
+ ds.reset(new DeviceSettings(devices[i].c_str()));
+ assert(ds.get());
+ BOOST_CHECK(ds);
+ Database db = ds->getDatabaseFiles();
+ std::cout << "Device: \"" << devices[i] << "\" DB contains " << db.size() << " FIT files.\n";
+ }
+
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-running/antpm.git
More information about the Pkg-running-devel
mailing list