Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.9.1, 0.9.1.1, and 0.9.2

stable shellext: split context menu handler off into it's own COM server

Previously, the overlay handler for the 'normal' state and the context
menu handler shared the same COM server object, which is very confusing
to understand and hackish.

It also makes it impossible to tear them appart.

Now, the cmenu handler is registered under its own classid
B456DB9F-7BF4-478c-937A-05130C2C212E and there are two implementation
classes.

Changeset 3800d1a4cbc6

Parent f732a750e02b

by Adrian Buehlmann

Changes to 5 files · Browse files at 3800d1a4cbc6 Showing diff from parent f732a750e02b Diff from another changeset...

 
12
13
14
 
 
 
 
 
 
 
 
 
 
15
16
17
 
64
65
66
 
67
68
69
70
 
71
72
73
 
75
76
77
78
 
79
80
 
81
82
83
 
84
85
 
86
87
88
 
89
90
 
91
92
93
 
94
95
 
96
97
98
 
99
100
 
101
102
103
 
104
105
 
106
 
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
74
75
76
77
78
79
80
81
82
83
84
85
 
87
88
89
 
90
91
 
92
93
94
 
95
96
 
97
98
99
 
100
101
 
102
103
104
 
105
106
 
107
108
109
 
110
111
 
112
113
114
 
115
116
 
