[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