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_hosts.h"
17 #include "propcache.h"
22 * DEFINITIONS ________________________________________________________________
30 } SVR_HOSTS_PARAMS, *LPSVR_HOSTS_PARAMS;
35 TCHAR szHost[ cchNAME ];
36 } SVR_ADDHOST_PARAMS, *LPSVR_ADDHOST_PARAMS;
40 * PROTOTYPES _________________________________________________________________
44 void Server_Hosts_Free (LPSVR_HOSTS_PARAMS lpp);
46 BOOL CALLBACK Server_Hosts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
48 void Server_Hosts_OnInitDialog (HWND hDlg, LPSVR_HOSTS_PARAMS lpp);
49 void Server_Hosts_OnEndTask_ListOpen (HWND hDlg, LPSVR_HOSTS_PARAMS lpp, LPTASKPACKET ptp);
50 void Server_Hosts_OnApply (HWND hDlg, LPSVR_HOSTS_PARAMS lpp);
51 void Server_Hosts_OnSelect (HWND hDlg, LPSVR_HOSTS_PARAMS lpp);
52 void Server_Hosts_OnAddEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp);
53 void Server_Hosts_OnDelEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp);
55 BOOL CALLBACK Server_AddHost_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
56 void Server_AddHost_OnInitDialog (HWND hDlg, LPSVR_ADDHOST_PARAMS lpp);
57 void Server_AddHost_EnableOK (HWND hDlg);
61 * ROUTINES ___________________________________________________________________
65 void Server_Hosts (LPIDENT lpiServer)
68 if ((hCurrent = PropCache_Search (pcSVR_HOSTS, lpiServer)) != NULL)
74 LPSVR_HOSTS_PARAMS lpp = New (SVR_HOSTS_PARAMS);
75 memset (lpp, 0x00, sizeof(SVR_HOSTS_PARAMS));
76 lpp->lpiServer = lpiServer;
78 TCHAR szServer[ cchNAME ];
79 lpiServer->GetServerName (szServer);
80 LPTSTR pszTitle = FormatString (IDS_SVR_HOSTS_TITLE, TEXT("%s"), szServer);
81 LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE);
82 PropSheet_AddTab (psh, IDS_SVR_HOST_TAB, IDD_SVR_HOSTS, (DLGPROC)Server_Hosts_DlgProc, (LONG)lpp, TRUE);
83 PropSheet_ShowModeless (psh);
84 FreeString (pszTitle);
89 void Server_Hosts_Free (LPSVR_HOSTS_PARAMS lpp)
92 AfsClass_HostList_Free (lpp->lpList);
97 BOOL CALLBACK Server_Hosts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
99 if (AfsAppLib_HandleHelp (IDD_SVR_HOSTS, hDlg, msg, wp, lp))
102 LPSVR_HOSTS_PARAMS lpp;
103 if ((msg == WM_INITDIALOG_SHEET) || (msg == WM_DESTROY_SHEET))
104 lpp = (LPSVR_HOSTS_PARAMS)lp;
106 lpp = (LPSVR_HOSTS_PARAMS)PropSheet_FindTabParam (hDlg);
110 case WM_INITDIALOG_SHEET:
111 PropCache_Add (pcSVR_HOSTS, lpp->lpiServer, hDlg);
114 case WM_DESTROY_SHEET:
115 PropCache_Delete (hDlg);
119 Server_Hosts_OnInitDialog (hDlg, lpp);
123 Server_Hosts_Free (lpp);
128 if ((ptp = (LPTASKPACKET)lp) != NULL)
130 if (ptp->idTask == taskSVR_HOSTLIST_OPEN)
131 Server_Hosts_OnEndTask_ListOpen (hDlg, lpp, ptp);
132 FreeTaskPacket (ptp);
140 Server_Hosts_OnApply (hDlg, lpp);
144 Server_Hosts_OnAddEntry (hDlg, lpp);
145 PropSheetChanged (hDlg);
148 case IDC_HOST_REMOVE:
149 Server_Hosts_OnDelEntry (hDlg, lpp);
150 PropSheetChanged (hDlg);
156 switch (((LPNMHDR)lp)->code)
159 if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_HOST_LIST))
161 Server_Hosts_OnSelect (hDlg, lpp);
172 void Server_Hosts_OnInitDialog (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
174 TCHAR szServer[ cchNAME ];
175 lpp->lpiServer->GetServerName (szServer);
177 LPTSTR pszText = FormatString (IDS_HOST_TITLE, TEXT("%s"), szServer);
178 SetDlgItemText (hDlg, IDC_HOST_TITLE, pszText);
179 FreeString (pszText);
181 HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
183 // We'll need an imagelist, if we want icons in the list.
186 if ((hLarge = ImageList_Create (32, 32, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0)
187 AfsAppLib_AddToImageList (hLarge, IDI_SERVER, TRUE);
190 if ((hSmall = ImageList_Create (16, 16, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0)
191 AfsAppLib_AddToImageList (hSmall, IDI_SERVER, FALSE);
193 FastList_SetImageLists (hList, hSmall, hLarge);
195 // Start loading the host list
197 StartTask (taskSVR_HOSTLIST_OPEN, hDlg, lpp->lpiServer);
199 EnableWindow (hList, FALSE);
200 EnableWindow (GetDlgItem (hDlg, IDC_HOST_ADD), FALSE);
201 EnableWindow (GetDlgItem (hDlg, IDC_HOST_REMOVE), FALSE);
205 void Server_Hosts_OnEndTask_ListOpen (HWND hDlg, LPSVR_HOSTS_PARAMS lpp, LPTASKPACKET ptp)
207 HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
209 lpp->lpList = TASKDATA(ptp)->lpHostList;
213 FL_StartChange (hList, TRUE);
217 for (size_t iEntry = 0; iEntry < lpp->lpList->cEntries; ++iEntry)
219 LPHOSTLISTENTRY pEntry = &lpp->lpList->aEntries[ iEntry ];
220 if (pEntry->szHost[0] == TEXT('\0'))
223 FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pEntry->szHost);
227 FL_EndChange (hList, 0);
228 EnableWindow (hList, (lpp->lpList != NULL));
229 EnableWindow (GetDlgItem (hDlg, IDC_HOST_ADD), (lpp->lpList != NULL));
231 Server_Hosts_OnSelect (hDlg, lpp);
235 void Server_Hosts_OnSelect (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
237 HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
239 BOOL fEnableRemove = TRUE;
241 if (!IsWindowEnabled (hList))
242 fEnableRemove = FALSE;
244 if (FastList_FindFirstSelected (hList) == NULL)
245 fEnableRemove = FALSE;
247 EnableWindow (GetDlgItem (hDlg, IDC_HOST_REMOVE), fEnableRemove);
251 void Server_Hosts_OnApply (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
253 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_HOST_LIST)))
255 // Increment the reference counter on this host list before handing
256 // it off to the Save task. When the Save task is done, it will attempt
257 // to free the list--which will decrement the counter again, and
258 // actually free the list if the counter hits zero.
260 InterlockedIncrement (&lpp->lpList->cRef);
261 StartTask (taskSVR_HOSTLIST_SAVE, NULL, lpp->lpList);
266 void Server_Hosts_OnAddEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
268 LPSVR_ADDHOST_PARAMS pAdd = New (SVR_ADDHOST_PARAMS);
269 memset (pAdd, 0x00, sizeof(pAdd));
270 pAdd->lpiServer = lpp->lpiServer;
272 if (ModalDialogParam (IDD_SVR_ADDHOST, hDlg, (DLGPROC)Server_AddHost_DlgProc, (LPARAM)pAdd) == IDOK)
274 for (size_t iEntry = 0; iEntry < lpp->lpList->cEntries; ++iEntry)
276 LPHOSTLISTENTRY pEntry = &lpp->lpList->aEntries[ iEntry ];
277 if (pEntry->szHost[0] == TEXT('\0'))
279 if (!lstrcmpi (pEntry->szHost, pAdd->szHost))
283 if (iEntry >= lpp->lpList->cEntries)
285 iEntry = AfsClass_HostList_AddEntry (lpp->lpList, pAdd->szHost);
288 HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
289 FL_StartChange (hList, FALSE);
292 if ((hItem = FastList_FindItem (hList, (LPARAM)iEntry)) == NULL)
294 hItem = FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pAdd->szHost);
297 FL_EndChange (hList, (LPARAM)hItem);
304 void Server_Hosts_OnDelEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
306 HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
307 FL_StartChange (hList, FALSE);
310 while ((hItem = FastList_FindFirstSelected (hList)) != NULL)
312 size_t iEntry = (size_t)FL_GetData (hList, hItem);
313 AfsClass_HostList_DelEntry (lpp->lpList, iEntry);
314 FastList_RemoveItem (hList, hItem);
317 FL_EndChange (hList);
321 BOOL CALLBACK Server_AddHost_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
323 if (AfsAppLib_HandleHelp (IDD_SVR_ADDHOST, hDlg, msg, wp, lp))
326 if (msg == WM_INITDIALOG)
327 SetWindowLong (hDlg, DWL_USER, lp);
329 LPSVR_ADDHOST_PARAMS lpp;
330 if ((lpp = (LPSVR_ADDHOST_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
335 Server_AddHost_OnInitDialog (hDlg, lpp);
342 GetDlgItemText (hDlg, IDC_ADDHOST_HOST, lpp->szHost, cchNAME);
343 EndDialog (hDlg, LOWORD(wp));
347 EndDialog (hDlg, LOWORD(wp));
350 case IDC_ADDHOST_HOST:
351 Server_AddHost_EnableOK (hDlg);
362 void Server_AddHost_OnInitDialog (HWND hDlg, LPSVR_ADDHOST_PARAMS lpp)
364 TCHAR szDesc[ cchRESOURCE ];
365 GetDlgItemText (hDlg, IDC_ADDHOST_DESC, szDesc, cchRESOURCE);
367 TCHAR szServer[ cchNAME ];
368 lpp->lpiServer->GetServerName (szServer);
370 LPTSTR pszDesc = FormatString (szDesc, TEXT("%s"), szServer);
371 SetDlgItemText (hDlg, IDC_ADDHOST_DESC, pszDesc);
372 FreeString (pszDesc);
374 Server_AddHost_EnableOK (hDlg);
378 void Server_AddHost_EnableOK (HWND hDlg)
380 TCHAR szHost[ cchNAME ];
381 GetDlgItemText (hDlg, IDC_ADDHOST_HOST, szHost, cchNAME);
383 EnableWindow (GetDlgItem (hDlg, IDOK), (szHost[0] != TEXT('\0')) ? TRUE : FALSE);