more-rx-updates-20060504
[openafs.git] / src / WINNT / client_config / dlg_binding.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <winsock2.h>
11 #include <ws2tcpip.h>
12
13 extern "C" {
14 #include <afs/param.h>
15 #include <afs/stds.h>
16 }
17 #include <stdio.h>
18 #include "afs_config.h"
19 #include <lanahelper.h>
20
21 /*
22  * DEFINITIONS ________________________________________________________________
23  *
24  */
25
26
27 // Our dialog data
28 static BOOL fFirstTime = TRUE;
29 int nLanAdapter;
30 LANAINFO* lanainfo = NULL;
31
32 int GetAdapterNumber(TCHAR*);
33
34 /*
35  * PROTOTYPES _________________________________________________________________
36  *
37  */
38
39 void Binding_OnInitDialog (HWND hDlg);
40 void Binding_OnOK(HWND hDlg);
41 void Binding_OnCancel(HWND hDlg);
42 BOOL Binding_OnApply();
43
44 BOOL isGateway = FALSE;
45 /*
46  * ROUTINES ___________________________________________________________________
47  *
48  */
49
50 BOOL CALLBACK Binding_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
51 {
52    switch (msg)
53       {
54       case WM_INITDIALOG:
55          Binding_OnInitDialog (hDlg);
56          break;
57
58       case WM_CTLCOLORSTATIC:
59          if ((HWND)lp == GetDlgItem (hDlg, IDC_CHUNK_SIZE))
60             {
61             if (IsWindowEnabled ((HWND)lp))
62                {
63                static HBRUSH hbrStatic = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
64                SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT));
65                SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW));
66                return (BOOL)hbrStatic;
67                }
68             }
69          break;
70
71       case WM_COMMAND:
72          switch (LOWORD(wp))
73          {
74             case IDHELP:
75                Binding_DlgProc (hDlg, WM_HELP, 0, 0);
76                break;
77
78             case IDOK:
79                 Binding_OnOK(hDlg);
80                 break;
81                 
82             case IDCANCEL:
83                 Binding_OnCancel(hDlg);
84                 break;
85                               case IDC_DEFAULTNIC:
86                 if (HIWORD(wp) == BN_CLICKED)
87                 {
88                   TCHAR name[MAX_PATH];
89                   memset(name, 0, sizeof(name));
90                                           if (IsDlgButtonChecked(hDlg,IDC_DEFAULTNIC))
91                                                   nLanAdapter=-1;
92                                           else
93                   {
94                     HWND hwndCombo = GetDlgItem(hDlg, IDC_NICSELECTION);
95                     if (SendMessage(hwndCombo, CB_GETCURSEL, 0, 0) == CB_ERR)
96                       SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
97
98                     TCHAR selected[MAX_PATH];
99                     memset(selected, 0, sizeof(selected));
100                     SendDlgItemMessage(hDlg, IDC_NICSELECTION, 
101                           WM_GETTEXT, sizeof(selected), 
102                           (LPARAM) selected); 
103
104                     if (_tcslen(selected) <= 0)
105                   
106                       nLanAdapter = -1;
107                     else
108                       nLanAdapter = GetAdapterNumber(selected);
109                   }
110                                     
111                   lana_GetAfsNameString(nLanAdapter, isGateway, name);
112                   SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name);
113                   EnableWindow(GetDlgItem(hDlg,IDC_NICSELECTION),(nLanAdapter!=-1));
114                   break;
115                 }
116             case IDC_NICSELECTION:
117               if (HIWORD(wp) == CBN_SELCHANGE)
118               {
119                 TCHAR name[MAX_PATH];
120                 TCHAR selected[MAX_PATH];
121                 memset(name, 0, sizeof(name));
122                 memset(selected, 0, sizeof(selected));
123                 HWND hwndCombo = GetDlgItem(hDlg, IDC_NICSELECTION);
124                 int i = SendMessage(hwndCombo, CB_GETCURSEL, 0, 0);
125                 if (i != CB_ERR)
126                   SendMessage(hwndCombo, CB_GETLBTEXT, (WPARAM)i, 
127                         (LPARAM) selected); 
128
129                 if (_tcslen(selected) <= 0)
130                   nLanAdapter = -1;
131                 else
132                   nLanAdapter = GetAdapterNumber(selected);
133         
134                                   
135                 lana_GetAfsNameString(nLanAdapter, isGateway, name);
136                 SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name);
137                 break;
138               }
139
140          }
141          break;
142
143       case WM_HELP:
144          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_MISC);
145          break;
146       }
147
148    return FALSE;
149 }
150
151
152 void Binding_OnInitDialog (HWND hDlg)
153 {
154     TCHAR name[MAX_PATH];
155     memset(name, 0, sizeof(name));
156       
157     if (fFirstTime) {
158         Config_GetLanAdapter(&g.Configuration.nLanAdapter);
159         nLanAdapter = g.Configuration.nLanAdapter;
160         isGateway = g.Configuration.fBeGateway;
161         fFirstTime = FALSE;
162     }
163
164     lanainfo = lana_FindLanaByName(NULL);
165
166     // TODO: Show more useful error message.
167     if (!lanainfo) {
168         MessageBox(hDlg, "Unable to obtain LANA list", "LANA ERROR", MB_ICONERROR);
169     } 
170     else
171     { 
172         HWND hwndCombo = GetDlgItem(hDlg, IDC_NICSELECTION);
173         int index = 0;
174         TCHAR tmp[MAX_PATH];
175         while (_tcslen(lanainfo[index].lana_name) > 0)
176         {
177             _stprintf(tmp, "%s (lana number = %d)", lanainfo[index].lana_name, 
178                        lanainfo[index].lana_number);
179             SendMessage(hwndCombo, CB_ADDSTRING, 
180                          0, (LPARAM) tmp);
181             if (nLanAdapter == lanainfo[index].lana_number)
182                 SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM)-1, 
183                              (LPARAM)tmp);
184             index++;
185         }
186     }
187
188     lana_GetAfsNameString(nLanAdapter, isGateway, name);
189     SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name);
190
191     CheckDlgButton (hDlg, IDC_DEFAULTNIC, (nLanAdapter==-1));
192
193     EnableWindow(GetDlgItem(hDlg,IDC_NICSELECTION),(nLanAdapter!=-1));
194 }
195
196 void Binding_OnOK (HWND hDlg)
197 {
198   if (IsDlgButtonChecked(hDlg,IDC_DEFAULTNIC))
199     nLanAdapter = -1;
200   else
201   {
202     TCHAR selected[MAX_PATH];
203     memset(selected, 0, sizeof(selected));
204     SendDlgItemMessage(hDlg, IDC_NICSELECTION, 
205                         WM_GETTEXT, sizeof(selected), 
206                         (LPARAM) selected); 
207
208     if (_tcslen(selected) <= 0)
209     {
210       MessageBox(hDlg, "Please select the NIC to bind to", "Error", MB_ICONERROR);
211       return;
212     }
213     
214     nLanAdapter = GetAdapterNumber(selected);
215
216   }
217  
218    EndDialog(hDlg, IDOK);
219 }
220
221
222 BOOL Binding_OnApply()
223 {
224    if (fFirstTime)
225       return TRUE;
226
227   if (nLanAdapter != g.Configuration.nLanAdapter) {
228       if (!Config_SetLanAdapter (nLanAdapter))
229          return FALSE;
230       g.Configuration.nLanAdapter = nLanAdapter;
231    }
232
233   return TRUE;
234
235    
236 }
237
238 void Binding_OnCancel(HWND hDlg)
239 {
240    fFirstTime = TRUE;
241
242    if (lanainfo)
243    {
244      delete lanainfo;
245      lanainfo = NULL;
246    }
247
248    EndDialog(hDlg, IDCANCEL);
249 }
250
251
252 int GetAdapterNumber(TCHAR* n)
253 {
254   int index = 0;
255   while (_tcslen(lanainfo[index].lana_name) > 0)
256    {
257        if (_tcsncmp(lanainfo[index].lana_name, n, _tcslen(lanainfo[index].lana_name)) == 0)
258        {
259          return lanainfo[index].lana_number;
260        }
261        index++;
262     }
263
264   return -1;
265
266 }