using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Reflection;
using Foo.Platform;
using System.Diagnostics;
namespace Foo.Settings
{
[Guid("6FBB970D-0825-471e-9839-448FB2B6A842")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IOoganizerSettings
{
// reading in configuration data
configuration ReadConfigXMLFile();
// write custom configuration data to default location
void WriteConfigXMLFileDefaultLoc(configuration config);
}
///
/// Serializable Xml Object used to store all Configuration data - place any new class objects in here
///
[Guid("EA2D77C2-AA17-4142-8FA7-7D6FA35316F4")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
[XmlRoot("configuration", Namespace = "http://www.ooganizer.com", IsNullable = false)]
public class configuration
{
// Member Tags <>
public ButtonHookSettings ButtonHook = null;
///
/// configuration - Constructor
///
public configuration()
{
ButtonHook = new ButtonHookSettings();
}
}
///
/// Serializable Xml Object used to store ButtonHookSettings
///
[Guid("2C055265-715A-4d10-B744-ADCE796BED1C")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
[XmlRoot("ButtonHookSettings", Namespace = "http://www.ooganizer.com", IsNullable = false)]
public class ButtonHookSettings
{
// Member Tags <>
public AllowedProcessNamesW AllowedProcessNames = null;
public AllowedWindowTitlesW AllowedWindowTitles = null;
public AllowedWindowClassesW AllowedWindowClasses = null;
public LoggingSettings LogSettings = null;
///
/// AllowedProcessNames - (Wrapper) around ArrayList to work with COM and XML
///
[Guid("06403D5A-E309-42d3-B639-1F9DB99880A4")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class AllowedProcessNamesW
{
private ArrayList m_ArrayList;
public AllowedProcessNamesW()
{
m_ArrayList = new ArrayList();
}
[XmlElement("ProcessName")]
public ProcessName[] ProcessNames
{
get
{
ProcessName[] processNames = new ProcessName[m_ArrayList.Count];
m_ArrayList.CopyTo(processNames);
return processNames;
}
set
{
if (value == null) return;
ProcessName[] processNames = (ProcessName[])value;
m_ArrayList.Clear();
foreach (ProcessName processName in processNames)
m_ArrayList.Add(processName);
}
}
public int AddProcessName(ProcessName processName)
{
return m_ArrayList.Add(processName);
}
}
[Guid("EC4E542F-2877-4bb4-8FEF-30F1A1C1B53B")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class ProcessName
{
public ProcessName()
{
this.CustomBHTop = 0;
this.CustomBHRight = 0;
}
public ProcessName(string ProcessExe, string Resolver, string ResolverPrms, string Launcher, string Closer, string ShowHider, string Versions, int CustomBHTop, int CustomBHRight)
{
this._ProcessExe = ProcessExe;
this.Resolver = Resolver;
this.ResolverPrms = ResolverPrms;
this.Launcher = Launcher;
this.Closer = Closer;
this.ShowHider = ShowHider;
this.Versions = Versions;
this.CustomBHTop = CustomBHTop;
this.CustomBHRight = CustomBHRight;
}
private string _ProcessExe;
[XmlText]
public string ProcessExe
{
get
{
if (!String.IsNullOrEmpty(_ProcessExe))
return _ProcessExe.ToUpper();
else
return String.Empty;
}
set
{
_ProcessExe = value;
}
}
[XmlAttribute("Resolver")]
public string Resolver;
[XmlAttribute("ResolverPrms")]
public string ResolverPrms;
[XmlAttribute("Launcher")]
public string Launcher;
[XmlAttribute("Closer")]
public string Closer;
[XmlAttribute("ShowHider")]
public string ShowHider;
[XmlAttribute("Versions")]
public string Versions;
[XmlAttribute("CustomBHTop")]
public int CustomBHTop;
[XmlAttribute("CustomBHRight")]
public int CustomBHRight;
}
///
/// AllowedWindowTitles - (Wrapper) around ArrayList to work with COM and XML
///
[Guid("5B9CC560-9E53-4ae2-8701-E60F99A9A80D")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class AllowedWindowTitlesW
{
private ArrayList m_ArrayList;
public AllowedWindowTitlesW()
{
m_ArrayList = new ArrayList();
m_ArrayList.Add("");
}
[XmlElement("WindowTitle")]
public string[] WindowTitle
{
get
{
string[] windowTitles = new string[m_ArrayList.Count];
m_ArrayList.CopyTo(windowTitles);
return windowTitles;
}
set
{
if (value == null) return;
string[] windowTitles = (string[])value;
m_ArrayList.Clear();
foreach (string windowTitle in windowTitles)
m_ArrayList.Add(windowTitle);
}
}
}
///
/// AllowedWindowClasses - (Wrapper) around ArrayList to work with COM and XML
///
[Guid("FE3ECBC4-9082-43b5-8274-7DC3A4FB4855")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class AllowedWindowClassesW
{
private ArrayList m_ArrayList;
public AllowedWindowClassesW()
{
m_ArrayList = new ArrayList();
m_ArrayList.Add("");
}
[XmlElement("WindowClass")]
public string[] WindowClass
{
get
{
string[] windowClasses = new string[m_ArrayList.Count];
m_ArrayList.CopyTo(windowClasses);
return windowClasses;
}
set
{
if (value == null) return;
string[] windowClasses = (string[])value;
m_ArrayList.Clear();
foreach (string windowClass in windowClasses)
m_ArrayList.Add(windowClass);
}
}
}
///
/// LoggingSettings = Set Log Settings (Location & Detail) for ButtonHook
///
[Guid("A5A6EBA5-DC51-4bba-B7DC-0202153F57DF")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class LoggingSettings
{
public uint LoggingDetail;
private string _LogPath;
public string LogPath
{
get
{
if (!String.IsNullOrEmpty(_LogPath))
return Platform.Env.GetLogDirectory();
else
return _LogPath;
}
set
{
try
{
if (Directory.Exists(value))
_LogPath = value;
}
catch(Exception){}
}
}
public LoggingSettings()
{
_LogPath = String.Empty;
LoggingDetail = (int)_LoggingDetail.LOGGING_NONE;
}
// same enum Definition in ButtonHook
public enum _LoggingDetail { LOGGING_NONE = 0, LOGGING_LOW = 1, LOGGING_MEDIUM = 2, LOGGING_HIGH = 3};
}
///
/// ButtonHookSettings - Constructor
///
public ButtonHookSettings()
{
AllowedProcessNames = new AllowedProcessNamesW();
AllowedWindowTitles = new AllowedWindowTitlesW();
AllowedWindowClasses = new AllowedWindowClassesW();
LogSettings = new LoggingSettings();
}
}
[Guid("80adff74-7124-42e6-ac2c-e19f51a47432")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Ooganizer.SettingsAcc")]
[ComVisible(true)]
public class OoganizerSettingsAcc : IOoganizerSettings
{
private XmlSerializer m_ConfigSerializer = null;
public const string DEFAULT_CONFIG_XML_FILE_NAME = "AppConfig.xml";
private string m_AssemblyLocation = "";// location of running assembly
private configuration m_Configuration; // holds the latest configuration read in or written out,
// for easy access to the configuration
///
/// Construcs the SettingsAccessor Object, Responsible for
/// interfacing with the App.Config file
///
public OoganizerSettingsAcc()
{
m_ConfigSerializer = new XmlSerializer(typeof(configuration));
if (m_ConfigSerializer == null)
throw new OutOfMemoryException();
// The location of this assembly is in the Platform Directory
m_AssemblyLocation = Platform.InstallationSpec.InstallPath;
}
#region IOoganizerSettings
///
/// Reads in the Config File from the Resource.
///
/// the configuration object
public configuration ReadConfigXMLFile()
{
string strFileNameWithPath = m_AssemblyLocation + '\\' + DEFAULT_CONFIG_XML_FILE_NAME;
// If a physical xml file exists in the current directory (allow it to overwrite our settings)
if (File.Exists(strFileNameWithPath + '\\' + DEFAULT_CONFIG_XML_FILE_NAME))
{
return ReadConfigXMLFile(strFileNameWithPath, false);
}
else
{
// Else force reading of the Resource
return ReadConfigXMLFile(strFileNameWithPath, true);
}
}
///
/// Writes the specified configruation to the default location and configuration file
///
/// configuration object to write out
public void WriteConfigXMLFileDefaultLoc(configuration config)
{
string strFileNameWithPath = m_AssemblyLocation + '\\' + DEFAULT_CONFIG_XML_FILE_NAME;
WriteConfigXMLFile(strFileNameWithPath, config);
}
#endregion
#region XML Writer Functions - useful for * Development and Debugging *
///
/// Writes the specified configuration to the specified configuration file
///
/// absolute path to file
/// configuration object to write out
public void WriteConfigXMLFile(string strFileNameWithPath, configuration config)
{
try
{
if (!Directory.Exists(Path.GetDirectoryName(strFileNameWithPath)))
{
Log.Error(string.Format("{0}() - Directory for {1} does not exist", MethodBase.GetCurrentMethod().Name, strFileNameWithPath));
return;
}
TextWriter writer = new StreamWriter(strFileNameWithPath);
m_ConfigSerializer.Serialize(writer, config);
m_Configuration = config;
}
catch (Exception e)
{
Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e);
return;
}
}
///
/// Use this to write a blank xml config file that you can then use
/// to store your configuration
///
/// absolute path to file
public void WriteBlankConfigXMLFile(string strFileNameWithPath)
{
try
{
if (!Directory.Exists(Path.GetDirectoryName(strFileNameWithPath)))
{
Log.Error(string.Format("{0}() - Directory for {1} does not exist", MethodBase.GetCurrentMethod().Name, strFileNameWithPath));
return;
}
TextWriter writer = new StreamWriter(strFileNameWithPath);
configuration settings = new configuration();
m_ConfigSerializer.Serialize(writer, settings);
}
catch (Exception e)
{
Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e);
return;
}
}
#endregion
#region Main ReadConfig Function - Does most of the work
///
/// Reads in the config file from the passed in location or from the Resource
///
/// absolute path to file (not used when bReadFromResource is true)
/// true to read Resource XML, false to read from passed in strFileNameWithPath
///
private configuration ReadConfigXMLFile(string strFileNameWithPath, bool bReadFromResource)
{
const string SETTING_XML_RESOURCE_NAME = "Foo.Platform.AppConfig.xml";
try
{
if (bReadFromResource)
{
Assembly assembly = Assembly.GetExecutingAssembly();
// * Debugging Only * Make sure resource Name exists
#if DEBUG
string[] resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames();
bool bFound = false;
foreach (string resourceName in resourceNames)
{
if (resourceName == SETTING_XML_RESOURCE_NAME)
bFound = true;
}
Debug.Assert(bFound);
#endif
TextReader reader = new StreamReader(assembly.GetManifestResourceStream(SETTING_XML_RESOURCE_NAME));
m_Configuration = (configuration)m_ConfigSerializer.Deserialize(reader);
return m_Configuration;
}
else
{
TextReader reader = new StreamReader(strFileNameWithPath);
m_Configuration = (configuration)m_ConfigSerializer.Deserialize(reader);
return m_Configuration;
}
}
catch (Exception e)
{
Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e);
throw (new Exception(e.Message));
}
}
#endregion
// Declare the Log4net Variable
private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType);
}
}