Revision 79f92570

b/trunk/Pithos.AppCast/versioninfo.xml
7 7
		<description></description>      
8 8
		<language>en</language>               
9 9
		<item>            
10
			<title>Version 0.7.20301</title>
11
			<sparkle:releaseNotesLink>file:///E:/projects/PITHOS/Source/Pithos/trunk/Pithos.AppCast/rnotes.0.7.20301.html</sparkle:releaseNotesLink>
12
			<pubDate>Sun, 01 Mar 2012 10:21:11 +0000</pubDate>
10
			<title>Version 0.7.20305</title>
11
			<sparkle:releaseNotesLink>https://code.grnet.gr/attachments/download/965/rnotes.0.7.20305.html</sparkle:releaseNotesLink>
12
			<pubDate>Sun, 05 Mar 2012 10:21:11 +0000</pubDate>
13 13
			<enclosure 
14
				url="file:///E:/projects/PITHOS/Source/Pithos/trunk/Pithos.AppCast/WpfUpdateSetup.0.7.20301.x64.msi"
14
				url="https://code.grnet.gr/attachments/download/970/Pithos.Setup.0.7.20305.x64.msi"
15 15
				length="485376" 
16 16
				type="application/octet-stream"
17
				sparkle:version="0.7.20301" 
17
				sparkle:version="0.7.20305" 
18 18
				sparkle:dsaSignature="kZN9lzdHa9+rHHwE92+Q/z0mlRZugTwJHQyxNdkT8ARaqbtIaJb6iQ=="
19 19
			/>
20 20
		</item>
21 21
		<item>            
22
			<title>Version 0.7.20302</title>
23
			<sparkle:releaseNotesLink>file:///E:/projects/PITHOS/Source/Pithos/trunk/Pithos.AppCast/rnotes.0.7.20302.html</sparkle:releaseNotesLink>
24
			<pubDate>Sun, 02 Mar 2012 10:21:11 +0000</pubDate>
22
			<title>Version 0.7.20306</title>
23
			<sparkle:releaseNotesLink>https://code.grnet.gr/attachments/download/966/rnotes.0.7.20306.html</sparkle:releaseNotesLink>
24
			<pubDate>Mon, 06 Mar 2012 10:21:11 +0000</pubDate>
25 25
			<enclosure 
26
				url="file:///E:/projects/PITHOS/Source/Pithos/trunk/Pithos.AppCast/WpfUpdateSetup.0.7.20302.x64.msi"
26
				url="https://code.grnet.gr/attachments/download/946/Pithos.Setup.0.7.20306.x64.msi"
27 27
				length="485376" 
28 28
				type="application/octet-stream"
29
				sparkle:version="0.7.20302" 
29
				sparkle:version="0.7.20306" 
30 30
				sparkle:dsaSignature="kZN9lzdHa9+rHHwE92+Q/z0mlRZugTwJHQyxNdkT8ARaqbtIaJb6iQ=="
31 31
			/>
32 32
		</item>
b/trunk/Pithos.Client.WPF/App.xaml.cs
41 41
#endregion
42 42
using System;
43 43
using System.Collections.Generic;
44
using System.Drawing;
45 44
using System.IO;
46 45
using System.Linq;
47 46
using System.Reflection;
......
49 48
using System.Threading;
50 49
using System.Threading.Tasks;
51 50
using System.Windows;
52
using System.Windows.Media;
53
using System.Windows.Media.Imaging;
54
using AppLimit.NetSparkle;
55 51
using Caliburn.Micro;
56 52
using Pithos.Client.WPF.Properties;
57 53
using log4net.Appender;
......
67 63
    {
68 64
        private static readonly log4net.ILog Log = log4net.LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType );
69 65

  
70
        private Sparkle _sparkle;
71 66

  
72 67

  
73 68
        public App()
......
80 75
            AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
81 76
            TaskScheduler.UnobservedTaskException += OnUnobservedException;
82 77

  
83
            _sparkle = new Sparkle(Settings.Default.UpdateUrl);
84
            _sparkle.updateDetected += OnUpdateDetected;
85
            _sparkle.ShowDiagnosticWindow = true;
78
            //_sparkle = new Sparkle(Settings.Default.UpdateUrl);
79
            //_sparkle.updateDetected += OnUpdateDetected;
80
            //_sparkle.ShowDiagnosticWindow = true;
86 81
            
87
//            _sparkle.ApplicationIcon=Image.
88
            _sparkle.StartLoop(true,true);
82
            //Must delay opening the upgrade window
83
            //to avoid Windows Messages sent by the TaskbarIcon
84
            //TaskEx.Delay(5000).ContinueWith(_=>_sparkle.StartLoop(true,true),TaskScheduler.FromCurrentSynchronizationContext());
89 85

  
90 86
            //Fix incorrect proxy settings by switching to default proxy, if the proxy server settings is empty
91 87
            if (Settings.Default.UseManualProxy && String.IsNullOrWhiteSpace(Settings.Default.ProxyServer))
......
97 93
            InitializeComponent();            
98 94
        }
99 95

  
96
/*
100 97
        private void OnUpdateDetected(object sender, UpdateDetectedEventArgs e)
101 98
        {
102 99
            Log.InfoFormat("Update Detected {0}",e.LatestVersion.Version);    
103 100
        }
101
*/
104 102

  
105 103
        private static void InitializeLogging()
106 104
        {
b/trunk/Pithos.Client.WPF/Pithos.Client.WPF.csproj
469 469
      <Project>{C45218F8-09E7-4F57-85BC-5D8D2AC736A3}</Project>
470 470
      <Name>ParallelExtensionsExtras</Name>
471 471
    </ProjectReference>
472
    <ProjectReference Include="..\NetSparkle\NetSparkle2010.csproj">
473
      <Project>{74635A21-2BAD-4522-AB95-E3E5703CD301}</Project>
474
      <Name>NetSparkle2010</Name>
475
    </ProjectReference>
476 472
    <ProjectReference Include="..\NotifyIconWpf\NotifyIconWpf.csproj">
477 473
      <Project>{7AC63864-7638-41C4-969C-D3197EF2BED9}</Project>
478 474
      <Name>NotifyIconWpf</Name>
b/trunk/Pithos.Client.WPF/Properties/AssemblyInfo.cs
94 94
// by using the '*' as shown below:
95 95
// [assembly: AssemblyVersion("1.0.*")]
96 96
[assembly: AssemblyVersion("0.7.0.0")]
97
[assembly: AssemblyFileVersionAttribute("0.7.20302.2131")]
97
[assembly: AssemblyFileVersionAttribute("0.7.20305.0")]
b/trunk/Pithos.Client.WPF/Properties/Settings.Designer.cs
321 321
        
322 322
        [global::System.Configuration.ApplicationScopedSettingAttribute()]
323 323
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
324
        [global::System.Configuration.DefaultSettingValueAttribute("https://code.grnet.gr/attachments/download/950/versioninfo.xml")]
324
        [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)]
325
        [global::System.Configuration.DefaultSettingValueAttribute("file:///E:/Projects/PITHOS/Source/Pithos/trunk/Pithos.AppCast/versioninfo.xml")]
