OSDN Git Service

Compiler warnings removal Numerous tweaks to remove compiler warnings where solution...
[tortoisegit/TortoiseGitJp.git] / src / Utils / BugTraqAssociations.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2008 - TortoiseSVN\r
4 \r
5 // This program is free software; you can redistribute it and/or\r
6 // modify it under the terms of the GNU General Public License\r
7 // as published by the Free Software Foundation; either version 2\r
8 // of the License, or (at your option) any later version.\r
9 \r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 \r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, write to the Free Software Foundation,\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 //\r
19 #include "stdafx.h"\r
20 #include "BugTraqAssociations.h"\r
21 \r
22 #include <initguid.h>\r
23 \r
24 // {3494FA92-B139-4730-9591-01135D5E7831}\r
25 DEFINE_GUID(CATID_BugTraqProvider, \r
26                         0x3494fa92, 0xb139, 0x4730, 0x95, 0x91, 0x1, 0x13, 0x5d, 0x5e, 0x78, 0x31);\r
27 \r
28 #define BUGTRAQ_ASSOCIATIONS_REGPATH _T("Software\\TortoiseGit\\BugTraq Associations")\r
29 \r
30 CBugTraqAssociations::~CBugTraqAssociations()\r
31 {\r
32         for (inner_t::iterator it = m_inner.begin(); it != m_inner.end(); ++it)\r
33                 delete *it;\r
34 }\r
35 \r
36 void CBugTraqAssociations::Load()\r
37 {\r
38         HKEY hk;\r
39         if (RegOpenKeyEx(HKEY_CURRENT_USER, BUGTRAQ_ASSOCIATIONS_REGPATH, 0, KEY_READ, &hk) != ERROR_SUCCESS)\r
40                 return;\r
41 \r
42         for (DWORD dwIndex = 0; /* nothing */; ++dwIndex)\r
43         {\r
44                 TCHAR szSubKey[MAX_PATH];\r
45                 DWORD cchSubKey = MAX_PATH;\r
46                 LSTATUS status = RegEnumKeyEx(hk, dwIndex, szSubKey, &cchSubKey, NULL, NULL, NULL, NULL);\r
47                 if (status != ERROR_SUCCESS)\r
48                         break;\r
49 \r
50                 HKEY hk2;\r
51                 if (RegOpenKeyEx(hk, szSubKey, 0, KEY_READ, &hk2) == ERROR_SUCCESS)\r
52                 {\r
53                         TCHAR szWorkingCopy[MAX_PATH];\r
54                         DWORD cbWorkingCopy = sizeof(szWorkingCopy);\r
55                         RegQueryValueEx(hk2, _T("WorkingCopy"), NULL, NULL, (LPBYTE)szWorkingCopy, &cbWorkingCopy);\r
56 \r
57                         TCHAR szClsid[MAX_PATH];\r
58                         DWORD cbClsid = sizeof(szClsid);\r
59                         RegQueryValueEx(hk2, _T("Provider"), NULL, NULL, (LPBYTE)szClsid, &cbClsid);\r
60 \r
61                         CLSID provider_clsid;\r
62                         CLSIDFromString(szClsid, &provider_clsid);\r
63 \r
64                         DWORD cbParameters = 0;\r
65                         RegQueryValueEx(hk2, _T("Parameters"), NULL, NULL, (LPBYTE)NULL, &cbParameters);\r
66                         TCHAR * szParameters = new TCHAR[cbParameters+1];\r
67                         RegQueryValueEx(hk2, _T("Parameters"), NULL, NULL, (LPBYTE)szParameters, &cbParameters);\r
68                         szParameters[cbParameters] = 0;\r
69                         m_inner.push_back(new CBugTraqAssociation(szWorkingCopy, provider_clsid, LookupProviderName(provider_clsid), szParameters));\r
70                         delete [] szParameters;\r
71 \r
72                         RegCloseKey(hk2);\r
73                 }\r
74         }\r
75 \r
76         RegCloseKey(hk);\r
77 }\r
78 \r
79 void CBugTraqAssociations::Add(const CBugTraqAssociation &assoc)\r
80 {\r
81         m_inner.push_back(new CBugTraqAssociation(assoc));\r
82 }\r
83 \r
84 bool CBugTraqAssociations::FindProvider(const CTGitPathList &pathList, CBugTraqAssociation *assoc) const\r
85 {\r
86         return FindProviderForPathList(pathList, assoc);\r
87 }\r
88 \r
89 bool CBugTraqAssociations::FindProviderForPathList(const CTGitPathList &pathList, CBugTraqAssociation *assoc) const\r
90 {\r
91         for (int i = 0; i < pathList.GetCount(); ++i)\r
92         {\r
93                 CTGitPath path = pathList[i];\r
94                 if (FindProviderForPath(path, assoc))\r
95                         return true;\r
96         }\r
97 \r
98         return false;\r
99 }\r
100 \r
101 bool CBugTraqAssociations::FindProviderForPath(CTGitPath path, CBugTraqAssociation *assoc) const\r
102 {\r
103         do\r
104         {\r
105                 inner_t::const_iterator it = std::find_if(m_inner.begin(), m_inner.end(), FindByPathPred(path));\r
106                 if (it != m_inner.end())\r
107                 {\r
108                         *assoc = *(*it);\r
109                         return true;\r
110                 }\r
111                 \r
112                 path = path.GetContainingDirectory();\r
113         } while(!path.IsEmpty());\r
114 \r
115         return false;\r
116 }\r
117 \r
118 /* static */\r
119 CString CBugTraqAssociations::LookupProviderName(const CLSID &provider_clsid)\r
120 {\r
121         OLECHAR szClsid[40];\r
122         StringFromGUID2(provider_clsid, szClsid, ARRAYSIZE(szClsid));\r
123 \r
124         TCHAR szSubKey[MAX_PATH];\r
125         _stprintf_s(szSubKey, _T("CLSID\\%ls"), szClsid);\r
126         \r
127         CString provider_name = CString(szClsid);\r
128 \r
129         HKEY hk;\r
130         if (RegOpenKeyEx(HKEY_CLASSES_ROOT, szSubKey, 0, KEY_READ, &hk) == ERROR_SUCCESS)\r
131         {\r
132                 TCHAR szClassName[MAX_PATH];\r
133                 DWORD cbClassName = sizeof(szClassName);\r
134 \r
135                 if (RegQueryValueEx(hk, NULL, NULL, NULL, (LPBYTE)szClassName, &cbClassName) == ERROR_SUCCESS)\r
136                         provider_name = CString(szClassName);\r
137 \r
138                 RegCloseKey(hk);\r
139         }\r
140 \r
141         return provider_name;\r
142 }\r
143 \r
144 LSTATUS RegSetValueFromCString(HKEY hKey, LPCTSTR lpValueName, CString str)\r
145 {\r
146         LPCTSTR lpsz = str;\r
147         DWORD cb = (str.GetLength() + 1) * sizeof(TCHAR);\r
148         return RegSetValueEx(hKey, lpValueName, 0, REG_SZ, (const BYTE *)lpsz, cb);\r
149 }\r
150 \r
151 void CBugTraqAssociations::Save() const\r
152 {\r
153         SHDeleteKey(HKEY_CURRENT_USER, BUGTRAQ_ASSOCIATIONS_REGPATH);\r
154 \r
155         HKEY hk;\r
156         if (RegCreateKeyEx(HKEY_CURRENT_USER, BUGTRAQ_ASSOCIATIONS_REGPATH, 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &hk, NULL) != ERROR_SUCCESS)\r
157                 return;\r
158 \r
159         DWORD dwIndex = 0;\r
160         for (const_iterator it = begin(); it != end(); ++it)\r
161         {\r
162                 TCHAR szSubKey[MAX_PATH];\r
163                 _stprintf_s(szSubKey, _T("%d"), dwIndex);\r
164 \r
165                 HKEY hk2;\r
166                 if (RegCreateKeyEx(hk, szSubKey, 0, NULL, 0, KEY_WRITE, NULL, &hk2, NULL) == ERROR_SUCCESS)\r
167                 {\r
168                         RegSetValueFromCString(hk2, _T("Provider"), (*it)->GetProviderClassAsString());\r
169                         RegSetValueFromCString(hk2, _T("WorkingCopy"), (*it)->GetPath().GetWinPath());\r
170                         RegSetValueFromCString(hk2, _T("Parameters"), (*it)->GetParameters());\r
171                         \r
172                         RegCloseKey(hk2);\r
173                 }\r
174 \r
175                 ++dwIndex;\r
176         }\r
177 \r
178         RegCloseKey(hk);\r
179 }\r
180 \r
181 void CBugTraqAssociations::RemoveByPath(const CTGitPath &path)\r
182 {\r
183         inner_t::iterator it = std::find_if(m_inner.begin(), m_inner.end(), FindByPathPred(path));\r
184         if (it != m_inner.end())\r
185         {\r
186                 delete *it;\r
187                 m_inner.erase(it);\r
188         }\r
189 }\r
190 \r
191 CString CBugTraqAssociation::GetProviderClassAsString() const\r
192 {\r
193         OLECHAR szTemp[40];\r
194         StringFromGUID2(m_provider.clsid, szTemp, ARRAYSIZE(szTemp));\r
195 \r
196         return CString(szTemp);\r
197 }\r
198 \r
199 /* static */\r
200 std::vector<CBugTraqProvider> CBugTraqAssociations::GetAvailableProviders()\r
201 {\r
202         std::vector<CBugTraqProvider> results;\r
203 \r
204         ICatInformation *pCatInformation = NULL;\r
205 \r
206         HRESULT hr;\r
207         if (SUCCEEDED(hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_ALL, IID_ICatInformation, (void **)&pCatInformation)))\r
208         {\r
209                 IEnumGUID *pEnum = NULL;\r
210                 if (SUCCEEDED(hr = pCatInformation->EnumClassesOfCategories(1, &CATID_BugTraqProvider, 0, NULL, &pEnum)))\r
211                 {\r
212                         HRESULT hrEnum;\r
213                         do\r
214                         {\r
215                                 CLSID clsids[5];\r
216                                 ULONG cClsids;\r
217 \r
218                                 hrEnum = pEnum->Next(ARRAYSIZE(clsids), clsids, &cClsids);\r
219                                 if (SUCCEEDED(hrEnum))\r
220                                 {\r
221                                         for (ULONG i = 0; i < cClsids; ++i)\r
222                                         {\r
223                                                 CBugTraqProvider provider;\r
224                                                 provider.clsid = clsids[i];\r
225                                                 provider.name = LookupProviderName(clsids[i]);\r
226                                                 results.push_back(provider);\r
227                                         }\r
228                                 }\r
229                         } while (hrEnum == S_OK);\r
230                 }\r
231 \r
232                 if (pEnum)\r
233                         pEnum->Release();\r
234                 pEnum = NULL;\r
235         }\r
236 \r
237         if (pCatInformation)\r
238                 pCatInformation->Release();\r
239         pCatInformation = NULL;\r
240 \r
241         return results;\r
242 }\r