From 8bbef2865455754425a84b86680a89bff8aa7691 Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周六, 19 10月 2019 08:50:45 +0800
Subject: [PATCH] issue #64 , issue #56 (part)

---
 src/library/locate/ExternalDefinition.cpp |   62 ++++++++++++++++++++++++------
 1 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/src/library/locate/ExternalDefinition.cpp b/src/library/locate/ExternalDefinition.cpp
index af9af5e..ec0428f 100644
--- a/src/library/locate/ExternalDefinition.cpp
+++ b/src/library/locate/ExternalDefinition.cpp
@@ -5,36 +5,72 @@
  *      Author: Gabriele Contini
  */
 
-#include "../base/StringUtils.h"
+#include <stdlib.h>
+#include <cstring>
+#include <string>
+#include <vector>
+
+#include "../api/datatypes.h"
+#include "../base/base64.h"
+#include "../base/EventRegistry.h"
 #include "../base/FileUtils.hpp"
+#include "../base/StringUtils.h"
+
 #include "ExternalDefinition.hpp"
 
 namespace license {
 namespace locate {
 using namespace std;
 
-ExternalDefinition::ExternalDefinition(const char *location) :
+ExternalDefinition::ExternalDefinition(const LicenseLocation *location) :
 		LocatorStrategy("ExternalDefinition"), m_location(location) {
 }
 
 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 != nullptr
+			&& m_location->licenseData[0] != '\0') {
+		eventRegistry.addEvent(LICENSE_SPECIFIED, get_strategy_name());
+		FILE_FORMAT licenseFormat = identify_format(m_location->licenseData);
+
+		if (licenseFormat == UNKNOWN) {
+			eventRegistry.addEvent(LICENSE_MALFORMED, get_strategy_name());
+		} else {
+			existing_pos.push_back(get_strategy_name());
+			licenseDataIsBase64 = (licenseFormat == BASE64);
 		}
-	} else {
-		eventRegistry.addEvent(LICENSE_FILE_NOT_FOUND, SVRT_WARN, m_location);
+	}
+	if (m_location->licenseFileLocation != nullptr
+			&& strlen(m_location->licenseFileLocation) > 0) {
+		const vector<string> declared_positions = license::split_string(
+				m_location->licenseFileLocation, ';');
+		existing_pos = license::filter_existing_files(declared_positions,
+				eventRegistry, get_strategy_name().c_str());
 	}
 	return existing_pos;
 }
 
+const std::string ExternalDefinition::retrieve_license_content(
+		const std::string &licenseLocation) const {
+	if (licenseLocation == get_strategy_name()) {
+		if (licenseDataIsBase64) {
+			int flen = 0;
+			unsigned char *raw = unbase64(m_location->licenseData,
+					strlen(m_location->licenseData), &flen);
+			string str = string(reinterpret_cast<char*>(raw));
+			free(raw);
+			return str;
+		} else {
+			return m_location->licenseData;
+		}
+	} else {
+		return LocatorStrategy::retrieve_license_content(licenseLocation);
+	}
+}
+
 } /* namespace locate */
 } /* namespace license */

--
Gitblit v1.9.1