117
118
@@ -12,6 +12,16 @@
 Root: HKLM32; Subkey: Software\TortoiseHg; Check: Is64BitInstallMode; Flags: uninsdeletekey  Root: HKLM32; Subkey: Software\TortoiseHg; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {app}   +; cmenu handler COM control +Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; Flags: uninsdeletekey; Components: shell +Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; ValueType: string; ValueName: ; ValueData: TortoiseHg; Components: shell +Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; ValueType: string; ValueName: ; ValueData: {app}\THgShell.dll; Components: shell +Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; ValueType: string; ValueName: ThreadingModel; ValueData: Apartment; Components: shell +Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell +Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: TortoiseHg; Components: shell +Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {app}\THgShellx86.dll; Components: shell +Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; Check: Is64BitInstallMode; ValueType: string; ValueName: ThreadingModel; ValueData: Apartment; Components: shell +  ; overlay handler COM controls  ; Normal  Root: HKCR; Subkey: CLSID\{{B456DBA0-7BF4-478c-937A-05130C2C212E}; Flags: uninsdeletekey; Components: shell @@ -64,10 +74,12 @@
 Root: HKLM32; Subkey: Software\TortoiseOverlays\Unversioned; Check: Is64BitInstallMode; ValueType: string; ValueName: TortoiseHg; ValueData: {{B456DBA6-7BF4-478c-937A-05130C2C212E}; Components: shell    ; Make them approved by administrator +Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell  Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell  Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA1-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell  Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA2-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell  Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA6-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell +Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell  Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell  Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DBA1-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell  Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DBA2-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell @@ -75,32 +87,32 @@
   ; Context menu handlers  Root: HKCR; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell -Root: HKCR; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell  Root: HKCR32; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell -Root: HKCR32; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR32; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell    Root: HKCR; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell -Root: HKCR; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell  Root: HKCR32; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell -Root: HKCR32; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR32; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell    Root: HKCR; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell -Root: HKCR; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell  Root: HKCR32; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell -Root: HKCR32; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR32; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell    Root: HKCR; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell -Root: HKCR; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell  Root: HKCR32; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell -Root: HKCR32; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR32; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell    Root: HKCR; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell -Root: HKCR; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell  Root: HKCR32; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell -Root: HKCR32; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR32; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell    Root: HKCR; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell -Root: HKCR; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell  Root: HKCR32; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell -Root: HKCR32; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell +Root: HKCR32; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell  
 
301
302
303
304
 
305
306
307
 
308
309
310
 
444
445
446
447
 
448
449
450
 
456
457
458
459
 
460
461
 
462
463
464
465
466
467
 
468
469
470
 
474
475
476
477
 
478
479
480
 
484
485
486
487
 
488
489
490
 
513
514
515
516
 
517
518
519
 
521
522
523
524
 
525
526
527
528
529
 
530
531
532
 
537
538
539
540
 
541
542
543
 
566
567
568
569
 
570
571
572
 
583
584
585
586
 
587
588
589
 
593
594
595
596
 
597
598
599
600
601
602
603
 
604
605
606
 
609
610
611
612
 
613
614
615
 
617
618
619
620
 
621
622
623
 
667
668
669
670
 
671
672
673
 
301
302
303
 
304
305
306
 
307
308
309
310
 
444
445
446
 
447
448
449
450
 
456
457
458
 
459
460
 
461
462
463
464
465
466
 
467
468
469
470
 
474
475
476
 
477
478
479
480
 
484
485
486
 
487
488
489
490
 
513
514
515
 
516
517
518
519
 
521
522
523
 
524
525
526
527
528
 
529
530
531
532
 
537
538
539
 
540
541
542
543
 
566
567
568
 
569
570
571
572
 
583
584
585
 
586
587
588
589
 
593
594
595
 
596
597
598
599
600
601
602
 
603
604
605
606
 
609
610
611
 
612
613
614
615
 
617
618
619
 
620
621
622
623
 
667
668
669
 
670
671
672
673
@@ -301,10 +301,10 @@
   // IContextMenu  STDMETHODIMP -CShellExt::QueryContextMenu( +CShellExtCMenu::QueryContextMenu(   HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)  { - TDEBUG_TRACE("CShellExt::QueryContextMenu"); + TDEBUG_TRACE("CShellExtCMenu::QueryContextMenu");   InitMenuMaps();     UINT idCmd = idCmdFirst; @@ -444,7 +444,7 @@
  RemoveMenu(hSubMenu, indexSubMenu - 1, MF_BYPOSITION);   }   - TDEBUG_TRACE(" CShellExt::QueryContextMenu: adding main THG menu"); + TDEBUG_TRACE(" CShellExtCMenu::QueryContextMenu: adding main THG menu");   InsertSubMenuItemWithIcon2(hMenu, hSubMenu, indexMenu++, idCmd++,   L"TortoiseHG", "hg.ico");   @@ -456,15 +456,15 @@
     STDMETHODIMP -CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) +CShellExtCMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)  { - TDEBUG_TRACE("CShellExt::InvokeCommand"); + TDEBUG_TRACE("CShellExtCMenu::InvokeCommand");     HRESULT hr = E_INVALIDARG;   if (!HIWORD(lpcmi->lpVerb))   {   UINT idCmd = LOWORD(lpcmi->lpVerb); - TDEBUG_TRACE("CShellExt::InvokeCommand: idCmd = " << idCmd); + TDEBUG_TRACE("CShellExtCMenu::InvokeCommand: idCmd = " << idCmd);   MenuIdCmdMap::iterator iter = MenuIdMap.find(idCmd);   if (iter != MenuIdMap.end())   { @@ -474,7 +474,7 @@
  else   {   TDEBUG_TRACE( - "CShellExt::InvokeCommand: action not found for idCmd " + "CShellExtCMenu::InvokeCommand: action not found for idCmd "   << idCmd   );   } @@ -484,7 +484,7 @@
     STDMETHODIMP -CShellExt::GetCommandString( +CShellExtCMenu::GetCommandString(   UINT_PTR idCmd, UINT uFlags, UINT FAR *reserved,   LPSTR pszName, UINT cchMax)  { @@ -513,7 +513,7 @@
  }     TDEBUG_TRACE( - "CShellExt::GetCommandString: idCmd = " << idCmd + "CShellExtCMenu::GetCommandString: idCmd = " << idCmd   << ", uFlags = " << uFlags << " (" << sflags << ")"   << ", cchMax = " << cchMax   ); @@ -521,12 +521,12 @@
  MenuIdCmdMap::iterator iter = MenuIdMap.find(static_cast<UINT>(idCmd));   if (iter == MenuIdMap.end())   { - TDEBUG_TRACE("CShellExt::GetCommandString: idCmd not found"); + TDEBUG_TRACE("CShellExtCMenu::GetCommandString: idCmd not found");   }   else   {   TDEBUG_TRACE( - "CShellExt::GetCommandString: name = \"" << iter->second.name << "\""); + "CShellExtCMenu::GetCommandString: name = \"" << iter->second.name << "\"");     if (uFlags == GCS_HELPTEXTW)   { @@ -537,7 +537,7 @@
  if (size >= 40)   {   TDEBUG_TRACE( - "CShellExt::GetCommandString: warning:" + "CShellExtCMenu::GetCommandString: warning:"   << " length of help text is " << size   << ", which is not reasonably short (<40)");   } @@ -566,7 +566,7 @@
    if (cchMax < 1)   { - TDEBUG_TRACE("CShellExt::GetCommandString: cchMax = " + TDEBUG_TRACE("CShellExtCMenu::GetCommandString: cchMax = "   << cchMax << " (is <1)");   return res;   } @@ -583,7 +583,7 @@
    size = wcslen(src);   - TDEBUG_TRACEW(L"CShellExt::GetCommandString: res = " << int(res) + TDEBUG_TRACEW(L"CShellExtCMenu::GetCommandString: res = " << int(res)   << L", pszName (wide) = \"" << dest << L"\"");   }   else @@ -593,14 +593,14 @@
    size = strlen(psz);   - TDEBUG_TRACE("CShellExt::GetCommandString: res = " << int(res) + TDEBUG_TRACE("CShellExtCMenu::GetCommandString: res = " << int(res)   << ", pszName = \"" << psz << "\"");   }     if (size > cchMax-1)   {   TDEBUG_TRACE( - "CShellExt::GetCommandString: string was truncated: size = " + "CShellExtCMenu::GetCommandString: string was truncated: size = "   << size << ", cchMax = " << cchMax);   }   @@ -609,7 +609,7 @@
     STDMETHODIMP -CShellExt::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) +CShellExtCMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)  {   LRESULT res;   return HandleMenuMsg2(uMsg, wParam, lParam, &res); @@ -617,7 +617,7 @@
     STDMETHODIMP -CShellExt::HandleMenuMsg2( +CShellExtCMenu::HandleMenuMsg2(   UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult)  {   // A great tutorial on owner drawn menus in shell extension can be found @@ -667,7 +667,7 @@
 }     -void CShellExt::DoHgtk(const std::string &cmd) +void CShellExtCMenu::DoHgtk(const std::string &cmd)  {   std::string dir = GetTHgProgRoot();   if (dir.empty())
 
7
8
9
10
 
11
12
13
 
14
15
16
 
19
20
21
22
 
23
24
25
26
27
28
29
 
30
31
 
32
33
34
 
7
8
9
 
10
11
12
 
13
14
15
16
 
19
20
21
 
22
23
24
25
26
27
28
 
29
30
 
31
32
33
34
@@ -7,10 +7,10 @@
 #include <shlwapi.h>     -STDMETHODIMP CShellExt::GetOverlayInfo( +STDMETHODIMP CShellExtOverlay::GetOverlayInfo(   LPWSTR pwszIconFile, int cchMax, int *pIndex, DWORD *pdwFlags)  { - TDEBUG_TRACE("CShellExt::GetOverlayInfo: myTortoiseClass = " << myTortoiseClass); + TDEBUG_TRACE("CShellExtOverlay::GetOverlayInfo: myTortoiseClass = " << myTortoiseClass);   // icons are determined by TortoiseOverlays shim   *pIndex = 0;   *pdwFlags = 0; @@ -19,16 +19,16 @@
 }     -STDMETHODIMP CShellExt::GetPriority(int *pPriority) +STDMETHODIMP CShellExtOverlay::GetPriority(int *pPriority)  {   *pPriority = 1;   return S_OK;  }     -STDMETHODIMP CShellExt::IsMemberOf(LPCWSTR pwszPath, DWORD /* dwAttrib */) +STDMETHODIMP CShellExtOverlay::IsMemberOf(LPCWSTR pwszPath, DWORD /* dwAttrib */)  { - ThgCriticalSection cs(GetCriticalSection()); + ThgCriticalSection cs(CShellExt::GetCriticalSection());     std::string cval;   if (GetRegistryConfig("EnableOverlays", cval) != 0 && cval == "0")
 
10
11
12
 
 
13
14
15
 
77
78
79
80
 
 
81
82
 
83
84
 
 
 
 
 
 
 
85
86
87
88
89
90
91
 
92
93
94
95
96
97
98
 
99
100
101
102
103
104
105
 
106
107
108
 
124
125
126
127
128
129
 
 
130
131
132
 
133
134
135
136
137
138
 
 
 
 
 
 
 
 
139
140
 
 
141
142
 
 
 
143
 
 
 
144
145
146
147
148
149
 
156
157
158
159
 
160
161
162
163
164
165
166
 
167
168
169
170
171
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
173
174
 
187
188
189
190
191
192
193
194
195
196
 
202
203
204
205
 
206
207
 
208
209
210
 
 
 
 
 
211
212
 
 
213
214
215
 
216
217
218
219
220
221
222
 
 
 
 
 
 
 
 
223
224
 
 
225
226
227
228
229
 
230
231
232
 
10
11
12
13
14
15
16
17
 
79
80
81
 
82
83
84
 
85
86
 
87
88
89
90
91
92
93
94
95
96
97
98
99
 
100
101
102
103
104
105
106
 
107
108
109
110
111
112
113
 
114
115
116
117
 
133
134
135
 
 
 
136
137
138
 
 
139
140
 
 
141
142
143
144
145
146
147
148
149
150
151
152
 
153
154
155
 
156
157
158
159
160
161
162
163
164
 
165
166
167
 
174
175
176
 
177
178
179
180
181
182
183
 
184
185
186
187
188
 
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
 
223
224
225
 
 
 
 
226
227
228
 
234
235
236
 
237
238
 
239
240
241
242
243
244
245
246
247
248
 
249
250
251
 
 
252
253
254
 
255
256
257
258
259
260
261
262
263
264
265
266
267
 
268
269
270
271
272
273
 
274
275
276
277
@@ -10,6 +10,8 @@
 #define INITGUID  #include <initguid.h>   +DEFINE_GUID(CLSID_TortoiseHgCmenu, 0xb456db9fL, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e); +  DEFINE_GUID(CLSID_TortoiseHg0, 0xb456dba0L, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);  DEFINE_GUID(CLSID_TortoiseHg1, 0xb456dba1L, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);  DEFINE_GUID(CLSID_TortoiseHg2, 0xb456dba2L, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e); @@ -77,32 +79,39 @@
  TDEBUG_TRACE("DllGetClassObject clsid = " << WideToMultibyte(pwszShellExt));   *ppvOut = NULL;   - typedef ThgClassFactory<CShellExt> Fact; + typedef ThgClassFactory<CShellExtOverlay> FactOvl; + typedef ThgClassFactory<CShellExtCMenu> FactCmenu;   - if (IsEqualIID(rclsid, CLSID_TortoiseHg0)) + if (IsEqualIID(rclsid, CLSID_TortoiseHgCmenu))   { - Fact *pcf = new Fact('C'); // clean + FactCmenu *pcf = new FactCmenu(0); + TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHgCmenu"); + return pcf->QueryInterface(riid, ppvOut); + } + else if (IsEqualIID(rclsid, CLSID_TortoiseHg0)) + { + FactOvl *pcf = new FactOvl('C'); // clean   TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg0");   ++InitStatus::inst().unchanged_;   return pcf->QueryInterface(riid, ppvOut);   }   else if (IsEqualIID(rclsid, CLSID_TortoiseHg1))   { - Fact *pcf = new Fact('A'); // added + FactOvl *pcf = new FactOvl('A'); // added   TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg1");   ++InitStatus::inst().added_;   return pcf->QueryInterface(riid, ppvOut);   }   else if (IsEqualIID(rclsid, CLSID_TortoiseHg2))   { - Fact *pcf = new Fact('M'); // modified + FactOvl *pcf = new FactOvl('M'); // modified   TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg2");   ++InitStatus::inst().modified_;   return pcf->QueryInterface(riid, ppvOut);   }   else if (IsEqualIID(rclsid, CLSID_TortoiseHg6))   { - Fact *pcf = new Fact('?'); // not in repo + FactOvl *pcf = new FactOvl('?'); // not in repo   TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg6");   ++InitStatus::inst().notinrepo_;   return pcf->QueryInterface(riid, ppvOut); @@ -124,26 +133,35 @@
 }     -CShellExt::CShellExt(char tortoiseClass) : - myTortoiseClass(tortoiseClass), - m_ppszFileUserClickedOn(0) +CShellExtOverlay::CShellExtOverlay(char tortoiseClass) : + myTortoiseClass(tortoiseClass)  { - ThgCriticalSection cs(GetCriticalSection()); - + ThgCriticalSection cs(CShellExt::GetCriticalSection());   m_cRef = 0L; - m_pDataObj = NULL; -   g_cRefThisDll++;  }   +CShellExtCMenu::CShellExtCMenu(char dummy) : + m_ppszFileUserClickedOn(0) +{ + ThgCriticalSection cs(CShellExt::GetCriticalSection()); + m_cRef = 0L; + m_pDataObj = NULL; + g_cRefThisDll++; +}   -CShellExt::~CShellExt() + +CShellExtOverlay::~CShellExtOverlay()  { - ThgCriticalSection cs(GetCriticalSection()); + ThgCriticalSection cs(CShellExt::GetCriticalSection()); + g_cRefThisDll--; +}   +CShellExtCMenu::~CShellExtCMenu() +{ + ThgCriticalSection cs(CShellExt::GetCriticalSection());   if (m_pDataObj)   m_pDataObj->Release(); -   g_cRefThisDll--;  }   @@ -156,19 +174,37 @@
   void CShellExt::IncDllRef()  { - ThgCriticalSection cs(GetCriticalSection()); + ThgCriticalSection cs(CShellExt::GetCriticalSection());   g_cRefThisDll++;  }      void CShellExt::DecDllRef()  { - ThgCriticalSection cs(GetCriticalSection()); + ThgCriticalSection cs(CShellExt::GetCriticalSection());   g_cRefThisDll--;  }     -STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR* ppv) +STDMETHODIMP CShellExtOverlay::QueryInterface(REFIID riid, LPVOID FAR* ppv) +{ + *ppv = NULL; + if (IsEqualIID(riid, IID_IShellIconOverlayIdentifier) + || IsEqualIID(riid, IID_IUnknown) ) + { + *ppv = (IShellIconOverlayIdentifier*) this; + } + + if (*ppv) + { + AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + +STDMETHODIMP CShellExtCMenu::QueryInterface(REFIID riid, LPVOID FAR* ppv)  {   *ppv = NULL;   if (IsEqualIID(riid, IID_IShellExtInit) || IsEqualIID(riid, IID_IUnknown)) @@ -187,10 +223,6 @@
  {   *ppv = (IContextMenu3*) this;   } - else if (IsEqualIID(riid, IID_IShellIconOverlayIdentifier)) - { - *ppv = (IShellIconOverlayIdentifier*) this; - }     if (*ppv)   { @@ -202,31 +234,44 @@
 }     -STDMETHODIMP_(ULONG) CShellExt::AddRef() +STDMETHODIMP_(ULONG) CShellExtOverlay::AddRef()  { - ThgCriticalSection cs(GetCriticalSection()); + ThgCriticalSection cs(CShellExt::GetCriticalSection());   return ++m_cRef;  }   +STDMETHODIMP_(ULONG) CShellExtCMenu::AddRef() +{ + ThgCriticalSection cs(CShellExt::GetCriticalSection()); + return ++m_cRef; +}   -STDMETHODIMP_(ULONG) CShellExt::Release() + +STDMETHODIMP_(ULONG) CShellExtOverlay::Release()  { - ThgCriticalSection cs(GetCriticalSection()); - + ThgCriticalSection cs(CShellExt::GetCriticalSection());   if(--m_cRef)   return m_cRef; -   delete this;   return 0L;  }   +STDMETHODIMP_(ULONG) CShellExtCMenu::Release() +{ + ThgCriticalSection cs(CShellExt::GetCriticalSection()); + if(--m_cRef) + return m_cRef; + delete this; + return 0L; +}   -STDMETHODIMP CShellExt::Initialize( + +STDMETHODIMP CShellExtCMenu::Initialize(   LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hRegKey)  {   TCHAR name[MAX_PATH+1];   - TDEBUG_TRACE("CShellExt::Initialize"); + TDEBUG_TRACE("CShellExtCMenu::Initialize");   TDEBUG_TRACE(" pIDFolder: " << pIDFolder);   TDEBUG_TRACE(" pDataObj: " << pDataObj);  
 
5
6
7
8
9
 
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
12
13
14
15
16
17
18
19
 
 
 
20
21
 
 
 
 
22
23
24
25
26
 
 
 
 
 
 
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
5
6
7
 
 
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
 
 
 
59
 
 
 
60
61
62
63
 
64
65
66
67
68
 
 
 
 
69
70
71
72
73
74
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
77
78
@@ -5,56 +5,74 @@
 #include <string>     -class CShellExt: - public IContextMenu3, IShellIconOverlayIdentifier, IShellExtInit +class CShellExt  { +public: + static LPCRITICAL_SECTION GetCriticalSection(); + static void IncDllRef(); + static void DecDllRef(); +}; + + +class CShellExtCMenu: public IContextMenu3, IShellExtInit +{ + ULONG m_cRef; + LPDATAOBJECT m_pDataObj; + + LPTSTR* m_ppszFileUserClickedOn; // [MAX_PATH] + std::vector<std::string> myFiles; + std::string myFolder; + + void DoHgtk(const std::string&); + +public: + explicit CShellExtCMenu(char dummy); + ~CShellExtCMenu(); + + // IUnknown + STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + // IContextMenu3 + STDMETHODIMP QueryContextMenu( + HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, + UINT uFlags); + STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi); + STDMETHODIMP GetCommandString( + UINT_PTR idCmd, UINT uFlags, UINT FAR* reserved,LPSTR pszName, + UINT cchMax); + STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); + STDMETHODIMP HandleMenuMsg2( + UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult); + + // IShellExtInit + STDMETHODIMP Initialize( + LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hKeyID); +}; + + +class CShellExtOverlay: public IShellIconOverlayIdentifier +{ + ULONG m_cRef;   const char myTortoiseClass; - - protected: - ULONG m_cRef; - LPDATAOBJECT m_pDataObj;   - LPTSTR* m_ppszFileUserClickedOn; // [MAX_PATH] - std::vector<std::string> myFiles; - std::string myFolder; +public: + explicit CShellExtOverlay(char Class); + ~CShellExtOverlay();   - void CShellExt::DoHgtk(const std::string&); + // IUnknown + STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release();   - public: - static LPCRITICAL_SECTION GetCriticalSection(); - static void IncDllRef(); - static void DecDllRef(); + // IShellIconOverlayIdentifier + STDMETHODIMP GetOverlayInfo( + LPWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags); + STDMETHODIMP GetPriority(int* pPriority); + STDMETHODIMP IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib); +};   - explicit CShellExt(char Class); - ~CShellExt(); - - // IUnknown - STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv); - STDMETHODIMP_(ULONG) AddRef(); - STDMETHODIMP_(ULONG) Release(); - - // IContextMenu3 - STDMETHODIMP QueryContextMenu( - HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, - UINT uFlags); - STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi); - STDMETHODIMP GetCommandString( - UINT_PTR idCmd, UINT uFlags, UINT FAR* reserved,LPSTR pszName, - UINT cchMax); - STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); - STDMETHODIMP HandleMenuMsg2( - UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult); - - // IShellIconOverlayIdentifier - STDMETHODIMP GetOverlayInfo( - LPWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags); - STDMETHODIMP GetPriority(int* pPriority); - STDMETHODIMP IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib); - - // IShellExtInit - STDMETHODIMP Initialize( - LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hKeyID); - };      class ThgCriticalSection