Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / Preferences / PreferencesViewModel.cs @ 2f5fcd2f

History | View | Annotate | Download (29.9 kB)

1 d31e609c Panagiotis Kanavos
#region
2 d31e609c Panagiotis Kanavos
/* -----------------------------------------------------------------------
3 d31e609c Panagiotis Kanavos
 * <copyright file="PreferencesViewModel.cs" company="GRNet">
4 d31e609c Panagiotis Kanavos
 * 
5 d31e609c Panagiotis Kanavos
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6 d31e609c Panagiotis Kanavos
 *
7 d31e609c Panagiotis Kanavos
 * Redistribution and use in source and binary forms, with or
8 d31e609c Panagiotis Kanavos
 * without modification, are permitted provided that the following
9 d31e609c Panagiotis Kanavos
 * conditions are met:
10 d31e609c Panagiotis Kanavos
 *
11 d31e609c Panagiotis Kanavos
 *   1. Redistributions of source code must retain the above
12 d31e609c Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
13 d31e609c Panagiotis Kanavos
 *      disclaimer.
14 d31e609c Panagiotis Kanavos
 *
15 d31e609c Panagiotis Kanavos
 *   2. Redistributions in binary form must reproduce the above
16 d31e609c Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
17 d31e609c Panagiotis Kanavos
 *      disclaimer in the documentation and/or other materials
18 d31e609c Panagiotis Kanavos
 *      provided with the distribution.
19 d31e609c Panagiotis Kanavos
 *
20 d31e609c Panagiotis Kanavos
 *
21 d31e609c Panagiotis Kanavos
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 d31e609c Panagiotis Kanavos
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 d31e609c Panagiotis Kanavos
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 d31e609c Panagiotis Kanavos
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 d31e609c Panagiotis Kanavos
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 d31e609c Panagiotis Kanavos
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 d31e609c Panagiotis Kanavos
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 d31e609c Panagiotis Kanavos
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 d31e609c Panagiotis Kanavos
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 d31e609c Panagiotis Kanavos
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 d31e609c Panagiotis Kanavos
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 d31e609c Panagiotis Kanavos
 * POSSIBILITY OF SUCH DAMAGE.
33 d31e609c Panagiotis Kanavos
 *
34 d31e609c Panagiotis Kanavos
 * The views and conclusions contained in the software and
35 d31e609c Panagiotis Kanavos
 * documentation are those of the authors and should not be
36 d31e609c Panagiotis Kanavos
 * interpreted as representing official policies, either expressed
37 d31e609c Panagiotis Kanavos
 * or implied, of GRNET S.A.
38 d31e609c Panagiotis Kanavos
 * </copyright>
39 d31e609c Panagiotis Kanavos
 * -----------------------------------------------------------------------
40 d31e609c Panagiotis Kanavos
 */
