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
36 #include <winsock2.h>
\r
37 #include <windows.h>
\r
41 #include <mbstring.h>
\r
43 #include <windowsx.h>
\r
45 //#include <winsock.h>
\r
48 #include <raserror.h>
\r
51 #include "resource.h"
\r
54 typedef DWORD (WINAPI*FUNC_RASENUMCONNECTIONS) (LPRASCONN, LPDWORD, LPDWORD);
\r
55 typedef DWORD (WINAPI*FUNC_RASENUMENTRIES) (LPCTSTR, LPCTSTR, LPRASENTRYNAME, LPDWORD, LPDWORD);
\r
56 typedef DWORD (WINAPI*FUNC_RASHANGUP) (HRASCONN);
\r
57 typedef BOOL (WINAPI*FUNC_RASDIAL) (LPRASDIALEXTENSIONS, LPCTSTR, LPRASDIALPARAMS, DWORD, LPVOID, LPHRASCONN);
\r
58 typedef BOOL (WINAPI*FUNC_RASGETENTRYDIALPARAMS) (LPCTSTR, LPRASDIALPARAMS, LPBOOL);
\r
59 typedef BOOL (WINAPI*FUNC_RASGETCONNECTSTATUS) (HRASCONN, LPRASCONNSTATUS);
\r
60 typedef BOOL (WINAPI*FUNC_RASGETERRORSTRING)(UINT, LPTSTR, DWORD);
\r
62 typedef BOOL (WINAPI*FUNC_RASDIALDLG) (LPSTR, LPSTR, LPSTR, LPRASDIALDLG);
\r
65 static int GetCurConnections(RASCONN **Buf);
\r
66 static DWORD RasHangUpWait(HRASCONN hRasConn);
\r
67 static int DoDisconnect(RASCONN *Buf, int Num);
\r
68 static BOOL CALLBACK DialCallBackProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
69 static VOID WINAPI RasDialFunc( UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError );
\r
70 static void MakeRasConnMsg(char *Phone, RASCONNSTATE rasconn, char *Buf);
\r
71 static BOOL CALLBACK DialPassCallBackProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
74 /*===== ローカルなワーク =====*/
\r
76 static HINSTANCE m_hDll = NULL;
\r
77 static HINSTANCE m_hDll2 = NULL;
\r
79 static FUNC_RASENUMCONNECTIONS m_RasEnumConnections = NULL;
\r
80 static FUNC_RASENUMENTRIES m_RasEnumEntries = NULL;
\r
81 static FUNC_RASHANGUP m_RasHangUp = NULL;
\r
82 static FUNC_RASDIAL m_RasDial = NULL;
\r
83 static FUNC_RASGETENTRYDIALPARAMS m_RasGetEntryDialParams = NULL;
\r
84 static FUNC_RASGETCONNECTSTATUS m_RasGetConnectStatus = NULL;
\r
85 static FUNC_RASGETERRORSTRING m_RasGetErrorString = NULL;
\r
87 static FUNC_RASDIALDLG m_RasDialDlg = NULL;
\r
89 static HWND hWndDial;
\r
93 /*----- RASライブラリをロードする ---------------------------------------------
\r
102 * RASライブラリは必ずインストールされるものではないので、スタティックに
\r
104 *----------------------------------------------------------------------------*/
\r
106 void LoadRasLib(void)
\r
108 if((m_hDll = LoadLibrary("rasapi32.dll")) != NULL)
\r
110 m_RasEnumConnections = (FUNC_RASENUMCONNECTIONS)GetProcAddress(m_hDll, "RasEnumConnectionsA");
\r
111 m_RasEnumEntries = (FUNC_RASENUMENTRIES)GetProcAddress(m_hDll, "RasEnumEntriesA");
\r
112 m_RasHangUp = (FUNC_RASHANGUP)GetProcAddress(m_hDll, "RasHangUpA");
\r
113 m_RasDial = (FUNC_RASDIAL)GetProcAddress(m_hDll, "RasDialA");
\r
114 m_RasGetEntryDialParams = (FUNC_RASGETENTRYDIALPARAMS)GetProcAddress(m_hDll, "RasGetEntryDialParamsA");
\r
115 m_RasGetConnectStatus = (FUNC_RASGETCONNECTSTATUS)GetProcAddress(m_hDll, "RasGetConnectStatusA");
\r
116 m_RasGetErrorString = (FUNC_RASGETERRORSTRING)GetProcAddress(m_hDll, "RasGetErrorStringA");
\r
118 if((m_RasEnumConnections == NULL) ||
\r
119 (m_RasEnumEntries == NULL) ||
\r
120 (m_RasHangUp == NULL) ||
\r
121 (m_RasDial == NULL) ||
\r
122 (m_RasGetEntryDialParams == NULL) ||
\r
123 (m_RasGetConnectStatus == NULL) ||
\r
124 (m_RasGetErrorString == NULL))
\r
126 FreeLibrary(m_hDll);
\r
133 if((m_hDll2 = LoadLibrary("rasdlg.dll")) != NULL)
\r
135 m_RasDialDlg = (FUNC_RASDIALDLG)GetProcAddress(m_hDll2, "RasDialDlgA");
\r
137 if(m_RasDialDlg == NULL)
\r
139 FreeLibrary(m_hDll2);
\r
148 /*----- RASライブラリをリリースする -------------------------------------------
\r
155 *----------------------------------------------------------------------------*/
\r
157 void ReleaseRasLib(void)
\r
160 FreeLibrary(m_hDll);
\r
163 if(m_hDll2 != NULL)
\r
164 FreeLibrary(m_hDll2);
\r
171 /*----- RASが使えるかどうかを返す ---------------------------------------------
\r
179 *----------------------------------------------------------------------------*/
\r
181 int AskRasUsable(void)
\r
193 /*----- 現在のRASコネクション一覧を返す ---------------------------------------
\r
196 * RASCONN **Buf : 一覧へのポインタを返すワーク
\r
202 * Bufの領域は呼出側で開放すること
\r
203 *----------------------------------------------------------------------------*/
\r
205 static int GetCurConnections(RASCONN **Buf)
\r
215 Size = sizeof(RASCONN);
\r
216 if((RasConn = malloc(Size)) != NULL)
\r
218 RasConn->dwSize = sizeof(RASCONN);
\r
219 Sts = (*m_RasEnumConnections)(RasConn, &Size, &Num);
\r
220 if((Sts == ERROR_BUFFER_TOO_SMALL) || (Sts == ERROR_NOT_ENOUGH_MEMORY))
\r
222 if((Tmp = realloc(RasConn, Size)) != NULL)
\r
225 Sts = (*m_RasEnumConnections)(RasConn, &Size, &Num);
\r
241 /*----- RasHangUp()------------------------------------------------------------
\r
244 * HRASCONN hRasConn : ハンドル
\r
251 *----------------------------------------------------------------------------*/
\r
253 static DWORD RasHangUpWait(HRASCONN hRasConn)
\r
255 RASCONNSTATUS RasSts;
\r
258 Sts = (*m_RasHangUp)(hRasConn);
\r
260 RasSts.dwSize = sizeof(RASCONNSTATUS);
\r
261 while((*m_RasGetConnectStatus)(hRasConn, &RasSts) != ERROR_INVALID_HANDLE)
\r
268 /*----- 現在のRASコネクションを切断する ---------------------------------------
\r
271 * RASCONN *RasConn : 接続一覧
\r
275 * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)
\r
276 *----------------------------------------------------------------------------*/
\r
278 static int DoDisconnect(RASCONN *RasConn, int Num)
\r
283 Sts = FFFTP_SUCCESS;
\r
286 SetTaskMsg(MSGJPN220);
\r
287 for(i = 0; i < Num; i++)
\r
289 if(RasHangUpWait(RasConn[i].hrasconn) != 0)
\r
297 /*----- RASを切断する ---------------------------------------------------------
\r
300 * int Notify : 確認するかどうか (YES/NO)
\r
304 *----------------------------------------------------------------------------*/
\r
306 void DisconnectRas(int Notify)
\r
313 if((Num = GetCurConnections(&RasConn)) != -1)
\r
317 if((Notify == NO) ||
\r
318 (DialogBox(GetFtpInst(), MAKEINTRESOURCE(rasnotify_dlg), GetMainHwnd(), ExeEscDialogProc) == YES))
\r
320 DoDisconnect(RasConn, Num);
\r
330 /*----- RASのエントリ一覧をコンボボックスにセットする -------------------------
\r
333 * HWND hDlg : ダイアログボックスのハンドル
\r
334 * int Item : コンボボックスのリソース番号
\r
335 * char *CurName : 初期値
\r
339 *----------------------------------------------------------------------------*/
\r
341 int SetRasEntryToComboBox(HWND hDlg, int Item, char *CurName)
\r
343 RASENTRYNAME *Entry;
\r
353 Size = sizeof(RASENTRYNAME);
\r
354 if((Entry = malloc(Size)) != NULL)
\r
356 Entry->dwSize = sizeof(RASENTRYNAME);
\r
357 Sts = (*m_RasEnumEntries)(NULL, NULL, Entry, &Size, &Num);
\r
358 if((Sts == ERROR_BUFFER_TOO_SMALL) || (Sts == ERROR_NOT_ENOUGH_MEMORY))
\r
360 if((Tmp = realloc(Entry, Size)) != NULL)
\r
363 Sts = (*m_RasEnumEntries)(NULL, NULL, Entry, &Size, &Num);
\r
367 if((Sts == 0) && (Num > 0))
\r
369 for(i = 0; i < Num; i++)
\r
370 SendDlgItemMessage(hDlg, Item, CB_ADDSTRING, 0, (LPARAM)Entry[i].szEntryName);
\r
372 SendDlgItemMessage(hDlg, Item, CB_SELECTSTRING, -1, (LPARAM)CurName);
\r
381 /*----- RASの接続を行う -------------------------------------------------------
\r
384 * int Dialup : ダイアルアップするかどうか (YES/NO)
\r
385 * int UseThis : 必ずこのエントリに接続するかどうか (YES/NO)
\r
386 * int Notify : 再接続前に確認するかどうか (YES/NO)
\r
390 * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)
\r
391 *----------------------------------------------------------------------------*/
\r
393 int ConnectRas(int Dialup, int UseThis, int Notify, char *Name)
\r
395 RASDIALDLG DlgParam;
\r
401 RASDIALPARAMS Param;
\r
403 OSVERSIONINFO VerInfo;
\r
405 Sts = FFFTP_SUCCESS;
\r
412 if((Num = GetCurConnections(&RasConn)) != -1)
\r
420 for(i = 0; i < Num; i++)
\r
422 if(_mbscmp(RasConn[i].szEntryName, Name) == 0)
\r
428 if((Notify == NO) ||
\r
429 (DialogBox(GetFtpInst(), MAKEINTRESOURCE(rasreconnect_dlg), GetMainHwnd(), ExeEscDialogProc) == YES))
\r
431 DoDisconnect(RasConn, Num);
\r
444 SetTaskMsg(MSGJPN221);
\r
448 VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
\r
449 if(GetVersionEx(&VerInfo) == TRUE)
\r
451 if(VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
\r
457 if(m_hDll2 != NULL)
\r
460 DlgParam.dwSize = sizeof(RASDIALDLG);
\r
461 DlgParam.hwndOwner = GetMainHwnd();
\r
462 DlgParam.dwFlags = 0;
\r
463 DlgParam.dwSubEntry = 0;
\r
464 DlgParam.reserved = 0;
\r
465 DlgParam.reserved2 = 0;
\r
466 if((*m_RasDialDlg)(NULL, Name, NULL, &DlgParam) != 0)
\r
467 Sts = FFFTP_SUCCESS;
\r
470 SetTaskMsg(MSGJPN222);
\r
474 /* Windows 95,98 */
\r
475 Param.dwSize = sizeof(RASDIALPARAMS);
\r
476 strcpy(Param.szEntryName, Name);
\r
478 Sts = (*m_RasGetEntryDialParams)(NULL, &Param, &Flg);
\r
479 strcpy(Param.szPhoneNumber, "");
\r
481 if(((strlen(Param.szUserName) != 0) && (strlen(Param.szPassword) != 0)) ||
\r
482 (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(dial_password_dlg), GetMainHwnd(), (DLGPROC)DialPassCallBackProc, (LPARAM)&Param) == YES))
\r
484 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(dial_dlg), GetMainHwnd(), (DLGPROC)DialCallBackProc, (LPARAM)&Param) == YES)
\r
485 Sts = FFFTP_SUCCESS;
\r
495 /*----- RASダイアルウインドウのコールバック -----------------------------------
\r
498 * HWND hDlg : ウインドウハンドル
\r
499 * UINT message : メッセージ番号
\r
500 * WPARAM wParam : メッセージの WPARAM 引数
\r
501 * LPARAM lParam : メッセージの LPARAM 引数
\r
505 *----------------------------------------------------------------------------*/
\r
507 static BOOL CALLBACK DialCallBackProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
509 static RASDIALPARAMS *Param;
\r
510 static HRASCONN hRasConn;
\r
511 char Tmp[RAS_NAME_LEN+25];
\r
516 case WM_INITDIALOG :
\r
517 Param = (RASDIALPARAMS *)lParam;
\r
520 sprintf(Tmp, MSGJPN223, Param->szEntryName);
\r
521 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)Tmp);
\r
522 Sts = (*m_RasDial)(NULL, NULL, Param, 0, &RasDialFunc, &hRasConn);
\r
524 EndDialog(hDlg, NO);
\r
528 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
531 RasHangUpWait(hRasConn);
\r
532 EndDialog(hDlg, NO);
\r
541 if((*m_RasGetErrorString)((UINT)lParam, (LPTSTR)Tmp, RAS_NAME_LEN+25) != 0)
\r
542 sprintf(Tmp, MSGJPN224);
\r
543 RasHangUpWait(hRasConn);
\r
544 MessageBox(hDlg, Tmp, MSGJPN225, MB_OK | MB_ICONSTOP);
\r
545 EndDialog(hDlg, NO);
\r
547 else if(wParam & RASCS_DONE)
\r
550 EndDialog(hDlg, YES);
\r
555 MakeRasConnMsg(Param->szPhoneNumber, wParam, Tmp);
\r
556 SendDlgItemMessage(hDlg, DIAL_STATUS, WM_SETTEXT, 0, (LPARAM)Tmp);
\r
564 /*----- RasDial()のコールバック -----------------------------------------------
\r
567 * UINT unMsg : メッセージ
\r
568 * RASCONNSTATE rasconnstate : ステータス
\r
569 * DWORD dwError : エラー
\r
573 *----------------------------------------------------------------------------*/
\r
575 static VOID WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
\r
577 PostMessage(hWndDial, WM_DIAL_MSG, (WPARAM)rasconnstate, (LPARAM)dwError );
\r
581 /*----- RasDial()のステータスメッセージを作成する -----------------------------
\r
584 * char *Phone : 電話番号
\r
585 * RASCONNSTATE rasconn : ステータス
\r
586 * char *Buf : 文字列をセットするバッファ
\r
590 *----------------------------------------------------------------------------*/
\r
592 static void MakeRasConnMsg(char *Phone, RASCONNSTATE rasconn, char *Buf)
\r
596 case RASCS_OpenPort:
\r
597 strcpy(Buf, MSGJPN226);
\r
599 case RASCS_PortOpened:
\r
600 strcpy(Buf, MSGJPN227);
\r
602 case RASCS_ConnectDevice:
\r
603 sprintf(Buf, MSGJPN228);
\r
605 case RASCS_DeviceConnected:
\r
606 strcpy(Buf, MSGJPN229);
\r
608 case RASCS_AllDevicesConnected:
\r
609 strcpy(Buf, MSGJPN230);
\r
611 case RASCS_Authenticate:
\r
612 case RASCS_AuthNotify:
\r
613 strcpy(Buf, MSGJPN231);
\r
615 case RASCS_AuthRetry:
\r
616 case RASCS_ReAuthenticate:
\r
617 strcpy(Buf, MSGJPN232);
\r
619 case RASCS_AuthChangePassword:
\r
620 strcpy(Buf, MSGJPN233);
\r
622 case RASCS_Authenticated:
\r
623 strcpy(Buf, MSGJPN234);
\r
625 case RASCS_Connected:
\r
626 strcpy(Buf, MSGJPN235);
\r
628 case RASCS_Disconnected:
\r
629 strcpy(Buf, MSGJPN236);
\r
631 case RASCS_AuthCallback:
\r
632 case RASCS_PrepareForCallback:
\r
633 case RASCS_WaitForModemReset:
\r
634 case RASCS_WaitForCallback:
\r
635 case RASCS_Interactive:
\r
636 case RASCS_RetryAuthentication:
\r
637 case RASCS_CallbackSetByCaller:
\r
638 case RASCS_PasswordExpired:
\r
639 case RASCS_AuthProject:
\r
640 case RASCS_AuthLinkSpeed:
\r
641 case RASCS_AuthAck:
\r
643 strcpy(Buf, MSGJPN237);
\r
650 /*----- ユーザ名、パスワード入力ウインドウのコールバック ----------------------
\r
653 * HWND hDlg : ウインドウハンドル
\r
654 * UINT message : メッセージ番号
\r
655 * WPARAM wParam : メッセージの WPARAM 引数
\r
656 * LPARAM lParam : メッセージの LPARAM 引数
\r
660 *----------------------------------------------------------------------------*/
\r
662 static BOOL CALLBACK DialPassCallBackProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
664 static RASDIALPARAMS *Param;
\r
665 char Tmp[RAS_NAME_LEN+25];
\r
669 case WM_INITDIALOG :
\r
670 Param = (RASDIALPARAMS *)lParam;
\r
671 sprintf(Tmp, MSGJPN238, Param->szEntryName);
\r
672 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)Tmp);
\r
673 SendDlgItemMessage(hDlg, RASPASS_USER, EM_LIMITTEXT, UNLEN, 0);
\r
674 SendDlgItemMessage(hDlg, RASPASS_PASS, EM_LIMITTEXT, PWLEN, 0);
\r
675 SendDlgItemMessage(hDlg, RASPASS_USER, WM_SETTEXT, 0, (LPARAM)Param->szUserName);
\r
676 SendDlgItemMessage(hDlg, RASPASS_PASS, WM_SETTEXT, 0, (LPARAM)Param->szPassword);
\r
680 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
683 SendDlgItemMessage(hDlg, RASPASS_USER, WM_GETTEXT, UNLEN+1, (LPARAM)Param->szUserName);
\r
684 SendDlgItemMessage(hDlg, RASPASS_PASS, WM_GETTEXT, PWLEN+1, (LPARAM)Param->szPassword);
\r
685 EndDialog(hDlg, YES);
\r
689 EndDialog(hDlg, NO);
\r