6 #include "afs_config.h"
11 * PROTOTYPES _________________________________________________________________
15 void HostsTab_OnInitDialog (HWND hDlg);
16 BOOL HostsTab_OnApply (HWND hDlg);
17 void HostsTab_OnSelect (HWND hDlg);
18 void HostsTab_OnAdd (HWND hDlg);
19 void HostsTab_OnEdit (HWND hDlg);
20 void HostsTab_OnRemove (HWND hDlg);
22 void HostsTab_FillList (HWND hDlg);
24 BOOL CALLBACK CellEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
25 void CellEdit_OnInitDialog (HWND hDlg);
26 void CellEdit_OnDestroy (HWND hDlg);
27 void CellEdit_OnApply (HWND hDlg);
28 void CellEdit_OnSelect (HWND hDlg);
29 void CellEdit_OnAdd (HWND hDlg);
30 void CellEdit_OnEdit (HWND hDlg);
31 void CellEdit_OnRemove (HWND hDlg);
32 void CellEdit_Enable (HWND hDlg);
33 void CellEdit_AddServerEntry (HWND hDlg, PCELLDBLINE pLine, int iOrder);
34 int CALLBACK CellEdit_SortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2);
36 BOOL CALLBACK ServerEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
37 void ServerEdit_OnInitDialog (HWND hDlg);
38 BOOL ServerEdit_OnOK (HWND hDlg);
40 BOOL TextToAddr (SOCKADDR_IN *pAddr, LPTSTR pszServer);
44 * ROUTINES ___________________________________________________________________
48 BOOL CALLBACK HostsTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
54 Main_OnInitDialog (GetParent(hDlg));
55 HostsTab_OnInitDialog (hDlg);
62 if (!HostsTab_OnApply (hDlg))
63 SetWindowLong (hDlg, DWL_MSGRESULT, TRUE);
67 HostsTab_OnAdd (hDlg);
71 HostsTab_OnEdit (hDlg);
75 HostsTab_OnRemove (hDlg);
79 HostsTab_DlgProc (hDlg, WM_HELP, 0, 0);
86 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_GENERAL_CCENTER);
88 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLS);
92 switch (((LPNMHDR)lp)->code)
95 HostsTab_OnSelect (hDlg);
99 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
100 HostsTab_OnEdit (hDlg);
110 void HostsTab_OnInitDialog (HWND hDlg)
112 if (!g.Configuration.CellServDB.pFirst)
114 CSDB_ReadFile (&g.Configuration.CellServDB, NULL);
116 // Fill in our list with cell names.
118 HostsTab_FillList (hDlg);
119 HostsTab_OnSelect (hDlg);
121 // If this is the Control Center applet, shove the default cell
122 // name onto the tab too.
126 Config_GetCellName (g.Configuration.szCell);
127 SetDlgItemText (hDlg, IDC_CELL, g.Configuration.szCell);
133 BOOL HostsTab_CommitChanges (BOOL fForce)
136 if ((hDlg = PropSheet_FindTabWindow (g.psh, (DLGPROC)HostsTab_DlgProc)) == NULL)
139 SetWindowLong (hDlg, DWL_MSGRESULT, FALSE); // Make sure we try to apply
140 if (HostsTab_OnApply (hDlg))
142 SetWindowLong (hDlg, DWL_MSGRESULT, TRUE);
147 BOOL HostsTab_OnApply (HWND hDlg)
149 // Don't try to do anything if we've already failed the apply
150 if (GetWindowLong (hDlg, DWL_MSGRESULT))
153 if (!CSDB_WriteFile (&g.Configuration.CellServDB))
156 // If this is the Control Center applet, we'll have to validate
157 // the cell name too.
161 TCHAR szNoCell[ cchRESOURCE ];
162 GetString (szNoCell, IDS_CELL_UNKNOWN);
164 TCHAR szCell[ cchRESOURCE ];
165 GetDlgItemText (hDlg, IDC_CELL, szCell, cchRESOURCE);
167 if ((!szCell[0]) || (!lstrcmpi (szNoCell, szCell)))
169 Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_NOCELL_DESC_CC);
173 if (!CSDB_FindCell (&g.Configuration.CellServDB, szCell))
175 Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADCELL_DESC_CC);
179 if (!Config_SetCellName (szCell))
181 lstrcpy (g.Configuration.szCell, szCell);
188 void HostsTab_OnSelect (HWND hDlg)
190 HWND hList = GetDlgItem (hDlg, IDC_LIST);
191 HLISTITEM hItem = FastList_FindFirstSelected (hList);
192 HLISTITEM hNext = FastList_FindNextSelected (hList, hItem);
194 EnableWindow (GetDlgItem (hDlg, IDC_EDIT), !!hItem && !hNext);
195 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), !!hItem);
199 void HostsTab_OnAdd (HWND hDlg)
201 TCHAR szTitle[ cchRESOURCE ];
202 GetString (szTitle, IDS_CELLADD_TITLE);
204 LPPROPSHEET psh = PropSheet_Create (szTitle, FALSE, GetParent(hDlg), 0);
205 psh->sh.dwFlags |= PSH_NOAPPLYNOW; // Remove the Apply button
206 psh->sh.dwFlags |= PSH_HASHELP; // Add a Help button instead
207 PropSheet_AddTab (psh, szTitle, IDD_CELL_EDIT, (DLGPROC)CellEdit_DlgProc, 0, TRUE);
208 PropSheet_ShowModal (psh);
210 HostsTab_FillList (hDlg);
211 HostsTab_OnSelect (hDlg);
215 void HostsTab_OnEdit (HWND hDlg)
217 HWND hList = GetDlgItem (hDlg, IDC_LIST);
218 HLISTITEM hItem = FastList_FindFirstSelected (hList);
221 PCELLDBLINE pLine = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
223 CSDB_CrackLine (&Info, pLine->szLine);
225 LPTSTR pszTitle = FormatString (IDS_CELLEDIT_TITLE, TEXT("%s"), ((Info.szComment[0]) ? Info.szComment : Info.szCell));
227 LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE, GetParent(hDlg), (LPARAM)pLine);
228 psh->sh.dwFlags |= PSH_NOAPPLYNOW; // Remove the Apply button
229 psh->sh.dwFlags |= PSH_HASHELP; // Add a Help button instead
230 PropSheet_AddTab (psh, ((Info.szComment[0]) ? Info.szComment : Info.szCell), IDD_CELL_EDIT, (DLGPROC)CellEdit_DlgProc, (LPARAM)pLine, TRUE);
231 PropSheet_ShowModal (psh);
233 FreeString (pszTitle);
236 HostsTab_FillList (hDlg);
237 HostsTab_OnSelect (hDlg);
241 void HostsTab_OnRemove (HWND hDlg)
243 HWND hList = GetDlgItem (hDlg, IDC_LIST);
244 HLISTITEM hItem = FastList_FindFirstSelected (hList);
245 HLISTITEM hNext = FastList_FindNextSelected (hList, hItem);
253 if (Message (MB_ICONEXCLAMATION | MB_OKCANCEL, GetCautionTitle(), IDS_HOSTREM_MANY) != IDOK)
258 PCELLDBLINE pLine = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
260 CSDB_CrackLine (&Info, pLine->szLine);
262 if (Message (MB_ICONEXCLAMATION | MB_OKCANCEL, GetCautionTitle(), IDS_HOSTREM_ONE, TEXT("%s"), Info.szCell) != IDOK)
266 for ( ; hItem; hItem = FastList_FindNextSelected (hList, hItem))
268 PCELLDBLINE pLine = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
269 CSDB_RemoveCell (&g.Configuration.CellServDB, pLine);
272 HostsTab_FillList (hDlg);
273 HostsTab_OnSelect (hDlg);
277 void HostsTab_FillList (HWND hDlg)
279 HWND hList = GetDlgItem (hDlg, IDC_LIST);
280 FastList_Begin (hList);
281 FastList_RemoveAll (hList);
283 for (PCELLDBLINE pLine = g.Configuration.CellServDB.pFirst; pLine; pLine = pLine->pNext)
286 if (!CSDB_CrackLine (&Info, pLine->szLine))
291 TCHAR szText[ MAX_PATH ];
292 lstrcpy (szText, Info.szCell);
294 #if 0 // Add this if you like a more verbose Cell Hosts tab
296 wsprintf (&szText[ lstrlen(szText) ], TEXT(" (%s)"), Info.szComment);
300 memset (&ai, 0x00, sizeof(ai));
301 ai.iFirstImage = IMAGE_NOIMAGE;
302 ai.iSecondImage = IMAGE_NOIMAGE;
304 ai.lParam = (LPARAM)pLine;
305 FastList_AddItem (hList, &ai);
308 FastList_End (hList);
312 BOOL CALLBACK CellEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
317 CellEdit_OnInitDialog (hDlg);
321 CellEdit_OnDestroy (hDlg);
328 CellEdit_OnApply (hDlg);
332 CellEdit_Enable (hDlg);
336 CellEdit_Enable (hDlg);
340 CellEdit_OnAdd (hDlg);
341 CellEdit_Enable (hDlg);
345 CellEdit_OnEdit (hDlg);
346 CellEdit_Enable (hDlg);
350 CellEdit_OnRemove (hDlg);
351 CellEdit_Enable (hDlg);
355 CellEdit_DlgProc (hDlg, WM_HELP, 0, 0);
361 if (PropSheet_FindTabParam (hDlg))
362 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_EDIT);
364 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_ADD);
368 switch (((LPNMHDR)lp)->code)
371 CellEdit_OnSelect (hDlg);
375 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
376 CellEdit_OnEdit (hDlg);
377 CellEdit_Enable (hDlg);
387 void CellEdit_OnInitDialog (HWND hDlg)
389 PCELLDBLINE pLine = (PCELLDBLINE)PropSheet_FindTabParam (hDlg);
393 CSDB_CrackLine (&Info, pLine->szLine);
394 SetDlgItemText (hDlg, IDC_CELL, Info.szCell);
395 SetDlgItemText (hDlg, IDC_COMMENT, Info.szComment);
398 for (pLine = pLine->pNext; pLine; pLine = pLine->pNext)
401 if (!CSDB_CrackLine (&Info, pLine->szLine))
406 CellEdit_AddServerEntry (hDlg, pLine, iOrder++);
410 // Prepare the columns on the server list
412 HWND hList = GetDlgItem (hDlg, IDC_LIST);
414 FASTLISTCOLUMN Column;
415 Column.dwFlags = FLCF_JUSTIFY_LEFT;
416 Column.cxWidth = 200;
417 GetString (Column.szText, IDS_SVRCOL_COMMENT);
418 FastList_SetColumn (hList, 0, &Column);
420 Column.dwFlags = FLCF_JUSTIFY_LEFT;
421 Column.cxWidth = 100;
422 GetString (Column.szText, IDS_SVRCOL_SERVER);
423 FastList_SetColumn (hList, 1, &Column);
425 FastList_SetSortFunction (hList, CellEdit_SortFunction);
427 // Remove the Context Help [?] thing from the title bar
429 DWORD dwStyle = GetWindowLong (GetParent (hDlg), GWL_STYLE);
430 dwStyle &= ~DS_CONTEXTHELP;
431 SetWindowLong (GetParent (hDlg), GWL_STYLE, dwStyle);
433 dwStyle = GetWindowLong (GetParent (hDlg), GWL_EXSTYLE);
434 dwStyle &= ~WS_EX_CONTEXTHELP;
435 SetWindowLong (GetParent (hDlg), GWL_EXSTYLE, dwStyle);
437 // A little cleanup and we're done!
439 CellEdit_Enable (hDlg);
440 CellEdit_OnSelect (hDlg);
444 void CellEdit_OnDestroy (HWND hDlg)
446 HWND hList = GetDlgItem (hDlg, IDC_LIST);
447 for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
449 PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
455 void CellEdit_OnApply (HWND hDlg)
457 TCHAR szCell[ cchCELLDBLINE ];
458 GetDlgItemText (hDlg, IDC_CELL, szCell, cchCELLDBLINE);
460 TCHAR szComment[ cchCELLDBLINE ];
461 GetDlgItemText (hDlg, IDC_COMMENT, szComment, cchCELLDBLINE);
463 TCHAR szLinkedCell[ cchCELLDBLINE ] = TEXT("");
465 // Find out if there's already an entry in CellServDB for this cell
467 PCELLDBLINE pCellLine;
468 if ((pCellLine = CSDB_FindCell (&g.Configuration.CellServDB, szCell)) != NULL)
471 if (CSDB_CrackLine (&Info, pCellLine->szLine))
472 lstrcpy (szLinkedCell, Info.szLinkedCell);
475 // Replace our cell's entry in CellServDB, or add one if necessary.
477 if ((pCellLine = CSDB_AddCell (&g.Configuration.CellServDB, szCell, szLinkedCell, szComment)) != NULL)
479 // Remove the old servers from this cell
481 CSDB_RemoveCellServers (&g.Configuration.CellServDB, pCellLine);
483 // Add the servers from our list to the CellServDB
485 PCELLDBLINE pAppendTo = pCellLine;
487 HWND hList = GetDlgItem (hDlg, IDC_LIST);
488 for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
490 PCELLDBLINE pFromList = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
492 pAppendTo = CSDB_AddLine (&g.Configuration.CellServDB, pAppendTo, pFromList->szLine);
498 void CellEdit_OnSelect (HWND hDlg)
500 HWND hList = GetDlgItem (hDlg, IDC_LIST);
501 HLISTITEM hItem = FastList_FindFirstSelected (hList);
502 HLISTITEM hNext = FastList_FindNextSelected (hList, hItem);
504 EnableWindow (GetDlgItem (hDlg, IDC_EDIT), !!hItem && !hNext);
505 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), !!hItem);
509 void CellEdit_OnAdd (HWND hDlg)
512 memset (&Line, 0x00, sizeof(CELLDBLINE));
516 HWND hList = GetDlgItem (hDlg, IDC_LIST);
517 for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
519 PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
520 iOrder = max (iOrder, 1+ (int)(pInfo->pNext));
523 if (ModalDialogParam (IDD_SERVER_EDIT, hDlg, (DLGPROC)ServerEdit_DlgProc, (LPARAM)&Line) == IDOK)
525 CellEdit_AddServerEntry (hDlg, &Line, iOrder);
530 void CellEdit_OnEdit (HWND hDlg)
532 HWND hList = GetDlgItem (hDlg, IDC_LIST);
533 HLISTITEM hItem = FastList_FindFirstSelected (hList);
534 PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
537 memcpy (&Line, pInfo, sizeof(CELLDBLINE));
539 if (ModalDialogParam (IDD_SERVER_EDIT, hDlg, (DLGPROC)ServerEdit_DlgProc, (LPARAM)&Line) == IDOK)
542 CSDB_CrackLine (&Info, Line.szLine);
544 TCHAR szServer[ cchRESOURCE ];
545 lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&Info.ipServer));
547 FastList_SetItemText (hList, hItem, 0, Info.szComment);
548 FastList_SetItemText (hList, hItem, 1, szServer);
550 lstrcpy (pInfo->szLine, Line.szLine);
555 void CellEdit_OnRemove (HWND hDlg)
557 HWND hList = GetDlgItem (hDlg, IDC_LIST);
558 FastList_Begin (hList);
561 while ((hItem = FastList_FindFirstSelected (hList)) != NULL)
563 PCELLDBLINE pInfo = (PCELLDBLINE)FastList_GetItemParam (hList, hItem);
565 FastList_RemoveItem (hList, hItem);
568 FastList_End (hList);
572 void CellEdit_Enable (HWND hDlg)
576 TCHAR szText[ cchRESOURCE ];
577 GetDlgItemText (hDlg, IDC_CELL, szText, cchRESOURCE);
581 if (!FastList_FindFirst (GetDlgItem (hDlg, IDC_LIST)))
584 EnableWindow (GetDlgItem (GetParent (hDlg), IDOK), fEnable);
588 void CellEdit_AddServerEntry (HWND hDlg, PCELLDBLINE pLine, int iOrder)
590 HWND hList = GetDlgItem (hDlg, IDC_LIST);
592 PCELLDBLINE pCopy = New (CELLDBLINE);
593 memcpy (pCopy, pLine, sizeof(CELLDBLINE));
595 pCopy->pNext = (PCELLDBLINE)iOrder;
598 CSDB_CrackLine (&Info, pCopy->szLine);
600 TCHAR szServer[ cchRESOURCE ];
601 lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&Info.ipServer));
604 memset (&ai, 0x00, sizeof(ai));
605 ai.iFirstImage = IMAGE_NOIMAGE;
606 ai.iSecondImage = IMAGE_NOIMAGE;
607 ai.pszText = Info.szComment;
608 ai.lParam = (LPARAM)pCopy;
609 HLISTITEM hItem = FastList_AddItem (hList, &ai);
611 FastList_SetItemText (hList, hItem, 1, szServer);
615 int CALLBACK CellEdit_SortFunction (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2)
617 if (!hItem1 || !hItem2)
620 PCELLDBLINE pLine1 = (PCELLDBLINE)lpItem1;
621 PCELLDBLINE pLine2 = (PCELLDBLINE)lpItem2;
623 int iOrder1 = (int)(pLine1->pNext);
624 int iOrder2 = (int)(pLine2->pNext);
625 return iOrder1 - iOrder2;
629 BOOL CALLBACK ServerEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
634 SetWindowLong (hDlg, DWL_USER, lp);
635 ServerEdit_OnInitDialog (hDlg);
642 if (ServerEdit_OnOK (hDlg))
643 EndDialog (hDlg, IDOK);
647 EndDialog (hDlg, IDCANCEL);
651 ServerEdit_DlgProc (hDlg, WM_HELP, 0, 0);
654 case IDC_ADDR_SPECIFIC:
655 case IDC_ADDR_LOOKUP:
656 EnableWindow (GetDlgItem (hDlg, IDC_SERVER), IsDlgButtonChecked (hDlg, IDC_ADDR_SPECIFIC));
663 pLine = (PCELLDBLINE)GetWindowLong (hDlg, DWL_USER);
666 if (!CSDB_CrackLine (&Info, pLine->szLine))
667 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_SERVER_ADD);
669 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_CELLPROP_SERVER_EDIT);
677 void ServerEdit_OnInitDialog (HWND hDlg)
679 PCELLDBLINE pLine = (PCELLDBLINE)GetWindowLong (hDlg, DWL_USER);
681 TCHAR szTitle[ cchRESOURCE ];
683 if (!CSDB_CrackLine (&Info, pLine->szLine))
684 GetString (szTitle, IDS_ADDSERVER_TITLE);
686 GetString (szTitle, IDS_EDITSERVER_TITLE);
687 SetWindowText (hDlg, szTitle);
690 memset (&Addr, 0x00, sizeof(SOCKADDR_IN));
691 Addr.sin_family = AF_INET;
692 Addr.sin_addr.s_addr = Info.ipServer;
693 SA_SetAddr (GetDlgItem (hDlg, IDC_SERVER), &Addr);
695 CheckDlgButton (hDlg, IDC_ADDR_SPECIFIC, !!Info.ipServer);
696 CheckDlgButton (hDlg, IDC_ADDR_LOOKUP, !Info.ipServer);
697 EnableWindow (GetDlgItem (hDlg, IDC_SERVER), IsDlgButtonChecked (hDlg, IDC_ADDR_SPECIFIC));
699 SetDlgItemText (hDlg, IDC_COMMENT, Info.szComment);
703 BOOL ServerEdit_OnOK (HWND hDlg)
705 PCELLDBLINE pLine = (PCELLDBLINE)GetWindowLong (hDlg, DWL_USER);
707 TCHAR szComment[ cchCELLDBLINE ];
708 GetDlgItemText (hDlg, IDC_COMMENT, szComment, cchCELLDBLINE);
711 if (IsDlgButtonChecked (hDlg, IDC_ADDR_SPECIFIC))
713 SA_GetAddr (GetDlgItem (hDlg, IDC_SERVER), &Addr);
714 lstrcpy (szComment, inet_ntoa (*(struct in_addr *)&Addr.sin_addr.s_addr));
716 if (!TextToAddr (&Addr, szComment))
718 Message (MB_ICONHAND, GetErrorTitle(), IDS_BADLOOKUP_DESC, TEXT("%s"), szComment);
722 TCHAR szServer[ cchCELLDBLINE ];
723 lstrcpy (szServer, inet_ntoa (*(struct in_addr *)&Addr.sin_addr.s_addr));
725 CSDB_FormatLine (pLine->szLine, szServer, NULL, szComment, FALSE);
730 BOOL TextToAddr (SOCKADDR_IN *pAddr, LPTSTR pszServer)
732 if (!pszServer || !*pszServer)
736 memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
737 pAddr->sin_family = AF_INET;
739 if ((*pszServer >= TEXT('0')) && (*pszServer <= TEXT('9')))
741 if ((pAddr->sin_addr.s_addr = inet_addr (pszServer)) == 0)
745 if ((pEntry = gethostbyaddr ((char*)&pAddr->sin_addr.s_addr, sizeof(int), AF_INET)) == NULL)
748 if (pEntry->h_name[0])
749 lstrcpy (pszServer, pEntry->h_name); // return the server's fqdn
751 else // Need to lookup the server by its name
754 if ((pEntry = gethostbyname (pszServer)) == NULL)
757 memcpy (&pAddr->sin_addr, (struct in_addr *)pEntry->h_addr, sizeof(struct in_addr));
758 if (!pAddr->sin_addr.s_addr)
761 if (pEntry->h_name[0])
762 lstrcpy (pszServer, pEntry->h_name); // return the server's fqdn