41 d31e609c Panagiotis Kanavos
#endregion
42 d31e609c Panagiotis Kanavos
43 d31e609c Panagiotis Kanavos
44 d31e609c Panagiotis Kanavos
using System.Collections.Concurrent;
45 d31e609c Panagiotis Kanavos
using System.Collections.Generic;
46 d31e609c Panagiotis Kanavos
using System.Collections.Specialized;
47 d31e609c Panagiotis Kanavos
using System.ComponentModel.Composition;
48 d31e609c Panagiotis Kanavos
using System.Diagnostics;
49 d31e609c Panagiotis Kanavos
using System.IO;
50 d31e609c Panagiotis Kanavos
using System.Net;
51 d31e609c Panagiotis Kanavos
using System.Reflection;
52 d31e609c Panagiotis Kanavos
using System.Threading.Tasks;
53 d31e609c Panagiotis Kanavos
using System.Windows;
54 d31e609c Panagiotis Kanavos
using System.Windows.Forms;
55 d31e609c Panagiotis Kanavos
using Caliburn.Micro;
56 d31e609c Panagiotis Kanavos
using Pithos.Client.WPF.Configuration;
57 d31e609c Panagiotis Kanavos
using Pithos.Client.WPF.Properties;
58 d31e609c Panagiotis Kanavos
using Pithos.Client.WPF.SelectiveSynch;
59 d31e609c Panagiotis Kanavos
using Pithos.Client.WPF.Utils;
60 d31e609c Panagiotis Kanavos
using Pithos.Core;
61 368e06fd pkanavos
using Pithos.Core.Agents;
62 d31e609c Panagiotis Kanavos
using Pithos.Interfaces;
63 d31e609c Panagiotis Kanavos
using System;
64 d31e609c Panagiotis Kanavos
using System.Linq;
65 d31e609c Panagiotis Kanavos
using Pithos.Network;
66 d31e609c Panagiotis Kanavos
using MessageBox = System.Windows.MessageBox;
67 d31e609c Panagiotis Kanavos
using Screen = Caliburn.Micro.Screen;
68 d31e609c Panagiotis Kanavos
69 d31e609c Panagiotis Kanavos
namespace Pithos.Client.WPF.Preferences
70 d31e609c Panagiotis Kanavos
{
71 d31e609c Panagiotis Kanavos
    /// <summary>
72 d31e609c Panagiotis Kanavos
    /// The preferences screen displays user and account settings and updates the PithosMonitor
73 d31e609c Panagiotis Kanavos
    /// classes when account settings change.
74 d31e609c Panagiotis Kanavos
    /// </summary>
75 d31e609c Panagiotis Kanavos
    /// <remarks>
76 d31e609c Panagiotis Kanavos
    /// The class is a single ViewModel for all Preferences tabs. It can be broken in separate
77 d31e609c Panagiotis Kanavos
    /// ViewModels, one for each tab.
78 d31e609c Panagiotis Kanavos
    /// </remarks>
79 d31e609c Panagiotis Kanavos
    [Export, PartCreationPolicy(CreationPolicy.Shared)]
80 d31e609c Panagiotis Kanavos
    public class PreferencesViewModel : Screen
81 d31e609c Panagiotis Kanavos
    {
82 d31e609c Panagiotis Kanavos
        private readonly IEventAggregator _events;
83 d31e609c Panagiotis Kanavos
84 d31e609c Panagiotis Kanavos
        //Logging in the Pithos client is provided by log4net
85 39de8b0f pkanavos
        private static readonly log4net.ILog Log =
86 39de8b0f pkanavos
            log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
87 d31e609c Panagiotis Kanavos
88 d31e609c Panagiotis Kanavos
        private PithosSettings _settings;
89 39de8b0f pkanavos
90 d31e609c Panagiotis Kanavos
        public PithosSettings Settings
91 d31e609c Panagiotis Kanavos
        {
92 d31e609c Panagiotis Kanavos
            get { return _settings; }
93 d31e609c Panagiotis Kanavos
            set
94 d31e609c Panagiotis Kanavos
            {
95 d31e609c Panagiotis Kanavos
                _settings = value;
96 39de8b0f pkanavos
                NotifyOfPropertyChange(() => Settings);
97 d31e609c Panagiotis Kanavos
            }
98 d31e609c Panagiotis Kanavos
        }
99 d31e609c Panagiotis Kanavos
100 d31e609c Panagiotis Kanavos
        private ObservableConcurrentCollection<AccountViewModel> _accounts;
101 39de8b0f pkanavos
102 d31e609c Panagiotis Kanavos
        public ObservableConcurrentCollection<AccountViewModel> Accounts
103 d31e609c Panagiotis Kanavos
        {
104 d31e609c Panagiotis Kanavos
            get { return _accounts; }
105 39de8b0f pkanavos
            set
106 39de8b0f pkanavos
            {
107 d31e609c Panagiotis Kanavos
                _accounts = value;
108 39de8b0f pkanavos
                NotifyOfPropertyChange(() => Accounts);
109 d31e609c Panagiotis Kanavos
            }
110 d31e609c Panagiotis Kanavos
        }
111 39de8b0f pkanavos
112 d31e609c Panagiotis Kanavos
        public bool StartOnSystemStartup { get; set; }
113 d31e609c Panagiotis Kanavos
114 39de8b0f pkanavos
        public ShellViewModel Shell { get; set; }
115 d31e609c Panagiotis Kanavos
        //ShellExtensionController _extensionController=new ShellExtensionController();
116 d31e609c Panagiotis Kanavos
117 37ff7dc9 pkanavos
        [ImportingConstructor]
118 39de8b0f pkanavos
        public PreferencesViewModel(IWindowManager windowManager, IEventAggregator events, ShellViewModel shell,
119 39de8b0f pkanavos
                                    PithosSettings settings)
120 37ff7dc9 pkanavos
        {
121 136e9eff pkanavos
            this.DisplayName = "Pithos+ Preferences";
122 37ff7dc9 pkanavos
123 d31e609c Panagiotis Kanavos
            // ReSharper disable DoNotCallOverridableMethodsInConstructor
124 d31e609c Panagiotis Kanavos
            //Caliburn.Micro uses DisplayName for the view's title
125 d31e609c Panagiotis Kanavos
            DisplayName = "Pithos+ Preferences";
126 d31e609c Panagiotis Kanavos
            // ReSharper restore DoNotCallOverridableMethodsInConstructor
127 d31e609c Panagiotis Kanavos
128 d31e609c Panagiotis Kanavos
            _windowManager = windowManager;
129 d31e609c Panagiotis Kanavos
            _events = events;
130 d31e609c Panagiotis Kanavos
131 d31e609c Panagiotis Kanavos
            Shell = shell;
132 39de8b0f pkanavos
133 39de8b0f pkanavos
            Settings = settings;
134 d31e609c Panagiotis Kanavos
            Accounts = new ObservableConcurrentCollection<AccountViewModel>();
135 39de8b0f pkanavos
136 39de8b0f pkanavos
137 d31e609c Panagiotis Kanavos
            var startupPath = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
138 d31e609c Panagiotis Kanavos
            _shortcutPath = Path.Combine(startupPath, "Pithos.lnk");
139 d31e609c Panagiotis Kanavos
140 d31e609c Panagiotis Kanavos
141 d31e609c Panagiotis Kanavos
            StartOnSystemStartup = File.Exists(_shortcutPath);
142 d31e609c Panagiotis Kanavos
143 f4f39ccb pkanavos
            //SelectedTab = currentTab;
144 f4f39ccb pkanavos
        }
145 f4f39ccb pkanavos
146 f4f39ccb pkanavos
        protected override void OnViewLoaded(object view)
147 f4f39ccb pkanavos
        {
148 f4f39ccb pkanavos
            base.OnViewLoaded(view);
149 dd5f5163 pkanavos
150 f4f39ccb pkanavos
            Settings.Reload();
151 dd5f5163 pkanavos
152 f4f39ccb pkanavos
            Accounts.Clear();
153 f4f39ccb pkanavos
154 f4f39ccb pkanavos
            if (Settings.Accounts == null)
155 f4f39ccb pkanavos
            {
156 f4f39ccb pkanavos
                Settings.Accounts = new AccountsCollection();
157 f4f39ccb pkanavos
                Settings.Save();
158 f4f39ccb pkanavos
            }
159 f4f39ccb pkanavos
            var accountVMs = from account in Settings.Accounts
160 f4f39ccb pkanavos
                             select new AccountViewModel(account);
161 f4f39ccb pkanavos
162 f4f39ccb pkanavos
            Accounts.AddFromEnumerable(accountVMs);
163 adf0deca pkanavos
            if (Accounts.Count > 0)
164 adf0deca pkanavos
                CurrentAccount = Accounts.First();
165 dd5f5163 pkanavos
166 d31e609c Panagiotis Kanavos
        }
167 d31e609c Panagiotis Kanavos
168 39de8b0f pkanavos
        private string _selectedTab = "General";
169 39de8b0f pkanavos
170 d31e609c Panagiotis Kanavos
        public string SelectedTab
171 d31e609c Panagiotis Kanavos
        {
172 d31e609c Panagiotis Kanavos
            get { return _selectedTab; }
173 d31e609c Panagiotis Kanavos
            set
174 d31e609c Panagiotis Kanavos
            {
175 39de8b0f pkanavos
                _selectedTab = value ?? "GeneralTab";
176 39de8b0f pkanavos
                NotifyOfPropertyChange(() => SelectedTab);
177 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => AccountTabSelected);
178 d31e609c Panagiotis Kanavos
            }
179 d31e609c Panagiotis Kanavos
        }
180 d31e609c Panagiotis Kanavos
181 d31e609c Panagiotis Kanavos
182 d31e609c Panagiotis Kanavos
        public bool AccountTabSelected
183 d31e609c Panagiotis Kanavos
        {
184 d31e609c Panagiotis Kanavos
            get { return _selectedTab == "AccountTab"; }
185 d31e609c Panagiotis Kanavos
        }
186 39de8b0f pkanavos
187 d31e609c Panagiotis Kanavos
        #region Preferences Properties
188 d31e609c Panagiotis Kanavos
189 d31e609c Panagiotis Kanavos
        private bool _noProxy;
190 39de8b0f pkanavos
191 d31e609c Panagiotis Kanavos
        public bool NoProxy
192 d31e609c Panagiotis Kanavos
        {
193 d31e609c Panagiotis Kanavos
            get { return _noProxy; }
194 d31e609c Panagiotis Kanavos
            set
195 d31e609c Panagiotis Kanavos
            {
196 d31e609c Panagiotis Kanavos
                _noProxy = value;
197 39de8b0f pkanavos
                NotifyOfPropertyChange(() => NoProxy);
198 d31e609c Panagiotis Kanavos
            }
199 d31e609c Panagiotis Kanavos
        }
200 d31e609c Panagiotis Kanavos
201 d31e609c Panagiotis Kanavos
202 d31e609c Panagiotis Kanavos
        private bool _defaultProxy;
203 d31e609c Panagiotis Kanavos
204 d31e609c Panagiotis Kanavos
        public bool DefaultProxy
205 d31e609c Panagiotis Kanavos
        {
206 d31e609c Panagiotis Kanavos
            get { return _defaultProxy; }
207 d31e609c Panagiotis Kanavos
            set
208 d31e609c Panagiotis Kanavos
            {
209 d31e609c Panagiotis Kanavos
                _defaultProxy = value;
210 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => DefaultProxy);
211 d31e609c Panagiotis Kanavos
            }
212 d31e609c Panagiotis Kanavos
        }
