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
14 #include <afsconfig.h>
15 #include <afs/param.h>
20 #include "svr_address.h"
24 * PROTOTYPES _________________________________________________________________
28 void ChangeAddr_OnInitDialog (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp);
29 void ChangeAddr_Enable (HWND hDlg, BOOL fEnable);
30 void ChangeAddr_OnSelect (HWND hDlg);
31 void ChangeAddr_OnEndTask_Init (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp, LPTASKPACKET ptp);
32 void ChangeAddr_OnRemove (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp);
33 void ChangeAddr_OnChange (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp);
35 BOOL CALLBACK NewAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
36 void NewAddr_OnInitDialog (HWND hDlg, LPSOCKADDR_IN pAddr);
37 void NewAddr_OnOK (HWND hDlg, LPSOCKADDR_IN pAddr);
41 * SERVER ADDRESSES ___________________________________________________________
45 void Server_FillAddrList (HWND hDlg, LPSERVERSTATUS lpss, BOOL fCanAddUnspecified)
47 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
49 LB_StartChange (hList, TRUE);
51 if (!lpss || !lpss->nAddresses)
53 if (fCanAddUnspecified)
54 (void)LB_AddItem (hList, IDS_SVR_NO_ADDR, (LPARAM)-1);
56 else for (size_t iAddr = 0; iAddr < lpss->nAddresses; ++iAddr)
59 AfsClass_AddressToInt (&AddrInt, &lpss->aAddresses[ iAddr ]);
63 LPTSTR pszAddress = FormatString (TEXT("%1"), TEXT("%a"), &lpss->aAddresses[ iAddr ]);
64 (void)LB_AddItem (hList, pszAddress, (LPARAM)iAddr);
65 FreeString (pszAddress);
68 LB_EndChange (hList, 0);
72 void Server_ParseAddress (LPSOCKADDR_IN pAddr, LPTSTR pszText)
74 int addrNetwork = inet_addr (pszText);
76 memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
77 pAddr->sin_family = AF_INET;
78 pAddr->sin_addr.s_addr = addrNetwork;
82 BOOL Server_Ping (LPSOCKADDR_IN pAddr, LPCTSTR pszServerName)
88 if ((phe = gethostbyname (pszServerName)) == NULL)
89 memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
92 memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
93 pAddr->sin_family = 2;
95 pAddr->sin_addr.s_addr = *(ULONG *)phe->h_addr;
101 memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
108 BOOL CALLBACK ChangeAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
110 if (AfsAppLib_HandleHelp (IDD_SVR_ADDRESS, hDlg, msg, wp, lp))
113 if (msg == WM_INITDIALOG)
114 SetWindowLongPtr (hDlg, DWLP_USER, lp);
116 LPSVR_CHANGEADDR_PARAMS lpp;
117 if ((lpp = (LPSVR_CHANGEADDR_PARAMS)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL)
122 ChangeAddr_OnInitDialog (hDlg, lpp);
123 StartTask (taskSVR_PROP_INIT, hDlg, lpp->lpiServer);
128 if ((ptp = (LPTASKPACKET)lp) != NULL)
130 if (ptp->idTask == taskSVR_PROP_INIT)
131 ChangeAddr_OnEndTask_Init (hDlg, lpp, ptp);
132 FreeTaskPacket (ptp);
139 case IDC_SVR_ADDRESSES:
140 if (HIWORD(wp) == LBN_SELCHANGE)
141 ChangeAddr_OnSelect (hDlg);
144 case IDC_ADDR_CHANGE:
145 ChangeAddr_OnChange (hDlg, lpp);
148 case IDC_ADDR_REMOVE:
149 ChangeAddr_OnRemove (hDlg, lpp);
153 EndDialog (hDlg, IDOK);
157 EndDialog (hDlg, IDCANCEL);
168 void ChangeAddr_OnInitDialog (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp)
170 TCHAR szName[ cchNAME ];
171 lpp->lpiServer->GetServerName (szName);
173 TCHAR szText[ cchRESOURCE ];
174 GetDlgItemText (hDlg, IDC_TITLE, szText, cchRESOURCE);
176 LPTSTR pszTitle = FormatString (szText, TEXT("%s"), szName);
177 SetDlgItemText (hDlg, IDC_TITLE, pszTitle);
178 FreeString (pszTitle);
180 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
181 LB_StartChange (hList, TRUE);
182 LB_AddItem (hList, IDS_QUERYING, 0);
183 LB_EndChange (hList, 0);
185 ChangeAddr_Enable (hDlg, FALSE);
189 void ChangeAddr_Enable (HWND hDlg, BOOL fEnable)
191 EnableWindow (GetDlgItem (hDlg, IDC_SVR_ADDRESSES), fEnable);
192 EnableWindow (GetDlgItem (hDlg, IDC_ADDR_CHANGE), fEnable);
193 EnableWindow (GetDlgItem (hDlg, IDC_ADDR_REMOVE), fEnable);
196 ChangeAddr_OnSelect (hDlg);
200 void ChangeAddr_OnSelect (HWND hDlg)
202 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
203 BOOL fSelected = (LB_GetSelected (hList) != -1) ? TRUE : FALSE;
205 EnableWindow (GetDlgItem (hDlg, IDC_ADDR_CHANGE), fSelected);
206 EnableWindow (GetDlgItem (hDlg, IDC_ADDR_REMOVE), fSelected);
210 void ChangeAddr_OnEndTask_Init (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp, LPTASKPACKET ptp)
214 TCHAR szName[ cchNAME ];
215 lpp->lpiServer->GetServerName (szName);
216 ErrorDialog (ptp->status, IDS_ERROR_REFRESH_SERVER_STATUS, TEXT("%s"), szName);
220 memcpy (&lpp->ssOld, &TASKDATA(ptp)->ss, sizeof(SERVERSTATUS));
221 memcpy (&lpp->ssNew, &TASKDATA(ptp)->ss, sizeof(SERVERSTATUS));
222 ChangeAddr_Enable (hDlg, TRUE);
225 Server_FillAddrList (hDlg, &lpp->ssNew, FALSE);
229 void ChangeAddr_OnRemove (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp)
231 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
234 if ((iSel = LB_GetSelected (hList)) != -1)
236 TCHAR szItem[ cchRESOURCE ] = TEXT("");
237 SendMessage (hList, LB_GETTEXT, iSel, (LPARAM)szItem);
240 Server_ParseAddress (&AddrSel, szItem);
243 AfsClass_AddressToInt (&AddrSelInt, &AddrSel);
247 for (size_t iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr)
250 AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]);
253 AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]);
255 if ((OldAddrInt == AddrSelInt) || (NewAddrInt == AddrSelInt))
257 AfsClass_IntToAddress (&lpp->ssNew.aAddresses[iAddr], 0);
262 Server_FillAddrList (hDlg, &lpp->ssNew, FALSE);
263 ChangeAddr_OnSelect (hDlg);
268 void ChangeAddr_OnChange (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp)
270 HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
273 if ((iSel = LB_GetSelected (hList)) != -1)
275 TCHAR szItem[ cchRESOURCE ] = TEXT("");
276 SendMessage (hList, LB_GETTEXT, iSel, (LPARAM)szItem);
279 Server_ParseAddress (&AddrSel, szItem);
282 AfsClass_AddressToInt (&AddrSelInt, &AddrSel);
286 SOCKADDR_IN AddrNew = AddrSel;
287 if (ModalDialogParam (IDD_SVR_NEWADDR, hDlg, (DLGPROC)NewAddr_DlgProc, (LPARAM)&AddrNew) != IDOK)
291 AfsClass_AddressToInt (&AddrNewInt, &AddrNew);
292 if (AddrNewInt && (AddrNewInt != AddrSelInt))
295 // First see if the new IP address is already in the server's
296 // list of IP addresses--if so, just delete the old address.
299 for (iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr)
302 AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]);
305 AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]);
307 if ((OldAddrInt == AddrNewInt) || (NewAddrInt == AddrNewInt))
314 // Now update the SERVERSTATUS structure.
316 for (iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr)
319 AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]);
322 AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]);
324 if ((OldAddrInt == AddrSelInt) || (NewAddrInt == AddrSelInt))
326 AfsClass_IntToAddress (&lpp->ssNew.aAddresses[iAddr], AddrNewInt);
333 Server_FillAddrList (hDlg, &lpp->ssNew, FALSE);
334 ChangeAddr_OnSelect (hDlg);
339 BOOL CALLBACK NewAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
341 if (AfsAppLib_HandleHelp (IDD_SVR_NEWADDR, hDlg, msg, wp, lp))
344 if (msg == WM_INITDIALOG)
345 SetWindowLongPtr (hDlg, DWLP_USER, lp);
348 if ((pAddr = (LPSOCKADDR_IN)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL)
353 NewAddr_OnInitDialog (hDlg, pAddr);
360 NewAddr_OnOK (hDlg, pAddr);
361 EndDialog (hDlg, IDOK);
365 EndDialog (hDlg, IDCANCEL);
376 void NewAddr_OnInitDialog (HWND hDlg, LPSOCKADDR_IN pAddr)
378 TCHAR szText[ cchRESOURCE ];
379 GetDlgItemText (hDlg, IDC_TITLE, szText, cchRESOURCE);
381 LPTSTR pszTitle = FormatString (szText, TEXT("%a"), pAddr);
382 SetDlgItemText (hDlg, IDC_TITLE, pszTitle);
383 FreeString (pszTitle);
385 SA_SetAddr (GetDlgItem (hDlg, IDC_ADDRESS), pAddr);
389 void NewAddr_OnOK (HWND hDlg, LPSOCKADDR_IN pAddr)
391 SA_GetAddr (GetDlgItem (hDlg, IDC_ADDRESS), pAddr);