<TextBlock Text="Container: " />
<TextBlock x:Name="Container" Text="Container" />
</StackPanel>
+ <StackPanel Orientation="Horizontal" Grid.Row="1">
+ <TextBlock Text="Synch Status: " />
+ <TextBlock x:Name="SynchStatus" Text="Normal" />
+ </StackPanel>
+
</StackPanel>
<TextBlock x:Name="ShortSize" Text="345 KB" FontWeight="Bold" FontSize="14" Grid.Column="2" HorizontalAlignment="Left" Margin="5"/>
</Grid>
using Caliburn.Micro;
using Pithos.Client.WPF.FileProperties;
using Pithos.Client.WPF.Properties;
+using Pithos.Core;
using Pithos.Interfaces;
using Pithos.Network;
}
}
+ private string _synchStatus;
+ public string SynchStatus
+ {
+ get { return _synchStatus; }
+ set
+ {
+ _synchStatus = value;
+ NotifyOfPropertyChange(()=>SynchStatus);
+ }
+ }
+
public bool TagsChanged { get; private set; }
public bool PermissionsChanged { get; private set; }
}
else
Execute.OnUIThread(() => PithosFile = t.Result);
- });
+ });
+
}
private void ShowError(AggregateException exception)
BitmapSizeOptions.FromEmptyOptions());
}
}
+
+ var status=Shell.GetFileStatus(LocalFileName);
+ SynchStatus = Enum.GetName(typeof (FileStatus), status);
+
+
NotifyOfPropertyChange(()=>PithosFile);
IsBusy = false;
}
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
- <None Include="app.config" />
+ <None Include="app.config">
+ <SubType>Designer</SubType>
+ </None>
<None Include="packages.config" />
<None Include="pithos.snk" />
<None Include="Properties\Settings.settings">
<Resource Include="Images\SmallLogo.png" />
</ItemGroup>
<ItemGroup>
- <Resource Include="Images\logo.png" />
+ <SplashScreen Include="Images\logo.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\Folder.ico" />
<Window x:Class="Pithos.Client.WPF.Preferences.ProxyAccountView"\r
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\r
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\r
- xmlns:Converters="clr-namespace:Pithos.Client.WPF.Converters" Title="ProxyAccountView" Height="300" Width="400">\r
+ xmlns:Converters="clr-namespace:Pithos.Client.WPF.Converters" Title="ProxyAccountView" Height="300" Width="400" Topmost="True">\r
<Window.Resources>\r
<ResourceDictionary>\r
<ResourceDictionary.MergedDictionaries>\r
xmlns:tb="clr-namespace:Hardcodet.Wpf.TaskbarNotification;assembly=Hardcodet.Wpf.TaskbarNotification"
xmlns:cal="http://www.caliburnproject.org"
x:Name="TheView" WindowStartupLocation="CenterScreen" WindowStyle="None"
- Width="700" Height="200" SizeToContent="Width">
+ Visibility="Collapsed"
+ Width="700" Height="200" SizeToContent="Width" WindowState="Minimized">
+<!--
<Window.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#4085A5" Offset="0"/>
<GradientStop Color="#D7E8F0" Offset="1"/>
</LinearGradientBrush>
</Window.Background>
+-->
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
</ContextMenu>
</tb:TaskbarIcon.ContextMenu>
</tb:TaskbarIcon>
+<!--
<Image Margin="0,0,10,5" Source="/Pithos.Client.WPF;component/Images/logo.png" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stretch="None"/>
+-->
</Grid>
</Window>
}
+ //SMELL: Doing so much work for notifications in the shell is wrong
+ //The notifications should be moved to their own view/viewmodel pair
+ //and different templates should be used for different message types
+ //This will also allow the addition of extra functionality, eg. actions
+ //to perform when clicking on a balloon
public void Handle(Notification notification)
{
if (!Settings.ShowDesktopNotifications)
return matchingFolders.Any();
}
+ public FileStatus GetFileStatus(string localFileName)
+ {
+ if (String.IsNullOrWhiteSpace(localFileName))
+ throw new ArgumentNullException("localFileName");
+ Contract.EndContractBlock();
+
+ var statusKeeper = IoC.Get<IStatusKeeper>();
+ var status=statusKeeper.GetFileStatus(localFileName);
+ return status;
+ }
}
}
<acceptOnMatch value="false" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
+ <loggerToMatch value="NHibernate.SQL" />
+ <acceptOnMatch value="true" />
+ </filter>
+ <filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="NHibernate" />
<acceptOnMatch value="false" />
</filter>
public async Task PollRemoteFiles(DateTime? since = null,bool repeat=true)
{
- _tcs = new TaskCompletionSource<bool>();
- var wait = TaskEx.Delay(TimeSpan.FromSeconds(Settings.PollingInterval), _agent.CancellationToken);
- var signaledTask=await TaskEx.WhenAny(_tcs.Task,wait);
- //If polling is signalled by SynchNow, ignore the since tag
- if (signaledTask is Task<bool>)
- since = null;
using (log4net.ThreadContext.Stacks["Retrieve Remote"].Push("All accounts"))
{
-
+ //If this poll fails, we will retry with the same since value
+ var nextSince = since;
try
{
//Next time we will check for all changes since the current check minus 1 second
//This is done to ensure there are no discrepancies due to clock differences
- DateTime nextSince = DateTime.Now.AddSeconds(-1);
+ DateTime current = DateTime.Now.AddSeconds(-1);
var tasks = from accountInfo in _accounts
select ProcessAccountFiles(accountInfo, since);
await TaskEx.WhenAll(tasks.ToList());
-
+
_firstPoll = false;
+ //Reschedule the poll with the current timestamp as a "since" value
if (repeat)
- PollRemoteFiles(nextSince);
+ nextSince = current;
+ else
+ return;
}
catch (Exception ex)
{
Log.ErrorFormat("Error while processing accounts\r\n{0}",ex);
- //In case of failure retry with the same parameter
- PollRemoteFiles(since);
+ //In case of failure retry with the same "since" value
}
-
+
+ //Wait for the polling interval to pass or the Manual flat to be toggled
+ nextSince = await WaitForScheduledOrManualPoll(nextSince);
+
+ PollRemoteFiles(nextSince);
}
}
+ private async Task<DateTime?> WaitForScheduledOrManualPoll(DateTime? since)
+ {
+ _tcs = new TaskCompletionSource<bool>();
+ var wait = TaskEx.Delay(TimeSpan.FromSeconds(Settings.PollingInterval), _agent.CancellationToken);
+ var signaledTask = await TaskEx.WhenAny(_tcs.Task, wait);
+ //If polling is signalled by SynchNow, ignore the since tag
+ if (signaledTask is Task<bool>)
+ return null;
+ return since;
+ }
+
public async Task ProcessAccountFiles(AccountInfo accountInfo,DateTime? since=null)
{
if (accountInfo==null)
//in two steps
//NOTE: DON'T return files that are already in conflict. The first poll would mark them as
//"In Conflict" but subsequent polls would delete them
+/* var t=FileState.Find(new Guid("{cd664c9a-5f17-47c9-b27f-3bcbcb0595ff}"));
+
+ var d0 = FileState.Queryable
+ .Where(state =>
+ state.FilePath.StartsWith(accountInfo.AccountPath)).ToList();
+
+ var d1 = FileState.Queryable
+ .Where(state => state.Modified <= pollTime).ToList();
+ var d2= FileState.Queryable
+ .Where(state => state.Modified <= pollTime
+ &&
+ state.FilePath.StartsWith(accountInfo.AccountPath)).ToList();*/
+
+ var deleteCandidates = FileState.Queryable
+ .Where(state => state.Modified <= pollTime
+ &&
+ state.FilePath.StartsWith(accountInfo.AccountPath)
+ && state.FileStatus != FileStatus.Conflict).ToList();
+/*
var deleteCandidates = (from state in FileState.Queryable
where
state.Modified <= pollTime
&& state.FilePath.StartsWith(accountInfo.AccountPath)
&& state.FileStatus != FileStatus.Conflict
select state).ToList();
+*/
var filesToDelete = (from deleteCandidate in deleteCandidates
let localFile = FileInfoExtensions.FromPath(deleteCandidate.FilePath)
ActiveRecordStarter.CreateSchema();
CreateTrigger();
+
}
private void CreateTrigger()
var command = new SQLiteCommand("select FileStatus from FileState where FilePath=:path COLLATE NOCASE", connection);
command.Parameters.AddWithValue("path", path);
- var s = command.ExecuteScalar();
- return (FileStatus)Convert.ToInt32(s);
+ var statusValue = command.ExecuteScalar();
+ if (statusValue==null)
+ return FileStatus.Missing;
+ return (FileStatus)Convert.ToInt32(statusValue);
}
}
}
}
}
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5004716641E24919B137F1EBC3425C49"
+ {
+ "Name" = "8:Deleted"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6EA88C3929B240A5940D0651BAA1F2B8"
+ {
+ "Name" = "8:Pithos"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:{11051AB4-D786-4248-BC6E-369F25EC74E4}"
+ }
+ }
+ }
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5F1A26A61A6941F48D1A7500DAC510CA"
{
"Name" = "8:Unversioned"
}
}
}
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_93AA85194A7C4BC993A3F802F8698C10"
+ {
+ "Name" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D7EBDBE444D6447080D0E4548FB1594A"
+ {
+ "Name" = "8:CLSID"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_644D37D72EC548A68375806875898F76"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:{11051AB4-D786-4248-BC6E-369F25EC74E4}"
+ }
+ }
+ }
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E1D994BA8DDF4F2398C79D10547A0F4B"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ }
+ }
+ }
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9704B86B3D7945719532C09F94835F03"
{
"Name" = "8:Pithos.ShellExtensions.Overlays.UnversionedIconOverlay"
}
}
}
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_7BDD6C3DBD78419DA3C16F6DBC551F1C"
+ {
+ "Name" = "8:{11051AB4-D786-4248-BC6E-369F25EC74E4}"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_056BA5B3933148D88E11459D5B0C83EE"
+ {
+ "Name" = "8:Implemented Categories"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CBAA1F96E33D4C3E883132C87C710B52"
+ {
+ "Name" = "8:{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ }
+ }
+ }
+ "Values"
+ {
+ }
+ }
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_05C71F10F2E645F8B8448EC90CF7F540"
+ {
+ "Name" = "8:ProgId"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7EEFD9EE0F2D4B688C5FBC98C5253524"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ }
+ }
+ }
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_97922C7E8A46448994C5855C4AF2BC35"
+ {
+ "Name" = "8:InprocServer32"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_004ACDE8A99B4AF0B0CE3E7B1B6EF3E6"
+ {
+ "Name" = "8:CodeBase"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:[TARGETDIR]\\Pithos.ShellExtensions.dll"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_CC7C253FCA0A4DB4817983C966609C97"
+ {
+ "Name" = "8:Assembly"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2cc55badaa91f4de"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D89C8DF5F19D4CC5AB6734B9CB3B7D76"
+ {
+ "Name" = "8:Class"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E132EA37A841421BACAE854339C512CD"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:mscoree.dll"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E409F83FAB574BC6AC3730DAC0E12F63"
+ {
+ "Name" = "8:RuntimeVersion"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:v4.0.30319"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_ED712CA1A5FF4C33850858CA22E23731"
+ {
+ "Name" = "8:ThreadingModel"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Both"
+ }
+ }
+ }
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_DDE72707F46047BA8983005622638C43"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ }
+ }
+ }
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9A1D2A7CF4D44D2A92F49560D1B5BCF2"
{
"Name" = "8:{10CF08FE-1252-4AAB-BE78-971B0C5E8AE0}"
}
"Entry"
{
- "MsmKey" = "8:_F693ED58D49B3EC1892CE4184575B87B"
- "OwnerKey" = "8:_11BDAAF760654D3792A432B5EB874364"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_F693ED58D49B3EC1892CE4184575B87B"
- "OwnerKey" = "8:_EBAF62F0335F4918AB23EDA708507D1F"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_F693ED58D49B3EC1892CE4184575B87B"
- "OwnerKey" = "8:_A611766CD2793378FFAB2F3063F81496"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
"MsmKey" = "8:_FA76529F78D7D6108EDBA33F19836A6B"
"OwnerKey" = "8:_11BDAAF760654D3792A432B5EB874364"
"MsmSig" = "8:_UNDEFINED"
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
- "OwnerKey" = "8:_F693ED58D49B3EC1892CE4184575B87B"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_4C5B93BC82FE5E63E01458A8DA46B4D6"
"MsmSig" = "8:_UNDEFINED"
}
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
- "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F693ED58D49B3EC1892CE4184575B87B"
- {
- "AssemblyRegister" = "3:1"
- "AssemblyIsInGAC" = "11:FALSE"
- "AssemblyAsmDisplayName" = "8:Microsoft.WindowsAPICodePack, Version=1.1.0.0, Culture=neutral, PublicKeyToken=2cc55badaa91f4de, processorArchitecture=MSIL"
- "ScatterAssemblies"
- {
- "_F693ED58D49B3EC1892CE4184575B87B"
- {
- "Name" = "8:Microsoft.WindowsAPICodePack.dll"
- "Attributes" = "3:512"
- }
- }
- "SourcePath" = "8:Microsoft.WindowsAPICodePack.dll"
- "TargetName" = "8:"
- "Tag" = "8:"
- "Folder" = "8:_FA3E4362540D4C76A5914763C178A3BD"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:TRUE"
- "IsolateTo" = "8:"
- }
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FA76529F78D7D6108EDBA33F19836A6B"
{
"AssemblyRegister" = "3:1"
}
}
}
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5004716641E24919B137F1EBC3425C49"
+ {
+ "Name" = "8:Deleted"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6EA88C3929B240A5940D0651BAA1F2B8"
+ {
+ "Name" = "8:Pithos"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:{11051AB4-D786-4248-BC6E-369F25EC74E4}"
+ }
+ }
+ }
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5F1A26A61A6941F48D1A7500DAC510CA"
{
"Name" = "8:Unversioned"
}
}
}
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_93AA85194A7C4BC993A3F802F8698C10"
+ {
+ "Name" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D7EBDBE444D6447080D0E4548FB1594A"
+ {
+ "Name" = "8:CLSID"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_644D37D72EC548A68375806875898F76"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:{11051AB4-D786-4248-BC6E-369F25EC74E4}"
+ }
+ }
+ }
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E1D994BA8DDF4F2398C79D10547A0F4B"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ }
+ }
+ }
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9704B86B3D7945719532C09F94835F03"
{
"Name" = "8:Pithos.ShellExtensions.Overlays.UnversionedIconOverlay"
}
}
}
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_7BDD6C3DBD78419DA3C16F6DBC551F1C"
+ {
+ "Name" = "8:{11051AB4-D786-4248-BC6E-369F25EC74E4}"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_056BA5B3933148D88E11459D5B0C83EE"
+ {
+ "Name" = "8:Implemented Categories"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CBAA1F96E33D4C3E883132C87C710B52"
+ {
+ "Name" = "8:{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ }
+ }
+ }
+ "Values"
+ {
+ }
+ }
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_05C71F10F2E645F8B8448EC90CF7F540"
+ {
+ "Name" = "8:ProgId"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7EEFD9EE0F2D4B688C5FBC98C5253524"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ }
+ }
+ }
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_97922C7E8A46448994C5855C4AF2BC35"
+ {
+ "Name" = "8:InprocServer32"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_004ACDE8A99B4AF0B0CE3E7B1B6EF3E6"
+ {
+ "Name" = "8:CodeBase"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:[TARGETDIR]\\Pithos.ShellExtensions.dll"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_CC7C253FCA0A4DB4817983C966609C97"
+ {
+ "Name" = "8:Assembly"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2cc55badaa91f4de"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D89C8DF5F19D4CC5AB6734B9CB3B7D76"
+ {
+ "Name" = "8:Class"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E132EA37A841421BACAE854339C512CD"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:mscoree.dll"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E409F83FAB574BC6AC3730DAC0E12F63"
+ {
+ "Name" = "8:RuntimeVersion"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:v4.0.30319"
+ }
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_ED712CA1A5FF4C33850858CA22E23731"
+ {
+ "Name" = "8:ThreadingModel"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Both"
+ }
+ }
+ }
+ }
+ "Values"
+ {
+ "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_DDE72707F46047BA8983005622638C43"
+ {
+ "Name" = "8:"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "ValueTypes" = "3:1"
+ "Value" = "8:Pithos.ShellExtensions.Overlays.DeletedIconOverlay"
+ }
+ }
+ }
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9A1D2A7CF4D44D2A92F49560D1B5BCF2"
{
"Name" = "8:{10CF08FE-1252-4AAB-BE78-971B0C5E8AE0}"
--- /dev/null
+using System;\r
+using System.Runtime.InteropServices;\r
+\r
+namespace Pithos.ShellExtensions.Overlays\r
+{\r
+ [ClassInterface(ClassInterfaceType.None), ComVisible(true)]\r
+ [Guid("11051AB4-D786-4248-BC6E-369F25EC74E4")]\r
+ public class DeletedIconOverlay: IconOverlayBase\r
+ {\r
+\r
+ private static string _iconName = "Deleted";\r
+\r
+ public DeletedIconOverlay()\r
+ : base(_iconName)\r
+ {\r
+ \r
+ }\r
+\r
+ #region Shell Extension Registration\r
+ [ComRegisterFunction()]\r
+ public static void Register(Type t)\r
+ {\r
+ RegisterOverlay(t,_iconName);\r
+ }\r
+\r
+ [ComUnregisterFunction]\r
+ public static void Unregister(Type t)\r
+ {\r
+ UnregisterOverlay(t,_iconName);\r
+ }\r
+\r
+ #endregion\r
+\r
+\r
+ }\r
+}
\ No newline at end of file
<Compile Include="Menus\MenuItem.cs" />
<Compile Include="Overlays\AddedIcodOverlay.cs" />
<Compile Include="Overlays\ConflictIconOverlay.cs" />
+ <Compile Include="Overlays\DeletedIconOverlay.cs" />
<Compile Include="Overlays\IconOverlayBase.cs" />
<Compile Include="Overlays\ModifiedIconOverlay.cs" />
<Compile Include="Overlays\NormalIconOverlay.cs" />