213 d31e609c Panagiotis Kanavos
214 d31e609c Panagiotis Kanavos
215 d31e609c Panagiotis Kanavos
        private bool _manualProxy;
216 d31e609c Panagiotis Kanavos
217 d31e609c Panagiotis Kanavos
        public bool ManualProxy
218 d31e609c Panagiotis Kanavos
        {
219 d31e609c Panagiotis Kanavos
            get { return _manualProxy; }
220 d31e609c Panagiotis Kanavos
            set
221 d31e609c Panagiotis Kanavos
            {
222 d31e609c Panagiotis Kanavos
                _manualProxy = value;
223 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => ManualProxy);
224 d31e609c Panagiotis Kanavos
            }
225 d31e609c Panagiotis Kanavos
        }
226 39de8b0f pkanavos
227 d31e609c Panagiotis Kanavos
        #endregion
228 d31e609c Panagiotis Kanavos
229 d31e609c Panagiotis Kanavos
230 d31e609c Panagiotis Kanavos
        public int StartupDelay
231 d31e609c Panagiotis Kanavos
        {
232 d31e609c Panagiotis Kanavos
            get { return (int) Settings.StartupDelay.TotalMinutes; }
233 d31e609c Panagiotis Kanavos
            set
234 d31e609c Panagiotis Kanavos
            {
235 39de8b0f pkanavos
                if (value < 0)
236 39de8b0f pkanavos
                    throw new ArgumentOutOfRangeException("value",
237 39de8b0f pkanavos
                                                          Resources.
238 39de8b0f pkanavos
                                                              PreferencesViewModel_StartupDelay_Greater_or_equal_to_0);
239 d31e609c Panagiotis Kanavos
                Settings.StartupDelay = TimeSpan.FromMinutes(value);
240 39de8b0f pkanavos
                NotifyOfPropertyChange(() => StartupDelay);
241 d31e609c Panagiotis Kanavos
            }
242 d31e609c Panagiotis Kanavos
        }
243 39de8b0f pkanavos
244 d31e609c Panagiotis Kanavos
        #region Commands
245 39de8b0f pkanavos
246 d31e609c Panagiotis Kanavos
        public bool CanSelectiveSyncFolders
247 d31e609c Panagiotis Kanavos
        {
248 eb81e47d pkanavos
            get { return CurrentAccount != null && CurrentAccount.SelectiveSyncEnabled; }
249 d31e609c Panagiotis Kanavos
        }
250 d31e609c Panagiotis Kanavos
251 d31e609c Panagiotis Kanavos
        public void SelectiveSyncFolders()
252 d31e609c Panagiotis Kanavos
        {
253 d31e609c Panagiotis Kanavos
            //var monitor = Shell.Monitors[CurrentAccount.AccountKey];
254 39de8b0f pkanavos
255 39de8b0f pkanavos
256 39de8b0f pkanavos
            var model = new SelectiveSynchViewModel(_events, CurrentAccount.Account, CurrentAccount.ApiKey, false);
257 d31e609c Panagiotis Kanavos
            if (_windowManager.ShowDialog(model) == true)
258 d31e609c Panagiotis Kanavos
            {
259 39de8b0f pkanavos
260 d31e609c Panagiotis Kanavos
            }
261 d31e609c Panagiotis Kanavos
        }
262 d31e609c Panagiotis Kanavos
263 39de8b0f pkanavos
        /* private bool _networkTracing;
264 d31e609c Panagiotis Kanavos
        public bool NetworkTracing
265 d31e609c Panagiotis Kanavos
        {
266 d31e609c Panagiotis Kanavos
            get { return _networkTracing; }
267 d31e609c Panagiotis Kanavos
            set
268 d31e609c Panagiotis Kanavos
            {
269 d31e609c Panagiotis Kanavos
                _networkTracing = value;
270 d31e609c Panagiotis Kanavos
                
271 d31e609c Panagiotis Kanavos
            }
272 d31e609c Panagiotis Kanavos
        }*/
273 d31e609c Panagiotis Kanavos
274 d31e609c Panagiotis Kanavos
        public void RefreshApiKey()
275 d31e609c Panagiotis Kanavos
        {
276 d31e609c Panagiotis Kanavos
            //_events.Publish(new Notification { Title = "Authorization failed", Message = "Your API Key has probably expired. You will be directed to a page where you can renew it", Level = TraceLevel.Error });
277 d31e609c Panagiotis Kanavos
            if (CurrentAccount == null)
278 d31e609c Panagiotis Kanavos
                return;
279 d31e609c Panagiotis Kanavos
            try
280 d31e609c Panagiotis Kanavos
            {
281 d31e609c Panagiotis Kanavos
282 d31e609c Panagiotis Kanavos
                var name = CurrentAccount.AccountName;
283 d31e609c Panagiotis Kanavos
284 2f5fcd2f pkanavos
                var loginUri = PithosAccount.GetLoginUri(CurrentAccount.ServerUrl);
285 39de8b0f pkanavos
                var credentials = PithosAccount.RetrieveCredentials(loginUri.ToString(), name);
286 39de8b0f pkanavos
                if (credentials == null)
287 d31e609c Panagiotis Kanavos
                    return;
288 d31e609c Panagiotis Kanavos
                //The server will return credentials for a different account, not just the current account
289 d31e609c Panagiotis Kanavos
                //We need to find the correct account first
290 c87a1e4f pkanavos
                AccountViewModel account=null;
291 c87a1e4f pkanavos
                Guid token;
292 c87a1e4f pkanavos
                if (Guid.TryParse(name, out token))
293 c87a1e4f pkanavos
                {
294 c87a1e4f pkanavos
                    account =
295 c87a1e4f pkanavos
                        Accounts.First(
296 c87a1e4f pkanavos
                            act => act.AccountName == credentials.UserName && act.ServerUrl == CurrentAccount.ServerUrl);
297 c87a1e4f pkanavos
                }
298 c87a1e4f pkanavos
                else
299 c87a1e4f pkanavos
                {
300 c87a1e4f pkanavos
                    account =
301 c87a1e4f pkanavos
                        Accounts.First(
302 c87a1e4f pkanavos
                            act => act.AccountName == name && act.ServerUrl == CurrentAccount.ServerUrl);
303 c87a1e4f pkanavos
                    account.AccountName = credentials.UserName;
304 c3a4add4 pkanavos
                    account.DisplayName = name;
305 b8946a24 pkanavos
                    Shell.RemoveMonitor(account.ServerUrl,name);
306 b8946a24 pkanavos
                    CurrentAccount.AccountName = credentials.UserName;
307 b8946a24 pkanavos
                    CurrentAccount.DisplayName = name;
308 b8946a24 pkanavos
                    Shell.MonitorAccount(account.Account);
309 c87a1e4f pkanavos
                }
310 39de8b0f pkanavos
                account.ApiKey = credentials.Password;
311 d31e609c Panagiotis Kanavos
                account.IsExpired = false;
312 d31e609c Panagiotis Kanavos
                Settings.Save();
313 39de8b0f pkanavos
                TaskEx.Delay(10000).ContinueWith(_ => Shell.MonitorAccount(account.Account));
314 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => Accounts);
315 d31e609c Panagiotis Kanavos
            }
