#region License // Copyright (c) 2010, Jasper Yeh. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of ClearCanvas Inc. nor the names of its contributors // may be used to endorse or promote products derived from this software without // specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, // OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY // OF SUCH DAMAGE. #endregion using System; using System.Collections; using System.Collections.Specialized; using System.Configuration; namespace Nullstack.ClearCanvasEx.DevTools.Common { /// /// A custom to write to the user's Application Data path but with a path /// that is more easily computed for use by external apps (like installers). /// /// /// Concept and some code adapted from http://www.codeproject.com/KB/vb/CustomSettingsProvider.aspx. /// /// /// /// [System.Configuration.SettingsProvider(typeof(Nullstack.ClearCanvasEx.DevTools.Config.DllSettingsProvider))] /// internal sealed partial class ApplicationSettings1 { /// .... /// } /// /// internal class DllSettingsProvider : SettingsProvider { private string _appName = "Settings"; public override void Initialize(string name, NameValueCollection col) { base.Initialize(this.ApplicationName, col); } public override string ApplicationName { get { return _appName; } set { _appName = value; } } private Type GetTypeFromContext(SettingsContext context) { return (context["SettingsClassType"] as Type) ?? this.GetType(); } public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection propvals) { XmlSettingsFile localFile = XmlSettingsFile.GetLocalSettingsFile(GetTypeFromContext(context)); XmlSettingsFile roamingFile = XmlSettingsFile.GetRoamingSettingsFile(GetTypeFromContext(context)); foreach (SettingsPropertyValue propval in propvals) { if (IsRoaming(propval.Property)) { roamingFile.SetValue(propval); } else { localFile.SetValue(propval); } } localFile.Save(); roamingFile.Save(); } public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection props) { XmlSettingsFile localFile = XmlSettingsFile.GetLocalSettingsFile(GetTypeFromContext(context)); XmlSettingsFile roamingFile = XmlSettingsFile.GetRoamingSettingsFile(GetTypeFromContext(context)); SettingsPropertyValueCollection values = new SettingsPropertyValueCollection(); foreach (SettingsProperty setting in props) { SettingsPropertyValue value = new SettingsPropertyValue(setting); value.IsDirty = false; if (IsRoaming(setting)) { value.SerializedValue = roamingFile.GetValue(setting); } else { value.SerializedValue = localFile.GetValue(setting); } values.Add(value); } return values; } private static bool IsRoaming(SettingsProperty prop) { foreach (DictionaryEntry d in prop.Attributes) { Attribute a = (Attribute) d.Value; if (a is SettingsManageabilityAttribute) { return true; } } return false; } } }