From 8e1bdfdca2ad2157fd74cedc1a6768a1b1c0849d Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周日, 09 2月 2020 04:48:55 +0800
Subject: [PATCH] identifiers next work

---
 src/library/pc_identifier/pc_identifier.cpp |   54 +++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/src/library/pc_identifier/pc_identifier.cpp b/src/library/pc_identifier/pc_identifier.cpp
index e4e5860..9bf9ea0 100644
--- a/src/library/pc_identifier/pc_identifier.cpp
+++ b/src/library/pc_identifier/pc_identifier.cpp
@@ -10,12 +10,21 @@
 #include "../base/base64.h"
 
 namespace license {
+namespace pc_identifier {
+
 using namespace std;
 
 PcIdentifier::PcIdentifier() {}
 
 PcIdentifier::PcIdentifier(const std::string& param) {
-	// TODO Auto-generated constructor stub
+	string tmp_str(param);  // throw away const
+	std::replace(tmp_str.begin(), tmp_str.end(), '-', '\n');
+	vector<uint8_t> decoded = unbase64(tmp_str);
+	if (decoded.size() != PC_IDENTIFIER_PROPRIETARY_DATA + 1) {
+		cerr << decoded.size();
+		throw logic_error("wrong identifier size " + param);
+	}
+	std::copy_n(decoded.begin(), PC_IDENTIFIER_PROPRIETARY_DATA + 1, m_data.begin());
 }
 
 PcIdentifier::~PcIdentifier() {}
@@ -43,20 +52,39 @@
 	m_data[0] = (m_data[0] && ~0x30) | virt << 4;
 }
 
-void PcIdentifier::set_virtualization(VIRTUALIZATION_DETAIL virtualization_detail) {}
-
-void PcIdentifier::set_cloud_provider(CLOUD_PROVIDER cloud_provider) {}
-
-void PcIdentifier::set_data(const std::array<uint8_t, 6>& data) {}
-
-std::string PcIdentifier::print() const {
-	string result = base64(m_data.data(), m_data.size(), 4);
-	std::replace(result.begin(), result.end(), '\n', '-');
-	return result;
+void PcIdentifier::set_virtualization(VIRTUALIZATION_DETAIL virtualization_detail) {  // TODO
 }
 
-LCC_API_IDENTIFICATION_STRATEGY PcIdentifier::get_identification_strategy() const {}
+void PcIdentifier::set_cloud_provider(CLOUD_PROVIDER cloud_provider) {
+	// TODO
+}
 
-bool PcIdentifier::data_match(const std::array<uint8_t, 6>& data) const {}
+void PcIdentifier::set_data(const std::array<uint8_t, PC_IDENTIFIER_PROPRIETARY_DATA>& data) {
+	m_data[1] = (m_data[1] & (~0x1f)) | (data[0] & 0x1f);
+	for (int i = 1; i < PC_IDENTIFIER_PROPRIETARY_DATA; i++) {
+		m_data[i + 1] = data[i];
+	}
+}
+
+std::string PcIdentifier::print() const {
+	string result = base64(m_data.data(), m_data.size(), 5);
+	std::replace(result.begin(), result.end(), '\n', '-');
+	return result.substr(0, result.size() - 1);
+}
+
+LCC_API_IDENTIFICATION_STRATEGY PcIdentifier::get_identification_strategy() const {
+	uint8_t stratMov = m_data[1] >> 5;
+	return static_cast<LCC_API_IDENTIFICATION_STRATEGY>(stratMov);
+}
+
+bool PcIdentifier::data_match(const std::array<uint8_t, PC_IDENTIFIER_PROPRIETARY_DATA>& data) const {
+	bool equals = true;
+	for (int i = 0; i < PC_IDENTIFIER_PROPRIETARY_DATA && equals; i++) {
+		equals = (i == 0) ? ((data[i] & 0x1f) == (m_data[i + 1] & 0x1f)) : (data[i] == m_data[i + 1]);
+	}
+	return equals;
+}
+
+}  // namespace pc_identifier
 } /* namespace license */
 

--
Gitblit v1.9.1