316 d31e609c Panagiotis Kanavos
            catch (AggregateException exc)
317 d31e609c Panagiotis Kanavos
            {
318 d31e609c Panagiotis Kanavos
                string message = String.Format("API Key retrieval failed");
319 d31e609c Panagiotis Kanavos
                Log.Error(message, exc.InnerException);
320 39de8b0f pkanavos
                _events.Publish(new Notification
321 39de8b0f pkanavos
                                    {Title = "Authorization failed", Message = message, Level = TraceLevel.Error});
322 d31e609c Panagiotis Kanavos
            }
323 d31e609c Panagiotis Kanavos
            catch (Exception exc)
324 d31e609c Panagiotis Kanavos
            {
325 d31e609c Panagiotis Kanavos
                string message = String.Format("API Key retrieval failed");
326 d31e609c Panagiotis Kanavos
                Log.Error(message, exc);
327 39de8b0f pkanavos
                _events.Publish(new Notification
328 39de8b0f pkanavos
                                    {Title = "Authorization failed", Message = message, Level = TraceLevel.Error});
329 d31e609c Panagiotis Kanavos
            }
330 d31e609c Panagiotis Kanavos
331 d31e609c Panagiotis Kanavos
        }
332 d31e609c Panagiotis Kanavos
333 dc18b138 pkanavos
        public bool CanWipeAccount
334 0e2b2c19 George Pantazis
        {
335 9ad59de3 pkanavos
            get { return CurrentAccount != null 
336 9ad59de3 pkanavos
                && Shell.Monitors.ContainsKey(CurrentAccount.AccountKey)
337 9ad59de3 pkanavos
                && Shell.Monitors[CurrentAccount.AccountKey].CloudClient!=null;
338 9ad59de3 pkanavos
            }
339 dc18b138 pkanavos
        }
340 39de8b0f pkanavos
341 dc18b138 pkanavos
        public async void WipeAccount()
342 dc18b138 pkanavos
        {
343 9ad59de3 pkanavos
            PithosMonitor aMonitor;
344 9ad59de3 pkanavos
            if (Shell.Monitors.TryGetValue(CurrentAccount.AccountKey, out aMonitor))
345 dc18b138 pkanavos
            {
346 9ad59de3 pkanavos
                if (aMonitor.CloudClient == null)
347 9ad59de3 pkanavos
                {
348 9ad59de3 pkanavos
                    Log.ErrorFormat("Tried to wipe account [{0}] before authenticating",CurrentAccount.AccountKey);
349 9ad59de3 pkanavos
                    return;
350 9ad59de3 pkanavos
                }
351 dc18b138 pkanavos
                var message = String.Format("You are about to wipe all data in the {0} account at {1}. Are you sure?",
352 9ad59de3 pkanavos
                                            CurrentAccount.AccountName, CurrentAccount.ServerUrl);
353 39de8b0f pkanavos
                if (MessageBoxResult.Yes !=
354 39de8b0f pkanavos
                    MessageBox.Show(message, "Warning! Account data will be wiped", MessageBoxButton.YesNo,
355 39de8b0f pkanavos
                                    MessageBoxImage.Hand, MessageBoxResult.No))
356 9ad59de3 pkanavos
                    return;      
357 9ad59de3 pkanavos
                          
358 9ad59de3 pkanavos
                await aMonitor.CloudClient.WipeContainer("", new Uri("pithos", UriKind.Relative));
359 9ad59de3 pkanavos
                aMonitor.Stop();
360 adf0deca pkanavos
                await aMonitor.Start();
361 dc18b138 pkanavos
                MessageBox.Show("Account wiped");
362 dc18b138 pkanavos
            }
363 0e2b2c19 George Pantazis
        }
364 0e2b2c19 George Pantazis
365 39de8b0f pkanavos
366 d31e609c Panagiotis Kanavos
        public void OpenLogPath()
367 d31e609c Panagiotis Kanavos
        {
368 d31e609c Panagiotis Kanavos
            Shell.OpenLogPath();
369 d31e609c Panagiotis Kanavos
        }
370 d31e609c Panagiotis Kanavos
371 d31e609c Panagiotis Kanavos
        public void OpenLogConsole()
372 d31e609c Panagiotis Kanavos
        {
373 39de8b0f pkanavos
            var logView = IoC.Get<LogConsole.LogConsoleViewModel>();
374 d31e609c Panagiotis Kanavos
            _windowManager.ShowWindow(logView);
375 d31e609c Panagiotis Kanavos
        }
376 d31e609c Panagiotis Kanavos
377 d31e609c Panagiotis Kanavos
        public void SaveChanges()
378 d31e609c Panagiotis Kanavos
        {
379 d31e609c Panagiotis Kanavos
            DoSave();
380 39de8b0f pkanavos
            TryClose( /*true*/);
381 d31e609c Panagiotis Kanavos
        }
382 d31e609c Panagiotis Kanavos
383 d31e609c Panagiotis Kanavos
        public void RejectChanges()
384 d31e609c Panagiotis Kanavos
        {
385 d31e609c Panagiotis Kanavos
            Settings.Reload();
386 39de8b0f pkanavos
            TryClose( /*false*/);
387 d31e609c Panagiotis Kanavos
        }
388 d31e609c Panagiotis Kanavos
389 d31e609c Panagiotis Kanavos
        public void ApplyChanges()
390 d31e609c Panagiotis Kanavos
        {
391 d31e609c Panagiotis Kanavos
            DoSave();
392 d31e609c Panagiotis Kanavos
        }
393 d31e609c Panagiotis Kanavos
394 d31e609c Panagiotis Kanavos
        private void DoSave()
