Statistics
| Branch: | Revision:

root / trunk / NetSparkle / NetSparkleConfiguration.cs @ 049333d2

History | View | Annotate | Download (8.6 kB)

1 46426dbd Panagiotis Kanavos
using System;
2 46426dbd Panagiotis Kanavos
using System.Collections.Generic;
3 46426dbd Panagiotis Kanavos
using System.Linq;
4 46426dbd Panagiotis Kanavos
using System.Text;
5 46426dbd Panagiotis Kanavos
using Microsoft.Win32;
6 46426dbd Panagiotis Kanavos
using System.Diagnostics;
7 46426dbd Panagiotis Kanavos
8 46426dbd Panagiotis Kanavos
namespace AppLimit.NetSparkle
9 46426dbd Panagiotis Kanavos
{
10 46426dbd Panagiotis Kanavos
    /// <summary>
11 46426dbd Panagiotis Kanavos
    /// This class handles all registry values which are used from sparkle to handle 
12 46426dbd Panagiotis Kanavos
    /// update intervalls. All values are stored in HKCU\Software\Vendor\AppName which 
13 46426dbd Panagiotis Kanavos
    /// will be read ot from the assembly information. All values are of the REG_SZ 
14 46426dbd Panagiotis Kanavos
    /// type, no matter what their "logical" type is. The following options are
15 46426dbd Panagiotis Kanavos
    /// available:
16 46426dbd Panagiotis Kanavos
    /// 
17 46426dbd Panagiotis Kanavos
    /// CheckForUpdate  - Boolean    - Whether NetSparkle should check for updates
18 46426dbd Panagiotis Kanavos
    /// LastCheckTime   - time_t     - Time of last check
19 46426dbd Panagiotis Kanavos
    /// SkipThisVersion - String     - If the user skipped an update, then the version to ignore is stored here (e.g. "1.4.3")
20 46426dbd Panagiotis Kanavos
    /// DidRunOnce      - Boolean    - Check only one time when the app launched
21 46426dbd Panagiotis Kanavos
    /// </summary>    
22 46426dbd Panagiotis Kanavos
    public class NetSparkleConfiguration
23 46426dbd Panagiotis Kanavos
    {
24 46426dbd Panagiotis Kanavos
        public String   ApplicationName     { get; private set; }
25 46426dbd Panagiotis Kanavos
        public String   InstalledVersion    { get; private set; }
26 46426dbd Panagiotis Kanavos
        public Boolean  CheckForUpdate      { get; private set; }
27 46426dbd Panagiotis Kanavos
        public DateTime LastCheckTime       { get; private set; }
28 46426dbd Panagiotis Kanavos
        public String   SkipThisVersion     { get; private set; }
29 46426dbd Panagiotis Kanavos
        public Boolean  DidRunOnce           { get; private set; }
30 46426dbd Panagiotis Kanavos
        public Boolean ShowDiagnosticWindow { get; private set; }
31 46426dbd Panagiotis Kanavos
        public DateTime LastProfileUpdate   { get; private set; }
32 46426dbd Panagiotis Kanavos
33 46426dbd Panagiotis Kanavos
        /// <summary>
34 46426dbd Panagiotis Kanavos
        /// If this property is true a reflection based accessor will be used
35 46426dbd Panagiotis Kanavos
        /// to determine the assmebly name and verison, otherwise a System.Diagnostics
36 46426dbd Panagiotis Kanavos
        /// based access will be used
37 46426dbd Panagiotis Kanavos
        /// </summary>
38 46426dbd Panagiotis Kanavos
        public Boolean UseReflectionBasedAssemblyAccessor { get; private set; }
39 46426dbd Panagiotis Kanavos
40 46426dbd Panagiotis Kanavos
        private String _referenceAssembly;
41 46426dbd Panagiotis Kanavos
42 46426dbd Panagiotis Kanavos
        /// <summary>
43 46426dbd Panagiotis Kanavos
        /// The constructor reads out all configured values
44 46426dbd Panagiotis Kanavos
        /// </summary>        
45 46426dbd Panagiotis Kanavos
        public NetSparkleConfiguration(String ReferenceAssembly)
46 46426dbd Panagiotis Kanavos
            : this(ReferenceAssembly, true)
47 46426dbd Panagiotis Kanavos
        { }
48 46426dbd Panagiotis Kanavos
49 46426dbd Panagiotis Kanavos
        public NetSparkleConfiguration(String ReferenceAssembly, Boolean UseReflectionBasedAssemblyAccessor)
50 46426dbd Panagiotis Kanavos
        {
51 46426dbd Panagiotis Kanavos
            // set the value
52 46426dbd Panagiotis Kanavos
            this.UseReflectionBasedAssemblyAccessor = UseReflectionBasedAssemblyAccessor;
53 46426dbd Panagiotis Kanavos
54 46426dbd Panagiotis Kanavos
            // save the referecne assembly
55 46426dbd Panagiotis Kanavos
            _referenceAssembly = ReferenceAssembly;
56 46426dbd Panagiotis Kanavos
57 46426dbd Panagiotis Kanavos
            try
58 46426dbd Panagiotis Kanavos
            {
59 46426dbd Panagiotis Kanavos
                // set default values
60 46426dbd Panagiotis Kanavos
                InitWithDefaultValues();
61 46426dbd Panagiotis Kanavos
62 46426dbd Panagiotis Kanavos
                // set some value from the binary
63 46426dbd Panagiotis Kanavos
                NetSparkleAssemblyAccessor accessor = new NetSparkleAssemblyAccessor(ReferenceAssembly, this.UseReflectionBasedAssemblyAccessor);
64 46426dbd Panagiotis Kanavos
                ApplicationName     = accessor.AssemblyProduct;
65 46426dbd Panagiotis Kanavos
                InstalledVersion    = accessor.AssemblyVersion;
66 46426dbd Panagiotis Kanavos
67 46426dbd Panagiotis Kanavos
                // build the reg path
68 46426dbd Panagiotis Kanavos
                String regPath = BuildRegistryPath();
69 46426dbd Panagiotis Kanavos
70 46426dbd Panagiotis Kanavos
                // load the values
71 46426dbd Panagiotis Kanavos
                LoadValuesFromPath(regPath);                                
72 46426dbd Panagiotis Kanavos
            }
73 46426dbd Panagiotis Kanavos
            catch (Exception e)
74 46426dbd Panagiotis Kanavos
            {
75 46426dbd Panagiotis Kanavos
                // disable update checks when exception was called 
76 46426dbd Panagiotis Kanavos
                CheckForUpdate = false;
77 46426dbd Panagiotis Kanavos
78 46426dbd Panagiotis Kanavos
                if (e.Message.Contains("STOP:"))
79 46426dbd Panagiotis Kanavos
                    throw e;
80 46426dbd Panagiotis Kanavos
            }
81 46426dbd Panagiotis Kanavos
        }
82 46426dbd Panagiotis Kanavos
83 46426dbd Panagiotis Kanavos
        /// <summary>
84 46426dbd Panagiotis Kanavos
        /// Touches to profile time
85 46426dbd Panagiotis Kanavos
        /// </summary>
86 46426dbd Panagiotis Kanavos
        public void TouchProfileTime()
87 46426dbd Panagiotis Kanavos
        {
88 46426dbd Panagiotis Kanavos
            // set the prodilt update time
89 46426dbd Panagiotis Kanavos
            LastProfileUpdate = DateTime.Now;
90 46426dbd Panagiotis Kanavos
91 46426dbd Panagiotis Kanavos
            // build path
92 46426dbd Panagiotis Kanavos
            String path = BuildRegistryPath();
93 46426dbd Panagiotis Kanavos
94 46426dbd Panagiotis Kanavos
            // save the values
95 46426dbd Panagiotis Kanavos
            SaveValuesToPath(path);
96 46426dbd Panagiotis Kanavos
        }
97 46426dbd Panagiotis Kanavos
98 46426dbd Panagiotis Kanavos
        /// <summary>
99 46426dbd Panagiotis Kanavos
        /// Touches the check time to now, should be used after a check directly
100 46426dbd Panagiotis Kanavos
        /// </summary>
101 46426dbd Panagiotis Kanavos
        public void TouchCheckTime()
102 46426dbd Panagiotis Kanavos
        {
103 46426dbd Panagiotis Kanavos
            // set the check tiem
104 46426dbd Panagiotis Kanavos
            LastCheckTime = DateTime.Now;
105 46426dbd Panagiotis Kanavos
106 46426dbd Panagiotis Kanavos
            // build path
107 46426dbd Panagiotis Kanavos
            String path = BuildRegistryPath();
108 46426dbd Panagiotis Kanavos
109 46426dbd Panagiotis Kanavos
            // save the values
110 46426dbd Panagiotis Kanavos
            SaveValuesToPath(path);
111 46426dbd Panagiotis Kanavos
        }
112 46426dbd Panagiotis Kanavos
113 46426dbd Panagiotis Kanavos
        /// <summary>
114 46426dbd Panagiotis Kanavos
        /// This method allows to skip a specific version
115 46426dbd Panagiotis Kanavos
        /// </summary>
116 46426dbd Panagiotis Kanavos
        /// <param name="version"></param>
117 46426dbd Panagiotis Kanavos
        public void SetVersionToSkip(String version)
118 46426dbd Panagiotis Kanavos
        {
119 46426dbd Panagiotis Kanavos
            // set the check tiem
120 46426dbd Panagiotis Kanavos
            SkipThisVersion = version;
121 46426dbd Panagiotis Kanavos
122 46426dbd Panagiotis Kanavos
            // build path
123 46426dbd Panagiotis Kanavos
            String path = BuildRegistryPath();
124 46426dbd Panagiotis Kanavos
125 46426dbd Panagiotis Kanavos
            // save the values
126 46426dbd Panagiotis Kanavos
            SaveValuesToPath(path);
127 46426dbd Panagiotis Kanavos
        }
128 46426dbd Panagiotis Kanavos
129 46426dbd Panagiotis Kanavos
        /// <summary>
130 46426dbd Panagiotis Kanavos
        /// This function build a valid registry path in dependecy to the 
131 46426dbd Panagiotis Kanavos
        /// assembly information
132 46426dbd Panagiotis Kanavos
        /// </summary>
133 46426dbd Panagiotis Kanavos
        /// <returns></returns>
134 46426dbd Panagiotis Kanavos
        private String BuildRegistryPath()
135 46426dbd Panagiotis Kanavos
        {
136 46426dbd Panagiotis Kanavos
            NetSparkleAssemblyAccessor accessor = new NetSparkleAssemblyAccessor(_referenceAssembly, UseReflectionBasedAssemblyAccessor);
137 46426dbd Panagiotis Kanavos
138 46426dbd Panagiotis Kanavos
            if (accessor.AssemblyCompany == null || accessor.AssemblyCompany.Length == 0 ||
139 46426dbd Panagiotis Kanavos
                    accessor.AssemblyProduct == null || accessor.AssemblyProduct.Length == 0)
140 46426dbd Panagiotis Kanavos
                throw new Exception("STOP: Sparkle is missing the company or productname tag in " + _referenceAssembly);
141 46426dbd Panagiotis Kanavos
            
142 46426dbd Panagiotis Kanavos
            return "Software\\" + accessor.AssemblyCompany + "\\" + accessor.AssemblyProduct + "\\AutoUpdate";
143 46426dbd Panagiotis Kanavos
        }
144 46426dbd Panagiotis Kanavos
145 46426dbd Panagiotis Kanavos
        /// <summary>
146 46426dbd Panagiotis Kanavos
        /// This method set's default values for the config
147 46426dbd Panagiotis Kanavos
        /// </summary>
148 46426dbd Panagiotis Kanavos
        private void InitWithDefaultValues()
149 46426dbd Panagiotis Kanavos
        {
150 46426dbd Panagiotis Kanavos
            CheckForUpdate = true;
151 46426dbd Panagiotis Kanavos
            LastCheckTime = new DateTime(0);
152 46426dbd Panagiotis Kanavos
            SkipThisVersion = String.Empty;
153 46426dbd Panagiotis Kanavos
            DidRunOnce = false;
154 46426dbd Panagiotis Kanavos
            UseReflectionBasedAssemblyAccessor = true;
155 46426dbd Panagiotis Kanavos
        }
156 46426dbd Panagiotis Kanavos
157 46426dbd Panagiotis Kanavos
        /// <summary>
158 46426dbd Panagiotis Kanavos
        /// This method loads the values from registry
159 46426dbd Panagiotis Kanavos
        /// </summary>
160 46426dbd Panagiotis Kanavos
        /// <param name="regPath"></param>
161 46426dbd Panagiotis Kanavos
        /// <returns></returns>
162 46426dbd Panagiotis Kanavos
        private Boolean LoadValuesFromPath(String regPath)
163 46426dbd Panagiotis Kanavos
        {
164 46426dbd Panagiotis Kanavos
            RegistryKey key = Registry.CurrentUser.OpenSubKey(regPath);
165 46426dbd Panagiotis Kanavos
            if (key == null)
166 46426dbd Panagiotis Kanavos
                return false;
167 46426dbd Panagiotis Kanavos
            else
168 46426dbd Panagiotis Kanavos
            {                
169 46426dbd Panagiotis Kanavos
                // read out                
170 46426dbd Panagiotis Kanavos
                String strCheckForUpdate = key.GetValue("CheckForUpdate", "True") as String;
171 46426dbd Panagiotis Kanavos
                String strLastCheckTime = key.GetValue("LastCheckTime", new DateTime(0).ToString()) as String;
172 46426dbd Panagiotis Kanavos
                String strSkipThisVersion = key.GetValue("SkipThisVersion", "") as String;                
173 46426dbd Panagiotis Kanavos
                String strDidRunOnc = key.GetValue("DidRunOnce", "False") as String;
174 46426dbd Panagiotis Kanavos
                String strShowDiagnosticWindow = key.GetValue("ShowDiagnosticWindow", "False") as String;
175 46426dbd Panagiotis Kanavos
                String strProfileTime = key.GetValue("LastProfileUpdate", new DateTime(0).ToString()) as String;                
176 46426dbd Panagiotis Kanavos
177 46426dbd Panagiotis Kanavos
                // convert th right datatypes
178 46426dbd Panagiotis Kanavos
                CheckForUpdate = Convert.ToBoolean(strCheckForUpdate);
179 46426dbd Panagiotis Kanavos
                LastCheckTime = Convert.ToDateTime(strLastCheckTime);
180 46426dbd Panagiotis Kanavos
                SkipThisVersion = strSkipThisVersion;
181 46426dbd Panagiotis Kanavos
                DidRunOnce = Convert.ToBoolean(strDidRunOnc);
182 46426dbd Panagiotis Kanavos
                ShowDiagnosticWindow = Convert.ToBoolean(strShowDiagnosticWindow);
183 46426dbd Panagiotis Kanavos
                LastProfileUpdate = Convert.ToDateTime(strProfileTime);                
184 46426dbd Panagiotis Kanavos
                return true;
185 46426dbd Panagiotis Kanavos
            }
186 46426dbd Panagiotis Kanavos
        }
187 46426dbd Panagiotis Kanavos
188 46426dbd Panagiotis Kanavos
        /// <summary>
189 46426dbd Panagiotis Kanavos
        /// This method store the information into registry
190 46426dbd Panagiotis Kanavos
        /// </summary>
191 46426dbd Panagiotis Kanavos
        /// <param name="regPath"></param>
192 46426dbd Panagiotis Kanavos
        /// <returns></returns>
193 46426dbd Panagiotis Kanavos
        private Boolean SaveValuesToPath(String regPath)
194 46426dbd Panagiotis Kanavos
        {
195 46426dbd Panagiotis Kanavos
            RegistryKey key = Registry.CurrentUser.CreateSubKey(regPath);
196 46426dbd Panagiotis Kanavos
            if (key == null)
197 46426dbd Panagiotis Kanavos
                return false;
198 46426dbd Panagiotis Kanavos
            else
199 46426dbd Panagiotis Kanavos
            {
200 46426dbd Panagiotis Kanavos
                // convert to regsz
201 46426dbd Panagiotis Kanavos
                String strCheckForUpdate    = CheckForUpdate.ToString();
202 46426dbd Panagiotis Kanavos
                String strLastCheckTime     = LastCheckTime.ToString();
203 46426dbd Panagiotis Kanavos
                String strSkipThisVersion   = SkipThisVersion.ToString();
204 46426dbd Panagiotis Kanavos
                String strDidRunOnc         = DidRunOnce.ToString();
205 46426dbd Panagiotis Kanavos
                String strProfileTime       = LastProfileUpdate.ToString();                
206 46426dbd Panagiotis Kanavos
207 46426dbd Panagiotis Kanavos
                // set the values
208 46426dbd Panagiotis Kanavos
                key.SetValue("CheckForUpdate", strCheckForUpdate, RegistryValueKind.String);
209 46426dbd Panagiotis Kanavos
                key.SetValue("LastCheckTime", strLastCheckTime, RegistryValueKind.String);
210 46426dbd Panagiotis Kanavos
                key.SetValue("SkipThisVersion", strSkipThisVersion, RegistryValueKind.String);
211 46426dbd Panagiotis Kanavos
                key.SetValue("DidRunOnce", strDidRunOnc, RegistryValueKind.String);
212 46426dbd Panagiotis Kanavos
                key.SetValue("LastProfileUpdate", strProfileTime, RegistryValueKind.String);                
213 46426dbd Panagiotis Kanavos
214 46426dbd Panagiotis Kanavos
                return true;
215 46426dbd Panagiotis Kanavos
            }
216 46426dbd Panagiotis Kanavos
        }
217 46426dbd Panagiotis Kanavos
218 46426dbd Panagiotis Kanavos
    }
219 46426dbd Panagiotis Kanavos
}