00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "DialDlg.h"
00009 #include "fsScheduleMgr.h"
00010 #include "fsRASMgr.h"
00011 #include "system.h"
00012 #include "ShedulerWnd.h"
00013
00014 extern CShedulerWnd* _pwndScheduler;
00015
00016 #ifdef _DEBUG
00017 #define new DEBUG_NEW
00018 #undef THIS_FILE
00019 static char THIS_FILE[] = __FILE__;
00020 #endif
00021
00022 #define WM_DIALDLG_ENDDIALOG (WM_APP + 500)
00023
00024 CDialDlg::CDialDlg(CWnd* pParent )
00025 : CDialog(CDialDlg::IDD, pParent)
00026 {
00027
00028
00029
00030 }
00031
00032 void CDialDlg::DoDataExchange(CDataExchange* pDX)
00033 {
00034 CDialog::DoDataExchange(pDX);
00035
00036 DDX_Control(pDX, IDC_ENTRY, m_wndEntries);
00037 DDX_Control(pDX, IDC_LOG, m_wndLog);
00038
00039 }
00040
00041 BEGIN_MESSAGE_MAP(CDialDlg, CDialog)
00042
00043 ON_BN_CLICKED(IDC_CONNECT, OnConnect)
00044 ON_WM_CONTEXTMENU()
00045 ON_COMMAND(ID_WHATISTHIS, OnWhatisthis)
00046 ON_BN_CLICKED(IDC_AUTO, OnAuto)
00047 ON_WM_HELPINFO()
00048
00049 ON_MESSAGE (WM_DIALDLG_ENDDIALOG, OnNeedEndDialog)
00050 END_MESSAGE_MAP()
00051
00052 void CDialDlg::Init(fsDialInfo *dial)
00053 {
00054 m_dial = dial;
00055 }
00056
00057 BOOL CDialDlg::OnInitDialog()
00058 {
00059 CDialog::OnInitDialog();
00060
00061
00062 if (m_pThis)
00063 {
00064 EndDialog (IDCANCEL);
00065 return FALSE;
00066 }
00067
00068 if (m_hConn)
00069 {
00070 fsRasHangUp (m_hConn);
00071 m_hConn = NULL;
00072 }
00073
00074
00075 m_pThis = this;
00076 m_pThisRefs = 1;
00077 m_bNeedStop = FALSE;
00078
00079 CRect rc;
00080 m_wndLog.GetClientRect (&rc);
00081 m_wndLog.InsertColumn (0, "", LVCFMT_LEFT, rc.right);
00082
00083 if (m_dial)
00084 {
00085
00086 m_wndEntries.AddString (m_dial->pszConnection);
00087 m_wndEntries.SetCurSel (0);
00088
00089 GetDlgItem (IDC_AUTO)->EnableWindow (FALSE);
00090
00091 StartConnect ();
00092 }
00093 else
00094 {
00095 fsRASMgr mgr;
00096 if (FALSE == mgr.EnumEntries () || mgr.GetEntriesCount () == 0)
00097 {
00098
00099 MessageBox (LS (L_NODIALENTRIES), LS (L_ERR), MB_ICONERROR);
00100 Release_pThis ();
00101 EndDialog (IDCANCEL);
00102 return FALSE;
00103 }
00104
00105
00106 for (UINT i = 0; i < mgr.GetEntriesCount (); i++)
00107 m_wndEntries.AddString (mgr.GetEntry (i));
00108
00109 for (i = 0; i < (UINT)m_wndEntries.GetCount (); i++)
00110 {
00111 CString strEntry;
00112 m_wndEntries.GetLBText (i, strEntry);
00113 if (lstrcmpi (strEntry, _App.Dial_LastEntry ()) == 0)
00114 {
00115 m_wndEntries.SetCurSel (i);
00116 break;
00117 }
00118 }
00119
00120 if (CB_ERR == m_wndEntries.GetCurSel ())
00121 m_wndEntries.SetCurSel (0);
00122
00123 if (_App.Dial_Auto ())
00124 {
00125 CheckDlgButton (IDC_AUTO, BST_CHECKED);
00126 PostMessage (WM_COMMAND, IDC_CONNECT);
00127 }
00128 }
00129
00130 ApplyLanguage ();
00131
00132 return TRUE;
00133 }
00134
00135 CDialDlg* CDialDlg::m_pThis = NULL;
00136 int CDialDlg::m_pThisRefs = 0;
00137 HRASCONN CDialDlg::m_hConn = NULL;
00138 BOOL CDialDlg::m_bNeedStop = FALSE;
00139 BOOL CDialDlg::m_bInRasFunc = FALSE;
00140
00141 VOID WINAPI CDialDlg::_RasDialFunc(UINT, RASCONNSTATE state, DWORD dwError)
00142 {
00143 if (m_bNeedStop)
00144 return;
00145
00146 if (m_pThis == NULL)
00147 return;
00148
00149 m_bInRasFunc = TRUE;
00150
00151
00152 m_pThisRefs++;
00153
00154 if (dwError && m_bNeedStop == FALSE)
00155 {
00156 switch (dwError)
00157 {
00158 case ERROR_LINE_BUSY:
00159
00160 m_pThis->Log (LS (L_LINEBUSY));
00161 break;
00162
00163 case ERROR_PORT_OR_DEVICE:
00164 m_pThis->Log (LS (L_HARDWAREFAILURE));
00165 break;
00166
00167 case ERROR_NO_DIALTONE:
00168 m_pThis->Log (LS (L_NODIALTONE));
00169 break;
00170
00171 case ERROR_AUTHENTICATION_FAILURE:
00172 m_pThis->Log (LS (L_INVLOGIN2));
00173 break;
00174
00175 default:
00176
00177 char szErr [256];
00178 fsRasGetErrorString (dwError, szErr, sizeof (szErr));
00179 m_pThis->Log (szErr);
00180
00181 if (m_pThis->m_dial == NULL)
00182 m_pThis->Cancel ();
00183 else
00184 {
00185
00186 m_pThis->PostMessage (WM_DIALDLG_ENDDIALOG, IDCANCEL);
00187 Release_pThis ();
00188 }
00189 Release_pThis ();
00190 m_bInRasFunc = FALSE;
00191 return;
00192 }
00193
00194 fsRasHangUp (m_hConn);
00195 m_hConn = NULL;
00196
00197 m_pThis->m_cAttempts++;
00198
00199 if (m_pThis->m_dial)
00200 {
00201
00202 if (m_pThis->m_dial->cAttempts > m_pThis->m_cAttempts)
00203 {
00204
00205 m_pThis->SleepInterval ();
00206 }
00207 else
00208 {
00209 if (m_hConn)
00210 {
00211 fsRasHangUp (m_hConn);
00212 m_hConn = NULL;
00213 }
00214 m_pThis->PostMessage (WM_DIALDLG_ENDDIALOG, IDCANCEL);
00215 Release_pThis ();
00216 Release_pThis ();
00217 m_bInRasFunc = FALSE;
00218 return;
00219 }
00220 }
00221
00222 if (m_bNeedStop == FALSE)
00223 {
00224 m_pThis->Log ("");
00225 CString str;
00226 str.Format ("%s... %s %d", LS (L_DIALING), LS (L_ATTEMPT), m_pThis->m_cAttempts+1);
00227 m_pThis->Log (str);
00228
00229 fsRasDial (NULL, NULL, &m_pThis->m_rp, 0, _RasDialFunc, &m_hConn);
00230 }
00231
00232 Release_pThis ();
00233 m_bInRasFunc = FALSE;
00234 return;
00235 }
00236
00237 switch (state)
00238 {
00239 case RASCS_OpenPort:
00240 m_pThis->Log (LS (L_OPENPORT));
00241 break;
00242
00243 case RASCS_ConnectDevice:
00244 m_pThis->Log (LS (L_DIALTOPROVIDER));
00245 break;
00246
00247 case RASCS_DeviceConnected:
00248 m_pThis->Log (LS (L_CONNECTEDTOREMOTE));
00249 break;
00250
00251 case RASCS_Authenticate:
00252 m_pThis->Log (LS (L_VERUSERANDPASS));
00253 break;
00254
00255 case RASCS_Connected:
00256 RAS_STATS stat;
00257 stat.dwSize = sizeof (stat);
00258
00259 if (fsSysGetOsMajorVersion () >= 5)
00260
00261 fsSysGetConnectionStatistics (m_hConn, &stat);
00262 else
00263 stat.dwBps = UINT_MAX;
00264
00265 if (m_pThis->m_dial && stat.dwBps < m_pThis->m_dial->dwHangupLess)
00266 {
00267 CString str;
00268 str.Format (LS (L_CONNSPEEDNOW), stat.dwBps);
00269 m_pThis->Log (str);
00270 m_pThis->Log (LS (L_HANGUPIT));
00271 fsRasHangUp (m_hConn);
00272 m_hConn = NULL;
00273
00274 if (m_pThis->m_cAgains < m_pThis->m_dial->cAgains)
00275 {
00276
00277 m_pThis->m_cAttempts = 0;
00278 m_pThis->Log ("");
00279 CString str;
00280 str.Format ("%s %d", LS (L_REPETITION), m_pThis->m_cAgains+1);
00281 m_pThis->Log (str);
00282 m_pThis->Log ("");
00283 str.Format ("%s... %s %d", LS (L_DIALING), LS (L_ATTEMPT), m_pThis->m_cAttempts+1);
00284 m_pThis->Log (str);
00285 fsRasDial (NULL, NULL, &m_pThis->m_rp, 0, _RasDialFunc, &m_hConn);
00286 m_pThis->m_cAgains++;
00287 }
00288 else
00289 {
00290 m_pThis->PostMessage (WM_DIALDLG_ENDDIALOG, IDCANCEL);
00291 if (m_hConn)
00292 {
00293 fsRasHangUp (m_hConn);
00294 m_hConn = NULL;
00295 }
00296 Release_pThis ();
00297 }
00298 }
00299 else
00300 {
00301
00302 m_hConn = NULL;
00303 InternetAutodial (INTERNET_AUTODIAL_FORCE_ONLINE, NULL);
00304 m_pThis->PostMessage (WM_DIALDLG_ENDDIALOG, IDOK);
00305 Release_pThis ();
00306 }
00307 break;
00308 }
00309
00310 Release_pThis ();
00311 m_bInRasFunc = FALSE;
00312 }
00313
00314 void CDialDlg::Log(LPCSTR pszRecord)
00315 {
00316 if (IsWindow (m_hWnd) == FALSE)
00317 return;
00318
00319 int iItem = m_wndLog.GetItemCount ();
00320 m_wndLog.InsertItem (iItem, pszRecord, 0);
00321 m_wndLog.EnsureVisible (iItem, FALSE);
00322 }
00323
00324 void CDialDlg::OnCancel()
00325 {
00326 m_bNeedStop = TRUE;
00327
00328 while (m_bInRasFunc)
00329 Sleep (50);
00330
00331 Log (LS (L_CANCELED));
00332 Cancel ();
00333 }
00334
00335 void CDialDlg::SleepInterval()
00336 {
00337 if (m_dial->cPauseBetween == 0)
00338 return;
00339
00340 CString str;
00341
00342 str.Format (LS (L_PAUSESECS), m_dial->cPauseBetween);
00343 Log (str);
00344
00345 int u = m_dial->cPauseBetween * 1000;
00346
00347 while (u > 0)
00348 {
00349 Sleep (500);
00350 u -= 500;
00351 if (m_bNeedStop)
00352 break;
00353 }
00354 }
00355
00356 void CDialDlg::StartConnect()
00357 {
00358 m_bNeedStop = FALSE;
00359
00360 ZeroMemory (&m_rp, sizeof (m_rp));
00361 m_rp.dwSize = sizeof (m_rp);
00362 m_wndEntries.GetLBText (m_wndEntries.GetCurSel (), m_rp.szEntryName);
00363
00364 BOOL bPassword;
00365 fsRasGetEntryDialParams (NULL, &m_rp, &bPassword);
00366
00367 m_cAttempts = 0;
00368 m_cAgains = 0;
00369
00370 CString str;
00371 str.Format ("%s... %s 1", LS (L_DIALING), LS (L_ATTEMPT));
00372 Log (str);
00373 fsRasDial (NULL, NULL, &m_rp, 0, _RasDialFunc, &m_hConn);
00374
00375 GetDlgItem (IDC_CONNECT)->EnableWindow (FALSE);
00376 m_wndEntries.EnableWindow (FALSE);
00377 }
00378
00379 void CDialDlg::OnConnect()
00380 {
00381 CString str;
00382 m_wndEntries.GetLBText (m_wndEntries.GetCurSel (), str);
00383 _App.Dial_LastEntry (str);
00384 StartConnect ();
00385 }
00386
00387 LRESULT CDialDlg::OnNeedEndDialog(WPARAM wp, LPARAM)
00388 {
00389 Release_pThis ();
00390 EndDialog (wp);
00391
00392 if (wp == IDOK)
00393 {
00394 _pwndScheduler->GetMgr ()->ExciteEvent (EV_DIALINGSUCCESS);
00395 _Snds.Event (SME_DIALINGOK);
00396 }
00397 else
00398 {
00399 _pwndScheduler->GetMgr ()->ExciteEvent (EV_DIALINGFAILED);
00400 _Snds.Event (SME_DIALINGFAILED);
00401 }
00402
00403 return 0;
00404 }
00405
00406 void CDialDlg::OnContextMenu(CWnd* , CPoint point)
00407 {
00408 PrepareCHMgr (point);
00409 _CHMgr.ShowMenu ();
00410 }
00411
00412 void CDialDlg::OnWhatisthis()
00413 {
00414 _CHMgr.OnWT ();
00415 }
00416
00417 void CDialDlg::OnAuto()
00418 {
00419 _App.Dial_Auto (IsDlgButtonChecked (IDC_AUTO) == BST_CHECKED);
00420 }
00421
00422 void CDialDlg::ApplyLanguage()
00423 {
00424 fsDlgLngInfo lnginfo [] = {
00425 fsDlgLngInfo (IDC__DIALINGTO, L_CONNECTTO),
00426 fsDlgLngInfo (IDC_AUTO, L_AUTODIAL),
00427 fsDlgLngInfo (IDC_CONNECT, L_CONNECT),
00428 fsDlgLngInfo (IDCANCEL, L_CANCEL),
00429 };
00430
00431 _LngMgr.ApplyLanguage (this, lnginfo, sizeof (lnginfo) / sizeof (fsDlgLngInfo), L_DIALCONNECTION);
00432 }
00433
00434 void CDialDlg::Release_pThis()
00435 {
00436 if (m_pThisRefs)
00437 {
00438 if (--m_pThisRefs == 0)
00439 m_pThis = NULL;
00440 }
00441 }
00442
00443 void CDialDlg::Cancel()
00444 {
00445 BOOL bExit = FALSE;
00446
00447 m_bNeedStop = TRUE;
00448
00449 if (m_hConn)
00450 {
00451
00452 fsRasHangUp (m_hConn);
00453 m_hConn = NULL;
00454 }
00455 else
00456 bExit = TRUE;
00457
00458 if (m_dial)
00459 bExit = TRUE;
00460
00461 if (bExit)
00462 {
00463 if (m_hConn)
00464 {
00465 fsRasHangUp (m_hConn);
00466 m_hConn = NULL;
00467 }
00468 CDialog::OnCancel();
00469 Release_pThis ();
00470 }
00471 else
00472 {
00473 GetDlgItem (IDC_CONNECT)->EnableWindow (TRUE);
00474 m_wndEntries.EnableWindow (TRUE);
00475 }
00476 }
00477
00478 BOOL CDialDlg::OnHelpInfo(HELPINFO* pHelpInfo)
00479 {
00480 RECT rc;
00481 CWnd *pItem = GetDlgItem (pHelpInfo->iCtrlId);
00482 if (pItem == NULL)
00483 return TRUE;
00484 pItem->GetWindowRect (&rc);
00485 if (PtInRect (&rc, pHelpInfo->MousePos) == FALSE)
00486 {
00487 pHelpInfo->MousePos.x = rc.left + (rc.right - rc.left) / 2;
00488 pHelpInfo->MousePos.y = rc.top + (rc.bottom - rc.top) / 2;
00489 }
00490 PrepareCHMgr (pHelpInfo->MousePos);
00491 _CHMgr.OnWT ();
00492 return TRUE;
00493 }
00494
00495 void CDialDlg::PrepareCHMgr(CPoint point)
00496 {
00497 fsCtrlContextHelp aCH1 [] = {
00498 fsCtrlContextHelp (IDC__DIALINGTO, LS (L_CHOOSEENTRY)),
00499 fsCtrlContextHelp (IDC_ENTRY, LS (L_CHOOSEENTRY)),
00500 fsCtrlContextHelp (IDC_AUTO, LS (L_AUTODIALHERE)),
00501 fsCtrlContextHelp (IDC_CONNECT, LS (L_DIALNOW)),
00502 fsCtrlContextHelp (IDCANCEL, LS (L_DONTDIAL)),
00503 };
00504
00505 static fsCtrlContextHelp aCH [sizeof (aCH1) / sizeof (fsCtrlContextHelp)];
00506 CopyMemory (aCH, aCH1, sizeof (aCH));
00507
00508 _CHMgr.PrepareContextMenu (this, point, aCH, sizeof (aCH) / sizeof (fsCtrlContextHelp));
00509 }