395 d31e609c Panagiotis Kanavos
        {
396 d31e609c Panagiotis Kanavos
            //SetStartupMode();            
397 d31e609c Panagiotis Kanavos
398 d31e609c Panagiotis Kanavos
            //Ensure we save the settings changes first
399 d31e609c Panagiotis Kanavos
            foreach (var account in _accountsToRemove)
400 d31e609c Panagiotis Kanavos
            {
401 d31e609c Panagiotis Kanavos
                Settings.Accounts.Remove(account);
402 d31e609c Panagiotis Kanavos
            }
403 d31e609c Panagiotis Kanavos
404 d31e609c Panagiotis Kanavos
            foreach (var account in _accountsToAdd)
405 d31e609c Panagiotis Kanavos
            {
406 39de8b0f pkanavos
                Settings.Accounts.Add(account);
407 d31e609c Panagiotis Kanavos
            }
408 d31e609c Panagiotis Kanavos
409 d31e609c Panagiotis Kanavos
            Settings.Save();
410 d31e609c Panagiotis Kanavos
411 d31e609c Panagiotis Kanavos
412 d31e609c Panagiotis Kanavos
            try
413 d31e609c Panagiotis Kanavos
            {
414 d31e609c Panagiotis Kanavos
                foreach (var account in _accountsToRemove)
415 d31e609c Panagiotis Kanavos
                {
416 d31e609c Panagiotis Kanavos
                    Shell.RemoveMonitor(account.ServerUrl, account.AccountName);
417 d31e609c Panagiotis Kanavos
                    Shell.RemoveAccountFromDatabase(account);
418 d31e609c Panagiotis Kanavos
                }
419 d31e609c Panagiotis Kanavos
420 d31e609c Panagiotis Kanavos
                foreach (var account in Settings.Accounts)
421 d31e609c Panagiotis Kanavos
                {
422 d31e609c Panagiotis Kanavos
                    Shell.MonitorAccount(account);
423 d31e609c Panagiotis Kanavos
                }
424 368e06fd pkanavos
425 39de8b0f pkanavos
                var poller = IoC.Get<PollAgent>();
426 368e06fd pkanavos
                poller.SynchNow();
427 39de8b0f pkanavos
            }
428 d31e609c Panagiotis Kanavos
            finally
429 d31e609c Panagiotis Kanavos
            {
430 d31e609c Panagiotis Kanavos
                _accountsToRemove.Clear();
431 d31e609c Panagiotis Kanavos
                _accountsToAdd.Clear();
432 d31e609c Panagiotis Kanavos
            }
433 d31e609c Panagiotis Kanavos
434 39de8b0f pkanavos
            NotifyOfPropertyChange(() => Settings);
435 d31e609c Panagiotis Kanavos
436 d31e609c Panagiotis Kanavos
            if (IgnoreCertificateErrors)
437 39de8b0f pkanavos
                ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
438 d31e609c Panagiotis Kanavos
            else
439 d31e609c Panagiotis Kanavos
            {
440 d31e609c Panagiotis Kanavos
                ServicePointManager.ServerCertificateValidationCallback = null;
441 d31e609c Panagiotis Kanavos
            }
442 d31e609c Panagiotis Kanavos
        }
443 d31e609c Panagiotis Kanavos
444 39de8b0f pkanavos
        /*   public void ChangePithosFolder()
445 d31e609c Panagiotis Kanavos
        {
446 d31e609c Panagiotis Kanavos
            var browser = new FolderBrowserDialog();
447 d31e609c Panagiotis Kanavos
            browser.SelectedPath = Settings.PithosPath;
448 d31e609c Panagiotis Kanavos
            var result = browser.ShowDialog((IWin32Window)GetView());
449 d31e609c Panagiotis Kanavos
            if (result == DialogResult.OK)
450 d31e609c Panagiotis Kanavos
            {
451 d31e609c Panagiotis Kanavos
                var newPath = browser.SelectedPath;
452 d31e609c Panagiotis Kanavos
                var accountName = CurrentAccount.AccountName;
453 d31e609c Panagiotis Kanavos
                var monitor = Shell.Monitors[accountName];
454 d31e609c Panagiotis Kanavos
                monitor.Stop();
455 d31e609c Panagiotis Kanavos
                
456 d31e609c Panagiotis Kanavos
                Shell.Monitors.Remove(accountName);
457 d31e609c Panagiotis Kanavos
458 d31e609c Panagiotis Kanavos
                Directory.Move(Settings.PithosPath, newPath);
459 d31e609c Panagiotis Kanavos
                Settings.PithosPath = newPath;
460 d31e609c Panagiotis Kanavos
                Settings.Save();
461 d31e609c Panagiotis Kanavos
462 d31e609c Panagiotis Kanavos
                Shell.MonitorAccount(CurrentAccount);
463 d31e609c Panagiotis Kanavos
464 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => Settings);                
465 d31e609c Panagiotis Kanavos
            }
466 d31e609c Panagiotis Kanavos
        }
467 d31e609c Panagiotis Kanavos
*/
468 d31e609c Panagiotis Kanavos
469 d31e609c Panagiotis Kanavos
470 39de8b0f pkanavos
        private readonly List<AccountSettings> _accountsToAdd = new List<AccountSettings>();
471 d31e609c Panagiotis Kanavos
472 39de8b0f pkanavos
        public async void AddAccount()
473 39de8b0f pkanavos
        {
474 39de8b0f pkanavos
            var wizard = new AddAccountViewModel();
475 39de8b0f pkanavos
            if (_windowManager.ShowDialog(wizard) == true)
476 39de8b0f pkanavos
            {
477 39de8b0f pkanavos
                try
478 39de8b0f pkanavos
                {
479 39de8b0f pkanavos
                    string selectedPath = wizard.AccountPath;
480 39de8b0f pkanavos
                    var initialRootPath = wizard.ShouldCreateOkeanosFolder
481 ca94f0ec pkanavos
                                              ? Path.Combine(selectedPath, "okeanos")
482 39de8b0f pkanavos
                                              : selectedPath;
483 39de8b0f pkanavos
                    var actualRootPath = initialRootPath;
484 39de8b0f pkanavos
                    if (wizard.ShouldCreateOkeanosFolder)
485 39de8b0f pkanavos
                    {
486 39de8b0f pkanavos
                        int attempt = 1;
487 39de8b0f pkanavos
                        while (Directory.Exists(actualRootPath) || File.Exists(actualRootPath))
488 39de8b0f pkanavos
                        {
489 39de8b0f pkanavos
                            actualRootPath = String.Format("{0} {1}", initialRootPath, attempt++);
490 39de8b0f pkanavos
                        }
491 2475642e pkanavos
                        Directory.CreateDirectory(actualRootPath);
492 39de8b0f pkanavos
                    }
493 39de8b0f pkanavos
494 39de8b0f pkanavos
495 39de8b0f pkanavos
496 39de8b0f pkanavos
                    var account =
497 39de8b0f pkanavos
                        Accounts.FirstOrDefault(
498 39de8b0f pkanavos
                            act => act.AccountName == wizard.AccountName && act.ServerUrl == wizard.CurrentServer);
499 39de8b0f pkanavos
                    if (account != null)
500 39de8b0f pkanavos
                    {
501 39de8b0f pkanavos
                        if (
502 39de8b0f pkanavos
                            MessageBox.Show("The account you specified already exists. Do you want to update it?",
503 39de8b0f pkanavos
                                            "The account exists") == MessageBoxResult.Yes)
504 39de8b0f pkanavos
                        {
505 39de8b0f pkanavos
                            account.ApiKey = wizard.Token;
506 39de8b0f pkanavos
                            account.IsExpired = false;
507 39de8b0f pkanavos
                            CurrentAccount = account;
508 39de8b0f pkanavos
                        }
509 39de8b0f pkanavos
                    }
510 39de8b0f pkanavos
                    else
511 39de8b0f pkanavos
                    {
512 39de8b0f pkanavos
                        var newAccount = new AccountSettings
513 39de8b0f pkanavos
                                             {
514 39de8b0f pkanavos
                                                 AccountName = wizard.AccountName,
515 39de8b0f pkanavos
                                                 ServerUrl = wizard.CurrentServer,
516 39de8b0f pkanavos
                                                 ApiKey = wizard.Token,
517 39de8b0f pkanavos
                                                 RootPath = actualRootPath,
518 39de8b0f pkanavos
                                                 IsActive = wizard.IsAccountActive,
519 39de8b0f pkanavos
                                             };
520 39de8b0f pkanavos
521 854c715a pkanavos
                        
522 39de8b0f pkanavos
                        var client = new CloudFilesClient(newAccount.AccountName, newAccount.ApiKey)
523 39de8b0f pkanavos
                                         {
524 39de8b0f pkanavos
                                             AuthenticationUrl = newAccount.ServerUrl,
525 39de8b0f pkanavos
                                             UsePithos = true
526 39de8b0f pkanavos
                                         };
527 854c715a pkanavos
                        await client.Authenticate().ConfigureAwait(false);
528 39de8b0f pkanavos
529 854c715a pkanavos
                        Guid token;
530 854c715a pkanavos
                        if (Guid.TryParse(wizard.AccountName, out token))
531 854c715a pkanavos
                        {
532 854c715a pkanavos
                            newAccount.AccountToken = token;
533 c87a1e4f pkanavos
                            newAccount.DisplayName = await client.ResolveName(token).ConfigureAwait(false);    
534 854c715a pkanavos
                        }
535 854c715a pkanavos
536 854c715a pkanavos
                        
537 39de8b0f pkanavos
                        await InitializeSelectiveFolders(newAccount, client);
538 39de8b0f pkanavos
539 39de8b0f pkanavos
540 39de8b0f pkanavos
                        //TODO:Add the "pithos" container as a default selection                   
541 39de8b0f pkanavos
542 39de8b0f pkanavos
                        _accountsToAdd.Add(newAccount);
543 39de8b0f pkanavos
                        var accountVm = new AccountViewModel(newAccount);
544 39de8b0f pkanavos
                        (Accounts as IProducerConsumerCollection<AccountViewModel>).TryAdd(accountVm);
545 39de8b0f pkanavos
                        CurrentAccount = accountVm;
546 39de8b0f pkanavos
                    }
547 39de8b0f pkanavos
                    NotifyOfPropertyChange(() => Accounts);
548 39de8b0f pkanavos
                    NotifyOfPropertyChange(() => Settings);
549 39de8b0f pkanavos
                }
550 39de8b0f pkanavos
                catch (WebException exc)
551 39de8b0f pkanavos
                {
552 39de8b0f pkanavos
                    Log.ErrorFormat("[Add Account] Connectivity Error: {0}", exc);
553 39de8b0f pkanavos
                    MessageBox.Show("Unable to connect to Pithos. Please try again later", "Connectivity Error",
554 39de8b0f pkanavos
                                    MessageBoxButton.OK, MessageBoxImage.Exclamation);
555 39de8b0f pkanavos
                }
556 39de8b0f pkanavos
            }
557 39de8b0f pkanavos
558 39de8b0f pkanavos
559 39de8b0f pkanavos
560 39de8b0f pkanavos
        }