325 326
        public string UpdateUrl {
326 327
            get {
327 328
                return ((string)(this["UpdateUrl"]));
b/trunk/Pithos.Client.WPF/Properties/Settings.settings
80 80
    <Setting Name="StartupDelay" Type="System.TimeSpan" Scope="User">
81 81
      <Value Profile="(Default)">00:01:00</Value>
82 82
    </Setting>
83
    <Setting Name="UpdateUrl" Type="System.String" Scope="Application">
84
      <Value Profile="(Default)">https://code.grnet.gr/attachments/download/950/versioninfo.xml</Value>
83
    <Setting Name="UpdateUrl" Type="(Web Service URL)" Scope="Application">
84
      <Value Profile="(Default)">file:///E:/Projects/PITHOS/Source/Pithos/trunk/Pithos.AppCast/versioninfo.xml</Value>
85 85
    </Setting>
86 86
  </Settings>
87 87
</SettingsFile>
b/trunk/Pithos.Client.WPF/Shell/ShellView.xaml
82 82
                        </MenuItem.ItemTemplate>
83 83
                    </MenuItem>
84 84
                    <Separator  />
85
                    <MenuItem Header="{Binding StatusMessage}" x:Name="StatusMessage" />
85
                    <MenuItem  x:Name="StatusMessage">
86
                        <MenuItem.Header>
87
                            <TextBlock Text="{Binding StatusMessage}" TextWrapping="WrapWithOverflow" Width="160" />
88
                        </MenuItem.Header>
89
                    </MenuItem>
86 90
                    <Separator  />
87 91
                    <MenuItem  Header="{Binding PauseSyncCaption}" x:Name="ToggleSynching" cal:Message.Attach="ToggleSynching"  />
88 92
                    <Separator  />
b/trunk/Pithos.Client.WPF/app.config
120 120
    <value>https://pithos.dev.grnet.gr</value>
121 121
   </setting>
122 122
   <setting name="UpdateUrl" serializeAs="String">
123
    <value>https://code.grnet.gr/attachments/download/950/versioninfo.xml</value>
123
    <value>file:///E:/Projects/PITHOS/Source/Pithos/trunk/Pithos.AppCast/versioninfo.xml</value>
124 124
   </setting>
125 125
  </Pithos.Client.WPF.Properties.Settings>
126 126
	</applicationSettings>
b/trunk/Pithos.Core.Test/IdleBatchTest.cs
1
// -----------------------------------------------------------------------
2
// <copyright file="IdleBatchTest.cs" company="Microsoft">
3
// TODO: Update copyright text.
4
// </copyright>
5
// -----------------------------------------------------------------------
6

  
7
using System.Collections.Concurrent;
8
using System.ComponentModel;
9
using System.IO;
10
using System.Threading;
11
using System.Threading.Tasks;
12
using System.Threading.Tasks.Dataflow;
13
using NUnit.Framework;
14
using Pithos.Core.Agents;
15

  
16
namespace Pithos.Core.Test
17
{
18
    using System;
19
    using System.Collections.Generic;
20
    using System.Linq;
21
    using System.Text;
22

  
23
    /// <summary>
24
    /// TODO: Update summary.
25
    /// </summary>
26
    [TestFixture]
27
    public class IdleBatchTest
28
    {
29

  
30

  
31
        [Test]
32
        public void TestEnqueue()
33
        {
34
            var queue=new ConcurrentQueue<FileSystemEventArgs>();
35
            var batch = new IdleBatch<FileSystemEventArgs>(1000,queue.AddFromEnumerable );
36
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created,"path1","file1"));
37
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
38
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
39
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
40
            batch.ForceTrigger();
41
            
42
            Assert.That(queue.Count,Is.EqualTo(4));
43
        }
44

  
45
        [Test]
46
        public void TestTimeout()
47
        {
48
            var queue=new ConcurrentQueue<FileSystemEventArgs>();
49
            var batch = new IdleBatch<FileSystemEventArgs>(100,queue.AddFromEnumerable );
50
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created,"path1","file1"));
51
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
52
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
53
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
54
            Thread.Sleep(500);
55
            
56
            Assert.That(queue.Count,Is.EqualTo(4));
57
            queue.Clear();
58
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
59
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
60
            Thread.Sleep(500);
61
            
62
            Assert.That(queue.Count,Is.EqualTo(2));
63
        }
64

  
65
        [Test]
66
        public void TestCreationSequence()
67
        {
68
            Dictionary<string, FileSystemEventArgs[]> events = null;
69
            var batch = new FileEventIdleBatch(100, dict => events = dict);
70

  
71
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created,"path1","file1"));
72
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
73
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
74
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
75
            Thread.Sleep(500);
76

  
77
            Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Created }));
78
        }
79

  
80
        [Test]
81
        public void TestCreateDeleteSequence()
82
        {
83
            Dictionary<string, FileSystemEventArgs[]> events = null;
84
            var batch = new FileEventIdleBatch(100, dict => events = dict);
85

  
86
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created,"path1","file1"));
87
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
88
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
89
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file1"));
90
            Thread.Sleep(500);
91

  
92
            Assert.That(events.ContainsKey("path1\\file1"), Is.False); 
93
        }
94

  
95
        [Test]
96
        public void TestChangeSequence()
97
        {
98
            Dictionary<string, FileSystemEventArgs[]> events = null;
99
            var batch = new FileEventIdleBatch(100, dict => events = dict);
100
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
101
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
102
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
103
            Thread.Sleep(500);
104
            
105
            Assert.That(events[@"path1\file1"].Select(arg=>arg.ChangeType),Is.EquivalentTo(new[]{WatcherChangeTypes.Changed}));
106
        }
107
        
108
        [Test]
109
        public void TestEnsureEmptyAfterTrigger()
110
        {
111
            Dictionary<string, FileSystemEventArgs[]> events = null;
112
            var batch = new FileEventIdleBatch(100, dict => events = dict);
113
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
114
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
115
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
116
            Thread.Sleep(500);
117
            Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Changed }));
118
            events = new Dictionary<string, FileSystemEventArgs[]>();
119
            Thread.Sleep(500);
120
            Assert.That(events, Is.Empty);
121
        }
122
        
123
        [Test]
124
        public void TestChangeDeleteSequence()
125
        {
126
            Dictionary<string, FileSystemEventArgs[]> events = null;
127
            var batch = new FileEventIdleBatch(100, dict => events = dict);
128
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
129
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
130
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file1"));
131
            Thread.Sleep(500);
132

  
133
            Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Deleted }));
134
        }
135

  
136
        [Test]
137
        public void TestCreateChangeDeleteSequence()
138
        {
139
            Dictionary<string, FileSystemEventArgs[]> events = null;
140
            var batch = new FileEventIdleBatch(100, dict => events = dict);
141
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1"));
142
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
143
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file1"));
144
            Thread.Sleep(500);
145

  
146
            Assert.That(events.ContainsKey("path1\\file1"), Is.False);            
147
        }
148

  
149
        [Test]
150
        public void TestCreateDeleteCreateSequence()
151
        {
152
            Dictionary<string, FileSystemEventArgs[]> events = null;
153
            var batch = new FileEventIdleBatch(100, dict => events = dict);
154
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1"));
155
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
156
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file1"));
157
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1"));
158
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
159
            Thread.Sleep(500);
160

  
161
            Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Created }));
162
        }
163

  
164
        public void TestCreateCreateSequence()
165
        {
166
            Dictionary<string, FileSystemEventArgs[]> events = null;
167
            var batch = new FileEventIdleBatch(100, dict => events = dict);
168
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1"));
169
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
170
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file2"));
171
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file2"));
172
            Thread.Sleep(500);
173

  
174
            Assert.That(events[@"path1\file1"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Created }));
175
            Assert.That(events[@"path1\file2"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Created }));
176
        }
177

  
178
        [Test]
179
        public void TestCreateRenameSequence()
