From 2faa8f6782a2e6294ed8849048a281d12d60da1c Mon Sep 17 00:00:00 2001
From: Szczepan Zalega <szczepan@nitrokey.com>
Date: Mon, 4 Dec 2017 16:29:56 +0100
Subject: Initial support for multiple devices with C++ and test

Signed-off-by: Szczepan Zalega <szczepan@nitrokey.com>
---
 include/NitrokeyManager.h |  7 ++++++-
 include/device.h          | 10 ++++++++--
 2 files changed, 14 insertions(+), 3 deletions(-)

(limited to 'include')

diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h
index 0db0856..2a79922 100644
--- a/include/NitrokeyManager.h
+++ b/include/NitrokeyManager.h
@@ -30,6 +30,7 @@
 #include "stick20_commands.h"
 #include <vector>
 #include <memory>
+#include <unordered_map>
 
 namespace nitrokey {
     using namespace nitrokey::device;
@@ -67,6 +68,8 @@ char * strndup(const char* str, size_t maxlen);
         bool get_time(uint64_t time = 0);
         bool erase_totp_slot(uint8_t slot_number, const char *temporary_password);
         bool erase_hotp_slot(uint8_t slot_number, const char *temporary_password);
+        std::vector<std::string> list_devices();
+        bool connect_with_path (std::string path);
         bool connect(const char *device_model);
         bool connect();
         bool disconnect();
@@ -198,8 +201,10 @@ char * strndup(const char* str, size_t maxlen);
 
         static shared_ptr <NitrokeyManager> _instance;
         std::shared_ptr<Device> device;
+        std::unordered_map<std::string, shared_ptr<Device> > connected_devices;
 
-      stick10::ReadSlot::ResponsePayload get_OTP_slot_data(const uint8_t slot_number);
+
+        stick10::ReadSlot::ResponsePayload get_OTP_slot_data(const uint8_t slot_number);
       bool is_valid_hotp_slot_number(uint8_t slot_number) const;
         bool is_valid_totp_slot_number(uint8_t slot_number) const;
         bool is_valid_password_safe_slot_number(uint8_t slot_number) const;
diff --git a/include/device.h b/include/device.h
index 1bd4773..f6d2380 100644
--- a/include/device.h
+++ b/include/device.h
@@ -25,6 +25,7 @@
 #include "hidapi/hidapi.h"
 #include <cstdint>
 #include <string>
+#include <vector>
 
 #define HID_REPORT_SIZE 65
 
@@ -105,8 +106,10 @@ public:
    * @return true if visible by OS
    */
   bool could_be_enumerated();
+  std::vector<std::string> enumerate();
 
-  void show_stats();
+
+        void show_stats();
 //  ErrorCounters get_stats(){ return m_counters; }
   int get_retry_receiving_count() const { return m_retry_receiving_count; };
   int get_retry_sending_count() const { return m_retry_sending_count; };
@@ -121,8 +124,10 @@ public:
   void set_retry_delay(std::chrono::milliseconds delay);
   static void set_default_device_speed(int delay);
   void setDefaultDelay();
+  void set_path(const std::string path);
+
 
-private:
+        private:
   std::atomic<uint8_t> last_command_status;
   void _reconnect();
   bool _connect();
@@ -143,6 +148,7 @@ protected:
   std::chrono::milliseconds m_retry_timeout;
   std::chrono::milliseconds m_send_receive_delay;
   std::atomic<hid_device *>mp_devhandle;
+  std::string m_path;
 
   static std::atomic_int instances_count;
   static std::chrono::milliseconds default_delay ;
-- 
cgit v1.2.3