561 d31e609c Panagiotis Kanavos
562 39de8b0f pkanavos
        private async Task InitializeSelectiveFolders(AccountSettings newAccount, CloudFilesClient client,
563 39de8b0f pkanavos
                                                      int retries = 3)
564 8bbc337e pkanavos
        {
565 39de8b0f pkanavos
            while (true)
566 8bbc337e pkanavos
            {
567 5b2e4db4 pkanavos
                try
568 5b2e4db4 pkanavos
                {
569 854c715a pkanavos
                    
570 5b2e4db4 pkanavos
571 5b2e4db4 pkanavos
                    var containers = await client.ListContainers(newAccount.AccountName).ConfigureAwait(false);
572 5b2e4db4 pkanavos
                    var containerUris = from container in containers
573 5b2e4db4 pkanavos
                                        select String.Format(@"{0}/v1/{1}/{2}",
574 5b2e4db4 pkanavos
                                                             newAccount.ServerUrl, newAccount.AccountName,
575 5b2e4db4 pkanavos
                                                             container.Name);
576 854c715a pkanavos
                    lock (newAccount.SelectiveFolders)
577 854c715a pkanavos
                    {
578 854c715a pkanavos
                        newAccount.SelectiveFolders.AddRange(containerUris.ToArray());
579 854c715a pkanavos
                    }
580 5b2e4db4 pkanavos
581 5b2e4db4 pkanavos
                    var objectInfos = (from container in containers
582 5b2e4db4 pkanavos
                                       from dir in client.ListObjects(newAccount.AccountName, container.Name)
583 5b2e4db4 pkanavos
                                       where container.Name.ToString() != "trash"
584 5b2e4db4 pkanavos
                                       select dir).ToList();
585 5b2e4db4 pkanavos
                    var tree = objectInfos.ToTree();
586 5b2e4db4 pkanavos
587 5b2e4db4 pkanavos
                    var selected = (from root in tree
588 5b2e4db4 pkanavos
                                    from child in root
589 5b2e4db4 pkanavos
                                    select child.Uri.ToString()).ToArray();
590 854c715a pkanavos
                    lock (newAccount.SelectiveFolders)
591 854c715a pkanavos
                    {
592 854c715a pkanavos
                        newAccount.SelectiveFolders.AddRange(selected);
593 854c715a pkanavos
                    }
594 5b2e4db4 pkanavos
                    return;
595 5b2e4db4 pkanavos
                }
596 5b2e4db4 pkanavos
                catch (WebException)
597 5b2e4db4 pkanavos
                {
598 5b2e4db4 pkanavos
                    if (retries > 0)
599 5b2e4db4 pkanavos
                        retries--;
600 5b2e4db4 pkanavos
                    else
601 5b2e4db4 pkanavos
                        throw;
602 5b2e4db4 pkanavos
                }
603 8bbc337e pkanavos
            }
604 8bbc337e pkanavos
        }
605 8bbc337e pkanavos
606 d31e609c Panagiotis Kanavos
/*
607 d31e609c Panagiotis Kanavos
        public void AddPithosAccount()
608 d31e609c Panagiotis Kanavos
       {
609 d31e609c Panagiotis Kanavos
            var credentials=PithosAccount.RetrieveCredentials(null);
610 d31e609c Panagiotis Kanavos
            if (credentials == null)
611 d31e609c Panagiotis Kanavos
                return;
612 d31e609c Panagiotis Kanavos
            var account = Settings.Accounts.FirstOrDefault(act => act.AccountName == credentials.UserName);
613 d31e609c Panagiotis Kanavos
            var accountVM = new AccountViewModel(account);
614 d31e609c Panagiotis Kanavos
            if (account == null)
615 d31e609c Panagiotis Kanavos
            {
616 d31e609c Panagiotis Kanavos
                account=new AccountSettings{
617 d31e609c Panagiotis Kanavos
                    AccountName=credentials.UserName,
618 d31e609c Panagiotis Kanavos
                    ApiKey=credentials.Password
619 d31e609c Panagiotis Kanavos
                };
620 d31e609c Panagiotis Kanavos
                Settings.Accounts.Add(account);
621 d31e609c Panagiotis Kanavos
                accountVM = new AccountViewModel(account);
622 d31e609c Panagiotis Kanavos
                (Accounts as IProducerConsumerCollection<AccountViewModel>).TryAdd(accountVM);
623 d31e609c Panagiotis Kanavos
            }
624 d31e609c Panagiotis Kanavos
            else
625 d31e609c Panagiotis Kanavos
            {
626 d31e609c Panagiotis Kanavos
                account.ApiKey=credentials.Password;
627 d31e609c Panagiotis Kanavos
            }
628 d31e609c Panagiotis Kanavos
            //SelectedAccountIndex= Settings.Accounts.IndexOf(account);
629 d31e609c Panagiotis Kanavos
            CurrentAccount = accountVM;
630 d31e609c Panagiotis Kanavos
            NotifyOfPropertyChange(() => Accounts);
631 d31e609c Panagiotis Kanavos
            NotifyOfPropertyChange(()=>Settings);                       
632 d31e609c Panagiotis Kanavos
       }
633 d31e609c Panagiotis Kanavos
*/
634 d31e609c Panagiotis Kanavos
635 d31e609c Panagiotis Kanavos
636 39de8b0f pkanavos
        private readonly List<AccountSettings> _accountsToRemove = new List<AccountSettings>();