180
        {
181
            Dictionary<string, FileSystemEventArgs[]> events = null;
182
            var batch = new FileEventIdleBatch(100, dict => events = dict);
183
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1"));
184
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
185
            batch.Post(new RenamedEventArgs(WatcherChangeTypes.Renamed, "path1", "file2", "file1"));
186
            Thread.Sleep(500);
187

  
188
            Assert.That(events.ContainsKey("path1\\file1"), Is.False);
189
            var changes = events[@"path1\file2"];
190
            Assert.That(changes.Length,Is.EqualTo(1));
191
            var change = changes[0];
192
            Assert.That(change.ChangeType, Is.EqualTo(WatcherChangeTypes.Created));
193
            Assert.That(change.FullPath,Is.EqualTo("path1\\file2"));                        
194
        }
195

  
196
        [Test]
197
        public void TestRenameChangeSequence()
198
        {
199
            Dictionary<string, FileSystemEventArgs[]> events = null;
200
            var batch = new FileEventIdleBatch(100, dict => events = dict);
201
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
202
            batch.Post(new RenamedEventArgs(WatcherChangeTypes.Renamed, "path1", "file2","file1"));
203
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file2"));
204
            Thread.Sleep(500);
205

  
206
            Assert.That(events.ContainsKey("path1\\file1"),Is.False);
207
            Assert.That(events["path1\\file2"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Renamed, WatcherChangeTypes.Changed }));
208
        }
209

  
210
        [Test]
211
        public void TestCreateRenameChangeSequence()
212
        {
213
            Dictionary<string, FileSystemEventArgs[]> events = null;
214
            var batch = new FileEventIdleBatch(100, dict => events = dict);
215
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1"));
216
            batch.Post(new RenamedEventArgs(WatcherChangeTypes.Renamed, "path1", "file2","file1"));
217
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file2"));
218
            Thread.Sleep(500);
219

  
220
            Assert.That(events.ContainsKey("path1\\file1"), Is.False);
221
            var changes = events["path1\\file2"];
222
            Assert.That(changes.Length, Is.EqualTo(1));
223
            var change = changes[0];
224
            Assert.That(change.ChangeType, Is.EqualTo(WatcherChangeTypes.Created));
225
            Assert.That(change.FullPath, Is.EqualTo(@"path1\file2"));
226
            
227
        }
228

  
229
        [Test]
230
        public void TestCreateRenameChangeDeleteSequence()
231
        {
232
            Dictionary<string, FileSystemEventArgs[]> events = null;
233
            var batch = new FileEventIdleBatch(100, dict => events = dict);
234
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1"));
235
            batch.Post(new RenamedEventArgs(WatcherChangeTypes.Renamed, "path1", "file2","file1"));
236
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file2"));
237
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Deleted, "path1", "file2"));
238
            Thread.Sleep(500);
239

  
240
            Assert.That(events.ContainsKey("path1\\file1"), Is.False);
241
            Assert.That(events.ContainsKey("path1\\file2"), Is.False);
242
            
243
        }
244

  
245
        [Test]
246
        public void TestCreateRenameOtherSequence()
247
        {
248
            Dictionary<string, FileSystemEventArgs[]> events = null;
249
            var batch = new FileEventIdleBatch(100,dict=>events=dict);
250
            
251
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Created, "path1", "file1"));
252
            batch.Post(new FileSystemEventArgs(WatcherChangeTypes.Changed, "path1", "file1"));
253
            batch.Post(new RenamedEventArgs(WatcherChangeTypes.Renamed, "path1", "file3","file2"));
254
            Thread.Sleep(500);
255
            
256

  
257
            Assert.That(events.ContainsKey("path1\\file1"),Is.True);
258
            Assert.That(events.ContainsKey("path1\\file2"), Is.False);
259
            Assert.That(events[@"path1\file3"].Select(arg => arg.ChangeType), Is.EquivalentTo(new[] { WatcherChangeTypes.Renamed }));
260
        }
261
    }
262
}
b/trunk/Pithos.Core.Test/NetworkAgentTest.cs
70 70
        [Test]
71 71
        public void TestDownload()
72 72
        {
73
            var fileAgent = new FileAgent {CachePath = @"e:\pithos\.pithos.cache"};
73
            var fileAgent = new FileAgent(100) {CachePath = @"e:\pithos\.pithos.cache"};
74 74

  
75 75
            var agent = new NetworkAgent();
76 76

  
b/trunk/Pithos.Core.Test/Pithos.Core.Test.csproj
195 195
    </Reference>
196 196
    <Reference Include="System" />
197 197
    <Reference Include="System.Core" />
198
    <Reference Include="System.Threading.Tasks.Dataflow, Version=0.0.4098.29463, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
198 199
    <Reference Include="System.Xml.Linq" />
199 200
    <Reference Include="System.Data.DataSetExtensions" />
200 201
    <Reference Include="Microsoft.CSharp" />
......
205 206
    <Compile Include="EnumerableExtensionsTest.cs" />
206 207
    <Compile Include="ExtensionTests.cs" />
207 208
    <Compile Include="FileSystemWatcherAdapterTest.cs" />
209
    <Compile Include="IdleBatchTest.cs" />
208 210
    <Compile Include="NetworkAgentTest.cs" />
209 211
    <Compile Include="PithosWorkflowTest.cs" />
210 212
    <Compile Include="Properties\AssemblyInfo.cs" />
b/trunk/Pithos.Core/Agents/AsyncAutoResetEvent.cs
1
// -----------------------------------------------------------------------
2
// <copyright file="AsyncAutoResetEvent.cs" company="Microsoft">
3
// TODO: Update copyright text.
4
// </copyright>
5
// -----------------------------------------------------------------------
6

  
7
using System.Threading.Tasks;
8

  
9
namespace Pithos.Core.Agents
10
{
11
    using System;
12
    using System.Collections.Generic;
13
    using System.Linq;
14
    using System.Text;
15

  
16
    /// <summary>
17
    /// TODO: Update summary.
18
    /// </summary>
19
    public class AsyncAutoResetEvent
20
    {
21
        private readonly static Task Completed = TaskEx.FromResult(true);
22
        private readonly Queue<TaskCompletionSource<bool>> _waits = new Queue<TaskCompletionSource<bool>>();
23
        private bool _signaled;
24

  
25
        public Task WaitAsync()
26
        {
27
            lock (_waits)
28
            {
29
                if (_signaled)
30
                {
31
                    _signaled = false;
32
                    return Completed;
33
                }
34
                else
35
                {
36
                    var tcs = new TaskCompletionSource<bool>();
37
                    _waits.Enqueue(tcs);
38
                    return tcs.Task;
39
                }
40
            }
41
        }
42

  
43
        public void Set()
44
        {
45
            TaskCompletionSource<bool> toRelease = null;
46
            lock (_waits)
47
            {
48
                if (_waits.Count > 0)
49
                    toRelease = _waits.Dequeue();
50
                else if (!_signaled)
51
                    _signaled = true;
52
            }
53
            if (toRelease != null)
54
                toRelease.SetResult(true);
55
        }
56

  
57
    }
58
}
b/trunk/Pithos.Core/Agents/FileAgent.cs
73 73
        private AccountInfo AccountInfo { get; set; }
74 74

  
75 75
        internal string RootPath { get;  set; }
76
        
77
        private FileEventIdleBatch _eventIdleBatch;
78

  
79
        public FileAgent(int idleTimeout)
80
        {            
81
            _eventIdleBatch=new FileEventIdleBatch(idleTimeout,ProcessBatchedEvents);
82
        }
76 83

  
84
        private void ProcessBatchedEvents(Dictionary<string, FileSystemEventArgs[]> fileEvents)
85
        {
86
            StatusNotification.SetPithosStatus(PithosStatus.LocalSyncing,String.Format("Uploading {0} files",fileEvents.Count));
87
            foreach (var fileEvent in fileEvents)
88
            {
89
                var filePath = fileEvent.Key;
90
                var changes = fileEvent.Value;
91
                
92
                if (Ignore(filePath)) continue;
93
                                
94
                foreach (var change in changes)
95
                {
96
                    if (change.ChangeType == WatcherChangeTypes.Renamed)
97
                    {
98
                        var rename = (RenamedEventArgs) change;
99
                        _agent.Post(new WorkflowState
100
                                        {
101
                                            AccountInfo = AccountInfo,
102
                                            OldPath = rename.OldFullPath,
103
                                            OldFileName = rename.OldName,
104
                                            Path = rename.FullPath,
105
                                            FileName = rename.Name,
106
                                            TriggeringChange = rename.ChangeType
107
                                        });
108
                    }
109
                    else
110
                        _agent.Post(new WorkflowState
111
                        {
112
                            AccountInfo = AccountInfo,
113
                            Path = change.FullPath,
114
                            FileName = change.Name,
115
                            TriggeringChange = change.ChangeType
116
                        });                        
117
                }
118
            }
119
            StatusNotification.SetPithosStatus(PithosStatus.LocalComplete);
120
        }
77 121

  
78 122
        public void Start(AccountInfo accountInfo,string rootPath)
79 123
        {
......
320 364
            var filePath = e.FullPath;
321 365
            if (Ignore(filePath)) 
322 366
                return;
323

  
324
            _agent.Post(new WorkflowState{AccountInfo=AccountInfo, Path = filePath, FileName = e.Name, TriggeringChange = e.ChangeType });
367
            _eventIdleBatch.Post(e);
325 368
        }
326 369

  
327 370

  
......
354 397
            if (Ignore(oldFullPath) || Ignore(fullPath))
355 398
                return;
356 399

  
357
            _agent.Post(new WorkflowState
358
            {
359
                AccountInfo=AccountInfo,
360
                OldPath = oldFullPath,
361
                OldFileName = e.OldName,
362
                Path = fullPath,
363
                FileName = e.Name,
364
                TriggeringChange = e.ChangeType
365
            });
400
            _eventIdleBatch.Post(e);
366 401
        }
