00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "DownloadProperties_IntegrityPage.h"
00009 #include "Hash\vmsHash.h"
00010
00011 #ifdef _DEBUG
00012 #define new DEBUG_NEW
00013 #undef THIS_FILE
00014 static char THIS_FILE[] = __FILE__;
00015 #endif
00016
00017 #define DP_OFFSET(member) ( LPBYTE (&dp.member) - LPBYTE (&dp) )
00018 #define DP_SIZEOF(member) ( sizeof (dp.member) )
00019 #define DP_EQ_EX(memOffset, memSize, bString) DPEntry_IsAllEqual (m_pvDlds, memOffset, memSize, bString)
00020 #define DP_EQ_MASK(member, mask) DPEntry_IsAllEqual_BitMask (m_pvDlds, DP_OFFSET (member), mask)
00021 #define DP_EQ(member, bString) DP_EQ_EX (DP_OFFSET (member), DP_SIZEOF (member), bString)
00022 #define DP_SET_EX(memOffset, memSize, bString, NewVal) DPEntry_SetValue (m_pvDlds, memOffset, memSize, bString, NewVal)
00023 #define DP_SET(member, bString, NewVal) DP_SET_EX (DP_OFFSET (member), DP_SIZEOF (member), bString, NewVal)
00024 #define DP_SET_MASK(member, mask) DPEntry_SetValue_BitMask (m_pvDlds, DP_OFFSET (member), mask)
00025 #define DP_UNSET_MASK(member, mask) DPEntry_UnsetValue_BitMask (m_pvDlds, DP_OFFSET (member), mask)
00026
00027 IMPLEMENT_DYNCREATE(CDownloadProperties_IntegrityPage, CPropertyPage)
00028
00029 CDownloadProperties_IntegrityPage::CDownloadProperties_IntegrityPage() : CPropertyPage(CDownloadProperties_IntegrityPage::IDD)
00030 {
00031 m_psp.dwFlags |= PSP_USETITLE;
00032 m_psp.pszTitle = LS (L_INTEGRITY);
00033 }
00034
00035 CDownloadProperties_IntegrityPage::~CDownloadProperties_IntegrityPage()
00036 {
00037 }
00038
00039 void CDownloadProperties_IntegrityPage::DoDataExchange(CDataExchange* pDX)
00040 {
00041 CPropertyPage::DoDataExchange(pDX);
00042
00043 DDX_Control(pDX, IDC_ALGORITHM, m_wndAlgorithm);
00044 DDX_Control(pDX, IDC_ICFR, m_wndICFR);
00045
00046 }
00047
00048 BEGIN_MESSAGE_MAP(CDownloadProperties_IntegrityPage, CPropertyPage)
00049
00050 ON_BN_CLICKED(IDC_PERFORMCHECKWHENDONE, OnPerformcheckwhendone)
00051 ON_CBN_SELCHANGE(IDC_ALGORITHM, OnSelchangeAlgorithm)
00052 ON_CBN_SELCHANGE(IDC_ICFR, OnSelchangeIcfr)
00053 ON_EN_CHANGE(IDC_CHECKSUM, OnChangeChecksum)
00054 ON_WM_CONTEXTMENU()
00055 ON_COMMAND(ID_WHATISTHIS, OnWhatisthis)
00056 ON_WM_HELPINFO()
00057
00058 END_MESSAGE_MAP()
00059
00060 BOOL CDownloadProperties_IntegrityPage::OnInitDialog()
00061 {
00062 CPropertyPage::OnInitDialog();
00063
00064 fsDownload_Properties dp;
00065 fsDownload_Properties *dp0 = m_pvDlds->at (0)->pMgr->GetDownloadMgr ()->GetDP ();
00066
00067 if (DP_EQ (bCheckIntegrityWhenDone, FALSE))
00068 CheckDlgButton (IDC_PERFORMCHECKWHENDONE, dp0->bCheckIntegrityWhenDone ? BST_CHECKED : BST_UNCHECKED);
00069 else
00070 CheckDlgButton (IDC_PERFORMCHECKWHENDONE, BST_INDETERMINATE);
00071
00072 m_wndICFR.AddString (LS (L_ASK));
00073 m_wndICFR.AddString (LS (L_RESTART));
00074 m_wndICFR.AddString (LS (L_DONOTHING));
00075 if (DP_EQ (enICFR, FALSE))
00076 m_wndICFR.SetCurSel (dp0->enICFR);
00077
00078 LPCSTR ppszAlgs [] = {
00079 "MD5", "SHA-1", "SHA-2 256", "SHA-2 384", "SHA-2 512",
00080 "CRC 32"
00081 };
00082
00083 DWORD adwAlgs [] = {
00084 HA_MD5, HA_SHA1, HA_SHA2,
00085 MAKELONG (HA_SHA2, HSHA2S_384), MAKELONG (HA_SHA2, HSHA2S_512),
00086 HA_CRC32,
00087 };
00088
00089 DWORD dwAlg = (DWORD)-1;
00090 if (m_pvDlds->size () == 1)
00091 dwAlg = dp0->dwIntegrityCheckAlgorithm;
00092
00093 for (int i = 0; i < sizeof (ppszAlgs) / sizeof (LPCSTR); i++)
00094 {
00095 m_wndAlgorithm.AddString (ppszAlgs [i]);
00096 m_wndAlgorithm.SetItemData (i, adwAlgs [i]);
00097 if (dwAlg == adwAlgs [i])
00098 m_wndAlgorithm.SetCurSel (i);
00099 }
00100
00101 if (m_pvDlds->size () == 1)
00102 {
00103 SetDlgItemText (IDC_CHECKSUM, dp0->pszCheckSum);
00104 }
00105 else
00106 {
00107 UINT anIds [] = {
00108 IDC__CHECKSUMOFTHISFILE, IDC_CHECKSUM,
00109 IDC__ALGORITHM, IDC_ALGORITHM
00110 };
00111
00112 for (int i = 0; i < sizeof (anIds) / sizeof (UINT); i++)
00113 GetDlgItem (anIds [i])->ShowWindow (SW_HIDE);
00114 }
00115
00116 ApplyLanguage ();
00117
00118 UpdateEnabled ();
00119
00120 return TRUE;
00121 }
00122
00123 void CDownloadProperties_IntegrityPage::ApplyLanguage()
00124 {
00125 fsDlgLngInfo lnginfo [] = {
00126 fsDlgLngInfo (IDC_PERFORMCHECKWHENDONE, L_PERFORMINTEGRITYCHECK),
00127 fsDlgLngInfo (IDC__IFCHECKFAILED, L_IFCHECKFAILED, TRUE),
00128 fsDlgLngInfo (IDC__CHECKSUMOFTHISFILE, L_CHECKSUMOFTHISFILE, TRUE),
00129 fsDlgLngInfo (IDC__ALGORITHM, L_ALGORITHM, TRUE),
00130 };
00131
00132 _LngMgr.ApplyLanguage (this, lnginfo, sizeof (lnginfo) / sizeof (fsDlgLngInfo), 0);
00133 }
00134
00135 void CDownloadProperties_IntegrityPage::OnPerformcheckwhendone()
00136 {
00137 if (IsDlgButtonChecked (IDC_PERFORMCHECKWHENDONE) == BST_INDETERMINATE)
00138 CheckDlgButton (IDC_PERFORMCHECKWHENDONE, BST_UNCHECKED);
00139
00140 SetModified ();
00141 }
00142
00143 void CDownloadProperties_IntegrityPage::OnSelchangeAlgorithm()
00144 {
00145 SetModified ();
00146 }
00147
00148 void CDownloadProperties_IntegrityPage::OnSelchangeIcfr()
00149 {
00150 SetModified ();
00151 }
00152
00153 void CDownloadProperties_IntegrityPage::OnChangeChecksum()
00154 {
00155 SetModified ();
00156 }
00157
00158 void CDownloadProperties_IntegrityPage::UpdateEnabled()
00159 {
00160
00161 }
00162
00163 void CDownloadProperties_IntegrityPage::OnContextMenu(CWnd* , CPoint point)
00164 {
00165 PrepareCHMgr (point);
00166 _CHMgr.ShowMenu ();
00167 }
00168
00169 void CDownloadProperties_IntegrityPage::OnWhatisthis()
00170 {
00171 _CHMgr.OnWT ();
00172 }
00173
00174 BOOL CDownloadProperties_IntegrityPage::OnHelpInfo(HELPINFO* pHelpInfo)
00175 {
00176 RECT rc;
00177 CWnd *pItem = GetDlgItem (pHelpInfo->iCtrlId);
00178 if (pItem == NULL)
00179 return TRUE;
00180 pItem->GetWindowRect (&rc);
00181 if (PtInRect (&rc, pHelpInfo->MousePos) == FALSE)
00182 {
00183 pHelpInfo->MousePos.x = rc.left + (rc.right - rc.left) / 2;
00184 pHelpInfo->MousePos.y = rc.top + (rc.bottom - rc.top) / 2;
00185 }
00186 PrepareCHMgr (pHelpInfo->MousePos);
00187 _CHMgr.OnWT ();
00188 return TRUE;
00189 }
00190
00191 void CDownloadProperties_IntegrityPage::PrepareCHMgr(CPoint point)
00192 {
00193 fsCtrlContextHelp aCH1 [] = {
00194 fsCtrlContextHelp (IDC_PERFORMCHECKWHENDONE, LS (L_PERFORMINTEGRITYCHECKWHENDONE_HERE)),
00195 fsCtrlContextHelp (IDC_ICFR, LS (L_ICFR_HERE)),
00196 fsCtrlContextHelp (IDC__IFCHECKFAILED, LS (L_ICFR_HERE)),
00197 };
00198
00199 static fsCtrlContextHelp aCH [sizeof (aCH1) / sizeof (fsCtrlContextHelp)];
00200 CopyMemory (aCH, aCH1, sizeof (aCH));
00201
00202 _CHMgr.PrepareContextMenu (this, point, aCH, sizeof (aCH) / sizeof (fsCtrlContextHelp));
00203 }
00204
00205 BOOL CDownloadProperties_IntegrityPage::OnApply()
00206 {
00207 fsDownload_Properties dp;
00208
00209 if (m_pvDlds->size () == 1 && m_wndAlgorithm.GetCurSel () == CB_ERR)
00210 {
00211 MessageBox (LS (L_SPECIFYINTEGRITYALGORITHM), LS (L_INPERR), MB_ICONEXCLAMATION);
00212 m_wndAlgorithm.SetFocus ();
00213 return FALSE;
00214 }
00215
00216 UINT u = IsDlgButtonChecked (IDC_PERFORMCHECKWHENDONE);
00217 if (u != BST_INDETERMINATE)
00218 {
00219 u = u == BST_CHECKED;
00220 DP_SET (bCheckIntegrityWhenDone, FALSE, &u);
00221 }
00222
00223 if (m_wndICFR.GetCurSel () != CB_ERR)
00224 {
00225 vmsIntegrityCheckFailedReaction enICFR = (vmsIntegrityCheckFailedReaction)m_wndICFR.GetCurSel ();
00226 DP_SET (enICFR, FALSE, &enICFR);
00227 }
00228
00229 if (m_pvDlds->size () == 1)
00230 {
00231 fsDownload_Properties *dp0 = m_pvDlds->at (0)->pMgr->GetDownloadMgr ()->GetDP ();
00232
00233 SAFE_DELETE_ARRAY (dp0->pszCheckSum);
00234 CString str; GetDlgItemText (IDC_CHECKSUM, str);
00235 MakeChecksumValid (str);
00236 dp0->pszCheckSum = new char [str.GetLength () + 1];
00237 lstrcpy (dp0->pszCheckSum, str);
00238
00239 dp0->dwIntegrityCheckAlgorithm = m_wndAlgorithm.GetItemData (m_wndAlgorithm.GetCurSel ());
00240 }
00241
00242 return CPropertyPage::OnApply();
00243 }
00244
00245 void CDownloadProperties_IntegrityPage::MakeChecksumValid(CString &str)
00246 {
00247 str.MakeLower ();
00248
00249 CString str2;
00250 LPCSTR psz = str;
00251 while (*psz)
00252 {
00253 if ((*psz >= '0' && *psz <= '9') ||
00254 (*psz >= 'a' && *psz <= 'f') )
00255 str2 += *psz;
00256
00257 psz++;
00258 }
00259
00260 str = str2;
00261 }