From 5d562274a4df36a38ad1a9fe3b68673535b31cf2 Mon Sep 17 00:00:00 2001
From: open-license-manager <rillf@maildrop.cc>
Date: 周三, 16 4月 2014 05:11:42 +0800
Subject: [PATCH] license signature 

---
 src/license-generator/license-generator.cpp |   44 ++++++++++++++++++++++++++++++++++++--------
 1 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/src/license-generator/license-generator.cpp b/src/license-generator/license-generator.cpp
index f6e3e80..5556711 100644
--- a/src/license-generator/license-generator.cpp
+++ b/src/license-generator/license-generator.cpp
@@ -50,7 +50,7 @@
 	("begin_date,b", po::value<string>(),
 			"Specify the start of the validity for this license. "
 					" Format YYYYMMDD. If not specified defaults to today") //
-	("end_date,e", po::value<string>(),
+	("expire_date,e", po::value<string>(),
 			"Specify the expire date for this license. "
 					" Format YYYYMMDD. If not specified the license won't expire") //
 	("client_signature,s", po::value<string>(),
@@ -71,13 +71,16 @@
 
 vector<FullLicenseInfo> LicenseGenerator::parseLicenseInfo(
 		po::variables_map vm) {
-	time_t begin_date = FullLicenseInfo::UNUSED_TIME;
-	time_t end_date = FullLicenseInfo::UNUSED_TIME;
-	if (vm.count("end_date")) {
-		const std::string dt_end = vm["end_date"].as<string>();
+	string begin_date = FullLicenseInfo::UNUSED_TIME;
+	string end_date = FullLicenseInfo::UNUSED_TIME;
+	if (vm.count("expire_date")) {
+		const std::string dt_end = vm["expire_date"].as<string>();
 		try {
-			end_date = seconds_from_epoch(dt_end.c_str());
-			begin_date = time(NULL);
+			end_date = normalize_date(dt_end.c_str());
+			char curdate[20];
+			time_t curtime = time(NULL);
+			strftime(curdate, 20, "%Y-%m-%d", localtime(&curtime));
+			begin_date.assign(curdate);
 		} catch (invalid_argument &e) {
 			cerr << endl << "End date not recognized: " << dt_end
 					<< " Please enter a valid date in format YYYYMMDD" << endl;
@@ -87,7 +90,7 @@
 	if (vm.count("begin_date")) {
 		const std::string begin_date_str = vm["begin_date"].as<string>();
 		try {
-			begin_date = seconds_from_epoch(begin_date_str.c_str());
+			begin_date = normalize_date(begin_date_str.c_str());
 		} catch (invalid_argument &e) {
 			cerr << endl << "Begin date not recognized: " << begin_date_str
 					<< " Please enter a valid date in format YYYYMMDD" << endl;
@@ -185,5 +188,30 @@
 }
 
 
+const std::locale formats[] = { std::locale(std::locale::classic(),
+		new bt::time_input_facet("%Y-%m-%d")), //
+std::locale(std::locale::classic(), new bt::time_input_facet("%Y/%m/%d")), //
+std::locale(std::locale::classic(), new bt::time_input_facet("%Y%m%d")) };
+const size_t formats_n = sizeof(formats) / sizeof(formats[0]);
 
+string LicenseGenerator::normalize_date(const std::string& s) {
+	bt::ptime pt;
+	for (size_t i = 0; i < formats_n; ++i) {
+		std::istringstream is(s);
+		is.imbue(formats[i]);
+		is >> pt;
+		if (pt != bt::ptime()) {
+			break;
+		}
+	}
+	if (pt == bt::ptime()) {
+		throw invalid_argument(string("Date not regognized") + s);
+	}
+	ostringstream oss;
+	bt::time_facet *facet = new bt::time_facet("%Y-%m-%d");
+	oss.imbue(locale(cout.getloc(), facet));
+	oss << pt << endl;
+	//delete (facet);
+	return oss.str();
+}
 }

--
Gitblit v1.9.1