root / trunk / Pithos.Client.WPF / SelectiveSynch / SelectiveSynchViewModel.cs @ 8f44fd3a
History | View | Annotate | Download (9.7 kB)
1 | 255f5f86 | Panagiotis Kanavos | #region |
---|---|---|---|
2 | 255f5f86 | Panagiotis Kanavos | /* ----------------------------------------------------------------------- |
3 | 255f5f86 | Panagiotis Kanavos | * <copyright file="SelectiveSynchViewModel.cs" company="GRNet"> |
4 | 255f5f86 | Panagiotis Kanavos | * |
5 | 255f5f86 | Panagiotis Kanavos | * Copyright 2011-2012 GRNET S.A. All rights reserved. |
6 | 255f5f86 | Panagiotis Kanavos | * |
7 | 255f5f86 | Panagiotis Kanavos | * Redistribution and use in source and binary forms, with or |
8 | 255f5f86 | Panagiotis Kanavos | * without modification, are permitted provided that the following |
9 | 255f5f86 | Panagiotis Kanavos | * conditions are met: |
10 | 255f5f86 | Panagiotis Kanavos | * |
11 | 255f5f86 | Panagiotis Kanavos | * 1. Redistributions of source code must retain the above |
12 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
13 | 255f5f86 | Panagiotis Kanavos | * disclaimer. |
14 | 255f5f86 | Panagiotis Kanavos | * |
15 | 255f5f86 | Panagiotis Kanavos | * 2. Redistributions in binary form must reproduce the above |
16 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
17 | 255f5f86 | Panagiotis Kanavos | * disclaimer in the documentation and/or other materials |
18 | 255f5f86 | Panagiotis Kanavos | * provided with the distribution. |
19 | 255f5f86 | Panagiotis Kanavos | * |
20 | 255f5f86 | Panagiotis Kanavos | * |
21 | 255f5f86 | Panagiotis Kanavos | * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
22 | 255f5f86 | Panagiotis Kanavos | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
23 | 255f5f86 | Panagiotis Kanavos | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
24 | 255f5f86 | Panagiotis Kanavos | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR |
25 | 255f5f86 | Panagiotis Kanavos | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
26 | 255f5f86 | Panagiotis Kanavos | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
27 | 255f5f86 | Panagiotis Kanavos | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
28 | 255f5f86 | Panagiotis Kanavos | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
29 | 255f5f86 | Panagiotis Kanavos | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
30 | 255f5f86 | Panagiotis Kanavos | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
31 | 255f5f86 | Panagiotis Kanavos | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
32 | 255f5f86 | Panagiotis Kanavos | * POSSIBILITY OF SUCH DAMAGE. |
33 | 255f5f86 | Panagiotis Kanavos | * |
34 | 255f5f86 | Panagiotis Kanavos | * The views and conclusions contained in the software and |
35 | 255f5f86 | Panagiotis Kanavos | * documentation are those of the authors and should not be |
36 | 255f5f86 | Panagiotis Kanavos | * interpreted as representing official policies, either expressed |
37 | 255f5f86 | Panagiotis Kanavos | * or implied, of GRNET S.A. |
38 | 255f5f86 | Panagiotis Kanavos | * </copyright> |
39 | 255f5f86 | Panagiotis Kanavos | * ----------------------------------------------------------------------- |
40 | 255f5f86 | Panagiotis Kanavos | */ |
41 | 255f5f86 | Panagiotis Kanavos | #endregion |
42 | 255f5f86 | Panagiotis Kanavos | using System; |
43 | d3a13891 | Panagiotis Kanavos | using System.Collections.Generic; |
44 | d3a13891 | Panagiotis Kanavos | using System.Collections.ObjectModel; |
45 | d3a13891 | Panagiotis Kanavos | using System.Linq; |
46 | 759bd3c4 | Panagiotis Kanavos | using System.Threading.Tasks; |
47 | d3a13891 | Panagiotis Kanavos | using Caliburn.Micro; |
48 | d3a13891 | Panagiotis Kanavos | using Pithos.Client.WPF.Properties; |
49 | f4a72cb8 | pkanavos | using Pithos.Client.WPF.Utils; |
50 | 759bd3c4 | Panagiotis Kanavos | using Pithos.Core; |
51 | d3a13891 | Panagiotis Kanavos | using Pithos.Interfaces; |
52 | 8f44fd3a | pkanavos | using Pithos.Network; |
53 | d3a13891 | Panagiotis Kanavos | |
54 | d3a13891 | Panagiotis Kanavos | namespace Pithos.Client.WPF.SelectiveSynch |
55 | d3a13891 | Panagiotis Kanavos | { |
56 | d3a13891 | Panagiotis Kanavos | class SelectiveSynchViewModel:Screen |
57 | 268bec7f | pkanavos | { |
58 | 4147814e | Panagiotis Kanavos | private readonly IEventAggregator _events ; |
59 | d3a13891 | Panagiotis Kanavos | |
60 | d3a13891 | Panagiotis Kanavos | |
61 | d3a13891 | Panagiotis Kanavos | public AccountSettings Account { get; set; } |
62 | d3a13891 | Panagiotis Kanavos | |
63 | 759bd3c4 | Panagiotis Kanavos | private readonly ObservableCollection<DirectoryRecord> _rootNodes=new ObservableCollection<DirectoryRecord>(); |
64 | 759bd3c4 | Panagiotis Kanavos | public ObservableCollection<DirectoryRecord> RootNodes |
65 | d3a13891 | Panagiotis Kanavos | { |
66 | 759bd3c4 | Panagiotis Kanavos | get { return _rootNodes; } |
67 | d3a13891 | Panagiotis Kanavos | } |
68 | d3a13891 | Panagiotis Kanavos | |
69 | 759bd3c4 | Panagiotis Kanavos | private ObservableCollection<ObjectInfo> _checks; |
70 | 8f44fd3a | pkanavos | //private readonly PithosMonitor _monitor; |
71 | 759bd3c4 | Panagiotis Kanavos | private bool _isBusy=true; |
72 | 8f44fd3a | pkanavos | private string _apiKey; |
73 | 759bd3c4 | Panagiotis Kanavos | |
74 | 759bd3c4 | Panagiotis Kanavos | public ObservableCollection<ObjectInfo> Checks |
75 | d3a13891 | Panagiotis Kanavos | { |
76 | d3a13891 | Panagiotis Kanavos | get { return _checks; } |
77 | d3a13891 | Panagiotis Kanavos | } |
78 | d3a13891 | Panagiotis Kanavos | |
79 | d3a13891 | Panagiotis Kanavos | public void GetChecks() |
80 | d3a13891 | Panagiotis Kanavos | { |
81 | 759bd3c4 | Panagiotis Kanavos | var root = RootNodes[0]; |
82 | 759bd3c4 | Panagiotis Kanavos | _checks = new ObservableCollection<ObjectInfo>( |
83 | f4a72cb8 | pkanavos | from DirectoryRecord record in root |
84 | d3a13891 | Panagiotis Kanavos | where record.IsChecked==true |
85 | 759bd3c4 | Panagiotis Kanavos | select record.ObjectInfo); |
86 | d3a13891 | Panagiotis Kanavos | NotifyOfPropertyChange(() => Checks); |
87 | d3a13891 | Panagiotis Kanavos | } |
88 | d3a13891 | Panagiotis Kanavos | |
89 | 8f44fd3a | pkanavos | public SelectiveSynchViewModel(/*PithosMonitor monitor,*/ IEventAggregator events, AccountSettings account, string apiKey) |
90 | d3a13891 | Panagiotis Kanavos | { |
91 | d3a13891 | Panagiotis Kanavos | Account = account; |
92 | d3a13891 | Panagiotis Kanavos | AccountName = account.AccountName; |
93 | f4a72cb8 | pkanavos | DisplayName = String.Format("Selective folder synchronization for {0}",account.AccountName); |
94 | 8f44fd3a | pkanavos | //_monitor = monitor; |
95 | 759bd3c4 | Panagiotis Kanavos | _events = events; |
96 | 8f44fd3a | pkanavos | _apiKey = apiKey; |
97 | 759bd3c4 | Panagiotis Kanavos | TaskEx.Run(LoadRootNode); |
98 | 759bd3c4 | Panagiotis Kanavos | } |
99 | 759bd3c4 | Panagiotis Kanavos | |
100 | 759bd3c4 | Panagiotis Kanavos | private void LoadRootNode() |
101 | 8f44fd3a | pkanavos | { |
102 | 8f44fd3a | pkanavos | //TODO: Check this |
103 | 8f44fd3a | pkanavos | var client = new CloudFilesClient(AccountName,_apiKey){AuthenticationUrl=Account.ServerUrl,UsePithos=true}; |
104 | 8f44fd3a | pkanavos | client.Authenticate(); |
105 | 8f44fd3a | pkanavos | |
106 | 759bd3c4 | Panagiotis Kanavos | |
107 | 8f44fd3a | pkanavos | var dirs = from container in client.ListContainers(AccountName) |
108 | 759bd3c4 | Panagiotis Kanavos | select new DirectoryRecord |
109 | 759bd3c4 | Panagiotis Kanavos | { |
110 | 759bd3c4 | Panagiotis Kanavos | DisplayName = container.Name, |
111 | 1a41e9ec | pkanavos | Uri=new Uri(client.StorageUrl,String.Format(@"{0}/{1}",Account.AccountName, container.Name)), |
112 | 8f44fd3a | pkanavos | Directories = (from dir in client.ListObjects(AccountName, container.Name) |
113 | 268bec7f | pkanavos | where dir.IsDirectory |
114 | f4a72cb8 | pkanavos | select dir).ToTree() |
115 | 759bd3c4 | Panagiotis Kanavos | }; |
116 | 759bd3c4 | Panagiotis Kanavos | var ownFolders = dirs.ToList(); |
117 | 759bd3c4 | Panagiotis Kanavos | |
118 | 759bd3c4 | Panagiotis Kanavos | var accountNodes=from account in client.ListSharingAccounts() |
119 | 759bd3c4 | Panagiotis Kanavos | select new DirectoryRecord |
120 | 759bd3c4 | Panagiotis Kanavos | { |
121 | 759bd3c4 | Panagiotis Kanavos | DisplayName=account.name, |
122 | ebc37b0d | pkanavos | Uri=new Uri(client.StorageUrl,"../"+ account.name), |
123 | 759bd3c4 | Panagiotis Kanavos | Directories=(from container in client.ListContainers(account.name) |
124 | 759bd3c4 | Panagiotis Kanavos | select new DirectoryRecord |
125 | 759bd3c4 | Panagiotis Kanavos | { |
126 | 759bd3c4 | Panagiotis Kanavos | DisplayName=container.Name, |
127 | ebc37b0d | pkanavos | Uri = new Uri(client.StorageUrl, "../" + account.name + "/" + container.Name), |
128 | f4a72cb8 | pkanavos | Directories=(from folder in client.ListObjects(account.name,container.Name) |
129 | 268bec7f | pkanavos | where folder.IsDirectory |
130 | f4a72cb8 | pkanavos | select folder).ToTree() |
131 | 759bd3c4 | Panagiotis Kanavos | }).ToList() |
132 | 759bd3c4 | Panagiotis Kanavos | }; |
133 | 759bd3c4 | Panagiotis Kanavos | |
134 | 759bd3c4 | Panagiotis Kanavos | var othersNode = new DirectoryRecord |
135 | 759bd3c4 | Panagiotis Kanavos | { |
136 | 759bd3c4 | Panagiotis Kanavos | DisplayName = "Others", |
137 | 759bd3c4 | Panagiotis Kanavos | Directories=accountNodes.ToList() |
138 | 759bd3c4 | Panagiotis Kanavos | }; |
139 | 759bd3c4 | Panagiotis Kanavos | |
140 | 759bd3c4 | Panagiotis Kanavos | |
141 | 759bd3c4 | Panagiotis Kanavos | var rootItem = new DirectoryRecord |
142 | 759bd3c4 | Panagiotis Kanavos | { |
143 | 759bd3c4 | Panagiotis Kanavos | DisplayName = AccountName , |
144 | 759bd3c4 | Panagiotis Kanavos | Directories = ownFolders.ToList() |
145 | 759bd3c4 | Panagiotis Kanavos | }; |
146 | 126f90b3 | Panagiotis Kanavos | |
147 | 07b157c3 | Panagiotis Kanavos | Execute.OnUIThread(() => |
148 | 07b157c3 | Panagiotis Kanavos | { |
149 | 4147814e | Panagiotis Kanavos | RootNodes.Add(rootItem); |
150 | 4147814e | Panagiotis Kanavos | RootNodes.Add(othersNode); |
151 | 07b157c3 | Panagiotis Kanavos | }); |
152 | 759bd3c4 | Panagiotis Kanavos | |
153 | 759bd3c4 | Panagiotis Kanavos | SetInitialSelections(Account); |
154 | 759bd3c4 | Panagiotis Kanavos | |
155 | 126f90b3 | Panagiotis Kanavos | IsBusy = false; |
156 | 759bd3c4 | Panagiotis Kanavos | } |
157 | d3a13891 | Panagiotis Kanavos | |
158 | 759bd3c4 | Panagiotis Kanavos | public bool IsBusy |
159 | 759bd3c4 | Panagiotis Kanavos | { |
160 | 759bd3c4 | Panagiotis Kanavos | get { |
161 | 759bd3c4 | Panagiotis Kanavos | return _isBusy; |
162 | 759bd3c4 | Panagiotis Kanavos | } |
163 | 759bd3c4 | Panagiotis Kanavos | set { |
164 | 759bd3c4 | Panagiotis Kanavos | _isBusy = value; |
165 | 759bd3c4 | Panagiotis Kanavos | NotifyOfPropertyChange(()=>IsBusy); |
166 | 759bd3c4 | Panagiotis Kanavos | } |
167 | d3a13891 | Panagiotis Kanavos | } |
168 | d3a13891 | Panagiotis Kanavos | |
169 | d3a13891 | Panagiotis Kanavos | private void SetInitialSelections(AccountSettings account) |
170 | d3a13891 | Panagiotis Kanavos | { |
171 | d3a13891 | Panagiotis Kanavos | var selections = account.SelectiveFolders; |
172 | 759bd3c4 | Panagiotis Kanavos | |
173 | 0a9d4d18 | pkanavos | |
174 | 0a9d4d18 | pkanavos | |
175 | 07b157c3 | Panagiotis Kanavos | //Initially, all nodes are checked |
176 | 07b157c3 | Panagiotis Kanavos | //We need to *uncheck* the nodes that are not selected |
177 | 07b157c3 | Panagiotis Kanavos | |
178 | 5c46341d | Panagiotis Kanavos | var allNodes = (from DirectoryRecord rootRecord in RootNodes |
179 | 5c46341d | Panagiotis Kanavos | from DirectoryRecord record in rootRecord |
180 | 5c46341d | Panagiotis Kanavos | select record).ToList(); |
181 | 5c46341d | Panagiotis Kanavos | |
182 | 8f44fd3a | pkanavos | allNodes.Apply(record => record.IsChecked = false); |
183 | 8f44fd3a | pkanavos | |
184 | 0a9d4d18 | pkanavos | if (selections.Count == 0) |
185 | 0a9d4d18 | pkanavos | { |
186 | 8f44fd3a | pkanavos | // allNodes.Apply(record => record.IsChecked = false); |
187 | 0a9d4d18 | pkanavos | return; |
188 | 0a9d4d18 | pkanavos | } |
189 | 0a9d4d18 | pkanavos | |
190 | 5c46341d | Panagiotis Kanavos | var selects = (from DirectoryRecord rootRecord in RootNodes |
191 | f4a72cb8 | pkanavos | from DirectoryRecord record in rootRecord |
192 | 8f44fd3a | pkanavos | where record.Uri !=null && selections.Contains(record.Uri.ToString()) |
193 | 5c46341d | Panagiotis Kanavos | select record).ToList(); |
194 | 8f44fd3a | pkanavos | //var shouldBeChecked = allNodes.Except(selects).ToList(); |
195 | 759bd3c4 | Panagiotis Kanavos | |
196 | 8f44fd3a | pkanavos | selects.Apply(record=>record.IsExplicitlyChecked=true); |
197 | 5c46341d | Panagiotis Kanavos | |
198 | 8f44fd3a | pkanavos | //shouldBeChecked.Apply(record => record.IsChecked = true); |
199 | 5c46341d | Panagiotis Kanavos | |
200 | 5c46341d | Panagiotis Kanavos | |
201 | 5c46341d | Panagiotis Kanavos | |
202 | d3a13891 | Panagiotis Kanavos | } |
203 | d3a13891 | Panagiotis Kanavos | |
204 | d3a13891 | Panagiotis Kanavos | protected string AccountName { get; set; } |
205 | d3a13891 | Panagiotis Kanavos | |
206 | d3a13891 | Panagiotis Kanavos | public void SaveChanges() |
207 | d3a13891 | Panagiotis Kanavos | { |
208 | f4a72cb8 | pkanavos | var uris = (from DirectoryRecord root in RootNodes |
209 | f4a72cb8 | pkanavos | from DirectoryRecord record in root |
210 | fec5da06 | Panagiotis Kanavos | where record.IsChecked == true && record.Uri != null |
211 | fec5da06 | Panagiotis Kanavos | select record.Uri).ToArray(); |
212 | d3a13891 | Panagiotis Kanavos | |
213 | fec5da06 | Panagiotis Kanavos | SaveSettings(uris); |
214 | d3a13891 | Panagiotis Kanavos | |
215 | 759bd3c4 | Panagiotis Kanavos | //RootNodes is an ObservableCollection, it can't be enumerated iterativelly |
216 | f4a72cb8 | pkanavos | |
217 | f4a72cb8 | pkanavos | var added = (from DirectoryRecord root in RootNodes |
218 | f4a72cb8 | pkanavos | from DirectoryRecord record in root |
219 | 759bd3c4 | Panagiotis Kanavos | where record.Added && record.Uri != null |
220 | 759bd3c4 | Panagiotis Kanavos | select record.Uri).ToArray(); |
221 | f4a72cb8 | pkanavos | var removed = (from DirectoryRecord root in RootNodes |
222 | f4a72cb8 | pkanavos | from DirectoryRecord record in root |
223 | 759bd3c4 | Panagiotis Kanavos | where record.Removed && record.Uri != null |
224 | 759bd3c4 | Panagiotis Kanavos | select record.Uri).ToArray(); |
225 | fec5da06 | Panagiotis Kanavos | //TODO: Include Uris for the containers as well |
226 | 759bd3c4 | Panagiotis Kanavos | _events.Publish(new SelectiveSynchChanges{Account=Account,Uris=uris,Added=added,Removed=removed}); |
227 | d3a13891 | Panagiotis Kanavos | |
228 | d3a13891 | Panagiotis Kanavos | |
229 | d3a13891 | Panagiotis Kanavos | |
230 | d3a13891 | Panagiotis Kanavos | |
231 | d3a13891 | Panagiotis Kanavos | TryClose(true); |
232 | d3a13891 | Panagiotis Kanavos | } |
233 | d3a13891 | Panagiotis Kanavos | |
234 | d3a13891 | Panagiotis Kanavos | |
235 | fec5da06 | Panagiotis Kanavos | private void SaveSettings(IEnumerable<Uri> uris) |
236 | d3a13891 | Panagiotis Kanavos | { |
237 | fec5da06 | Panagiotis Kanavos | var selections = uris.Select(uri => uri.ToString()).ToArray(); |
238 | fec5da06 | Panagiotis Kanavos | |
239 | d3a13891 | Panagiotis Kanavos | Account.SelectiveFolders.Clear(); |
240 | d3a13891 | Panagiotis Kanavos | Account.SelectiveFolders.AddRange(selections); |
241 | d3a13891 | Panagiotis Kanavos | Settings.Default.Save(); |
242 | fec5da06 | Panagiotis Kanavos | } |
243 | d3a13891 | Panagiotis Kanavos | |
244 | d3a13891 | Panagiotis Kanavos | public void RejectChanges() |
245 | d3a13891 | Panagiotis Kanavos | { |
246 | d3a13891 | Panagiotis Kanavos | TryClose(false); |
247 | d3a13891 | Panagiotis Kanavos | } |
248 | d3a13891 | Panagiotis Kanavos | } |
249 | d3a13891 | Panagiotis Kanavos | } |