637 39de8b0f pkanavos
638 d31e609c Panagiotis Kanavos
        public void RemoveAccount()
639 d31e609c Panagiotis Kanavos
        {
640 d31e609c Panagiotis Kanavos
            Accounts.TryRemove(CurrentAccount);
641 d31e609c Panagiotis Kanavos
            _accountsToRemove.Add(CurrentAccount.Account);
642 d31e609c Panagiotis Kanavos
643 d31e609c Panagiotis Kanavos
            CurrentAccount = null;
644 d31e609c Panagiotis Kanavos
            NotifyOfPropertyChange(() => Accounts);
645 d31e609c Panagiotis Kanavos
646 39de8b0f pkanavos
647 d31e609c Panagiotis Kanavos
            //NotifyOfPropertyChange("Settings.Accounts");
648 d31e609c Panagiotis Kanavos
        }
649 d31e609c Panagiotis Kanavos
650 d31e609c Panagiotis Kanavos
        public bool CanRemoveAccount
651 d31e609c Panagiotis Kanavos
        {
652 d31e609c Panagiotis Kanavos
            get { return (CurrentAccount != null); }
653 d31e609c Panagiotis Kanavos
        }
654 d31e609c Panagiotis Kanavos
655 d31e609c Panagiotis Kanavos
        public bool CanClearAccountCache
656 d31e609c Panagiotis Kanavos
        {
657 d31e609c Panagiotis Kanavos
            get { return (CurrentAccount != null); }
658 d31e609c Panagiotis Kanavos
        }
659 d31e609c Panagiotis Kanavos
660 d31e609c Panagiotis Kanavos
        public void ClearAccountCache()
661 d31e609c Panagiotis Kanavos
        {
662 39de8b0f pkanavos
            if (MessageBoxResult.Yes ==
663 39de8b0f pkanavos
                MessageBox.Show("You are about to delete all partially downloaded files from the account's cache.\n" +
664 39de8b0f pkanavos
                                " You will have to download all partially downloaded data again\n" +
665 39de8b0f pkanavos
                                "This change can not be undone\n\n" +
666 39de8b0f pkanavos
                                "Do you wish to delete all partially downloaded data?",
667 39de8b0f pkanavos
                                "Warning! Clearing account cache",
668 39de8b0f pkanavos
                                MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No))
669 d31e609c Panagiotis Kanavos
            {
670 d31e609c Panagiotis Kanavos
671 d31e609c Panagiotis Kanavos
                var cachePath = Path.Combine(CurrentAccount.RootPath, FolderConstants.CacheFolder);
672 d31e609c Panagiotis Kanavos
                var dir = new DirectoryInfo(cachePath);
673 d31e609c Panagiotis Kanavos
                //The file may not exist if we just created the account
674 d31e609c Panagiotis Kanavos
                if (!dir.Exists)
675 d31e609c Panagiotis Kanavos
                    return;
676 39de8b0f pkanavos
                dir.EnumerateFiles().Apply(file => file.Delete());
677 d31e609c Panagiotis Kanavos
                dir.EnumerateDirectories().Apply(folder => folder.Delete(true));
678 d31e609c Panagiotis Kanavos
            }
679 d31e609c Panagiotis Kanavos
        }
680 d31e609c Panagiotis Kanavos
681 d31e609c Panagiotis Kanavos
682 d31e609c Panagiotis Kanavos
        public bool ExtensionsActivated
683 d31e609c Panagiotis Kanavos
        {
684 d31e609c Panagiotis Kanavos
            get { return Settings.ExtensionsActivated; }
685 d31e609c Panagiotis Kanavos
            set
686 d31e609c Panagiotis Kanavos
            {
687 d31e609c Panagiotis Kanavos
                if (Settings.ExtensionsActivated == value)
688 d31e609c Panagiotis Kanavos
                    return;
689 d31e609c Panagiotis Kanavos
690 d31e609c Panagiotis Kanavos
                Settings.ExtensionsActivated = value;
691 d31e609c Panagiotis Kanavos
692 d31e609c Panagiotis Kanavos
/*
693 d31e609c Panagiotis Kanavos
                if (value)
694 d31e609c Panagiotis Kanavos
                    _extensionController.RegisterExtensions();
695 d31e609c Panagiotis Kanavos
                else
696 d31e609c Panagiotis Kanavos
                {
697 d31e609c Panagiotis Kanavos
                    _extensionController.UnregisterExtensions();
698 d31e609c Panagiotis Kanavos
                }
699 d31e609c Panagiotis Kanavos
*/
700 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => ExtensionsActivated);
701 d31e609c Panagiotis Kanavos
            }
702 d31e609c Panagiotis Kanavos
        }
703 d31e609c Panagiotis Kanavos
704 d31e609c Panagiotis Kanavos
        public bool DebugLoggingEnabled
705 d31e609c Panagiotis Kanavos
        {
706 d31e609c Panagiotis Kanavos
            get { return Settings.DebugLoggingEnabled; }
707 39de8b0f pkanavos
            set
708 39de8b0f pkanavos
            {
709 d31e609c Panagiotis Kanavos
                Settings.DebugLoggingEnabled = value;
710 39de8b0f pkanavos
                NotifyOfPropertyChange(() => DebugLoggingEnabled);
711 d31e609c Panagiotis Kanavos
            }
712 d31e609c Panagiotis Kanavos
        }
713 d31e609c Panagiotis Kanavos
714 d31e609c Panagiotis Kanavos
        public bool IgnoreCertificateErrors
715 d31e609c Panagiotis Kanavos
        {
716 d31e609c Panagiotis Kanavos
            get { return Settings.IgnoreCertificateErrors; }
717 39de8b0f pkanavos
            set
718 39de8b0f pkanavos
            {
719 d31e609c Panagiotis Kanavos
                Settings.IgnoreCertificateErrors = value;
720 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => IgnoreCertificateErrors);
721 d31e609c Panagiotis Kanavos
            }
722 d31e609c Panagiotis Kanavos
        }
723 39de8b0f pkanavos
724 d31e609c Panagiotis Kanavos
        #endregion
