OSDN Git Service

Show Auto following tag at log dialog box
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / CheckForUpdatesDlg.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-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 "TortoiseProc.h"\r
21 #include "..\version.h"\r
22 #include "MessageBox.h"\r
23 #include ".\checkforupdatesdlg.h"\r
24 #include "Registry.h"\r
25 #include "AppUtils.h"\r
26 #include "TempFile.h"\r
27 \r
28 \r
29 IMPLEMENT_DYNAMIC(CCheckForUpdatesDlg, CStandAloneDialog)\r
30 CCheckForUpdatesDlg::CCheckForUpdatesDlg(CWnd* pParent /*=NULL*/)\r
31         : CStandAloneDialog(CCheckForUpdatesDlg::IDD, pParent)\r
32         , m_bShowInfo(FALSE)\r
33         , m_bVisible(FALSE)\r
34 {\r
35         m_sUpdateDownloadLink = _T("http://tortoisesvn.tigris.org");\r
36 }\r
37 \r
38 CCheckForUpdatesDlg::~CCheckForUpdatesDlg()\r
39 {\r
40 }\r
41 \r
42 void CCheckForUpdatesDlg::DoDataExchange(CDataExchange* pDX)\r
43 {\r
44         CStandAloneDialog::DoDataExchange(pDX);\r
45         DDX_Control(pDX, IDC_LINK, m_link);\r
46 }\r
47 \r
48 \r
49 BEGIN_MESSAGE_MAP(CCheckForUpdatesDlg, CStandAloneDialog)\r
50         ON_STN_CLICKED(IDC_CHECKRESULT, OnStnClickedCheckresult)\r
51         ON_WM_TIMER()\r
52         ON_WM_WINDOWPOSCHANGING()\r
53         ON_WM_SETCURSOR()\r
54 END_MESSAGE_MAP()\r
55 \r
56 BOOL CCheckForUpdatesDlg::OnInitDialog()\r
57 {\r
58         CStandAloneDialog::OnInitDialog();\r
59 \r
60         CString temp;\r
61         temp.Format(IDS_CHECKNEWER_YOURVERSION, TSVN_VERMAJOR, TSVN_VERMINOR, TSVN_VERMICRO, TSVN_VERBUILD);\r
62         SetDlgItemText(IDC_YOURVERSION, temp);\r
63 \r
64         DialogEnableWindow(IDOK, FALSE);\r
65 \r
66         if (AfxBeginThread(CheckThreadEntry, this)==NULL)\r
67         {\r
68                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
69         }\r
70 \r
71         SetTimer(100, 1000, NULL);\r
72         return TRUE;\r
73 }\r
74 \r
75 void CCheckForUpdatesDlg::OnOK()\r
76 {\r
77         if (m_bThreadRunning)\r
78                 return;\r
79         CStandAloneDialog::OnOK();\r
80 }\r
81 \r
82 void CCheckForUpdatesDlg::OnCancel()\r
83 {\r
84         if (m_bThreadRunning)\r
85                 return;\r
86         CStandAloneDialog::OnCancel();\r
87 }\r
88 \r
89 UINT CCheckForUpdatesDlg::CheckThreadEntry(LPVOID pVoid)\r
90 {\r
91         return ((CCheckForUpdatesDlg*)pVoid)->CheckThread();\r
92 }\r
93 \r
94 UINT CCheckForUpdatesDlg::CheckThread()\r
95 {\r
96         m_bThreadRunning = TRUE;\r
97 \r
98         CString temp;\r
99         CString tempfile = CTempFiles::Instance().GetTempFilePath(true).GetWinPathString();\r
100 \r
101         CRegString checkurluser = CRegString(_T("Software\\TortoiseSVN\\UpdateCheckURL"), _T(""));\r
102         CRegString checkurlmachine = CRegString(_T("Software\\TortoiseSVN\\UpdateCheckURL"), _T(""), FALSE, HKEY_LOCAL_MACHINE);\r
103         CString sCheckURL = checkurluser;\r
104         if (sCheckURL.IsEmpty())\r
105         {\r
106                 sCheckURL = checkurlmachine;\r
107                 if (sCheckURL.IsEmpty())\r
108                         sCheckURL = _T("http://tortoisesvn.tigris.org/version.txt");\r
109         }\r
110         HRESULT res = URLDownloadToFile(NULL, sCheckURL, tempfile, 0, NULL);\r
111         if (res == S_OK)\r
112         {\r
113                 try\r
114                 {\r
115                         CStdioFile file(tempfile, CFile::modeRead | CFile::shareDenyWrite);\r
116                         CString ver;\r
117                         if (file.ReadString(ver))\r
118                         {\r
119                                 CString vertemp = ver;\r
120                                 int major = _ttoi(vertemp);\r
121                                 vertemp = vertemp.Mid(vertemp.Find('.')+1);\r
122                                 int minor = _ttoi(vertemp);\r
123                                 vertemp = vertemp.Mid(vertemp.Find('.')+1);\r
124                                 int micro = _ttoi(vertemp);\r
125                                 vertemp = vertemp.Mid(vertemp.Find('.')+1);\r
126                                 int build = _ttoi(vertemp);\r
127                                 BOOL bNewer = FALSE;\r
128                                 if (major > TSVN_VERMAJOR)\r
129                                         bNewer = TRUE;\r
130                                 else if ((minor > TSVN_VERMINOR)&&(major == TSVN_VERMAJOR))\r
131                                         bNewer = TRUE;\r
132                                 else if ((micro > TSVN_VERMICRO)&&(minor == TSVN_VERMINOR)&&(major == TSVN_VERMAJOR))\r
133                                         bNewer = TRUE;\r
134                                 else if ((build > TSVN_VERBUILD)&&(micro == TSVN_VERMICRO)&&(minor == TSVN_VERMINOR)&&(major == TSVN_VERMAJOR))\r
135                                         bNewer = TRUE;\r
136 \r
137                                 if (_ttoi(ver)!=0)\r
138                                 {\r
139                                         temp.Format(IDS_CHECKNEWER_CURRENTVERSION, (LPCTSTR)ver);\r
140                                         SetDlgItemText(IDC_CURRENTVERSION, temp);\r
141                                         temp.Format(_T("%d.%d.%d.%d"), TSVN_VERMAJOR, TSVN_VERMINOR, TSVN_VERMICRO, TSVN_VERBUILD);\r
142                                 }\r
143 \r
144                                 if (_ttoi(ver)==0)\r
145                                 {\r
146                                         temp.LoadString(IDS_CHECKNEWER_NETERROR);\r
147                                         SetDlgItemText(IDC_CHECKRESULT, temp);\r
148                                 }\r
149                                 else if (bNewer)\r
150                                 {\r
151                                         if(file.ReadString(temp) && !temp.IsEmpty())\r
152                                         {       // Read the next line, it could contain a message for the user\r
153                                                 CString tempLink;\r
154                                                 if(file.ReadString(tempLink) && !tempLink.IsEmpty())\r
155                                                 {       // Read another line to find out the download link-URL, if any\r
156                                                         m_sUpdateDownloadLink = tempLink;\r
157                                                 }\r
158 \r
159                                         }\r
160                                         else\r
161                                         {\r
162                                                 temp.LoadString(IDS_CHECKNEWER_NEWERVERSIONAVAILABLE);\r
163                                         }\r
164                                         SetDlgItemText(IDC_CHECKRESULT, temp);\r
165                                         m_bShowInfo = TRUE;\r
166                                 }\r
167                                 else\r
168                                 {\r
169                                         temp.LoadString(IDS_CHECKNEWER_YOURUPTODATE);\r
170                                         SetDlgItemText(IDC_CHECKRESULT, temp);\r
171                                 }\r
172                         }\r
173                 }\r
174                 catch (CException * e)\r
175                 {\r
176                         e->Delete();\r
177                         temp.LoadString(IDS_CHECKNEWER_NETERROR);\r
178                         SetDlgItemText(IDC_CHECKRESULT, temp);\r
179                 }\r
180         }\r
181         else\r
182         {\r
183                 temp.LoadString(IDS_CHECKNEWER_NETERROR);\r
184                 SetDlgItemText(IDC_CHECKRESULT, temp);\r
185         }\r
186         if (!m_sUpdateDownloadLink.IsEmpty())\r
187         {\r
188                 m_link.ShowWindow(SW_SHOW);\r
189                 m_link.SetURL(m_sUpdateDownloadLink);\r
190         }\r
191 \r
192         DeleteFile(tempfile);\r
193         m_bThreadRunning = FALSE;\r
194         DialogEnableWindow(IDOK, TRUE);\r
195         return 0;\r
196 }\r
197 \r
198 void CCheckForUpdatesDlg::OnStnClickedCheckresult()\r
199 {\r
200         // user clicked on the label, start the browser with our web page\r
201         HINSTANCE result = ShellExecute(NULL, _T("opennew"), m_sUpdateDownloadLink, NULL,NULL, SW_SHOWNORMAL);\r
202         if ((UINT)result <= HINSTANCE_ERROR)\r
203         {\r
204                 result = ShellExecute(NULL, _T("open"), m_sUpdateDownloadLink, NULL,NULL, SW_SHOWNORMAL);\r
205         }\r
206 }\r
207 \r
208 void CCheckForUpdatesDlg::OnTimer(UINT_PTR nIDEvent)\r
209 {\r
210         if (nIDEvent == 100)\r
211         {\r
212                 if (m_bThreadRunning == FALSE)\r
213                 {\r
214                         if (m_bShowInfo)\r
215                         {\r
216                                 m_bVisible = TRUE;\r
217                                 ShowWindow(SW_SHOWNORMAL);\r
218                         }\r
219                         else\r
220                         {\r
221                                 EndDialog(0);\r
222                         }\r
223                 }\r
224         }\r
225         CStandAloneDialog::OnTimer(nIDEvent);\r
226 }\r
227 \r
228 void CCheckForUpdatesDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)\r
229 {\r
230         CStandAloneDialog::OnWindowPosChanging(lpwndpos);\r
231         if (m_bVisible == FALSE)\r
232                 lpwndpos->flags &= ~SWP_SHOWWINDOW;\r
233 }\r
234 \r
235 BOOL CCheckForUpdatesDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)\r
236 {\r
237         if ((!m_sUpdateDownloadLink.IsEmpty())&&(pWnd)&&(pWnd == GetDlgItem(IDC_CHECKRESULT)))\r
238         {\r
239                 HCURSOR hCur = LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND));\r
240                 SetCursor(hCur);\r
241                 return TRUE;\r
242         }\r
243 \r
244         HCURSOR hCur = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));\r
245         SetCursor(hCur);\r
246         return CStandAloneDialogTmpl<CDialog>::OnSetCursor(pWnd, nHitTest, message);\r
247 }\r