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>
15
#include "afs_config.h"
16
#include "tab_hosts.h"
20
* PROTOTYPES _________________________________________________________________
24
void HostsTab_OnInitDialog (HWND hDlg);
25
BOOL HostsTab_OnApply (HWND hDlg);
26
void HostsTab_OnSelect (HWND hDlg);
27
void HostsTab_OnAdd (HWND hDlg);
28
void HostsTab_OnEdit (HWND hDlg);
29
void HostsTab_OnRemove (HWND hDlg);
31
void HostsTab_FillList (HWND hDlg);
33
BOOL CALLBACK CellEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
34
void CellEdit_OnInitDialog (HWND hDlg);
35
void CellEdit_OnDestroy (HWND hDlg);
36
void CellEdit_OnApply (HWND hDlg);
37
void CellEdit_OnSelect (HWND hDlg);
38
void CellEdit_OnAdd (HWND hDlg);
39
void CellEdit_OnEdit (HWND hDlg);
40
void CellEdit_OnRemove (HWND hDlg);
41
void CellEdit_Enable (HWND hDlg);
42
void CellEdit_AddServerEntry (HWND hDlg, PCELLDBLINE pLine, int iOrder);
43
int CALLBACK CellEdit_SortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2);
45
BOOL CALLBACK ServerEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
46
void ServerEdit_OnInitDialog (HWND hDlg);
47
BOOL ServerEdit_OnOK (HWND hDlg);
49
BOOL TextToAddr (SOCKADDR_IN *pAddr, LPTSTR pszServer);
53
* ROUTINES ___________________________________________________________________
57
BOOL CALLBACK HostsTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
63
Main_OnInitDialog (GetParent(hDlg));
64
HostsTab_OnInitDialog (hDlg);
71
if (!HostsTab_OnApply (hDlg))
72
SetWindowLong (hDlg, DWL_MSGRESULT, TRUE);
76
HostsTab_OnAdd (hDlg);
80
HostsTab_OnEdit (hDlg);
84
HostsTab_OnRemove (hDlg);
88
HostsTab_DlgProc (hDlg, WM_HELP, 0, 0);
95
WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_GENERAL_CCENTER);
97
WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLS);
101
switch (((LPNMHDR)lp)->code)
104
HostsTab_OnSelect (hDlg);
108
if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
109
HostsTab_OnEdit (hDlg);
119
void HostsTab_OnInitDialog (HWND hDlg)
121
if (!g.Configuration.CellServDB.pFirst)
123
CSDB_ReadFile (&g.Configuration.CellServDB, NULL);
125
// Fill in our list with cell names.
127
HostsTab_FillList (hDlg);
128
HostsTab_OnSelect (hDlg);
130
// If this is the Control Center applet, shove the default cell
131
// name onto the tab too.
135
Config_GetCellName (g.Configuration.szCell);
136
SetDlgItemText (hDlg, IDC_CELL, g.Configuration.szCell);
142
BOOL HostsTab_CommitChanges (BOOL fForce)
145
if ((hDlg = PropSheet_FindTabWindow (g.psh, (DLGPROC)HostsTab_DlgProc)) == NULL)
148
SetWindowLong (hDlg, DWL_MSGRESULT, FALSE); // Make sure we try to apply
149
if (HostsTab_OnApply (hDlg))
151
SetWindowLong (hDlg, DWL_MSGRESULT, TRUE);
156
BOOL HostsTab_OnApply (HWND hDlg)
158
// Don't try to do anything if we've already failed the apply
159
if (GetWindowLong (hDlg, DWL_MSGRESULT))
162
if (!CSDB_WriteFile (&g.Configuration.CellServDB))
165
// If this is the Control Center applet, we'll have to validate
166
// the cell name too.
170
TCHAR szNoCell[ cchRESOURCE ];
171
GetString (szNoCell, IDS_CELL_UNKNOWN);
173
TCHAR szCell[ cchRESOURCE ];
174
GetDlgItemText (hDlg, IDC_CELL, szCell, cchRESOURCE);
176
if ((!szCell[0]) || (!lstrcmpi (szNoCell, szCell)))
178
Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_NOCELL_DESC_CC);
182
if (!CSDB_FindCell (&g.Configuration.CellServDB, szCell))
184
Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADCELL_DESC_CC);
188
if (!Config_SetCellName (szCell))
190
lstrcpy (g.Configuration.szCell, szCell);
197
void HostsTab_OnSelect (HWND hDlg)
199
HWND hList = GetDlgItem (hDlg, IDC_LIST);
200
HLISTITEM hItem = FastList_FindFirstSelected (hList);
201
HLISTITEM hNext = FastList_FindNextSelected (hList, hItem);
203
EnableWindow (GetDlgItem (hDlg, IDC_EDIT), !!hItem && !hNext);
204
EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), !!hItem);
208
void HostsTab_OnAdd (HWND hDlg)
210
TCHAR szTitle[ cchRESOURCE ];
211
GetString (szTitle, IDS_CELLADD_TITLE);
213
LPPROPSHEET psh = PropSheet_Create (szTitle, FALSE, GetParent(hDlg), 0);
214
psh->sh.dwFlags |= PSH_NOAPPLYNOW; // Remove the Apply button
215
psh->sh.dwFlags |= PSH_HASHELP; // Add a Help button instead
216
PropSheet_AddTab (psh, szTitle, IDD_CELL_EDIT, (DLGPROC)CellEdit_DlgProc, 0, TRUE);
217
PropSheet_ShowModal (psh);
219
HostsTab_FillList (hDlg);
220
HostsTab_OnSelect (hDlg);
224
void HostsTab_OnEdit (HWND hDlg)
226
HWND hList = GetDlgItem (hDlg, IDC_LIST);
227
HLISTITEM hItem = FastList_FindFirstSelected (hList);
230
PCELLDBLINE pLine = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
232
CSDB_CrackLine (&Info, pLine->szLine);
234
LPTSTR pszTitle = FormatString (IDS_CELLEDIT_TITLE, TEXT("%s"), ((Info.szComment[0]) ? Info.szComment : Info.szCell));
236
LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE, GetParent(hDlg), (LPARAM)pLine);
237
psh->sh.dwFlags |= PSH_NOAPPLYNOW; // Remove the Apply button
238
psh->sh.dwFlags |= PSH_HASHELP; // Add a Help button instead
239
PropSheet_AddTab (psh, ((Info.szComment[0]) ? Info.szComment : Info.szCell), IDD_CELL_EDIT, (DLGPROC)CellEdit_DlgProc, (LPARAM)pLine, TRUE);
240
PropSheet_ShowModal (psh);
242
FreeString (pszTitle);
245
HostsTab_FillList (hDlg);
246
HostsTab_OnSelect (hDlg);
250
void HostsTab_OnRemove (HWND hDlg)
252
HWND hList = GetDlgItem (hDlg, IDC_LIST);
253
HLISTITEM hItem = FastList_FindFirstSelected (hList);
254
HLISTITEM hNext = FastList_FindNextSelected (hList, hItem);
262
if (Message (MB_ICONEXCLAMATION | MB_OKCANCEL, GetCautionTitle(), IDS_HOSTREM_MANY) != IDOK)
267
PCELLDBLINE pLine = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
269
CSDB_CrackLine (&Info, pLine->szLine);
271
if (Message (MB_ICONEXCLAMATION | MB_OKCANCEL, GetCautionTitle(), IDS_HOSTREM_ONE, TEXT("%s"), Info.szCell) != IDOK)
275
for ( ; hItem; hItem = FastList_FindNextSelected (hList, hItem))
277
PCELLDBLINE pLine = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
278
CSDB_RemoveCell (&g.Configuration.CellServDB, pLine);
281
HostsTab_FillList (hDlg);
282
HostsTab_OnSelect (hDlg);
286
void HostsTab_FillList (HWND hDlg)
288
HWND hList = GetDlgItem (hDlg, IDC_LIST);
289
FastList_Begin (hList);
290
FastList_RemoveAll (hList);
292
for (PCELLDBLINE pLine = g.Configuration.CellServDB.pFirst; pLine; pLine = pLine->pNext)
295
if (!CSDB_CrackLine (&Info, pLine->szLine))
300
TCHAR szText[ MAX_PATH ];
301
lstrcpy (szText, Info.szCell);
303
#if 0 // Add this if you like a more verbose Cell Hosts tab
305
wsprintf (&szText[ lstrlen(szText) ], TEXT(" (%s)"), Info.szComment);
309
memset (&ai, 0x00, sizeof(ai));
310
ai.iFirstImage = IMAGE_NOIMAGE;
311
ai.iSecondImage = IMAGE_NOIMAGE;
313
ai.lParam = (LPARAM)pLine;
314
FastList_AddItem (hList, &ai);
317
FastList_End (hList);
321
BOOL CALLBACK CellEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
326
CellEdit_OnInitDialog (hDlg);
330
CellEdit_OnDestroy (hDlg);
337
CellEdit_OnApply (hDlg);
341
CellEdit_Enable (hDlg);
345
CellEdit_Enable (hDlg);
349
CellEdit_OnAdd (hDlg);
350
CellEdit_Enable (hDlg);
354
CellEdit_OnEdit (hDlg);
355
CellEdit_Enable (hDlg);
359
CellEdit_OnRemove (hDlg);
360
CellEdit_Enable (hDlg);
364
CellEdit_DlgProc (hDlg, WM_HELP, 0, 0);
370
if (PropSheet_FindTabParam (hDlg))
371
WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_EDIT);
373
WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_ADD);
377
switch (((LPNMHDR)lp)->code)
380
CellEdit_OnSelect (hDlg);
384
if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
385
CellEdit_OnEdit (hDlg);
386
CellEdit_Enable (hDlg);
396
void CellEdit_OnInitDialog (HWND hDlg)
398
PCELLDBLINE pLine = (PCELLDBLINE)PropSheet_FindTabParam (hDlg);
402
CSDB_CrackLine (&Info, pLine->szLine);
403
SetDlgItemText (hDlg, IDC_CELL, Info.szCell);
404
SetDlgItemText (hDlg, IDC_COMMENT, Info.szComment);
407
for (pLine = pLine->pNext; pLine; pLine = pLine->pNext)
410
if (!CSDB_CrackLine (&Info, pLine->szLine))
415
CellEdit_AddServerEntry (hDlg, pLine, iOrder++);
419
// Prepare the columns on the server list
421
HWND hList = GetDlgItem (hDlg, IDC_LIST);
423
FASTLISTCOLUMN Column;
424
Column.dwFlags = FLCF_JUSTIFY_LEFT;
425
Column.cxWidth = 200;
426
GetString (Column.szText, IDS_SVRCOL_COMMENT);
427
FastList_SetColumn (hList, 0, &Column);
429
Column.dwFlags = FLCF_JUSTIFY_LEFT;
430
Column.cxWidth = 100;
431
GetString (Column.szText, IDS_SVRCOL_SERVER);
432
FastList_SetColumn (hList, 1, &Column);
434
FastList_SetSortFunction (hList, CellEdit_SortFunction);
436
// Remove the Context Help [?] thing from the title bar
438
DWORD dwStyle = GetWindowLong (GetParent (hDlg), GWL_STYLE);
439
dwStyle &= ~DS_CONTEXTHELP;
440
SetWindowLong (GetParent (hDlg), GWL_STYLE, dwStyle);
442
dwStyle = GetWindowLong (GetParent (hDlg), GWL_EXSTYLE);
443
dwStyle &= ~WS_EX_CONTEXTHELP;
444
SetWindowLong (GetParent (hDlg), GWL_EXSTYLE, dwStyle);
446
// A little cleanup and we're done!
448
CellEdit_Enable (hDlg);
449
CellEdit_OnSelect (hDlg);
453
void CellEdit_OnDestroy (HWND hDlg)
455
HWND hList = GetDlgItem (hDlg, IDC_LIST);
456
for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
458
PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
464
void CellEdit_OnApply (HWND hDlg)
466
TCHAR szCell[ cchCELLDBLINE ];
467
GetDlgItemText (hDlg, IDC_CELL, szCell, cchCELLDBLINE);
469
TCHAR szComment[ cchCELLDBLINE ];
470
GetDlgItemText (hDlg, IDC_COMMENT, szComment, cchCELLDBLINE);
472
TCHAR szLinkedCell[ cchCELLDBLINE ] = TEXT("");
474
// Find out if there's already an entry in CellServDB for this cell
476
PCELLDBLINE pCellLine;
477
if ((pCellLine = CSDB_FindCell (&g.Configuration.CellServDB, szCell)) != NULL)
480
if (CSDB_CrackLine (&Info, pCellLine->szLine))
481
lstrcpy (szLinkedCell, Info.szLinkedCell);
484
// Replace our cell's entry in CellServDB, or add one if necessary.
486
if ((pCellLine = CSDB_AddCell (&g.Configuration.CellServDB, szCell, szLinkedCell, szComment)) != NULL)
488
// Remove the old servers from this cell
490
CSDB_RemoveCellServers (&g.Configuration.CellServDB, pCellLine);
492
// Add the servers from our list to the CellServDB
494
PCELLDBLINE pAppendTo = pCellLine;
496
HWND hList = GetDlgItem (hDlg, IDC_LIST);
497
for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
499
PCELLDBLINE pFromList = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
501
pAppendTo = CSDB_AddLine (&g.Configuration.CellServDB, pAppendTo, pFromList->szLine);
507
void CellEdit_OnSelect (HWND hDlg)
509
HWND hList = GetDlgItem (hDlg, IDC_LIST);
510
HLISTITEM hItem = FastList_FindFirstSelected (hList);
511
HLISTITEM hNext = FastList_FindNextSelected (hList, hItem);
513
EnableWindow (GetDlgItem (hDlg, IDC_EDIT), !!hItem && !hNext);
514
EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), !!hItem);
518
void CellEdit_OnAdd (HWND hDlg)
521
memset (&Line, 0x00, sizeof(CELLDBLINE));
525
HWND hList = GetDlgItem (hDlg, IDC_LIST);
526
for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
528
PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
529
iOrder = max (iOrder, 1+ (int)(pInfo->pNext));
532
if (ModalDialogParam (IDD_SERVER_EDIT, hDlg, (DLGPROC)ServerEdit_DlgProc, (LPARAM)&Line) == IDOK)
534
CellEdit_AddServerEntry (hDlg, &Line, iOrder);
539
void CellEdit_OnEdit (HWND hDlg)
541
HWND hList = GetDlgItem (hDlg, IDC_LIST);
542
HLISTITEM hItem = FastList_FindFirstSelected (hList);
543
PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
546
memcpy (&Line, pInfo, sizeof(CELLDBLINE));
548
if (ModalDialogParam (IDD_SERVER_EDIT, hDlg, (DLGPROC)ServerEdit_DlgProc, (LPARAM)&Line) == IDOK)
551
CSDB_CrackLine (&Info, Line.szLine);
553
TCHAR szServer[ cchRESOURCE ];
554
lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&Info.ipServer));
556
FastList_SetItemText (hList, hItem, 0, Info.szComment);
557
FastList_SetItemText (hList, hItem, 1, szServer);
559
lstrcpy (pInfo->szLine, Line.szLine);
564
void CellEdit_OnRemove (HWND hDlg)
566
HWND hList = GetDlgItem (hDlg, IDC_LIST);
567
FastList_Begin (hList);
570
while ((hItem = FastList_FindFirstSelected (hList)) != NULL)
572
PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
574
FastList_RemoveItem (hList, hItem);
577
FastList_End (hList);
581
void CellEdit_Enable (HWND hDlg)
585
TCHAR szText[ cchRESOURCE ];
586
GetDlgItemText (hDlg, IDC_CELL, szText, cchRESOURCE);
590
if (!FastList_FindFirst (GetDlgItem (hDlg, IDC_LIST)))
593
EnableWindow (GetDlgItem (GetParent (hDlg), IDOK), fEnable);
597
void CellEdit_AddServerEntry (HWND hDlg, PCELLDBLINE pLine, int iOrder)
599
HWND hList = GetDlgItem (hDlg, IDC_LIST);
601
PCELLDBLINE pCopy = New (CELLDBLINE);
602
memcpy (pCopy, pLine, sizeof(CELLDBLINE));
604
pCopy->pNext = (PCELLDBLINE)iOrder;
607
CSDB_CrackLine (&Info, pCopy->szLine);
609
TCHAR szServer[ cchRESOURCE ];
610
lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&Info.ipServer));
613
memset (&ai, 0x00, sizeof(ai));
614
ai.iFirstImage = IMAGE_NOIMAGE;
615
ai.iSecondImage = IMAGE_NOIMAGE;
616
ai.pszText = Info.szComment;
617
ai.lParam = (LPARAM)pCopy;
618
HLISTITEM hItem = FastList_AddItem (hList, &ai);
620
FastList_SetItemText (hList, hItem, 1, szServer);
624
int CALLBACK CellEdit_SortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2)
626
if (!hItem1 || !hItem2)
629
PCELLDBLINE pLine1 = (PCELLDBLINE)lpItem1;
630
PCELLDBLINE pLine2 = (PCELLDBLINE)lpItem2;
632
int iOrder1 = (int)(pLine1->pNext);
633
int iOrder2 = (int)(pLine2->pNext);
634
return iOrder1 - iOrder2;
638
BOOL CALLBACK ServerEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
643
SetWindowLong (hDlg, DWL_USER, lp);
644
ServerEdit_OnInitDialog (hDlg);
651
if (ServerEdit_OnOK (hDlg))
652
EndDialog (hDlg, IDOK);
656
EndDialog (hDlg, IDCANCEL);
660
ServerEdit_DlgProc (hDlg, WM_HELP, 0, 0);
663
case IDC_ADDR_SPECIFIC:
664
case IDC_ADDR_LOOKUP:
665
EnableWindow (GetDlgItem (hDlg, IDC_SERVER), IsDlgButtonChecked (hDlg, IDC_ADDR_SPECIFIC));
672
pLine = (PCELLDBLINE)GetWindowLong (hDlg, DWL_USER);
675
if (!CSDB_CrackLine (&Info, pLine->szLine))
676
WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_SERVER_ADD);
678
WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_SERVER_EDIT);
686
void ServerEdit_OnInitDialog (HWND hDlg)
688
PCELLDBLINE pLine = (PCELLDBLINE)GetWindowLong (hDlg, DWL_USER);
690
TCHAR szTitle[ cchRESOURCE ];
692
if (!CSDB_CrackLine (&Info, pLine->szLine))
693
GetString (szTitle, IDS_ADDSERVER_TITLE);
695
GetString (szTitle, IDS_EDITSERVER_TITLE);
696
SetWindowText (hDlg, szTitle);
699
memset (&Addr, 0x00, sizeof(SOCKADDR_IN));
700
Addr.sin_family = AF_INET;
701
Addr.sin_addr.s_addr = Info.ipServer;
702
SA_SetAddr (GetDlgItem (hDlg, IDC_SERVER), &Addr);
704
CheckDlgButton (hDlg, IDC_ADDR_SPECIFIC, !!Info.ipServer);
705
CheckDlgButton (hDlg, IDC_ADDR_LOOKUP, !Info.ipServer);
706
EnableWindow (GetDlgItem (hDlg, IDC_SERVER), IsDlgButtonChecked (hDlg, IDC_ADDR_SPECIFIC));
708
SetDlgItemText (hDlg, IDC_COMMENT, Info.szComment);
712
BOOL ServerEdit_OnOK (HWND hDlg)
714
PCELLDBLINE pLine = (PCELLDBLINE)GetWindowLong (hDlg, DWL_USER);
716
TCHAR szComment[ cchCELLDBLINE ];
717
GetDlgItemText (hDlg, IDC_COMMENT, szComment, cchCELLDBLINE);
720
if (IsDlgButtonChecked (hDlg, IDC_ADDR_SPECIFIC))
722
SA_GetAddr (GetDlgItem (hDlg, IDC_SERVER), &Addr);
723
lstrcpy (szComment, inet_ntoa (*(struct in_addr *)&Addr.sin_addr.s_addr));
725
if (!TextToAddr (&Addr, szComment))
727
Message (MB_ICONHAND, GetErrorTitle(), IDS_BADLOOKUP_DESC, TEXT("%s"), szComment);
731
TCHAR szServer[ cchCELLDBLINE ];
732
lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&Addr.sin_addr.s_addr));
734
CSDB_FormatLine (pLine->szLine, szServer, NULL, szComment, FALSE);
739
BOOL TextToAddr (SOCKADDR_IN *pAddr, LPTSTR pszServer)
741
if (!pszServer || !*pszServer)
745
memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
746
pAddr->sin_family = AF_INET;
748
if ((*pszServer >= TEXT('0')) && (*pszServer <= TEXT('9')))
750
if ((pAddr->sin_addr.s_addr = inet_addr (pszServer)) == 0)
754
if ((pEntry = gethostbyaddr ((char*)&pAddr->sin_addr.s_addr, sizeof(int), AF_INET)) == NULL)
757
if (pEntry->h_name[0])
758
lstrcpy (pszServer, pEntry->h_name); // return the server's fqdn
760
else // Need to lookup the server by its name
763
if ((pEntry = gethostbyname (pszServer)) == NULL)
766
memcpy (&pAddr->sin_addr, (struct in_addr *)pEntry->h_addr, sizeof(struct in_addr));
767
if (!pAddr->sin_addr.s_addr)
770
if (pEntry->h_name[0])
771
lstrcpy (pszServer, pEntry->h_name); // return the server's fqdn