1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\r
12 / 1. Redistributions of source code must retain the above copyright
\r
13 / notice, this list of conditions and the following disclaimer.
\r
14 / 2. Redistributions in binary form must reproduce the above copyright
\r
15 / notice, this list of conditions and the following disclaimer in the
\r
16 / documentation and/or other materials provided with the distribution.
\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
\r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
\r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
\r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
\r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
\r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
28 /============================================================================*/
\r
33 //#define WINVER 0x400
\r
35 #include <windows.h>
\r
39 #include <mbstring.h>
\r
41 #include <windowsx.h>
\r
42 #include <winsock.h>
\r
45 #include <raserror.h>
\r
48 #include "resource.h"
\r
51 typedef DWORD (WINAPI*FUNC_RASENUMCONNECTIONS) (LPRASCONN, LPDWORD, LPDWORD);
\r
52 typedef DWORD (WINAPI*FUNC_RASENUMENTRIES) (LPCTSTR, LPCTSTR, LPRASENTRYNAME, LPDWORD, LPDWORD);
\r
53 typedef DWORD (WINAPI*FUNC_RASHANGUP) (HRASCONN);
\r
54 typedef BOOL (WINAPI*FUNC_RASDIAL) (LPRASDIALEXTENSIONS, LPCTSTR, LPRASDIALPARAMS, DWORD, LPVOID, LPHRASCONN);
\r
55 typedef BOOL (WINAPI*FUNC_RASGETENTRYDIALPARAMS) (LPCTSTR, LPRASDIALPARAMS, LPBOOL);
\r
56 typedef BOOL (WINAPI*FUNC_RASGETCONNECTSTATUS) (HRASCONN, LPRASCONNSTATUS);
\r
57 typedef BOOL (WINAPI*FUNC_RASGETERRORSTRING)(UINT, LPTSTR, DWORD);
\r
59 typedef BOOL (WINAPI*FUNC_RASDIALDLG) (LPSTR, LPSTR, LPSTR, LPRASDIALDLG);
\r
62 static int GetCurConnections(RASCONN **Buf);
\r
63 static DWORD RasHangUpWait(HRASCONN hRasConn);
\r
64 static int DoDisconnect(RASCONN *Buf, int Num);
\r
65 static BOOL CALLBACK DialCallBackProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
66 static VOID WINAPI RasDialFunc( UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError );
\r
67 static void MakeRasConnMsg(char *Phone, RASCONNSTATE rasconn, char *Buf);
\r
68 static BOOL CALLBACK DialPassCallBackProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
71 /*===== ローカルなワーク =====*/
\r
73 static HINSTANCE m_hDll = NULL;
\r
74 static HINSTANCE m_hDll2 = NULL;
\r
76 static FUNC_RASENUMCONNECTIONS m_RasEnumConnections = NULL;
\r
77 static FUNC_RASENUMENTRIES m_RasEnumEntries = NULL;
\r
78 static FUNC_RASHANGUP m_RasHangUp = NULL;
\r
79 static FUNC_RASDIAL m_RasDial = NULL;
\r
80 static FUNC_RASGETENTRYDIALPARAMS m_RasGetEntryDialParams = NULL;
\r
81 static FUNC_RASGETCONNECTSTATUS m_RasGetConnectStatus = NULL;
\r
82 static FUNC_RASGETERRORSTRING m_RasGetErrorString = NULL;
\r
84 static FUNC_RASDIALDLG m_RasDialDlg = NULL;
\r
86 static HWND hWndDial;
\r
90 /*----- RASライブラリをロードする ---------------------------------------------
\r
99 * RASライブラリは必ずインストールされるものではないので、スタティックに
\r
101 *----------------------------------------------------------------------------*/
\r
103 void LoadRasLib(void)
\r
105 if((m_hDll = LoadLibrary("rasapi32.dll")) != NULL)
\r
107 m_RasEnumConnections = (FUNC_RASENUMCONNECTIONS)GetProcAddress(m_hDll, "RasEnumConnectionsA");
\r
108 m_RasEnumEntries = (FUNC_RASENUMENTRIES)GetProcAddress(m_hDll, "RasEnumEntriesA");
\r
109 m_RasHangUp = (FUNC_RASHANGUP)GetProcAddress(m_hDll, "RasHangUpA");
\r
110 m_RasDial = (FUNC_RASDIAL)GetProcAddress(m_hDll, "RasDialA");
\r
111 m_RasGetEntryDialParams = (FUNC_RASGETENTRYDIALPARAMS)GetProcAddress(m_hDll, "RasGetEntryDialParamsA");
\r
112 m_RasGetConnectStatus = (FUNC_RASGETCONNECTSTATUS)GetProcAddress(m_hDll, "RasGetConnectStatusA");
\r
113 m_RasGetErrorString = (FUNC_RASGETERRORSTRING)GetProcAddress(m_hDll, "RasGetErrorStringA");
\r
115 if((m_RasEnumConnections == NULL) ||
\r
116 (m_RasEnumEntries == NULL) ||
\r
117 (m_RasHangUp == NULL) ||
\r
118 (m_RasDial == NULL) ||
\r
119 (m_RasGetEntryDialParams == NULL) ||
\r
120 (m_RasGetConnectStatus == NULL) ||
\r
121 (m_RasGetErrorString == NULL))
\r
123 FreeLibrary(m_hDll);
\r
130 if((m_hDll2 = LoadLibrary("rasdlg.dll")) != NULL)
\r
132 m_RasDialDlg = (FUNC_RASDIALDLG)GetProcAddress(m_hDll2, "RasDialDlgA");
\r
134 if(m_RasDialDlg == NULL)
\r
136 FreeLibrary(m_hDll2);
\r
145 /*----- RASライブラリをリリースする -------------------------------------------
\r
152 *----------------------------------------------------------------------------*/
\r
154 void ReleaseRasLib(void)
\r
157 FreeLibrary(m_hDll);
\r
160 if(m_hDll2 != NULL)
\r
161 FreeLibrary(m_hDll2);
\r
168 /*----- RASが使えるかどうかを返す ---------------------------------------------
\r
176 *----------------------------------------------------------------------------*/
\r
178 int AskRasUsable(void)
\r
190 /*----- 現在のRASコネクション一覧を返す ---------------------------------------
\r
193 * RASCONN **Buf : 一覧へのポインタを返すワーク
\r
199 * Bufの領域は呼出側で開放すること
\r
200 *----------------------------------------------------------------------------*/
\r
202 static int GetCurConnections(RASCONN **Buf)
\r
212 Size = sizeof(RASCONN);
\r
213 if((RasConn = malloc(Size)) != NULL)
\r
215 RasConn->dwSize = sizeof(RASCONN);
\r
216 Sts = (*m_RasEnumConnections)(RasConn, &Size, &Num);
\r
217 if((Sts == ERROR_BUFFER_TOO_SMALL) || (Sts == ERROR_NOT_ENOUGH_MEMORY))
\r
219 if((Tmp = realloc(RasConn, Size)) != NULL)
\r
222 Sts = (*m_RasEnumConnections)(RasConn, &Size, &Num);
\r
238 /*----- RasHangUp()------------------------------------------------------------
\r
241 * HRASCONN hRasConn : ハンドル
\r
248 *----------------------------------------------------------------------------*/
\r
250 static DWORD RasHangUpWait(HRASCONN hRasConn)
\r
252 RASCONNSTATUS RasSts;
\r
255 Sts = (*m_RasHangUp)(hRasConn);
\r
257 RasSts.dwSize = sizeof(RASCONNSTATUS);
\r
258 while((*m_RasGetConnectStatus)(hRasConn, &RasSts) != ERROR_INVALID_HANDLE)
\r
265 /*----- 現在のRASコネクションを切断する ---------------------------------------
\r
268 * RASCONN *RasConn : 接続一覧
\r
272 * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)
\r
273 *----------------------------------------------------------------------------*/
\r
275 static int DoDisconnect(RASCONN *RasConn, int Num)
\r
280 Sts = FFFTP_SUCCESS;
\r
283 SetTaskMsg(MSGJPN220);
\r
284 for(i = 0; i < Num; i++)
\r
286 if(RasHangUpWait(RasConn[i].hrasconn) != 0)
\r
294 /*----- RASを切断する ---------------------------------------------------------
\r
297 * int Notify : 確認するかどうか (YES/NO)
\r
301 *----------------------------------------------------------------------------*/
\r
303 void DisconnectRas(int Notify)
\r
310 if((Num = GetCurConnections(&RasConn)) != -1)
\r
314 if((Notify == NO) ||
\r
315 (DialogBox(GetFtpInst(), MAKEINTRESOURCE(rasnotify_dlg), GetMainHwnd(), ExeEscDialogProc) == YES))
\r
317 DoDisconnect(RasConn, Num);
\r
327 /*----- RASのエントリ一覧をコンボボックスにセットする -------------------------
\r
330 * HWND hDlg : ダイアログボックスのハンドル
\r
331 * int Item : コンボボックスのリソース番号
\r
332 * char *CurName : 初期値
\r
336 *----------------------------------------------------------------------------*/
\r
338 int SetRasEntryToComboBox(HWND hDlg, int Item, char *CurName)
\r
340 RASENTRYNAME *Entry;
\r
350 Size = sizeof(RASENTRYNAME);
\r
351 if((Entry = malloc(Size)) != NULL)
\r
353 Entry->dwSize = sizeof(RASENTRYNAME);
\r
354 Sts = (*m_RasEnumEntries)(NULL, NULL, Entry, &Size, &Num);
\r
355 if((Sts == ERROR_BUFFER_TOO_SMALL) || (Sts == ERROR_NOT_ENOUGH_MEMORY))
\r
357 if((Tmp = realloc(Entry, Size)) != NULL)
\r
360 Sts = (*m_RasEnumEntries)(NULL, NULL, Entry, &Size, &Num);
\r
364 if((Sts == 0) && (Num > 0))
\r
366 for(i = 0; i < Num; i++)
\r
367 SendDlgItemMessage(hDlg, Item, CB_ADDSTRING, 0, (LPARAM)Entry[i].szEntryName);
\r
369 SendDlgItemMessage(hDlg, Item, CB_SELECTSTRING, -1, (LPARAM)CurName);
\r
378 /*----- RASの接続を行う -------------------------------------------------------
\r
381 * int Dialup : ダイアルアップするかどうか (YES/NO)
\r
382 * int UseThis : 必ずこのエントリに接続するかどうか (YES/NO)
\r
383 * int Notify : 再接続前に確認するかどうか (YES/NO)
\r
387 * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)
\r
388 *----------------------------------------------------------------------------*/
\r
390 int ConnectRas(int Dialup, int UseThis, int Notify, char *Name)
\r
392 RASDIALDLG DlgParam;
\r
398 RASDIALPARAMS Param;
\r
400 OSVERSIONINFO VerInfo;
\r
402 Sts = FFFTP_SUCCESS;
\r
409 if((Num = GetCurConnections(&RasConn)) != -1)
\r
417 for(i = 0; i < Num; i++)
\r
419 if(_mbscmp(RasConn[i].szEntryName, Name) == 0)
\r
425 if((Notify == NO) ||
\r
426 (DialogBox(GetFtpInst(), MAKEINTRESOURCE(rasreconnect_dlg), GetMainHwnd(), ExeEscDialogProc) == YES))
\r
428 DoDisconnect(RasConn, Num);
\r
441 SetTaskMsg(MSGJPN221);
\r
445 VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
\r
446 if(GetVersionEx(&VerInfo) == TRUE)
\r
448 if(VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
\r
454 if(m_hDll2 != NULL)
\r
457 DlgParam.dwSize = sizeof(RASDIALDLG);
\r
458 DlgParam.hwndOwner = GetMainHwnd();
\r
459 DlgParam.dwFlags = 0;
\r
460 DlgParam.dwSubEntry = 0;
\r
461 DlgParam.reserved = 0;
\r
462 DlgParam.reserved2 = 0;
\r
463 if((*m_RasDialDlg)(NULL, Name, NULL, &DlgParam) != 0)
\r
464 Sts = FFFTP_SUCCESS;
\r
467 SetTaskMsg(MSGJPN222);
\r
471 /* Windows 95,98 */
\r
472 Param.dwSize = sizeof(RASDIALPARAMS);
\r
473 strcpy(Param.szEntryName, Name);
\r
475 Sts = (*m_RasGetEntryDialParams)(NULL, &Param, &Flg);
\r
476 strcpy(Param.szPhoneNumber, "");
\r
478 if(((strlen(Param.szUserName) != 0) && (strlen(Param.szPassword) != 0)) ||
\r
479 (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(dial_password_dlg), GetMainHwnd(), (DLGPROC)DialPassCallBackProc, (LPARAM)&Param) == YES))
\r
481 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(dial_dlg), GetMainHwnd(), (DLGPROC)DialCallBackProc, (LPARAM)&Param) == YES)
\r
482 Sts = FFFTP_SUCCESS;
\r
492 /*----- RASダイアルウインドウのコールバック -----------------------------------
\r
495 * HWND hDlg : ウインドウハンドル
\r
496 * UINT message : メッセージ番号
\r
497 * WPARAM wParam : メッセージの WPARAM 引数
\r
498 * LPARAM lParam : メッセージの LPARAM 引数
\r
502 *----------------------------------------------------------------------------*/
\r
504 static BOOL CALLBACK DialCallBackProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
506 static RASDIALPARAMS *Param;
\r
507 static HRASCONN hRasConn;
\r
508 char Tmp[RAS_NAME_LEN+25];
\r
513 case WM_INITDIALOG :
\r
514 Param = (RASDIALPARAMS *)lParam;
\r
517 sprintf(Tmp, MSGJPN223, Param->szEntryName);
\r
518 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)Tmp);
\r
519 Sts = (*m_RasDial)(NULL, NULL, Param, 0, &RasDialFunc, &hRasConn);
\r
521 EndDialog(hDlg, NO);
\r
525 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
528 RasHangUpWait(hRasConn);
\r
529 EndDialog(hDlg, NO);
\r
538 if((*m_RasGetErrorString)((UINT)lParam, (LPTSTR)Tmp, RAS_NAME_LEN+25) != 0)
\r
539 sprintf(Tmp, MSGJPN224);
\r
540 RasHangUpWait(hRasConn);
\r
541 MessageBox(hDlg, Tmp, MSGJPN225, MB_OK | MB_ICONSTOP);
\r
542 EndDialog(hDlg, NO);
\r
544 else if(wParam & RASCS_DONE)
\r
547 EndDialog(hDlg, YES);
\r
552 MakeRasConnMsg(Param->szPhoneNumber, wParam, Tmp);
\r
553 SendDlgItemMessage(hDlg, DIAL_STATUS, WM_SETTEXT, 0, (LPARAM)Tmp);
\r
561 /*----- RasDial()のコールバック -----------------------------------------------
\r
564 * UINT unMsg : メッセージ
\r
565 * RASCONNSTATE rasconnstate : ステータス
\r
566 * DWORD dwError : エラー
\r
570 *----------------------------------------------------------------------------*/
\r
572 static VOID WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
\r
574 PostMessage(hWndDial, WM_DIAL_MSG, (WPARAM)rasconnstate, (LPARAM)dwError );
\r
578 /*----- RasDial()のステータスメッセージを作成する -----------------------------
\r
581 * char *Phone : 電話番号
\r
582 * RASCONNSTATE rasconn : ステータス
\r
583 * char *Buf : 文字列をセットするバッファ
\r
587 *----------------------------------------------------------------------------*/
\r
589 static void MakeRasConnMsg(char *Phone, RASCONNSTATE rasconn, char *Buf)
\r
593 case RASCS_OpenPort:
\r
594 strcpy(Buf, MSGJPN226);
\r
596 case RASCS_PortOpened:
\r
597 strcpy(Buf, MSGJPN227);
\r
599 case RASCS_ConnectDevice:
\r
600 sprintf(Buf, MSGJPN228);
\r
602 case RASCS_DeviceConnected:
\r
603 strcpy(Buf, MSGJPN229);
\r
605 case RASCS_AllDevicesConnected:
\r
606 strcpy(Buf, MSGJPN230);
\r
608 case RASCS_Authenticate:
\r
609 case RASCS_AuthNotify:
\r
610 strcpy(Buf, MSGJPN231);
\r
612 case RASCS_AuthRetry:
\r
613 case RASCS_ReAuthenticate:
\r
614 strcpy(Buf, MSGJPN232);
\r
616 case RASCS_AuthChangePassword:
\r
617 strcpy(Buf, MSGJPN233);
\r
619 case RASCS_Authenticated:
\r
620 strcpy(Buf, MSGJPN234);
\r
622 case RASCS_Connected:
\r
623 strcpy(Buf, MSGJPN235);
\r
625 case RASCS_Disconnected:
\r
626 strcpy(Buf, MSGJPN236);
\r
628 case RASCS_AuthCallback:
\r
629 case RASCS_PrepareForCallback:
\r
630 case RASCS_WaitForModemReset:
\r
631 case RASCS_WaitForCallback:
\r
632 case RASCS_Interactive:
\r
633 case RASCS_RetryAuthentication:
\r
634 case RASCS_CallbackSetByCaller:
\r
635 case RASCS_PasswordExpired:
\r
636 case RASCS_AuthProject:
\r
637 case RASCS_AuthLinkSpeed:
\r
638 case RASCS_AuthAck:
\r
640 strcpy(Buf, MSGJPN237);
\r
647 /*----- ユーザ名、パスワード入力ウインドウのコールバック ----------------------
\r
650 * HWND hDlg : ウインドウハンドル
\r
651 * UINT message : メッセージ番号
\r
652 * WPARAM wParam : メッセージの WPARAM 引数
\r
653 * LPARAM lParam : メッセージの LPARAM 引数
\r
657 *----------------------------------------------------------------------------*/
\r
659 static BOOL CALLBACK DialPassCallBackProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
661 static RASDIALPARAMS *Param;
\r
662 char Tmp[RAS_NAME_LEN+25];
\r
666 case WM_INITDIALOG :
\r
667 Param = (RASDIALPARAMS *)lParam;
\r
668 sprintf(Tmp, MSGJPN238, Param->szEntryName);
\r
669 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)Tmp);
\r
670 SendDlgItemMessage(hDlg, RASPASS_USER, EM_LIMITTEXT, UNLEN, 0);
\r
671 SendDlgItemMessage(hDlg, RASPASS_PASS, EM_LIMITTEXT, PWLEN, 0);
\r
672 SendDlgItemMessage(hDlg, RASPASS_USER, WM_SETTEXT, 0, (LPARAM)Param->szUserName);
\r
673 SendDlgItemMessage(hDlg, RASPASS_PASS, WM_SETTEXT, 0, (LPARAM)Param->szPassword);
\r
677 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
680 SendDlgItemMessage(hDlg, RASPASS_USER, WM_GETTEXT, UNLEN+1, (LPARAM)Param->szUserName);
\r
681 SendDlgItemMessage(hDlg, RASPASS_PASS, WM_GETTEXT, PWLEN+1, (LPARAM)Param->szPassword);
\r
682 EndDialog(hDlg, YES);
\r
686 EndDialog(hDlg, NO);
\r