OSDN Git Service

merge original branch.
[tortoisegit/TortoiseGitJp.git] / contrib / issue-tracker-plugins / ExampleAtlPlugin / Provider.cpp
1 #include "stdafx.h"\r
2 #include "Provider.h"\r
3 #include "WaitDialog.h"\r
4 \r
5 CProvider::CProvider()\r
6 {\r
7 }\r
8 \r
9 HRESULT CProvider::FinalConstruct()\r
10 {\r
11         return S_OK;\r
12 }\r
13 \r
14 void CProvider::FinalRelease()\r
15 {\r
16 }\r
17 \r
18 CProvider::parameters_t CProvider::ParseParameters(BSTR parameters) const\r
19 {\r
20         CString temp(parameters);\r
21 \r
22         parameters_t result;\r
23 \r
24         // TODO: Handle quoting and stuff\r
25         int pos = 0;\r
26         CString token = temp.Tokenize(_T(";"), pos);\r
27         while (token != _T(""))\r
28         {\r
29                 int x = token.Find('=');\r
30                 CString name = token.Left(x);\r
31                 CString value = token.Mid(x + 1);\r
32 \r
33                 result[name] = value;\r
34 \r
35                 token = temp.Tokenize(_T(";"), pos);\r
36         }\r
37 \r
38         return result;\r
39 }\r
40 \r
41 HRESULT STDMETHODCALLTYPE CProvider::ValidateParameters( \r
42     /* [in] */ HWND hParentWnd,\r
43     /* [in] */ BSTR parameters,\r
44     /* [retval][out] */ VARIANT_BOOL *valid)\r
45 {\r
46         // Don't bother validating the parameters yet.\r
47         *valid = VARIANT_TRUE;\r
48         return S_OK;\r
49 }\r
50     \r
51 HRESULT STDMETHODCALLTYPE CProvider::GetLinkText( \r
52     /* [in] */ HWND hParentWnd,\r
53     /* [in] */ BSTR parameters,\r
54     /* [retval][out] */ BSTR *linkText)\r
55 {\r
56         parameters_t params = ParseParameters(parameters);\r
57         CString prompt = params[CString("Prompt")];\r
58         if (prompt.IsEmpty())\r
59                 *linkText = SysAllocString(L"Choose Task...");\r
60         else\r
61                 *linkText = prompt.AllocSysString();\r
62 \r
63         return S_OK;\r
64 }\r
65     \r
66 HRESULT STDMETHODCALLTYPE CProvider::GetCommitMessage( \r
67     /* [in] */ HWND hParentWnd,\r
68     /* [in] */ BSTR parameters,\r
69     /* [in] */ BSTR commonRoot,\r
70     /* [in] */ SAFEARRAY * pathList,\r
71     /* [in] */ BSTR originalMessage,\r
72     /* [retval][out] */ BSTR *newMessage)\r
73 {\r
74         return GetCommitMessage2(hParentWnd, parameters, NULL, commonRoot, pathList, originalMessage, newMessage);\r
75 }\r
76 \r
77 HRESULT STDMETHODCALLTYPE CProvider::GetCommitMessage2( \r
78         /* [in] */ HWND hParentWnd,\r
79         /* [in] */ BSTR parameters,\r
80         /* [in] */ BSTR commonURL,\r
81         /* [in] */ BSTR commonRoot,\r
82         /* [in] */ SAFEARRAY * pathList,\r
83         /* [in] */ BSTR originalMessage,\r
84         /* [retval][out] */ BSTR *newMessage)\r
85 {\r
86         USES_CONVERSION;\r
87 \r
88         if (commonURL)\r
89         {\r
90                 // do something with the common root url\r
91                 // if necessary\r
92         }\r
93 \r
94         parameters_t params = ParseParameters(parameters);\r
95         CString commandLine = params[CString("CommandLine")];\r
96 \r
97         if (commandLine.IsEmpty())\r
98         {\r
99                 MessageBox(hParentWnd, _T("CommandLine parameter is empty"), _T("ExampleAtlPlugin"), MB_OK | MB_ICONERROR);\r
100                 return S_OK;\r
101         }\r
102 \r
103         TCHAR szTempPath[MAX_PATH];\r
104         GetTempPath(ARRAYSIZE(szTempPath), szTempPath);\r
105 \r
106         // Create a temporary file to hold the path list, and write the list to the file.\r
107         TCHAR szPathListTempFile[MAX_PATH];\r
108         GetTempFileName(szTempPath, _T("svn"), 0, szPathListTempFile);\r
109 \r
110         DWORD bytesWritten;\r
111         HANDLE hPathListFile = CreateFile(szPathListTempFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);\r
112 \r
113         LONG a, b;\r
114         if (FAILED(SafeArrayGetLBound(pathList, 1, &a)) || (FAILED(SafeArrayGetUBound(pathList, 1, &b))))\r
115                 return E_FAIL;\r
116 \r
117         for (LONG i = a; i <= b; ++i)\r
118         {\r
119                 BSTR path = NULL;\r
120                 SafeArrayGetElement(pathList, &i, &path);\r
121 \r
122                 CStringA line = OLE2A(path);\r
123                 line += "\r\n";\r
124 \r
125                 WriteFile(hPathListFile, line, line.GetLength(), &bytesWritten, NULL);\r
126         }\r
127 \r
128         CloseHandle(hPathListFile);\r
129 \r
130         TCHAR szOriginalMessageTempFile[MAX_PATH];\r
131         GetTempFileName(szTempPath, _T("svn"), 0, szOriginalMessageTempFile);\r
132 \r
133         HANDLE hOriginalMessageFile = CreateFile(szOriginalMessageTempFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);\r
134 \r
135         CStringA temp = OLE2A(originalMessage);\r
136         WriteFile(hOriginalMessageFile, temp, temp.GetLength(), &bytesWritten, NULL);\r
137 \r
138         CloseHandle(hOriginalMessageFile);\r
139 \r
140         commandLine.AppendFormat(_T(" \"%s\" \"%ls\" \"%s\""), szPathListTempFile, commonRoot, szOriginalMessageTempFile);\r
141 \r
142         CString message = originalMessage;\r
143         CWaitDialog dlg(commandLine);\r
144         if (dlg.DoModal() == IDOK)\r
145         {\r
146                 HANDLE hOrig = CreateFile(szOriginalMessageTempFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);\r
147                 DWORD cb = GetFileSize(hOrig, NULL);\r
148                 BYTE *buffer = (BYTE *)malloc(cb + 1);\r
149                 memset(buffer, 0, cb + 1);\r
150                 DWORD bytesRead;\r
151                 ReadFile(hOrig, buffer, cb, &bytesRead, NULL);\r
152                 CloseHandle(hOrig);\r
153 \r
154                 message = A2T((const char *)buffer);\r
155         }\r
156 \r
157         DeleteFile(szPathListTempFile);\r
158         DeleteFile(szOriginalMessageTempFile);\r
159 \r
160         *newMessage = message.AllocSysString();\r
161         return S_OK;\r
162 }\r
163 \r
164 HRESULT STDMETHODCALLTYPE CProvider::OnCommitFinished (\r
165         /* [in] */ HWND hParentWnd,\r
166         /* [in] */ BSTR commonRoot,\r
167         /* [in] */ SAFEARRAY * pathList,\r
168         /* [in] */ BSTR logMessage,\r
169         /* [in] */ ULONG revision,\r
170         /* [out, retval] */ BSTR * error)\r
171 {\r
172         CString err = _T("Test error string");\r
173         *error = err.AllocSysString();\r
174         return S_OK;\r
175 }\r
176 \r
177 HRESULT STDMETHODCALLTYPE CProvider::HasOptions(\r
178                                    /* [out, retval] */ VARIANT_BOOL *ret)\r
179 {\r
180         MessageBox(NULL, _T("test"), _T("test"), MB_ICONERROR);\r
181         *ret = VARIANT_FALSE;\r
182         MessageBox(NULL, _T("test2"), _T("test2"), MB_ICONERROR);\r
183         return S_OK;\r
184 }\r
185 \r
186 // this method is called if HasOptions() returned true before.\r
187 // Use this to show a custom dialog so the user doesn't have to\r
188 // create the parameters string manually\r
189 HRESULT STDMETHODCALLTYPE CProvider::ShowOptionsDialog(\r
190                                                   /* [in] */ HWND hParentWnd,\r
191                                                   /* [in] */ BSTR parameters,\r
192                                                   /* [out, retval] */ BSTR * newparameters\r
193                                                   )\r
194 {\r
195         // we don't show an options dialog\r
196         return E_NOTIMPL;\r
197 }\r