367 402

  
368 403

  
b/trunk/Pithos.Core/Agents/FileEventIdleBatch.cs
1
#region
2
/* -----------------------------------------------------------------------
3
 * <copyright file="FileEventIdleBatch.cs" company="GRNet">
4
 * 
5
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or
8
 * without modification, are permitted provided that the following
9
 * conditions are met:
10
 *
11
 *   1. Redistributions of source code must retain the above
12
 *      copyright notice, this list of conditions and the following
13
 *      disclaimer.
14
 *
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.
19
 *
20
 *
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.
33
 *
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.
38
 * </copyright>
39
 * -----------------------------------------------------------------------
40
 */
41
#endregion
42
using System;
43
using System.Collections.Generic;
44
using System.IO;
45
using System.Linq;
46
using System.Reflection;
47
using log4net;
48

  
49
namespace Pithos.Core.Agents
50
{
51
    public class FileEventIdleBatch
52
    {
53

  
54
        //Requirements
55
        //------------
56
        //* The class should group workflow actions according to file name and type
57
        //* The class should pass all batched actions to a continuation when
58
        //* the batch is triggered.
59
        //* Actions should not survice a trigger
60

  
61
        private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
62

  
63
        private readonly IdleBatch<FileSystemEventArgs> _idleBatch;
64
        private readonly Action<Dictionary<string, FileSystemEventArgs[]>> _callback;
65

  
66
        public FileEventIdleBatch(int idleTimeout, Action<Dictionary<string, FileSystemEventArgs[]>> callback)
67
        {
68
            _callback = callback;
69
            _idleBatch = new IdleBatch<FileSystemEventArgs>(idleTimeout, Process);
70
        }
71

  
72
        public void Post(FileSystemEventArgs arg)
73
        {
74
            if (Log.IsDebugEnabled)
75
                Log.DebugFormat("Batch Post  {0}:{1}", arg.ChangeType.ToString("g"), arg.FullPath);
76

  
77
            _idleBatch.Post(arg);
78
        }
79

  
80
        public void ForceTrigger()
81
        {
82
            _idleBatch.ForceTrigger();
83
        }
84

  
85

  
86
        protected virtual void Process(FileSystemEventArgs[] args)
87
        {
88
            var dict = new Dictionary<string, FileSystemEventArgs[]>();
89
            foreach (var arg in args)
90
            {
91

  
92
                if (arg.ChangeType == WatcherChangeTypes.Created )
93
                    dict[arg.FullPath] = new[] { arg };
94
                else if (arg.ChangeType == WatcherChangeTypes.Renamed)
95
                {
96
                    var renamedArg = (RenamedEventArgs)arg;
97
                    FileSystemEventArgs[] oldValue;
98
                    if (dict.TryGetValue(renamedArg.OldFullPath, out oldValue))
99
                    {
100
                        dict.Remove(renamedArg.OldFullPath);
101
                        var last = oldValue.Last();
102
                        if (last.ChangeType == WatcherChangeTypes.Created)
103
                        {
104
                            var createRenamed = new FileSystemEventArgs(WatcherChangeTypes.Created, Path.GetDirectoryName(renamedArg.FullPath),
105
                                                                        renamedArg.Name);
106
                            dict[renamedArg.FullPath] = new[] {createRenamed};
107
                        }
108
                        else
109
                            dict[renamedArg.FullPath] = new[] { renamedArg };
110
                    }
111
                    else
112
                        dict[renamedArg.FullPath] = new[] { renamedArg};
113
                }
114
                else
115
                {
116
                    FileSystemEventArgs[] oldValue;
117
                    var hasValue=dict.TryGetValue(arg.FullPath, out oldValue);
118
                    var last = hasValue?oldValue.LastOrDefault():null;
119
                    
120
                    if (last==null || last.ChangeType == WatcherChangeTypes.Changed)
121
                    {
122
                        dict[arg.FullPath] = new[] { arg};
123
                    }
124
                    else if (arg.ChangeType == WatcherChangeTypes.Deleted)
125
                    {
126
                        if (last.ChangeType == WatcherChangeTypes.Created)
127
                            dict.Remove(arg.FullPath);
128
                        else
129
                        {
130
                            dict[arg.FullPath] = new[] { arg };
131
                        }
132
                    }
133
                    else if (last.ChangeType == WatcherChangeTypes.Renamed && arg.ChangeType == WatcherChangeTypes.Changed)
134
                    {
135
                        var newValue = oldValue.Concat(new[] { arg }).ToArray();
136
                        dict[arg.FullPath] = newValue;
137
                    }
138

  
139
                }
140
            }
141
            _callback(dict);
142
        }
143

  
144
    }
145

  
146
}
b/trunk/Pithos.Core/Agents/IdleBatch.cs
1
#region
2
/* -----------------------------------------------------------------------
3
 * <copyright file="IdleBatch.cs" company="GRNet">
4
 * 
5
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or
8
 * without modification, are permitted provided that the following
9
 * conditions are met:
10
 *
11
 *   1. Redistributions of source code must retain the above
12
 *      copyright notice, this list of conditions and the following
13
 *      disclaimer.
14
 *
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.
19
 *
20
 *
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.
33
 *
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.
38
 * </copyright>
39
 * -----------------------------------------------------------------------
40
 */
