windows-vs2005b2-20050706
[openafs.git] / src / WINNT / afssvrmgr / svr_hosts.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 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include "svrmgr.h"
16 #include "svr_hosts.h"
17 #include "propcache.h"
18 #include "display.h"
19
20
21 /*
22  * DEFINITIONS ________________________________________________________________
23  *
24  */
25
26 typedef struct
27    {
28    LPIDENT lpiServer;
29    LPHOSTLIST lpList;
30    } SVR_HOSTS_PARAMS, *LPSVR_HOSTS_PARAMS;
31
32 typedef struct
33    {
34    LPIDENT lpiServer;
35    TCHAR szHost[ cchNAME ];
36    } SVR_ADDHOST_PARAMS, *LPSVR_ADDHOST_PARAMS;
37
38
39 /*
40  * PROTOTYPES _________________________________________________________________
41  *
42  */
43
44 void Server_Hosts_Free (LPSVR_HOSTS_PARAMS lpp);
45
46 BOOL CALLBACK Server_Hosts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
47
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);
54
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);
58
59
60 /*
61  * ROUTINES ___________________________________________________________________
62  *
63  */
64
65 void Server_Hosts (LPIDENT lpiServer)
66 {
67    HWND hCurrent;
68    if ((hCurrent = PropCache_Search (pcSVR_HOSTS, lpiServer)) != NULL)
69       {
70       SetFocus (hCurrent);
71       }
72    else
73       {
74       LPSVR_HOSTS_PARAMS lpp = New (SVR_HOSTS_PARAMS);
75       memset (lpp, 0x00, sizeof(SVR_HOSTS_PARAMS));
76       lpp->lpiServer = lpiServer;
77
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);
85       }
86 }
87
88
89 void Server_Hosts_Free (LPSVR_HOSTS_PARAMS lpp)
90 {
91    if (lpp->lpList)
92       AfsClass_HostList_Free (lpp->lpList);
93    Delete (lpp);
94 }
95
96
97 BOOL CALLBACK Server_Hosts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
98 {
99    if (AfsAppLib_HandleHelp (IDD_SVR_HOSTS, hDlg, msg, wp, lp))
100       return TRUE;
101
102    LPSVR_HOSTS_PARAMS lpp;
103    if ((msg == WM_INITDIALOG_SHEET) || (msg == WM_DESTROY_SHEET))
104       lpp = (LPSVR_HOSTS_PARAMS)lp;
105    else
106       lpp = (LPSVR_HOSTS_PARAMS)PropSheet_FindTabParam (hDlg);
107
108    switch (msg)
109       {
110       case WM_INITDIALOG_SHEET:
111          PropCache_Add (pcSVR_HOSTS, lpp->lpiServer, hDlg);
112          break;
113
114       case WM_DESTROY_SHEET:
115          PropCache_Delete (hDlg);
116          break;
117
118       case WM_INITDIALOG:
119          Server_Hosts_OnInitDialog (hDlg, lpp);
120          break;
121
122       case WM_DESTROY:
123          Server_Hosts_Free (lpp);
124          break;
125
126       case WM_ENDTASK:
127          LPTASKPACKET ptp;
128          if ((ptp = (LPTASKPACKET)lp) != NULL)
129             {
130             if (ptp->idTask == taskSVR_HOSTLIST_OPEN)
131                Server_Hosts_OnEndTask_ListOpen (hDlg, lpp, ptp);
132             FreeTaskPacket (ptp);
133             }
134          break;
135
136       case WM_COMMAND:
137          switch (LOWORD(wp))
138             {
139             case IDAPPLY:
140                Server_Hosts_OnApply (hDlg, lpp);
141                break;
142
143             case IDC_HOST_ADD:
144                Server_Hosts_OnAddEntry (hDlg, lpp);
145                PropSheetChanged (hDlg);
146                break;
147
148             case IDC_HOST_REMOVE:
149                Server_Hosts_OnDelEntry (hDlg, lpp);
150                PropSheetChanged (hDlg);
151                break;
152             }
153          break;
154
155       case WM_NOTIFY:
156          switch (((LPNMHDR)lp)->code)
157             { 
158             case FLN_ITEMSELECT:
159                if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_HOST_LIST))
160                   {
161                   Server_Hosts_OnSelect (hDlg, lpp);
162                   }
163                break;
164             }
165          break;
166       }
167
168    return FALSE;
169 }
170
171
172 void Server_Hosts_OnInitDialog (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
173 {
174    TCHAR szServer[ cchNAME ];
175    lpp->lpiServer->GetServerName (szServer);
176
177    LPTSTR pszText = FormatString (IDS_HOST_TITLE, TEXT("%s"), szServer);
178    SetDlgItemText (hDlg, IDC_HOST_TITLE, pszText);
179    FreeString (pszText);
180
181    HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
182
183    // We'll need an imagelist, if we want icons in the list.
184    //
185    HIMAGELIST hLarge;
186    if ((hLarge = ImageList_Create (32, 32, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0)
187       AfsAppLib_AddToImageList (hLarge, IDI_SERVER, TRUE);
188
189    HIMAGELIST hSmall;
190    if ((hSmall = ImageList_Create (16, 16, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0)
191       AfsAppLib_AddToImageList (hSmall, IDI_SERVER, FALSE);
192
193    FastList_SetImageLists (hList, hSmall, hLarge);
194
195    // Start loading the host list
196    //
197    StartTask (taskSVR_HOSTLIST_OPEN, hDlg, lpp->lpiServer);
198
199    EnableWindow (hList, FALSE);
200    EnableWindow (GetDlgItem (hDlg, IDC_HOST_ADD), FALSE);
201    EnableWindow (GetDlgItem (hDlg, IDC_HOST_REMOVE), FALSE);
202 }
203
204
205 void Server_Hosts_OnEndTask_ListOpen (HWND hDlg, LPSVR_HOSTS_PARAMS lpp, LPTASKPACKET ptp)
206 {
207    HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
208
209    lpp->lpList = TASKDATA(ptp)->lpHostList;
210
211    // Populate the list
212    //
213    FL_StartChange (hList, TRUE);
214
215    if (lpp->lpList)
216       {
217       for (size_t iEntry = 0; iEntry < lpp->lpList->cEntries; ++iEntry)
218          {
219          LPHOSTLISTENTRY pEntry = &lpp->lpList->aEntries[ iEntry ];
220          if (pEntry->szHost[0] == TEXT('\0'))
221             continue;
222
223          FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pEntry->szHost);
224          }
225       }
226
227    FL_EndChange (hList, 0);
228    EnableWindow (hList, (lpp->lpList != NULL));
229    EnableWindow (GetDlgItem (hDlg, IDC_HOST_ADD), (lpp->lpList != NULL));
230
231    Server_Hosts_OnSelect (hDlg, lpp);
232 }
233
234
235 void Server_Hosts_OnSelect (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
236 {
237    HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
238
239    BOOL fEnableRemove = TRUE;
240
241    if (!IsWindowEnabled (hList))
242       fEnableRemove = FALSE;
243
244    if (FastList_FindFirstSelected (hList) == NULL)
245       fEnableRemove = FALSE;
246
247    EnableWindow (GetDlgItem (hDlg, IDC_HOST_REMOVE), fEnableRemove);
248 }
249
250
251 void Server_Hosts_OnApply (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
252 {
253    if (IsWindowEnabled (GetDlgItem (hDlg, IDC_HOST_LIST)))
254       {
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.
259       //
260       InterlockedIncrement (&lpp->lpList->cRef);
261       StartTask (taskSVR_HOSTLIST_SAVE, NULL, lpp->lpList);
262       }
263 }
264
265
266 void Server_Hosts_OnAddEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
267 {
268    LPSVR_ADDHOST_PARAMS pAdd = New (SVR_ADDHOST_PARAMS);
269    memset (pAdd, 0x00, sizeof(pAdd));
270    pAdd->lpiServer = lpp->lpiServer;
271
272    if (ModalDialogParam (IDD_SVR_ADDHOST, hDlg, (DLGPROC)Server_AddHost_DlgProc, (LPARAM)pAdd) == IDOK)
273       {
274       size_t iEntry;
275       for (iEntry = 0; iEntry < lpp->lpList->cEntries; ++iEntry)
276          {
277          LPHOSTLISTENTRY pEntry = &lpp->lpList->aEntries[ iEntry ];
278          if (pEntry->szHost[0] == TEXT('\0'))
279             continue;
280          if (!lstrcmpi (pEntry->szHost, pAdd->szHost))
281             break;
282          }
283
284       if (iEntry >= lpp->lpList->cEntries)
285          {
286          iEntry = AfsClass_HostList_AddEntry (lpp->lpList, pAdd->szHost);
287          }
288
289       HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
290       FL_StartChange (hList, FALSE);
291
292       HLISTITEM hItem;
293       if ((hItem = FastList_FindItem (hList, (LPARAM)iEntry)) == NULL)
294          {
295          hItem = FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pAdd->szHost);
296          }
297
298       FL_EndChange (hList, (LPARAM)hItem);
299       }
300
301    Delete (pAdd);
302 }
303
304
305 void Server_Hosts_OnDelEntry (HWND hDlg, LPSVR_HOSTS_PARAMS lpp)
306 {
307    HWND hList = GetDlgItem (hDlg, IDC_HOST_LIST);
308    FL_StartChange (hList, FALSE);
309
310    HLISTITEM hItem;
311    while ((hItem = FastList_FindFirstSelected (hList)) != NULL)
312       {
313       size_t iEntry = (size_t)FL_GetData (hList, hItem);
314       AfsClass_HostList_DelEntry (lpp->lpList, iEntry);
315       FastList_RemoveItem (hList, hItem);
316       }
317
318    FL_EndChange (hList);
319 }
320
321
322 BOOL CALLBACK Server_AddHost_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
323 {
324    if (AfsAppLib_HandleHelp (IDD_SVR_ADDHOST, hDlg, msg, wp, lp))
325       return TRUE;
326
327    if (msg == WM_INITDIALOG)
328       SetWindowLong (hDlg, DWL_USER, lp);
329
330    LPSVR_ADDHOST_PARAMS lpp;
331    if ((lpp = (LPSVR_ADDHOST_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
332       {
333       switch (msg)
334          {
335          case WM_INITDIALOG:
336             Server_AddHost_OnInitDialog (hDlg, lpp);
337             break;
338
339          case WM_COMMAND:
340             switch (LOWORD(wp))
341                {
342                case IDOK:
343                   GetDlgItemText (hDlg, IDC_ADDHOST_HOST, lpp->szHost, cchNAME);
344                   EndDialog (hDlg, LOWORD(wp));
345                   break;
346
347                case IDCANCEL:
348                   EndDialog (hDlg, LOWORD(wp));
349                   break;
350
351                case IDC_ADDHOST_HOST:
352                   Server_AddHost_EnableOK (hDlg);
353                   break;
354                }
355             break;
356          }
357       }
358
359    return FALSE;
360 }
361
362
363 void Server_AddHost_OnInitDialog (HWND hDlg, LPSVR_ADDHOST_PARAMS lpp)
364 {
365    TCHAR szDesc[ cchRESOURCE ];
366    GetDlgItemText (hDlg, IDC_ADDHOST_DESC, szDesc, cchRESOURCE);
367
368    TCHAR szServer[ cchNAME ];
369    lpp->lpiServer->GetServerName (szServer);
370
371    LPTSTR pszDesc = FormatString (szDesc, TEXT("%s"), szServer);
372    SetDlgItemText (hDlg, IDC_ADDHOST_DESC, pszDesc);
373    FreeString (pszDesc);
374
375    Server_AddHost_EnableOK (hDlg);
376 }
377
378
379 void Server_AddHost_EnableOK (HWND hDlg)
380 {
381    TCHAR szHost[ cchNAME ];
382    GetDlgItemText (hDlg, IDC_ADDHOST_HOST, szHost, cchNAME);
383
384    EnableWindow (GetDlgItem (hDlg, IDOK), (szHost[0] != TEXT('\0')) ? TRUE : FALSE);
385 }
386