Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / UI / Explorer / RegistryContextMenu.cpp
1 // RegistryContextMenu.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "Windows/Registry.h"\r
6 #include "Windows/Synchronization.h"\r
7 \r
8 #include "RegistryContextMenu.h"\r
9 \r
10 using namespace NWindows;\r
11 using namespace NRegistry;\r
12 \r
13 namespace NZipRootRegistry {\r
14   \r
15 #ifndef UNDER_CE\r
16 \r
17 static NSynchronization::CCriticalSection g_CS;\r
18   \r
19 static const TCHAR *kContextMenuKeyName  = TEXT("\\shellex\\ContextMenuHandlers\\7-Zip");\r
20 static const TCHAR *kDragDropMenuKeyName = TEXT("\\shellex\\DragDropHandlers\\7-Zip");\r
21 \r
22 static const TCHAR *kExtensionCLSID = TEXT("{23170F69-40C1-278A-1000-000100020000}");\r
23 \r
24 static const TCHAR *kRootKeyNameForFile = TEXT("*");\r
25 static const TCHAR *kRootKeyNameForFolder = TEXT("Folder");\r
26 static const TCHAR *kRootKeyNameForDirectory = TEXT("Directory");\r
27 static const TCHAR *kRootKeyNameForDrive = TEXT("Drive");\r
28 \r
29 static CSysString GetFullContextMenuKeyName(const CSysString &keyName)\r
30   { return (keyName + kContextMenuKeyName); }\r
31 \r
32 static CSysString GetFullDragDropMenuKeyName(const CSysString &keyName)\r
33   { return (keyName + kDragDropMenuKeyName); }\r
34 \r
35 static bool CheckHandlerCommon(const CSysString &keyName)\r
36 {\r
37   NSynchronization::CCriticalSectionLock lock(g_CS);\r
38   CKey key;\r
39   if (key.Open(HKEY_CLASSES_ROOT, keyName, KEY_READ) != ERROR_SUCCESS)\r
40     return false;\r
41   CSysString value;\r
42   if (key.QueryValue(NULL, value) != ERROR_SUCCESS)\r
43     return false;\r
44   value.MakeUpper();\r
45   return (value.Compare(kExtensionCLSID) == 0);\r
46 }\r
47 \r
48 bool CheckContextMenuHandler()\r
49 {\r
50   return\r
51     // CheckHandlerCommon(GetFullContextMenuKeyName(kRootKeyNameForFolder)) &&\r
52     CheckHandlerCommon(GetFullContextMenuKeyName(kRootKeyNameForDirectory))  &&\r
53     CheckHandlerCommon(GetFullContextMenuKeyName(kRootKeyNameForFile)) &&\r
54     CheckHandlerCommon(GetFullDragDropMenuKeyName(kRootKeyNameForDirectory))  &&\r
55     CheckHandlerCommon(GetFullDragDropMenuKeyName(kRootKeyNameForDrive));\r
56 }\r
57 \r
58 static void DeleteContextMenuHandlerCommon(const CSysString &keyName)\r
59 {\r
60   CKey rootKey;\r
61   rootKey.Attach(HKEY_CLASSES_ROOT);\r
62   rootKey.RecurseDeleteKey(GetFullContextMenuKeyName(keyName));\r
63   rootKey.Detach();\r
64 }\r
65 \r
66 static void DeleteDragDropMenuHandlerCommon(const CSysString &keyName)\r
67 {\r
68   CKey rootKey;\r
69   rootKey.Attach(HKEY_CLASSES_ROOT);\r
70   rootKey.RecurseDeleteKey(GetFullDragDropMenuKeyName(keyName));\r
71   rootKey.Detach();\r
72 }\r
73 \r
74 void DeleteContextMenuHandler()\r
75 {\r
76   DeleteContextMenuHandlerCommon(kRootKeyNameForFile);\r
77   DeleteContextMenuHandlerCommon(kRootKeyNameForFolder);\r
78   DeleteContextMenuHandlerCommon(kRootKeyNameForDirectory);\r
79   DeleteContextMenuHandlerCommon(kRootKeyNameForDrive);\r
80   DeleteDragDropMenuHandlerCommon(kRootKeyNameForFile);\r
81   DeleteDragDropMenuHandlerCommon(kRootKeyNameForFolder);\r
82   DeleteDragDropMenuHandlerCommon(kRootKeyNameForDirectory);\r
83   DeleteDragDropMenuHandlerCommon(kRootKeyNameForDrive);\r
84 }\r
85 \r
86 static void AddContextMenuHandlerCommon(const CSysString &keyName)\r
87 {\r
88   DeleteContextMenuHandlerCommon(keyName);\r
89   NSynchronization::CCriticalSectionLock lock(g_CS);\r
90   CKey key;\r
91   key.Create(HKEY_CLASSES_ROOT, GetFullContextMenuKeyName(keyName));\r
92   key.SetValue(NULL, kExtensionCLSID);\r
93 }\r
94 \r
95 static void AddDragDropMenuHandlerCommon(const CSysString &keyName)\r
96 {\r
97   DeleteDragDropMenuHandlerCommon(keyName);\r
98   NSynchronization::CCriticalSectionLock lock(g_CS);\r
99   CKey key;\r
100   key.Create(HKEY_CLASSES_ROOT, GetFullDragDropMenuKeyName(keyName));\r
101   key.SetValue(NULL, kExtensionCLSID);\r
102 }\r
103 \r
104 void AddContextMenuHandler()\r
105 {\r
106   AddContextMenuHandlerCommon(kRootKeyNameForFile);\r
107   // AddContextMenuHandlerCommon(kRootKeyNameForFolder);\r
108   AddContextMenuHandlerCommon(kRootKeyNameForDirectory);\r
109 \r
110   AddDragDropMenuHandlerCommon(kRootKeyNameForDirectory);\r
111   AddDragDropMenuHandlerCommon(kRootKeyNameForDrive);\r
112 }\r
113 \r
114 #endif\r
115 \r
116 }\r