root / trunk / Pithos.Client.WPF / FileProperties / ConflictResolver.cs @ a308d291
History | View | Annotate | Download (4.1 kB)
1 |
using System; |
---|---|
2 |
using System.Collections.Generic; |
3 |
using System.ComponentModel.Composition; |
4 |
using System.Linq; |
5 |
using System.Text; |
6 |
using Caliburn.Micro; |
7 |
using Pithos.Core; |
8 |
using Pithos.Core.Agents; |
9 |
using Pithos.Interfaces; |
10 |
using Pithos.Network; |
11 |
|
12 |
namespace Pithos.Client.WPF.FileProperties |
13 |
{ |
14 |
[Export(typeof(IConflictResolver))] |
15 |
public class ConflictResolver : IConflictResolver |
16 |
{ |
17 |
[Import] |
18 |
public IStatusKeeper StatusAgent { get; set; } |
19 |
|
20 |
[Import] |
21 |
public NetworkAgent NetworkAgent { get; set; } |
22 |
|
23 |
public void Resolve(IEnumerable<ConflictFile> conflicts) |
24 |
{ |
25 |
KeepServer(conflicts.Where(c => c.Action == ConflictAction.KeepServer)); |
26 |
KeepLocal(conflicts.Where(c => c.Action == ConflictAction.KeepLocal)); |
27 |
KeepBoth(conflicts.Where(c => c.Action == ConflictAction.KeepBoth)); |
28 |
ClearLocal(conflicts.Where(c => c.Action == ConflictAction.ClearLocal)); |
29 |
} |
30 |
|
31 |
|
32 |
//Clearing the local state means that we clear the conflict state of the local file. |
33 |
//This is needed to clear wrong conflicts |
34 |
private void ClearLocal(IEnumerable<ConflictFile> conflicts) |
35 |
{ |
36 |
//This can be done simply by changing the local Filestate status to normal |
37 |
conflicts.Apply(clear => |
38 |
StatusAgent.SetFileState(clear.FilePath, FileStatus.Unchanged, FileOverlayStatus.Normal, "")); |
39 |
|
40 |
} |
41 |
|
42 |
|
43 |
//Keeping the server version means that we need to |
44 |
//download the server's version of the file. |
45 |
private void KeepServer(IEnumerable<ConflictFile> conflicts) |
46 |
{ |
47 |
//This can be done either by scheduling the appropriate action, ignoring the hash |
48 |
//Or directly downloading the file. |
49 |
|
50 |
|
51 |
foreach (var conflict in conflicts) |
52 |
{ |
53 |
//a.Post(new CloudDownloadAction()); |
54 |
PithosMonitor monitor; |
55 |
/* |
56 |
var account = monitor.Account; |
57 |
var oi=monitor.GetObjectInfo(conflict.FilePath); |
58 |
NetworkAgent.Post(new CloudDownloadAction(account,oi,"Resolver")); |
59 |
*/ |
60 |
} |
61 |
|
62 |
|
63 |
} |
64 |
|
65 |
//Keeping the server version means that we need to |
66 |
//upload the local version of the file to the server |
67 |
private void KeepLocal(IEnumerable<ConflictFile> conflicts) |
68 |
{ |
69 |
//This can be done either by scheduling the appropriate action, ignoring the hash |
70 |
//Or directly uploading the file. |
71 |
foreach (var conflict in conflicts) |
72 |
{ |
73 |
var info = FileInfoExtensions.FromPath(conflict.FilePath); |
74 |
var state=StatusAgent.GetStateByFilePath(conflict.FilePath); |
75 |
PithosMonitor monitor; |
76 |
|
77 |
/* |
78 |
var pair=(from monitor in Monitors |
79 |
where conflict.FilePath.StartsWith(monitor.Value.RootPath, StringComparison.InvariantCultureIgnoreCase) |
80 |
select monitor).FirstOrDefault(); |
81 |
var accountMonitor = pair.Value; |
82 |
*/ |
83 |
/* |
84 |
var account = monitor.Account; |
85 |
//var oi=monitor.GetObjectInfo(conflict.FilePath); |
86 |
NetworkAgent.Post(new CloudUploadAction(account,info,state,account.BlockSize,account.BlockHash,"Resolver")); |
87 |
//NetworkAgent.Post(new CloudUploadAction(,info,conflict.FileState,NetworkAgent.)); |
88 |
*/ |
89 |
} |
90 |
} |
91 |
|
92 |
//Keeping both versions means that we need to copy one of them |
93 |
//somewhere and keep the other |
94 |
private void KeepBoth(IEnumerable<ConflictFile> conflicts) |
95 |
{ |
96 |
//We can copy the rename the local file to another name and download the server file |
97 |
//Or rename the server file and upload the local file |
98 |
|
99 |
//Downloading the server file is probably much faster with ADSL connections |
100 |
|
101 |
//We could probably use the local file as a source of blocks to download fewer data, |
102 |
//We create a hashmap of the local file, download the differences from the server |
103 |
//and merge common and changed blocks to create the new file. |
104 |
} |
105 |
} |
106 |
} |