From ef7df8048d1067d3148287f27af9047743f1e2ae Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周日, 15 3月 2020 16:26:21 +0800
Subject: [PATCH] Merge branch 'feature/pc_identifiers' into develop issues #2 #3 #14 #49

---
 src/library/hw_identifier/ethernet.cpp |   78 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 78 insertions(+), 0 deletions(-)

diff --git a/src/library/hw_identifier/ethernet.cpp b/src/library/hw_identifier/ethernet.cpp
new file mode 100644
index 0000000..bd21bc9
--- /dev/null
+++ b/src/library/hw_identifier/ethernet.cpp
@@ -0,0 +1,78 @@
+/*
+ * ethernet.cpp
+ *
+ *  Created on: Jan 11, 2020
+ *      Author: GC
+ */
+
+#include <array>
+#include <vector>
+
+#include <licensecc/datatypes.h>
+#include <licensecc_properties.h>
+#include "../base/base.h"
+#include "../os/network.hpp"
+#include "hw_identifier.hpp"
+#include "ethernet.hpp"
+
+namespace license {
+namespace hw_identifier {
+using namespace std;
+
+static FUNCTION_RETURN generate_ethernet_pc_id(vector<array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA>> &data,
+											   const bool use_ip) {
+	vector<os::OsAdapterInfo> adapters;
+
+	FUNCTION_RETURN result_adapterInfos = getAdapterInfos(adapters);
+	if (result_adapterInfos != FUNC_RET_OK) {
+		return result_adapterInfos;
+	}
+	if (adapters.size() == 0) {
+		return FUNC_RET_NOT_AVAIL;
+	}
+
+	for (auto &it : adapters) {
+		unsigned int k, data_len;
+		array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA> identifier;
+		data_len = use_ip ? sizeof(os::OsAdapterInfo::ipv4_address) : sizeof(os::OsAdapterInfo::mac_address);
+
+		for (k = 0; k < HW_IDENTIFIER_PROPRIETARY_DATA; k++) {
+			if (k < data_len) {
+				identifier[k] = use_ip ? it.ipv4_address[k] : it.mac_address[k];
+			} else {
+				identifier[k] = 42;
+			}
+		}
+		identifier[0] = identifier[0] & 0x1F;
+		data.push_back(identifier);
+	}
+
+	return result_adapterInfos;
+}
+
+Ethernet::Ethernet(bool useIp) : use_ip(useIp) {}
+
+Ethernet::~Ethernet() {}
+
+LCC_API_IDENTIFICATION_STRATEGY Ethernet::identification_strategy() const {
+	return use_ip ? STRATEGY_IP_ADDRESS : STRATEGY_ETHERNET;
+}
+
+std::vector<HwIdentifier> Ethernet::alternative_ids() const {
+	vector<array<uint8_t, HW_IDENTIFIER_PROPRIETARY_DATA>> data;
+	FUNCTION_RETURN result = generate_ethernet_pc_id(data, use_ip);
+	vector<HwIdentifier> identifiers;
+	if (result == FUNC_RET_OK) {
+		identifiers.reserve(data.size());
+		for (auto &it : data) {
+			HwIdentifier pc_id;
+			pc_id.set_identification_strategy(identification_strategy());
+			pc_id.set_data(it);
+			identifiers.push_back(pc_id);
+		}
+	}
+	return identifiers;
+}
+
+}  // namespace hw_identifier
+} /* namespace license */

--
Gitblit v1.9.1