From d4edbb5a0aae0211389ce86264809b4237c73769 Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周日, 08 3月 2020 21:27:16 +0800
Subject: [PATCH] Issues #14 and #6

---
 src/library/locate/ExternalDefinition.cpp |   66 ++++++++++++++++++++++++---------
 1 files changed, 48 insertions(+), 18 deletions(-)

diff --git a/src/library/locate/ExternalDefinition.cpp b/src/library/locate/ExternalDefinition.cpp
index af9af5e..a5309de 100644
--- a/src/library/locate/ExternalDefinition.cpp
+++ b/src/library/locate/ExternalDefinition.cpp
@@ -5,36 +5,66 @@
  *      Author: Gabriele Contini
  */
 
+#include <stdlib.h>
+#include <cstring>
+#include <string>
+#include <vector>
+#include <stdexcept>
+#include <licensecc/datatypes.h>
+
+#include "../base/base64.h"
+#include "../base/EventRegistry.h"
 #include "../base/StringUtils.h"
-#include "../base/FileUtils.hpp"
+
 #include "ExternalDefinition.hpp"
+#include "../base/file_utils.hpp"
 
 namespace license {
 namespace locate {
-using namespace std;
+	using namespace std;
 
-ExternalDefinition::ExternalDefinition(const char *location) :
-		LocatorStrategy("ExternalDefinition"), m_location(location) {
-}
+ExternalDefinition::ExternalDefinition(const LicenseLocation *location)
+	: LocatorStrategy("ExternalDefinition"), m_location(location) {}
 
-ExternalDefinition::~ExternalDefinition() {
-}
+ExternalDefinition::~ExternalDefinition() {}
 
-const std::vector<std::string> ExternalDefinition::licenseLocations(
-		EventRegistry &eventRegistry) const {
-	const vector<string> declared_positions = license::split_string(m_location,
-			';');
-	const vector<string> existing_pos = license::filter_existing_files(
-			declared_positions);
-	if (existing_pos.size() > 0) {
-		for (auto it = existing_pos.begin(); it != existing_pos.end(); ++it) {
-			eventRegistry.addEvent(LICENSE_FILE_FOUND, SVRT_INFO, *it);
+const std::vector<std::string> ExternalDefinition::license_locations(EventRegistry &eventRegistry) {
+	vector<string> existing_pos;
+	if (m_location->licenseData[0] != '\0') {
+		eventRegistry.addEvent(LICENSE_SPECIFIED, get_strategy_name());
+		switch (m_location->license_data_type) {
+			case LICENSE_PATH: {
+				string licData(m_location->licenseData, mstrnlen_s(m_location->licenseData, LCC_API_MAX_LICENSE_DATA_LENGTH));
+				const vector<string> declared_positions = license::split_string(licData, ';');
+				existing_pos =
+					license::filter_existing_files(declared_positions, eventRegistry, get_strategy_name().c_str());
+			} break;
+			case LICENSE_ENCODED:
+			case LICENSE_PLAIN_DATA:
+				existing_pos.push_back(get_strategy_name());
+				break;
+			default:
+				throw logic_error("license type not supported ");
 		}
-	} else {
-		eventRegistry.addEvent(LICENSE_FILE_NOT_FOUND, SVRT_WARN, m_location);
 	}
 	return existing_pos;
 }
 
+const std::string ExternalDefinition::retrieve_license_content(const std::string &licenseLocation) const {
+	if (licenseLocation == get_strategy_name()) {
+		string licData(m_location->licenseData, mstrnlen_s(m_location->licenseData, LCC_API_MAX_LICENSE_DATA_LENGTH));
+		if (m_location->license_data_type == LICENSE_ENCODED) {
+			// FIXME what if license is wrong
+			vector<uint8_t> raw = unbase64(licData);
+			string str = string(reinterpret_cast<char *>(raw.data()));
+			return str;
+		} else {
+			return licData;
+		}
+	} else {
+		return LocatorStrategy::retrieve_license_content(licenseLocation);
+	}
+}
+
 } /* namespace locate */
 } /* namespace license */

--
Gitblit v1.9.1