41
#endregion
42

  
43
using System.Reflection;
44
using System.Threading;
45
using System.Threading.Tasks.Dataflow;
46
using System;
47
using log4net;
48

  
49
namespace Pithos.Core.Agents
50
{
51

  
52
    /// <summary>
53
    /// Calls a callback function if an idle timeout expires after the last post
54
    /// </summary>
55
    public class IdleBatch<T>
56
    {
57
        private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
58

  
59
        readonly Timer _triggerTimer;
60

  
61
        private readonly BatchBlock<T> _batchBlock;
62
        private readonly TransformBlock<T, T> _timerBlock;
63
        private readonly ActionBlock<T[]> _processBlock;
64

  
65
        private readonly int _timeOut;
66

  
67
        public IdleBatch(int idleTimeout, Action<T[]> action)
68
        {
69
            _timeOut = idleTimeout;
70
            _timerBlock = new TransformBlock<T, T>(t =>
71
            {
72
                _triggerTimer.Change(_timeOut, Timeout.Infinite);
73
                return t;
74
            });
75
            _batchBlock = new BatchBlock<T>(9999);
76
            _processBlock = new ActionBlock<T[]>(action);
77

  
78
            _timerBlock.LinkTo(_batchBlock);
79
            _batchBlock.LinkTo(_processBlock);
80

  
81
            _timerBlock.Completion.ContinueWith(_ => _batchBlock.Complete());
82
            _batchBlock.Completion.ContinueWith(_ => _processBlock.Complete());
83

  
84
            _triggerTimer = new Timer(_ => _batchBlock.TriggerBatch());
85
        }
86

  
87
        public void Post(T input)
88
        {
89
            _timerBlock.Post(input);
90
        }
91

  
92
        public void ForceTrigger()
93
        {
94
            _batchBlock.TriggerBatch();
95
            _timerBlock.Complete();
96
            _processBlock.Completion.Wait();
97
        }
98
    }
99

  
100
}
b/trunk/Pithos.Core/Pithos.Core.csproj
377 377
  <ItemGroup>
378 378
    <Compile Include="Agents\Agent.cs" />
379 379
    <Compile Include="Agents\AgentLocator.cs" />
380
    <Compile Include="Agents\AsyncAutoResetEvent.cs" />
380 381
    <Compile Include="Agents\AsyncCollection.cs" />
381 382
    <Compile Include="Agents\AsyncManualResetEvent.cs" />
382 383
    <Compile Include="Agents\AsyncSemaphore.cs" />
......
386 387
    <Compile Include="Agents\DeleteAgent.cs" />
387 388
    <Compile Include="Agents\FileAgent.cs" />
388 389
    <Compile Include="Agents\BlockExtensions.cs" />
390
    <Compile Include="Agents\FileEventIdleBatch.cs" />
389 391
    <Compile Include="Agents\FileSystemWatcherAdapter.cs" />
392
    <Compile Include="Agents\IdleBatch.cs" />
390 393
    <Compile Include="Agents\MovedEventArgs.cs" />
391 394
    <Compile Include="Agents\NetworkAgent.cs" />
392 395
    <Compile Include="Agents\ObjectInfoComparer.cs" />
b/trunk/Pithos.Core/PithosMonitor.cs
164 164

  
165 165
        public PithosMonitor()
166 166
        {
167
            FileAgent = new FileAgent();
167
            FileAgent = new FileAgent(5000);
168 168

  
169 169
        }
170 170
        private bool _started;
b/trunk/Pithos.Setup.x64/Pithos.Setup.x64.vdproj
21 21
        }
22 22
        "Entry"
23 23
        {
24
        "MsmKey" = "8:_263B85E7C62D146E20358A3F08BBC740"
25
        "OwnerKey" = "8:_A611766CD2793378FFAB2F3063F81496"
26
        "MsmSig" = "8:_UNDEFINED"
27
        }
28
        "Entry"
29
        {
30
        "MsmKey" = "8:_263B85E7C62D146E20358A3F08BBC740"
31
        "OwnerKey" = "8:_8A9B95E5C0E945ECA7F21580A0D088D9"
32
        "MsmSig" = "8:_UNDEFINED"
33
        }
34
        "Entry"
35
        {
24 36
        "MsmKey" = "8:_392252B203784D91A39016FC82CD5887"
25 37
        "OwnerKey" = "8:_8A9B95E5C0E945ECA7F21580A0D088D9"
26 38
        "MsmSig" = "8:_UNDEFINED"
......
63 75
        }
64 76
        "Entry"
65 77
        {
66
        "MsmKey" = "8:_5B7E11B508E123A2BA4C11623DA3E029"
67
        "OwnerKey" = "8:_E42C4D0836CDB6008642BC929C51E416"
68
        "MsmSig" = "8:_UNDEFINED"
69
        }
70
        "Entry"
71
        {
72
        "MsmKey" = "8:_5B7E11B508E123A2BA4C11623DA3E029"
73
        "OwnerKey" = "8:_8A9B95E5C0E945ECA7F21580A0D088D9"
74
        "MsmSig" = "8:_UNDEFINED"
75
        }
76
        "Entry"
77
        {
78
        "MsmKey" = "8:_5B7E11B508E123A2BA4C11623DA3E029"
79
        "OwnerKey" = "8:_A611766CD2793378FFAB2F3063F81496"
80
        "MsmSig" = "8:_UNDEFINED"
81
        }
82
        "Entry"
83
        {
84 78
        "MsmKey" = "8:_626ECD9012C5D7BD4388B6BE07F5107D"
85 79
        "OwnerKey" = "8:_8A9B95E5C0E945ECA7F21580A0D088D9"
86 80
        "MsmSig" = "8:_UNDEFINED"
......
171 165
        }
172 166
        "Entry"
173 167
        {
174
        "MsmKey" = "8:_928344C82AF3698D55890E76C45404A5"
175
        "OwnerKey" = "8:_8A9B95E5C0E945ECA7F21580A0D088D9"
176
        "MsmSig" = "8:_UNDEFINED"
177
        }
178
        "Entry"
179
        {
180 168
        "MsmKey" = "8:_A490E069DF5DE5852575B6E157EB50BE"
181 169
        "OwnerKey" = "8:_1BD6A9CD577C40098C968C8B464A03BC"
182 170
        "MsmSig" = "8:_UNDEFINED"
......
370 358
        "Entry"
371 359
        {
372 360
        "MsmKey" = "8:_UNDEFINED"
373
        "OwnerKey" = "8:_928344C82AF3698D55890E76C45404A5"
374
        "MsmSig" = "8:_UNDEFINED"
375
        }
376
        "Entry"
377
        {
378
        "MsmKey" = "8:_UNDEFINED"
379 361
        "OwnerKey" = "8:_8A9B95E5C0E945ECA7F21580A0D088D9"
380 362
        "MsmSig" = "8:_UNDEFINED"
381 363
        }
......
394 376
        "Entry"
395 377
        {
396 378
        "MsmKey" = "8:_UNDEFINED"
397
        "OwnerKey" = "8:_5B7E11B508E123A2BA4C11623DA3E029"
379
        "OwnerKey" = "8:_263B85E7C62D146E20358A3F08BBC740"
398 380
        "MsmSig" = "8:_UNDEFINED"
399 381
        }
400 382
        "Entry"
......
604 586
        }
605 587
        "File"
