Statistics
| Branch: | Revision:

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
}