/*
* Greenshot - a free and open source screenshot tool
* Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom
*
* For more information see: http://getgreenshot.org/
* The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
using GreenshotPlugin;
using GreenshotPlugin.Core;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace Greenshot.IniFile
{
///
/// Base class for all IniSections
///
[Serializable]
public abstract class IniSection
{
[NonSerialized]
private readonly IDictionary values = new Dictionary();
[NonSerialized]
private IniSectionAttribute iniSectionAttribute;
public IniSectionAttribute IniSectionAttribute
{
get
{
if (iniSectionAttribute == null)
{
iniSectionAttribute = GetIniSectionAttribute(GetType());
}
return iniSectionAttribute;
}
}
///
/// Get the dictionary with all the IniValues
///
public IDictionary Values
{
get
{
return values;
}
}
///
/// Flag to specify if values have been changed
///
public bool IsDirty = false;
///
/// Supply values we can't put as defaults
///
/// The property to return a default for
/// object with the default value for the supplied property
public virtual object GetDefault(string property)
{
return null;
}
///
/// This method will be called before converting the property, making to possible to correct a certain value
/// Can be used when migration is needed
///
/// The name of the property
/// The string value of the property
/// string with the propertyValue, modified or not...
public virtual string PreCheckValue(string propertyName, string propertyValue)
{
return propertyValue;
}
///
/// This method will be called after reading the configuration, so eventually some corrections can be made
///
public virtual void AfterLoad()
{
}
///
/// This will be called before saving the Section, so we can encrypt passwords etc...
///
public virtual void BeforeSave()
{
}
///
/// This will be called before saving the Section, so we can decrypt passwords etc...
///
public virtual void AfterSave()
{
}
///
/// Helper method to get the IniSectionAttribute of a type
///
///
///
public static IniSectionAttribute GetIniSectionAttribute(Type iniSectionType)
{
Attribute[] classAttributes = Attribute.GetCustomAttributes(iniSectionType);
foreach (Attribute attribute in classAttributes)
{
if (attribute is IniSectionAttribute)
{
return (IniSectionAttribute)attribute;
}
}
return null;
}
///
/// Fill the section with the supplied properties
///
///
public void Fill(Dictionary properties)
{
Type iniSectionType = GetType();
// Iterate over the members and create IniValueContainers
foreach (FieldInfo fieldInfo in iniSectionType.GetFields())
{
if (Attribute.IsDefined(fieldInfo, typeof(IniPropertyAttribute)))
{
IniPropertyAttribute iniPropertyAttribute = (IniPropertyAttribute)fieldInfo.GetCustomAttributes(typeof(IniPropertyAttribute), false)[0];
if (!Values.ContainsKey(iniPropertyAttribute.Name))
{
Values.Add(iniPropertyAttribute.Name, new IniValue(this, fieldInfo, iniPropertyAttribute));
}
}
}
foreach (PropertyInfo propertyInfo in iniSectionType.GetProperties())
{
if (Attribute.IsDefined(propertyInfo, typeof(IniPropertyAttribute)))
{
if (!Values.ContainsKey(propertyInfo.Name))
{
IniPropertyAttribute iniPropertyAttribute = (IniPropertyAttribute)propertyInfo.GetCustomAttributes(typeof(IniPropertyAttribute), false)[0];
Values.Add(iniPropertyAttribute.Name, new IniValue(this, propertyInfo, iniPropertyAttribute));
}
}
}
foreach (string fieldName in Values.Keys)
{
IniValue iniValue = Values[fieldName];
try
{
iniValue.SetValueFromProperties(properties);
if (iniValue.Attributes.Encrypted)
{
string stringValue = iniValue.Value as string;
if (stringValue != null && stringValue.Length > 2)
{
iniValue.Value = stringValue.Decrypt();
}
}
}
catch (Exception ex)
{
LOG.Error(ex);
}
}
AfterLoad();
}
///
/// Write the section to the writer
///
///
///
public void Write(TextWriter writer, bool onlyProperties)
{
if (IniSectionAttribute == null)
{
throw new ArgumentException("Section didn't implement the IniSectionAttribute");
}
BeforeSave();
try
{
if (!onlyProperties)
{
writer.WriteLine("; {0}", IniSectionAttribute.Description);
}
writer.WriteLine("[{0}]", IniSectionAttribute.Name);
foreach (IniValue value in Values.Values)
{
if (value.Attributes.Encrypted)
{
string stringValue = value.Value as string;
if (stringValue != null && stringValue.Length > 2)
{
value.Value = stringValue.Encrypt();
}
}
// Write the value
value.Write(writer, onlyProperties);
if (value.Attributes.Encrypted)
{
string stringValue = value.Value as string;
if (stringValue != null && stringValue.Length > 2)
{
value.Value = stringValue.Decrypt();
}
}
}
}
finally
{
AfterSave();
}
}
}
}