using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GreenTree.Nachtragsmanagement.Core.Plugins
{
///
/// Plugin files parser
///
public static class PluginFileParser
{
public static IList ParseInstalledPluginsFile(string filePath)
{
//read and parse the file
if (!File.Exists(filePath))
return new List();
var text = File.ReadAllText(filePath);
if (String.IsNullOrEmpty(text))
return new List();
//Old way of file reading. This leads to unexpected behavior when a user's FTP program transfers these files as ASCII (\r\n becomes \n).
//var lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
var lines = new List();
using (var reader = new StringReader(text))
{
string str;
while ((str = reader.ReadLine()) != null)
{
if (String.IsNullOrWhiteSpace(str))
continue;
lines.Add(str.Trim());
}
}
return lines;
}
public static void SaveInstalledPluginsFile(IList pluginSystemNames, string filePath)
{
string result = "";
foreach (var sn in pluginSystemNames)
result += string.Format("{0}{1}", sn, Environment.NewLine);
File.WriteAllText(filePath, result);
}
public static PluginDescriptor ParsePluginDescriptionFile(string filePath)
{
var descriptor = new PluginDescriptor();
var text = File.ReadAllText(filePath);
if (String.IsNullOrEmpty(text))
return descriptor;
var settings = new List();
using (var reader = new StringReader(text))
{
string str;
while ((str = reader.ReadLine()) != null)
{
if (String.IsNullOrWhiteSpace(str))
continue;
settings.Add(str.Trim());
}
}
//Old way of file reading. This leads to unexpected behavior when a user's FTP program transfers these files as ASCII (\r\n becomes \n).
//var settings = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (var setting in settings)
{
var separatorIndex = setting.IndexOf(':');
if (separatorIndex == -1)
{
continue;
}
string key = setting.Substring(0, separatorIndex).Trim();
string value = setting.Substring(separatorIndex + 1).Trim();
switch (key)
{
case "Group":
descriptor.Group = value;
break;
case "FriendlyName":
descriptor.FriendlyName = value;
break;
case "SystemName":
descriptor.SystemName = value;
break;
case "Version":
descriptor.Version = value;
break;
case "SupportedVersions":
{
//parse supported versions
descriptor.SupportedVersions = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim())
.ToList();
}
break;
case "Author":
descriptor.Author = value;
break;
case "DisplayOrder":
{
int displayOrder;
int.TryParse(value, out displayOrder);
descriptor.DisplayOrder = displayOrder;
}
break;
case "FileName":
descriptor.PluginFileName = value;
break;
case "LimitedToStores":
{
//parse list of store IDs
foreach (var str1 in value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim()))
{
int storeId;
if (int.TryParse(str1, out storeId))
{
descriptor.LimitedToStores.Add(storeId);
}
}
}
break;
default:
break;
}
}
//nopCommerce 2.00 didn't have 'SupportedVersions' parameter
//so let's set it to "2.00"
if (descriptor.SupportedVersions.Count == 0)
descriptor.SupportedVersions.Add("2.00");
return descriptor;
}
public static void SavePluginDescriptionFile(PluginDescriptor plugin)
{
if (plugin == null)
throw new ArgumentException("plugin");
//get the Description.txt file path
if (plugin.OriginalAssemblyFile == null)
throw new Exception(string.Format("Cannot load original assembly path for {0} plugin.", plugin.SystemName));
var filePath = Path.Combine(plugin.OriginalAssemblyFile.Directory.FullName, "Description.txt");
if (!File.Exists(filePath))
throw new Exception(string.Format("Description file for {0} plugin does not exist. {1}", plugin.SystemName, filePath));
var keyValues = new List>();
keyValues.Add(new KeyValuePair("Group", plugin.Group));
keyValues.Add(new KeyValuePair("FriendlyName", plugin.FriendlyName));
keyValues.Add(new KeyValuePair("SystemName", plugin.SystemName));
keyValues.Add(new KeyValuePair("Version", plugin.Version));
keyValues.Add(new KeyValuePair("SupportedVersions", string.Join(",", plugin.SupportedVersions)));
keyValues.Add(new KeyValuePair("Author", plugin.Author));
keyValues.Add(new KeyValuePair("DisplayOrder", plugin.DisplayOrder.ToString()));
keyValues.Add(new KeyValuePair("FileName", plugin.PluginFileName));
if (plugin.LimitedToStores.Count > 0)
{
var storeList = "";
for (int i = 0; i < plugin.LimitedToStores.Count; i++)
{
storeList += plugin.LimitedToStores[i];
if (i != plugin.LimitedToStores.Count - 1)
storeList += ",";
}
keyValues.Add(new KeyValuePair("LimitedToStores", storeList));
}
var sb = new StringBuilder();
for (int i = 0; i < keyValues.Count; i++)
{
var key = keyValues[i].Key;
var value = keyValues[i].Value;
sb.AppendFormat("{0}: {1}", key, value);
if (i != keyValues.Count - 1)
sb.Append(Environment.NewLine);
}
//save the file
File.WriteAllText(filePath, sb.ToString());
}
}
}