1 // SoftEther UT-VPN SourceCode
\r
3 // Copyright (C) 2004-2010 SoftEther Corporation.
\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.
\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.
\r
6 // All Rights Reserved.
\r
8 // http://utvpn.tsukuba.ac.jp/
\r
10 // This program is free software; you can redistribute it and/or
\r
11 // modify it under the terms of the GNU General Public License
\r
12 // version 2 as published by the Free Software Foundation.
\r
14 // This program is distributed in the hope that it will be useful,
\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
17 // GNU General Public License for more details.
\r
19 // You should have received a copy of the GNU General Public License version 2
\r
20 // along with this program; if not, write to the Free Software
\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
\r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。
\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の
\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
\r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の
\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )
\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって
\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
\r
34 // および、試験または研究のために利用が行われることを想定して配布
\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
\r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
\r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。
\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
\r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の
\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
\r
58 // 公益保護にご協力いただきますようお願い申し上げます。
\r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
\r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
\r
65 // 日本国内の脆弱性情報届出受付公的機関:
\r
67 // http://www.ipa.go.jp/security/vuln/report/
\r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/
\r
72 // -----------------------------------------------
\r
75 // 新規リリース by SoftEther
\r
76 // -----------------------------------------------
\r
79 // Win32 用 SoftEther UT-VPN クライアント接続マネージャ
\r
88 #define _WIN32_WINNT 0x0502
\r
89 #define WINVER 0x0502
\r
90 #include <winsock2.h>
\r
91 #include <windows.h>
\r
92 #include <Iphlpapi.h>
\r
93 #include <tlhelp32.h>
\r
95 #include <commctrl.h>
\r
96 #include <Dbghelp.h>
\r
97 #include <setupapi.h>
\r
99 #include <process.h>
\r
101 #include <wtsapi32.h>
\r
103 #include <stdlib.h>
\r
104 #include <string.h>
\r
106 #include <stdarg.h>
\r
109 #include <Mayaqua/Mayaqua.h>
\r
110 #include <Cedar/Cedar.h>
\r
111 #include "CMInner.h"
\r
112 #include "SMInner.h"
\r
113 #include "NMInner.h"
\r
114 #include "../PenCore/resource.h"
\r
116 // IE のレジストリ文字列からプロキシサーバーの設定を取得する
\r
117 bool CmGetProxyServerNameAndPortFromIeProxyRegStr(char *name, UINT name_size, UINT *port, char *str, char *server_type)
\r
123 if (name == NULL || port == NULL || str == NULL || server_type == NULL)
\r
128 t = ParseToken(str, ";");
\r
130 for (i = 0;i < t->NumTokens;i++)
\r
132 char *s = t->Token[i];
\r
137 i = SearchStrEx(s, "=", 0, false);
\r
140 char tmp[MAX_PATH];
\r
142 StrCpy(name, name_size, s);
\r
145 if (StrCmpi(name, server_type) == 0)
\r
148 StrCpy(tmp, sizeof(tmp), s + i + 1);
\r
150 if (ParseHostPort(tmp, &host, port, 0))
\r
152 StrCpy(name, name_size, host);
\r
171 // 接続設定にプロキシ設定の内容を反映する
\r
172 void CmProxyDlgSet(HWND hWnd, CLIENT_OPTION *o, CM_INTERNET_SETTING *setting)
\r
175 if(hWnd == NULL || setting == NULL)
\r
181 Check(hWnd, R_DIRECT_TCP, setting->ProxyType == PROXY_DIRECT);
\r
182 Check(hWnd, R_HTTPS, setting->ProxyType == PROXY_HTTP);
\r
183 Check(hWnd, R_SOCKS, setting->ProxyType == PROXY_SOCKS);
\r
186 if(setting->ProxyType != PROXY_DIRECT)
\r
188 StrCpy(o->ProxyName, sizeof(setting->ProxyHostName), setting->ProxyHostName);
\r
189 o->ProxyPort = setting->ProxyPort;
\r
194 void CmGetSystemInternetSetting(CM_INTERNET_SETTING *setting)
\r
198 if (setting == NULL)
\r
203 Zero(setting, sizeof(CM_INTERNET_SETTING));
\r
205 use_proxy = MsRegReadInt(REG_CURRENT_USER,
\r
206 "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
\r
211 char *str = MsRegReadStr(REG_CURRENT_USER,
\r
212 "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
\r
216 char name[MAX_HOST_NAME_LEN + 1];
\r
219 if (CmGetProxyServerNameAndPortFromIeProxyRegStr(name, sizeof(name),
\r
220 &port, str, "https"))
\r
222 setting->ProxyType = PROXY_HTTP;
\r
223 StrCpy(setting->ProxyHostName, sizeof(setting->ProxyHostName), name);
\r
224 setting->ProxyPort = port;
\r
226 else if (CmGetProxyServerNameAndPortFromIeProxyRegStr(name, sizeof(name),
\r
227 &port, str, "http"))
\r
229 setting->ProxyType = PROXY_HTTP;
\r
230 StrCpy(setting->ProxyHostName, sizeof(setting->ProxyHostName), name);
\r
231 setting->ProxyPort = port;
\r
233 else if (CmGetProxyServerNameAndPortFromIeProxyRegStr(name, sizeof(name),
\r
234 &port, str, "socks"))
\r
236 setting->ProxyType = PROXY_SOCKS;
\r
237 StrCpy(setting->ProxyHostName, sizeof(setting->ProxyHostName), name);
\r
238 setting->ProxyPort = port;
\r
242 if (SearchStrEx(str, "=", 0, false) == INFINITE)
\r
246 if (ParseHostPort(str, &host, &port, 0))
\r
250 setting->ProxyType = PROXY_HTTP;
\r
251 StrCpy(setting->ProxyHostName, sizeof(setting->ProxyHostName), host);
\r
252 setting->ProxyPort = port;
\r
264 // 経由するプロキシ設定で、IE の設定を使用する
\r
265 void CmProxyDlgUseForIE(HWND hWnd, CLIENT_OPTION *o)
\r
267 CM_INTERNET_SETTING s;
\r
275 Zero(&s, sizeof(s));
\r
276 CmGetSystemInternetSetting(&s);
\r
278 CmProxyDlgSet(hWnd, o, &s);
\r
281 // スマートカード認証画面のビットマップ ID を決定する
\r
282 UINT CmGetSecureBitmapId(char *dest_hostname)
\r
285 if (dest_hostname == NULL)
\r
293 // UAC のウインドウをアクティブにする
\r
294 void CmSetUacWindowActive()
\r
298 if (MsIsVista() == false)
\r
303 hWnd = FindWindowA("$$$Secure UAP Dummy Window Class For Interim Dialog", NULL);
\r
309 SwitchToThisWindow(hWnd, true);
\r
313 void CmUacHelperThread(THREAD *thread, void *param)
\r
315 CM_UAC_HELPER *c = (CM_UAC_HELPER *)param;
\r
322 while (c->Halt == false)
\r
324 CmSetUacWindowActive();
\r
326 Wait(c->HaltEvent, 200);
\r
331 void *CmStartUacHelper()
\r
333 CM_UAC_HELPER *c = ZeroMalloc(sizeof(CM_UAC_HELPER));
\r
335 c->HaltEvent = NewEvent();
\r
336 c->Thread = NewThread(CmUacHelperThread, c);
\r
342 void CmStopUacHelper(void *p)
\r
344 CM_UAC_HELPER *c = (CM_UAC_HELPER *)p;
\r
353 WaitThread(c->Thread, INFINITE);
\r
354 ReleaseEvent(c->HaltEvent);
\r
355 ReleaseThread(c->Thread);
\r
360 // 簡易接続マネージャのコマンド呼び出し
\r
361 void CmEasyDlgOnCommand(HWND hWnd, CM_EASY_DLG *d, WPARAM wParam, LPARAM lParam)
\r
364 if (hWnd == NULL || d == NULL)
\r
372 Command(hWnd, CMD_CM_SETTING);
\r
376 Command(hWnd, CMD_STATUS);
\r
384 if (wParam == CMD_CONNECT)
\r
386 cm->ConnectStartedFlag = false;
\r
389 CmMainWindowOnCommandEx(hWnd, wParam, lParam, true);
\r
391 if (wParam == CMD_CONNECT && cm->ConnectStartedFlag)
\r
393 // 接続を開始することに成功したらウインドウを閉じる
\r
398 // 簡易接続マネージャのキーボード押下
\r
399 void CmEasyDlgOnKey(HWND hWnd, CM_EASY_DLG *d, bool ctrl, bool alt, UINT key)
\r
411 Command(hWnd, IDOK);
\r
415 if (IsFocus(hWnd, L_ACCOUNT))
\r
418 Command(hWnd, CMD_DELETE);
\r
422 // 仮想 LAN カードリストに関する操作
\r
423 Command(hWnd, CMD_DELETE_VLAN);
\r
428 Command(hWnd, CMD_RENAME);
\r
432 Command(hWnd, CMD_REFRESH);
\r
442 Command(hWnd, CMD_QUIT);
\r
453 Command(hWnd, CMD_SECURE_MANAGER);
\r
457 Command(hWnd, CMD_STATUS);
\r
461 Command(hWnd, CMD_DISCONNECT_ALL);
\r
465 Command(hWnd, CMD_DISCONNECT);
\r
469 Command(hWnd, CMD_NEW);
\r
473 Command(hWnd, CMD_CLONE);
\r
477 Command(hWnd, CMD_STARTUP);
\r
481 Command(hWnd, CMD_SELECT_ALL);
\r
485 Command(hWnd, CMD_NEW_VLAN);
\r
489 Command(hWnd, CMD_PASSWORD);
\r
493 Command(hWnd, CMD_TRAFFIC);
\r
497 Command(hWnd, CMD_TRUST);
\r
501 Command(hWnd, CMD_TRAFFIC);
\r
507 // 簡易接続マネージャのリストビューに対する操作
\r
508 void CmEasyDlgOnNotify(HWND hWnd, CM_EASY_DLG *d, NMHDR *n)
\r
510 NMLVDISPINFOW *disp_info;
\r
514 if (hWnd == NULL || n == NULL)
\r
524 case LVN_ITEMCHANGED:
\r
525 CmEasyDlgUpdate(hWnd, d);
\r
529 Command(hWnd, CMD_EASY_DBLCLICK);
\r
533 CmAccountListRightClick(hWnd);
\r
535 case LVN_ENDLABELEDITW:
\r
537 disp_info = (NMLVDISPINFOW *)n;
\r
538 if (disp_info->item.pszText != NULL)
\r
540 wchar_t *new_name = disp_info->item.pszText;
\r
541 wchar_t *old_name = LvGetStr(hWnd, L_ACCOUNT, disp_info->item.iItem, 0);
\r
543 if (old_name != NULL)
\r
545 if (UniStrCmp(new_name, old_name) != 0 && UniIsEmptyStr(new_name) == false)
\r
547 RPC_RENAME_ACCOUNT a;
\r
548 Zero(&a, sizeof(a));
\r
549 UniStrCpy(a.OldName, sizeof(a.OldName), old_name);
\r
550 UniStrCpy(a.NewName, sizeof(a.NewName), new_name);
\r
551 if (CALL(hWnd, CcRenameAccount(cm->Client, &a)))
\r
553 LvSetItem(hWnd, L_ACCOUNT, disp_info->item.iItem, 0, new_name);
\r
563 key = (NMLVKEYDOWN *)n;
\r
567 UINT code = key->wVKey;
\r
568 ctrl = (GetKeyState(VK_CONTROL) & 0x8000) == 0 ? false : true;
\r
569 alt = (GetKeyState(VK_MENU) & 0x8000) == 0 ? false : true;
\r
570 CmEasyDlgOnKey(hWnd, d, ctrl, alt, code);
\r
578 // 簡易接続マネージャに対して更新通知を送信する
\r
579 void CmRefreshEasy()
\r
581 if (cm->hEasyWnd == NULL)
\r
586 SendMessage(cm->hEasyWnd, WM_CM_EASY_REFRESH, 0, 0);
\r
590 void CmEasyDlgInit(HWND hWnd, CM_EASY_DLG *d)
\r
592 HFONT hFontForList;
\r
597 UINT i, num, num2, j;
\r
599 char *font_name = NULL;
\r
600 bool font_bold = true;
\r
602 if (hWnd == NULL || d == NULL)
\r
607 SetIcon(hWnd, 0, ICO_VPN);
\r
610 cm->hEasyWnd = hWnd;
\r
616 CmInitAccountListEx(hWnd, true);
\r
619 if (cm->VistaStyle)
\r
621 if (_GETLANG() == 0)
\r
623 font_name = "Meiryo";
\r
626 else if (_GETLANG() == 2)
\r
628 font_name = "Microsoft YaHei";
\r
633 hFontForList = GetFont(font_name, 14, font_bold, false, false, false);
\r
634 hFontButton = GetFont(font_name, 13, font_bold, false, false, false);
\r
635 hFontTitle = GetFont(font_name, 14, font_bold, false, false, false);
\r
636 hFontInfo = GetFont(font_name, 11, font_bold, false, false, false);
\r
637 hFontOther = GetDialogDefaultFont();
\r
639 if (cm->VistaStyle)
\r
641 hFontOther = GetMeiryoFont();
\r
644 SetFont(hWnd, L_ACCOUNT, hFontForList);
\r
645 SetFont(hWnd, IDOK, hFontButton);
\r
646 SetFont(hWnd, S_TITLE, hFontTitle);
\r
647 SetFont(hWnd, S_INFO, hFontInfo);
\r
648 SetFont(hWnd, B_MODE, hFontOther);
\r
649 SetFont(hWnd, IDCANCEL, hFontOther);
\r
651 CmEasyDlgRefresh(hWnd, d);
\r
653 num = LvNum(hWnd, L_ACCOUNT);
\r
656 for (i = 0;i < num;i++)
\r
658 wchar_t *str = LvGetStr(hWnd, L_ACCOUNT, i, 1);
\r
662 if (UniStrCmpi(str, _UU("CM_ACCOUNT_ONLINE")) == 0 || UniStrCmpi(str, _UU("CM_ACCOUNT_CONNECTING")) == 0)
\r
673 LvSelect(hWnd, L_ACCOUNT, j);
\r
679 if (UniIsEmptyStr(cm->EasyLastSelectedAccountName) == false)
\r
681 i = LvSearchStr(hWnd, L_ACCOUNT, 0, cm->EasyLastSelectedAccountName);
\r
684 LvSelect(hWnd, L_ACCOUNT, i);
\r
692 if (LvNum(hWnd, L_ACCOUNT) != 0)
\r
694 LvSelect(hWnd, L_ACCOUNT, 0);
\r
698 Focus(hWnd, L_ACCOUNT);
\r
700 CmEasyDlgUpdate(hWnd, d);
\r
703 // 簡易接続マネージャコントロール更新
\r
704 void CmEasyDlgUpdate(HWND hWnd, CM_EASY_DLG *d)
\r
707 bool show_status = false;
\r
708 wchar_t *button_str = _UU("CM_EASY_CONNECT_BUTTON_1");
\r
709 wchar_t *info_str = _UU("CM_EASY_INFO_1");
\r
710 wchar_t *title_str = _UU("CM_EASY_TITLE");
\r
712 if (hWnd == NULL || d == NULL)
\r
717 if (LvIsSingleSelected(hWnd, L_ACCOUNT) == false)
\r
724 UINT i = LvGetSelected(hWnd, L_ACCOUNT);
\r
725 wchar_t *str = LvGetStr(hWnd, L_ACCOUNT, i, 1);
\r
727 info_str = _UU("CM_EASY_INFO_2");
\r
731 if (UniStrCmpi(str, _UU("CM_ACCOUNT_ONLINE")) == 0 || UniStrCmpi(str, _UU("CM_ACCOUNT_CONNECTING")) == 0)
\r
733 button_str = _UU("CM_EASY_CONNECT_BUTTON_2");
\r
734 show_status = true;
\r
735 info_str = _UU("CM_EASY_INFO_3");
\r
737 if (UniStrCmpi(str, _UU("CM_ACCOUNT_ONLINE")) == 0)
\r
739 title_str = _UU("CM_EASY_CONNECTED");
\r
743 title_str = _UU("CM_EASY_CONNECTING");
\r
750 SetShow(hWnd, B_STATUS, show_status);
\r
752 SetText(hWnd, IDOK, button_str);
\r
753 SetText(hWnd, S_INFO, info_str);
\r
754 SetText(hWnd, S_TITLE, title_str);
\r
756 SetShow(hWnd, IDOK, ok);
\r
760 void CmEasyDlgRefresh(HWND hWnd, CM_EASY_DLG *d)
\r
763 if (hWnd == NULL || d == NULL)
\r
769 CmRefreshAccountListEx(hWnd, true);
\r
771 CmEasyDlgUpdate(hWnd, d);
\r
774 // 簡易接続マネージャのダイアログプロシージャ
\r
775 UINT CmEasyDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
777 CM_EASY_DLG *d = (CM_EASY_DLG *)param;
\r
788 case WM_INITDIALOG:
\r
789 CmEasyDlgInit(hWnd, d);
\r
790 SetTimer(hWnd, 1, 10, NULL);
\r
797 KillTimer(hWnd, 1);
\r
798 SetForegroundWindow(hWnd);
\r
799 SetActiveWindow(hWnd);
\r
804 case WM_CM_EASY_REFRESH:
\r
805 CmEasyDlgRefresh(hWnd, d);
\r
809 CmEasyDlgOnCommand(hWnd, d, wParam, lParam);
\r
813 n = (NMHDR *)lParam;
\r
814 CmEasyDlgOnNotify(hWnd, d, n);
\r
818 i = LvGetSelected(hWnd, L_ACCOUNT);
\r
821 wchar_t *s = LvGetStr(hWnd, L_ACCOUNT, i, 0);
\r
824 UniStrCpy(cm->EasyLastSelectedAccountName, sizeof(cm->EasyLastSelectedAccountName),
\r
831 Zero(cm->EasyLastSelectedAccountName, sizeof(cm->EasyLastSelectedAccountName));
\r
833 EndDialog(hWnd, false);
\r
840 // 簡易接続マネージャのウインドウを表示する (遅延タイマで呼び出される)
\r
841 void CmMainWindowOnShowEasy(HWND hWnd)
\r
845 Zero(&d, sizeof(d));
\r
847 if (cm->CmSetting.EasyMode == false)
\r
853 if (cm->hEasyWnd != NULL)
\r
856 SetForegroundWindow(cm->hEasyWnd);
\r
857 SetActiveWindow(cm->hEasyWnd);
\r
861 Dialog(NULL, D_CM_EASY, CmEasyDlg, &d);
\r
863 cm->hEasyWnd = NULL;
\r
866 // 簡易接続マネージャのウインドウを表示する
\r
869 SetTimer(cm->hMainWnd, 4, 2, NULL);
\r
872 // 簡易接続マネージャのウインドウを閉じる
\r
875 if (cm->hEasyWnd == NULL)
\r
880 SendMessage(cm->hEasyWnd, WM_CLOSE, 0, 0);
\r
883 // トレイアイコンのクリック等のメッセージ処理
\r
884 void CmMainWindowOnTrayClicked(HWND hWnd, WPARAM wParam, LPARAM lParam)
\r
886 bool easymode = cm->CmSetting.EasyMode;
\r
893 case WM_LBUTTONDOWN:
\r
894 case WM_RBUTTONDOWN:
\r
896 if (easymode == false)
\r
898 if (IsEnable(hWnd, 0))
\r
900 CmShowTrayMenu(hWnd);
\r
904 CmShowOrHideWindow(hWnd);
\r
909 if (cm->hEasyWnd == NULL || IsEnable(cm->hEasyWnd, 0))
\r
911 CmShowTrayMenu(hWnd);
\r
915 //CmShowOrHideWindow(hWnd);
\r
919 case WM_LBUTTONDBLCLK:
\r
920 case WM_RBUTTONDBLCLK:
\r
922 if (easymode == false)
\r
924 if (IsEnable(hWnd, 0))
\r
926 CmShowOrHideWindow(hWnd);
\r
931 if (cm->hEasyWnd == NULL)
\r
937 SetForegroundWindow(cm->hEasyWnd);
\r
938 SetActiveWindow(cm->hEasyWnd);
\r
948 void CmApplyCmSetting()
\r
951 bool changed = false;
\r
953 if (cm->CmSettingSupported == false)
\r
958 // 現在の vpnclient の設定を取得する
\r
959 Zero(&a, sizeof(a));
\r
960 CcGetCmSetting(cm->Client, &a);
\r
962 // 以前の CM_SETTING と比較して変化点があるか調べる
\r
963 if (cm->CmSetting.EasyMode != a.EasyMode)
\r
967 if (cm->CmSetting.LockMode != a.LockMode)
\r
972 Copy(&cm->CmSetting, &a, sizeof(CM_SETTING));
\r
974 if (changed == false)
\r
979 if (cm->StartupFinished)
\r
981 if (IsShow(cm->hMainWnd, 0) && cm->CmSetting.EasyMode)
\r
983 // メインウインドウが表示されていれば閉じる
\r
984 Hide(cm->hMainWnd, 0);
\r
988 if (cm->CmSetting.EasyMode == false && IsShow(cm->hMainWnd, 0) == false)
\r
990 // 通常モードに復帰した際は、メインウインドウを復元する
\r
991 if (IsZero(&cm->FakeWindowPlacement, sizeof(cm->FakeWindowPlacement)) == false)
\r
993 cm->FakeWindowPlacement.flags = cm->FakeWindowPlacement.flags & ~SW_MINIMIZE;
\r
994 SetWindowPlacement(cm->hMainWnd, &cm->FakeWindowPlacement);
\r
995 Zero(&cm->FakeWindowPlacement, sizeof(cm->FakeWindowPlacement));
\r
996 Hide(cm->hMainWnd, 0);
\r
998 CmShowOrHideWindow(cm->hMainWnd);
\r
1002 Command(cm->hMainWnd, CMD_REFRESH);
\r
1005 if (cm->CmSetting.EasyMode)
\r
1007 if (cm->StartupFinished == false && cm->StartupMode)
\r
1009 // /startup の場合は表示しない
\r
1022 // 動作モード変更ダイアログ初期化
\r
1023 void CmSettingDlgInit(HWND hWnd, CM_SETTING_DLG *d)
\r
1027 if (hWnd == NULL || d == NULL)
\r
1032 // 現在の vpnclient の設定を取得する
\r
1033 Zero(&a, sizeof(a));
\r
1034 CcGetCmSetting(cm->Client, &a);
\r
1036 Check(hWnd, R_EASY, a.EasyMode);
\r
1037 Check(hWnd, R_NORMAL, a.EasyMode == false);
\r
1039 if (a.EasyMode == false)
\r
1041 Focus(hWnd, R_NORMAL);
\r
1045 Focus(hWnd, R_EASY);
\r
1048 Check(hWnd, R_LOCK, a.LockMode);
\r
1050 SetEnable(hWnd, R_EASY, cm->CmEasyModeSupported);
\r
1054 if (IsZero(a.HashedPassword, sizeof(a.HashedPassword)) == false)
\r
1057 SetText(hWnd, S_PASSWORD1, _UU("CM_SETTING_PASSWORD"));
\r
1058 Hide(hWnd, S_PASSWORD3);
\r
1059 Hide(hWnd, E_PASSWORD2);
\r
1061 d->CheckPassword = true;
\r
1062 Copy(d->HashedPassword, a.HashedPassword, sizeof(d->HashedPassword));
\r
1066 CmSettingDlgUpdate(hWnd, d);
\r
1070 void CmSettingDlgUpdate(HWND hWnd, CM_SETTING_DLG *d)
\r
1073 char tmp1[MAX_SIZE], tmp2[MAX_SIZE];
\r
1075 if (hWnd == NULL || d == NULL)
\r
1080 GetTxtA(hWnd, E_PASSWORD1, tmp1, sizeof(tmp1));
\r
1081 GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));
\r
1083 if (d->CheckPassword == false)
\r
1085 if (IsChecked(hWnd, R_LOCK))
\r
1087 if (StrCmp(tmp1, tmp2) != 0)
\r
1095 bool password_ok = false;
\r
1096 UCHAR hash[SHA1_SIZE];
\r
1098 Hash(hash, tmp1, StrLen(tmp1), true);
\r
1099 if (Cmp(hash, d->HashedPassword, sizeof(hash)) == 0)
\r
1101 password_ok = true;
\r
1104 if (password_ok == false)
\r
1106 Check(hWnd, R_LOCK, true);
\r
1107 Disable(hWnd, R_LOCK);
\r
1111 Enable(hWnd, R_LOCK);
\r
1115 SetEnable(hWnd, S_PASSWORD1, IsChecked(hWnd, R_LOCK));
\r
1116 SetEnable(hWnd, S_PASSWORD2, IsChecked(hWnd, R_LOCK));
\r
1117 SetEnable(hWnd, S_PASSWORD3, IsChecked(hWnd, R_LOCK));
\r
1118 SetEnable(hWnd, E_PASSWORD1, IsChecked(hWnd, R_LOCK));
\r
1119 SetEnable(hWnd, E_PASSWORD2, IsChecked(hWnd, R_LOCK));
\r
1121 SetEnable(hWnd, IDOK, ok);
\r
1124 // 動作モード変更ダイアログ OK
\r
1125 void CmSettingDlgOnOk(HWND hWnd, CM_SETTING_DLG *d)
\r
1128 char tmp1[MAX_SIZE], tmp2[MAX_SIZE];
\r
1130 if (hWnd == NULL || d == NULL)
\r
1135 GetTxtA(hWnd, E_PASSWORD1, tmp1, sizeof(tmp1));
\r
1136 GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));
\r
1138 Zero(&a, sizeof(a));
\r
1140 a.EasyMode = IsChecked(hWnd, R_EASY);
\r
1141 a.LockMode = IsChecked(hWnd, R_LOCK);
\r
1145 if (d->CheckPassword && IsEnable(hWnd, R_LOCK) == false)
\r
1147 Copy(a.HashedPassword, d->HashedPassword, sizeof(a.HashedPassword));
\r
1151 if (StrLen(tmp1) >= 1)
\r
1153 Hash(a.HashedPassword, tmp1, StrLen(tmp1), true);
\r
1158 CcSetCmSetting(cm->Client, &a);
\r
1160 EndDialog(hWnd, true);
\r
1164 UINT CmSettingDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1166 CM_SETTING_DLG *d = (CM_SETTING_DLG *)param;
\r
1175 case WM_INITDIALOG:
\r
1176 CmSettingDlgInit(hWnd, d);
\r
1180 switch (LOWORD(wParam))
\r
1189 CmSettingDlgUpdate(hWnd, d);
\r
1195 CmSettingDlgOnOk(hWnd, d);
\r
1203 if (IsChecked(hWnd, R_LOCK))
\r
1205 if (IsEmpty(hWnd, E_PASSWORD1))
\r
1207 Focus(hWnd, E_PASSWORD1);
\r
1215 EndDialog(hWnd, false);
\r
1223 bool CmSetting(HWND hWnd)
\r
1227 Zero(&d, sizeof(d));
\r
1229 return Dialog(hWnd, D_CM_SETTING, CmSettingDlg, &d);
\r
1232 // UI Helper の起動の試行スレッド
\r
1233 void CmTryToExecUiHelperThread(THREAD *thread, void *param)
\r
1235 // このあたりは急いで実装したのでコードがあまり美しくない。
\r
1236 bool first_flag = true;
\r
1238 while (cm->TryExecUiHelperHalt == false && cm->WindowsShutdowning == false)
\r
1240 if (first_flag == false)
\r
1243 Wait(cm->TryExecUiHelperHaltEvent, CM_TRY_EXEC_UI_HELPER_INTERVAL * 2);
\r
1245 if (cm->TryExecUiHelperHalt || cm->WindowsShutdowning)
\r
1250 first_flag = false;
\r
1252 if (cm->TryExecUiHelperHalt == false && cm->WindowsShutdowning == false)
\r
1254 if (cm->TryExecUiHelperProcessHandle == NULL)
\r
1256 CmTryToExecUiHelper();
\r
1260 if (cm->TryExecUiHelperHalt || cm->WindowsShutdowning)
\r
1265 if (cm->TryExecUiHelperProcessHandle == NULL)
\r
1267 Wait(cm->TryExecUiHelperHaltEvent, CM_TRY_EXEC_UI_HELPER_INTERVAL);
\r
1271 HANDLE handles[2];
\r
1272 handles[0] = cm->TryExecUiHelperProcessHandle;
\r
1273 handles[1] = (HANDLE)cm->TryExecUiHelperHaltEvent->pData;
\r
1274 WaitForMultipleObjects(2, handles, false, CM_TRY_EXEC_UI_HELPER_INTERVAL);
\r
1276 if (WaitForSingleObject(cm->TryExecUiHelperProcessHandle, 0) != WAIT_TIMEOUT)
\r
1278 CloseHandle(cm->TryExecUiHelperProcessHandle);
\r
1279 cm->TryExecUiHelperProcessHandle = NULL;
\r
1280 if (cm->TryExecUiHelperHalt || cm->WindowsShutdowning)
\r
1284 Wait(cm->TryExecUiHelperHaltEvent, CM_TRY_EXEC_UI_HELPER_INTERVAL * 2);
\r
1291 void CmFreeTryToExecUiHelper()
\r
1293 cm->TryExecUiHelperHalt = true;
\r
1294 Set(cm->TryExecUiHelperHaltEvent);
\r
1296 WaitThread(cm->TryExecUiHelperThread, INFINITE);
\r
1298 ReleaseThread(cm->TryExecUiHelperThread);
\r
1299 cm->TryExecUiHelperThread = NULL;
\r
1301 ReleaseEvent(cm->TryExecUiHelperHaltEvent);
\r
1302 cm->TryExecUiHelperHaltEvent = NULL;
\r
1304 cm->TryExecUiHelperHalt = false;
\r
1305 cm->TryExecUiHelperProcessHandle = NULL;
\r
1308 // UI Helper 起動初期化
\r
1309 void CmInitTryToExecUiHelper()
\r
1311 cm->TryExecUiHelperProcessHandle = NULL;
\r
1312 cm->TryExecUiHelperHalt = false;
\r
1313 cm->TryExecUiHelperHaltEvent = NewEvent();
\r
1314 cm->TryExecUiHelperThread = NewThread(CmTryToExecUiHelperThread, NULL);
\r
1318 void *CmExecUiHelperMain()
\r
1321 wchar_t tmp[MAX_SIZE];
\r
1323 UniFormat(tmp, sizeof(tmp), L"%s\\%S", MsGetExeDirNameW(), CiGetVpnClientExeFileName());
\r
1326 h = Win32RunExW(tmp, SVC_ARG_UIHELP_W, false);
\r
1331 // UI Helper の起動の試行
\r
1332 void CmTryToExecUiHelper()
\r
1335 // 既に起動していないかどうかチェックする
\r
1336 if (CnCheckAlreadyExists(false))
\r
1342 h = (HANDLE)CmExecUiHelperMain();
\r
1346 cm->TryExecUiHelperProcessHandle = h;
\r
1351 void CmTrafficResultDlgInit(HWND hWnd, TT_RESULT *res)
\r
1354 wchar_t tmp[MAX_SIZE];
\r
1355 wchar_t tmp1[MAX_SIZE];
\r
1356 wchar_t tmp2[MAX_SIZE];
\r
1357 char str[MAX_SIZE];
\r
1359 if (hWnd == NULL || res == NULL)
\r
1364 SetIcon(hWnd, 0, ICO_SWITCH);
\r
1366 SetFont(hWnd, L_STATUS, GetFont(_SS("DEFAULT_FONT_2"), 10, false, false, false, false));
\r
1368 LvInit(hWnd, L_STATUS);
\r
1369 LvSetStyle(hWnd, L_STATUS, LVS_EX_GRIDLINES);
\r
1370 LvInsertColumn(hWnd, L_STATUS, 0, _UU("TTC_RES_COLUMN_1"), 100);
\r
1371 LvInsertColumn(hWnd, L_STATUS, 1, _UU("TTC_RES_COLUMN_2"), 100);
\r
1372 LvInsertColumn(hWnd, L_STATUS, 2, _UU("TTC_RES_COLUMN_3"), 100);
\r
1374 ct = LvInsertStart();
\r
1377 GetSpanStrMilli(str, sizeof(str), res->Span);
\r
1378 StrToUni(tmp, sizeof(tmp), str);
\r
1379 LvInsertAdd(ct, ICO_DATETIME, NULL, 3, _UU("TTC_RES_SPAN"), tmp, L"");
\r
1381 // Ethernet フレーム用にデータ補正
\r
1382 LvInsertAdd(ct, ICO_INFORMATION, NULL, 3, _UU("TTC_RES_ETHER"), res->Raw ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
\r
1384 // ダウンロード方向の通信データ量
\r
1385 ToStr3(str, sizeof(str), res->NumBytesDownload);
\r
1386 UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
\r
1387 ToStrByte1000(str, sizeof(str), res->NumBytesDownload);
\r
1388 StrToUni(tmp2, sizeof(tmp2), str);
\r
1389 LvInsertAdd(ct, ICO_INFORMATION, NULL, 3, _UU("TTC_RES_BYTES_DOWNLOAD"), tmp1, tmp2);
\r
1391 // アップロード方向の通信データ量
\r
1392 ToStr3(str, sizeof(str), res->NumBytesUpload);
\r
1393 UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
\r
1394 ToStrByte1000(str, sizeof(str), res->NumBytesUpload);
\r
1395 StrToUni(tmp2, sizeof(tmp2), str);
\r
1396 LvInsertAdd(ct, ICO_INFORMATION, NULL, 3, _UU("TTC_RES_BYTES_UPLOAD"), tmp1, tmp2);
\r
1399 ToStr3(str, sizeof(str), res->NumBytesTotal);
\r
1400 UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
\r
1401 ToStrByte1000(str, sizeof(str), res->NumBytesTotal);
\r
1402 StrToUni(tmp2, sizeof(tmp2), str);
\r
1403 LvInsertAdd(ct, ICO_INFORMATION, NULL, 3, _UU("TTC_RES_BYTES_TOTAL"), tmp1, tmp2);
\r
1405 // 中継機器入出力合計スループット算出
\r
1406 LvInsertAdd(ct, ICO_INFORMATION, NULL, 3, _UU("TTC_RES_DOUBLE"), (res->Double == false) ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
\r
1408 // ダウンロード方向の平均スループット
\r
1409 ToStr3(str, sizeof(str), res->BpsDownload);
\r
1410 UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
\r
1411 ToStrByte1000(str, sizeof(str), res->BpsDownload);
\r
1412 ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
\r
1413 StrToUni(tmp2, sizeof(tmp2), str);
\r
1414 LvInsertAdd(ct, ICO_INFORMATION, NULL, 3, _UU("TTC_RES_BPS_DOWNLOAD"), tmp1, tmp2);
\r
1416 // アップロード方向の平均スループット
\r
1417 ToStr3(str, sizeof(str), res->BpsUpload);
\r
1418 UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
\r
1419 ToStrByte1000(str, sizeof(str), res->BpsUpload);
\r
1420 ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
\r
1421 StrToUni(tmp2, sizeof(tmp2), str);
\r
1422 LvInsertAdd(ct, ICO_INFORMATION, NULL, 3, _UU("TTC_RES_BPS_UPLOAD"), tmp1, tmp2);
\r
1425 ToStr3(str, sizeof(str), res->BpsTotal);
\r
1426 UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
\r
1427 ToStrByte1000(str, sizeof(str), res->BpsTotal);
\r
1428 ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
\r
1429 StrToUni(tmp2, sizeof(tmp2), str);
\r
1430 LvInsertAdd(ct, ICO_INFORMATION, NULL, 3, _UU("TTC_RES_BPS_TOTAL"), tmp1, tmp2);
\r
1432 LvInsertEnd(ct, hWnd, L_STATUS);
\r
1434 LvAutoSize(hWnd, L_STATUS);
\r
1437 // トラフィック測定結果の表示ダイアログプロシージャ
\r
1438 UINT CmTrafficResultDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1440 TT_RESULT *r = (TT_RESULT *)param;
\r
1449 case WM_INITDIALOG:
\r
1450 CmTrafficResultDlgInit(hWnd, r);
\r
1464 EndDialog(hWnd, 0);
\r
1472 void CmTrafficResult(HWND hWnd, TT_RESULT *r)
\r
1480 Dialog(hWnd, D_CM_TRAFFIC_RESULT, CmTrafficResultDlg, r);
\r
1483 // クライアントの終了を待機するスレッド
\r
1484 void CmTrafficRunDlgClientWaitThread(THREAD *t, void *param)
\r
1486 CM_TRAFFIC_DLG *d = (CM_TRAFFIC_DLG *)param;
\r
1490 if (t == NULL || param == NULL)
\r
1495 Zero(&result, sizeof(result));
\r
1496 ret = FreeTtc(d->Ttc, &result);
\r
1500 Copy(&d->Result, &result, sizeof(TT_RESULT));
\r
1502 PostMessage(d->hWnd, WM_APP + 66, 0, 0);
\r
1506 void CmTrafficRunDlgAddStr(HWND hWnd, wchar_t *str)
\r
1511 tmp_size = UniStrSize(str) + 32;
\r
1512 tmp = Malloc(tmp_size);
\r
1513 UniStrCpy(tmp, tmp_size, str);
\r
1514 if (UniEndWith(str, L"\n") == false)
\r
1516 UniStrCat(tmp, tmp_size, L"\n");
\r
1519 UniReplaceStrEx(tmp, tmp_size, tmp, L"\r\n", L"\n", false);
\r
1520 UniReplaceStrEx(tmp, tmp_size, tmp, L"\n", L"\r\n", false);
\r
1524 SendMsg(hWnd, E_EDIT, EM_SETSEL, 0x7fffffff, 0x7fffffff);
\r
1525 SendMsg(hWnd, E_EDIT, EM_REPLACESEL, false, (LPARAM)tmp);
\r
1529 char *s = CopyUniToStr(tmp);
\r
1532 len = GetWindowTextLength(DlgItem(hWnd, E_EDIT));
\r
1533 SendMsg(hWnd, E_EDIT, EM_SETSEL, 0x7fffffff, 0x7fffffff);
\r
1534 SendMsg(hWnd, E_EDIT, EM_SETSEL, len, len);
\r
1535 SendMsg(hWnd, E_EDIT, EM_REPLACESEL, false, (LPARAM)s);
\r
1543 void CmTrafficRunDlgPrintProc(void *param, wchar_t *str)
\r
1545 CM_TRAFFIC_DLG *d = (CM_TRAFFIC_DLG *)param;
\r
1548 if (param == NULL || str == NULL)
\r
1555 PostMessage(hWnd, WM_APP + 64, 0, (LPARAM)UniCopyStr(str));
\r
1558 // 測定プログラムの停止用スレッド
\r
1559 void CmTrafficRunDlgHaltThread(THREAD *t, void *param)
\r
1561 CM_TRAFFIC_DLG *d = (CM_TRAFFIC_DLG *)param;
\r
1563 if (t == NULL || param == NULL)
\r
1568 if (d->Setting->ServerMode)
\r
1571 d->RetCode = FreeTts(d->Tts);
\r
1573 PostMessage(d->hWnd, WM_APP + 65, 0, 0);
\r
1578 void CmTrafficRunDlgHalt(HWND hWnd, CM_TRAFFIC_DLG *d)
\r
1581 if (hWnd == NULL || d == NULL)
\r
1586 if (d->Started == false)
\r
1591 if (d->Setting->ServerMode)
\r
1593 if (d->HaltThread == NULL)
\r
1595 Disable(hWnd, IDCANCEL);
\r
1596 d->HaltThread = NewThread(CmTrafficRunDlgHaltThread, d);
\r
1601 if (d->ClientEndWaitThread != NULL)
\r
1607 EndDialog(hWnd, 0);
\r
1612 // トラフィック測定の動作を開始する
\r
1613 void CmTrafficRunDlgStart(HWND hWnd, CM_TRAFFIC_DLG *d)
\r
1616 if (hWnd == NULL || d == NULL)
\r
1621 if (d->Setting->ServerMode)
\r
1624 d->Tts = NewTts(d->Setting->Port, d, CmTrafficRunDlgPrintProc);
\r
1629 d->Ttc = NewTtc(d->Setting->Host, d->Setting->Port,
\r
1630 d->Setting->NumTcp, d->Setting->Type, d->Setting->Span * 1000ULL,
\r
1631 d->Setting->Double, d->Setting->Raw, CmTrafficRunDlgPrintProc, d);
\r
1633 d->ClientEndWaitThread = NewThread(CmTrafficRunDlgClientWaitThread, d);
\r
1636 d->Started = true;
\r
1639 // トラフィック測定実行ダイアログ初期化
\r
1640 void CmTrafficRunDlgInit(HWND hWnd, CM_TRAFFIC_DLG *d)
\r
1643 if (hWnd == NULL || d == NULL)
\r
1650 SetIcon(hWnd, 0, ICO_SWITCH);
\r
1651 DlgFont(hWnd, S_INFO, 11, false);
\r
1652 SetFont(hWnd, E_EDIT, GetFont(_SS("DEFAULT_FONT_2"), 0, false, false,
\r
1655 Focus(hWnd, IDCANCEL);
\r
1658 // トラフィック測定実行ダイアログプロシージャ
\r
1659 UINT CmTrafficRunDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1661 CM_TRAFFIC_DLG *d = (CM_TRAFFIC_DLG *)param;
\r
1671 case WM_INITDIALOG:
\r
1672 CmTrafficRunDlgInit(hWnd, d);
\r
1674 SetTimer(hWnd, 1, 10, NULL);
\r
1679 s = (wchar_t *)lParam;
\r
1682 CmTrafficRunDlgAddStr(hWnd, s);
\r
1689 if (d->HaltThread != NULL)
\r
1691 WaitThread(d->HaltThread, INFINITE);
\r
1692 ReleaseThread(d->HaltThread);
\r
1693 d->HaltThread = NULL;
\r
1694 EndDialog(hWnd, 0);
\r
1700 if (d->RetCode == ERR_NO_ERROR)
\r
1702 CmTrafficResult(hWnd, &d->Result);
\r
1705 if (d->ClientEndWaitThread != NULL)
\r
1707 WaitThread(d->ClientEndWaitThread, INFINITE);
\r
1708 ReleaseThread(d->ClientEndWaitThread);
\r
1709 d->ClientEndWaitThread = NULL;
\r
1712 if (d->CloseDialogAfter)
\r
1714 EndDialog(hWnd, 0);
\r
1722 KillTimer(hWnd, 1);
\r
1724 CmTrafficRunDlgStart(hWnd, d);
\r
1740 d->CloseDialogAfter = true;
\r
1741 CmTrafficRunDlgHalt(hWnd, d);
\r
1749 void CmExecTraffic(HWND hWnd, CM_TRAFFIC *t)
\r
1758 Zero(&d, sizeof(d));
\r
1760 d.ResultShowEvent = NewEvent();
\r
1762 MsSetThreadPriorityHigh();
\r
1763 Dialog(hWnd, D_CM_TRAFFIC_RUN, CmTrafficRunDlg, &d);
\r
1764 MsRestoreThreadPriority();
\r
1766 ReleaseEvent(d.ResultShowEvent);
\r
1770 void CmTrafficSaveToReg(CM_TRAFFIC *t)
\r
1778 MsRegWriteInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "ServerMode", t->ServerMode ? 1 : 0);
\r
1779 MsRegWriteInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Double", t->Double ? 1 : 0);
\r
1780 MsRegWriteInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Raw", t->Raw ? 1 : 0);
\r
1781 MsRegWriteInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Port", t->Port);
\r
1782 MsRegWriteInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "NumTcp", t->NumTcp);
\r
1783 MsRegWriteInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Type", t->Type);
\r
1784 MsRegWriteInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Span", t->Span);
\r
1785 MsRegWriteStr(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Host", t->Host);
\r
1789 bool CmTrafficLoadFromReg(CM_TRAFFIC *t)
\r
1798 Zero(t, sizeof(CM_TRAFFIC));
\r
1800 if (MsRegIsKey(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY) == false)
\r
1805 t->Double = MsRegReadInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Double") == 0 ? false : true;
\r
1806 t->Raw = MsRegReadInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Raw") == 0 ? false : true;
\r
1807 t->Port = MsRegReadInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Port");
\r
1810 t->Port = TRAFFIC_DEFAULT_PORT;
\r
1813 s = MsRegReadStr(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Host");
\r
1815 if (IsEmptyStr(s) == false)
\r
1818 StrCpy(t->Host, sizeof(t->Host), s);
\r
1823 t->NumTcp = MsRegReadInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "NumTcp");
\r
1824 t->NumTcp = MAKESURE(t->NumTcp, 1, TRAFFIC_NUMTCP_MAX);
\r
1825 t->Type = MsRegReadInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Type");
\r
1827 if (t->Type != TRAFFIC_TYPE_DOWNLOAD && t->Type != TRAFFIC_TYPE_UPLOAD &&
\r
1828 t->Type != TRAFFIC_TYPE_FULL)
\r
1830 t->Type = TRAFFIC_TYPE_FULL;
\r
1833 t->Span = MsRegReadInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "Span");
\r
1836 t->Span = TRAFFIC_SPAN_DEFAULT;
\r
1839 t->ServerMode = MsRegReadInt(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "ServerMode") == 0 ? false : true;
\r
1845 void CmTrafficGetDefaultSetting(CM_TRAFFIC *t)
\r
1853 Zero(t, sizeof(CM_TRAFFIC));
\r
1855 t->Double = false;
\r
1857 t->Port = TRAFFIC_DEFAULT_PORT;
\r
1858 t->NumTcp = TRAFFIC_NUMTCP_DEFAULT;
\r
1859 t->Type = TRAFFIC_TYPE_FULL;
\r
1860 t->Span = TRAFFIC_SPAN_DEFAULT;
\r
1861 t->ServerMode = false;
\r
1864 // 通信スループット測定ツールダイアログ初期化
\r
1865 void CmTrafficDlgInit(HWND hWnd)
\r
1876 DlgFont(hWnd, S_8, 9, true);
\r
1877 DlgFont(hWnd, S_3, 9, true);
\r
1879 Zero(&t, sizeof(t));
\r
1880 if (CmTrafficLoadFromReg(&t) == false)
\r
1882 CmTrafficGetDefaultSetting(&t);
\r
1886 Check(hWnd, R_SERVER, t.ServerMode);
\r
1887 Check(hWnd, R_CLIENT, t.ServerMode == false);
\r
1889 c1 = ReadCandidateFromReg(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "HostCandidate");
\r
1894 CbReset(hWnd, C_HOST);
\r
1896 for (i = 0;i < LIST_NUM(c1);i++)
\r
1898 CANDIDATE *c = LIST_DATA(c1, i);
\r
1900 CbAddStr(hWnd, C_HOST, c->Str, 0);
\r
1903 FreeCandidateList(c1);
\r
1906 if (CbNum(hWnd, C_HOST) == 0)
\r
1908 CbAddStr(hWnd, C_HOST, L"speed.softether.com", 0);
\r
1911 if (IsEmptyStr(t.Host) == false)
\r
1913 SetTextA(hWnd, C_HOST, t.Host);
\r
1916 c2 = ReadCandidateFromReg(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "PortCandidate");
\r
1925 UniToStru(tmp, t.Port);
\r
1927 AddCandidate(c2, tmp, 0);
\r
1930 CbReset(hWnd, C_PORT);
\r
1932 for (i = 0;i < LIST_NUM(c2);i++)
\r
1934 CANDIDATE *c = LIST_DATA(c2, i);
\r
1936 CbAddStr(hWnd, C_PORT, c->Str, 0);
\r
1939 FreeCandidateList(c2);
\r
1942 CbReset(hWnd, C_NUM);
\r
1944 for (i = 1;i <= TRAFFIC_NUMTCP_MAX;i++)
\r
1948 UniToStru(tmp, i);
\r
1950 CbAddStr(hWnd, C_NUM, tmp, i);
\r
1953 CbSelect(hWnd, C_NUM, t.NumTcp);
\r
1955 Check(hWnd, R_DOWNLOAD, t.Type == TRAFFIC_TYPE_DOWNLOAD);
\r
1956 Check(hWnd, R_UPLOAD, t.Type == TRAFFIC_TYPE_UPLOAD);
\r
1957 Check(hWnd, R_FULL, t.Type == TRAFFIC_TYPE_FULL);
\r
1959 Check(hWnd, R_ETHERNET, t.Raw ? false : true);
\r
1960 Check(hWnd, R_DOUBLE, t.Double);
\r
1962 SetIntEx(hWnd, E_SPAN, t.Span);
\r
1964 CmTrafficDlgUpdate(hWnd);
\r
1967 // ダイアログの内容を構造体に入れる
\r
1968 void CmTrafficDlgToStruct(HWND hWnd, CM_TRAFFIC *t)
\r
1971 if (hWnd == NULL || t == NULL)
\r
1976 Zero(t, sizeof(CM_TRAFFIC));
\r
1977 t->ServerMode = IsChecked(hWnd, R_SERVER);
\r
1978 GetTxtA(hWnd, C_HOST, t->Host, sizeof(t->Host));
\r
1981 t->Port = GetInt(hWnd, C_PORT);
\r
1982 t->NumTcp = CbGetSelect(hWnd, C_NUM);
\r
1983 t->Span = GetInt(hWnd, E_SPAN);
\r
1984 t->Raw = IsChecked(hWnd, R_ETHERNET) ? false : true;
\r
1985 t->Double = IsChecked(hWnd, R_DOUBLE);
\r
1987 if (IsChecked(hWnd, R_DOWNLOAD))
\r
1989 t->Type = TRAFFIC_TYPE_DOWNLOAD;
\r
1991 else if (IsChecked(hWnd, R_UPLOAD))
\r
1993 t->Type = TRAFFIC_TYPE_UPLOAD;
\r
1997 t->Type = TRAFFIC_TYPE_FULL;
\r
2001 // 通信スループット測定ツールダイアログ更新
\r
2002 bool CmTrafficDlgUpdate(HWND hWnd)
\r
2013 CmTrafficDlgToStruct(hWnd, &t);
\r
2015 client_only = t.ServerMode ? false : true;
\r
2017 SetEnable(hWnd, C_HOST, client_only);
\r
2018 SetEnable(hWnd, S_5, client_only);
\r
2019 SetEnable(hWnd, S_8, client_only);
\r
2020 SetEnable(hWnd, S_9, client_only);
\r
2021 SetEnable(hWnd, R_DOWNLOAD, client_only);
\r
2022 SetEnable(hWnd, R_UPLOAD, client_only);
\r
2023 SetEnable(hWnd, R_FULL, client_only);
\r
2024 SetEnable(hWnd, S_10, client_only);
\r
2025 SetEnable(hWnd, S_11, client_only);
\r
2026 SetEnable(hWnd, C_NUM, client_only);
\r
2027 SetEnable(hWnd, S_14, client_only);
\r
2028 SetEnable(hWnd, S_12, client_only);
\r
2029 SetEnable(hWnd, E_SPAN, client_only);
\r
2030 SetEnable(hWnd, S_13, client_only);
\r
2031 SetEnable(hWnd, R_ETHERNET, client_only);
\r
2032 SetEnable(hWnd, R_DOUBLE, client_only);
\r
2034 if (t.Port == 0 || t.Port >= 65536)
\r
2039 if (t.ServerMode == false)
\r
2041 if (IsEmptyStr(t.Host))
\r
2046 if (t.NumTcp == 0 || t.NumTcp >= 33)
\r
2056 if (t.Type == TRAFFIC_TYPE_FULL && ((t.NumTcp % 2) != 0))
\r
2062 SetEnable(hWnd, IDOK, ok);
\r
2067 // 通信スループット測定ツールダイアログ OK ボタン
\r
2068 void CmTrafficDlgOnOk(HWND hWnd)
\r
2079 CmTrafficDlgToStruct(hWnd, &t);
\r
2082 CmTrafficSaveToReg(&t);
\r
2085 if (IsEmptyStr(t.Host) == false)
\r
2087 c = ReadCandidateFromReg(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "HostCandidate");
\r
2090 wchar_t tmp[MAX_SIZE];
\r
2092 StrToUni(tmp, sizeof(tmp), t.Host);
\r
2093 AddCandidate(c, tmp, 0);
\r
2095 WriteCandidateToReg(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, c, "HostCandidate");
\r
2097 FreeCandidateList(c);
\r
2101 if (t.Port != 0 && t.Port <= 65536)
\r
2104 c = ReadCandidateFromReg(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, "PortCandidate");
\r
2107 wchar_t tmp[MAX_SIZE];
\r
2109 UniToStru(tmp, t.Port);
\r
2110 AddCandidate(c, tmp, 0);
\r
2112 WriteCandidateToReg(REG_CURRENT_USER, CM_TRAFFIC_REG_KEY, c, "PortCandidate");
\r
2114 FreeCandidateList(c);
\r
2119 CmExecTraffic(hWnd, &t);
\r
2122 CmTrafficDlgInit(hWnd);
\r
2125 // 通信スループット測定ツールダイアログプロシージャ
\r
2126 UINT CmTrafficDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
2136 case WM_INITDIALOG:
\r
2137 SetIcon(hWnd, 0, ICO_SWITCH);
\r
2138 CmTrafficDlgInit(hWnd);
\r
2142 switch (LOWORD(wParam))
\r
2155 CmTrafficDlgUpdate(hWnd);
\r
2162 CmTrafficDlgOnOk(hWnd);
\r
2172 EndDialog(hWnd, 0);
\r
2180 void CmTraffic(HWND hWnd)
\r
2182 Dialog(hWnd, D_CM_TRAFFIC, CmTrafficDlgProc, NULL);
\r
2185 // 古いスタートアップファイルがあれば削除する
\r
2186 void CmDeleteOldStartupTrayFile()
\r
2188 char tmp[MAX_SIZE];
\r
2189 char *tag = _SS("CM_JAPANESE_ONLY_OLD_STARTUP");
\r
2190 if (IsEmptyStr(tag))
\r
2195 Format(tmp, sizeof(tmp), tag, MsGetCommonStartupDir());
\r
2200 // PKCS ライセンス確認ダイアログ
\r
2201 UINT CmPkcsEulaDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
2204 SECURE_DEVICE *dev;
\r
2214 case WM_INITDIALOG:
\r
2216 dev = GetSecureDevice(id);
\r
2219 EndDialog(hWnd, 0);
\r
2223 name = dev->ModuleName;
\r
2225 FormatText(hWnd, S_INFO_1, name);
\r
2226 FormatText(hWnd, S_INFO_2, name, name);
\r
2227 FormatText(hWnd, S_INFO_3, name);
\r
2235 EndDialog(hWnd, 1);
\r
2245 EndDialog(hWnd, 0);
\r
2252 // PKCS の DLL の EULA に同意しているかどうかの確認画面
\r
2253 bool CmCheckPkcsEula(HWND hWnd, UINT id)
\r
2255 return (Dialog(hWnd, D_CM_PKCSEULA, CmPkcsEulaDlg, (void *)id) == 0) ? false : true;
\r
2259 void CmSecurePinDlgUpdate(HWND hWnd)
\r
2261 char *tmp1, *tmp2, *tmp3;
\r
2269 tmp1 = GetTextA(hWnd, E_PIN1);
\r
2270 tmp2 = GetTextA(hWnd, E_PIN2);
\r
2271 tmp3 = GetTextA(hWnd, E_PIN3);
\r
2272 if (IsEmptyStr(tmp1))
\r
2276 if (IsEmptyStr(tmp2))
\r
2280 if (IsEmptyStr(tmp3))
\r
2284 if (StrCmp(tmp2, tmp3) != 0)
\r
2291 SetEnable(hWnd, IDOK, ok);
\r
2295 UINT CmSecurePinDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
2297 UINT id = (UINT)param;
\r
2308 case WM_INITDIALOG:
\r
2309 CmSecurePinDlgUpdate(hWnd);
\r
2313 switch (LOWORD(wParam))
\r
2318 CmSecurePinDlgUpdate(hWnd);
\r
2325 src = GetTextA(hWnd, E_PIN1);
\r
2326 dst = GetTextA(hWnd, E_PIN3);
\r
2328 Disable(hWnd, IDOK);
\r
2329 Disable(hWnd, IDCANCEL);
\r
2334 if (GetSecureDevice(id) != NULL)
\r
2336 MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SEC_PIN_DEVICE_OPEN_ERR"),
\r
2337 GetSecureDevice(id)->DeviceName);
\r
2341 MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SEC_PIN_DEVICE_OPEN_ERR"),
\r
2347 if (OpenSecSession(s, 0) == false)
\r
2349 if (GetSecureDevice(id) != NULL)
\r
2351 MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SEC_PIN_DEVICE_OPEN_ERR"),
\r
2352 GetSecureDevice(id)->DeviceName);
\r
2356 MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SEC_PIN_DEVICE_OPEN_ERR"),
\r
2362 if (LoginSec(s, src) == false)
\r
2364 MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("SEC_PIN_CURRENT_BAD"));
\r
2365 FocusEx(hWnd, E_PIN1);
\r
2369 if (ChangePin(s, src, dst) == false)
\r
2371 MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("SEC_PIN_CHANGE_FAILED"));
\r
2372 FocusEx(hWnd, E_PIN1);
\r
2376 // PIN コードのキャッシュの消去
\r
2377 cached_pin_code_expires = 0;
\r
2378 cached_pin_code[0] = 0;
\r
2379 MsgBox(hWnd, MB_ICONINFORMATION, _UU("SEC_PIN_OK"));
\r
2380 EndDialog(hWnd, true);
\r
2386 CloseSecSession(s);
\r
2391 Enable(hWnd, IDOK);
\r
2392 Enable(hWnd, IDCANCEL);
\r
2405 EndDialog(hWnd, false);
\r
2413 void CmSecurePin(HWND hWnd, UINT id)
\r
2416 if (hWnd == NULL || id == 0 || CheckSecureDeviceId(id) == false)
\r
2421 Dialog(hWnd, D_CM_SECURE_PIN, CmSecurePinDlg, (void *)id);
\r
2424 // オブジェクト種類選択ダイアログ
\r
2425 UINT CmSecureTypeDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
2436 case WM_INITDIALOG:
\r
2437 type = MsRegReadInt(REG_CURRENT_USER, SECURE_MANAGER_KEY, "DefaultImportType");
\r
2438 Check(hWnd, R_DATA, type == SEC_DATA);
\r
2439 Check(hWnd, R_CERT, type == SEC_X);
\r
2440 Check(hWnd, R_KEY, type == SEC_K);
\r
2441 goto UPDATE_CONTROL;
\r
2448 if (IsChecked(hWnd, R_CERT))
\r
2452 else if (IsChecked(hWnd, R_KEY))
\r
2457 MsRegWriteInt(REG_CURRENT_USER, SECURE_MANAGER_KEY, "DefaultImportType", type);
\r
2459 EndDialog(hWnd, type);
\r
2469 SetEnable(hWnd, IDOK, IsChecked(hWnd, R_CERT) ||
\r
2470 IsChecked(hWnd, R_KEY) ||
\r
2471 IsChecked(hWnd, R_DATA));
\r
2477 EndDialog(hWnd, INFINITE);
\r
2485 UINT CmSecureType(HWND hWnd)
\r
2487 return Dialog(hWnd, D_CM_SECURE_TYPE, CmSecureTypeDlg, NULL);
\r
2491 void CmSecureManagerDlgInit(HWND hWnd, UINT id)
\r
2493 SECURE_DEVICE *dev;
\r
2495 if (hWnd == NULL || id == 0)
\r
2500 SetIcon(hWnd, 0, ICO_SECURE);
\r
2502 dev = GetSecureDevice(id);
\r
2505 FormatText(hWnd, S_INFO, dev->DeviceName);
\r
2508 SetFont(hWnd, B_BOLD, Font(0, true));
\r
2510 LvInit(hWnd, L_LIST);
\r
2511 LvInsertColumn(hWnd, L_LIST, 0, _UU("SEC_MGR_COLUMN1"), 200);
\r
2512 LvInsertColumn(hWnd, L_LIST, 1, _UU("SEC_MGR_COLUMN2"), 110);
\r
2514 CmSecureManagerDlgUpdate(hWnd, id);
\r
2518 void CmSecureManagerDlgUpdate(HWND hWnd, UINT id)
\r
2521 bool read_only = IsJPKI(id);
\r
2528 if (LvIsSingleSelected(hWnd, L_LIST) == false)
\r
2533 SetEnable(hWnd, B_EXPORT, b && ((UINT)LvGetParam(hWnd, L_LIST, LvGetSelected(hWnd, L_LIST)) != SEC_K));
\r
2534 SetEnable(hWnd, B_DELETE, b && (read_only == false));
\r
2535 SetEnable(hWnd, B_PIN, (read_only == false));
\r
2536 SetEnable(hWnd, B_IMPORT, (read_only == false));
\r
2537 SetEnable(hWnd, B_NEW_CERT, (read_only == false));
\r
2541 void CmSecureManagerDlgRefresh(HWND hWnd, UINT id)
\r
2545 WINUI_SECURE_BATCH batch[] =
\r
2547 {WINUI_SECURE_ENUM_OBJECTS, NULL, false, NULL, NULL, NULL, NULL, NULL, NULL},
\r
2550 if (hWnd == NULL || id == 0)
\r
2555 ret = SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), id, 0);
\r
2562 o = batch[0].EnumList;
\r
2565 CmSecureManagerDlgPrintList(hWnd, o);
\r
2567 FreeEnumSecObject(o);
\r
2571 CmSecureManagerDlgUpdate(hWnd, id);
\r
2575 void CmSecureManagerDlgPrintList(HWND hWnd, LIST *o)
\r
2577 CmSecureManagerDlgPrintListEx(hWnd, L_LIST, o, INFINITE);
\r
2579 void CmSecureManagerDlgPrintListEx(HWND hWnd, UINT id, LIST *o, UINT type)
\r
2584 if (hWnd == NULL || o == NULL)
\r
2589 LvReset(hWnd, id);
\r
2591 v = LvInsertStart();
\r
2593 for (i = 0;i < LIST_NUM(o);i++)
\r
2595 UINT icon = ICO_LOG2;
\r
2596 wchar_t tmp1[MAX_SIZE], *tmp2, *tmp3;
\r
2597 SEC_OBJ *obj = LIST_DATA(o, i);
\r
2599 if (type == INFINITE || obj->Type == type)
\r
2601 StrToUni(tmp1, sizeof(tmp1), obj->Name);
\r
2602 tmp2 = CmSecureObjTypeToStr(obj->Type);
\r
2603 tmp3 = obj->Private ? _UU("SEC_YES") : _UU("SEC_NO");
\r
2605 if (obj->Type == SEC_X)
\r
2609 else if (obj->Type == SEC_K || obj->Type == SEC_P)
\r
2614 LvInsertAdd(v, icon, (void *)obj->Type, 2, tmp1, tmp2);
\r
2618 LvInsertEnd(v, hWnd, id);
\r
2621 // オブジェクトの種類を文字列にする
\r
2622 wchar_t *CmSecureObjTypeToStr(UINT type)
\r
2624 wchar_t *ret = _UU("SEC_TYPE_DATA");
\r
2626 if (type == SEC_X)
\r
2628 ret = _UU("SEC_TYPE_CERT");
\r
2630 else if (type == SEC_K)
\r
2632 ret = _UU("SEC_TYPE_KEY");
\r
2634 else if (type == SEC_P)
\r
2636 ret = _UU("SEC_TYPE_PUB");
\r
2642 // 新しい証明書を作成して書き込み
\r
2643 void CmSecureManagerDlgNewCert(HWND hWnd, UINT id)
\r
2647 char default_name[MAX_SIZE];
\r
2648 char *object_name;
\r
2650 WINUI_SECURE_BATCH batch[] =
\r
2652 {WINUI_SECURE_WRITE_CERT, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL},
\r
2653 {WINUI_SECURE_WRITE_KEY, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL},
\r
2654 {WINUI_SECURE_ENUM_OBJECTS, NULL, false, NULL, NULL, NULL, NULL, NULL, NULL},
\r
2657 if (hWnd == NULL || id == 0)
\r
2663 if (SmCreateCert(hWnd, &x, &k, true, NULL) == false)
\r
2668 GetPrintNameFromXA(default_name, sizeof(default_name), x);
\r
2669 ConvertSafeFileName(default_name, sizeof(default_name), default_name);
\r
2671 object_name = StringDlgA(hWnd, _UU("SEC_OBJECT_NAME_TITLE"),
\r
2672 _UU("SEC_OBJECT_NAME_INFO"), default_name, ICO_CERT, false, false);
\r
2674 if (object_name != NULL)
\r
2677 batch[0].InputX = x;
\r
2678 batch[0].Name = object_name;
\r
2679 batch[1].InputK = k;
\r
2680 batch[1].Name = object_name;
\r
2682 if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), id, 0) == false)
\r
2691 Free(object_name);
\r
2696 LIST *o = batch[2].EnumList;
\r
2698 CmSecureManagerDlgPrintList(hWnd, o);
\r
2700 FreeEnumSecObject(o);
\r
2702 MsgBox(hWnd, MB_ICONINFORMATION, _UU("SEC_NEW_CERT_IMPORT_OK"));
\r
2710 void CmSecureManagerDlgImport(HWND hWnd, UINT id)
\r
2713 char name[MAX_SIZE];
\r
2714 wchar_t tmp2[MAX_SIZE];
\r
2716 wchar_t *filename;
\r
2721 WINUI_SECURE_BATCH batch[] =
\r
2723 {WINUI_SECURE_WRITE_DATA, name, true, NULL, NULL, NULL, NULL, NULL, NULL},
\r
2724 {WINUI_SECURE_ENUM_OBJECTS, NULL, false, NULL, NULL, NULL, NULL, NULL, NULL},
\r
2727 if (hWnd == NULL || id == 0)
\r
2733 type = CmSecureType(hWnd);
\r
2739 tmp = OpenDlg(hWnd, _UU("DLG_ALL_FILES"), _UU("SEC_IMPORT_DATA"));
\r
2745 filename = CopyUniStr(tmp);
\r
2749 b = ReadDumpW(filename);
\r
2753 MsgBox(hWnd, MB_ICONSTOP, _UU("SEC_READ_FAILED"));
\r
2757 if (b->Size > MAX_SEC_DATA_SIZE)
\r
2760 MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SEC_DATA_TOO_BIG"), MAX_SEC_DATA_SIZE);
\r
2765 char default_name[MAX_SIZE];
\r
2766 wchar_t default_name_w[MAX_SIZE];
\r
2767 char *object_name;
\r
2768 GetFileNameFromFilePathW(default_name_w, sizeof(default_name_w), filename);
\r
2769 UniToStr(default_name, sizeof(default_name), default_name_w);
\r
2770 ConvertSafeFileName(default_name, sizeof(default_name), default_name);
\r
2772 object_name = StringDlgA(hWnd, _UU("SEC_OBJECT_NAME_TITLE"),
\r
2773 _UU("SEC_OBJECT_NAME_INFO"), default_name, ICO_LOG2, false, false);
\r
2775 if (object_name != NULL)
\r
2778 batch[0].InputData = b;
\r
2779 batch[0].Name = object_name;
\r
2781 if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), id, 0) == false)
\r
2790 Free(object_name);
\r
2802 if (CmLoadXExW(hWnd, &x, tmp2, sizeof(tmp2)))
\r
2805 char default_name[MAX_SIZE];
\r
2806 wchar_t default_name_w[MAX_PATH];
\r
2807 char *object_name;
\r
2808 GetFileNameFromFilePathW(default_name_w, sizeof(default_name_w), tmp2);
\r
2809 UniToStr(default_name, sizeof(default_name), default_name_w);
\r
2810 ConvertSafeFileName(default_name, sizeof(default_name), default_name);
\r
2812 object_name = StringDlgA(hWnd, _UU("SEC_OBJECT_NAME_TITLE"),
\r
2813 _UU("SEC_OBJECT_NAME_INFO"), default_name, ICO_CERT, false, false);
\r
2815 if (object_name != NULL)
\r
2818 batch[0].Type = WINUI_SECURE_WRITE_CERT;
\r
2819 batch[0].InputX = x;
\r
2820 batch[0].Name = object_name;
\r
2822 if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), id, 0) == false)
\r
2831 Free(object_name);
\r
2841 if (CmLoadKExW(hWnd, &k, tmp2, sizeof(tmp2)))
\r
2844 char default_name[MAX_SIZE];
\r
2845 wchar_t default_name_w[MAX_PATH];
\r
2846 char *object_name;
\r
2847 GetFileNameFromFilePathW(default_name_w, sizeof(default_name_w), tmp2);
\r
2848 UniToStr(default_name, sizeof(default_name), default_name_w);
\r
2849 ConvertSafeFileName(default_name, sizeof(default_name), default_name);
\r
2851 object_name = StringDlgA(hWnd, _UU("SEC_OBJECT_NAME_TITLE"),
\r
2852 _UU("SEC_OBJECT_NAME_INFO"), default_name, ICO_KEY, false, false);
\r
2854 if (object_name != NULL)
\r
2857 batch[0].Type = WINUI_SECURE_WRITE_KEY;
\r
2858 batch[0].InputK = k;
\r
2859 batch[0].Name = object_name;
\r
2861 if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), id, 0) == false)
\r
2870 Free(object_name);
\r
2884 LIST *o = batch[1].EnumList;
\r
2886 CmSecureManagerDlgPrintList(hWnd, o);
\r
2888 FreeEnumSecObject(o);
\r
2890 MsgBox(hWnd, MB_ICONINFORMATION, _UU("SEC_OBJECT_IMPORT_OK"));
\r
2895 void CmSecureManagerDlgExport(HWND hWnd, UINT id)
\r
2897 char name[MAX_SIZE];
\r
2898 UINT method = WINUI_SECURE_READ_DATA;
\r
2901 wchar_t filename[MAX_PATH];
\r
2905 wchar_t default_name[128];
\r
2906 WINUI_SECURE_BATCH batch[] =
\r
2908 {WINUI_SECURE_READ_DATA, name, true, NULL, NULL, NULL, NULL, NULL, NULL},
\r
2912 if (hWnd == NULL || id == 0)
\r
2917 i = LvGetSelected(hWnd, L_LIST);
\r
2918 if (i == INFINITE)
\r
2923 tmp = LvGetStrA(hWnd, L_LIST, i, 0);
\r
2924 StrCpy(name, sizeof(name), tmp);
\r
2927 type = (UINT)LvGetParam(hWnd, L_LIST, i);
\r
2932 method = WINUI_SECURE_READ_CERT;
\r
2936 method = WINUI_SECURE_READ_DATA;
\r
2940 batch[0].Type = method;
\r
2943 if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), id, 0) == false)
\r
2952 x = batch[0].OutputX;
\r
2954 CertDlg(hWnd, x, NULL, true);
\r
2961 b = batch[0].OutputData;
\r
2962 StrToUni(default_name, sizeof(default_name), name);
\r
2963 uni_tmp = SaveDlg(hWnd, _UU("DLG_ALL_FILES"), _UU("DLG_SAVE_FILE"), default_name, NULL);
\r
2965 if (uni_tmp != NULL)
\r
2967 UniStrCpy(filename, sizeof(filename), uni_tmp);
\r
2969 DumpBufW(b, filename);
\r
2973 MsgBox(hWnd, MB_ICONINFORMATION, _UU("SEC_OBJECT_EXPORT_OK"));
\r
2983 void CmSecureManagerDlgDelete(HWND hWnd, UINT id)
\r
2985 char name[MAX_SIZE];
\r
2986 UINT method = WINUI_SECURE_DELETE_DATA;
\r
2990 WINUI_SECURE_BATCH batch[] =
\r
2992 {WINUI_SECURE_DELETE_OBJECT, name, false, NULL, NULL, NULL, NULL, NULL, NULL},
\r
2993 {WINUI_SECURE_ENUM_OBJECTS, NULL, false, NULL, NULL, NULL, NULL, NULL, NULL},
\r
2997 if (hWnd == NULL || id == 0)
\r
3002 i = LvGetSelected(hWnd, L_LIST);
\r
3003 if (i == INFINITE)
\r
3008 tmp = LvGetStrA(hWnd, L_LIST, i, 0);
\r
3009 StrCpy(name, sizeof(name), tmp);
\r
3012 type = (UINT)LvGetParam(hWnd, L_LIST, i);
\r
3017 method = WINUI_SECURE_DELETE_CERT;
\r
3021 method = WINUI_SECURE_DELETE_KEY;
\r
3025 method = WINUI_SECURE_DELETE_DATA;
\r
3029 batch[0].Type = method;
\r
3031 if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), id, 0) == false)
\r
3036 o = batch[1].EnumList;
\r
3038 CmSecureManagerDlgPrintList(hWnd, o);
\r
3040 FreeEnumSecObject(o);
\r
3043 static bool cm_secure_manager_no_new_cert = false;
\r
3045 // スマートカードマネージャダイアログ
\r
3046 UINT CmSecureManagerDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
3049 UINT id = (UINT)param;
\r
3058 case WM_INITDIALOG:
\r
3059 CmSecureManagerDlgInit(hWnd, id);
\r
3061 if (cm_secure_manager_no_new_cert)
\r
3063 Hide(hWnd, B_NEW_CERT);
\r
3066 SetTimer(hWnd, 1, 1, NULL);
\r
3073 CmSecureManagerDlgRefresh(hWnd, id);
\r
3077 CmSecureManagerDlgImport(hWnd, id);
\r
3081 CmSecureManagerDlgExport(hWnd, id);
\r
3085 if (MsgBox(hWnd, MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2,
\r
3086 _UU("SEC_DELETE_MSG")) == IDYES)
\r
3088 CmSecureManagerDlgDelete(hWnd, id);
\r
3093 CmSecureManagerDlgNewCert(hWnd, id);
\r
3097 CmSecurePin(hWnd, id);
\r
3110 KillTimer(hWnd, 1);
\r
3112 CmSecureManagerDlgRefresh(hWnd, id);
\r
3118 EndDialog(hWnd, 0);
\r
3122 n = (NMHDR *)lParam;
\r
3123 switch (n->idFrom)
\r
3128 case LVN_ITEMCHANGED:
\r
3129 CmSecureManagerDlgUpdate(hWnd, id);
\r
3141 void CmSecureManager(HWND hWnd, UINT id)
\r
3143 CmSecureManagerEx(hWnd, id, false);
\r
3145 void CmSecureManagerEx(HWND hWnd, UINT id, bool no_new_cert)
\r
3148 if (hWnd == NULL || id == 0)
\r
3154 if (CheckSecureDeviceId(id) == false)
\r
3156 MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("SEC_INVALID_ID"));
\r
3162 cm_secure_manager_no_new_cert = true;
\r
3166 cm_secure_manager_no_new_cert = false;
\r
3169 Dialog(hWnd, D_CM_SECURE_MANAGER, CmSecureManagerDlg, (void *)id);
\r
3172 // クライアント用スマートカードマネージャ
\r
3173 void CmClientSecureManager(HWND hWnd)
\r
3178 Zero(&t, sizeof(t));
\r
3179 CcGetUseSecure(cm->Client, &t);
\r
3183 if (id == 0 || CheckSecureDeviceId(id) == false)
\r
3185 id = CmClientSelectSecure(hWnd);
\r
3193 CmSecureManager(hWnd, id);
\r
3197 void CmSelectSecureDlgInit(HWND hWnd, UINT default_id)
\r
3203 SetIcon(hWnd, 0, ICO_SECURE);
\r
3205 o = GetSecureDeviceList();
\r
3207 LvInit(hWnd, L_LIST);
\r
3208 LvInsertColumn(hWnd, L_LIST, 0, _UU("SEC_COLUMN1"), 150);
\r
3209 LvInsertColumn(hWnd, L_LIST, 1, _UU("SEC_COLUMN2"), 100);
\r
3210 LvInsertColumn(hWnd, L_LIST, 2, _UU("SEC_COLUMN3"), 130);
\r
3211 LvInsertColumn(hWnd, L_LIST, 3, _UU("SEC_COLUMN4"), 100);
\r
3213 v = LvInsertStart();
\r
3215 for (i = 0;i < LIST_NUM(o);i++)
\r
3217 wchar_t tmp1[MAX_SIZE];
\r
3219 wchar_t tmp3[MAX_SIZE];
\r
3220 wchar_t tmp4[MAX_SIZE];
\r
3221 SECURE_DEVICE *dev = LIST_DATA(o, i);
\r
3223 StrToUni(tmp1, sizeof(tmp1), dev->DeviceName);
\r
3224 tmp2 = (dev->Type == SECURE_IC_CARD) ? _UU("SEC_SMART_CARD") : _UU("SEC_USB_TOKEN");
\r
3225 StrToUni(tmp3, sizeof(tmp3), dev->Manufacturer);
\r
3226 StrToUni(tmp4, sizeof(tmp4), dev->ModuleName);
\r
3228 LvInsertAdd(v, ICO_SECURE, (void *)dev->Id, 4, tmp1, tmp2, tmp3, tmp4);
\r
3231 LvInsertEnd(v, hWnd, L_LIST);
\r
3233 if (default_id != 0)
\r
3235 LvSelect(hWnd, L_LIST, LvSearchParam(hWnd, L_LIST, (void *)default_id));
\r
3241 CmSelectSecureDlgUpdate(hWnd);
\r
3245 void CmSelectSecureDlgUpdate(HWND hWnd)
\r
3247 SetEnable(hWnd, IDOK, LvIsSingleSelected(hWnd, L_LIST));
\r
3251 UINT CmSelectSecureDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
3253 UINT default_id = (UINT)param;
\r
3255 static UINT old_id;
\r
3264 case WM_INITDIALOG:
\r
3265 old_id = default_id;
\r
3266 CmSelectSecureDlgInit(hWnd, default_id);
\r
3268 if (LvNum(hWnd, L_LIST) == 0)
\r
3271 SetTimer(hWnd, 1, 100, NULL);
\r
3279 KillTimer(hWnd, 1);
\r
3281 Disable(hWnd, L_LIST);
\r
3282 MsgBox(hWnd, MB_ICONINFORMATION, _UU("SEC_NO_SECURE_DEVICE"));
\r
3291 if (IsEnable(hWnd, IDOK))
\r
3293 UINT i = LvGetSelected(hWnd, L_LIST);
\r
3294 if (i != INFINITE)
\r
3296 UINT id = (UINT)LvGetParam(hWnd, L_LIST, i);
\r
3300 if (CmCheckPkcsEula(hWnd, id) == false)
\r
3305 EndDialog(hWnd, id);
\r
3317 EndDialog(hWnd, 0);
\r
3321 n = (NMHDR *)lParam;
\r
3322 switch (n->idFrom)
\r
3327 case LVN_ITEMCHANGED:
\r
3328 CmSelectSecureDlgUpdate(hWnd);
\r
3331 Command(hWnd, IDOK);
\r
3342 // 使用するスマートカードデバイスの選択
\r
3343 UINT CmSelectSecure(HWND hWnd, UINT current_id)
\r
3345 return Dialog(hWnd, D_CM_SELECT_SECURE, CmSelectSecureDlg, (void *)current_id);
\r
3348 // 使用するスマートカードデバイスの選択 (クライアント)
\r
3349 UINT CmClientSelectSecure(HWND hWnd)
\r
3354 if (cm->server_name != NULL)
\r
3356 MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("CM_SECURE_MUST_LOCAL"));
\r
3360 Zero(&t, sizeof(t));
\r
3361 CcGetUseSecure(cm->Client, &t);
\r
3365 id = CmSelectSecure(hWnd, id);
\r
3368 Zero(&t, sizeof(t));
\r
3371 CALL(hWnd, CcUseSecure(cm->Client, &t));
\r
3373 SmWriteSelectSecureIdReg(id);
\r
3380 void CmConnectShortcut(UCHAR *key)
\r
3390 ret = CcShortcut(key);
\r
3392 if (ret != ERR_NO_ERROR)
\r
3394 if (ret == ERR_ACCOUNT_ACTIVE)
\r
3396 // 現在接続中なので、切断するかどうか問い合わせる
\r
3397 if (MsgBox(NULL, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_SHORTCUT_DISCONNECT")) == IDYES)
\r
3400 ret = CcShortcutDisconnect(key);
\r
3402 if (ret != ERR_NO_ERROR)
\r
3405 MsgBox(NULL, MB_ICONEXCLAMATION, GetUniErrorStr(ret));
\r
3412 MsgBox(NULL, MB_ICONEXCLAMATION, GetUniErrorStr(ret));
\r
3418 void CmVoice(char *name)
\r
3427 if (cm->DisableVoice)
\r
3432 for (i = 0;i < sizeof(cm_voice) / sizeof(CM_VOICE);i++)
\r
3434 if (cm_voice[i].voice_id == cm->VoiceId)
\r
3436 char tmp[MAX_SIZE];
\r
3437 Format(tmp, sizeof(tmp), "%s_%s.wav", cm_voice[i].perfix, name);
\r
3445 void CmChangePasswordUpdate(HWND hWnd, CM_CHANGE_PASSWORD *p)
\r
3450 if (hWnd == NULL || p == NULL)
\r
3455 if (IsEmpty(hWnd, E_USERNAME))
\r
3460 s1 = GetTextA(hWnd, E_NEW_PASSWORD1);
\r
3461 s2 = GetTextA(hWnd, E_NEW_PASSWORD2);
\r
3463 if (StrCmp(s1, s2) != 0)
\r
3471 SetEnable(hWnd, IDOK, ok);
\r
3474 // パスワード変更ダイアログプロシージャ
\r
3475 UINT CmChangePasswordProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
3477 CM_CHANGE_PASSWORD *p = (CM_CHANGE_PASSWORD *)param;
\r
3478 char username[MAX_USERNAME_LEN + 1];
\r
3479 char old_pass[MAX_PASSWORD_LEN + 1];
\r
3480 char new_pass[MAX_PASSWORD_LEN + 1];
\r
3490 case WM_INITDIALOG:
\r
3491 SetTextA(hWnd, E_HUBNAME, p->HubName);
\r
3492 SetTextA(hWnd, E_USERNAME, p->Username);
\r
3493 FormatText(hWnd, S_TITLE, p->ClientOption->Hostname);
\r
3495 if (IsEmpty(hWnd, E_USERNAME))
\r
3497 FocusEx(hWnd, E_USERNAME);
\r
3501 FocusEx(hWnd, E_OLD_PASSWORD);
\r
3504 CmChangePasswordUpdate(hWnd, p);
\r
3508 switch (LOWORD(wParam))
\r
3511 case E_OLD_PASSWORD:
\r
3512 case E_NEW_PASSWORD1:
\r
3513 case E_NEW_PASSWORD2:
\r
3514 CmChangePasswordUpdate(hWnd, p);
\r
3521 GetTxtA(hWnd, E_USERNAME, username, sizeof(username));
\r
3522 GetTxtA(hWnd, E_OLD_PASSWORD, old_pass, sizeof(old_pass));
\r
3523 GetTxtA(hWnd, E_NEW_PASSWORD1, new_pass, sizeof(new_pass));
\r
3525 Disable(hWnd, E_USERNAME);
\r
3526 Disable(hWnd, E_OLD_PASSWORD);
\r
3527 Disable(hWnd, E_NEW_PASSWORD1);
\r
3528 Disable(hWnd, E_NEW_PASSWORD2);
\r
3529 Disable(hWnd, IDOK);
\r
3530 Disable(hWnd, IDCANCEL);
\r
3532 ret = ChangePassword(cm->Cedar, p->ClientOption, p->HubName, username, old_pass, new_pass);
\r
3534 if (ret == ERR_NO_ERROR)
\r
3536 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_PASSWORD_CHANGED"));
\r
3537 EndDialog(hWnd, true);
\r
3541 MsgBox(hWnd, MB_ICONSTOP, _E(ret));
\r
3542 Enable(hWnd, E_USERNAME);
\r
3543 Enable(hWnd, E_OLD_PASSWORD);
\r
3544 Enable(hWnd, E_NEW_PASSWORD1);
\r
3545 Enable(hWnd, E_NEW_PASSWORD2);
\r
3546 Enable(hWnd, IDOK);
\r
3547 Enable(hWnd, IDCANCEL);
\r
3549 SetTextA(hWnd, E_OLD_PASSWORD, "");
\r
3550 SetTextA(hWnd, E_NEW_PASSWORD1, "");
\r
3551 SetTextA(hWnd, E_NEW_PASSWORD2, "");
\r
3553 Focus(hWnd, E_OLD_PASSWORD);
\r
3567 EndDialog(hWnd, false);
\r
3575 void CmChangePassword(HWND hWnd, CLIENT_OPTION *o, char *hubname, char *username)
\r
3577 CM_CHANGE_PASSWORD p;
\r
3579 if (hWnd == NULL || o == NULL || hubname == NULL || username == NULL)
\r
3584 Zero(&p, sizeof(p));
\r
3585 StrCpy(p.Username, sizeof(p.Username), username);
\r
3586 StrCpy(p.HubName, sizeof(p.HubName), hubname);
\r
3587 p.ClientOption = o;
\r
3589 CmVoice("password");
\r
3591 Dialog(hWnd, D_CM_CHANGE_PASSWORD, CmChangePasswordProc, &p);
\r
3594 // デスクトップ相違警告メッセージダイアログ初期化
\r
3595 void CmDesktopDlgInit(HWND hWnd, wchar_t *account_name)
\r
3597 wchar_t tmp[2048];
\r
3598 bool remote = false;
\r
3599 bool user_switching = false;
\r
3600 bool console_active = false;
\r
3601 wchar_t *console_user = NULL;
\r
3608 FormatText(hWnd, 0, account_name);
\r
3609 FormatText(hWnd, S_TITLE, account_name);
\r
3610 DlgFont(hWnd, S_TITLE, 11, true);
\r
3611 DlgFont(hWnd, S_INFO, 11, true);
\r
3612 if (cm->server_name == NULL)
\r
3614 UniStrCpy(tmp, sizeof(tmp), _UU("CM_DESKTOP_LOCAL_PC"));
\r
3618 UniFormat(tmp, sizeof(tmp), _UU("CM_DESKTOP_REMOTE_PC"), cm->server_name);
\r
3620 FormatText(hWnd, S_WARNING, tmp);
\r
3622 if (cm->server_name != NULL)
\r
3628 if (MsIsTerminalServiceInstalled())
\r
3630 user_switching = false;
\r
3634 user_switching = true;
\r
3637 console_user = MsGetSessionUserName(0);
\r
3639 if (console_user == NULL)
\r
3641 console_active = false;
\r
3645 console_active = true;
\r
3650 if (remote == false)
\r
3652 UniFormat(tmp, sizeof(tmp), _UU("CM_DESKTOP_MSG_LOCAL_1"),
\r
3653 user_switching ? _UU("CM_DESKTOP_MSG_LOCAL_SW") : _UU("CM_DESKTOP_MSG_LOCAL_TS"));
\r
3657 UniFormat(tmp, sizeof(tmp), _UU("CM_DESKTOP_MSG_REMOTE_1"),
\r
3660 SetText(hWnd, S_MSG_1, tmp);
\r
3663 if (remote == false)
\r
3665 if (console_active)
\r
3667 UniFormat(tmp, sizeof(tmp), _UU("CM_DESKTOP_MSG_LOCAL_21"),
\r
3668 console_user, MsGetCurrentTerminalSessionId());
\r
3672 UniFormat(tmp, sizeof(tmp), _UU("CM_DESKTOP_MSG_LOCAL_22"),
\r
3673 MsGetCurrentTerminalSessionId());
\r
3678 UniFormat(tmp, sizeof(tmp), _UU("CM_DESKTOP_MSG_REMOTE_2"), cm->server_name);
\r
3680 SetText(hWnd, S_MSG_2, tmp);
\r
3683 if (remote == false)
\r
3685 if (console_active)
\r
3687 UniFormat(tmp, sizeof(tmp), _UU("CM_DESKTOP_MSG_LOCAL_31"),
\r
3688 console_user, account_name);
\r
3692 UniFormat(tmp, sizeof(tmp), _UU("CM_DESKTOP_MSG_LOCAL_32"),
\r
3698 UniFormat(tmp, sizeof(tmp), _UU("CM_DESKTOP_MSG_REMOTE_3"), cm->server_name,
\r
3701 SetText(hWnd, S_MSG_3, tmp);
\r
3703 if (console_user != NULL)
\r
3705 Free(console_user);
\r
3709 // デスクトップ相違警告メッセージダイアログ
\r
3710 UINT CmDesktopDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
3712 wchar_t *account_name = (wchar_t *)param;
\r
3721 case WM_INITDIALOG:
\r
3722 CmDesktopDlgInit(hWnd, account_name);
\r
3728 EndDialog(hWnd, true);
\r
3736 EndDialog(hWnd, false);
\r
3743 // 必要であればデスクトップが異なる旨の警告メッセージを表示する
\r
3744 bool CmWarningDesktop(HWND hWnd, wchar_t *account_name)
\r
3747 if (hWnd == NULL || account_name == NULL)
\r
3752 if (cm->Client->Unix)
\r
3754 //クライアントが UNIX の場合警告の必要は無い
\r
3758 if (/*MsIsTerminalServiceInstalled() || MsIsUserSwitchingInstalled() ||*/ (cm->server_name != NULL))
\r
3760 if (cm->server_name == NULL)
\r
3762 //if (MsGetCurrentTerminalSessionId() == 0)
\r
3769 return Dialog(hWnd, D_CM_DESKTOP, CmDesktopDlgProc, account_name);
\r
3779 void CmPasswordRefresh(HWND hWnd)
\r
3788 SetEnable(hWnd, E_PASSWORD, IsChecked(hWnd, R_USE_PASSWORD));
\r
3789 SetEnable(hWnd, E_PASSWORD2, IsChecked(hWnd, R_USE_PASSWORD));
\r
3790 SetEnable(hWnd, IDC_STATIC1, IsChecked(hWnd, R_USE_PASSWORD));
\r
3791 SetEnable(hWnd, IDC_STATIC2, IsChecked(hWnd, R_USE_PASSWORD));
\r
3792 SetEnable(hWnd, R_REMOTE_ONLY, IsChecked(hWnd, R_USE_PASSWORD));
\r
3794 if (IsChecked(hWnd, R_USE_PASSWORD))
\r
3796 char tmp1[MAX_SIZE];
\r
3797 char tmp2[MAX_SIZE];
\r
3798 if (IsEmpty(hWnd, E_PASSWORD))
\r
3802 GetTxtA(hWnd, E_PASSWORD, tmp1, sizeof(tmp1));
\r
3803 GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));
\r
3804 if (StrCmp(tmp1, tmp2) != 0)
\r
3808 if (StrCmp(tmp1, HIDDEN_PASSWORD) == 0)
\r
3814 SetEnable(hWnd, IDOK, ok);
\r
3818 UINT CmPasswordProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
3820 RPC_CLIENT_PASSWORD_SETTING c;
\r
3821 RPC_CLIENT_PASSWORD p;
\r
3822 char tmp[MAX_SIZE];
\r
3831 case WM_INITDIALOG:
\r
3833 if (CALL(hWnd, CcGetPasswordSetting(cm->Client, &c)))
\r
3835 Check(hWnd, R_USE_PASSWORD, c.IsPasswordPresented);
\r
3836 if (c.IsPasswordPresented)
\r
3838 SetTextA(hWnd, E_PASSWORD, HIDDEN_PASSWORD);
\r
3839 SetTextA(hWnd, E_PASSWORD2, HIDDEN_PASSWORD);
\r
3840 FocusEx(hWnd, E_PASSWORD);
\r
3841 Check(hWnd, R_REMOTE_ONLY, c.PasswordRemoteOnly);
\r
3845 Focus(hWnd, R_USE_PASSWORD);
\r
3848 CmPasswordRefresh(hWnd);
\r
3853 case R_USE_PASSWORD:
\r
3854 if (IsChecked(hWnd, R_USE_PASSWORD))
\r
3856 FocusEx(hWnd, E_PASSWORD);
\r
3860 GetTxtA(hWnd, E_PASSWORD, tmp, sizeof(tmp));
\r
3861 Zero(&p, sizeof(p));
\r
3862 if (IsChecked(hWnd, R_USE_PASSWORD))
\r
3864 StrCpy(p.Password, sizeof(p.Password), tmp);
\r
3865 p.PasswordRemoteOnly = IsChecked(hWnd, R_REMOTE_ONLY);
\r
3868 if (CALL(hWnd, CcSetPassword(cm->Client, &p)))
\r
3870 if (StrLen(p.Password) > 0)
\r
3872 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_PASSWORD_SET"));
\r
3876 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_PASSWORD_REMOVE"));
\r
3878 EndDialog(hWnd, true);
\r
3885 switch (LOWORD(wParam))
\r
3887 case R_USE_PASSWORD:
\r
3888 case R_REMOTE_ONLY:
\r
3891 CmPasswordRefresh(hWnd);
\r
3896 case R_REMOTE_ONLY:
\r
3897 case R_USE_PASSWORD:
\r
3898 if (IsChecked(hWnd, R_USE_PASSWORD))
\r
3900 FocusEx(hWnd, E_PASSWORD);
\r
3906 EndDialog(hWnd, false);
\r
3914 void CmPassword(HWND hWnd)
\r
3922 Dialog(hWnd, D_CM_PASSWORD, CmPasswordProc, NULL);
\r
3926 void CmTrustDlgUpdate(HWND hWnd)
\r
3934 SetEnable(hWnd, B_EXPORT, LvIsSelected(hWnd, L_CERT));
\r
3935 SetEnable(hWnd, B_DELETE, LvIsSelected(hWnd, L_CERT) && cm->CmSetting.LockMode == false);
\r
3936 SetEnable(hWnd, IDOK, LvIsSelected(hWnd, L_CERT));
\r
3937 SetEnable(hWnd, B_IMPORT, cm->CmSetting.LockMode == false);
\r
3941 void CmTrustDlgRefresh(HWND hWnd)
\r
3943 RPC_CLIENT_ENUM_CA c;
\r
3950 if (CALL(hWnd, CcEnumCa(cm->Client, &c)))
\r
3953 LVB *b = LvInsertStart();
\r
3954 for (i = 0;i < c.NumItem;i++)
\r
3956 RPC_CLIENT_ENUM_CA_ITEM *cert = c.Items[i];
\r
3957 wchar_t tmp[MAX_SIZE];
\r
3959 GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(cert->Expires), NULL);
\r
3960 LvInsertAdd(b, ICO_CERT, (void *)cert->Key, 3,
\r
3961 cert->SubjectName, cert->IssuerName, tmp);
\r
3963 LvInsertEnd(b, hWnd, L_CERT);
\r
3964 CiFreeClientEnumCa(&c);
\r
3967 CmTrustDlgUpdate(hWnd);
\r
3971 void CmTrustImport(HWND hWnd)
\r
3975 if (CmLoadXFromFileOrSecureCard(hWnd, &x) == false)
\r
3980 Zero(&c, sizeof(c));
\r
3983 CALL(hWnd, CcAddCa(cm->Client, &c));
\r
3984 CmVoice("new_cert");
\r
3987 CmTrustDlgRefresh(hWnd);
\r
3991 void CmTrustExport(HWND hWnd)
\r
4000 key = (UINT)LvGetParam(hWnd, L_CERT, LvGetSelected(hWnd, L_CERT));
\r
4001 if (key != INFINITE)
\r
4004 Zero(&a, sizeof(a));
\r
4007 if (CALL(hWnd, CcGetCa(cm->Client, &a)))
\r
4010 X *x = CloneX(a.x);
\r
4014 name = SaveDlg(hWnd, _UU("DLG_CERT_FILES"), _UU("DLG_SAVE_CERT"), NULL, L".cer");
\r
4017 wchar_t str[MAX_SIZE];
\r
4018 UniStrCpy(str, sizeof(str), name);
\r
4019 if (XToFileW(x, str, true))
\r
4021 MsgBox(hWnd, MB_ICONINFORMATION, _UU("DLG_CERT_SAVE_OK"));
\r
4025 MsgBox(hWnd, MB_ICONSTOP, _UU("DLG_CERT_SAVE_ERROR"));
\r
4035 void CmTrustView(HWND hWnd)
\r
4044 key = (UINT)LvGetParam(hWnd, L_CERT, LvGetSelected(hWnd, L_CERT));
\r
4045 if (key != INFINITE)
\r
4048 Zero(&a, sizeof(a));
\r
4051 if (CALL(hWnd, CcGetCa(cm->Client, &a)))
\r
4053 X *x = CloneX(a.x);
\r
4057 x_issuer = CmGetIssuer(x);
\r
4058 CertDlg(hWnd, x, x_issuer, true);
\r
4066 UINT CmTrustDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
4078 case WM_INITDIALOG:
\r
4079 LvInit(hWnd, L_CERT);
\r
4080 LvInsertColumn(hWnd, L_CERT, 0, _UU("CM_CERT_COLUMN_1"), 190);
\r
4081 LvInsertColumn(hWnd, L_CERT, 1, _UU("CM_CERT_COLUMN_2"), 190);
\r
4082 LvInsertColumn(hWnd, L_CERT, 2, _UU("CM_CERT_COLUMN_3"), 160);
\r
4083 CmTrustDlgRefresh(hWnd);
\r
4089 CmTrustImport(hWnd);
\r
4092 CmTrustExport(hWnd);
\r
4095 index = LvGetSelected(hWnd, L_CERT);
\r
4096 if (index != INFINITE)
\r
4098 UINT key = (UINT)LvGetParam(hWnd, L_CERT, index);
\r
4099 if (key != INFINITE)
\r
4101 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_CERT_DELETE_MSG")) == IDYES)
\r
4103 RPC_CLIENT_DELETE_CA c;
\r
4104 Zero(&c, sizeof(c));
\r
4106 if (CALL(hWnd, CcDeleteCa(cm->Client, &c)))
\r
4108 CmTrustDlgRefresh(hWnd);
\r
4115 if (IsEnable(hWnd, IDOK))
\r
4117 CmTrustView(hWnd);
\r
4126 EndDialog(hWnd, 0);
\r
4129 n = (NMHDR *)lParam;
\r
4130 switch (n->idFrom)
\r
4135 case LVN_ITEMCHANGED:
\r
4136 CmTrustDlgUpdate(hWnd);
\r
4139 Command(hWnd, IDOK);
\r
4147 LvSortHander(hWnd, msg, wParam, lParam, L_CERT);
\r
4153 void CmTrustDlg(HWND hWnd)
\r
4155 Dialog(hWnd, D_CM_TRUST, CmTrustDlgProc, NULL);
\r
4159 UINT CmMainWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
4162 static UINT taskbar_msg = 0;
\r
4163 COPYDATASTRUCT *cpy;
\r
4170 if (taskbar_msg != 0 && msg == taskbar_msg)
\r
4173 if (cm->TrayInited)
\r
4175 MsRestoreIconOnTray();
\r
4179 // CmSetForegroundProcessToCnService();
\r
4183 case WM_CM_SETTING_CHANGED_MESSAGE:
\r
4184 // CM_SETTING が変更された
\r
4185 CmApplyCmSetting();
\r
4187 case WM_INITDIALOG:
\r
4188 CmMainWindowOnInit(hWnd);
\r
4189 taskbar_msg = RegisterWindowMessage("TaskbarCreated");
\r
4190 CmEndStartupMutex();
\r
4192 case WM_SHOWWINDOW:
\r
4194 if (cm->SplashHasBeenShown == false)
\r
4196 if ((msg == WM_SHOWWINDOW && wParam) || (msg != WM_SHOWWINDOW && IsShow(hWnd, 0)))
\r
4198 if (IsIconic(hWnd) == false)
\r
4200 SetTimer(hWnd, 5, 100, NULL);
\r
4206 // 別のプロセスから表示要求を受けた
\r
4207 if (cm->CmSetting.EasyMode == false)
\r
4209 ShowWindow(hWnd, SW_SHOWNORMAL);
\r
4213 if (cm->hEasyWnd == NULL)
\r
4219 SetForegroundWindow(cm->hEasyWnd);
\r
4220 SetActiveWindow(cm->hEasyWnd);
\r
4225 CmMainWindowOnCommand(hWnd, wParam, lParam);
\r
4228 CmMainWindowOnSize(hWnd);
\r
4229 goto LABEL_SPLASH;
\r
4231 if (cm->CmSetting.EasyMode == false)
\r
4233 CmShowOrHideWindow(hWnd);
\r
4237 if (cm->hEasyWnd == NULL)
\r
4243 SetForegroundWindow(cm->hEasyWnd);
\r
4244 SetActiveWindow(cm->hEasyWnd);
\r
4248 case WM_INITMENUPOPUP:
\r
4249 if (HIWORD(lParam) == false)
\r
4251 CmMainWindowOnPopupMenu(hWnd, (HMENU)wParam, LOWORD(lParam));
\r
4255 n = (NMHDR *)lParam;
\r
4256 if (n->idFrom == L_ACCOUNT && (n->code == LVN_BEGINLABELEDITW || n->code == LVN_BEGINLABELEDITA))
\r
4258 wchar_t *tmp = LvGetSelectedStr(hWnd, L_ACCOUNT, 0);
\r
4261 if (UniStrCmpi(tmp, _UU("CM_NEW_ICON")) == 0 ||
\r
4262 UniStrCmpi(tmp, _UU("CM_ASP")) == 0)
\r
4264 SendMsg(hWnd, L_ACCOUNT, LVM_CANCELEDITLABEL, 0, 0);
\r
4271 CmMainWindowOnNotify(hWnd, (NMHDR *)lParam);
\r
4273 case WM_CM_NOTIFY:
\r
4274 CmRefreshVLanList(hWnd);
\r
4275 CmRefreshAccountList(hWnd);
\r
4276 CmRefreshStatusBar(hWnd);
\r
4282 CmSetForegroundProcessToCnService();
\r
4285 CmPollingTray(hWnd);
\r
4288 KillTimer(hWnd, 3);
\r
4292 KillTimer(hWnd, 4);
\r
4293 CmMainWindowOnShowEasy(hWnd);
\r
4296 KillTimer(hWnd, 5);
\r
4297 if (cm->SplashHasBeenShown == false)
\r
4299 cm->SplashHasBeenShown = true;
\r
4301 ShowSplashEx(hWnd, "UT-VPN Client", 1300, CM_SPLASH_BORDER_COLOR);
\r
4306 case WM_CM_TRAY_MESSAGE:
\r
4307 // タスクトレイのアイコンからのメッセージ
\r
4308 CmMainWindowOnTrayClicked(hWnd, wParam, lParam);
\r
4311 cpy = (COPYDATASTRUCT *)lParam;
\r
4314 if (cpy->dwData == CM_IMPORT_FILENAME_MSG || cpy->dwData == CM_IMPORT_FILENAME_MSG_OVERWRITE)
\r
4316 char *filename = (char *)cpy->lpData;
\r
4318 if (cm->CmSetting.LockMode == false || cpy->dwData == CM_IMPORT_FILENAME_MSG_OVERWRITE)
\r
4320 wchar_t fullpath[MAX_PATH];
\r
4322 if (StrLen(filename) >= 2 && IsFileExists(filename))
\r
4324 StrToUni(fullpath, sizeof(fullpath), filename);
\r
4328 UniStrCpy(fullpath, sizeof(fullpath), (wchar_t *)filename);
\r
4331 CmImportAccountMainEx(cm->hEasyWnd ? cm->hEasyWnd : hWnd, fullpath, cpy->dwData == CM_IMPORT_FILENAME_MSG_OVERWRITE);
\r
4335 MsgBox(cm->hEasyWnd ? cm->hEasyWnd : hWnd, MB_ICONEXCLAMATION | MB_SETFOREGROUND | MB_TOPMOST, _UU("CM_VPN_FILE_IMPORT_NG"));
\r
4340 case WM_QUERYENDSESSION:
\r
4341 // Windows が終了しようとしている
\r
4342 cm->WindowsShutdowning = true;
\r
4343 CmSaveMainWindowPos(hWnd);
\r
4346 case WM_ENDSESSION:
\r
4352 LvSortHander(hWnd, msg, wParam, lParam, L_ACCOUNT);
\r
4353 LvSortHander(hWnd, msg, wParam, lParam, L_VLAN);
\r
4358 // 通知サービスをフォアグラウンドプロセスに指定する
\r
4359 void CmSetForegroundProcessToCnService()
\r
4361 if (cm->MenuPopuping)
\r
4365 if (cm->server_name == NULL)
\r
4367 if (CnCheckAlreadyExists(false))
\r
4369 AllowFGWindow(MsRegReadInt(REG_CURRENT_USER,
\r
4370 CM_REG_KEY, "NotifyServerProcessId"));
\r
4375 // [最近の接続先] のサブメニューを表示する
\r
4376 HMENU CmCreateRecentSubMenu(HWND hWnd, UINT start_id)
\r
4380 RPC_CLIENT_ENUM_ACCOUNT a;
\r
4384 easy = cm->CmSetting.EasyMode;
\r
4386 Zero(&a, sizeof(a));
\r
4388 if (CcEnumAccount(cm->Client, &a) == ERR_NO_ERROR)
\r
4390 o = NewListFast(CiCompareClientAccountEnumItemByLastConnectDateTime);
\r
4392 for (i = 0;i < a.NumItem;i++)
\r
4394 RPC_CLIENT_ENUM_ACCOUNT_ITEM *item = a.Items[i];
\r
4398 if (item->LastConnectDateTime != 0)
\r
4406 for (i = 0;i < MIN(LIST_NUM(o), CM_NUM_RECENT);i++)
\r
4408 RPC_CLIENT_ENUM_ACCOUNT_ITEM *item = (RPC_CLIENT_ENUM_ACCOUNT_ITEM *)LIST_DATA(o, i);
\r
4409 wchar_t tmp[MAX_PATH];
\r
4410 wchar_t *account_name;
\r
4411 char *server_name;
\r
4417 h = CreatePopupMenu();
\r
4420 account_name = item->AccountName;
\r
4421 server_name = item->ServerName;
\r
4422 hub_name = item->HubName;
\r
4424 UniStrCpy(tmp, sizeof(tmp), account_name);
\r
4426 pos = LvSearchStr(hWnd, L_ACCOUNT, 0, account_name);
\r
4427 if (pos != INFINITE)
\r
4429 MsAppendMenu(h, MF_STRING, start_id + pos, tmp);
\r
4435 CiFreeClientEnumAccount(&a);
\r
4441 // タスクトレイの右クリックメニューのサブメニューを表示する
\r
4442 HMENU CmCreateTraySubMenu(HWND hWnd, bool flag, UINT start_id)
\r
4453 easy = cm->CmSetting.EasyMode;
\r
4455 num = LvNum(hWnd, L_ACCOUNT);
\r
4457 for (i = 0;i < num;i++)
\r
4459 wchar_t *status_str = LvGetStr(hWnd, L_ACCOUNT, i, 1);
\r
4461 if (status_str != NULL)
\r
4464 bool is_account = false;
\r
4466 if (UniStrCmpi(status_str, _UU("CM_ACCOUNT_OFFLINE")) == 0)
\r
4468 if (flag == false)
\r
4473 is_account = true;
\r
4476 if (UniStrCmpi(status_str, _UU("CM_ACCOUNT_ONLINE")) == 0 ||
\r
4477 UniStrCmpi(status_str, _UU("CM_ACCOUNT_CONNECTING")) == 0)
\r
4484 is_account = true;
\r
4489 wchar_t tmp[MAX_PATH];
\r
4490 wchar_t *account_name, *server_name;
\r
4491 wchar_t *hub_name;
\r
4494 h = CreatePopupMenu();
\r
4497 account_name = LvGetStr(hWnd, L_ACCOUNT, i, 0);
\r
4498 server_name = LvGetStr(hWnd, L_ACCOUNT, i, 2);
\r
4499 hub_name = LvGetStr(hWnd, L_ACCOUNT, i, 3);
\r
4501 if (easy == false)
\r
4503 UniFormat(tmp, sizeof(tmp), L"%s\t- %s [%s]", account_name, server_name, hub_name);
\r
4507 UniStrCpy(tmp, sizeof(tmp), account_name);
\r
4510 MsAppendMenu(h, MF_STRING, start_id + i, tmp);
\r
4512 Free(account_name);
\r
4513 Free(server_name);
\r
4524 // タスクトレイの右クリックメニューを表示する
\r
4525 void CmShowTrayMenu(HWND hWnd)
\r
4529 HMENU sub1, sub2, sub3, sub4;
\r
4538 cm->MenuPopuping = true;
\r
4540 locked = cm->CmSetting.LockMode;
\r
4541 easy = cm->CmSetting.EasyMode;
\r
4544 h = CreatePopupMenu();
\r
4547 MsAppendMenu(h, MF_ENABLED | MF_STRING, 100007, _UU("CM_TRAY_MENU_CANCEL"));
\r
4550 MsAppendMenu(h, MF_SEPARATOR, 10006, NULL);
\r
4552 if (locked == false && easy == false)
\r
4555 MsAppendMenu(h, MF_ENABLED | MF_STRING, CMD_NEW, _UU("CM_TRAY_MENU_NEW"));
\r
4558 MsAppendMenu(h, MF_SEPARATOR, 10005, NULL);
\r
4562 sub1 = CmCreateTraySubMenu(hWnd, false, CM_TRAY_MENU_CONNECT_ID_START);
\r
4565 MsAppendMenu(h, MF_BYPOSITION | MF_ENABLED | MF_POPUP | MF_STRING,
\r
4566 (UINT_PTR)sub1, _UU("CM_TRAY_MENU_CONNECT"));
\r
4570 sub2 = CmCreateTraySubMenu(hWnd, true, CM_TRAY_MENU_DISCONNECT_ID_START);
\r
4573 MsAppendMenu(h, MF_BYPOSITION | MF_ENABLED | MF_POPUP | MF_STRING,
\r
4574 (UINT_PTR)sub2, _UU("CM_TRAY_MENU_DISCONNECT"));
\r
4578 sub3 = CmCreateTraySubMenu(hWnd, true, CM_TRAY_MENU_STATUS_ID_START);
\r
4581 MsAppendMenu(h, MF_BYPOSITION | MF_ENABLED | MF_POPUP | MF_STRING,
\r
4582 (UINT_PTR)sub3, _UU("CM_TRAY_MENU_STATUS"));
\r
4588 MsAppendMenu(h, MF_ENABLED | MF_STRING, CMD_DISCONNECT_ALL, _UU("CM_TRAY_MENU_DISCONNECT_ALL"));
\r
4591 if (sub1 != NULL || sub2 != NULL || sub3 != NULL)
\r
4594 MsAppendMenu(h, MF_SEPARATOR, 10003, NULL);
\r
4597 // 最近接続した VPN サーバーに接続
\r
4598 sub4 = CmCreateRecentSubMenu(hWnd, CM_TRAY_MENU_RECENT_ID_START);
\r
4601 MsAppendMenu(h, MF_BYPOSITION | MF_ENABLED | MF_POPUP | MF_STRING,
\r
4602 (UINT_PTR)sub4, _UU("CM_TRAY_MENU_RECENT"));
\r
4603 MsAppendMenu(h, MF_SEPARATOR, 10008, NULL);
\r
4606 if (locked == false && easy == false)
\r
4609 MsAppendMenu(h, MF_ENABLED | MF_STRING, CMD_TRAFFIC, _UU("CM_TRAY_MENU_TRAFFIC"));
\r
4612 if (easy == false)
\r
4615 MsAppendMenu(h, MF_ENABLED | MF_STRING, CMD_NETIF, _UU("CM_TRAY_MENU_NETIF"));
\r
4619 MsAppendMenu(h, MF_ENABLED | MF_STRING, CMD_ABOUT, _UU("CM_TRAY_MENU_ABOUT"));
\r
4622 MsAppendMenu(h, MF_SEPARATOR, 10001, NULL);
\r
4625 MsAppendMenu(h, MF_ENABLED | MF_STRING, CMD_CM_SETTING, _UU("CM_TRAY_MENU_SETTING"));
\r
4628 MsAppendMenu(h, MF_SEPARATOR, 10001, NULL);
\r
4631 MsAppendMenu(h, MF_ENABLED | MF_STRING, CMD_TRAYICON, _UU("CM_MENU@CMD_TRAYICON"));
\r
4634 MsAppendMenu(h, MF_SEPARATOR, 10001, NULL);
\r
4637 MsAppendMenu(h, MF_ENABLED | MF_STRING, CMD_EXIT,
\r
4638 IsHide(hWnd, 0) ? _UU("CM_TRAY_MENU_1_SHOW") : _UU("CM_TRAY_MENU_1_HIDE"));
\r
4641 MsAppendMenu(h, MF_ENABLED | MF_STRING, CMD_QUIT, _UU("CM_TRAY_MENU_2_QUIT"));
\r
4646 SetForegroundWindow(hWnd);
\r
4647 TrackPopupMenu(h, TPM_LEFTALIGN, p.x, p.y, 0, hWnd, NULL);
\r
4648 PostMessage(hWnd, WM_NULL, 0, 0);
\r
4652 DestroyMenu(sub1);
\r
4657 DestroyMenu(sub2);
\r
4662 DestroyMenu(sub3);
\r
4667 cm->MenuPopuping = false;
\r
4670 // メインウインドウを表示または隠す
\r
4671 void CmShowOrHideWindow(HWND hWnd)
\r
4679 if (IsHide(hWnd, 0))
\r
4682 if (IsIconic(hWnd))
\r
4684 ShowWindow(hWnd, SW_SHOWNORMAL);
\r
4686 SetForegroundWindow(hWnd);
\r
4687 SetActiveWindow(hWnd);
\r
4691 CmSaveMainWindowPos(hWnd);
\r
4694 if (cm->TrayInited == false)
\r
4696 Command(hWnd, CMD_QUIT);
\r
4702 // アカウントリストを右クリックした
\r
4703 void CmAccountListRightClick(HWND hWnd)
\r
4715 h = LoadSubMenu(M_MAIN, 0, &parent);
\r
4721 InitMenuInternational(h, "CM_MENU");
\r
4724 RemoveShortcutKeyStrFromMenu(h);
\r
4727 i = GetMenuItemPos(h, CMD_QUIT);
\r
4728 if (i != INFINITE)
\r
4730 DeleteMenuItem(h, i);
\r
4731 DeleteMenuItem(h, i - 1);
\r
4732 DeleteMenuItem(h, i - 2);
\r
4733 DeleteMenuItem(h, i - 3);
\r
4737 CmMainWindowOnPopupMenu(hWnd, h, INFINITE);
\r
4741 // 選択されているアカウントが接続中かどうか判別する
\r
4742 UINT i = LvGetSelected(hWnd, L_ACCOUNT);
\r
4744 bool is_connected = false;
\r
4745 if (i != INFINITE)
\r
4747 str = LvGetStr(hWnd, L_ACCOUNT, i, 1);
\r
4750 if (UniStrCmpi(str, _UU("CM_ACCOUNT_ONLINE")) == 0 || UniStrCmpi(str, _UU("CM_ACCOUNT_CONNECTING")) == 0)
\r
4753 is_connected = true;
\r
4759 if (i == INFINITE)
\r
4762 SetMenuItemBold(h, GetMenuItemPos(h, CMD_NEW), true);
\r
4766 if (is_connected == false)
\r
4769 SetMenuItemBold(h, GetMenuItemPos(h, CMD_CONNECT), true);
\r
4774 SetMenuItemBold(h, GetMenuItemPos(h, CMD_STATUS), true);
\r
4780 PrintMenu(hWnd, h);
\r
4782 DestroyMenu(parent);
\r
4785 // 仮想 LAN カードリストを右クリックした
\r
4786 void CmVLanListRightClick(HWND hWnd)
\r
4797 h = LoadSubMenu(M_MAIN, 3, &parent);
\r
4803 InitMenuInternational(h, "CM_MENU");
\r
4806 RemoveShortcutKeyStrFromMenu(h);
\r
4809 CmMainWindowOnPopupMenu(hWnd, h, INFINITE);
\r
4813 // 選択されているデバイスが有効かどうか調べる
\r
4814 UINT i = LvGetSelected(hWnd, L_VLAN);
\r
4816 bool is_active = false;
\r
4817 if (i != INFINITE)
\r
4819 str = LvGetStr(hWnd, L_VLAN, i, 1);
\r
4822 if (UniStrCmpi(str, _UU("CM_VLAN_ENABLED")) == 0)
\r
4831 if (i == INFINITE)
\r
4834 SetMenuItemBold(h, GetMenuItemPos(h, CMD_NEW_VLAN), true);
\r
4838 if (is_active == false)
\r
4841 SetMenuItemBold(h, GetMenuItemPos(h, CMD_ENABLE_VLAN), true);
\r
4845 // Windows ネットワーク設定メニューを太字にする
\r
4846 SetMenuItemBold(h, GetMenuItemPos(h, CMD_WINNET), true);
\r
4852 PrintMenu(hWnd, h);
\r
4854 DestroyMenu(parent);
\r
4858 void CmMainWindowOnNotify(HWND hWnd, NMHDR *n)
\r
4861 NMLVDISPINFOW *disp_info;
\r
4865 if (hWnd == NULL || n == NULL)
\r
4870 switch (n->idFrom)
\r
4874 if (n->idFrom == L_ACCOUNT)
\r
4876 item_vlan = false;
\r
4887 CmOnKey(hWnd, false, false, VK_RETURN);
\r
4891 if (item_vlan == false)
\r
4893 CmAccountListRightClick(hWnd);
\r
4897 CmVLanListRightClick(hWnd);
\r
4900 case LVN_ENDLABELEDITW:
\r
4902 disp_info = (NMLVDISPINFOW *)n;
\r
4903 if (disp_info->item.pszText != NULL)
\r
4905 wchar_t *new_name = disp_info->item.pszText;
\r
4906 wchar_t *old_name = LvGetStr(hWnd, L_ACCOUNT, disp_info->item.iItem, 0);
\r
4908 if (old_name != NULL)
\r
4910 if (UniStrCmp(new_name, old_name) != 0 && UniIsEmptyStr(new_name) == false)
\r
4912 RPC_RENAME_ACCOUNT a;
\r
4913 Zero(&a, sizeof(a));
\r
4914 UniStrCpy(a.OldName, sizeof(a.OldName), old_name);
\r
4915 UniStrCpy(a.NewName, sizeof(a.NewName), new_name);
\r
4916 if (CALL(hWnd, CcRenameAccount(cm->Client, &a)))
\r
4918 LvSetItem(hWnd, L_ACCOUNT, disp_info->item.iItem, 0, new_name);
\r
4928 key = (NMLVKEYDOWN *)n;
\r
4932 UINT code = key->wVKey;
\r
4933 ctrl = (GetKeyState(VK_CONTROL) & 0x8000) == 0 ? false : true;
\r
4934 alt = (GetKeyState(VK_MENU) & 0x8000) == 0 ? false : true;
\r
4935 CmOnKey(hWnd, ctrl, alt, code);
\r
4944 void CmOnKey(HWND hWnd, bool ctrl, bool alt, UINT key)
\r
4956 Command(hWnd, IDOK);
\r
4960 if (IsFocus(hWnd, L_ACCOUNT))
\r
4963 Command(hWnd, CMD_DELETE);
\r
4967 // 仮想 LAN カードリストに関する操作
\r
4968 Command(hWnd, CMD_DELETE_VLAN);
\r
4973 Command(hWnd, CMD_RENAME);
\r
4977 Command(hWnd, CMD_REFRESH);
\r
4987 Command(hWnd, CMD_QUIT);
\r
4998 Command(hWnd, CMD_SECURE_MANAGER);
\r
5002 Command(hWnd, CMD_STATUS);
\r
5006 Command(hWnd, CMD_DISCONNECT_ALL);
\r
5010 Command(hWnd, CMD_DISCONNECT);
\r
5014 Command(hWnd, CMD_NEW);
\r
5018 Command(hWnd, CMD_CLONE);
\r
5022 Command(hWnd, CMD_STARTUP);
\r
5026 Command(hWnd, CMD_SELECT_ALL);
\r
5029 // 新規仮想 LAN カードの作成
\r
5030 Command(hWnd, CMD_NEW_VLAN);
\r
5034 Command(hWnd, CMD_ENABLE_VLAN);
\r
5038 Command(hWnd, CMD_DISABLE_VLAN);
\r
5042 Command(hWnd, CMD_REINSTALL);
\r
5045 // Windows ネットワーク接続の設定
\r
5046 Command(hWnd, CMD_WINNET);
\r
5050 Command(hWnd, CMD_PASSWORD);
\r
5054 Command(hWnd, CMD_TRAFFIC);
\r
5058 Command(hWnd, CMD_TRUST);
\r
5062 Command(hWnd, CMD_TRAFFIC);
\r
5069 void CmMainWindowOnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
\r
5071 CmMainWindowOnCommandEx(hWnd, wParam, lParam, false);
\r
5073 void CmMainWindowOnCommandEx(HWND hWnd, WPARAM wParam, LPARAM lParam, bool easy)
\r
5082 wchar_t *selected_name = NULL;
\r
5083 UINT starter_id = 0;
\r
5089 ctrl = (GetKeyState(VK_CONTROL) & 0x8000) == 0 ? false : true;
\r
5090 alt = (GetKeyState(VK_MENU) & 0x8000) == 0 ? false : true;
\r
5092 if (wParam == IDOK)
\r
5094 tmp = LvGetSelectedStr(hWnd, L_ACCOUNT, 0);
\r
5097 if (UniStrCmpi(tmp, _UU("CM_NEW_ICON")) == 0)
\r
5100 Command(hWnd, CMD_NEW);
\r
5103 if (UniStrCmpi(tmp, _UU("CM_ASP")) == 0)
\r
5106 ShellExecuteA(hWnd, "open", _SS("CM_ASP_URL"), NULL, NULL, SW_SHOW);
\r
5113 if (CmIsEnabled(hWnd, (UINT)wParam) == false)
\r
5118 if (CM_TRAY_IS_CONNECT_ID(wParam))
\r
5121 starter_id = CM_TRAY_MENU_CONNECT_ID_START;
\r
5125 if (CM_TRAY_IS_STATUS_ID(wParam))
\r
5128 starter_id = CM_TRAY_MENU_STATUS_ID_START;
\r
5132 if (CM_TRAY_IS_DISCONNECT_ID(wParam))
\r
5135 starter_id = CM_TRAY_MENU_DISCONNECT_ID_START;
\r
5139 if (CM_TRAY_IS_RECENT_ID(wParam))
\r
5142 starter_id = CM_TRAY_MENU_RECENT_ID_START;
\r
5146 if (starter_id != 0)
\r
5150 id = (UINT)wParam - starter_id;
\r
5152 num = LvNum(hWnd, L_ACCOUNT);
\r
5156 selected_name = LvGetStr(hWnd, L_ACCOUNT, id, 0);
\r
5158 if (selected_name != NULL)
\r
5160 if (UniStrCmpi(selected_name, _UU("CM_NEW_ICON")) != 0 &&
\r
5161 UniStrCmpi(selected_name, _UU("CM_ASP")) != 0)
\r
5166 CmConnect(hWnd, selected_name);
\r
5170 CmStatus(hWnd, selected_name);
\r
5174 CmDisconnect(hWnd, selected_name);
\r
5180 Free(selected_name);
\r
5187 case CMD_EASY_DBLCLICK:
\r
5189 if (IsFocus(hWnd, L_ACCOUNT) || (hWnd == cm->hEasyWnd))
\r
5194 UINT index = LvGetSelected(hWnd, L_ACCOUNT);
\r
5196 if (index != INFINITE)
\r
5198 wchar_t *s = LvGetStr(hWnd, L_ACCOUNT, index, 1);
\r
5201 if (UniStrCmpi(s, _UU("CM_ACCOUNT_ONLINE")) == 0 || UniStrCmpi(s, _UU("CM_ACCOUNT_CONNECTING")) == 0)
\r
5212 Command(hWnd, CMD_CONNECT);
\r
5216 if (hWnd != cm->hEasyWnd || wParam == CMD_EASY_DBLCLICK)
\r
5219 Command(hWnd, CMD_STATUS);
\r
5224 Command(hWnd, CMD_DISCONNECT);
\r
5231 Command(hWnd, CMD_PROPERTY);
\r
5236 // Windows ネットワーク接続の設定
\r
5237 Command(hWnd, CMD_WINNET);
\r
5242 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5245 CmConnect(hWnd, tmp);
\r
5251 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5254 CmStatus(hWnd, tmp);
\r
5258 case CMD_DISCONNECT_ALL:
\r
5260 CmDisconnectAll(hWnd);
\r
5262 case CMD_DISCONNECT:
\r
5264 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5267 CmDisconnect(hWnd, tmp);
\r
5273 CmNewAccount(hWnd);
\r
5277 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5280 CmCopyAccount(hWnd, tmp);
\r
5284 case CMD_SHORTCUT:
\r
5286 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5289 CmSortcut(hWnd, tmp);
\r
5293 case CMD_EXPORT_ACCOUNT:
\r
5295 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5298 CmExportAccount(hWnd, tmp);
\r
5302 case CMD_IMPORT_ACCOUNT:
\r
5304 CmImportAccount(hWnd);
\r
5308 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5311 RPC_CLIENT_DELETE_ACCOUNT c;
\r
5312 Zero(&c, sizeof(c));
\r
5313 UniStrCpy(c.AccountName, sizeof(c.AccountName), tmp);
\r
5314 CALL(hWnd, CcSetStartupAccount(cm->Client, &c));
\r
5315 CmVoice("set_startup");
\r
5316 MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("CM_SET_STARTUP"), tmp);
\r
5320 case CMD_NOSTARTUP:
\r
5322 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5325 if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2,
\r
5326 _UU("CM_REMOVE_STARTUP"), tmp) == IDYES)
\r
5328 RPC_CLIENT_DELETE_ACCOUNT c;
\r
5329 Zero(&c, sizeof(c));
\r
5330 UniStrCpy(c.AccountName, sizeof(c.AccountName), tmp);
\r
5331 CALL(hWnd, CcRemoveStartupAccount(cm->Client, &c));
\r
5332 CmVoice("remove_startup");
\r
5339 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5342 CmDeleteAccount(hWnd, tmp);
\r
5348 Focus(hWnd, L_ACCOUNT);
\r
5349 LvRename(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT));
\r
5351 case CMD_PROPERTY:
\r
5353 tmp = LvGetStr(hWnd, L_ACCOUNT, LvGetSelected(hWnd, L_ACCOUNT), 0);
\r
5356 CmEditAccount(hWnd, tmp);
\r
5367 CmMainWindowOnQuit(hWnd);
\r
5369 case CMD_SELECT_ALL:
\r
5371 LvSelectAll(hWnd, L_ACCOUNT);
\r
5372 LvSelectAll(hWnd, L_VLAN);
\r
5374 case CMD_SWITCH_SELECT:
\r
5376 LvSwitchSelect(hWnd, L_ACCOUNT);
\r
5377 LvSwitchSelect(hWnd, L_VLAN);
\r
5381 cm->ShowGrid = !cm->ShowGrid;
\r
5382 CmRefreshVLanListEx(hWnd, true);
\r
5383 CmRefreshAccountListEx2(hWnd, false, true);
\r
5385 case CMD_STATUSBAR:
\r
5387 if (cm->HideStatusBar == false)
\r
5389 cm->HideStatusBar = true;
\r
5390 Hide(hWnd, S_STATUSBAR);
\r
5391 CmMainWindowOnSize(hWnd);
\r
5395 cm->HideStatusBar = false;
\r
5396 Show(hWnd, S_STATUSBAR);
\r
5397 CmMainWindowOnSize(hWnd);
\r
5399 CmSaveMainWindowPos(hWnd);
\r
5401 case CMD_VISTASTYLE:
\r
5402 cm->VistaStyle = !cm->VistaStyle;
\r
5403 CmRefreshEx(hWnd, true);
\r
5404 CmSaveMainWindowPos(hWnd);
\r
5406 case CMD_TRAYICON:
\r
5408 if (cm->HideTrayIcon == false)
\r
5410 cm->HideTrayIcon = true;
\r
5413 if (IsHide(hWnd, 0))
\r
5415 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_TRAY_ICON_RESTORE"));
\r
5420 cm->HideTrayIcon = false;
\r
5421 if (cm->server_name == NULL)
\r
5427 case CMD_SHOWPORT:
\r
5429 cm->ShowPort = !cm->ShowPort;
\r
5434 if (cm->IconView == false)
\r
5436 cm->IconView = true;
\r
5444 cm->IconView = false;
\r
5449 if (easy == false)
\r
5452 LvReset(hWnd, L_ACCOUNT);
\r
5453 LvReset(hWnd, L_VLAN);
\r
5457 case CMD_NEW_VLAN:
\r
5459 name = CmNewVLanDlg(hWnd);
\r
5462 wchar_t tmp[MAX_SIZE];
\r
5463 void *helper = NULL;
\r
5464 RPC_CLIENT_CREATE_VLAN c;
\r
5465 Zero(&c, sizeof(c));
\r
5466 StrCpy(c.DeviceName, sizeof(c.DeviceName), name);
\r
5467 if (MsIsNt() == false)
\r
5469 // ウインドウのタイトルを変更する
\r
5470 GetTxt(hWnd, 0, tmp, sizeof(tmp));
\r
5471 SetText(hWnd, 0, _UU("CM_VLAN_INSTALLING"));
\r
5474 if (MsIsVista() == false)
\r
5476 ShowWindow(hWnd, SW_SHOWMINIMIZED);
\r
5481 helper = CmStartUacHelper();
\r
5484 if (CALL(hWnd, CcCreateVLan(cm->Client, &c)))
\r
5486 CmVoice("new_vlan");
\r
5489 CmStopUacHelper(helper);
\r
5491 if (MsIsNt() == false)
\r
5494 SetText(hWnd, 0, tmp);
\r
5497 if (MsIsVista() == false)
\r
5499 ShowWindow(hWnd, SW_SHOWNORMAL);
\r
5504 case CMD_DELETE_VLAN:
\r
5506 index = LvGetSelected(hWnd, L_VLAN);
\r
5507 if (index != INFINITE)
\r
5509 if (cm->Client->Win9x == false)
\r
5511 // Windows 2000 以降
\r
5512 wchar_t *s = LvGetStr(hWnd, L_VLAN, index, 0);
\r
5515 RPC_CLIENT_CREATE_VLAN c;
\r
5516 char str[MAX_SIZE];
\r
5517 CmVoice("delete_vlan_1");
\r
5518 if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_DELETE_VLAN"), s) == IDYES)
\r
5520 Zero(&c, sizeof(c));
\r
5521 UniToStr(str, sizeof(str), s);
\r
5522 if (CmPrintNameToVLanName(c.DeviceName, sizeof(c.DeviceName), str))
\r
5524 if (CALL(hWnd, CcDeleteVLan(cm->Client, &c)))
\r
5526 CmVoice("delete_vlan_2");
\r
5536 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("CM_9X_VLAN_UNINSTALL")) == IDYES)
\r
5538 Run("rundll32.exe", "shell32.dll,Control_RunDLL NETCPL.CPL",
\r
5544 case CMD_ENABLE_VLAN:
\r
5546 index = LvGetSelected(hWnd, L_VLAN);
\r
5547 if (index != INFINITE)
\r
5549 wchar_t *s = LvGetStr(hWnd, L_VLAN, index, 0);
\r
5552 RPC_CLIENT_CREATE_VLAN c;
\r
5553 char str[MAX_SIZE];
\r
5554 Zero(&c, sizeof(c));
\r
5555 UniToStr(str, sizeof(str), s);
\r
5556 if (CmPrintNameToVLanName(c.DeviceName, sizeof(c.DeviceName), str))
\r
5558 CALL(hWnd, CcEnableVLan(cm->Client, &c));
\r
5564 case CMD_DISABLE_VLAN:
\r
5566 index = LvGetSelected(hWnd, L_VLAN);
\r
5567 if (index != INFINITE)
\r
5569 wchar_t *s = LvGetStr(hWnd, L_VLAN, index, 0);
\r
5572 RPC_CLIENT_CREATE_VLAN c;
\r
5573 char str[MAX_SIZE];
\r
5574 Zero(&c, sizeof(c));
\r
5575 UniToStr(str, sizeof(str), s);
\r
5576 if (CmPrintNameToVLanName(c.DeviceName, sizeof(c.DeviceName), str))
\r
5578 CALL(hWnd, CcDisableVLan(cm->Client, &c));
\r
5584 case CMD_REINSTALL:
\r
5585 // 仮想 LAN カードの再インストール
\r
5586 index = LvGetSelected(hWnd, L_VLAN);
\r
5587 if (index != INFINITE)
\r
5589 wchar_t *s = LvGetStr(hWnd, L_VLAN, index, 0);
\r
5592 RPC_CLIENT_CREATE_VLAN c;
\r
5593 char str[MAX_SIZE];
\r
5594 Zero(&c, sizeof(c));
\r
5595 UniToStr(str, sizeof(str), s);
\r
5596 if (CmPrintNameToVLanName(c.DeviceName, sizeof(c.DeviceName), str))
\r
5598 void *helper = NULL;
\r
5600 if (MsIsVista() == false)
\r
5602 ShowWindow(hWnd, SW_SHOWMINIMIZED);
\r
5607 helper = CmStartUacHelper();
\r
5610 CALL(hWnd, CcUpgradeVLan(cm->Client, &c));
\r
5612 CmStopUacHelper(helper);
\r
5614 if (MsIsVista() == false)
\r
5616 ShowWindow(hWnd, SW_SHOWNORMAL);
\r
5623 case CMD_PASSWORD:
\r
5629 CmConfigDlg(hWnd);
\r
5637 if (IsEnable(hWnd, 0))
\r
5639 ShowSplashEx(hWnd, "UT-VPN Client", 0, CM_SPLASH_BORDER_COLOR);
\r
5642 case CMD_VOIDE_NONE:
\r
5643 cm->DisableVoice = true;
\r
5645 case CMD_VOICE_NORMAL:
\r
5646 cm->DisableVoice = false;
\r
5647 cm->VoiceId = VOICE_SSK;
\r
5649 case CMD_VOICE_ODD:
\r
5650 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("CM_EXT_VOICE_MSG")) == IDYES)
\r
5652 cm->DisableVoice = false;
\r
5653 cm->VoiceId = VOICE_AHO;
\r
5656 case CMD_SECURE_MANAGER:
\r
5658 CmClientSecureManager(hWnd);
\r
5660 case CMD_SECURE_SELECT:
\r
5662 CmClientSelectSecure(hWnd);
\r
5666 if (IsEnable(hWnd, 0))
\r
5668 UtSpeedMeterEx(hWnd);
\r
5672 // TCP/IP 最適化ユーティリティ
\r
5673 if (IsEnable(hWnd, 0))
\r
5675 ShowTcpIpConfigUtil(hWnd, true);
\r
5679 // Windows Vista 用最適化ユーティリティ
\r
5680 if (MsIsVista() == false)
\r
5682 MsgBox(hWnd, MB_ICONINFORMATION, _UU("VISTA_MMCSS_MSG_4"));
\r
5686 if (MsIsAdmin() == false)
\r
5688 MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("VISTA_MMCSS_MSG_4"));
\r
5692 if (MsIsMMCSSNetworkThrottlingEnabled())
\r
5694 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("VISTA_MMCSS_MSG")) == IDYES)
\r
5696 MsSetMMCSSNetworkThrottlingEnable(false);
\r
5697 MsgBox(hWnd, MB_ICONINFORMATION, _UU("VISTA_MMCSS_MSG_5"));
\r
5702 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("VISTA_MMCSS_MSG_2")) == IDYES)
\r
5704 MsSetMMCSSNetworkThrottlingEnable(true);
\r
5705 MsgBox(hWnd, MB_ICONINFORMATION, _UU("VISTA_MMCSS_MSG_6"));
\r
5713 if (IsEnable(hWnd, 0))
\r
5718 case CMD_CM_SETTING:
\r
5720 if (IsEnable(hWnd, 0))
\r
5722 if (CmSetting(hWnd))
\r
5724 CmApplyCmSetting();
\r
5729 // Windows ネットワークの設定
\r
5730 ShowWindowsNetworkConnectionDialog();
\r
5736 void CmConfigDlg(HWND hWnd)
\r
5744 Dialog(hWnd, D_CM_CONFIG, CmConfigDlgProc, NULL);
\r
5747 // オプション設定ダイアログの初期化
\r
5748 void CmConfigDlgInit(HWND hWnd)
\r
5760 DlgFont(hWnd, S_WARNING, 10, true);
\r
5761 DlgFont(hWnd, S_INFO, 10, false);
\r
5763 Zero(&c, sizeof(c));
\r
5764 if (CALL(hWnd, CcGetClientConfig(cm->Client, &c)) == false)
\r
5766 EndDialog(hWnd, 0);
\r
5770 Check(hWnd, R_ALLOW_REMOTE_CONFIG, c.AllowRemoteConfig);
\r
5772 Check(hWnd, R_USE_KEEP_CONNECT, c.UseKeepConnect);
\r
5773 SetTextA(hWnd, E_HOSTNAME, c.KeepConnectHost);
\r
5774 SetIntEx(hWnd, E_PORT, c.KeepConnectPort);
\r
5775 SetIntEx(hWnd, E_INTERVAL, c.KeepConnectInterval);
\r
5777 Check(hWnd, R_TCP, c.KeepConnectProtocol == CONNECTION_TCP);
\r
5778 Check(hWnd, R_UDP, c.KeepConnectProtocol == CONNECTION_UDP);
\r
5780 use_alpha = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "UseAlpha") == 0 ? false : true;
\r
5781 alpha_value = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "AlphaValue");
\r
5782 alpha_value = MAKESURE(alpha_value, 0, 100);
\r
5784 SetInt(hWnd, E_ALPHA_VALUE, alpha_value == 0 ? 50 : alpha_value);
\r
5785 Check(hWnd, R_ALPHA, use_alpha);
\r
5787 os = GetOsInfo()->OsType;
\r
5788 if (OS_IS_WINDOWS_NT(os) && GET_KETA(os, 100) >= 2)
\r
5790 Enable(hWnd, R_ALPHA);
\r
5794 Disable(hWnd, R_ALPHA);
\r
5797 CmConfigDlgRefresh(hWnd);
\r
5800 // オプション設定ダイアログの更新
\r
5801 void CmConfigDlgRefresh(HWND hWnd)
\r
5804 bool use_keep_connect;
\r
5811 use_keep_connect = IsChecked(hWnd, R_USE_KEEP_CONNECT);
\r
5812 SetEnable(hWnd, S_HOSTNAME, use_keep_connect);
\r
5813 SetEnable(hWnd, S_PORT, use_keep_connect);
\r
5814 SetEnable(hWnd, S_INTERVAL, use_keep_connect);
\r
5815 SetEnable(hWnd, S_INTERVAL2, use_keep_connect);
\r
5816 SetEnable(hWnd, S_PROTOCOL, use_keep_connect);
\r
5817 SetEnable(hWnd, S_INFO, use_keep_connect);
\r
5818 SetEnable(hWnd, S_INFO2, use_keep_connect);
\r
5819 SetEnable(hWnd, E_HOSTNAME, use_keep_connect);
\r
5820 SetEnable(hWnd, E_PORT, use_keep_connect);
\r
5821 SetEnable(hWnd, E_INTERVAL, use_keep_connect);
\r
5822 SetEnable(hWnd, R_TCP, use_keep_connect);
\r
5823 SetEnable(hWnd, R_UDP, use_keep_connect);
\r
5825 SetEnable(hWnd, S_WARNING, IsChecked(hWnd, R_ALLOW_REMOTE_CONFIG));
\r
5827 if (IsChecked(hWnd, R_USE_KEEP_CONNECT))
\r
5829 if (IsEmpty(hWnd, E_HOSTNAME))
\r
5833 if (IsChecked(hWnd, R_TCP) == false && IsChecked(hWnd, R_UDP) == false)
\r
5837 if (GetInt(hWnd, E_PORT) == 0 || GetInt(hWnd, E_PORT) >= 65536)
\r
5841 if (GetInt(hWnd, E_INTERVAL) == 0)
\r
5847 if (IsChecked(hWnd, R_ALPHA))
\r
5849 UINT i = GetInt(hWnd, E_ALPHA_VALUE);
\r
5850 if (i < 20 || i >= 100)
\r
5854 Enable(hWnd, E_ALPHA_VALUE);
\r
5858 Disable(hWnd, E_ALPHA_VALUE);
\r
5861 SetEnable(hWnd, IDOK, ok);
\r
5864 // オプション設定ダイアログの設定保存
\r
5865 void CmConfigDlgOnOk(HWND hWnd)
\r
5874 Zero(&c, sizeof(c));
\r
5875 c.AllowRemoteConfig = IsChecked(hWnd, R_ALLOW_REMOTE_CONFIG);
\r
5876 c.UseKeepConnect = IsChecked(hWnd, R_USE_KEEP_CONNECT);
\r
5877 GetTxtA(hWnd, E_HOSTNAME, c.KeepConnectHost, sizeof(c.KeepConnectHost));
\r
5878 c.KeepConnectPort = GetInt(hWnd, E_PORT);
\r
5879 c.KeepConnectInterval = GetInt(hWnd, E_INTERVAL);
\r
5880 if (IsChecked(hWnd, R_TCP))
\r
5882 c.KeepConnectProtocol = CONNECTION_TCP;
\r
5884 else if (IsChecked(hWnd, R_UDP))
\r
5886 c.KeepConnectProtocol = CONNECTION_UDP;
\r
5893 if (c.UseKeepConnect)
\r
5895 if (c.KeepConnectInterval < KEEP_INTERVAL_MIN || c.KeepConnectInterval > KEEP_INTERVAL_MAX)
\r
5897 MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("CM_KEEP_INTERVAL_MSG"),
\r
5898 KEEP_INTERVAL_MIN, KEEP_INTERVAL_MAX);
\r
5899 FocusEx(hWnd, E_INTERVAL);
\r
5904 if (CALL(hWnd, CcSetClientConfig(cm->Client, &c)) == false)
\r
5909 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "AlphaValue", GetInt(hWnd, E_ALPHA_VALUE));
\r
5910 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "UseAlpha", IsChecked(hWnd, R_ALPHA));
\r
5912 EndDialog(hWnd, true);
\r
5915 // オプション設定ダイアログプロシージャ
\r
5916 UINT CmConfigDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
5926 case WM_INITDIALOG:
\r
5927 CmConfigDlgInit(hWnd);
\r
5930 switch (LOWORD(wParam))
\r
5932 case R_ALLOW_REMOTE_CONFIG:
\r
5933 case R_USE_KEEP_CONNECT:
\r
5938 case E_ALPHA_VALUE:
\r
5939 CmConfigDlgRefresh(hWnd);
\r
5946 CmConfigDlgRefresh(hWnd);
\r
5947 CmConfigDlgOnOk(hWnd);
\r
5952 case R_ALLOW_REMOTE_CONFIG:
\r
5953 if (IsChecked(hWnd, R_ALLOW_REMOTE_CONFIG) == false)
\r
5955 if (cm->server_name != NULL)
\r
5957 // 現在リモート接続している場合、リモート管理を無効にするように
\r
5959 if (MsgBoxEx(hWnd, MB_ICONEXCLAMATION | MB_DEFBUTTON2 | MB_YESNO, _UU("CM_REMOTE_WARNING"),
\r
5960 cm->server_name, cm->server_name) == IDNO)
\r
5962 Check(hWnd, R_ALLOW_REMOTE_CONFIG, true);
\r
5967 case R_USE_KEEP_CONNECT:
\r
5968 if (IsChecked(hWnd, R_USE_KEEP_CONNECT))
\r
5970 FocusEx(hWnd, E_HOSTNAME);
\r
5974 if (IsChecked(hWnd, R_ALPHA))
\r
5976 FocusEx(hWnd, E_ALPHA_VALUE);
\r
5982 EndDialog(hWnd, false);
\r
5990 void CmSortcut(HWND hWnd, wchar_t *account_name)
\r
5992 wchar_t tmp[MAX_SIZE];
\r
5994 wchar_t *filename;
\r
5995 UCHAR key[SHA1_SIZE];
\r
5997 if (hWnd == NULL || account_name == NULL)
\r
6003 a = CmGetExistAccountObject(hWnd, account_name);
\r
6009 Copy(key, a->ShortcutKey, SHA1_SIZE);
\r
6011 if (IsZero(key, SHA1_SIZE))
\r
6013 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_SHORTCUT_UNSUPPORTED"));
\r
6018 UniFormat(tmp, sizeof(tmp), L"%s.lnk", account_name);
\r
6019 UniSafeFileName(tmp);
\r
6021 filename = SaveDlg(hWnd, _UU("CM_SHORTCUT_FILE"),
\r
6022 _UU("CM_SHORTCUT_SAVE_TITLE"), tmp, L".uvpn");
\r
6024 if (filename != NULL)
\r
6027 wchar_t target[MAX_PATH];
\r
6028 wchar_t workdir[MAX_PATH];
\r
6029 wchar_t args[MAX_PATH];
\r
6030 wchar_t comment[MAX_SIZE];
\r
6031 wchar_t icon[MAX_PATH];
\r
6033 BinToStr(key_str, sizeof(key_str), key, SHA1_SIZE);
\r
6036 UniStrCpy(target, sizeof(target), MsGetExeFileNameW());
\r
6037 UniStrCpy(workdir, sizeof(workdir), MsGetExeDirNameW());
\r
6038 StrToUni(args, sizeof(args), key_str);
\r
6039 UniFormat(comment, sizeof(comment), _UU("CM_SHORTCUT_COMMENT"), account_name);
\r
6040 UniStrCpy(icon, sizeof(icon), MsGetExeFileNameW());
\r
6042 if (CreateLink(tmp, target, workdir, args, comment, icon, 1) == false)
\r
6044 MsgBox(hWnd, MB_ICONSTOP, _UU("CM_SHORTCUT_ERROR"));
\r
6051 CmFreeAccountObject(hWnd, a);
\r
6055 void CmExportAccount(HWND hWnd, wchar_t *account_name)
\r
6057 wchar_t tmp[MAX_SIZE];
\r
6059 wchar_t *filename;
\r
6061 if (hWnd == NULL || account_name == NULL)
\r
6067 a = CmGetExistAccountObject(hWnd, account_name);
\r
6074 UniFormat(tmp, sizeof(tmp), L"%s.uvpn", account_name);
\r
6075 UniSafeFileName(tmp);
\r
6077 filename = SaveDlg(hWnd, _UU("CM_ACCOUNT_SETTING_FILE"),
\r
6078 _UU("CM_ACCOUNT_SAVE_TITLE"), tmp, L".uvpn");
\r
6080 if (filename != NULL)
\r
6082 RPC_CLIENT_CREATE_ACCOUNT t;
\r
6085 wchar_t tmp[MAX_SIZE];
\r
6088 UCHAR bom[] = {0xef, 0xbb, 0xbf, };
\r
6090 Zero(&t, sizeof(t));
\r
6091 t.ClientOption = a->ClientOption;
\r
6092 t.ClientAuth = a->ClientAuth;
\r
6093 t.StartupAccount = a->Startup;
\r
6094 t.CheckServerCert = a->CheckServerCert;
\r
6095 t.ServerCert = a->ServerCert;
\r
6096 t.ClientOption->FromAdminPack = false;
\r
6098 b = CiAccountToCfg(&t);
\r
6100 UniStrCpy(tmp, sizeof(tmp), filename);
\r
6103 WriteBuf(b2, bom, sizeof(bom));
\r
6106 buf_size = CalcUniToUtf8(_UU("CM_ACCOUNT_FILE_BANNER"));
\r
6107 buf = ZeroMalloc(buf_size + 32);
\r
6108 UniToUtf8(buf, buf_size, _UU("CM_ACCOUNT_FILE_BANNER"));
\r
6110 WriteBuf(b2, buf, StrLen((char *)buf));
\r
6111 WriteBuf(b2, b->Buf, b->Size);
\r
6112 SeekBuf(b2, 0, 0);
\r
6116 if (DumpBufW(b2, tmp) == false)
\r
6118 MsgBox(hWnd, MB_ICONSTOP, _UU("CM_FAILED_TO_SAVE_FILE"));
\r
6126 CmFreeAccountObject(hWnd, a);
\r
6129 // アカウントのインポートメイン処理
\r
6130 void CmImportAccountMain(HWND hWnd, wchar_t *filename)
\r
6132 CmImportAccountMainEx(hWnd, filename, false);
\r
6134 void CmImportAccountMainEx(HWND hWnd, wchar_t *filename, bool overwrite)
\r
6136 wchar_t name[MAX_SIZE];
\r
6137 wchar_t tmp[MAX_SIZE];
\r
6139 RPC_CLIENT_CREATE_ACCOUNT *t;
\r
6141 if (hWnd == NULL || filename == NULL)
\r
6146 UniStrCpy(tmp, sizeof(tmp), filename);
\r
6148 b = ReadDumpW(tmp);
\r
6151 MsgBox(hWnd, MB_ICONSTOP, _UU("CM_FAILED_TO_OPEN_FILE"));
\r
6155 t = CiCfgToAccount(b);
\r
6159 MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("CM_ACCOUNT_PARSE_FAILED"));
\r
6165 // すでに同一名が存在する場合は削除する
\r
6166 if (LvSearchStr(hWnd, L_ACCOUNT, 0, t->ClientOption->AccountName) != INFINITE)
\r
6168 RPC_CLIENT_DELETE_ACCOUNT d;
\r
6169 RPC_CLIENT_GET_ACCOUNT get;
\r
6170 HWND h = cm->hEasyWnd == NULL ? hWnd : cm->hEasyWnd;
\r
6172 Zero(&d, sizeof(d));
\r
6173 UniStrCpy(d.AccountName, sizeof(d.AccountName), t->ClientOption->AccountName);
\r
6175 Zero(&get, sizeof(get));
\r
6176 UniStrCpy(get.AccountName, sizeof(get.AccountName), t->ClientOption->AccountName);
\r
6177 if (CcGetAccount(cm->Client, &get) == ERR_NO_ERROR)
\r
6179 // すでに存在する同一名のアカウント情報を取得して
\r
6180 // クライアントオプションのうちいくつかの情報を継承する
\r
6181 if (get.ClientOption != NULL && get.ClientAuth != NULL)
\r
6183 CLIENT_OPTION *old_option = get.ClientOption;
\r
6184 CLIENT_AUTH *old_auth = get.ClientAuth;
\r
6187 t->ClientOption->ProxyType = old_option->ProxyType;
\r
6188 StrCpy(t->ClientOption->ProxyName, sizeof(t->ClientOption->ProxyName),
\r
6189 old_option->ProxyName);
\r
6190 t->ClientOption->ProxyPort = old_option->ProxyPort;
\r
6191 StrCpy(t->ClientOption->ProxyUsername, sizeof(t->ClientOption->ProxyUsername),
\r
6192 old_option->ProxyUsername);
\r
6193 StrCpy(t->ClientOption->ProxyPassword, sizeof(t->ClientOption->ProxyPassword),
\r
6194 old_option->ProxyPassword);
\r
6195 t->ClientOption->NumRetry = old_option->NumRetry;
\r
6196 t->ClientOption->RetryInterval = old_option->RetryInterval;
\r
6197 t->ClientOption->MaxConnection = old_option->MaxConnection;
\r
6198 t->ClientOption->UseEncrypt = old_option->UseEncrypt;
\r
6199 t->ClientOption->UseCompress = old_option->UseCompress;
\r
6200 t->ClientOption->HalfConnection = old_option->HalfConnection;
\r
6201 t->ClientOption->NoRoutingTracking = old_option->NoRoutingTracking;
\r
6202 StrCpy(t->ClientOption->DeviceName, sizeof(t->ClientOption->DeviceName),
\r
6203 old_option->DeviceName);
\r
6204 t->ClientOption->AdditionalConnectionInterval = old_option->AdditionalConnectionInterval;
\r
6205 t->ClientOption->ConnectionDisconnectSpan = old_option->ConnectionDisconnectSpan;
\r
6206 t->ClientOption->HideStatusWindow = old_option->HideStatusWindow;
\r
6207 t->ClientOption->RequireMonitorMode = old_option->RequireMonitorMode;
\r
6208 t->ClientOption->RequireBridgeRoutingMode = old_option->RequireBridgeRoutingMode;
\r
6209 t->ClientOption->DisableQoS = old_option->DisableQoS;
\r
6210 t->ClientOption->NoTls1 = old_option->NoTls1;
\r
6213 CiFreeClientAuth(t->ClientAuth);
\r
6214 t->ClientAuth = CopyClientAuth(old_auth);
\r
6217 t->StartupAccount = get.StartupAccount;
\r
6218 t->CheckServerCert = get.CheckServerCert;
\r
6219 if (t->ServerCert != NULL)
\r
6221 FreeX(t->ServerCert);
\r
6223 t->ServerCert = NULL;
\r
6224 if (get.ServerCert != NULL)
\r
6226 t->ServerCert = CloneX(get.ServerCert);
\r
6228 Copy(t->ShortcutKey, get.ShortcutKey, sizeof(t->ShortcutKey));
\r
6231 CiFreeClientGetAccount(&get);
\r
6234 if (CALL(h, CcDeleteAccount(cm->Client, &d)) == false)
\r
6236 CiFreeClientCreateAccount(t);
\r
6241 CmRefreshAccountList(hWnd);
\r
6245 CmGenerateImportName(hWnd, name, sizeof(name), t->ClientOption->AccountName);
\r
6246 UniStrCpy(t->ClientOption->AccountName, sizeof(t->ClientOption->AccountName), name);
\r
6250 t->ClientOption->FromAdminPack = true;
\r
6253 CALL(hWnd, CcCreateAccount(cm->Client, t));
\r
6255 CiFreeClientCreateAccount(t);
\r
6263 CmConnect(hWnd, name);
\r
6266 //MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("CM_IMPORT_MESSAGE"), filename, name);
\r
6270 void CmImportAccount(HWND hWnd)
\r
6272 wchar_t *filename;
\r
6273 wchar_t tmp[MAX_SIZE];
\r
6281 filename = OpenDlg(hWnd, _UU("CM_ACCOUNT_SETTING_FILE"), _UU("CM_ACCOUNT_OPEN_TITLE"));
\r
6282 if (filename == NULL)
\r
6287 UniStrCpy(tmp, sizeof(tmp), filename);
\r
6290 CmImportAccountMain(hWnd, tmp);
\r
6294 void CmCopyAccount(HWND hWnd, wchar_t *account_name)
\r
6296 wchar_t tmp[MAX_SIZE];
\r
6298 RPC_CLIENT_CREATE_ACCOUNT c;
\r
6300 if (hWnd == NULL || account_name == NULL)
\r
6305 CmGenerateCopyName(hWnd, tmp, sizeof(tmp), account_name);
\r
6308 a = CmGetExistAccountObject(hWnd, account_name);
\r
6315 UniStrCpy(a->ClientOption->AccountName, sizeof(a->ClientOption->AccountName), tmp);
\r
6318 Zero(&c, sizeof(c));
\r
6319 c.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
6320 Copy(c.ClientOption, a->ClientOption, sizeof(CLIENT_OPTION));
\r
6321 c.ClientAuth = CopyClientAuth(a->ClientAuth);
\r
6322 if (a->ServerCert)
\r
6324 c.ServerCert = CloneX(a->ServerCert);
\r
6326 c.CheckServerCert = a->CheckServerCert;
\r
6327 c.StartupAccount = false; // スタートアップ属性はコピーしない
\r
6329 CALL(hWnd, CcCreateAccount(cm->Client, &c));
\r
6330 CiFreeClientCreateAccount(&c);
\r
6332 CmFreeAccountObject(hWnd, a);
\r
6335 // 仮想 LAN カード名ダイアログ更新
\r
6336 void CmNewVLanDlgUpdate(HWND hWnd)
\r
6339 char tmp[MAX_SIZE];
\r
6346 GetTxtA(hWnd, E_NAME, tmp, sizeof(tmp));
\r
6347 if (IsSafeStr(tmp) == false)
\r
6352 if (StrLen(tmp) == 0)
\r
6357 SetEnable(hWnd, IDOK, ok);
\r
6360 // 仮想 LAN カード名決定ダイアログプロシージャ
\r
6361 UINT CmNewVLanDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
6363 char *tmp = (char *)param;
\r
6372 case WM_INITDIALOG:
\r
6373 LimitText(hWnd, E_NAME, cm->Client->Win9x ? MAX_DEVICE_NAME_LEN_9X : MAX_DEVICE_NAME_LEN);
\r
6374 FormatText(hWnd, S_INFO, cm->Client->Win9x ? MAX_DEVICE_NAME_LEN_9X : MAX_DEVICE_NAME_LEN);
\r
6375 CmNewVLanDlgUpdate(hWnd);
\r
6382 if (cm->Client->Win9x)
\r
6384 // Windows 9x の場合、確認メッセージを出す
\r
6385 if (MsgBox(hWnd, MB_ICONQUESTION | MB_OKCANCEL, _UU("CM_9X_VLAN_INSTALL")) == IDCANCEL)
\r
6390 GetTxtA(hWnd, E_NAME, tmp, (cm->Client->Win9x ? MAX_DEVICE_NAME_LEN_9X : MAX_DEVICE_NAME_LEN) + 1);
\r
6392 EndDialog(hWnd, true);
\r
6398 switch (LOWORD(wParam))
\r
6401 CmNewVLanDlgUpdate(hWnd);
\r
6404 case R_USE_DISCONNECT:
\r
6405 if (IsChecked(hWnd, R_USE_DISCONNECT))
\r
6407 FocusEx(hWnd, E_DISCONNECT_SPAN);
\r
6414 EndDialog(hWnd, false);
\r
6421 // 新しい仮想 LAN カード名を決定するダイアログ
\r
6422 char *CmNewVLanDlg(HWND hWnd)
\r
6424 char tmp[MAX_DEVICE_NAME_LEN + 1];
\r
6426 if (Dialog(hWnd, D_CM_NEW_VLAN, CmNewVLanDlgProc, tmp) == false)
\r
6431 return CopyStr(tmp);
\r
6435 void CmDetailDlgUpdate(HWND hWnd, CM_ACCOUNT *a)
\r
6440 if (hWnd == NULL || a == NULL)
\r
6445 locked = a->LockMode;
\r
6447 if (a->LinkMode || a->NatMode)
\r
6449 Disable(hWnd, R_NO_ROUTING);
\r
6453 if (cm->Client->Unix)
\r
6455 Disable(hWnd, R_NO_ROUTING);
\r
6459 SetEnable(hWnd, E_DISCONNECT_SPAN, IsChecked(hWnd, R_USE_DISCONNECT));
\r
6461 SetEnable(hWnd, IDOK, ok);
\r
6465 Disable(hWnd, C_NUM_TCP);
\r
6466 Disable(hWnd, S_STATIC5);
\r
6467 Disable(hWnd, S_STATIC8);
\r
6468 Disable(hWnd, E_INTERVAL);
\r
6469 Disable(hWnd, S_STATIC9);
\r
6470 Disable(hWnd, E_DISCONNECT_SPAN);
\r
6471 Disable(hWnd, S_STATIC10);
\r
6472 Disable(hWnd, S_STATIC11);
\r
6473 Disable(hWnd, R_USE_DISCONNECT);
\r
6474 Disable(hWnd, R_USE_HALF_CONNECTION);
\r
6475 Disable(hWnd, R_DISABLE_QOS);
\r
6476 Disable(hWnd, R_USE_ENCRYPT);
\r
6477 Disable(hWnd, R_USE_COMPRESS);
\r
6478 Disable(hWnd, R_BRIDGE);
\r
6479 Disable(hWnd, R_MONITOR);
\r
6480 Disable(hWnd, R_NO_ROUTING);
\r
6484 // 詳細設定ダイアログプロシージャ
\r
6485 UINT CmDetailDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
6487 CM_ACCOUNT *a = (CM_ACCOUNT *)param;
\r
6490 wchar_t tmp[MAX_SIZE];
\r
6499 case WM_INITDIALOG:
\r
6501 for (i = 1;i <= MAX_TCP_CONNECTION;i++)
\r
6503 UniFormat(tmp, sizeof(tmp), L"%u", i);
\r
6504 CbAddStr(hWnd, C_NUM_TCP, tmp, i);
\r
6506 CbSelect(hWnd, C_NUM_TCP, a->ClientOption->MaxConnection);
\r
6509 SetInt(hWnd, E_INTERVAL, a->ClientOption->AdditionalConnectionInterval);
\r
6512 SetIntEx(hWnd, E_DISCONNECT_SPAN, a->ClientOption->ConnectionDisconnectSpan);
\r
6513 Check(hWnd, R_USE_DISCONNECT, a->ClientOption->ConnectionDisconnectSpan != 0);
\r
6514 Check(hWnd, R_USE_HALF_CONNECTION, a->ClientOption->HalfConnection);
\r
6515 Check(hWnd, R_USE_ENCRYPT, a->ClientOption->UseEncrypt);
\r
6516 Check(hWnd, R_USE_COMPRESS, a->ClientOption->UseCompress);
\r
6517 Check(hWnd, R_NO_ROUTING, a->ClientOption->NoRoutingTracking);
\r
6518 Check(hWnd, R_DISABLE_QOS, a->ClientOption->DisableQoS);
\r
6521 if (a->LinkMode == false)
\r
6523 Check(hWnd, R_BRIDGE, a->ClientOption->RequireBridgeRoutingMode);
\r
6524 Check(hWnd, R_MONITOR, a->ClientOption->RequireMonitorMode);
\r
6528 Check(hWnd, R_BRIDGE, true);
\r
6529 Check(hWnd, R_MONITOR, false);
\r
6531 SetText(hWnd, S_MODE, _UU("CM_DETAIL_MODE_LINK_STR"));
\r
6532 Disable(hWnd, R_BRIDGE);
\r
6533 Disable(hWnd, R_MONITOR);
\r
6536 CmDetailDlgUpdate(hWnd, a);
\r
6537 Focus(hWnd, IDOK);
\r
6543 if (IsChecked(hWnd, R_USE_DISCONNECT) && GetInt(hWnd, E_DISCONNECT_SPAN) == 0)
\r
6545 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_NO_DISCONNECT_SPAN"));
\r
6546 FocusEx(hWnd, E_DISCONNECT_SPAN);
\r
6549 num = GetInt(hWnd, C_NUM_TCP);
\r
6554 if (num == 1 && IsChecked(hWnd, R_USE_HALF_CONNECTION))
\r
6556 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_HALF_MSG"));
\r
6557 Focus(hWnd, C_NUM_TCP);
\r
6560 if (GetInt(hWnd, E_INTERVAL) < 1)
\r
6562 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_TOO_SMALL_INTERVAL"));
\r
6563 Focus(hWnd, E_INTERVAL);
\r
6567 a->ClientOption->MaxConnection = num;
\r
6568 a->ClientOption->AdditionalConnectionInterval = GetInt(hWnd, E_INTERVAL);
\r
6569 if (IsChecked(hWnd, R_USE_DISCONNECT) == false)
\r
6571 a->ClientOption->ConnectionDisconnectSpan = 0;
\r
6575 a->ClientOption->ConnectionDisconnectSpan = GetInt(hWnd, E_DISCONNECT_SPAN);
\r
6577 a->ClientOption->HalfConnection = IsChecked(hWnd, R_USE_HALF_CONNECTION);
\r
6578 a->ClientOption->UseEncrypt = IsChecked(hWnd, R_USE_ENCRYPT);
\r
6579 a->ClientOption->UseCompress = IsChecked(hWnd, R_USE_COMPRESS);
\r
6580 a->ClientOption->NoRoutingTracking = IsChecked(hWnd, R_NO_ROUTING);
\r
6581 a->ClientOption->DisableQoS = IsChecked(hWnd, R_DISABLE_QOS);
\r
6585 a->ClientOption->RequireBridgeRoutingMode = true;
\r
6586 a->ClientOption->RequireMonitorMode = false;
\r
6590 a->ClientOption->RequireBridgeRoutingMode = IsChecked(hWnd, R_BRIDGE);
\r
6591 a->ClientOption->RequireMonitorMode = IsChecked(hWnd, R_MONITOR);
\r
6594 EndDialog(hWnd, true);
\r
6601 switch (LOWORD(wParam))
\r
6605 case E_DISCONNECT_SPAN:
\r
6606 case R_USE_DISCONNECT:
\r
6607 case R_USE_HALF_CONNECTION:
\r
6608 CmDetailDlgUpdate(hWnd, a);
\r
6613 EndDialog(hWnd, false);
\r
6621 bool CmDetailDlg(HWND hWnd, CM_ACCOUNT *a)
\r
6624 if (hWnd == NULL || a == NULL)
\r
6629 return Dialog(hWnd, D_CM_DETAIL, CmDetailDlgProc, a);
\r
6632 // アカウント編集ダイアログプロシージャ更新
\r
6633 void CmEditAccountDlgUpdate(HWND hWnd, CM_ACCOUNT *a)
\r
6636 char str[MAX_SIZE];
\r
6639 if (hWnd == NULL || a == NULL)
\r
6644 locked = a->LockMode;
\r
6646 if (a->Inited == false)
\r
6653 Disable(hWnd, E_ACCOUNT_NAME);
\r
6657 GetTxt(hWnd, E_ACCOUNT_NAME, a->ClientOption->AccountName, sizeof(a->ClientOption->AccountName));
\r
6658 UniTrim(a->ClientOption->AccountName);
\r
6661 GetTxtA(hWnd, E_HOSTNAME, a->ClientOption->Hostname, sizeof(a->ClientOption->Hostname));
\r
6662 Trim(a->ClientOption->Hostname);
\r
6665 a->ClientOption->Port = GetInt(hWnd, C_PORT);
\r
6668 GetTxtA(hWnd,C_HUBNAME, a->ClientOption->HubName, sizeof(a->ClientOption->HubName));
\r
6671 a->ClientOption->ProxyType = PROXY_DIRECT;
\r
6672 if (IsChecked(hWnd, R_HTTPS))
\r
6674 a->ClientOption->ProxyType = PROXY_HTTP;
\r
6676 if (IsChecked(hWnd, R_SOCKS))
\r
6678 a->ClientOption->ProxyType = PROXY_SOCKS;
\r
6682 a->CheckServerCert = IsChecked(hWnd, R_CHECK_CERT);
\r
6686 Disable(hWnd, R_CHECK_CERT);
\r
6687 Disable(hWnd, B_TRUST);
\r
6690 if (a->HideTrustCert)
\r
6692 Disable(hWnd, B_TRUST);
\r
6696 StrCpy(a->ClientOption->DeviceName, sizeof(a->ClientOption->DeviceName), "");
\r
6697 if (LvIsSelected(hWnd, L_VLAN))
\r
6699 wchar_t *s = LvGetStr(hWnd, L_VLAN, LvGetSelected(hWnd, L_VLAN), 0);
\r
6702 char str[MAX_SIZE];
\r
6703 UniToStr(str, sizeof(str), s);
\r
6704 CmPrintNameToVLanName(a->ClientOption->DeviceName, sizeof(a->ClientOption->DeviceName), str);
\r
6710 a->ClientAuth->AuthType = CbGetSelect(hWnd, C_TYPE);
\r
6711 GetTxtA(hWnd, E_USERNAME, a->ClientAuth->Username, sizeof(a->ClientAuth->Username));
\r
6712 Trim(a->ClientAuth->Username);
\r
6713 switch (a->ClientAuth->AuthType)
\r
6715 case CLIENT_AUTHTYPE_PASSWORD:
\r
6717 GetTxtA(hWnd, E_PASSWORD, str, sizeof(str));
\r
6718 if (StrCmp(str, HIDDEN_PASSWORD) != 0)
\r
6720 HashPassword(a->ClientAuth->HashedPassword, a->ClientAuth->Username, str);
\r
6723 case CLIENT_AUTHTYPE_PLAIN_PASSWORD:
\r
6725 GetTxtA(hWnd, E_PASSWORD, str, sizeof(str));
\r
6726 if (StrCmp(str, HIDDEN_PASSWORD) != 0)
\r
6728 StrCpy(a->ClientAuth->PlainPassword, sizeof(a->ClientAuth->PlainPassword), str);
\r
6734 if ((a->LinkMode || a->NatMode) || a->ClientAuth->AuthType == CLIENT_AUTHTYPE_SECURE)
\r
6736 Disable(hWnd, R_RETRY);
\r
6740 Enable(hWnd, R_RETRY);
\r
6743 if (IsChecked(hWnd, R_RETRY) == false)
\r
6745 a->ClientOption->NumRetry = 0;
\r
6749 if (IsChecked(hWnd, R_INFINITE))
\r
6751 a->ClientOption->NumRetry = INFINITE;
\r
6755 a->ClientOption->NumRetry = GetInt(hWnd, E_RETRY_NUM);
\r
6758 a->ClientOption->RetryInterval = GetInt(hWnd, E_RETRY_SPAN);
\r
6760 a->ClientOption->NoTls1 = IsChecked(hWnd, R_NOTLS1);
\r
6763 if (UniStrLen(a->ClientOption->AccountName) == 0 && a->NatMode == false)
\r
6767 if (StrLen(a->ClientOption->Hostname) == 0)
\r
6771 if (a->ClientOption->Port == 0 || a->ClientOption->Port >= 65536)
\r
6775 if (StrLen(a->ClientOption->HubName) == 0)
\r
6779 if (StrLen(a->ClientAuth->Username) == 0)
\r
6783 if (a->ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
\r
6785 if (a->ClientAuth->ClientK == NULL || a->ClientAuth->ClientX == NULL)
\r
6790 if (a->ClientAuth->AuthType == CLIENT_AUTHTYPE_SECURE)
\r
6792 if (IsEmptyStr(a->ClientAuth->SecurePrivateKeyName) || IsEmptyStr(a->ClientAuth->SecurePublicCertName))
\r
6799 if (IsChecked(hWnd, R_RETRY) && IsEnable(hWnd, R_RETRY))
\r
6801 if (a->LinkMode == false && a->NatMode == false)
\r
6803 Enable(hWnd, R_INFINITE);
\r
6804 Enable(hWnd, E_RETRY_SPAN);
\r
6805 Enable(hWnd, S_RETRY_SPAN_1);
\r
6806 Enable(hWnd, S_RETRY_SPAN_2);
\r
6810 Disable(hWnd, R_INFINITE);
\r
6811 Disable(hWnd, E_RETRY_SPAN);
\r
6812 Disable(hWnd, S_RETRY_SPAN_1);
\r
6813 Disable(hWnd, S_RETRY_SPAN_2);
\r
6815 if (IsChecked(hWnd, R_INFINITE) == false)
\r
6817 Enable(hWnd, E_RETRY_NUM);
\r
6818 Enable(hWnd, S_RETRY_NUM_1);
\r
6819 Enable(hWnd, S_RETRY_NUM_2);
\r
6820 if (GetInt(hWnd, E_RETRY_NUM) == 0)
\r
6827 Disable(hWnd, E_RETRY_NUM);
\r
6828 Disable(hWnd, S_RETRY_NUM_1);
\r
6829 Disable(hWnd, S_RETRY_NUM_2);
\r
6834 Disable(hWnd, E_RETRY_NUM);
\r
6835 Disable(hWnd, E_RETRY_SPAN);
\r
6836 Disable(hWnd, R_INFINITE);
\r
6837 Disable(hWnd, S_RETRY_NUM_1);
\r
6838 Disable(hWnd, S_RETRY_NUM_2);
\r
6839 Disable(hWnd, S_RETRY_SPAN_1);
\r
6840 Disable(hWnd, S_RETRY_SPAN_2);
\r
6843 if (a->NatMode == false)
\r
6845 if (a->ServerCert == NULL)
\r
6847 SetText(hWnd, B_SERVER_CERT, _UU("CM_SERVER_CERT_1"));
\r
6848 Disable(hWnd, B_VIEW_SERVER_CERT);
\r
6852 SetText(hWnd, B_SERVER_CERT, _UU("CM_SERVER_CERT_2"));
\r
6853 Enable(hWnd, B_VIEW_SERVER_CERT);
\r
6858 Disable(hWnd, B_VIEW_SERVER_CERT);
\r
6859 Disable(hWnd, B_SERVER_CERT);
\r
6862 if (a->ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT || a->ClientAuth->AuthType == CLIENT_AUTHTYPE_SECURE)
\r
6864 wchar_t tmp[MAX_SIZE * 2];
\r
6865 wchar_t issuer[MAX_SIZE];
\r
6866 wchar_t subject[MAX_SIZE];
\r
6867 wchar_t expires[MAX_SIZE];
\r
6869 SetIcon(hWnd, S_CERT, (a->ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT) ? ICO_CERT : ICO_SECURE);
\r
6871 Hide(hWnd, S_PASSWORD);
\r
6872 Hide(hWnd, E_PASSWORD);
\r
6873 if (a->ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
\r
6875 if (a->ClientAuth->ClientX != NULL)
\r
6877 Enable(hWnd, B_VIEW_CLIENT_CERT);
\r
6878 SetText(hWnd, B_REGIST_CLIENT_CERT, _UU("CM_CLIENT_CERT_2"));
\r
6879 GetPrintNameFromName(issuer, sizeof(issuer), a->ClientAuth->ClientX->issuer_name);
\r
6880 GetPrintNameFromName(subject, sizeof(subject), a->ClientAuth->ClientX->subject_name);
\r
6881 GetDateStrEx64(expires, sizeof(expires), SystemToLocal64(a->ClientAuth->ClientX->notAfter), NULL);
\r
6882 UniFormat(tmp, sizeof(tmp), _UU("CM_CERT_INFO"), subject, issuer, expires);
\r
6886 Disable(hWnd, B_VIEW_CLIENT_CERT);
\r
6887 SetText(hWnd, B_REGIST_CLIENT_CERT, _UU("CM_CLIENT_CERT_1"));
\r
6888 UniStrCpy(tmp, sizeof(tmp), _UU("CM_NO_CERT"));
\r
6890 SetText(hWnd, B_VIEW_CLIENT_CERT, _UU("CM_VIEW_CLIENT_CERT"));
\r
6892 Enable(hWnd, B_REGIST_CLIENT_CERT);
\r
6896 if (IsEmptyStr(a->ClientAuth->SecurePrivateKeyName) || IsEmptyStr(a->ClientAuth->SecurePublicCertName))
\r
6898 UniStrCpy(tmp, sizeof(tmp), _UU("CM_NO_SECURE"));
\r
6902 UniFormat(tmp, sizeof(tmp), _UU("CM_CERT_SECURE_INFO"),
\r
6903 a->ClientAuth->SecurePublicCertName, a->ClientAuth->SecurePrivateKeyName);
\r
6906 SetText(hWnd, B_VIEW_CLIENT_CERT, _UU("CM_SELECT_SECURE_DEVICE"));
\r
6907 SetText(hWnd, B_REGIST_CLIENT_CERT, _UU("CM_SELECT_CERT_INCARD"));
\r
6908 Enable(hWnd, B_VIEW_CLIENT_CERT);
\r
6910 if (SmGetCurrentSecureIdFromReg() == 0)
\r
6912 Disable(hWnd, B_REGIST_CLIENT_CERT);
\r
6916 Enable(hWnd, B_REGIST_CLIENT_CERT);
\r
6919 SetText(hWnd, S_CERT_INFO, tmp);
\r
6920 Show(hWnd, S_CERT);
\r
6921 Show(hWnd, S_CERT_INFO);
\r
6922 Show(hWnd, B_VIEW_CLIENT_CERT);
\r
6923 Show(hWnd, B_REGIST_CLIENT_CERT);
\r
6927 if (a->ClientAuth->AuthType == CLIENT_AUTHTYPE_ANONYMOUS)
\r
6929 Hide(hWnd, S_PASSWORD);
\r
6930 Hide(hWnd, E_PASSWORD);
\r
6934 Show(hWnd, S_PASSWORD);
\r
6935 Show(hWnd, E_PASSWORD);
\r
6937 Hide(hWnd, S_CERT);
\r
6938 Hide(hWnd, S_CERT_INFO);
\r
6939 Hide(hWnd, B_VIEW_CLIENT_CERT);
\r
6940 Hide(hWnd, B_REGIST_CLIENT_CERT);
\r
6943 if (a->ClientOption->ProxyType != PROXY_DIRECT)
\r
6945 Enable(hWnd, B_PROXY_CONFIG);
\r
6946 if (StrLen(a->ClientOption->ProxyName) == 0)
\r
6950 if (a->ClientOption->ProxyPort == 0)
\r
6957 Disable(hWnd, B_PROXY_CONFIG);
\r
6960 if (a->ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)
\r
6969 if (a->LinkMode == false && a->NatMode == false)
\r
6971 SetEnable(hWnd, B_CHANGE_PASSWORD, b);
\r
6972 SetEnable(hWnd, S_CHANGE_PASSWORD, b);
\r
6973 Show(hWnd, B_CHANGE_PASSWORD);
\r
6974 Show(hWnd, S_CHANGE_PASSWORD);
\r
6978 Hide(hWnd, B_CHANGE_PASSWORD);
\r
6979 Hide(hWnd, S_CHANGE_PASSWORD);
\r
6984 Hide(hWnd, B_CHANGE_PASSWORD);
\r
6985 Hide(hWnd, S_CHANGE_PASSWORD);
\r
6988 if ((StrLen(a->ClientOption->DeviceName) == 0) && (a->LinkMode == false && a->NatMode == false))
\r
6993 if (a->LinkMode || a->NatMode)
\r
6995 Disable(hWnd, L_VLAN);
\r
6998 if (a->EditMode == false)
\r
7000 char tmp[MAX_SIZE];
\r
7001 GetTxtA(hWnd, E_HOSTNAME, tmp, sizeof(tmp));
\r
7004 if (StartWith(tmp, "127.") || (StrCmpi(tmp, "localhost") == 0))
\r
7006 if (a->Flag1 == false)
\r
7009 a->ClientOption->UseEncrypt = a->ClientOption->UseCompress = false;
\r
7010 a->ClientOption->MaxConnection = 1;
\r
7015 a->ClientOption->HideStatusWindow = IsChecked(hWnd, R_HIDE);
\r
7016 a->ClientOption->HideNicInfoWindow = IsChecked(hWnd, R_HIDE2);
\r
7020 SetEnable(hWnd, E_HOSTNAME, false);
\r
7021 SetEnable(hWnd, C_PORT, false);
\r
7022 SetEnable(hWnd, C_HUBNAME, false);
\r
7023 SetEnable(hWnd, S_STATIC2, false);
\r
7024 SetEnable(hWnd, S_STATIC3, false);
\r
7025 SetEnable(hWnd, S_STATIC4, false);
\r
7026 SetEnable(hWnd, S_STATIC5, false);
\r
7027 SetEnable(hWnd, S_STATIC66, false);
\r
7028 SetEnable(hWnd, S_STATIC7, false);
\r
7029 SetEnable(hWnd, S_STATIC11, false);
\r
7030 SetEnable(hWnd, R_CHECK_CERT, false);
\r
7031 SetEnable(hWnd, B_TRUST, false);
\r
7032 SetEnable(hWnd, B_SERVER_CERT, false);
\r
7033 SetEnable(hWnd, B_VIEW_SERVER_CERT, false);
\r
7034 SetEnable(hWnd, R_RETRY, false);
\r
7035 SetEnable(hWnd, S_RETRY_NUM_1, false);
\r
7036 SetEnable(hWnd, E_RETRY_NUM, false);
\r
7037 SetEnable(hWnd, S_RETRY_NUM_2, false);
\r
7038 SetEnable(hWnd, S_RETRY_SPAN_1, false);
\r
7039 SetEnable(hWnd, E_RETRY_SPAN, false);
\r
7040 SetEnable(hWnd, S_RETRY_SPAN_2, false);
\r
7041 SetEnable(hWnd, R_INFINITE, false);
\r
7044 SetEnable(hWnd, IDOK, ok);
\r
7047 // アカウント編集ダイアログ初期化
\r
7048 void CmEditAccountDlgInit(HWND hWnd, CM_ACCOUNT *a)
\r
7050 RPC_CLIENT_ENUM_VLAN v;
\r
7053 if (hWnd == NULL || a == NULL)
\r
7060 SetText(hWnd, S_STATIC1, _UU("CM_EASY_ACCOUNT_WARNING"));
\r
7064 if (a->EditMode || a->NatMode)
\r
7066 Disable(hWnd, E_ACCOUNT_NAME);
\r
7069 if (a->NatMode || a->LinkMode)
\r
7071 Hide(hWnd, R_HIDE);
\r
7072 Hide(hWnd, R_HIDE2);
\r
7075 Check(hWnd, R_HIDE, a->ClientOption->HideStatusWindow);
\r
7076 Check(hWnd, R_HIDE2, a->ClientOption->HideNicInfoWindow);
\r
7080 Hide(hWnd, E_ACCOUNT_NAME);
\r
7081 Hide(hWnd, S_ACCOUNT_NAME);
\r
7084 if ((cm != NULL && cm->server_name != NULL) || a->LinkMode)
\r
7089 SetText(hWnd, E_ACCOUNT_NAME, a->ClientOption->AccountName);
\r
7092 SetTextA(hWnd, E_HOSTNAME, a->ClientOption->Hostname);
\r
7093 StrCpy(a->old_server_name, sizeof(a->old_server_name), a->ClientOption->Hostname);
\r
7096 CbSetHeight(hWnd, C_PORT, 18);
\r
7097 CbAddStr(hWnd, C_PORT, _UU("CM_PORT_4"), 0);
\r
7098 CbAddStr(hWnd, C_PORT, _UU("CM_PORT_1"), 0);
\r
7099 CbAddStr(hWnd, C_PORT, _UU("CM_PORT_2"), 0);
\r
7100 CbAddStr(hWnd, C_PORT, _UU("CM_PORT_3"), 0);
\r
7101 SetInt(hWnd, C_PORT, a->ClientOption->Port);
\r
7104 CbSetHeight(hWnd, C_HUBNAME, 18);
\r
7105 SetTextA(hWnd, C_HUBNAME, a->ClientOption->HubName);
\r
7108 Check(hWnd, R_DIRECT_TCP, a->ClientOption->ProxyType == PROXY_DIRECT);
\r
7109 Check(hWnd, R_HTTPS, a->ClientOption->ProxyType == PROXY_HTTP);
\r
7110 Check(hWnd, R_SOCKS, a->ClientOption->ProxyType == PROXY_SOCKS);
\r
7113 Check(hWnd, R_CHECK_CERT, a->CheckServerCert);
\r
7116 if (a->NatMode == false && a->LinkMode == false)
\r
7118 Zero(&v, sizeof(v));
\r
7119 CcEnumVLan(cm->Client, &v);
\r
7120 LvInit(hWnd, L_VLAN);
\r
7121 LvInsertColumn(hWnd, L_VLAN, 0, L"DeviceName", 345);
\r
7122 for (i = 0;i < v.NumItem;i++)
\r
7124 wchar_t tmp[MAX_SIZE];
\r
7125 char str[MAX_SIZE];
\r
7126 CmVLanNameToPrintName(str, sizeof(str), v.Items[i]->DeviceName);
\r
7127 StrToUni(tmp, sizeof(tmp), str);
\r
7128 LvInsert(hWnd, L_VLAN, ICO_NIC_ONLINE, NULL, 1, tmp);
\r
7130 // LvAutoSize(hWnd, L_VLAN);
\r
7132 if (v.NumItem == 1)
\r
7134 // 仮想 LAN カードが 1 枚だけのときはそれを最初から選択する
\r
7135 LvSelect(hWnd, L_VLAN, 0);
\r
7138 CiFreeClientEnumVLan(&v);
\r
7142 if (StrLen(a->ClientOption->DeviceName) != 0)
\r
7144 char str[MAX_SIZE];
\r
7145 wchar_t tmp[MAX_SIZE];
\r
7147 CmVLanNameToPrintName(str, sizeof(str), a->ClientOption->DeviceName);
\r
7148 StrToUni(tmp, sizeof(tmp), str);
\r
7149 index = LvSearchStr(hWnd, L_VLAN, 0, tmp);
\r
7150 if (index != INFINITE)
\r
7152 LvSelect(hWnd, L_VLAN, index);
\r
7157 CbSetHeight(hWnd, C_TYPE, 18);
\r
7158 CbAddStr(hWnd, C_TYPE, _UU("PW_TYPE_0"), CLIENT_AUTHTYPE_ANONYMOUS);
\r
7159 CbAddStr(hWnd, C_TYPE, _UU("PW_TYPE_1"), CLIENT_AUTHTYPE_PASSWORD);
\r
7160 CbAddStr(hWnd, C_TYPE, _UU("PW_TYPE_2"), CLIENT_AUTHTYPE_PLAIN_PASSWORD);
\r
7162 if (a->HideClientCertAuth == false)
\r
7164 // HideClientCertAuth が true の場合は証明書認証は利用できない
\r
7165 CbAddStr(hWnd, C_TYPE, _UU("PW_TYPE_3"), CLIENT_AUTHTYPE_CERT);
\r
7168 if (a->HideSecureAuth == false)
\r
7171 CbAddStr(hWnd, C_TYPE, _UU("PW_TYPE_4"), CLIENT_AUTHTYPE_SECURE);
\r
7175 CbSelect(hWnd, C_TYPE, a->ClientAuth->AuthType);
\r
7178 SetTextA(hWnd, E_USERNAME, a->ClientAuth->Username);
\r
7183 SetTextA(hWnd, E_PASSWORD, HIDDEN_PASSWORD);
\r
7187 if (a->ClientOption->NumRetry == 0)
\r
7189 Check(hWnd, R_RETRY, false);
\r
7193 Check(hWnd, R_RETRY, true);
\r
7194 if (a->ClientOption->NumRetry == INFINITE)
\r
7196 Check(hWnd, R_INFINITE, true);
\r
7200 Check(hWnd, R_INFINITE, false);
\r
7201 SetInt(hWnd, E_RETRY_NUM, a->ClientOption->NumRetry);
\r
7204 SetIntEx(hWnd, E_RETRY_SPAN, a->ClientOption->RetryInterval);
\r
7206 Check(hWnd, R_NOTLS1, a->ClientOption->NoTls1);
\r
7209 if (a->NatMode == false)
\r
7211 if (a->EditMode == false)
\r
7213 SetText(hWnd, 0, _UU("CM_ACCOUNT_TITLE_1"));
\r
7214 FocusEx(hWnd, E_ACCOUNT_NAME);
\r
7218 SetText(hWnd, 0, _UU("CM_ACCOUNT_TITLE_2"));
\r
7219 FormatText(hWnd, 0, a->ClientOption->AccountName);
\r
7220 FocusEx(hWnd, E_HOSTNAME);
\r
7225 SetText(hWnd, 0, _UU("NM_ACCOUNT_TITLE"));
\r
7226 FocusEx(hWnd, E_HOSTNAME);
\r
7229 if (a->LinkMode || a->NatMode)
\r
7231 Hide(hWnd, L_VLAN);
\r
7233 if (a->NatMode == false)
\r
7235 SetText(hWnd, S_VLAN_GROUP, _UU("SM_LINK_POLICY_GROUP"));
\r
7236 Show(hWnd, S_POLICY_1);
\r
7237 Show(hWnd, S_POLICY_2);
\r
7238 Show(hWnd, B_POLICY);
\r
7242 Hide(hWnd, S_VLAN_GROUP);
\r
7243 Show(hWnd, S_ROUTER_LOGO);
\r
7249 CmEditAccountDlgUpdate(hWnd, a);
\r
7252 // アカウント編集ダイアログプロシージャ
\r
7253 UINT CmEditAccountDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
7255 CM_ACCOUNT *a = (CM_ACCOUNT *)param;
\r
7267 case WM_INITDIALOG:
\r
7268 CmEditAccountDlgInit(hWnd, a);
\r
7269 if (a->EditMode == false && a->LinkMode == false && a->NatMode == false)
\r
7271 SetTimer(hWnd, 1, 100, NULL);
\r
7279 CM_INTERNET_SETTING s;
\r
7281 KillTimer(hWnd, 1);
\r
7283 Zero(&s, sizeof(s));
\r
7284 CmGetSystemInternetSetting(&s);
\r
7286 if (s.ProxyType != PROXY_DIRECT)
\r
7288 if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO,
\r
7289 _UU("CM_WOULDYOULOAD_IE_PROXY"),
\r
7290 s.ProxyHostName) == IDYES)
\r
7292 Command(hWnd, B_IE);
\r
7300 switch (LOWORD(wParam))
\r
7302 case E_ACCOUNT_NAME:
\r
7306 case R_DIRECT_TCP:
\r
7309 case R_CHECK_CERT:
\r
7315 case E_RETRY_SPAN:
\r
7317 CmEditAccountDlgUpdate(hWnd, a);
\r
7320 switch (HIWORD(wParam))
\r
7322 case EN_KILLFOCUS:
\r
7323 switch (LOWORD(wParam))
\r
7326 CmEditAccountDlgStartEnumHub(hWnd, a);
\r
7330 case BN_KILLFOCUS:
\r
7331 switch (LOWORD(wParam))
\r
7333 case R_DIRECT_TCP:
\r
7336 CmEditAccountDlgStartEnumHub(hWnd, a);
\r
7340 case CBN_KILLFOCUS:
\r
7341 switch (LOWORD(wParam))
\r
7344 CmEditAccountDlgStartEnumHub(hWnd, a);
\r
7349 if (HIWORD(wParam) == 0)
\r
7351 CmEditAccountDlgUpdate(hWnd, a);
\r
7357 if (a->LinkMode || a->NatMode)
\r
7359 a->Policy.Access = true;
\r
7360 a->Policy.MonitorPort = false;
\r
7361 SmPolicyDlgEx2(hWnd, &a->Policy, _UU("SM_LINK_POLICY_CAPTION"), true, a->PolicyVer);
\r
7362 a->Policy.Access = true;
\r
7363 a->Policy.MonitorPort = false;
\r
7367 CmEditAccountDlgUpdate(hWnd, a);
\r
7368 CmEditAccountDlgOnOk(hWnd, a);
\r
7373 case B_PROXY_CONFIG:
\r
7375 if (CmProxyDlg(hWnd, a->ClientOption))
\r
7377 UINT n = GetInt(hWnd, C_PORT);
\r
7378 if (a->ClientOption->ProxyType == PROXY_HTTP &&
\r
7381 // HTTP プロキシ経由の設定になっていて接続先が 443 番ポート
\r
7382 // 以外のポートである場合は警告を表示する
\r
7383 if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("CM_HTTP_PROXY_WARNING"), n) == IDYES)
\r
7385 // ポート番号を 443 に変更する
\r
7386 SetText(hWnd, C_PORT, _UU("CM_PORT_2"));
\r
7389 CmEditAccountDlgStartEnumHub(hWnd, a);
\r
7390 CmEditAccountDlgUpdate(hWnd, a);
\r
7395 if(cm->server_name == NULL)
\r
7397 CmProxyDlgUseForIE(hWnd, a->ClientOption);
\r
7398 CmEditAccountDlgUpdate(hWnd, a);
\r
7399 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_PROXY_FROM_IE"));
\r
7404 if (a->LinkMode == false)
\r
7410 SmCaDlg(hWnd, a->Hub);
\r
7413 case B_SERVER_CERT:
\r
7415 if (a->ServerCert == NULL)
\r
7417 if (CmLoadXFromFileOrSecureCard(hWnd, &x))
\r
7419 a->ServerCert = x;
\r
7420 CmEditAccountDlgUpdate(hWnd, a);
\r
7425 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_DELETE_SERVER_CERT")) == IDYES)
\r
7427 FreeX(a->ServerCert);
\r
7428 a->ServerCert = NULL;
\r
7429 CmEditAccountDlgUpdate(hWnd, a);
\r
7433 case B_VIEW_SERVER_CERT:
\r
7435 if (a->ServerCert != NULL)
\r
7437 X *issuer = CmGetIssuer(a->ServerCert);
\r
7438 CertDlg(hWnd, a->ServerCert, issuer, true);
\r
7442 case B_VIEW_CLIENT_CERT:
\r
7443 if (a->ClientAuth->AuthType != CLIENT_AUTHTYPE_SECURE)
\r
7446 if (a->ClientAuth->ClientX != NULL)
\r
7448 X *issuer = CmGetIssuer(a->ClientAuth->ClientX);
\r
7449 CertDlg(hWnd, a->ClientAuth->ClientX, issuer, true);
\r
7457 SmSelectSecureId(hWnd);
\r
7458 id = SmGetCurrentSecureIdFromReg();
\r
7461 if (cm->server_name == NULL)
\r
7465 Zero(&t, sizeof(t));
\r
7467 CcUseSecure(cm->Client, &t);
\r
7470 CmEditAccountDlgUpdate(hWnd, a);
\r
7473 case B_REGIST_CLIENT_CERT:
\r
7474 if (a->ClientAuth->AuthType != CLIENT_AUTHTYPE_SECURE)
\r
7476 // クライアント証明書登録 / 削除
\r
7477 if (a->ClientAuth->ClientX == NULL)
\r
7479 if (CmLoadXAndK(hWnd, &x, &k))
\r
7481 a->ClientAuth->ClientX = x;
\r
7482 a->ClientAuth->ClientK = k;
\r
7483 CmEditAccountDlgUpdate(hWnd, a);
\r
7488 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_DELETE_CLIENT_CERT")) == IDYES)
\r
7490 FreeX(a->ClientAuth->ClientX);
\r
7491 FreeK(a->ClientAuth->ClientK);
\r
7492 a->ClientAuth->ClientX = NULL;
\r
7493 a->ClientAuth->ClientK = NULL;
\r
7494 CmEditAccountDlgUpdate(hWnd, a);
\r
7500 char cert[MAX_SECURE_DEVICE_FILE_LEN + 1], priv[MAX_SECURE_DEVICE_FILE_LEN + 1];
\r
7503 if (SmSelectKeyPairEx(hWnd, cert, sizeof(cert), priv, sizeof(priv), CmGetSecureBitmapId(a->ClientOption->Hostname)))
\r
7505 StrCpy(a->ClientAuth->SecurePublicCertName, sizeof(a->ClientAuth->SecurePublicCertName), cert);
\r
7506 StrCpy(a->ClientAuth->SecurePrivateKeyName, sizeof(a->ClientAuth->SecurePrivateKeyName), priv);
\r
7507 CmEditAccountDlgUpdate(hWnd, a);
\r
7513 if (CmDetailDlg(hWnd, a))
\r
7515 CmEditAccountDlgUpdate(hWnd, a);
\r
7518 case B_CHANGE_PASSWORD:
\r
7520 CmChangePassword(hWnd, a->ClientOption, a->ClientOption->HubName,
\r
7521 a->ClientAuth->Username);
\r
7526 EndDialog(hWnd, false);
\r
7529 n = (NMHDR *)lParam;
\r
7530 switch (n->idFrom)
\r
7535 case LVN_ITEMCHANGED:
\r
7536 CmEditAccountDlgUpdate(hWnd, a);
\r
7548 void CmProxyDlgUpdate(HWND hWnd, CLIENT_OPTION *a)
\r
7552 if (hWnd == NULL || a == NULL)
\r
7557 if (IsEmpty(hWnd, E_HOSTNAME))
\r
7561 if (GetInt(hWnd, C_PORT) == 0)
\r
7566 SetEnable(hWnd, IDOK, ok);
\r
7569 // プロキシサーバー設定ダイアログc
\r
7570 UINT CmProxyDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
7572 CLIENT_OPTION *a = (CLIENT_OPTION *)param;
\r
7581 case WM_INITDIALOG:
\r
7582 SetTextA(hWnd, E_HOSTNAME, a->ProxyName);
\r
7583 CbSetHeight(hWnd, C_PORT, 18);
\r
7584 CbAddStr(hWnd, C_PORT, L"8080", 0);
\r
7585 CbAddStr(hWnd, C_PORT, L"1080", 0);
\r
7586 CbAddStr(hWnd, C_PORT, L"80", 0);
\r
7587 CbAddStr(hWnd, C_PORT, L"3128", 0);
\r
7588 CbAddStr(hWnd, C_PORT, L"443", 0);
\r
7589 CbAddStr(hWnd, C_PORT, L"9821", 0);
\r
7590 CbAddStr(hWnd, C_PORT, L"9801", 0);
\r
7591 SetIntEx(hWnd, C_PORT, a->ProxyPort);
\r
7592 SetTextA(hWnd, E_USERNAME, a->ProxyUsername);
\r
7593 SetTextA(hWnd, E_PASSWORD, a->ProxyPassword);
\r
7594 if (a->ProxyPort == 0)
\r
7596 if (a->ProxyType == PROXY_HTTP)
\r
7598 SetInt(hWnd, C_PORT, 8080);
\r
7602 SetInt(hWnd, C_PORT, 1080);
\r
7605 CmProxyDlgUpdate(hWnd, a);
\r
7608 switch (LOWORD(wParam))
\r
7614 CmProxyDlgUpdate(hWnd, a);
\r
7621 GetTxtA(hWnd, E_HOSTNAME, a->ProxyName, sizeof(a->ProxyName));
\r
7622 GetTxtA(hWnd, E_USERNAME, a->ProxyUsername, sizeof(a->ProxyUsername));
\r
7623 GetTxtA(hWnd, E_PASSWORD, a->ProxyPassword, sizeof(a->ProxyPassword));
\r
7624 a->ProxyPort = GetInt(hWnd, C_PORT);
\r
7625 EndDialog(hWnd, true);
\r
7633 EndDialog(hWnd, false);
\r
7641 bool CmProxyDlg(HWND hWnd, CLIENT_OPTION *a)
\r
7649 return Dialog(hWnd, D_CM_PROXY, CmProxyDlgProc, a);
\r
7652 // 指定した証明書の署名者がわかれば取得する
\r
7653 X *CmGetIssuer(X *x)
\r
7663 Zero(&a, sizeof(a));
\r
7665 if (CALLEX(cm->hMainWnd, CcGetIssuer(cm->Client, &a)) == 0)
\r
7667 ret = CloneX(a.issuer_x);
\r
7674 CiFreeGetIssuer(&a);
\r
7680 void CmLoadXFromFileOrSecureCardDlgInit(HWND hWnd, CM_LOADX *p)
\r
7684 if (hWnd == NULL || p == NULL)
\r
7689 current = MsRegReadInt(REG_CURRENT_USER, SECURE_MANAGER_KEY, "CertLoadSource");
\r
7691 Check(hWnd, R_FROM_FILE, current == 0);
\r
7692 Check(hWnd, R_FROM_SECURE, current != 0);
\r
7694 SetFont(hWnd, S_INFO, Font(0, true));
\r
7696 CmLoadXFromFileOrSecureCardDlgUpdate(hWnd, p);
\r
7700 void CmLoadXFromFileOrSecureCardDlgUpdate(HWND hWnd, CM_LOADX *p)
\r
7702 SECURE_DEVICE *dev;
\r
7703 wchar_t tmp[MAX_SIZE];
\r
7706 if (hWnd == NULL || p == NULL)
\r
7711 dev = GetSecureDevice(SmGetCurrentSecureIdFromReg());
\r
7714 UniStrCpy(tmp, sizeof(tmp), _UU("SEC_CURRENT_NO_DEVICE"));
\r
7718 UniFormat(tmp, sizeof(tmp), _UU("SEC_CURRENT_DEVICE"), dev->DeviceName);
\r
7721 SetText(hWnd, S_INFO, tmp);
\r
7723 if (IsChecked(hWnd, R_FROM_SECURE))
\r
7731 SetEnable(hWnd, IDOK, ok);
\r
7732 SetEnable(hWnd, B_SELECT, IsChecked(hWnd, R_FROM_SECURE));
\r
7733 SetEnable(hWnd, S_CERT, IsChecked(hWnd, R_FROM_SECURE));
\r
7734 SetEnable(hWnd, S_FILE, IsChecked(hWnd, R_FROM_FILE));
\r
7737 // 証明書読み込み選択ダイアログプロシージャ
\r
7738 UINT CmLoadXFromFileOrSecureCardDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
7740 CM_LOADX *p = (CM_LOADX *)param;
\r
7751 case WM_INITDIALOG:
\r
7752 CmLoadXFromFileOrSecureCardDlgInit(hWnd, p);
\r
7759 current = (IsChecked(hWnd, R_FROM_FILE)) ? 0 : 1;
\r
7760 MsRegWriteInt(REG_CURRENT_USER, SECURE_MANAGER_KEY, "CertLoadSource", current);
\r
7765 if (CmLoadX(hWnd, &x))
\r
7768 EndDialog(hWnd, true);
\r
7774 char name[MAX_SIZE];
\r
7777 if (SmSelectKeyPair(hWnd, name, sizeof(name), NULL, 0))
\r
7780 WINUI_SECURE_BATCH batch[] =
\r
7782 {WINUI_SECURE_READ_CERT, name, true, NULL, NULL, NULL, NULL, NULL, NULL},
\r
7786 if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), SmGetCurrentSecureIdFromReg(), 0))
\r
7789 p->x = batch[0].OutputX;
\r
7790 EndDialog(hWnd, true);
\r
7801 CmLoadXFromFileOrSecureCardDlgUpdate(hWnd, p);
\r
7804 case R_FROM_SECURE:
\r
7805 CmLoadXFromFileOrSecureCardDlgUpdate(hWnd, p);
\r
7809 SmSelectSecureId(hWnd);
\r
7810 CmLoadXFromFileOrSecureCardDlgUpdate(hWnd, p);
\r
7816 EndDialog(hWnd, false);
\r
7823 // 証明書をスマートカードかファイルから読み込む
\r
7824 bool CmLoadXFromFileOrSecureCard(HWND hWnd, X **x)
\r
7833 Zero(&p, sizeof(p));
\r
7834 if (Dialog(hWnd, D_CM_LOAD_X, CmLoadXFromFileOrSecureCardDlgProc, &p) == false)
\r
7845 bool CmLoadX(HWND hWnd, X **x)
\r
7847 return CmLoadXEx(hWnd, x, NULL, 0);
\r
7849 bool CmLoadXEx(HWND hWnd, X **x, char *filename, UINT size)
\r
7851 wchar_t *filename_w = CopyStrToUni(filename);
\r
7854 ret = CmLoadXExW(hWnd, x, filename_w, size);
\r
7860 bool CmLoadXExW(HWND hWnd, X **x, wchar_t *filename, UINT size)
\r
7864 wchar_t tmp[MAX_SIZE];
\r
7873 s = OpenDlg(hWnd, _UU("DLG_CERT_OR_P12_FILTER"), _UU("DLG_OPEN_CERT"));
\r
7878 UniStrCpy(tmp, sizeof(tmp), s);
\r
7879 if (filename != NULL)
\r
7881 UniStrCpy(filename, size, tmp);
\r
7884 if (UniEndWith(tmp, L".p12") || UniEndWith(tmp, L".pfx"))
\r
7896 BUF *b = ReadDumpW(tmp);
\r
7900 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_OPEN_FILE_ERROR_W"), tmp);
\r
7903 p12 = BufToP12(b);
\r
7906 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_P12_W"), tmp);
\r
7910 if (IsEncryptedP12(p12) == false)
\r
7912 if (ParseP12(p12, x, &k, NULL) == false)
\r
7914 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_P12_W"), tmp);
\r
7922 char password[MAX_SIZE];
\r
7923 if (PassphraseDlg(hWnd, password, sizeof(password), b, true) == false)
\r
7931 if (ParseP12(p12, x, &k, password) == false)
\r
7933 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_P12_W"), tmp);
\r
7948 BUF *b = ReadDumpW(tmp);
\r
7952 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_OPEN_FILE_ERROR_W"), tmp);
\r
7956 x509 = BufToX(b, IsBase64(b));
\r
7960 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_X509_W"), tmp);
\r
7970 bool CmLoadK(HWND hWnd, K **k)
\r
7972 return CmLoadKEx(hWnd, k, NULL, 0);
\r
7974 bool CmLoadKEx(HWND hWnd, K **k, char *filename, UINT size)
\r
7976 wchar_t *filename_w = CopyStrToUni(filename);
\r
7979 ret = CmLoadKExW(hWnd, k, filename_w, size);
\r
7985 bool CmLoadKExW(HWND hWnd, K **k, wchar_t *filename, UINT size)
\r
7989 wchar_t tmp[MAX_SIZE];
\r
7997 s = OpenDlg(hWnd, _UU("DLG_KEY_OR_P12_FILTER"), _UU("DLG_OPEN_KEY"));
\r
8002 UniStrCpy(tmp, sizeof(tmp), s);
\r
8004 if (filename != NULL)
\r
8006 UniStrCpy(filename, size, tmp);
\r
8008 if (UniEndWith(tmp, L".p12") || UniEndWith(tmp, L".pfx"))
\r
8020 BUF *b = ReadDumpW(tmp);
\r
8024 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_OPEN_FILE_ERROR_W"), tmp);
\r
8027 p12 = BufToP12(b);
\r
8030 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_P12_W"), tmp);
\r
8034 if (IsEncryptedP12(p12) == false)
\r
8037 if (ParseP12(p12, &x, k, NULL) == false)
\r
8039 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_P12_W"), tmp);
\r
8049 char password[MAX_SIZE];
\r
8050 if (PassphraseDlg(hWnd, password, sizeof(password), b, true) == false)
\r
8059 if (ParseP12(p12, &x, k, password) == false)
\r
8061 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_P12_W"), tmp);
\r
8077 BUF *b = ReadDumpW(tmp);
\r
8081 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_OPEN_FILE_ERROR_W"), tmp);
\r
8085 if (IsEncryptedK(b, true) == false)
\r
8087 key = BufToK(b, true, IsBase64(b), NULL);
\r
8091 char pass[MAX_SIZE];
\r
8092 if (PassphraseDlg(hWnd, pass, sizeof(pass), b, false) == false)
\r
8097 key = BufToK(b, true, IsBase64(b), pass);
\r
8103 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_KEY_W"), tmp);
\r
8113 // 証明書と秘密鍵のセットを読み込む
\r
8114 bool CmLoadXAndK(HWND hWnd, X **x, K **k)
\r
8118 wchar_t tmp[MAX_SIZE];
\r
8120 if (x == NULL || k == NULL)
\r
8127 s = OpenDlg(hWnd, _UU("DLG_CERT_OR_P12_FILTER"), _UU("DLG_OPEN_CERT"));
\r
8132 UniStrCpy(tmp, sizeof(tmp), s);
\r
8134 if (UniEndWith(tmp, L".p12") || UniEndWith(tmp, L".pfx"))
\r
8146 BUF *b = ReadDumpW(tmp);
\r
8150 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_OPEN_FILE_ERROR_W"), tmp);
\r
8153 p12 = BufToP12(b);
\r
8156 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_P12_W"), tmp);
\r
8160 if (IsEncryptedP12(p12) == false)
\r
8162 if (ParseP12(p12, x, k, NULL) == false)
\r
8164 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_P12_W"), tmp);
\r
8172 char password[MAX_SIZE];
\r
8173 if (PassphraseDlg(hWnd, password, sizeof(password), b, true) == false)
\r
8181 if (ParseP12(p12, x, k, password) == false)
\r
8183 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_P12_W"), tmp);
\r
8190 if (CheckXandK(*x, *k) == false)
\r
8196 if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL, _UU("DLG_BAD_SIGNATURE")) == IDRETRY)
\r
8209 BUF *b = ReadDumpW(tmp);
\r
8214 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_OPEN_FILE_ERROR_W"), tmp);
\r
8218 x509 = BufToX(b, IsBase64(b));
\r
8222 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_X509_W"), tmp);
\r
8227 s = OpenDlg(hWnd, _UU("DLG_KEY_FILTER"), _UU("DLG_OPEN_KEY_WITH_CERT"));
\r
8233 UniStrCpy(tmp, sizeof(tmp), s);
\r
8236 b = ReadDumpW(tmp);
\r
8239 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_OPEN_FILE_ERROR_W"), tmp);
\r
8244 if (IsEncryptedK(b, true) == false)
\r
8246 key = BufToK(b, true, IsBase64(b), NULL);
\r
8250 char pass[MAX_SIZE];
\r
8251 if (PassphraseDlg(hWnd, pass, sizeof(pass), b, false) == false)
\r
8257 key = BufToK(b, true, IsBase64(b), pass);
\r
8264 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("DLG_BAD_KEY_W"), tmp);
\r
8268 if (CheckXandK(x509, key) == false)
\r
8273 if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL, _UU("DLG_BAD_SIGNATURE")) == IDRETRY)
\r
8288 void CmEditAccountDlgStartEnumHub(HWND hWnd, CM_ACCOUNT *a)
\r
8290 char server_name[MAX_HOST_NAME_LEN + 1];
\r
8291 UINT old_proxy_type;
\r
8293 if (hWnd == NULL || a == NULL)
\r
8298 if (StrLen(a->ClientOption->Hostname) == 0)
\r
8302 if (a->ClientOption->Port == 0)
\r
8306 if (a->ClientOption->ProxyType != PROXY_DIRECT &&
\r
8307 (StrLen(a->ClientOption->ProxyName) == 0 ||
\r
8308 a->ClientOption->ProxyPort == 0))
\r
8313 if (StrCmpi(server_name, a->old_server_name) == 0)
\r
8315 if (CbNum(hWnd, C_HUBNAME) != 0)
\r
8322 StrCpy(a->old_server_name, sizeof(a->old_server_name), server_name);
\r
8323 CbReset(hWnd, C_HUBNAME);
\r
8326 old_proxy_type = a->ClientOption->ProxyType;
\r
8328 if (IsChecked(hWnd, R_DIRECT_TCP))
\r
8330 a->ClientOption->ProxyType = PROXY_DIRECT;
\r
8332 if (IsChecked(hWnd, R_HTTPS))
\r
8334 a->ClientOption->ProxyType = PROXY_HTTP;
\r
8336 if (IsChecked(hWnd, R_SOCKS))
\r
8338 a->ClientOption->ProxyType = PROXY_SOCKS;
\r
8341 CmEnumHubStart(hWnd, a->ClientOption);
\r
8343 a->ClientOption->ProxyType = old_proxy_type;
\r
8347 void CmEditAccountDlgOnOk(HWND hWnd, CM_ACCOUNT *a)
\r
8349 RPC_CLIENT_CREATE_ACCOUNT c;
\r
8352 if (hWnd == NULL || a == NULL)
\r
8356 if (a->ClientOption->NumRetry != 0 && a->ClientOption->RetryInterval < 5)
\r
8358 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_RETRY_INTERVAL_ERROR"));
\r
8359 FocusEx(hWnd, E_RETRY_SPAN);
\r
8363 CmEditAccountDlgUpdate(hWnd, a);
\r
8365 if (a->LinkMode == false && a->NatMode == false)
\r
8368 Zero(&c, sizeof(c));
\r
8369 c.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
8370 Copy(c.ClientOption, a->ClientOption, sizeof(CLIENT_OPTION));
\r
8371 c.ClientAuth = CopyClientAuth(a->ClientAuth);
\r
8372 c.CheckServerCert = a->CheckServerCert;
\r
8373 if (a->ServerCert != NULL)
\r
8375 c.ServerCert = CloneX(a->ServerCert);
\r
8377 c.StartupAccount = a->Startup;
\r
8379 if (a->EditMode == false)
\r
8381 b = CALL(hWnd, CcCreateAccount(cm->Client, &c));
\r
8385 b = CALL(hWnd, CcSetAccount(cm->Client, &c));
\r
8388 CiFreeClientCreateAccount(&c);
\r
8390 // 現在このアカウントが動作中かどうかチェック
\r
8393 RPC_CLIENT_GET_CONNECTION_STATUS st;
\r
8394 Zero(&st, sizeof(st));
\r
8395 UniStrCpy(st.AccountName, sizeof(st.AccountName), a->ClientOption->AccountName);
\r
8396 if (CALL(hWnd, CcGetAccountStatus(cm->Client, &st)))
\r
8400 MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("CM_CURRENT_ACTIVE"),
\r
8408 EndDialog(hWnd, true);
\r
8416 RPC_CREATE_LINK t;
\r
8418 Zero(&t, sizeof(t));
\r
8419 StrCpy(t.HubName, sizeof(t.HubName), a->Hub->HubName);
\r
8420 t.Online = a->OnlineFlag;
\r
8421 Copy(&t.Policy, &a->Policy, sizeof(POLICY));
\r
8422 t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
8423 Copy(t.ClientOption, a->ClientOption, sizeof(CLIENT_OPTION));
\r
8424 t.ClientAuth = CopyClientAuth(a->ClientAuth);
\r
8425 t.CheckServerCert = a->CheckServerCert;
\r
8426 t.ServerCert = CloneX(a->ServerCert);
\r
8431 if (CALL(hWnd, ScSetLink(a->Hub->Rpc, &t)))
\r
8433 if (a->OnlineFlag)
\r
8435 MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("SM_LINK_SAVE_ONLINE"), a->ClientOption->AccountName);
\r
8437 EndDialog(hWnd, true);
\r
8442 if (CALL(hWnd, ScCreateLink(a->Hub->Rpc, &t)))
\r
8444 if (a->Link_ConnectNow)
\r
8448 Zero(&tt, sizeof(tt));
\r
8449 UniStrCpy(tt.AccountName, sizeof(tt.AccountName), a->ClientOption->AccountName);
\r
8450 StrCpy(tt.HubName, sizeof(tt.HubName), a->Hub->HubName);
\r
8452 CALL(hWnd, ScSetLinkOnline(a->Hub->Rpc, &tt));
\r
8454 EndDialog(hWnd, true);
\r
8458 FreeRpcCreateLink(&t);
\r
8463 RPC_CREATE_LINK t;
\r
8464 Zero(&t, sizeof(t));
\r
8466 t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
8467 Copy(t.ClientOption, a->ClientOption, sizeof(CLIENT_OPTION));
\r
8468 t.ClientAuth = CopyClientAuth(a->ClientAuth);
\r
8470 if (CALL(hWnd, NcSetClientConfig(a->Rpc, &t)))
\r
8472 EndDialog(hWnd, true);
\r
8475 FreeRpcCreateLink(&t);
\r
8480 // アカウント編集ダイアログの表示
\r
8481 bool CmEditAccountDlg(HWND hWnd, CM_ACCOUNT *a)
\r
8484 if (hWnd == NULL || a == NULL)
\r
8489 return Dialog(hWnd, D_CM_ACCOUNT, CmEditAccountDlgProc, a);
\r
8493 void CmEditAccount(HWND hWnd, wchar_t *account_name)
\r
8497 if (hWnd == NULL || account_name == NULL)
\r
8502 a = CmGetExistAccountObject(hWnd, account_name);
\r
8508 CmVoice("input_config");
\r
8509 if (CmEditAccountDlg(hWnd, a))
\r
8511 CmVoice("set_config");
\r
8514 CmFreeAccountObject(hWnd, a);
\r
8518 void CmNewAccount(HWND hWnd)
\r
8521 RPC_CLIENT_ENUM_VLAN t;
\r
8522 UINT num_vlan = 0;
\r
8529 if (IsEnable(hWnd, 0) == false)
\r
8534 Zero(&t, sizeof(t));
\r
8535 if (CcEnumVLan(cm->Client, &t) == ERR_NO_ERROR)
\r
8537 num_vlan = t.NumItem;
\r
8539 CiFreeClientEnumVLan(&t);
\r
8542 if (num_vlan == 0)
\r
8544 if (MsgBox(hWnd, MB_ICONINFORMATION | MB_YESNO, _UU("CM_NO_VLAN")) == IDNO)
\r
8550 if (cm->server_name == NULL)
\r
8552 Command(hWnd, CMD_NEW_VLAN);
\r
8557 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_VLAN_REMOTE_ERROR"));
\r
8563 a = CmCreateNewAccountObject(hWnd);
\r
8569 CmVoice("input_config");
\r
8570 if (CmEditAccountDlg(hWnd, a))
\r
8572 CmVoice("new_config");
\r
8575 CmFreeAccountObject(hWnd, a);
\r
8579 void CmFreeAccountObject(HWND hWnd, CM_ACCOUNT *a)
\r
8582 if (hWnd == NULL || a == NULL)
\r
8587 Free(a->ClientOption);
\r
8588 CiFreeClientAuth(a->ClientAuth);
\r
8589 if (a->ServerCert != NULL)
\r
8591 FreeX(a->ServerCert);
\r
8596 // 既存のアカウントオブジェクトの取得
\r
8597 CM_ACCOUNT *CmGetExistAccountObject(HWND hWnd, wchar_t *account_name)
\r
8599 RPC_CLIENT_GET_ACCOUNT c;
\r
8607 Zero(&c, sizeof(c));
\r
8608 UniStrCpy(c.AccountName, sizeof(c.AccountName), account_name);
\r
8609 if (CALL(hWnd, CcGetAccount(cm->Client, &c)) == false)
\r
8614 a = ZeroMalloc(sizeof(CM_ACCOUNT));
\r
8615 a->EditMode = true;
\r
8616 a->CheckServerCert = c.CheckServerCert;
\r
8617 a->Startup = c.StartupAccount;
\r
8618 if (c.ServerCert != NULL)
\r
8620 a->ServerCert = CloneX(c.ServerCert);
\r
8622 a->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
8623 Copy(a->ClientOption, c.ClientOption, sizeof(CLIENT_OPTION));
\r
8624 a->ClientAuth = CopyClientAuth(c.ClientAuth);
\r
8625 Copy(a->ShortcutKey, c.ShortcutKey, SHA1_SIZE);
\r
8626 CiFreeClientGetAccount(&c);
\r
8628 a->LockMode = cm->CmSetting.LockMode;
\r
8633 // 新しいアカウントオブジェクトの作成
\r
8634 CM_ACCOUNT *CmCreateNewAccountObject(HWND hWnd)
\r
8643 a = ZeroMalloc(sizeof(CM_ACCOUNT));
\r
8644 a->EditMode = false;
\r
8645 a->CheckServerCert = false;
\r
8646 a->Startup = false;
\r
8647 a->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
8649 // クライアントオプションの初期化
\r
8650 CmGenerateNewAccountName(hWnd, a->ClientOption->AccountName, sizeof(a->ClientOption->AccountName));
\r
8651 a->ClientOption->Port = 443; // デフォルトポート番号
\r
8652 a->ClientOption->NumRetry = INFINITE;
\r
8653 a->ClientOption->RetryInterval = 15;
\r
8654 a->ClientOption->MaxConnection = 1;
\r
8655 a->ClientOption->HalfConnection = false;
\r
8656 a->ClientOption->UseEncrypt = true;
\r
8657 a->ClientOption->AdditionalConnectionInterval = 1;
\r
8659 if (cm->Client->Unix)
\r
8661 a->ClientOption->NoRoutingTracking = true;
\r
8664 a->ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
\r
8667 a->ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
\r
8673 void CmGenerateImportName(HWND hWnd, wchar_t *name, UINT size, wchar_t *old_name)
\r
8677 if (name == NULL || hWnd == NULL)
\r
8684 wchar_t tmp[MAX_SIZE];
\r
8687 UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_1"), old_name);
\r
8691 UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_2"), old_name, i);
\r
8694 if (LvSearchStr(hWnd, L_ACCOUNT, 0, tmp) == INFINITE)
\r
8696 UniStrCpy(name, size, tmp);
\r
8703 void CmGenerateCopyName(HWND hWnd, wchar_t *name, UINT size, wchar_t *old_name)
\r
8707 if (name == NULL || hWnd == NULL)
\r
8714 wchar_t tmp[MAX_SIZE];
\r
8717 UniFormat(tmp, sizeof(tmp), _UU("CM_COPY_NAME_1"), old_name);
\r
8721 UniFormat(tmp, sizeof(tmp), _UU("CM_COPY_NAME_2"), i, old_name);
\r
8724 if (LvSearchStr(hWnd, L_ACCOUNT, 0, tmp) == INFINITE)
\r
8726 UniStrCpy(name, size, tmp);
\r
8733 void CmGenerateNewAccountName(HWND hWnd, wchar_t *name, UINT size)
\r
8737 if (name == NULL || hWnd == NULL)
\r
8744 wchar_t tmp[MAX_SIZE];
\r
8747 UniFormat(tmp, sizeof(tmp), _UU("CM_NEW_ACCOUNT_NAME_1"));
\r
8751 UniFormat(tmp, sizeof(tmp), _UU("CM_NEW_ACCOUNT_NAME_2"), i);
\r
8754 if (LvSearchStr(hWnd, L_ACCOUNT, 0, tmp) == INFINITE)
\r
8756 UniStrCpy(name, size, tmp);
\r
8763 void CmPolicyDlgPrint(HWND hWnd, CM_POLICY *p)
\r
8765 CmPolicyDlgPrintEx(hWnd, p, false);
\r
8767 void CmPolicyDlgPrintEx(HWND hWnd, CM_POLICY *p, bool cascade_mode)
\r
8769 CmPolicyDlgPrintEx2(hWnd, p, cascade_mode, POLICY_CURRENT_VERSION);
\r
8771 void CmPolicyDlgPrintEx2(HWND hWnd, CM_POLICY *p, bool cascade_mode, bool ver)
\r
8777 if (hWnd == NULL || p == NULL)
\r
8784 b = LvInsertStart();
\r
8786 for (i = 0;i < NUM_POLICY_ITEM;i++)
\r
8788 wchar_t tmp[MAX_SIZE];
\r
8792 if (PolicyIsSupportedForCascade(i) == false)
\r
8798 if (IS_POLICY_FOR_CURRENT_VER(i, ver))
\r
8800 if (policy_item[i].TypeInt == false)
\r
8803 UniStrCpy(tmp, sizeof(tmp), POLICY_BOOL(pol, i) ? _UU("POL_BOOL_ENABLE") : (p->Extension ? _UU("POL_BOOL_DISABLE_EX") : _UU("POL_BOOL_DISABLE")));
\r
8808 if (policy_item[i].AllowZero && POLICY_INT(pol, i) == 0)
\r
8810 UniStrCpy(tmp, sizeof(tmp), _UU("POL_INT_ZERO"));
\r
8814 UniFormat(tmp, sizeof(tmp), _UU(policy_item[i].FormatStr), POLICY_INT(pol, i));
\r
8818 LvInsertAdd(b, ICO_MACHINE, (void *)i, 2, GetPolicyTitle(i), tmp);
\r
8822 LvInsertEnd(b, hWnd, L_POLICY);
\r
8826 UINT CmPolicyDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
8828 CM_POLICY *p = (CM_POLICY *)param;
\r
8838 case WM_INITDIALOG:
\r
8839 FormatText(hWnd, 0, p->AccountName);
\r
8840 FormatText(hWnd, S_TITLE, p->AccountName);
\r
8842 if (p->CmStatus != NULL)
\r
8844 p->CmStatus->hWndPolicy = hWnd;
\r
8848 LvInit(hWnd, L_POLICY);
\r
8849 LvInsertColumn(hWnd, L_POLICY, 0, _UU("POL_TITLE_STR"), 375);
\r
8850 LvInsertColumn(hWnd, L_POLICY, 1, _UU("POL_VALUE_STR"), 100);
\r
8853 CmPolicyDlgPrint(hWnd, p);
\r
8856 LvSelect(hWnd, L_POLICY, 0);
\r
8870 n = (NMHDR *)lParam;
\r
8871 switch (n->idFrom)
\r
8876 case LVN_ITEMCHANGED:
\r
8878 if (LvIsSelected(hWnd, L_POLICY) == false)
\r
8880 SetText(hWnd, S_DESCRIPTION, L"");
\r
8884 UINT index = LvGetSelected(hWnd, L_POLICY);
\r
8885 UINT id = (UINT)LvGetParam(hWnd, L_POLICY, index);
\r
8886 if (id < NUM_POLICY_ITEM)
\r
8888 SetText(hWnd, S_DESCRIPTION, GetPolicyDescription(id));
\r
8898 EndDialog(hWnd, 0);
\r
8902 LvSortHander(hWnd, msg, wParam, lParam, L_POLICY);
\r
8908 void CmPolicyDlg(HWND hWnd, CM_STATUS *st)
\r
8910 RPC_CLIENT_GET_CONNECTION_STATUS s;
\r
8914 if (hWnd == NULL || st == NULL)
\r
8920 Zero(&s, sizeof(s));
\r
8921 UniStrCpy(s.AccountName, sizeof(s.AccountName), st->AccountName);
\r
8922 if (CALL(hWnd, CcGetAccountStatus(cm->Client, &s)) == false)
\r
8926 if (s.Active == false)
\r
8931 policy = &s.Policy;
\r
8933 Zero(&cp, sizeof(cp));
\r
8934 UniStrCpy(cp.AccountName, sizeof(cp.AccountName), st->AccountName);
\r
8935 cp.Policy = policy;
\r
8938 Dialog(hWnd, D_CM_POLICY, CmPolicyDlgProc, &cp);
\r
8940 st->hWndPolicy = NULL;
\r
8942 CiFreeClientGetConnectionStatus(&s);
\r
8946 void CmStatusDlgPrintCert(HWND hWnd, CM_STATUS *st, bool server)
\r
8948 RPC_CLIENT_GET_CONNECTION_STATUS s;
\r
8951 if (hWnd == NULL || st == NULL)
\r
8957 Zero(&s, sizeof(s));
\r
8958 UniStrCpy(s.AccountName, sizeof(s.AccountName), st->AccountName);
\r
8959 if (CALL(hWnd, CcGetAccountStatus(cm->Client, &s)) == false)
\r
8965 if (s.Active == false)
\r
8972 if (server == false)
\r
8983 cm->WindowCount++;
\r
8984 issuer = CmGetIssuer(x);
\r
8985 CertDlg(hWnd, x, issuer, true);
\r
8987 cm->WindowCount--;
\r
8989 CiFreeClientGetConnectionStatus(&s);
\r
8992 // ステータスダイアログの情報を表示
\r
8993 void CmStatusDlgPrint(HWND hWnd, CM_STATUS *cmst)
\r
8995 RPC_CLIENT_GET_CONNECTION_STATUS s;
\r
8998 if (hWnd == NULL || cmst == NULL)
\r
9004 Zero(&s, sizeof(s));
\r
9005 UniStrCpy(s.AccountName, sizeof(s.AccountName), cmst->AccountName);
\r
9006 if (CALL(hWnd, CcGetAccountStatus(cm->Client, &s)) == false)
\r
9012 if (s.Active == false)
\r
9019 // ステータスダイアログのリストボックスにステータスを表示する
\r
9020 b = LvInsertStart();
\r
9021 CmPrintStatusToListView(b, &s);
\r
9022 LvInsertEnd(b, hWnd, L_STATUS);
\r
9024 LvAutoSize(hWnd, L_STATUS);
\r
9026 SetEnable(hWnd, B_POLICY, s.Connected);
\r
9028 SetEnable(hWnd, B_SERVER_CERT, s.ServerX != NULL);
\r
9029 SetEnable(hWnd, B_CLIENT_CERT, s.ClientX != NULL);
\r
9031 CiFreeClientGetConnectionStatus(&s);
\r
9034 // ステータスダイアログのリストボックスにステータスを表示する
\r
9035 void CmPrintStatusToListView(LVB *b, RPC_CLIENT_GET_CONNECTION_STATUS *s)
\r
9037 CmPrintStatusToListViewEx(b, s, false);
\r
9039 void CmPrintStatusToListViewEx(LVB *b, RPC_CLIENT_GET_CONNECTION_STATUS *s, bool server_mode)
\r
9041 wchar_t tmp[MAX_SIZE];
\r
9042 char str[MAX_SIZE];
\r
9045 if (b == NULL || s == NULL)
\r
9050 if (server_mode == false)
\r
9052 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_ACCOUNT_NAME"), s->AccountName);
\r
9054 if (s->Connected == false)
\r
9056 wchar_t *st = _UU("CM_ST_CONNECTED_FALSE");
\r
9057 switch (s->SessionStatus)
\r
9059 case CLIENT_STATUS_CONNECTING:
\r
9060 st = _UU("CM_ST_CONNECTING");
\r
9062 case CLIENT_STATUS_NEGOTIATION:
\r
9063 st = _UU("CM_ST_NEGOTIATION");
\r
9065 case CLIENT_STATUS_AUTH:
\r
9066 st = _UU("CM_ST_AUTH");
\r
9068 case CLIENT_STATUS_ESTABLISHED:
\r
9069 st = _UU("CM_ST_ESTABLISHED");
\r
9071 case CLIENT_STATUS_RETRY:
\r
9072 st = _UU("CM_ST_RETRY");
\r
9074 case CLIENT_STATUS_IDLE:
\r
9075 st = _UU("CM_ST_IDLE");
\r
9078 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_CONNECTED"), st);
\r
9082 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_CONNECTED"), _UU("CM_ST_CONNECTED_TRUE"));
\r
9088 if (s->VLanId == 0)
\r
9090 UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_NO_VLAN"));
\r
9094 UniToStru(tmp, s->VLanId);
\r
9097 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_VLAN_ID"), tmp);
\r
9099 if (server_mode == false)
\r
9101 StrToUni(tmp, sizeof(tmp), s->ServerName);
\r
9102 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SERVER_NAME"), tmp);
\r
9104 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_PORT_TCP"), s->ServerPort);
\r
9105 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SERVER_PORT"), tmp);
\r
9108 StrToUni(tmp, sizeof(tmp), s->ServerProductName);
\r
9109 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SERVER_P_NAME"), tmp);
\r
9111 UniFormat(tmp, sizeof(tmp), L"%u.%02u", s->ServerProductVer / 100, s->ServerProductVer % 100);
\r
9112 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SERVER_P_VER"), tmp);
\r
9113 UniFormat(tmp, sizeof(tmp), L"Build %u", s->ServerProductBuild);
\r
9114 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SERVER_P_BUILD"), tmp);
\r
9117 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->StartTime), NULL);
\r
9118 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_START_TIME"), tmp);
\r
9119 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablisiedTime), NULL);
\r
9120 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablisiedTime == 0 ? _UU("CM_ST_NONE") : tmp);
\r
9124 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->CurrentConnectionEstablishTime), NULL);
\r
9125 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_CURR_ESTAB_TIME"), tmp);
\r
9128 if (server_mode == false)
\r
9130 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_STR"), s->NumConnectionsEatablished);
\r
9131 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_NUM_ESTABLISHED"), tmp);
\r
9136 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_HALF_CONNECTION"), s->HalfConnection ? _UU("CM_ST_HALF_TRUE") : _UU("CM_ST_HALF_FALSE"));
\r
9138 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_QOS"), s->QoS ? _UU("CM_ST_QOS_TRUE") : _UU("CM_ST_QOS_FALSE"));
\r
9140 UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnections);
\r
9141 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_NUM_TCP"), tmp);
\r
9143 if (s->HalfConnection)
\r
9145 UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsUpload);
\r
9146 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_NUM_TCP_UPLOAD"), tmp);
\r
9147 UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsDownload);
\r
9148 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_NUM_TCP_DOWNLOAD"), tmp);
\r
9151 UniFormat(tmp, sizeof(tmp), L"%u", s->MaxTcpConnections);
\r
9152 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_MAX_TCP"), tmp);
\r
9154 if (s->UseEncrypt == false)
\r
9156 UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_FALSE"));
\r
9160 if (StrLen(s->CipherName) != 0)
\r
9162 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE"), s->CipherName);
\r
9166 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE2"));
\r
9169 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_USE_ENCRYPT"), tmp);
\r
9171 if (s->UseCompress)
\r
9174 if ((s->TotalRecvSize + s->TotalSendSize) > 0)
\r
9176 percent = (UINT)((UINT64)100 - (UINT64)(s->TotalRecvSizeReal + s->TotalSendSizeReal) * (UINT64)100 /
\r
9177 (s->TotalRecvSize + s->TotalSendSize));
\r
9178 percent = MAKESURE(percent, 0, 100);
\r
9181 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_TRUE"), percent);
\r
9185 UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_FALSE"));
\r
9187 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_USE_COMPRESS"), tmp);
\r
9189 StrToUni(tmp, sizeof(tmp), s->SessionName);
\r
9190 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SESSION_NAME"), tmp);
\r
9192 StrToUni(tmp, sizeof(tmp), s->ConnectionName);
\r
9193 if (UniStrCmpi(tmp, L"INITING") != 0)
\r
9195 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_CONNECTION_NAME"), tmp);
\r
9198 BinToStr(str, sizeof(str), s->SessionKey, sizeof(s->SessionKey));
\r
9199 StrToUni(tmp, sizeof(tmp), str);
\r
9200 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SESSION_KEY"), tmp);
\r
9202 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_BRIDGE_MODE"), s->IsBridgeMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
\r
9204 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_MONITOR_MODE"), s->IsMonitorMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
\r
9206 ToStr3(vv, sizeof(vv), s->TotalSendSize);
\r
9207 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
\r
9208 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SEND_SIZE"), tmp);
\r
9210 ToStr3(vv, sizeof(vv), s->TotalRecvSize);
\r
9211 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
\r
9212 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_RECV_SIZE"), tmp);
\r
9214 ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastCount);
\r
9215 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
\r
9216 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SEND_UCAST_NUM"), tmp);
\r
9218 ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastBytes);
\r
9219 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
\r
9220 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SEND_UCAST_SIZE"), tmp);
\r
9222 ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastCount);
\r
9223 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
\r
9224 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SEND_BCAST_NUM"), tmp);
\r
9226 ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastBytes);
\r
9227 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
\r
9228 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_SEND_BCAST_SIZE"), tmp);
\r
9230 ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastCount);
\r
9231 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
\r
9232 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_RECV_UCAST_NUM"), tmp);
\r
9234 ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastBytes);
\r
9235 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
\r
9236 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_RECV_UCAST_SIZE"), tmp);
\r
9238 ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastCount);
\r
9239 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
\r
9240 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_RECV_BCAST_NUM"), tmp);
\r
9242 ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastBytes);
\r
9243 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
\r
9244 LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_RECV_BCAST_SIZE"), tmp);
\r
9248 // ステータスダイアログプロシージャ
\r
9249 UINT CmStatusDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
9251 wchar_t tmp[MAX_SIZE];
\r
9252 CM_STATUS *s = (CM_STATUS *)param;
\r
9261 case WM_INITDIALOG:
\r
9262 SetIcon(hWnd, 0, ICO_TOWER);
\r
9263 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_TITLE"), s->AccountName);
\r
9264 SetText(hWnd, 0, tmp);
\r
9265 FormatText(hWnd, S_TITLE, s->AccountName);
\r
9266 DlgFont(hWnd, S_TITLE, 0, 1);
\r
9268 Add(cm->StatusWindowList, hWnd);
\r
9270 SetTimer(hWnd, 1, 500, NULL);
\r
9272 LvInitEx(hWnd, L_STATUS, true);
\r
9273 ListView_SetImageList(DlgItem(hWnd, L_STATUS), NULL, LVSIL_NORMAL);
\r
9274 ListView_SetImageList(DlgItem(hWnd, L_STATUS), NULL, LVSIL_SMALL);
\r
9275 LvInsertColumn(hWnd, L_STATUS, 0, _UU("CM_ST_COLUMN_1"), 160);
\r
9276 LvInsertColumn(hWnd, L_STATUS, 1, _UU("CM_ST_COLUMN_2"), 270);
\r
9278 CmStatusDlgPrint(hWnd, s);
\r
9285 KillTimer(hWnd, 1);
\r
9286 CmStatusDlgPrint(hWnd, s);
\r
9287 SetTimer(hWnd, 1, 500, NULL);
\r
9301 CmPolicyDlg(hWnd, s);
\r
9303 case B_SERVER_CERT:
\r
9304 CmStatusDlgPrintCert(hWnd, s, true);
\r
9306 case B_CLIENT_CERT:
\r
9307 CmStatusDlgPrintCert(hWnd, s, false);
\r
9312 Delete(cm->StatusWindowList, hWnd);
\r
9313 if (s->hWndPolicy != NULL)
\r
9315 EndDialog(s->hWndPolicy, false);
\r
9316 s->hWndPolicy = NULL;
\r
9318 EndDialog(hWnd, false);
\r
9326 void CmStatusDlg(HWND hWnd, wchar_t *account_name)
\r
9330 if (hWnd == NULL || account_name == NULL)
\r
9335 s = ZeroMalloc(sizeof(CM_STATUS));
\r
9336 UniStrCpy(s->AccountName, sizeof(s->AccountName), account_name);
\r
9338 Dialog(hWnd, D_CONNECTION_STATUS, CmStatusDlgProc, s);
\r
9344 void CmStatus(HWND hWnd, wchar_t *account_name)
\r
9347 wchar_t tmp[MAX_SIZE];
\r
9349 if (hWnd == NULL || account_name == NULL)
\r
9354 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_TITLE"), account_name);
\r
9356 for (i = 0;i < LIST_NUM(cm->StatusWindowList);i++)
\r
9358 HWND h = LIST_DATA(cm->StatusWindowList, i);
\r
9361 wchar_t tmp2[MAX_SIZE];
\r
9362 if (GetTxt(h, 0, tmp2, sizeof(tmp2)))
\r
9364 if (UniStrCmpi(tmp2, tmp) == 0)
\r
9366 SetActiveWindow(h);
\r
9373 CmStatusDlg(hWnd, account_name);
\r
9377 void CmDeleteAccount(HWND hWnd, wchar_t *account_name)
\r
9379 RPC_CLIENT_DELETE_ACCOUNT c;
\r
9381 if (hWnd == NULL || account_name == NULL)
\r
9385 Zero(&c, sizeof(c));
\r
9386 UniStrCpy(c.AccountName, sizeof(c.AccountName), account_name);
\r
9388 CmVoice("delete_config_1");
\r
9389 if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_DELETE_ACCOUNT_MSG"), account_name)
\r
9395 CALL(hWnd, CcDeleteAccount(cm->Client, &c));
\r
9396 CmVoice("delete_config_2");
\r
9400 void CmDisconnect(HWND hWnd, wchar_t *account_name)
\r
9402 RPC_CLIENT_CONNECT c;
\r
9404 if (hWnd == NULL || account_name == NULL)
\r
9409 Zero(&c, sizeof(c));
\r
9410 UniStrCpy(c.AccountName, sizeof(c.AccountName), account_name);
\r
9412 cm->PositiveDisconnectFlag = true;
\r
9414 CALL(hWnd, CcDisconnect(cm->Client, &c));
\r
9418 void SmShowPublicVpnServerHtml(HWND hWnd)
\r
9420 char *langstr = _SS("LANGSTR");
\r
9422 if(StrCmpi(langstr, "Japanese") == 0)
\r
9424 ShowHtml(hWnd, PUBLIC_SERVER_HTML, PUBLIC_SERVER_TAG);
\r
9428 ShowHtml(hWnd, PUBLIC_SERVER_HTML_EN, PUBLIC_SERVER_TAG);
\r
9433 void CmConnect(HWND hWnd, wchar_t *account_name)
\r
9435 RPC_CLIENT_CONNECT c;
\r
9438 if (hWnd == NULL || account_name == NULL)
\r
9443 if (IsEnable(hWnd, 0) == false)
\r
9448 if (hWnd == cm->hMainWnd)
\r
9450 if (LvNum(hWnd, L_VLAN) == 0 && cm->Client->Win9x)
\r
9452 if (MsgBox(hWnd, MB_ICONINFORMATION | MB_YESNO, _UU("CM_NO_VLAN_2")) == IDNO)
\r
9458 if (cm->server_name == NULL)
\r
9460 Command(hWnd, CMD_NEW_VLAN);
\r
9465 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_VLAN_REMOTE_ERROR"));
\r
9473 if (CmWarningDesktop(hWnd, account_name) == false)
\r
9478 if (cm->server_name == NULL)
\r
9480 if (cm->BadProcessChecked == false)
\r
9482 cm->BadProcessChecked = true;
\r
9484 CheckBadProcesses(hWnd);
\r
9488 if (cm->server_name == NULL)
\r
9490 // Windows バージョンチェック
\r
9491 RPC_WINVER winver;
\r
9492 wchar_t winver_msg_client[3800];
\r
9494 GetWinVer(&winver);
\r
9495 Zero(winver_msg_client, sizeof(winver_msg_client));
\r
9497 if (IsSupportedWinVer(&winver) == false)
\r
9503 UniFormat(winver_msg_client, sizeof(winver_msg_client), _UU("WINVER_ERROR_FORMAT"),
\r
9504 _UU("WINVER_ERROR_PC_LOCAL"),
\r
9506 _UU("WINVER_ERROR_VPNCLIENT"),
\r
9507 SUPPORTED_WINDOWS_LIST,
\r
9508 _UU("WINVER_ERROR_PC_LOCAL"),
\r
9509 _UU("WINVER_ERROR_VPNCLIENT"),
\r
9510 _UU("WINVER_ERROR_VPNCLIENT"),
\r
9511 _UU("WINVER_ERROR_VPNCLIENT"),
\r
9512 st.wYear, st.wMonth);
\r
9515 if (UniIsEmptyStr(winver_msg_client) == false)
\r
9517 OnceMsgEx(hWnd, _UU("WINVER_TITLE"), winver_msg_client,
\r
9518 true, ICO_WARNING, NULL);
\r
9522 i = LvSearchStr(hWnd, L_ACCOUNT, 0, account_name);
\r
9523 if (i != INFINITE)
\r
9525 wchar_t *tmp = LvGetStr(hWnd, L_ACCOUNT, i, 2);
\r
9528 wchar_t tag[MAX_SIZE];
\r
9529 StrToUni(tag, sizeof(tag), PUBLIC_SERVER_NAME);
\r
9531 if (UniSearchStrEx(tmp, tag, 0, false) != INFINITE)
\r
9533 SmShowPublicVpnServerHtml(hWnd);
\r
9540 Zero(&c, sizeof(c));
\r
9541 UniStrCpy(c.AccountName, sizeof(c.AccountName), account_name);
\r
9543 CmSetForegroundProcessToCnService();
\r
9545 if (CALL(hWnd, CcConnect(cm->Client, &c)))
\r
9547 cm->ConnectStartedFlag = true;
\r
9551 // 指定されたメニュー項目を太字にするかどうか判断する
\r
9552 bool CmIsBold(UINT id)
\r
9557 // 指定されたメニュー項目を有効にするかどうか判断する
\r
9558 bool CmIsEnabled(HWND hWnd, UINT id)
\r
9562 bool locked = false;
\r
9569 locked = cm->CmSetting.LockMode;
\r
9577 case CMD_IMPORT_ACCOUNT:
\r
9581 case CMD_VOIDE_NONE:
\r
9582 case CMD_VOICE_NORMAL:
\r
9583 case CMD_VOICE_ODD:
\r
9585 case CMD_NOSTARTUP:
\r
9589 case CMD_NEW_VLAN:
\r
9590 case CMD_ENABLE_VLAN:
\r
9591 case CMD_DISABLE_VLAN:
\r
9592 case CMD_DELETE_VLAN:
\r
9593 case CMD_REINSTALL:
\r
9595 if (cm->CmEasyModeSupported)
\r
9604 case CMD_SHOWPORT:
\r
9612 if (MsIsTcpConfigSupported() == false)
\r
9616 return cm->server_name != NULL ? false : true;
\r
9618 if (MsIsVista() == false || IsEmptyStr(cm->server_name) == false)
\r
9622 if (OS_IS_SERVER(GetOsType()))
\r
9627 case CMD_TRAYICON:
\r
9629 return (cm->server_name == NULL);
\r
9631 if (MsIsNt() == false)
\r
9635 return (cm->server_name == NULL);
\r
9636 case CMD_CM_SETTING:
\r
9637 return cm->CmSettingSupported;
\r
9639 case CMD_DISCONNECT:
\r
9643 if (LvIsMultiMasked(hWnd, L_ACCOUNT))
\r
9647 if (LvIsSelected(hWnd, L_ACCOUNT) == false)
\r
9653 // 選択されているアカウントが接続中かどうか判別する
\r
9654 UINT i = LvGetSelected(hWnd, L_ACCOUNT);
\r
9655 wchar_t *str = LvGetStr(hWnd, L_ACCOUNT, i, 1);
\r
9656 wchar_t *name = LvGetStr(hWnd, L_ACCOUNT, i, 0);
\r
9657 bool is_connected = false;
\r
9660 if (UniStrCmpi(str, _UU("CM_ACCOUNT_ONLINE")) == 0 || UniStrCmpi(str, _UU("CM_ACCOUNT_CONNECTING")) == 0)
\r
9662 is_connected = true;
\r
9668 if (UniStrCmpi(name, _UU("CM_NEW_ICON")) == 0 || UniStrCmpi(name, _UU("CM_ASP")) == 0)
\r
9675 if (id == CMD_CONNECT || id == CMD_RENAME || id == CMD_DELETE)
\r
9677 return !is_connected;
\r
9681 return is_connected;
\r
9685 case CMD_DISCONNECT_ALL:
\r
9686 if (CmGetNumConnected(hWnd) == 0)
\r
9694 case CMD_SHORTCUT:
\r
9696 if (cm->Client->Rpc->Sock->RemoteIP.addr[0] != 127)
\r
9700 case CMD_EXPORT_ACCOUNT:
\r
9701 if (LvIsMultiMasked(hWnd, L_ACCOUNT))
\r
9705 name = LvGetSelectedStr(hWnd, L_ACCOUNT, 0);
\r
9708 if (UniStrCmpi(name, _UU("CM_NEW_ICON")) == 0 || UniStrCmpi(name, _UU("CM_ASP")) == 0)
\r
9715 return LvIsSelected(hWnd, L_ACCOUNT);
\r
9717 if (LvIsMultiMasked(hWnd, L_ACCOUNT))
\r
9721 name = LvGetSelectedStr(hWnd, L_ACCOUNT, 0);
\r
9724 if (UniStrCmpi(name, _UU("CM_NEW_ICON")) == 0 || UniStrCmpi(name, _UU("CM_ASP")) == 0)
\r
9731 return LvIsSelected(hWnd, L_ACCOUNT);
\r
9733 case CMD_NOSTARTUP:
\r
9734 name = LvGetSelectedStr(hWnd, L_ACCOUNT, 0);
\r
9737 if (UniStrCmpi(name, _UU("CM_NEW_ICON")) == 0 || UniStrCmpi(name, _UU("CM_ASP")) == 0)
\r
9744 if (LvIsMultiMasked(hWnd, L_ACCOUNT))
\r
9748 if (LvIsSelected(hWnd, L_ACCOUNT) == false)
\r
9754 // 選択されているアカウントがスタートアップアカウントかどうか判別する
\r
9755 UINT i = LvGetSelected(hWnd, L_ACCOUNT);
\r
9756 bool is_startup = (bool)LvGetParam(hWnd, L_ACCOUNT, i);
\r
9757 if (id == CMD_STARTUP)
\r
9759 return !is_startup;
\r
9763 return is_startup;
\r
9767 case CMD_NEW_VLAN:
\r
9768 if (cm->Client->Unix == false && cm->Client->Win9x == false)
\r
9770 if (cm->server_name != NULL)
\r
9775 if (cm->Client->Win9x)
\r
9777 if (LvNum(hWnd, L_VLAN) >= 1)
\r
9779 // Win9x では 2 枚以上の仮想 LAN カードをインストールできない
\r
9784 case CMD_PROPERTY:
\r
9785 name = LvGetSelectedStr(hWnd, L_ACCOUNT, 0);
\r
9788 if (UniStrCmpi(name, _UU("CM_NEW_ICON")) == 0 || UniStrCmpi(name, _UU("CM_ASP")) == 0)
\r
9795 if (LvIsMultiMasked(hWnd, L_ACCOUNT))
\r
9799 return LvIsSelected(hWnd, L_ACCOUNT);
\r
9800 case CMD_DELETE_VLAN:
\r
9801 if (LvIsMultiMasked(hWnd, L_VLAN))
\r
9805 return LvIsSelected(hWnd, L_VLAN);
\r
9806 case CMD_ENABLE_VLAN:
\r
9807 if (cm->Client->Win9x)
\r
9811 if (LvIsMultiMasked(hWnd, L_VLAN))
\r
9815 index = LvGetSelected(hWnd, L_VLAN);
\r
9816 if (index == INFINITE)
\r
9822 wchar_t *s = LvGetStr(hWnd, L_VLAN, index, 1);
\r
9825 if (UniStrCmpi(s, _UU("CM_VLAN_DISABLED")) == 0)
\r
9835 case CMD_DISABLE_VLAN:
\r
9836 if (cm->Client->Win9x)
\r
9840 if (LvIsMultiMasked(hWnd, L_VLAN))
\r
9844 index = LvGetSelected(hWnd, L_VLAN);
\r
9845 if (index == INFINITE)
\r
9851 wchar_t *s = LvGetStr(hWnd, L_VLAN, index, 1);
\r
9854 if (UniStrCmpi(s, _UU("CM_VLAN_ENABLED")) == 0)
\r
9864 case CMD_REINSTALL:
\r
9865 if (cm->server_name != NULL)
\r
9869 if (cm->Client->Win9x || cm->Client->Unix)
\r
9871 // Win9x と UNIX 系では仮想 LAN カードのアップグレード不可
\r
9874 if (LvIsMultiMasked(hWnd, L_VLAN))
\r
9878 return LvIsSelected(hWnd, L_VLAN);
\r
9881 UINT os_type = GetOsInfo()->OsType;
\r
9883 if (OS_IS_WINDOWS_NT(os_type) && GET_KETA(os_type, 100) >= 2)
\r
9885 if (cm->server_name != NULL)
\r
9899 return cm->TrayInited;
\r
9904 // VLAN デバイス名を表示名に変換
\r
9905 void CmVLanNameToPrintName(char *str, UINT size, char *name)
\r
9908 if (str == NULL || name == NULL)
\r
9913 Format(str, size, VLAN_ADAPTER_NAME_TAG, name);
\r
9916 // 表示名を VLAN デバイス名に変換
\r
9917 bool CmPrintNameToVLanName(char *name, UINT size, char *str)
\r
9920 if (name == NULL || str == NULL)
\r
9925 if (StartWith(str, VLAN_ADAPTER_NAME))
\r
9927 if (StrLen(str) < (StrLen(VLAN_ADAPTER_NAME) + 3))
\r
9932 StrCpy(name, size, str + StrLen(VLAN_ADAPTER_NAME) + 3);
\r
9941 void CmInitAccountList(HWND hWnd)
\r
9943 CmInitAccountListEx(hWnd, false);
\r
9945 void CmInitAccountListEx(HWND hWnd, bool easy)
\r
9956 b = MsRegReadBin(REG_CURRENT_USER, CM_REG_KEY, "AccountListColumnWidth");
\r
9957 if ((b != NULL) && (b->Size == sizeof(width)))
\r
9959 Copy(width, b->Buf, sizeof(width));
\r
9961 else if ((b != NULL) && (b->Size == (sizeof(width) - sizeof(UINT))))
\r
9964 Zero(width, sizeof(width));
\r
9965 Copy(width, b->Buf, sizeof(width) - sizeof(UINT));
\r
9966 width[4] = width[3];
\r
9971 Zero(width, sizeof(width));
\r
9975 LvInitEx2(hWnd, L_ACCOUNT, false, easy);
\r
9977 // LvSetStyle(hWnd, L_ACCOUNT, LVS_EX_TRACKSELECT);
\r
9980 if (easy == false)
\r
9982 LvInsertColumn(hWnd, L_ACCOUNT, 0, _UU("CM_ACCOUNT_COLUMN_1"), width[0] == 0 ? 215 : width[0]);
\r
9983 LvInsertColumn(hWnd, L_ACCOUNT, 1, _UU("CM_ACCOUNT_COLUMN_2"), width[1] == 0 ? 80 : width[1]);
\r
9984 LvInsertColumn(hWnd, L_ACCOUNT, 2, _UU("CM_ACCOUNT_COLUMN_3"), width[2] == 0 ? 220 : width[2]);
\r
9985 LvInsertColumn(hWnd, L_ACCOUNT, 3, _UU("CM_ACCOUNT_COLUMN_3_2"), width[3] == 0 ? 90 : width[3]);
\r
9986 LvInsertColumn(hWnd, L_ACCOUNT, 4, _UU("CM_ACCOUNT_COLUMN_4"), (width[4] == 0 || width[4] == 250) ? 120 : width[4]);
\r
9988 //LvSetBkImage(hWnd, L_ACCOUNT, "|ClientBack2.bmp");
\r
9992 LvInsertColumn(hWnd, L_ACCOUNT, 0, _UU("CM_ACCOUNT_COLUMN_1"), 345);
\r
9993 LvInsertColumn(hWnd, L_ACCOUNT, 1, _UU("CM_ACCOUNT_COLUMN_2"), 140);
\r
9994 LvInsertColumn(hWnd, L_ACCOUNT, 2, _UU("CM_ACCOUNT_COLUMN_3"), 0);
\r
9995 LvInsertColumn(hWnd, L_ACCOUNT, 3, _UU("CM_ACCOUNT_COLUMN_3_2"), 0);
\r
9996 LvInsertColumn(hWnd, L_ACCOUNT, 4, _UU("CM_ACCOUNT_COLUMN_4"), 0);
\r
10002 void CmSaveAccountListPos(HWND hWnd)
\r
10007 if (hWnd == NULL)
\r
10012 for (i = 0;i < 5;i++)
\r
10014 width[i] = LvGetColumnWidth(hWnd, L_ACCOUNT, i);
\r
10017 MsRegWriteBin(REG_CURRENT_USER, CM_REG_KEY, "AccountListColumnWidth", width, sizeof(width));
\r
10021 void CmInitVLanList(HWND hWnd)
\r
10026 if (hWnd == NULL)
\r
10032 b = MsRegReadBin(REG_CURRENT_USER, CM_REG_KEY, "VLanListColumnWidth");
\r
10033 if ((b != NULL) && (b->Size == sizeof(width)))
\r
10035 Copy(width, b->Buf, sizeof(width));
\r
10039 Zero(width, sizeof(width));
\r
10043 LvInit(hWnd, L_VLAN);
\r
10045 // LvSetStyle(hWnd, L_ACCOUNT, LVS_EX_TRACKSELECT);
\r
10048 LvInsertColumn(hWnd, L_VLAN, 0, _UU("CM_VLAN_COLUMN_1"), width[0] == 0 ? 310 : width[0]);
\r
10049 LvInsertColumn(hWnd, L_VLAN, 1, _UU("CM_VLAN_COLUMN_2"), width[1] == 0 ? 120 : width[1]);
\r
10050 LvInsertColumn(hWnd, L_VLAN, 2, _UU("CM_VLAN_COLUMN_3"), width[2] == 0 ? 175 : width[2]);
\r
10051 LvInsertColumn(hWnd, L_VLAN, 3, _UU("CM_VLAN_COLUMN_4"), width[3] == 0 ? 120 : width[3]);
\r
10054 LvSetBkImage(hWnd, L_VLAN, "|ClientBack2.bmp");
\r
10058 void CmSaveVLanListPos(HWND hWnd)
\r
10063 if (hWnd == NULL)
\r
10068 for (i = 0;i < 4;i++)
\r
10070 width[i] = LvGetColumnWidth(hWnd, L_VLAN, i);
\r
10073 MsRegWriteBin(REG_CURRENT_USER, CM_REG_KEY, "VLanListColumnWidth", width, sizeof(width));
\r
10077 void CmRefreshAccountList(HWND hWnd)
\r
10079 CmRefreshAccountListEx(hWnd, false);
\r
10082 void CmRefreshAccountListEx(HWND hWnd, bool easy)
\r
10084 CmRefreshAccountListEx2(hWnd, easy, false);
\r
10086 void CmRefreshAccountListEx2(HWND hWnd, bool easy, bool style_changed)
\r
10089 RPC_CLIENT_ENUM_ACCOUNT a;
\r
10090 UINT num_connecting = 0, num_connected = 0;
\r
10091 wchar_t tmp[MAX_SIZE];
\r
10092 wchar_t new_inserted_item[MAX_ACCOUNT_NAME_LEN + 1];
\r
10093 bool select_new_insteted_item = true;
\r
10095 if (hWnd == NULL)
\r
10100 // アイコン / 詳細表示の切り替え
\r
10101 LvSetView(hWnd, L_ACCOUNT, cm->IconView == false || easy);
\r
10104 if (cm->ShowGrid || easy)
\r
10106 LvSetStyle(hWnd, L_ACCOUNT, LVS_EX_GRIDLINES);
\r
10110 LvRemoveStyle(hWnd, L_ACCOUNT, LVS_EX_GRIDLINES);
\r
10113 if (style_changed)
\r
10116 if (easy == false)
\r
10118 if (cm->VistaStyle)
\r
10120 SetFontMeiryo(hWnd, L_ACCOUNT);
\r
10124 SetFontDefault(hWnd, L_ACCOUNT);
\r
10127 if (cm->VistaStyle && (cm->IconView == false))
\r
10129 LvSetStyle(hWnd, L_ACCOUNT, LVS_EX_FULLROWSELECT);
\r
10133 LvRemoveStyle(hWnd, L_ACCOUNT, LVS_EX_FULLROWSELECT);
\r
10138 Zero(new_inserted_item, sizeof(new_inserted_item));
\r
10140 if (LvNum(hWnd, L_ACCOUNT) == 0)
\r
10142 select_new_insteted_item = false;
\r
10146 if (CALL(hWnd, CcEnumAccount(cm->Client, &a)))
\r
10149 LVB *b = LvInsertStart();
\r
10151 if (cm->CmSetting.LockMode == false && (easy == false))
\r
10154 LvInsertAdd(b, ICO_NEW, NULL, 4, _UU("CM_NEW_ICON"), L"", L"", L"");
\r
10155 LvInsertAdd(b, ICO_INTERNET, NULL, 4, _UU("CM_ASP"), L"", L"", L"");
\r
10158 for (i = 0;i < a.NumItem;i++)
\r
10160 RPC_CLIENT_ENUM_ACCOUNT_ITEM *t = a.Items[i];
\r
10162 wchar_t tmp[MAX_SIZE];
\r
10163 wchar_t tmp2[MAX_SIZE];
\r
10164 char tmp3[MAX_SIZE];
\r
10165 wchar_t tmp4[MAX_SIZE];
\r
10167 char ip_str[MAX_SIZE];
\r
10169 // IPv6 アドレスの場合の特別処理
\r
10170 if (StrToIP6(&ip, t->ServerName) && StartWith(t->ServerName, "[") == false)
\r
10172 Format(ip_str, sizeof(ip_str),
\r
10173 "[%s]", t->ServerName);
\r
10177 StrCpy(ip_str, sizeof(ip_str), t->ServerName);
\r
10181 if (t->Active == false)
\r
10183 if (t->StartupAccount == false)
\r
10185 icon = ICO_SERVER_OFFLINE;
\r
10189 icon = ICO_SERVER_OFFLINE_EX;
\r
10195 if (t->StartupAccount == false)
\r
10197 icon = ICO_SERVER_ONLINE;
\r
10201 icon = ICO_SERVER_ONLINE_EX;
\r
10206 if (easy == false)
\r
10208 //CmVLanNameToPrintName(tmp3, sizeof(tmp3), t->DeviceName);
\r
10209 StrCpy(tmp3, sizeof(tmp3), t->DeviceName);
\r
10210 StrToUni(tmp, sizeof(tmp), tmp3);
\r
10214 StrToUni(tmp, sizeof(tmp), t->DeviceName);
\r
10217 if (t->Port == 0 || cm->ShowPort == false)
\r
10220 UniFormat(tmp2, sizeof(tmp2), L"%S (%s)", ip_str, CmGetProtocolName(t->ProxyType));
\r
10225 UniFormat(tmp2, sizeof(tmp2), L"%S:%u (%s)", ip_str, t->Port, CmGetProtocolName(t->ProxyType));
\r
10228 if (LvSearchStr(hWnd, L_ACCOUNT, 0, t->AccountName) == INFINITE)
\r
10230 UniStrCpy(new_inserted_item, sizeof(new_inserted_item), t->AccountName);
\r
10234 StrToUni(tmp4, sizeof(tmp4), t->HubName);
\r
10236 if (easy == false)
\r
10238 LvInsertAdd(b, icon, (void *)t->StartupAccount, 5, t->AccountName,
\r
10239 t->Active == false ? _UU("CM_ACCOUNT_OFFLINE") :
\r
10240 (t->Connected ? _UU("CM_ACCOUNT_ONLINE") : _UU("CM_ACCOUNT_CONNECTING")),
\r
10246 LvInsertAdd(b, icon, (void *)t->StartupAccount, 5, t->AccountName,
\r
10247 t->Active == false ? _UU("CM_ACCOUNT_OFFLINE") :
\r
10248 (t->Connected ? _UU("CM_ACCOUNT_ONLINE") : _UU("CM_ACCOUNT_CONNECTING")),
\r
10255 if (t->Connected)
\r
10261 num_connecting++;
\r
10266 LvInsertEnd(b, hWnd, L_ACCOUNT);
\r
10268 CiFreeClientEnumAccount(&a);
\r
10270 if (select_new_insteted_item)
\r
10272 if (UniStrLen(new_inserted_item) >= 1)
\r
10274 LvSelect(hWnd, L_ACCOUNT, INFINITE);
\r
10275 LvSelect(hWnd, L_ACCOUNT, LvSearchStr(hWnd, L_ACCOUNT, 0, new_inserted_item));
\r
10280 if (easy == false)
\r
10282 // 音声ガイドのため、新しく接続されたり、切断されたりした場合を検出する
\r
10283 if (cm->UpdateConnectedNumFlag == false)
\r
10285 cm->UpdateConnectedNumFlag = true;
\r
10286 cm->OldConnectedNum = num;
\r
10290 if (cm->OldConnectedNum != num)
\r
10292 if (cm->OldConnectedNum < num)
\r
10294 CmVoice("connect");
\r
10298 CmVoice("disconnect");
\r
10300 if (cm->CmSetting.EasyMode && cm->PositiveDisconnectFlag == false)
\r
10305 cm->PositiveDisconnectFlag = false;
\r
10307 cm->OldConnectedNum = num;
\r
10311 if (num_connecting == 0 && num_connected == 0)
\r
10314 UniStrCpy(tmp, sizeof(tmp), _UU("CM_TRAY_NOT_CONNECTED"));
\r
10316 else if (num_connected == 0)
\r
10319 UniFormat(tmp, sizeof(tmp), _UU("CM_TRAY_CONNECTED_1"), num_connecting);
\r
10321 else if (num_connecting == 0)
\r
10324 UniFormat(tmp, sizeof(tmp), _UU("CM_TRAY_CONNECTED_2"), num_connected);
\r
10329 UniFormat(tmp, sizeof(tmp), _UU("CM_TRAY_CONNECTED_0"), num_connected, num_connecting);
\r
10332 if (num_connecting == 0 && num_connected == 0)
\r
10334 cm->TrayAnimation = false;
\r
10335 cm->TraySpeedAnimation = false;
\r
10339 cm->TrayAnimation = true;
\r
10341 if (num_connecting == 0)
\r
10343 cm->TraySpeedAnimation = false;
\r
10347 cm->TraySpeedAnimation = true;
\r
10351 CmChangeTrayString(hWnd, tmp);
\r
10357 CmUpdateJumpList(0);
\r
10361 void CmRefreshVLanList(HWND hWnd)
\r
10363 CmRefreshVLanListEx(hWnd, false);
\r
10365 void CmRefreshVLanListEx(HWND hWnd, bool style_changed)
\r
10367 RPC_CLIENT_ENUM_VLAN e;
\r
10369 if (hWnd == NULL)
\r
10374 LvSetView(hWnd, L_VLAN, cm->IconView == false);
\r
10377 if (cm->ShowGrid)
\r
10379 LvSetStyle(hWnd, L_VLAN, LVS_EX_GRIDLINES);
\r
10383 LvRemoveStyle(hWnd, L_VLAN, LVS_EX_GRIDLINES);
\r
10386 if (style_changed)
\r
10389 if (cm->VistaStyle)
\r
10391 SetFontMeiryo(hWnd, L_VLAN);
\r
10395 SetFontDefault(hWnd, L_VLAN);
\r
10398 if (cm->VistaStyle && (cm->IconView == false))
\r
10400 LvSetStyle(hWnd, L_VLAN, LVS_EX_FULLROWSELECT);
\r
10404 LvRemoveStyle(hWnd, L_VLAN, LVS_EX_FULLROWSELECT);
\r
10409 Zero(&e, sizeof(e));
\r
10410 if (CALL(hWnd, CcEnumVLan(cm->Client, &e)))
\r
10412 LVB *b = LvInsertStart();
\r
10414 for (i = 0;i < e.NumItem;i++)
\r
10416 wchar_t name[MAX_SIZE];
\r
10417 wchar_t mac[MAX_SIZE];
\r
10418 wchar_t ver[MAX_SIZE];
\r
10419 char str[MAX_SIZE];
\r
10421 RPC_CLIENT_ENUM_VLAN_ITEM *v = e.Items[i];
\r
10424 CmVLanNameToPrintName(str, sizeof(str), v->DeviceName);
\r
10425 StrToUni(name, sizeof(name), str);
\r
10428 status = v->Enabled ? _UU("CM_VLAN_ENABLED") : _UU("CM_VLAN_DISABLED");
\r
10431 StrToUni(mac, sizeof(mac), v->MacAddress);
\r
10434 StrToUni(ver, sizeof(ver), v->Version);
\r
10436 LvInsertAdd(b, v->Enabled ? ICO_NIC_ONLINE : ICO_NIC_OFFLINE, NULL, 4,
\r
10437 name, status, mac, ver);
\r
10439 LvInsertEnd(b, hWnd, L_VLAN);
\r
10441 CiFreeClientEnumVLan(&e);
\r
10446 wchar_t *CmGetProtocolName(UINT n)
\r
10448 return GetProtocolName(n);
\r
10452 void CmRefresh(HWND hWnd)
\r
10454 CmRefreshEx(hWnd, false);
\r
10456 void CmRefreshEx(HWND hWnd, bool style_changed)
\r
10459 if (hWnd == NULL)
\r
10465 CmMainWindowOnSize(hWnd);
\r
10468 CmRefreshVLanListEx(hWnd, style_changed);
\r
10471 CmRefreshAccountListEx2(hWnd, false, style_changed);
\r
10474 CmRefreshStatusBar(hWnd);
\r
10477 // 指定されたメニュー項目をチェックするかどうか判断する
\r
10478 bool CmIsChecked(UINT id)
\r
10482 case CMD_TRAYICON:
\r
10483 return cm->HideTrayIcon == false;
\r
10484 case CMD_STATUSBAR:
\r
10485 return cm->HideStatusBar == false;
\r
10486 case CMD_VISTASTYLE:
\r
10487 return cm->VistaStyle;
\r
10489 return cm->IconView;
\r
10491 return cm->IconView == false;
\r
10493 return cm->ShowGrid;
\r
10494 case CMD_VOIDE_NONE:
\r
10495 return cm->DisableVoice;
\r
10496 case CMD_SHOWPORT:
\r
10497 return cm->ShowPort;
\r
10498 case CMD_VOICE_NORMAL:
\r
10499 if (cm->DisableVoice)
\r
10505 return cm->VoiceId == VOICE_SSK;
\r
10507 case CMD_VOICE_ODD:
\r
10508 if (cm->DisableVoice)
\r
10514 return cm->VoiceId == VOICE_AHO;
\r
10520 // メニューがポップアップされた
\r
10521 void CmMainWindowOnPopupMenu(HWND hWnd, HMENU hMenu, UINT pos)
\r
10523 UINT num_menu, i, id;
\r
10525 if (hWnd == NULL || hMenu == NULL)
\r
10530 num_menu = GetMenuItemCount(hMenu);
\r
10531 for (i = 0;i < num_menu;i++)
\r
10533 id = GetMenuItemID(hMenu, i);
\r
10535 if (id != INFINITE)
\r
10537 bool enable_flag = CmIsEnabled(hWnd, id);
\r
10538 bool checked_flag = CmIsChecked(id);
\r
10539 bool bold_flag = CmIsBold(id);
\r
10540 MENUITEMINFO info;
\r
10542 Zero(&info, sizeof(info));
\r
10543 info.cbSize = sizeof(info);
\r
10544 info.fMask = MIIM_STATE;
\r
10545 info.fState = (enable_flag ? MFS_ENABLED : MFS_DISABLED) |
\r
10546 (checked_flag ? MFS_CHECKED : MFS_UNCHECKED) |
\r
10547 (bold_flag ? MFS_DEFAULT : 0);
\r
10549 if (id == CMD_ICON || id == CMD_DETAIL || id == CMD_VOIDE_NONE ||
\r
10550 id == CMD_VOICE_NORMAL || id == CMD_VOICE_ODD)
\r
10552 info.fMask |= MIIM_FTYPE;
\r
10553 info.fType = MFT_RADIOCHECK;
\r
10556 SetMenuItemInfo(hMenu, id, false, &info);
\r
10559 if (id == CMD_RECENT)
\r
10561 HMENU sub = CmCreateRecentSubMenu(hWnd, CM_TRAY_MENU_RECENT_ID_START);
\r
10565 DeleteMenu(hMenu, i, MF_BYPOSITION);
\r
10566 MsInsertMenu(hMenu, i, MF_BYPOSITION | MF_ENABLED | MF_POPUP | MF_STRING,
\r
10567 (UINT_PTR)sub, _UU("CM_TRAY_MENU_RECENT"));
\r
10571 MENUITEMINFO info;
\r
10573 Zero(&info, sizeof(info));
\r
10574 info.cbSize = sizeof(info);
\r
10575 info.fMask = MIIM_STATE;
\r
10576 info.fState = MFS_DISABLED;
\r
10578 SetMenuItemInfo(hMenu, id, false, &info);
\r
10584 // メインウインドウタイトルの設定
\r
10585 wchar_t *CmGenerateMainWindowTitle()
\r
10587 wchar_t tmp[MAX_SIZE];
\r
10588 if (cm->server_name == NULL)
\r
10590 UniFormat(tmp, sizeof(tmp), L"%s", _UU("CM_TITLE"));
\r
10594 UniFormat(tmp, sizeof(tmp), L"%s - %S", _UU("CM_TITLE"), cm->server_name);
\r
10597 return CopyUniStr(tmp);
\r
10601 void CmInitTray(HWND hWnd)
\r
10604 if (hWnd == NULL)
\r
10609 if (cm->server_name != NULL)
\r
10614 if (cm->TrayInited)
\r
10619 MsShowIconOnTray(hWnd, LoadSmallIcon(CmGetTrayIconId(false, 0)), _UU("CM_TRAY_INITING"), WM_CM_TRAY_MESSAGE);
\r
10621 cm->TrayInited = true;
\r
10622 cm->TrayAnimation = false;
\r
10624 SetTimer(hWnd, 2, CM_TRAY_ANIMATION_INTERVAL / 4, NULL);
\r
10628 void CmChangeTrayString(HWND hWnd, wchar_t *str)
\r
10631 if (hWnd == NULL || str == NULL)
\r
10635 if (cm->TrayInited == false)
\r
10640 MsChangeIconOnTray(NULL, str);
\r
10644 void CmFreeTray(HWND hWnd)
\r
10647 if (hWnd == NULL)
\r
10652 if (cm->TrayInited == false)
\r
10657 MsHideIconOnTray();
\r
10659 cm->TrayInited = false;
\r
10661 void CmFreeTrayExternal(void *hWnd)
\r
10663 CmFreeTray((HWND)hWnd);
\r
10666 // タスクトレイに対する定期的な処理
\r
10667 void CmPollingTray(HWND hWnd)
\r
10671 if (hWnd == NULL)
\r
10676 if (cm->TrayInited == false)
\r
10681 MsChangeIconOnTray(LoadSmallIcon(CmGetTrayIconId(cm->TrayAnimation, cm->TrayAnimationCounter)),
\r
10684 cm->TrayAnimationCounter++;
\r
10686 KillTimer(hWnd, 2);
\r
10687 interval = CM_TRAY_ANIMATION_INTERVAL / 4;
\r
10688 if (cm->TraySpeedAnimation)
\r
10692 SetTimer(hWnd, 2, interval, NULL);
\r
10695 // アニメーション用のタスクトレイのアイコン ID の取得
\r
10696 UINT CmGetTrayIconId(bool animation, UINT animation_counter)
\r
10698 if (animation == false)
\r
10700 return ICO_TRAY0;
\r
10704 switch (animation_counter % 4)
\r
10707 return ICO_TRAY1;
\r
10710 return ICO_TRAY2;
\r
10713 return ICO_TRAY3;
\r
10716 return ICO_TRAY4;
\r
10722 void CmMainWindowOnInit(HWND hWnd)
\r
10726 bool startup_mode = cm->StartupMode;
\r
10728 bool fake = false;
\r
10730 if (hWnd == NULL)
\r
10736 SetFontMeiryo(hWnd, L_ACCOUNT);
\r
10737 SetFontMeiryo(hWnd, L_VLAN);
\r
10739 // 現在の vpnclient の設定を取得する
\r
10740 Zero(&a, sizeof(a));
\r
10741 CcGetCmSetting(cm->Client, &a);
\r
10748 InitMenuInternational(GetMenu(hWnd), "CM_MENU");
\r
10750 cm->HideStatusBar = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "HideStatusBar");
\r
10751 cm->HideTrayIcon = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "HideTrayIcon");
\r
10752 cm->IconView = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "IconView");
\r
10753 cm->ShowGrid = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "ShowGrid");
\r
10755 if (MsRegIsValue(REG_CURRENT_USER, CM_REG_KEY, "VistaStyle"))
\r
10757 cm->VistaStyle = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "VistaStyle");
\r
10761 cm->VistaStyle = MsIsVista();
\r
10764 if (MsRegIsValue(REG_CURRENT_USER, CM_REG_KEY, "ShowPort"))
\r
10766 cm->ShowPort = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "ShowPort");
\r
10770 cm->ShowPort = false;
\r
10773 if (MsRegIsValue(REG_CURRENT_USER, CM_REG_KEY, "DisableVoice"))
\r
10775 cm->DisableVoice = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "DisableVoice");
\r
10779 cm->DisableVoice = true;
\r
10781 cm->VoiceId = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "VoiceId");
\r
10783 cm->StatusWindowList = NewList(NULL);
\r
10785 SetIcon(hWnd, 0, ICO_VPN);
\r
10787 s = CmGenerateMainWindowTitle();
\r
10788 SetText(hWnd, 0, s);
\r
10792 b = MsRegReadBin(REG_CURRENT_USER, CM_REG_KEY, "WindowPlacement");
\r
10793 if (b != NULL && b->Size == sizeof(WINDOWPLACEMENT))
\r
10796 WINDOWPLACEMENT *p;
\r
10797 p = ZeroMalloc(b->Size);
\r
10798 Copy(p, b->Buf, b->Size);
\r
10800 if (startup_mode)
\r
10802 p->showCmd = SW_SHOWMINIMIZED;
\r
10807 Copy(&cm->FakeWindowPlacement, p, sizeof(WINDOWPLACEMENT));
\r
10811 SetWindowPlacement(hWnd, p);
\r
10818 SetWindowPos(hWnd, NULL, 0, 0, CM_DEFAULT_WIDTH, CM_DEFAULT_HEIGHT, SWP_NOREDRAW);
\r
10820 if (startup_mode)
\r
10822 ShowWindow(hWnd, SW_SHOWMINIMIZED);
\r
10827 WINDOWPLACEMENT p;
\r
10829 Zero(&p, sizeof(p));
\r
10830 p.length = sizeof(p);
\r
10831 GetWindowPlacement(hWnd, &p);
\r
10832 Copy(&cm->FakeWindowPlacement, &p, sizeof(WINDOWPLACEMENT));
\r
10839 SetWindowPos(hWnd, NULL, -200, -200, 100, 100,
\r
10840 SWP_NOREDRAW | SWP_SHOWWINDOW);
\r
10844 cm->hMainWnd = hWnd;
\r
10845 cm->hStatusBar = CreateStatusWindowW(WS_CHILD |
\r
10846 (cm->HideStatusBar == false ? WS_VISIBLE : 0),
\r
10848 hWnd, S_STATUSBAR);
\r
10850 UniStrCpy(cm->StatudBar1, sizeof(cm->StatudBar1), _UU("CM_TITLE"));
\r
10851 UniStrCpy(cm->StatudBar2, sizeof(cm->StatudBar2), _UU("CM_CONN_NO"));
\r
10852 UniFormat(cm->StatudBar3, sizeof(cm->StatudBar3), _UU("CM_PRODUCT_NAME"), CEDAR_BUILD);
\r
10854 cm->Icon2 = LoadSmallIcon(ICO_SERVER_OFFLINE);
\r
10855 cm->Icon3 = LoadSmallIcon(ICO_VPN);
\r
10858 CmInitAccountList(hWnd);
\r
10861 CmInitVLanList(hWnd);
\r
10864 CmRefreshEx(hWnd, true);
\r
10866 // 通知クライアントのスレッドを開始
\r
10867 CmInitNotifyClientThread();
\r
10870 SetTimer(hWnd, 1, 128, NULL);
\r
10873 if (cm->server_name == NULL)
\r
10875 if (cm->HideTrayIcon == false)
\r
10877 CmInitTray(hWnd);
\r
10881 CmVoice("start");
\r
10883 if (startup_mode || a.EasyMode)
\r
10885 SetTimer(hWnd, 3, 1, NULL);
\r
10888 if (cm->import_file_name != NULL)
\r
10890 // 引数として指定されたファイルをインポートする
\r
10891 CmSendImportMessage(hWnd, cm->import_file_name, cm->CmSettingInitialFlag == CM_SETTING_INIT_NONE ? CM_IMPORT_FILENAME_MSG : CM_IMPORT_FILENAME_MSG_OVERWRITE);
\r
10892 /*if (a.LockMode == false)
\r
10894 CmImportAccountMainEx(hWnd, cm->import_file_name, cm->CmSettingInitialFlag != CM_SETTING_INIT_NONE);
\r
10898 MsgBox(cm->hEasyWnd ? cm->hEasyWnd : hWnd, MB_ICONEXCLAMATION, _UU("CM_VPN_FILE_IMPORT_NG"));
\r
10902 // CM_SETTING の適用
\r
10903 CmApplyCmSetting();
\r
10905 cm->StartupFinished = true;
\r
10908 // 通知クライアントのスレッドを開始
\r
10909 void CmInitNotifyClientThread()
\r
10911 cm->NotifyClient = CcConnectNotify(cm->Client);
\r
10912 if (cm->NotifyClient == false)
\r
10914 Close(cm->hMainWnd);
\r
10917 cm->NotifyClientThread = NewThread(CmNotifyClientThread, NULL);
\r
10921 void CmNotifyClientThread(THREAD *thread, void *param)
\r
10923 NOTIFY_CLIENT *nc;
\r
10925 if (thread == NULL)
\r
10930 nc = cm->NotifyClient;
\r
10933 while (cm->Halt == false)
\r
10935 if (CcWaitNotify(nc))
\r
10938 PostMessage(cm->hMainWnd, WM_CM_NOTIFY, 0, 0);
\r
10943 if (cm->Halt == false)
\r
10947 CmFreeTrayExternal((void *)cm->hMainWnd);
\r
10957 // 通知クライアントのスレッドを終了
\r
10958 void CmFreeNotifyClientThread()
\r
10963 CcStopNotify(cm->NotifyClient);
\r
10966 WaitThread(cm->NotifyClientThread, INFINITE);
\r
10969 CcDisconnectNotify(cm->NotifyClient);
\r
10970 ReleaseThread(cm->NotifyClientThread);
\r
10973 // メインウインドウのサイズ変更
\r
10974 void CmMainWindowOnSize(HWND hWnd)
\r
10977 UINT client_width, client_height;
\r
10978 UINT status_height;
\r
10980 if (hWnd == NULL)
\r
10985 // メインウインドウのクライアント領域のサイズを取得する
\r
10986 GetClientRect(hWnd, &r);
\r
10987 client_width = MAX(r.right - r.left, 0);
\r
10988 client_height = MAX(r.bottom - r.top, 0);
\r
10990 SendMsg(hWnd, S_STATUSBAR, WM_SIZE, 0, 0);
\r
10992 // ステータスバーのサイズを取得する
\r
10993 GetWindowRect(DlgItem(hWnd, S_STATUSBAR), &r);
\r
10994 status_height = MAX(r.bottom - r.top, 0);
\r
10996 if (cm->HideStatusBar == false)
\r
10998 client_height = MAX(client_height - status_height, 0);
\r
11001 MoveWindow(DlgItem(hWnd, L_ACCOUNT), 0, 0, client_width, client_height * 3 / 5 - 3, true);
\r
11002 MoveWindow(DlgItem(hWnd, L_VLAN), 0, client_height * 3 / 5, client_width, client_height * 2 / 5, true);
\r
11005 CmRedrawStatusBar(hWnd);
\r
11008 // 現在接続中のアカウントをすべて切断する
\r
11009 void CmDisconnectAll(HWND hWnd)
\r
11014 if (hWnd == NULL)
\r
11020 num = CmGetNumConnected(hWnd);
\r
11026 if (MsgBoxEx(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_DISCONNECT_ALL"), num) == IDNO)
\r
11031 cm->PositiveDisconnectFlag = true;
\r
11034 o = NewListFast(NULL);
\r
11036 num = LvNum(hWnd, L_ACCOUNT);
\r
11037 for (i = 0;i < num;i++)
\r
11039 wchar_t *s = LvGetStr(hWnd, L_ACCOUNT, i, 1);
\r
11042 if (UniStrCmpi(s, _UU("CM_ACCOUNT_ONLINE")) == 0 || UniStrCmpi(s, _UU("CM_ACCOUNT_CONNECTING")) == 0)
\r
11044 Add(o, LvGetStr(hWnd, L_ACCOUNT, i, 0));
\r
11050 for (i = 0;i < LIST_NUM(o);i++)
\r
11052 wchar_t *s = LIST_DATA(o, i);
\r
11055 CmDisconnect(hWnd, s);
\r
11063 // 現在接続中の接続設定数を取得する
\r
11064 UINT CmGetNumConnected(HWND hWnd)
\r
11066 UINT i, num, num_active;
\r
11068 if (hWnd == NULL)
\r
11074 num = LvNum(hWnd, L_ACCOUNT);
\r
11075 for (i = 0;i < num;i++)
\r
11077 wchar_t *s = LvGetStr(hWnd, L_ACCOUNT, i, 1);
\r
11080 if (UniStrCmpi(s, _UU("CM_ACCOUNT_ONLINE")) == 0 || UniStrCmpi(s, _UU("CM_ACCOUNT_CONNECTING")) == 0)
\r
11088 return num_active;
\r
11092 void CmRefreshStatusBar(HWND hWnd)
\r
11094 UINT num_active = CmGetNumConnected(hWnd);
\r
11096 if (hWnd == NULL)
\r
11101 if (num_active == 0)
\r
11103 UniStrCpy(cm->StatudBar2, sizeof(cm->StatudBar2), _UU("CM_CONN_NO"));
\r
11104 cm->Icon2 = LoadSmallIcon(ICO_SERVER_OFFLINE);
\r
11108 UniFormat(cm->StatudBar2, sizeof(cm->StatudBar2), _UU("CM_NUM_CONN_COUNT"), num_active);
\r
11109 cm->Icon2 = LoadSmallIcon(ICO_SERVER_ONLINE);
\r
11112 CmRedrawStatusBar(hWnd);
\r
11116 void CmRedrawStatusBar(HWND hWnd)
\r
11123 wchar_t tmp[MAX_SIZE];
\r
11126 if (hWnd == NULL)
\r
11131 h = cm->hStatusBar;
\r
11134 GetWindowRect(h, &r);
\r
11135 width = MAX(r.right - r.left, 0);
\r
11138 x1 = MAX(width - x2 - x3, 0);
\r
11143 xx[2] = x3 + x2 + x1;
\r
11144 SendMsg(h, 0, SB_SETPARTS, 3, (LPARAM)xx);
\r
11147 icon = (HICON)SendMsg(h, 0, SB_GETICON, 1, 0);
\r
11148 if (icon != cm->Icon2)
\r
11150 SendMsg(h, 0, SB_SETICON, 1, (LPARAM)cm->Icon2);
\r
11153 icon = (HICON)SendMsg(h, 0, SB_GETICON, 2, 0);
\r
11154 if (icon != cm->Icon3)
\r
11156 SendMsg(h, 0, SB_SETICON, 2, (LPARAM)cm->Icon3);
\r
11160 SendMsg(h, 0, SB_GETTEXTW, 0, (LPARAM)tmp);
\r
11161 if (UniStrCmp(tmp, cm->StatudBar1))
\r
11163 SendMsg(h, 0, SB_SETTEXTW, 0, (LPARAM)cm->StatudBar1);
\r
11166 SendMsg(h, 0, SB_GETTEXTW, 1, (LPARAM)tmp);
\r
11167 if (UniStrCmp(tmp, cm->StatudBar2))
\r
11169 SendMsg(h, 0, SB_SETTEXTW, 1, (LPARAM)cm->StatudBar2);
\r
11172 SendMsg(h, 0, SB_GETTEXTW, 2, (LPARAM)tmp);
\r
11173 if (UniStrCmp(tmp, cm->StatudBar3))
\r
11175 SendMsg(h, 0, SB_SETTEXTW, 2, (LPARAM)cm->StatudBar3);
\r
11179 // メインウインドウの位置情報を保存する
\r
11180 void CmSaveMainWindowPos(HWND hWnd)
\r
11182 WINDOWPLACEMENT p;
\r
11184 if (hWnd == NULL)
\r
11190 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "HideStatusBar", cm->HideStatusBar);
\r
11191 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "HideTrayIcon", cm->HideTrayIcon);
\r
11192 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "IconView", cm->IconView);
\r
11193 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "ShowGrid", cm->ShowGrid);
\r
11194 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "DisableVoice", cm->DisableVoice);
\r
11195 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "VoiceId", cm->VoiceId);
\r
11196 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "VistaStyle", cm->VistaStyle);
\r
11197 MsRegWriteInt(REG_CURRENT_USER, CM_REG_KEY, "ShowPort", cm->ShowPort);
\r
11200 Zero(&p, sizeof(p));
\r
11201 p.length = sizeof(p);
\r
11202 GetWindowPlacement(hWnd, &p);
\r
11204 if (IsZero(&cm->FakeWindowPlacement, sizeof(cm->FakeWindowPlacement)) == false)
\r
11206 Copy(&p, &cm->FakeWindowPlacement, sizeof(cm->FakeWindowPlacement));
\r
11209 MsRegWriteBin(REG_CURRENT_USER, CM_REG_KEY, "WindowPlacement", &p, sizeof(p));
\r
11211 CmSaveAccountListPos(hWnd);
\r
11212 CmSaveVLanListPos(hWnd);
\r
11216 void CmMainWindowOnQuit(HWND hWnd)
\r
11220 if (hWnd == NULL)
\r
11225 if (cm->TrayInited)
\r
11227 if (MsgBox(hWnd, MB_YESNO | MB_ICONQUESTION,
\r
11228 _UU("CM_EXIT_MESSAGE")) == IDNO)
\r
11234 if (cm->OnCloseDispatched)
\r
11238 cm->OnCloseDispatched = true;
\r
11243 CmFreeTray(hWnd);
\r
11245 // メインウインドウの位置情報を保存する
\r
11246 CmSaveMainWindowPos(hWnd);
\r
11248 // ステータスウインドウを閉じる
\r
11249 for (i = 0;i < LIST_NUM(cm->StatusWindowList);i++)
\r
11251 HWND h = LIST_DATA(cm->StatusWindowList, i);
\r
11252 //EndDialog(h, 0);
\r
11253 PostMessage(h, WM_CLOSE, 0, 0);
\r
11256 ReleaseList(cm->StatusWindowList);
\r
11257 cm->StatusWindowList = NULL;
\r
11259 if (cm->WindowCount != 0)
\r
11266 CmFreeNotifyClientThread();
\r
11268 EndDialog(hWnd, false);
\r
11271 // 起動時に使用する mutex を開始
\r
11272 bool CmStartStartupMutex()
\r
11274 INSTANCE *o = NewSingleInstance(STARTUP_MUTEX_NAME);
\r
11281 cm->StartupMutex = o;
\r
11286 // 起動時に使用する mutex を解放
\r
11287 void CmEndStartupMutex()
\r
11289 if (cm->StartupMutex != NULL)
\r
11291 FreeSingleInstance(cm->StartupMutex);
\r
11293 cm->StartupMutex = NULL;
\r
11298 void MainCMWindow()
\r
11304 if (CmStartStartupMutex() == false)
\r
11309 s = CmGenerateMainWindowTitle();
\r
11310 h = SearchWindow(s);
\r
11313 Zero(&a, sizeof(a));
\r
11314 CcGetCmSetting(cm->Client, &a);
\r
11315 if (cm->server_name != NULL && a.EasyMode)
\r
11317 CmEndStartupMutex();
\r
11318 MsgBox(NULL, MB_ICONEXCLAMATION, _UU("CM_EASY_MODE_NOT_ON_REMOTE"));
\r
11323 if (cm->CmSettingSupported)
\r
11325 if (cm->CmSettingInitialFlag == CM_SETTING_INIT_SELECT)
\r
11329 CmEndStartupMutex();
\r
11337 goto SEND_MESSAGES;
\r
11344 else if ((cm->CmSettingInitialFlag == CM_SETTING_INIT_EASY && cm->CmEasyModeSupported) || cm->CmSettingInitialFlag == CM_SETTING_INIT_NORMAL)
\r
11349 Zero(&a, sizeof(a));
\r
11350 CcGetCmSetting(cm->Client, &a);
\r
11352 if (cm->CmSettingInitialFlag == CM_SETTING_INIT_EASY)
\r
11354 a.EasyMode = true;
\r
11358 a.EasyMode = false;
\r
11361 CcSetCmSetting(cm->Client, &a);
\r
11367 // 他に同じタイトルのウインドウが無いのでウインドウを作成する
\r
11368 if (cm->server_name == NULL)
\r
11370 CmInitTryToExecUiHelper();
\r
11371 CnWaitForCnServiceReady();
\r
11373 Dialog(NULL, D_CM_MAIN, CmMainWindowProc, NULL);
\r
11374 CmFreeTryToExecUiHelper();
\r
11379 CmEndStartupMutex();
\r
11381 // すでに同じタイトルのウインドウが存在する場合はそれをアクティブにして
\r
11383 SetForegroundWindow(h);
\r
11384 SendMessage(h, WM_CM_SHOW, 0, 0);
\r
11385 SetForegroundWindow(h);
\r
11387 if (cm->CmSettingInitialFlag != CM_SETTING_INIT_NONE)
\r
11389 // CM_SETTING が変更されたのでそれを通知する
\r
11390 SendMessage(h, WM_CM_SETTING_CHANGED_MESSAGE, 0, 0);
\r
11393 if (cm->import_file_name != NULL)
\r
11396 if (cm->CmSettingInitialFlag == CM_SETTING_INIT_NONE)
\r
11398 msg = CM_IMPORT_FILENAME_MSG;
\r
11402 msg = CM_IMPORT_FILENAME_MSG_OVERWRITE;
\r
11405 CmSendImportMessage(h, cm->import_file_name, msg);
\r
11409 CmEndStartupMutex();
\r
11413 void CmSendImportMessage(HWND hWnd, wchar_t *filename, UINT msg)
\r
11415 COPYDATASTRUCT cpy;
\r
11417 if (hWnd == NULL || filename == NULL)
\r
11422 // インポートすべきファイルを指定する
\r
11423 Zero(&cpy, sizeof(cpy));
\r
11425 cpy.cbData = UniStrSize(filename);
\r
11426 cpy.lpData = filename;
\r
11427 cpy.dwData = msg;
\r
11429 SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&cpy);
\r
11433 UINT CmLoginDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
11436 wchar_t server_name[MAX_SIZE];
\r
11437 char password[MAX_PASSWORD_LEN + 1];
\r
11439 if (hWnd == NULL)
\r
11446 case WM_INITDIALOG:
\r
11447 if (cm->server_name != NULL)
\r
11449 StrToUni(server_name, sizeof(server_name), cm->server_name);
\r
11453 UniStrCpy(server_name, sizeof(server_name), _UU("CM_PW_LOCALMACHINE"));
\r
11455 FormatText(hWnd, S_TITLE, server_name);
\r
11462 if (cm->server_name != NULL)
\r
11464 StrToUni(server_name, sizeof(server_name), cm->server_name);
\r
11468 UniStrCpy(server_name, sizeof(server_name), _UU("CM_PW_LOCALMACHINE"));
\r
11470 GetTxtA(hWnd, E_PASSWORD, password, sizeof(password));
\r
11471 cm->Client = CcConnectRpc(cm->server_name == NULL ? "127.0.0.1" : cm->server_name,
\r
11472 password, &bad_pass, NULL, 0);
\r
11473 if (cm->Client == NULL)
\r
11475 MsgBox(hWnd, MB_ICONSTOP, _UU("CM_BAD_PASSWORD"));
\r
11476 FocusEx(hWnd, E_PASSWORD);
\r
11480 EndDialog(hWnd, true);
\r
11490 EndDialog(hWnd, false);
\r
11500 // まず空のパスワードでログインを試みる
\r
11501 bool bad_pass, no_remote;
\r
11502 wchar_t server_name[MAX_SIZE];
\r
11503 RPC_CLIENT_VERSION a;
\r
11506 if (cm->server_name != NULL)
\r
11508 StrToUni(server_name, sizeof(server_name), cm->server_name);
\r
11512 UniStrCpy(server_name, sizeof(server_name), _UU("CM_PW_LOCALMACHINE"));
\r
11516 if ((cm->Client = CcConnectRpc(
\r
11517 cm->server_name == NULL ? "localhost" : cm->server_name,
\r
11518 "", &bad_pass, &no_remote, cm->StartupMode == false ? 0 : 60000)) == NULL)
\r
11523 if (MsgBoxEx(NULL, MB_ICONEXCLAMATION | MB_RETRYCANCEL, _UU("CM_NO_REMOTE"), server_name) == IDRETRY)
\r
11533 else if (bad_pass)
\r
11535 if (Dialog(NULL, D_CM_LOGIN, CmLoginDlgProc, NULL) == false)
\r
11543 if (cm->StartupMode == false && MsgBoxEx(NULL, MB_ICONEXCLAMATION | MB_RETRYCANCEL, _UU("CM_CONNECT_FAILED"), server_name) == IDRETRY)
\r
11555 Zero(&a, sizeof(a));
\r
11556 CcGetClientVersion(cm->Client, &a);
\r
11557 if (a.ClientBuildInt >= 5192)
\r
11559 cm->CmSettingSupported = true;
\r
11560 cm->CmEasyModeSupported = true;
\r
11561 if (OS_IS_WINDOWS_9X(a.OsType))
\r
11563 cm->CmEasyModeSupported = false;
\r
11573 // 引数に /remote があればリモート接続の画面を出す
\r
11574 char *cmdline = GetCommandLineStr();
\r
11576 if (StrCmpi(cmdline, "/remote") == 0)
\r
11578 char *hostname = RemoteDlg(NULL, CM_REG_KEY, ICO_VPN, _UU("CM_TITLE"), _UU("CM_REMOTE_TITLE"), NULL);
\r
11579 if (hostname == NULL)
\r
11583 if (cm->server_name != NULL)
\r
11585 Free(cm->server_name);
\r
11587 cm->server_name = NULL;
\r
11588 if (StrCmpi(hostname, "localhost") != 0 && StrCmpi(hostname, "127.0.0.1") != 0 )
\r
11590 cm->server_name = hostname;
\r
11594 if (StrCmpi(cmdline, "/startup") == 0)
\r
11597 cm->StartupMode = true;
\r
11602 if (IsZero(cm->ShortcutKey, SHA1_SIZE) == false)
\r
11604 //if (MsGetCurrentTerminalSessionId() == 0)
\r
11607 CmConnectShortcut(cm->ShortcutKey);
\r
11611 MsgBoxEx(NULL, MB_ICONEXCLAMATION, _UU("CM_SHORTCUT_DESKTOP_MSG"),
\r
11612 MsGetCurrentTerminalSessionId());
\r
11618 if (LoginCM() == false)
\r
11624 CmUpdateJumpList(0);
\r
11636 if (cm->Client != NULL)
\r
11638 CcDisconnectRpc(cm->Client);
\r
11642 // クライアント接続マネージャ起動関数
\r
11656 void CmEnumHubThread(THREAD *t, void *param)
\r
11658 CM_ENUM_HUB *e = (CM_ENUM_HUB *)param;
\r
11661 if (t == NULL || param == NULL)
\r
11668 LockList(cm->EnumHubList);
\r
11670 Add(cm->EnumHubList, e);
\r
11672 UnlockList(cm->EnumHubList);
\r
11675 NoticeThreadInit(t);
\r
11678 e->Session = NewRpcSession(cm->Cedar, e->ClientOption);
\r
11682 e->Hub = EnumHub(e->Session);
\r
11684 if (e->Hub != NULL)
\r
11688 if (CbNum(hWnd, C_HUBNAME) == 0)
\r
11691 wchar_t tmp[MAX_SIZE];
\r
11692 for (i = 0;i < e->Hub->NumTokens;i++)
\r
11694 StrToUni(tmp, sizeof(tmp), e->Hub->Token[i]);
\r
11695 CbAddStr(hWnd, C_HUBNAME, tmp, 0);
\r
11700 FreeToken(e->Hub);
\r
11704 ReleaseSession(e->Session);
\r
11707 LockList(cm->EnumHubList);
\r
11709 Delete(cm->EnumHubList, e);
\r
11711 UnlockList(cm->EnumHubList);
\r
11713 Free(e->ClientOption);
\r
11718 void CmEnumHubStart(HWND hWnd, CLIENT_OPTION *o)
\r
11723 if (hWnd == NULL || o == NULL)
\r
11728 if (StrLen(o->Hostname) == 0 ||
\r
11734 if (o->ProxyType != PROXY_DIRECT)
\r
11736 if (StrLen(o->ProxyName) == 0 ||
\r
11737 o->ProxyPort == 0)
\r
11743 if (LvNum(hWnd, C_HUBNAME) != 0)
\r
11748 e = ZeroMalloc(sizeof(CM_ENUM_HUB));
\r
11749 e->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
11751 Copy(e->ClientOption, o, sizeof(CLIENT_OPTION));
\r
11753 t = NewThread(CmEnumHubThread, e);
\r
11754 WaitThreadInit(t);
\r
11755 ReleaseThread(t);
\r
11759 void CmInitEnumHub()
\r
11761 cm->EnumHubList = NewList(NULL);
\r
11765 void CmFreeEnumHub()
\r
11769 if (cm->EnumHubList == NULL)
\r
11774 o = NewList(NULL);
\r
11775 LockList(cm->EnumHubList);
\r
11778 for (i = 0;i < LIST_NUM(cm->EnumHubList);i++)
\r
11780 CM_ENUM_HUB *e = LIST_DATA(cm->EnumHubList, i);
\r
11781 Add(o, e->Thread);
\r
11782 AddRef(e->Thread->ref);
\r
11785 UnlockList(cm->EnumHubList);
\r
11787 for (i = 0;i < LIST_NUM(o);i++)
\r
11789 THREAD *t = LIST_DATA(o, i);
\r
11790 WaitThread(t, INFINITE);
\r
11791 ReleaseThread(t);
\r
11795 ReleaseList(cm->EnumHubList);
\r
11798 // クライアント接続マネージャの初期化
\r
11799 #define APPID L"SoftEther.SoftEther UT-VPN Client"
\r
11803 UNI_TOKEN_LIST *ut;
\r
11809 //Set Application ID
\r
11810 if(JL_SetCurrentProcessExplicitAppUserModelID(APPID) != S_OK)
\r
11814 CmDeleteOldStartupTrayFile();
\r
11816 MsSetShutdownParameters(0x4ff, SHUTDOWN_NORETRY);
\r
11819 cm = ZeroMalloc(sizeof(CM));
\r
11821 // コマンドライン引数が設定されている場合はサーバー名として取り扱う
\r
11822 ut = GetCommandLineUniToken();
\r
11824 if (ut->NumTokens >= 1)
\r
11826 if (UniStrLen(ut->Token[0]) != 0)
\r
11828 if (UniStrCmpi(ut->Token[0], L"cm") != 0 && ut->Token[0][0] != L'/')
\r
11830 BUF *b = UniStrToBin(ut->Token[0]);
\r
11831 if (b->Size == SHA1_SIZE)
\r
11833 // 接続設定のショートカットキーとして扱う
\r
11834 Copy(cm->ShortcutKey, b->Buf, SHA1_SIZE);
\r
11838 if (UniEndWith(ut->Token[0], L".uvpn") == false)
\r
11841 cm->server_name = CopyUniToStr(ut->Token[0]);
\r
11845 // インポートファイル名として扱う
\r
11846 cm->import_file_name = CopyUniStr(ut->Token[0]);
\r
11851 else if (UniStrCmpi(ut->Token[0], L"/easy") == 0)
\r
11854 if (ut->NumTokens >= 2)
\r
11856 // インポートすべき接続設定が指定されている
\r
11857 cm->import_file_name = CopyUniStr(ut->Token[1]);
\r
11860 cm->CmSettingInitialFlag = CM_SETTING_INIT_EASY;
\r
11862 else if (UniStrCmpi(ut->Token[0], L"/normal") == 0)
\r
11865 if (ut->NumTokens >= 2)
\r
11867 // インポートすべき接続設定が指定されている
\r
11868 cm->import_file_name = CopyUniStr(ut->Token[1]);
\r
11871 cm->CmSettingInitialFlag = CM_SETTING_INIT_NORMAL;
\r
11873 else if (UniStrCmpi(ut->Token[0], L"/select") == 0)
\r
11876 cm->CmSettingInitialFlag = CM_SETTING_INIT_SELECT;
\r
11881 UniFreeToken(ut);
\r
11883 InitWinUi(_UU("CM_TITLE"), _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));
\r
11886 UseAlpha = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "UseAlpha");
\r
11887 AlphaValue = MsRegReadInt(REG_CURRENT_USER, CM_REG_KEY, "AlphaValue");
\r
11889 cm->Cedar = NewCedar(NULL, NULL);
\r
11893 // クライアント接続マネージャの終了
\r
11902 ReleaseCedar(cm->Cedar);
\r
11907 if (cm->server_name != NULL)
\r
11909 Free(cm->server_name);
\r
11917 //////////////////////////////////////////////////////////////////////////
\r
11920 void *CmUpdateJumpList(UINT start_id)
\r
11924 RPC_CLIENT_ENUM_ACCOUNT a;
\r
11928 JL_PCustomDestinationList pcdl;
\r
11929 JL_PObjectCollection poc;
\r
11930 JL_PShellLink shell;
\r
11931 JL_PObjectArray poaRemoved;
\r
11935 if (cm->server_name != NULL)
\r
11937 // 外部 PC の場合は利用しない
\r
11942 if(SUCCEEDED(JL_CreateCustomDestinationList(&pcdl,APPID)))
\r
11945 JL_DeleteJumpList(pcdl,APPID);
\r
11947 easy = cm->CmSetting.EasyMode;
\r
11949 Zero(&a, sizeof(a));
\r
11952 if (CcEnumAccount(cm->Client, &a) == ERR_NO_ERROR)
\r
11954 o = NewListFast(CiCompareClientAccountEnumItemByLastConnectDateTime);
\r
11956 for (i = 0;i < a.NumItem;i++)
\r
11958 RPC_CLIENT_ENUM_ACCOUNT_ITEM *item = a.Items[i];
\r
11962 if (item->LastConnectDateTime != 0)
\r
11970 if(LIST_NUM(o) > 0)
\r
11973 if(SUCCEEDED(JL_BeginList(pcdl, &poaRemoved)))
\r
11978 if(SUCCEEDED(JL_CreateObjectCollection(&poc)))
\r
11981 for (i = 0;i < MIN(LIST_NUM(o), CM_NUM_RECENT);i++)
\r
11984 RPC_CLIENT_ENUM_ACCOUNT_ITEM *item = (RPC_CLIENT_ENUM_ACCOUNT_ITEM *)LIST_DATA(o, i);
\r
11985 // wchar_t tmp[MAX_PATH];
\r
11986 wchar_t *account_name;
\r
11987 char *server_name;
\r
11989 // CM_ACCOUNT *a;
\r
11990 UCHAR key[SHA1_SIZE];
\r
11991 RPC_CLIENT_GET_ACCOUNT c;
\r
11994 account_name = item->AccountName;
\r
11995 server_name = item->ServerName;
\r
11996 hub_name = item->HubName;
\r
12001 //a = CmGetExistAccountObject(hWnd, account_name);
\r
12009 //Copy(key, a->ShortcutKey, SHA1_SIZE);
\r
12012 Zero(&c, sizeof(c));
\r
12013 UniStrCpy(c.AccountName, sizeof(c.AccountName), account_name);
\r
12014 if (CALL(NULL, CcGetAccount(cm->Client, &c)) == false)
\r
12019 Copy(key, c.ShortcutKey, SHA1_SIZE);
\r
12021 if (IsZero(key, SHA1_SIZE))
\r
12023 //MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_SHORTCUT_UNSUPPORTED"));
\r
12028 //wchar_t target[MAX_PATH];
\r
12029 ////wchar_t workdir[MAX_PATH];
\r
12030 //wchar_t args[MAX_PATH];
\r
12031 ////wchar_t comment[MAX_SIZE];
\r
12032 //wchar_t icon[MAX_PATH];
\r
12034 char key_str[64];
\r
12035 wchar_t target[MAX_PATH];
\r
12036 //wchar_t workdir[MAX_PATH];
\r
12037 wchar_t args[MAX_PATH];
\r
12038 wchar_t commentW[MAX_SIZE];
\r
12039 wchar_t icon[MAX_PATH];
\r
12042 //char icon = "C:\\Server.ico";
\r
12044 BinToStr(key_str, sizeof(key_str), key, SHA1_SIZE);
\r
12045 UniStrCpy(target, sizeof(target), MsGetExeFileNameW());
\r
12046 StrToUni(args, sizeof(args), key_str);
\r
12047 UniStrCpy(icon, sizeof(icon), MsGetExeFileNameW());
\r
12048 UniFormat(commentW, sizeof(commentW), _UU("CM_SHORTCUT_COMMENT"), account_name);
\r
12050 if(item->Connected)
\r
12059 hr = JL_CreateShellLink(
\r
12067 if(SUCCEEDED(hr))
\r
12070 if(SUCCEEDED(JL_ObjectCollectionAddShellLink(poc, shell)))
\r
12072 //Print("Add JumpList %d c:%s\n",i, comment);
\r
12073 //wprintf(comment);
\r
12075 JL_ReleaseShellLink(shell);
\r
12079 CiFreeClientGetAccount(&c);
\r
12082 hr = JL_AddCategoryToList(pcdl,poc,_UU("CM_JUMPLIST_RCCONNECT"),poaRemoved);
\r
12084 if(SUCCEEDED(hr))
\r
12086 //wprintf(L"AddCategory\n");
\r
12088 hr = JL_CommitList(pcdl);
\r
12089 if(SUCCEEDED(hr))
\r
12091 //wprintf(L"JumpList Commit\n");
\r
12096 //wprintf(L"Erro JumpList AddCategory %x\n", hr);
\r
12100 JL_ReleaseObjectCollection(poc);
\r
12109 CiFreeClientEnumAccount(&a);
\r
12116 JL_BeginList(pcdl, &poaRemoved);
\r
12118 JL_CreateObjectCollection(&poc);
\r
12121 for (i = 0; i < 5; i++)
\r
12124 JL_CreateShellLink(
\r
12131 JL_ObjectCollectionAddShellLink(poc, shell);
\r
12133 JL_ReleaseShellLink(shell);
\r
12137 JL_AddCategoryToList(pcdl,poc,_UU("CM_JUMPLIST_RCCONNECT"),poaRemoved);
\r
12138 JL_CommitList(pcdl);
\r
12139 JL_ReleaseObjectCollection(poc);
\r
12141 JL_ReleaseCustomDestinationList(pcdl);
\r