606 588
        {
607
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_392252B203784D91A39016FC82CD5887"
589
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_263B85E7C62D146E20358A3F08BBC740"
608 590
            {
609 591
            "AssemblyRegister" = "3:1"
610 592
            "AssemblyIsInGAC" = "11:FALSE"
611
            "AssemblyAsmDisplayName" = "8:WPFToolkit.Extended, Version=1.5.0.0, Culture=neutral, PublicKeyToken=3e4669d2f30244f4, processorArchitecture=MSIL"
593
            "AssemblyAsmDisplayName" = "8:System.Threading.Tasks.Dataflow, Version=0.0.4098.29463, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
612 594
                "ScatterAssemblies"
613 595
                {
614
                    "_392252B203784D91A39016FC82CD5887"
596
                    "_263B85E7C62D146E20358A3F08BBC740"
615 597
                    {
616
                    "Name" = "8:WPFToolkit.Extended.dll"
598
                    "Name" = "8:System.Threading.Tasks.Dataflow.dll"
617 599
                    "Attributes" = "3:512"
618 600
                    }
619 601
                }
620
            "SourcePath" = "8:WPFToolkit.Extended.dll"
602
            "SourcePath" = "8:System.Threading.Tasks.Dataflow.dll"
621 603
            "TargetName" = "8:"
622 604
            "Tag" = "8:"
623 605
            "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
......
635 617
            "IsDependency" = "11:TRUE"
636 618
            "IsolateTo" = "8:"
637 619
            }
638
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4C5B93BC82FE5E63E01458A8DA46B4D6"
620
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_392252B203784D91A39016FC82CD5887"
639 621
            {
640 622
            "AssemblyRegister" = "3:1"
641 623
            "AssemblyIsInGAC" = "11:FALSE"
642
            "AssemblyAsmDisplayName" = "8:Castle.ActiveRecord, Version=3.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"
624
            "AssemblyAsmDisplayName" = "8:WPFToolkit.Extended, Version=1.5.0.0, Culture=neutral, PublicKeyToken=3e4669d2f30244f4, processorArchitecture=MSIL"
643 625
                "ScatterAssemblies"
644 626
                {
645
                    "_4C5B93BC82FE5E63E01458A8DA46B4D6"
627
                    "_392252B203784D91A39016FC82CD5887"
646 628
                    {
647
                    "Name" = "8:Castle.ActiveRecord.dll"
629
                    "Name" = "8:WPFToolkit.Extended.dll"
648 630
                    "Attributes" = "3:512"
649 631
                    }
650 632
                }
651
            "SourcePath" = "8:Castle.ActiveRecord.dll"
633
            "SourcePath" = "8:WPFToolkit.Extended.dll"
652 634
            "TargetName" = "8:"
653 635
            "Tag" = "8:"
654 636
            "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
......
666 648
            "IsDependency" = "11:TRUE"
667 649
            "IsolateTo" = "8:"
668 650
            }
669
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_586310F986FB0DB4F49D3EAFBD87760C"
651
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4C5B93BC82FE5E63E01458A8DA46B4D6"
670 652
            {
671 653
            "AssemblyRegister" = "3:1"
672 654
            "AssemblyIsInGAC" = "11:FALSE"
673
            "AssemblyAsmDisplayName" = "8:log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"
655
            "AssemblyAsmDisplayName" = "8:Castle.ActiveRecord, Version=3.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"
674 656
                "ScatterAssemblies"
675 657
                {
676
                    "_586310F986FB0DB4F49D3EAFBD87760C"
658
                    "_4C5B93BC82FE5E63E01458A8DA46B4D6"
677 659
                    {
678
                    "Name" = "8:log4net.dll"
660
                    "Name" = "8:Castle.ActiveRecord.dll"
679 661
                    "Attributes" = "3:512"
680 662
                    }
681 663
                }
682
            "SourcePath" = "8:log4net.dll"
664
            "SourcePath" = "8:Castle.ActiveRecord.dll"
683 665
            "TargetName" = "8:"
684 666
            "Tag" = "8:"
685 667
            "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
......
697 679
            "IsDependency" = "11:TRUE"
698 680
            "IsolateTo" = "8:"
699 681
            }
700
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5B7E11B508E123A2BA4C11623DA3E029"
682
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_586310F986FB0DB4F49D3EAFBD87760C"
701 683
            {
702 684
            "AssemblyRegister" = "3:1"
703 685
            "AssemblyIsInGAC" = "11:FALSE"
704
            "AssemblyAsmDisplayName" = "8:System.Threading.Tasks.Dataflow, Version=0.0.4098.29463, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
686
            "AssemblyAsmDisplayName" = "8:log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"
705 687
                "ScatterAssemblies"
706 688
                {
707
                    "_5B7E11B508E123A2BA4C11623DA3E029"
689
                    "_586310F986FB0DB4F49D3EAFBD87760C"
708 690
                    {
709
                    "Name" = "8:System.Threading.Tasks.Dataflow.dll"
691
                    "Name" = "8:log4net.dll"
710 692
                    "Attributes" = "3:512"
711 693
                    }
712 694
                }
713
            "SourcePath" = "8:System.Threading.Tasks.Dataflow.dll"
695
            "SourcePath" = "8:log4net.dll"
714 696
            "TargetName" = "8:"
715 697
            "Tag" = "8:"
716 698
            "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
......
883 865
            "IsDependency" = "11:TRUE"
884 866
            "IsolateTo" = "8:"
885 867
            }
886
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_928344C82AF3698D55890E76C45404A5"
887
            {
888
            "AssemblyRegister" = "3:1"
889
            "AssemblyIsInGAC" = "11:FALSE"
890
            "AssemblyAsmDisplayName" = "8:AppLimit.NetSparkle.Net40, Version=1.0.83.0, Culture=neutral, processorArchitecture=MSIL"
891
                "ScatterAssemblies"
892
                {
893
                    "_928344C82AF3698D55890E76C45404A5"
894
                    {
895
                    "Name" = "8:AppLimit.NetSparkle.Net40.dll"
896
                    "Attributes" = "3:512"
897
                    }
898
                }
899
            "SourcePath" = "8:AppLimit.NetSparkle.Net40.dll"
900
            "TargetName" = "8:"
901
            "Tag" = "8:"
902
            "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
903
            "Condition" = "8:"
904
            "Transitive" = "11:FALSE"
905
            "Vital" = "11:TRUE"
906
            "ReadOnly" = "11:FALSE"
907
            "Hidden" = "11:FALSE"
908
            "System" = "11:FALSE"
909
            "Permanent" = "11:FALSE"
910
            "SharedLegacy" = "11:FALSE"
911
            "PackageAs" = "3:1"
912
            "Register" = "3:1"
913
            "Exclude" = "11:FALSE"
914
            "IsDependency" = "11:TRUE"
915
            "IsolateTo" = "8:"
916
            }
917 868
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A490E069DF5DE5852575B6E157EB50BE"
918 869
            {
919 870
            "AssemblyRegister" = "3:1"
......
1375 1326
        {
1376 1327
        "Name" = "8:Microsoft Visual Studio"
1377 1328
        "ProductName" = "8:Pithos"
1378
        "ProductCode" = "8:{57BE17ED-F02F-43C0-B44B-845697CD3D6A}"
1379
        "PackageCode" = "8:{A4185E8B-DEC9-4E52-BBE4-B959A8B30DD2}"
1329
        "ProductCode" = "8:{F0D4CF43-1BE4-4B68-A247-781E31CF37B4}"
1330
        "PackageCode" = "8:{D8D45676-4CC0-40A9-B6E5-0F58306DF8E7}"
1380 1331
        "UpgradeCode" = "8:{205365D1-28AA-4322-A46C-FCB37502C6EF}"
1381 1332
        "AspNetVersion" = "8:4.0.30319.0"
1382 1333
        "RestartWWWService" = "11:FALSE"
1383 1334
        "RemovePreviousVersions" = "11:TRUE"
1384 1335
        "DetectNewerInstalledVersion" = "11:TRUE"
1385 1336
        "InstallAllUsers" = "11:FALSE"
1386
        "ProductVersion" = "8:0.7.20302"
1337
        "ProductVersion" = "8:0.7.20305"
1387 1338
        "Manufacturer" = "8:GRNET"
1388 1339
        "ARPHELPTELEPHONE" = "8:"
1389 1340
        "ARPHELPLINK" = "8:http://code.grnet.gr/projects/pithos-ms-client"
b/trunk/Pithos.Setup.x86/Pithos.Setup.x86.vdproj
21 21
        }
22 22
        "Entry"
23 23
        {
24
        "MsmKey" = "8:_263B85E7C62D146E20358A3F08BBC740"
25
        "OwnerKey" = "8:_A611766CD2793378FFAB2F3063F81496"
26
        "MsmSig" = "8:_UNDEFINED"
27
        }
28
        "Entry"
29
        {
30
        "MsmKey" = "8:_263B85E7C62D146E20358A3F08BBC740"
31
        "OwnerKey" = "8:_AA1756E83B8A428E9A235CF626FD83B2"
32
        "MsmSig" = "8:_UNDEFINED"
33
        }
34
        "Entry"
35
        {
24 36
        "MsmKey" = "8:_392252B203784D91A39016FC82CD5887"
25 37
        "OwnerKey" = "8:_AA1756E83B8A428E9A235CF626FD83B2"
26 38
        "MsmSig" = "8:_UNDEFINED"
......
63 75
        }
64 76
        "Entry"
65 77
        {
66
        "MsmKey" = "8:_5B7E11B508E123A2BA4C11623DA3E029"
67
        "OwnerKey" = "8:_E42C4D0836CDB6008642BC929C51E416"
68
        "MsmSig" = "8:_UNDEFINED"
69
        }
70
        "Entry"
71
        {
72
        "MsmKey" = "8:_5B7E11B508E123A2BA4C11623DA3E029"
73
        "OwnerKey" = "8:_AA1756E83B8A428E9A235CF626FD83B2"
74
        "MsmSig" = "8:_UNDEFINED"
75
        }
76
        "Entry"
77
        {
78
        "MsmKey" = "8:_5B7E11B508E123A2BA4C11623DA3E029"
79
        "OwnerKey" = "8:_A611766CD2793378FFAB2F3063F81496"
80
        "MsmSig" = "8:_UNDEFINED"
81
        }
82
        "Entry"
83
        {
84 78
        "MsmKey" = "8:_626ECD9012C5D7BD4388B6BE07F5107D"
85 79
        "OwnerKey" = "8:_AA1756E83B8A428E9A235CF626FD83B2"
86 80
        "MsmSig" = "8:_UNDEFINED"
......
382 376
        "Entry"
383 377
        {
384 378
        "MsmKey" = "8:_UNDEFINED"
385
        "OwnerKey" = "8:_5B7E11B508E123A2BA4C11623DA3E029"
379
        "OwnerKey" = "8:_263B85E7C62D146E20358A3F08BBC740"
386 380
        "MsmSig" = "8:_UNDEFINED"
387 381
        }
388 382
        "Entry"
......
592 586
        }
593 587
        "File"
594 588
        {
595
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_392252B203784D91A39016FC82CD5887"
589
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_263B85E7C62D146E20358A3F08BBC740"
596 590
            {
597 591
            "AssemblyRegister" = "3:1"
598 592
            "AssemblyIsInGAC" = "11:FALSE"
599
            "AssemblyAsmDisplayName" = "8:WPFToolkit.Extended, Version=1.5.0.0, Culture=neutral, PublicKeyToken=3e4669d2f30244f4, processorArchitecture=MSIL"
593
            "AssemblyAsmDisplayName" = "8:System.Threading.Tasks.Dataflow, Version=0.0.4098.29463, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
600 594
                "ScatterAssemblies"
601 595
                {
596
                    "_263B85E7C62D146E20358A3F08BBC740"
597
                    {
598
                    "Name" = "8:System.Threading.Tasks.Dataflow.dll"
599
                    "Attributes" = "3:512"
600
                    }
602 601
                }
603
            "SourcePath" = "8:WPFToolkit.Extended.dll"
602
            "SourcePath" = "8:System.Threading.Tasks.Dataflow.dll"
604 603
            "TargetName" = "8:"
605 604
            "Tag" = "8:"
606 605
            "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
......
618 617
            "IsDependency" = "11:TRUE"
619 618
            "IsolateTo" = "8:"
620 619
            }
621
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4C5B93BC82FE5E63E01458A8DA46B4D6"
620
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_392252B203784D91A39016FC82CD5887"
622 621
            {
623 622
            "AssemblyRegister" = "3:1"
624 623
            "AssemblyIsInGAC" = "11:FALSE"
625
            "AssemblyAsmDisplayName" = "8:Castle.ActiveRecord, Version=3.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"
624
            "AssemblyAsmDisplayName" = "8:WPFToolkit.Extended, Version=1.5.0.0, Culture=neutral, PublicKeyToken=3e4669d2f30244f4, processorArchitecture=MSIL"
626 625
                "ScatterAssemblies"
627 626
                {
627
                    "_392252B203784D91A39016FC82CD5887"
628
                    {
629
                    "Name" = "8:WPFToolkit.Extended.dll"
630
                    "Attributes" = "3:512"
631
                    }
628 632
                }
629
            "SourcePath" = "8:Castle.ActiveRecord.dll"
633
            "SourcePath" = "8:WPFToolkit.Extended.dll"
630 634
            "TargetName" = "8:"
631 635
            "Tag" = "8:"
632 636
            "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
......
644 648
            "IsDependency" = "11:TRUE"
645 649
            "IsolateTo" = "8:"
646 650
            }
647
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_586310F986FB0DB4F49D3EAFBD87760C"
651
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4C5B93BC82FE5E63E01458A8DA46B4D6"
648 652
            {
649 653
            "AssemblyRegister" = "3:1"
650 654
            "AssemblyIsInGAC" = "11:FALSE"
651
            "AssemblyAsmDisplayName" = "8:log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"
655
            "AssemblyAsmDisplayName" = "8:Castle.ActiveRecord, Version=3.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"
652 656
                "ScatterAssemblies"
653 657
                {
658
                    "_4C5B93BC82FE5E63E01458A8DA46B4D6"
659
                    {
660
                    "Name" = "8:Castle.ActiveRecord.dll"
661
                    "Attributes" = "3:512"
662
                    }
654 663
                }
655
            "SourcePath" = "8:log4net.dll"
664
            "SourcePath" = "8:Castle.ActiveRecord.dll"
656 665
            "TargetName" = "8:"
657 666
            "Tag" = "8:"
658 667
            "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
......
670 679
            "IsDependency" = "11:TRUE"
671 680
            "IsolateTo" = "8:"
672 681
            }
673
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5B7E11B508E123A2BA4C11623DA3E029"
682
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_586310F986FB0DB4F49D3EAFBD87760C"
674 683
            {
675 684
            "AssemblyRegister" = "3:1"
676 685
            "AssemblyIsInGAC" = "11:FALSE"
677
            "AssemblyAsmDisplayName" = "8:System.Threading.Tasks.Dataflow, Version=0.0.4098.29463, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
686
            "AssemblyAsmDisplayName" = "8:log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"
678 687
                "ScatterAssemblies"
679 688
                {
689
                    "_586310F986FB0DB4F49D3EAFBD87760C"
690
                    {
691
                    "Name" = "8:log4net.dll"
692
                    "Attributes" = "3:512"
693
                    }
680 694
                }
681
            "SourcePath" = "8:System.Threading.Tasks.Dataflow.dll"
695
            "SourcePath" = "8:log4net.dll"
682 696
            "TargetName" = "8:"
683 697
            "Tag" = "8:"
684 698
            "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
......
703 717
            "AssemblyAsmDisplayName" = "8:ParallelExtensionsExtras, Version=1.2.0.0, Culture=neutral, PublicKeyToken=2cc55badaa91f4de, processorArchitecture=MSIL"
704 718
                "ScatterAssemblies"
705 719
                {
720
                    "_626ECD9012C5D7BD4388B6BE07F5107D"
721
                    {
722
                    "Name" = "8:ParallelExtensionsExtras.dll"
723
                    "Attributes" = "3:512"
724
                    }
706 725
                }
707 726
            "SourcePath" = "8:ParallelExtensionsExtras.dll"
708 727
            "TargetName" = "8:"
......
729 748
            "AssemblyAsmDisplayName" = "8:Caliburn.Micro, Version=1.2.0.0, Culture=neutral, PublicKeyToken=8e5891231f2ed21f, processorArchitecture=MSIL"
730 749
                "ScatterAssemblies"
731 750
                {
751
                    "_6BC141E8128E964AD9B9281537E64BEA"
752
                    {
753
                    "Name" = "8:Caliburn.Micro.dll"
754
                    "Attributes" = "3:512"
755
                    }
732 756
                }
733 757
            "SourcePath" = "8:Caliburn.Micro.dll"
734 758
            "TargetName" = "8:"
......
755 779
            "AssemblyAsmDisplayName" = "8:System.Data.SQLite, Version=1.0.76.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86"
756 780
                "ScatterAssemblies"
757 781
                {
782
                    "_71EDC030F43F0D5A22D833BE7229E576"
783
                    {
784
                    "Name" = "8:System.Data.SQLite.dll"
785
                    "Attributes" = "3:512"
786
                    }
758 787
                }
759 788
            "SourcePath" = "8:System.Data.SQLite.dll"
760 789
            "TargetName" = "8:"
......
781 810
            "AssemblyAsmDisplayName" = "8:NHibernate, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL"
782 811
                "ScatterAssemblies"
783 812
                {
813
                    "_89E3F50B2C3DDF59B632A4BEFEE3D3A1"
814
                    {
815
                    "Name" = "8:NHibernate.dll"
816
                    "Attributes" = "3:512"
817
                    }
784 818
                }
785 819
            "SourcePath" = "8:NHibernate.dll"
786 820
            "TargetName" = "8:"
......
807 841
            "AssemblyAsmDisplayName" = "8:System.Windows.Interactivity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
808 842
                "ScatterAssemblies"
809 843
                {
844
                    "_91EEC8BDF3543C1C3379FB93171A844E"
845
                    {
846
                    "Name" = "8:System.Windows.Interactivity.dll"
847
                    "Attributes" = "3:512"
848
                    }
810 849
                }
811 850
            "SourcePath" = "8:System.Windows.Interactivity.dll"
812 851
            "TargetName" = "8:"
......
833 872
            "AssemblyAsmDisplayName" = "8:AsyncCtpLibrary, Version=1.0.4107.18181, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
834 873
                "ScatterAssemblies"
835 874
                {
875
                    "_A490E069DF5DE5852575B6E157EB50BE"
876
                    {
877
                    "Name" = "8:AsyncCtpLibrary.dll"
878
                    "Attributes" = "3:512"
879
                    }
836 880
                }
837 881
            "SourcePath" = "8:AsyncCtpLibrary.dll"
838 882
            "TargetName" = "8:"
......
859 903
            "AssemblyAsmDisplayName" = "8:Pithos.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2cc55badaa91f4de, processorArchitecture=x86"
860 904
                "ScatterAssemblies"
861 905
                {
906
                    "_A611766CD2793378FFAB2F3063F81496"
907
                    {
908
                    "Name" = "8:Pithos.Core.dll"
909
                    "Attributes" = "3:512"
910
                    }
862 911
                }
863 912
            "SourcePath" = "8:Pithos.Core.dll"
864 913
            "TargetName" = "8:"
......
905 954
            "AssemblyAsmDisplayName" = "8:Castle.Components.Validator, Version=2.5.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"
906 955
                "ScatterAssemblies"
907 956
                {
957
                    "_B998E7FC1F540278910B0D58694455C2"
958
                    {
959
                    "Name" = "8:Castle.Components.Validator.dll"
960
                    "Attributes" = "3:512"
961
                    }
908 962
                }
909 963
            "SourcePath" = "8:Castle.Components.Validator.dll"
910 964
            "TargetName" = "8:"
......
931 985
            "AssemblyAsmDisplayName" = "8:Newtonsoft.Json, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b9a188c8922137c6, processorArchitecture=MSIL"
932 986
                "ScatterAssemblies"
933 987
                {
988
                    "_C7EE41E4C982C8217BD7DCDA76836670"
989
                    {
990
                    "Name" = "8:Newtonsoft.Json.dll"
991
                    "Attributes" = "3:512"
992
                    }
934 993
                }
935 994
            "SourcePath" = "8:Newtonsoft.Json.dll"
936 995
            "TargetName" = "8:"
......
957 1016
            "AssemblyAsmDisplayName" = "8:NHibernate.ByteCode.Castle, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL"
958 1017
                "ScatterAssemblies"
959 1018
                {
1019
                    "_DD69E9C0F36E10A97EB92CFBAFD2662D"
1020
                    {
1021
                    "Name" = "8:NHibernate.ByteCode.Castle.dll"
1022
                    "Attributes" = "3:512"
1023
                    }
960 1024
                }
961 1025
            "SourcePath" = "8:NHibernate.ByteCode.Castle.dll"
962 1026
            "TargetName" = "8:"
......
983 1047
            "AssemblyAsmDisplayName" = "8:Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL"
984 1048
                "ScatterAssemblies"
985 1049
                {
1050
                    "_DD70D5956F2E708F680AF121870FFCCD"
1051
                    {
1052
                    "Name" = "8:Iesi.Collections.dll"
1053
                    "Attributes" = "3:512"
1054
                    }
986 1055
                }
987 1056
            "SourcePath" = "8:Iesi.Collections.dll"
988 1057
            "TargetName" = "8:"
......
1009 1078
            "AssemblyAsmDisplayName" = "8:Pithos.Network, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2cc55badaa91f4de, processorArchitecture=MSIL"
1010 1079
                "ScatterAssemblies"
1011 1080
                {
1081
                    "_E42C4D0836CDB6008642BC929C51E416"
1082
                    {
1083
                    "Name" = "8:Pithos.Network.dll"
1084
                    "Attributes" = "3:512"
1085
                    }
1012 1086
                }
1013 1087
            "SourcePath" = "8:Pithos.Network.dll"
1014 1088
            "TargetName" = "8:"
......
1035 1109
            "AssemblyAsmDisplayName" = "8:Pithos.Interfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2cc55badaa91f4de, processorArchitecture=MSIL"
1036 1110
                "ScatterAssemblies"
1037 1111
                {
1112
                    "_E46F39A63288379E63BDD76C9F21CC3E"
1113
                    {
1114
                    "Name" = "8:Pithos.Interfaces.dll"
1115
                    "Attributes" = "3:512"
1116
                    }
1038 1117
                }
1039 1118
            "SourcePath" = "8:Pithos.Interfaces.dll"
1040 1119
            "TargetName" = "8:"
......
1061 1140
            "AssemblyAsmDisplayName" = "8:Castle.Core, Version=2.5.1.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"
1062 1141
                "ScatterAssemblies"
1063 1142
                {
1143
                    "_F472AA6700476700D62AABE8262628BF"
1144
                    {
1145
                    "Name" = "8:Castle.Core.dll"
1146
                    "Attributes" = "3:512"
1147
                    }
1064 1148
                }
1065 1149
            "SourcePath" = "8:Castle.Core.dll"
1066 1150
            "TargetName" = "8:"
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff