Statistics
| Branch: | Revision:

root / trunk / Pithos.ShellExtensions / Overlays / IconOverlayBase.cs @ 29672672

History | View | Annotate | Download (3.7 kB)

1
using System;
2
using System.Diagnostics;
3
using System.Diagnostics.Contracts;
4
using System.IO;
5

    
6
using System.ComponentModel.Composition;
7
using Pithos.Interfaces;
8

    
9
namespace Pithos.ShellExtensions.Overlays
10
{
11

    
12
    public class IconOverlayBase : IShellIconOverlayIdentifier
13
    {
14
        protected static string PithosPrefix = "0Pithos";
15

    
16
        public string OverlayName { get; private set; }
17
        public string IconPath { get; private set; }
18

    
19
        [Import(typeof (IStatusChecker))] 
20
        public IStatusChecker StatusChecker;
21
        [Import(typeof (IPithosSettings))] 
22
        public IPithosSettings Settings;
23

    
24

    
25

    
26
        public IconOverlayBase(string iconName)
27
        {
28
            Trace.Write("Icon Overlay Instance created");
29
            IoC.Current.Compose(this);
30
            
31

    
32
            string overlayName=PithosPrefix + iconName;
33
            string iconFile = iconName + "Icon.ico";
34

    
35

    
36
            var iconsFolder = Settings.IconsPath;
37
            var fullPath = Path.Combine(iconsFolder, iconFile);
38

    
39
            OverlayName = overlayName;
40
            IconPath = fullPath;
41

    
42
            
43
        }
44

    
45

    
46
        public int IsMemberOf(string path, uint attributes)
47
        {
48
            if (String.IsNullOrWhiteSpace(path))
49
                throw new ArgumentNullException("Empty path");
50

    
51
            Trace.Write(String.Format("ICON Status check for {0} - {1}",path,GetType().Name));
52
            
53
            if (!path.StartsWith(Settings.PithosPath,true,null))
54
                return WinError.S_FALSE;
55

    
56
            var status=StatusChecker.GetFileOverlayStatus(path);
57
            var isMember = (PithosPrefix + status == OverlayName);
58
            Trace.Write(String.Format("Status check for {0} is {1}",path,isMember));
59
            return isMember ? WinError.S_OK : WinError.S_FALSE;
60
        }
61

    
62
        public int GetOverlayInfo(
63
            IntPtr iconFileBuffer,
64
            int iconFileBufferSize,
65
            out int iconIndex,
66
            out uint flags)
67
        {
68
            Trace.Write("Looking for icons");
69

    
70
            Trace.WriteLine(string.Format("ICON file {0}", IconPath));
71
            
72
            int bytesCount = System.Text.Encoding.Unicode.GetByteCount(IconPath);
73

    
74
            Trace.WriteLine(string.Format(" GetOverlayInfo::{0}",bytesCount));
75

    
76
            MarshalHelpers.CopyToBuffer(IconPath, iconFileBuffer, iconFileBufferSize);
77

    
78
            flags = (uint)(ISIOI.ISIOI_ICONFILE);// | ISIOI.ISIOI_ICONINDEX);
79
            iconIndex = 0;
80
            return WinError.S_OK;
81
        }
82

    
83
        public int  GetPriority(out int priority)
84
        {
85
            Trace.Write("Checking for priority");
86
            priority = 0;
87
            return WinError.S_OK;
88
        }
89

    
90
        
91
        public static void RegisterOverlay(Type t,string iconName)
92
        {
93
            try
94
            {
95
                
96
                ShellExtReg.RegisterIconOverlayIdentifier(t.GUID, iconName);
97

    
98
                NativeMethods.SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST,
99
                                             IntPtr.Zero, IntPtr.Zero);
100
                Trace.Write("Registered icon handler");
101
            }
102
            catch (Exception ex)
103
            {
104
                Trace.WriteLine(ex.Message); // Log the error
105
                throw;  // Re-throw the exception
106
            }
107
        }
108

    
109
        
110
        public static void UnregisterOverlay(Type t,string iconName)
111
        {
112
            try
113
            {                
114
                ShellExtReg.UnregisterIconOverlayIdentifier(t.GUID, iconName);
115
                Trace.Write("UnRegistered icon handler");
116
            }
117
            catch (Exception ex)
118
            {
119
                Trace.WriteLine(ex.Message); // Log the error
120
                throw;  // Re-throw the exception
121
            }
122
        }
123
    }
124

    
125
}