From 91e1b0675d531e87a8866ab6595692a3fa52c322 Mon Sep 17 00:00:00 2001
From: Gabriele Contini <gcontini@users.noreply.github.com>
Date: 周六, 14 12月 2019 13:56:41 +0800
Subject: [PATCH] Merge pull request #69 from open-license-manager/feature/issue_licenses_42

---
 src/library/licensecc.cpp |  109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 109 insertions(+), 0 deletions(-)

diff --git a/src/library/licensecc.cpp b/src/library/licensecc.cpp
new file mode 100644
index 0000000..8860311
--- /dev/null
+++ b/src/library/licensecc.cpp
@@ -0,0 +1,109 @@
+//============================================================================
+// Name        : license-manager-cpp.cpp
+// Author      :
+// Version     :
+// Copyright   : BSD
+//============================================================================
+
+#include <fstream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <cstring>
+#include <iostream>
+
+#include <licensecc/datatypes.h>
+#include <licensecc/licensecc.h>
+#include <licensecc_properties.h>
+
+#include "limits/license_verifier.hpp"
+#include "LicenseReader.hpp"
+#include "pc-identifiers.h"
+
+using namespace std;
+void print_error(char out_buffer[256], LicenseInfo* licenseInfo) {}
+
+bool identify_pc(IDENTIFICATION_STRATEGY pc_id_method, char* chbuffer, size_t bufSize) {
+	FUNCTION_RETURN result = FUNC_RET_BUFFER_TOO_SMALL;
+	if (bufSize >= sizeof(PcSignature)) {
+		PcSignature identifier_out;
+		result = generate_user_pc_signature(identifier_out, pc_id_method);
+		strncpy(chbuffer, identifier_out, bufSize);
+	}
+	return result == FUNC_RET_OK;
+}
+
+static void mergeLicenses(const vector<LicenseInfo>& licenses, LicenseInfo* license_out) {
+	if (license_out != nullptr) {
+		int days_left = INT_MIN;
+		for (auto it = licenses.begin(); it != licenses.end(); it++) {
+			// choose the license that expires later...
+			if (!it->has_expiry) {
+				*license_out = *it;
+				break;
+			} else if (days_left < (int)it->days_left) {
+				*license_out = *it;
+				days_left = it->days_left;
+			}
+		}
+	}
+}
+
+EVENT_TYPE acquire_license(const CallerInformations* callerInformation, const LicenseLocation* licenseLocation,
+						   LicenseInfo* license_out) {
+	const license::LicenseReader lr = license::LicenseReader(licenseLocation);
+	vector<license::FullLicenseInfo> licenses;
+	string project;
+	if (callerInformation != nullptr && strlen(callerInformation->project_name) > 0) {
+		project = string(callerInformation->project_name);
+	} else {
+		project = string(LCC_PROJECT_NAME);
+	}
+	license::EventRegistry er = lr.readLicenses(string(project), licenses);
+	EVENT_TYPE result;
+	if (licenses.size() > 0) {
+		vector<LicenseInfo> licenses_with_errors;
+		vector<LicenseInfo> licenses_ok;
+		license::LicenseVerifier verifier(er);
+		for (auto it = licenses.begin(); it != licenses.end(); it++) {
+			FUNCTION_RETURN signatureValid = verifier.verify_signature(*it);
+			if (signatureValid == FUNC_RET_OK) {
+				if (verifier.verify_limits(*it) == FUNC_RET_OK) {
+					licenses_ok.push_back(verifier.toLicenseInfo(*it));
+				} else {
+					licenses_with_errors.push_back(verifier.toLicenseInfo(*it));
+				}
+			} else {
+				licenses_with_errors.push_back(verifier.toLicenseInfo(*it));
+			}
+		}
+		if (licenses_ok.size() > 0) {
+			er.turnErrorsIntoWarnings();
+			result = LICENSE_OK;
+			mergeLicenses(licenses_ok, license_out);
+		} else {
+			er.turnWarningsIntoErrors();
+			result = er.getLastFailure()->event_type;
+			mergeLicenses(licenses_with_errors, license_out);
+		}
+	} else {
+		er.turnWarningsIntoErrors();
+		result = er.getLastFailure()->event_type;
+		if (license_out != nullptr) {
+			license_out->proprietary_data[0] = '\0';
+			license_out->linked_to_pc = false;
+			license_out->days_left = 0;
+		}
+	}
+#ifdef _DEBUG
+	cout << er << endl;
+#endif
+
+	if (license_out != nullptr) {
+		er.exportLastEvents(license_out->status, AUDIT_EVENT_NUM);
+	}
+	return result;
+}
+
+EVENT_TYPE confirm_license(char* product, LicenseLocation licenseLocation) { return LICENSE_OK; }
+
+EVENT_TYPE release_license(char* product, LicenseLocation licenseLocation) { return LICENSE_OK; }

--
Gitblit v1.9.1