2 /* -----------------------------------------------------------------------
3 * <copyright file="SelectiveSynchViewModel.cs" company="GRNet">
5 * Copyright 2011-2012 GRNET S.A. All rights reserved.
7 * Redistribution and use in source and binary forms, with or
8 * without modification, are permitted provided that the following
11 * 1. Redistributions of source code must retain the above
12 * copyright notice, this list of conditions and the following
15 * 2. Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials
18 * provided with the distribution.
21 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
34 * The views and conclusions contained in the software and
35 * documentation are those of the authors and should not be
36 * interpreted as representing official policies, either expressed
37 * or implied, of GRNET S.A.
39 * -----------------------------------------------------------------------
43 using System.Collections.Generic;
44 using System.Collections.ObjectModel;
46 using System.Threading.Tasks;
48 using Pithos.Client.WPF.Properties;
49 using Pithos.Client.WPF.Utils;
51 using Pithos.Interfaces;
54 namespace Pithos.Client.WPF.SelectiveSynch
56 class SelectiveSynchViewModel:Screen
58 private readonly IEventAggregator _events ;
61 public AccountSettings Account { get; set; }
63 private readonly ObservableCollection<DirectoryRecord> _rootNodes=new ObservableCollection<DirectoryRecord>();
64 public ObservableCollection<DirectoryRecord> RootNodes
66 get { return _rootNodes; }
69 private ObservableCollection<ObjectInfo> _checks;
70 //private readonly PithosMonitor _monitor;
71 private bool _isBusy=true;
72 private string _apiKey;
74 public ObservableCollection<ObjectInfo> Checks
76 get { return _checks; }
79 public void GetChecks()
81 var root = RootNodes[0];
82 _checks = new ObservableCollection<ObjectInfo>(
83 from DirectoryRecord record in root
84 where record.IsChecked==true
85 select record.ObjectInfo);
86 NotifyOfPropertyChange(() => Checks);
89 public SelectiveSynchViewModel(/*PithosMonitor monitor,*/ IEventAggregator events, AccountSettings account, string apiKey)
92 AccountName = account.AccountName;
93 DisplayName = String.Format("Selective folder synchronization for {0}",account.AccountName);
97 TaskEx.Run(LoadRootNode);
100 private void LoadRootNode()
103 var client = new CloudFilesClient(AccountName,_apiKey){AuthenticationUrl=Account.ServerUrl,UsePithos=true};
104 client.Authenticate();
107 var dirs = from container in client.ListContainers(AccountName)
108 where container.Name != "trash"
109 select new DirectoryRecord
111 DisplayName = container.Name,
112 Uri=new Uri(client.StorageUrl,String.Format(@"{0}/{1}",Account.AccountName, container.Name)),
113 Directories = (from dir in client.ListObjects(AccountName, container.Name)
116 var ownFolders = dirs.ToList();
118 var accountNodes=from account in client.ListSharingAccounts()
119 select new DirectoryRecord
121 DisplayName=account.name,
122 Uri=new Uri(client.StorageUrl,"../"+ account.name),
123 Directories=(from container in client.ListContainers(account.name)
124 select new DirectoryRecord
126 DisplayName=container.Name,
127 Uri = new Uri(client.StorageUrl, "../" + account.name + "/" + container.Name),
128 Directories=(from folder in client.ListObjects(account.name,container.Name)
129 select folder).ToTree()
133 var othersNode = new DirectoryRecord
135 DisplayName = "Shared to me",
136 Directories=accountNodes.ToList()
140 var rootItem = new DirectoryRecord
142 DisplayName = AccountName ,
143 Directories = ownFolders.ToList()
146 Execute.OnUIThread(() =>
148 RootNodes.Add(rootItem);
149 RootNodes.Add(othersNode);
152 SetInitialSelections(Account);
164 NotifyOfPropertyChange(()=>IsBusy);
168 private void SetInitialSelections(AccountSettings account)
170 var selections = account.SelectiveFolders;
174 //Initially, all nodes are checked
175 //We need to *uncheck* the nodes that are not selected
177 var allNodes = (from DirectoryRecord rootRecord in RootNodes
178 from DirectoryRecord record in rootRecord
179 select record).ToList();
181 allNodes.Apply(record => record.IsChecked = false);
183 if (selections.Count == 0)
185 // allNodes.Apply(record => record.IsChecked = false);
189 var selects = (from DirectoryRecord rootRecord in RootNodes
190 from DirectoryRecord record in rootRecord
191 where record.Uri !=null && selections.Contains(record.Uri.ToString())
192 select record).ToList();
193 //var shouldBeChecked = allNodes.Except(selects).ToList();
195 selects.Apply(record=>record.IsExplicitlyChecked=true);
197 //shouldBeChecked.Apply(record => record.IsChecked = true);
203 protected string AccountName { get; set; }
205 public void SaveChanges()
207 var uris = (from DirectoryRecord root in RootNodes
208 from DirectoryRecord record in root
209 where record.IsChecked == true && record.Uri != null
210 select record.Uri).ToArray();
214 //RootNodes is an ObservableCollection, it can't be enumerated iterativelly
216 var added = (from DirectoryRecord root in RootNodes
217 from DirectoryRecord record in root
218 where record.Added && record.Uri != null
219 select record.Uri).ToArray();
220 var removed = (from DirectoryRecord root in RootNodes
221 from DirectoryRecord record in root
222 where record.Removed && record.Uri != null
223 select record.Uri).ToArray();
224 //TODO: Include Uris for the containers as well
225 _events.Publish(new SelectiveSynchChanges{Account=Account,Uris=uris,Added=added,Removed=removed});
234 private void SaveSettings(IEnumerable<Uri> uris)
236 var selections = uris.Select(uri => uri.ToString()).ToArray();
238 Account.SelectiveFolders.Clear();
239 Account.SelectiveFolders.AddRange(selections);
240 Settings.Default.Save();
243 public void RejectChanges()