725 d31e609c Panagiotis Kanavos
726 39de8b0f pkanavos
        /* private int _selectedAccountIndex;
727 d31e609c Panagiotis Kanavos
        public int SelectedAccountIndex
728 d31e609c Panagiotis Kanavos
        {
729 d31e609c Panagiotis Kanavos
            get { return _selectedAccountIndex; }
730 d31e609c Panagiotis Kanavos
            set
731 d31e609c Panagiotis Kanavos
            {
732 d31e609c Panagiotis Kanavos
                //var accountCount=Settings.Accounts.Count;
733 d31e609c Panagiotis Kanavos
                //if (accountCount == 0)
734 d31e609c Panagiotis Kanavos
                //    return;
735 d31e609c Panagiotis Kanavos
                //if (0 <= value && value < accountCount)
736 d31e609c Panagiotis Kanavos
                //    _selectedAccountIndex = value;
737 d31e609c Panagiotis Kanavos
                //else
738 d31e609c Panagiotis Kanavos
                //    _selectedAccountIndex = 0;
739 d31e609c Panagiotis Kanavos
                _selectedAccountIndex = value;
740 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => CurrentAccount);
741 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => CanRemoveAccount);
742 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(()=>SelectedAccountIndex);
743 d31e609c Panagiotis Kanavos
            }
744 d31e609c Panagiotis Kanavos
        }*/
745 d31e609c Panagiotis Kanavos
746 d31e609c Panagiotis Kanavos
        private AccountViewModel _currentAccount;
747 d31e609c Panagiotis Kanavos
        private readonly IWindowManager _windowManager;
748 d31e609c Panagiotis Kanavos
        private readonly string _shortcutPath;
749 d31e609c Panagiotis Kanavos
750 d31e609c Panagiotis Kanavos
751 39de8b0f pkanavos
752 d31e609c Panagiotis Kanavos
        public AccountViewModel CurrentAccount
753 d31e609c Panagiotis Kanavos
        {
754 d31e609c Panagiotis Kanavos
            get { return _currentAccount; }
755 d31e609c Panagiotis Kanavos
            set
756 d31e609c Panagiotis Kanavos
            {
757 d31e609c Panagiotis Kanavos
                _currentAccount = value;
758 eb81e47d pkanavos
759 39de8b0f pkanavos
                if (_currentAccount != null)
760 c945b450 pkanavos
                    _currentAccount.PropertyChanged += (o, e) => NotifyOfPropertyChange(() => CanSelectiveSyncFolders);
761 eb81e47d pkanavos
762 eb81e47d pkanavos
                NotifyOfPropertyChange(() => CurrentAccount);
763 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => CanRemoveAccount);
764 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => CanSelectiveSyncFolders);
765 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => CanMoveAccountFolder);
766 d31e609c Panagiotis Kanavos
                NotifyOfPropertyChange(() => CanClearAccountCache);
767 dc18b138 pkanavos
                NotifyOfPropertyChange(() => CanWipeAccount);
768 d31e609c Panagiotis Kanavos
            }
769 d31e609c Panagiotis Kanavos
        }
770 d31e609c Panagiotis Kanavos
771 d31e609c Panagiotis Kanavos
/*
772 d31e609c Panagiotis Kanavos
        public AccountSettings CurrentAccount
773 d31e609c Panagiotis Kanavos
        {
774 d31e609c Panagiotis Kanavos
            get {
775 d31e609c Panagiotis Kanavos
                if (0 <= SelectedAccountIndex && SelectedAccountIndex < Settings.Accounts.Count)                    
776 d31e609c Panagiotis Kanavos
                    return Settings.Accounts[SelectedAccountIndex];
777 d31e609c Panagiotis Kanavos
                return null;
778 d31e609c Panagiotis Kanavos
            }
779 d31e609c Panagiotis Kanavos
780 d31e609c Panagiotis Kanavos
        }
781 d31e609c Panagiotis Kanavos
*/
782 d31e609c Panagiotis Kanavos
783 d31e609c Panagiotis Kanavos
784 d31e609c Panagiotis Kanavos
        public bool CanMoveAccountFolder
785 d31e609c Panagiotis Kanavos
        {
786 d31e609c Panagiotis Kanavos
            get { return CurrentAccount != null; }
787 d31e609c Panagiotis Kanavos
        }
788 d31e609c Panagiotis Kanavos
789 39de8b0f pkanavos
        public void MoveAccountFolder()
790 d31e609c Panagiotis Kanavos
        {
791 d31e609c Panagiotis Kanavos
792 39de8b0f pkanavos
            using (var dlg = new FolderBrowserDialog())
793 d31e609c Panagiotis Kanavos
            {
794 39de8b0f pkanavos
                var currentFolder = CurrentAccount.RootPath;
795 39de8b0f pkanavos
                dlg.SelectedPath = currentFolder;
796 39de8b0f pkanavos
                //Ask the user to select a folder
797 39de8b0f pkanavos
                //Note: We need a parent window here, which we retrieve with GetView            
798 39de8b0f pkanavos
                var view = (Window) GetView();
799 39de8b0f pkanavos
                if (DialogResult.OK != dlg.ShowDialog(new Wpf32Window(view)))
800 39de8b0f pkanavos
                    return;
801 d31e609c Panagiotis Kanavos
802 39de8b0f pkanavos
                var newPath = dlg.SelectedPath;
803 39de8b0f pkanavos
                //Find the account's monitor and stop it
804 39de8b0f pkanavos
                PithosMonitor monitor;
805 39de8b0f pkanavos
                if (Shell.Monitors.TryGetValue(CurrentAccount.AccountKey, out monitor))
806 d31e609c Panagiotis Kanavos
                {
807 39de8b0f pkanavos
                    //Problem: Doesn't stop the poll agent
808 39de8b0f pkanavos
                    monitor.Stop();
809 d31e609c Panagiotis Kanavos
810 39de8b0f pkanavos
                    monitor.MoveRootFolder(newPath);
811 d31e609c Panagiotis Kanavos
812 39de8b0f pkanavos
                   
813 d31e609c Panagiotis Kanavos
                }
814 39de8b0f pkanavos
                //Replace the old rootpath with the new
815 39de8b0f pkanavos
                CurrentAccount.RootPath = newPath;
816 39de8b0f pkanavos
                //TODO: This will save all settings changes. Too coarse grained, need to fix at a later date
817 39de8b0f pkanavos
                Settings.Save();
818 39de8b0f pkanavos
                //And start the monitor on the new RootPath            
819 39de8b0f pkanavos
                if (monitor != null)
820 39de8b0f pkanavos
                {
821 39de8b0f pkanavos
                    monitor.RootPath = newPath;
822 39de8b0f pkanavos
                    if (CurrentAccount.IsActive)
823 dd5f5163 pkanavos
                        Shell.StartMonitor(monitor);
824 dd5f5163 pkanavos
                        
825 39de8b0f pkanavos
                }
826 39de8b0f pkanavos
                else
827 39de8b0f pkanavos
                    Shell.MonitorAccount(CurrentAccount.Account);
828 39de8b0f pkanavos
                //Finally, notify that the Settings, CurrentAccount have changed
829 39de8b0f pkanavos
                NotifyOfPropertyChange(() => CurrentAccount);
830 39de8b0f pkanavos
                NotifyOfPropertyChange(() => Settings);
831 d31e609c Panagiotis Kanavos
832 39de8b0f pkanavos
            }
833 d31e609c Panagiotis Kanavos
        }
834 39de8b0f pkanavos
835 d31e609c Panagiotis Kanavos
    }
836 d31e609c Panagiotis Kanavos
}