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