2 * Copyright 2000, International Business Machines Corporation and others.
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
11 #include <afs/param.h>
16 #include "svr_address.h"
20 * PROTOTYPES _________________________________________________________________
24 void ChangeAddr_OnInitDialog (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp);
25 void ChangeAddr_Enable (HWND hDlg, BOOL fEnable);
26 void ChangeAddr_OnSelect (HWND hDlg);
27 void ChangeAddr_OnEndTask_Init (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp, LPTASKPACKET ptp);
28 void ChangeAddr_OnRemove (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp);
29 void ChangeAddr_OnChange (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp);
31 BOOL CALLBACK NewAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
32 void NewAddr_OnInitDialog (HWND hDlg, LPSOCKADDR_IN pAddr);
33 void NewAddr_OnOK (HWND hDlg, LPSOCKADDR_IN pAddr);
37 * SERVER ADDRESSES ___________________________________________________________
41 void Server_FillAddrList (HWND hDlg, LPSERVERSTATUS lpss, BOOL fCanAddUnspecified)
43 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
45 LB_StartChange (hList, TRUE);
47 if (!lpss || !lpss->nAddresses)
49 if (fCanAddUnspecified)
50 (void)LB_AddItem (hList, IDS_SVR_NO_ADDR, (LPARAM)-1);
52 else for (size_t iAddr = 0; iAddr < lpss->nAddresses; ++iAddr)
55 AfsClass_AddressToInt (&AddrInt, &lpss->aAddresses[ iAddr ]);
59 LPTSTR pszAddress = FormatString (TEXT("%1"), TEXT("%a"), &lpss->aAddresses[ iAddr ]);
60 (void)LB_AddItem (hList, pszAddress, (LPARAM)iAddr);
61 FreeString (pszAddress);
64 LB_EndChange (hList, 0);
68 void Server_ParseAddress (LPSOCKADDR_IN pAddr, LPTSTR pszText)
70 int addrNetwork = inet_addr (pszText);
72 memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
73 pAddr->sin_family = AF_INET;
74 pAddr->sin_addr.s_addr = addrNetwork;
78 BOOL Server_Ping (LPSOCKADDR_IN pAddr, LPCTSTR pszServerName)
84 if ((phe = gethostbyname (pszServerName)) == NULL)
85 memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
88 memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
89 pAddr->sin_family = 2;
91 pAddr->sin_addr.s_addr = *(ULONG *)phe->h_addr;
97 memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
104 BOOL CALLBACK ChangeAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
106 if (AfsAppLib_HandleHelp (IDD_SVR_ADDRESS, hDlg, msg, wp, lp))
109 if (msg == WM_INITDIALOG)
110 SetWindowLong (hDlg, DWL_USER, lp);
112 LPSVR_CHANGEADDR_PARAMS lpp;
113 if ((lpp = (LPSVR_CHANGEADDR_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
118 ChangeAddr_OnInitDialog (hDlg, lpp);
119 StartTask (taskSVR_PROP_INIT, hDlg, lpp->lpiServer);
124 if ((ptp = (LPTASKPACKET)lp) != NULL)
126 if (ptp->idTask == taskSVR_PROP_INIT)
127 ChangeAddr_OnEndTask_Init (hDlg, lpp, ptp);
128 FreeTaskPacket (ptp);
135 case IDC_SVR_ADDRESSES:
136 if (HIWORD(wp) == LBN_SELCHANGE)
137 ChangeAddr_OnSelect (hDlg);
140 case IDC_ADDR_CHANGE:
141 ChangeAddr_OnChange (hDlg, lpp);
144 case IDC_ADDR_REMOVE:
145 ChangeAddr_OnRemove (hDlg, lpp);
149 EndDialog (hDlg, IDOK);
153 EndDialog (hDlg, IDCANCEL);
164 void ChangeAddr_OnInitDialog (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp)
166 TCHAR szName[ cchNAME ];
167 lpp->lpiServer->GetServerName (szName);
169 TCHAR szText[ cchRESOURCE ];
170 GetDlgItemText (hDlg, IDC_TITLE, szText, cchRESOURCE);
172 LPTSTR pszTitle = FormatString (szText, TEXT("%s"), szName);
173 SetDlgItemText (hDlg, IDC_TITLE, pszTitle);
174 FreeString (pszTitle);
176 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
177 LB_StartChange (hList, TRUE);
178 LB_AddItem (hList, IDS_QUERYING, 0);
179 LB_EndChange (hList, 0);
181 ChangeAddr_Enable (hDlg, FALSE);
185 void ChangeAddr_Enable (HWND hDlg, BOOL fEnable)
187 EnableWindow (GetDlgItem (hDlg, IDC_SVR_ADDRESSES), fEnable);
188 EnableWindow (GetDlgItem (hDlg, IDC_ADDR_CHANGE), fEnable);
189 EnableWindow (GetDlgItem (hDlg, IDC_ADDR_REMOVE), fEnable);
192 ChangeAddr_OnSelect (hDlg);
196 void ChangeAddr_OnSelect (HWND hDlg)
198 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
199 BOOL fSelected = (LB_GetSelected (hList) != -1) ? TRUE : FALSE;
201 EnableWindow (GetDlgItem (hDlg, IDC_ADDR_CHANGE), fSelected);
202 EnableWindow (GetDlgItem (hDlg, IDC_ADDR_REMOVE), fSelected);
206 void ChangeAddr_OnEndTask_Init (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp, LPTASKPACKET ptp)
210 TCHAR szName[ cchNAME ];
211 lpp->lpiServer->GetServerName (szName);
212 ErrorDialog (ptp->status, IDS_ERROR_REFRESH_SERVER_STATUS, TEXT("%s"), szName);
216 memcpy (&lpp->ssOld, &TASKDATA(ptp)->ss, sizeof(SERVERSTATUS));
217 memcpy (&lpp->ssNew, &TASKDATA(ptp)->ss, sizeof(SERVERSTATUS));
218 ChangeAddr_Enable (hDlg, TRUE);
221 Server_FillAddrList (hDlg, &lpp->ssNew, FALSE);
225 void ChangeAddr_OnRemove (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp)
227 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
230 if ((iSel = LB_GetSelected (hList)) != -1)
232 TCHAR szItem[ cchRESOURCE ] = TEXT("");
233 SendMessage (hList, LB_GETTEXT, iSel, (LPARAM)szItem);
236 Server_ParseAddress (&AddrSel, szItem);
239 AfsClass_AddressToInt (&AddrSelInt, &AddrSel);
243 for (size_t iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr)
246 AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]);
249 AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]);
251 if ((OldAddrInt == AddrSelInt) || (NewAddrInt == AddrSelInt))
253 AfsClass_IntToAddress (&lpp->ssNew.aAddresses[iAddr], 0);
258 Server_FillAddrList (hDlg, &lpp->ssNew, FALSE);
259 ChangeAddr_OnSelect (hDlg);
264 void ChangeAddr_OnChange (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp)
266 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
269 if ((iSel = LB_GetSelected (hList)) != -1)
271 TCHAR szItem[ cchRESOURCE ] = TEXT("");
272 SendMessage (hList, LB_GETTEXT, iSel, (LPARAM)szItem);
275 Server_ParseAddress (&AddrSel, szItem);
278 AfsClass_AddressToInt (&AddrSelInt, &AddrSel);
282 SOCKADDR_IN AddrNew = AddrSel;
283 if (ModalDialogParam (IDD_SVR_NEWADDR, hDlg, (DLGPROC)NewAddr_DlgProc, (LPARAM)&AddrNew) != IDOK)
287 AfsClass_AddressToInt (&AddrNewInt, &AddrNew);
288 if (AddrNewInt && (AddrNewInt != AddrSelInt))
291 // First see if the new IP address is already in the server's
292 // list of IP addresses--if so, just delete the old address.
294 for (size_t iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr)
297 AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]);
300 AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]);
302 if ((OldAddrInt == AddrNewInt) || (NewAddrInt == AddrNewInt))
309 // Now update the SERVERSTATUS structure.
311 for (iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr)
314 AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]);
317 AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]);
319 if ((OldAddrInt == AddrSelInt) || (NewAddrInt == AddrSelInt))
321 AfsClass_IntToAddress (&lpp->ssNew.aAddresses[iAddr], AddrNewInt);
328 Server_FillAddrList (hDlg, &lpp->ssNew, FALSE);
329 ChangeAddr_OnSelect (hDlg);
334 BOOL CALLBACK NewAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
336 if (AfsAppLib_HandleHelp (IDD_SVR_NEWADDR, hDlg, msg, wp, lp))
339 if (msg == WM_INITDIALOG)
340 SetWindowLong (hDlg, DWL_USER, lp);
343 if ((pAddr = (LPSOCKADDR_IN)GetWindowLong (hDlg, DWL_USER)) != NULL)
348 NewAddr_OnInitDialog (hDlg, pAddr);
355 NewAddr_OnOK (hDlg, pAddr);
356 EndDialog (hDlg, IDOK);
360 EndDialog (hDlg, IDCANCEL);
371 void NewAddr_OnInitDialog (HWND hDlg, LPSOCKADDR_IN pAddr)
373 TCHAR szText[ cchRESOURCE ];
374 GetDlgItemText (hDlg, IDC_TITLE, szText, cchRESOURCE);
376 LPTSTR pszTitle = FormatString (szText, TEXT("%a"), pAddr);
377 SetDlgItemText (hDlg, IDC_TITLE, pszTitle);
378 FreeString (pszTitle);
380 SA_SetAddr (GetDlgItem (hDlg, IDC_ADDRESS), pAddr);
384 void NewAddr_OnOK (HWND hDlg, LPSOCKADDR_IN pAddr)
386 SA_GetAddr (GetDlgItem (hDlg, IDC_ADDRESS), pAddr);