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_salvage.h"
17 #include "propcache.h"
21 * DEFINITIONS ________________________________________________________________
25 #define cxMIN_SALVAGE_R 250 // minimum size of Salvage Results dialog
26 #define cyMIN_SALVAGE_R 200 // minimum size of Salvage Results dialog
30 * RESIZING WINDOWS ___________________________________________________________
34 rwWindowData awdSalvageResults[] = {
35 { IDC_SALVAGE_TITLE, raSizeX | raRepaint },
36 { IDC_SALVAGE_DETAILS, raSizeX | raSizeY | raRepaint, MAKELONG(cxMIN_SALVAGE_R,cyMIN_SALVAGE_R) },
37 { IDOK, raMoveX | raMoveY },
43 * PROTOTYPES _________________________________________________________________
47 BOOL CALLBACK Server_Salvage_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
48 void Server_Salvage_OnInitDialog (HWND hDlg, LPIDENT lpi);
49 void Server_Salvage_OnServer (HWND hDlg, LPIDENT lpi);
50 void Server_Salvage_OnAggregate (HWND hDlg, LPIDENT lpi);
51 void Server_Salvage_OnAllAggregates (HWND hDlg);
52 void Server_Salvage_OnAllFilesets (HWND hDlg);
53 void Server_Salvage_OnSimultaneous (HWND hDlg);
54 void Server_Salvage_OnAdvanced (HWND hDlg);
55 void Server_Salvage_OnOK (HWND hDlg);
57 void Server_Salvage_OnEndTask_EnumServers (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp);
58 void Server_Salvage_OnEndTask_EnumAggregates (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp);
59 void Server_Salvage_OnEndTask_EnumFilesets (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp);
61 BOOL CALLBACK Server_Salvage_Results_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
62 void Server_Salvage_Results_OnInitDialog (HWND hDlg, LPIDENT lpiSalvage);
63 void Server_Salvage_OnEndTask_Salvage (HWND hDlg, LPIDENT lpiSalvage, LPTASKPACKET ptp);
67 * ROUTINES ___________________________________________________________________
71 void Server_Salvage (LPIDENT lpi)
74 if ((hCurrent = PropCache_Search (pcSVR_SALVAGE, lpi)) != NULL)
80 HWND hDlg = ModelessDialogParam (IDD_SVR_SALVAGE, NULL, (DLGPROC)Server_Salvage_DlgProc, (LPARAM)lpi);
81 ShowWindow (hDlg, SW_SHOW);
86 BOOL CALLBACK Server_Salvage_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
88 if (AfsAppLib_HandleHelp (IDD_SVR_SALVAGE, hDlg, msg, wp, lp))
91 if (msg == WM_INITDIALOG)
92 SetWindowLong (hDlg, DWL_USER, lp);
95 if ((lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER)) != NULL)
100 PropCache_Add (pcSVR_SALVAGE, lpi, hDlg);
101 Server_Salvage_OnInitDialog (hDlg, lpi);
102 Server_Salvage_OnAdvanced (hDlg);
107 if ((ptp = (LPTASKPACKET)lp) != NULL)
109 if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX)
110 Server_Salvage_OnEndTask_EnumServers (hDlg, lpi, ptp);
111 else if (ptp->idTask == taskAGG_ENUM_TO_COMBOBOX)
112 Server_Salvage_OnEndTask_EnumAggregates (hDlg, lpi, ptp);
113 else if (ptp->idTask == taskSET_ENUM_TO_COMBOBOX)
114 Server_Salvage_OnEndTask_EnumFilesets (hDlg, lpi, ptp);
115 FreeTaskPacket (ptp);
123 Server_Salvage_OnOK (hDlg);
125 DestroyWindow (hDlg);
129 Server_Salvage_OnServer (hDlg, lpi);
132 Server_Salvage_OnAggregate (hDlg, lpi);
134 case IDC_AGGREGATE_ALL:
135 Server_Salvage_OnAllAggregates (hDlg);
137 case IDC_FILESET_ALL:
138 Server_Salvage_OnAllFilesets (hDlg);
140 case IDC_SALVAGE_SIMUL:
141 Server_Salvage_OnSimultaneous (hDlg);
145 Server_Salvage_OnAdvanced (hDlg);
151 PropCache_Delete (pcSVR_SALVAGE, lpi);
160 void Server_Salvage_OnAdvanced (HWND hDlg)
162 HWND hGroup = GetDlgItem (hDlg, IDC_ADVANCED_GROUP);
168 GetWindowRect (hDlg, &rWindow);
169 GetClientRect (hDlg, &rClient);
170 GetRectInParent (hGroup, &rGroup);
172 if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR)))
174 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR), TRUE);
175 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_SIMUL), TRUE);
176 Server_Salvage_OnSimultaneous (hDlg);
177 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_READONLY), TRUE);
178 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_BLOCK), TRUE);
179 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FORCE), TRUE);
180 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FIXDIRS), TRUE);
181 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_FILE), TRUE);
182 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_INODES), TRUE);
183 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_ROOT), TRUE);
185 SetWindowPos (hDlg, NULL,
188 cyRECT(rWindow) + cyRECT(rGroup) + 14,
189 SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
191 TCHAR szText[ cchRESOURCE ];
192 GetString (szText, IDS_ADVANCEDIN_BUTTON);
193 SetDlgItemText (hDlg, IDC_ADVANCED, szText);
197 SetWindowPos (hDlg, NULL,
200 cyRECT(rWindow) - cyRECT(rGroup) - 14,
201 SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
203 TCHAR szText[ cchRESOURCE ];
204 GetString (szText, IDS_ADVANCEDOUT_BUTTON);
205 SetDlgItemText (hDlg, IDC_ADVANCED, szText);
207 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR), FALSE);
208 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_SIMUL), FALSE);
209 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_NUM), FALSE);
210 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_READONLY), FALSE);
211 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_BLOCK), FALSE);
212 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FORCE), FALSE);
213 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FIXDIRS), FALSE);
214 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_FILE), FALSE);
215 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_INODES), FALSE);
216 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_ROOT), FALSE);
221 void Server_Salvage_OnInitDialog (HWND hDlg, LPIDENT lpi)
223 CheckDlgButton (hDlg, IDC_AGGREGATE_ALL, (lpi->fIsServer()) ? TRUE : FALSE);
224 CheckDlgButton (hDlg, IDC_FILESET_ALL, (lpi->fIsFileset()) ? FALSE : TRUE);
226 EnableWindow (GetDlgItem (hDlg, IDC_SERVER), FALSE);
227 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), FALSE);
228 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE_ALL), FALSE);
229 EnableWindow (GetDlgItem (hDlg, IDC_FILESET), FALSE);
230 EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), FALSE);
231 EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
233 LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET);
234 memset (lpp, 0x00, sizeof(SVR_ENUM_TO_COMBOBOX_PACKET));
235 lpp->hCombo = GetDlgItem (hDlg, IDC_SERVER);
236 lpp->lpiSelect = lpi->GetServer();
237 StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp);
239 CheckDlgButton (hDlg, IDC_SALVAGE_SIMUL, TRUE);
240 CreateSpinner (GetDlgItem(hDlg,IDC_SALVAGE_NUM), 10, FALSE, 2, 4, 12);
244 void Server_Salvage_OnServer (HWND hDlg, LPIDENT lpi)
247 if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
249 LPAGG_ENUM_TO_COMBOBOX_PACKET lpp = New (AGG_ENUM_TO_COMBOBOX_PACKET);
250 memset (lpp, 0x00, sizeof(AGG_ENUM_TO_COMBOBOX_PACKET));
251 lpp->hCombo = GetDlgItem (hDlg, IDC_AGGREGATE);
252 lpp->lpiServer = lpiServer;
253 lpp->lpiSelect = (lpi && (!lpi->fIsCell()) && (!lpi->fIsServer()) && (lpiServer == lpi->GetServer())) ? (lpi->GetAggregate()) : NULL;
254 StartTask (taskAGG_ENUM_TO_COMBOBOX, hDlg, lpp);
259 void Server_Salvage_OnAggregate (HWND hDlg, LPIDENT lpi)
262 if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
264 LPIDENT lpiAggregate;
265 if ((lpiAggregate = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE))) != NULL)
267 LPSET_ENUM_TO_COMBOBOX_PACKET lpp = New (SET_ENUM_TO_COMBOBOX_PACKET);
268 memset (lpp, 0x00, sizeof(SET_ENUM_TO_COMBOBOX_PACKET));
269 lpp->hCombo = GetDlgItem (hDlg, IDC_FILESET);
270 lpp->lpiServer = lpiServer;
271 lpp->lpiAggregate = lpiAggregate;
272 lpp->lpiSelect = ((lpiServer == lpi) && (lpi->fIsFileset())) ? (lpi->GetFileset()) : NULL;
273 StartTask (taskSET_ENUM_TO_COMBOBOX, hDlg, lpp);
279 void Server_Salvage_OnAllAggregates (HWND hDlg)
281 BOOL fAllAggs = IsDlgButtonChecked (hDlg, IDC_AGGREGATE_ALL);
282 BOOL fAllSets = IsDlgButtonChecked (hDlg, IDC_FILESET_ALL);
286 CheckDlgButton (hDlg, IDC_FILESET_ALL, TRUE);
287 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), FALSE);
288 EnableWindow (GetDlgItem (hDlg, IDC_FILESET), FALSE);
289 EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), FALSE);
293 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), TRUE);
294 EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), TRUE);
295 EnableWindow (GetDlgItem (hDlg, IDC_FILESET), !fAllSets);
300 void Server_Salvage_OnAllFilesets (HWND hDlg)
302 BOOL fAllSets = IsDlgButtonChecked (hDlg, IDC_FILESET_ALL);
303 EnableWindow (GetDlgItem (hDlg, IDC_FILESET), !fAllSets);
307 void Server_Salvage_OnSimultaneous (HWND hDlg)
309 BOOL fSimul = IsDlgButtonChecked (hDlg, IDC_SALVAGE_SIMUL);
310 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_NUM), fSimul);
314 void Server_Salvage_OnOK (HWND hDlg)
316 // Prepare a taskSVR_SALVAGE packet
318 LPSVR_SALVAGE_PARAMS lpp = New (SVR_SALVAGE_PARAMS);
319 memset (lpp, 0x00, sizeof(SVR_SALVAGE_PARAMS));
320 GetDlgItemText (hDlg, IDC_SALVAGE_TEMPDIR, lpp->szTempDir, MAX_PATH);
321 GetDlgItemText (hDlg, IDC_SALVAGE_LOG_FILE, lpp->szLogFile, MAX_PATH);
322 lpp->fForce = IsDlgButtonChecked (hDlg, IDC_SALVAGE_FORCE);
323 lpp->fReadonly = IsDlgButtonChecked (hDlg, IDC_SALVAGE_READONLY);
324 lpp->fLogInodes = IsDlgButtonChecked (hDlg, IDC_SALVAGE_LOG_INODES);
325 lpp->fLogRootInodes = IsDlgButtonChecked (hDlg, IDC_SALVAGE_LOG_ROOT);
326 lpp->fRebuildDirs = IsDlgButtonChecked (hDlg, IDC_SALVAGE_FIXDIRS);
327 lpp->fReadBlocks = IsDlgButtonChecked (hDlg, IDC_SALVAGE_BLOCK);
328 if (IsDlgButtonChecked (hDlg, IDC_SALVAGE_SIMUL))
329 lpp->nProcesses = SP_GetPos (GetDlgItem (hDlg, IDC_SALVAGE_NUM));
331 lpp->lpiSalvage = NULL;
332 if (!IsDlgButtonChecked (hDlg, IDC_FILESET_ALL))
333 lpp->lpiSalvage = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_FILESET));
334 if (!lpp->lpiSalvage && !IsDlgButtonChecked (hDlg, IDC_AGGREGATE_ALL))
335 lpp->lpiSalvage = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE));
336 if (!lpp->lpiSalvage) // salvage the whole server
337 lpp->lpiSalvage = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER));
338 if (!lpp->lpiSalvage)
342 // Create (but don't show) a results dialog for this operation.
344 HWND hResults = ModelessDialogParam (IDD_SVR_SALVAGE_RESULTS, NULL, (DLGPROC)Server_Salvage_Results_DlgProc, (LPARAM)(lpp->lpiSalvage));
345 AfsAppLib_RegisterModelessDialog (hDlg);
347 // Fire up the background task; when it finishes, have the task scheduler
348 // send the result packet to that results dialog.
350 StartTask (taskSVR_SALVAGE, hResults, lpp);
355 void Server_Salvage_OnEndTask_EnumServers (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp)
357 // We'll only fill the Servers list once, and that during initialization.
358 // When the filling completes, find out what server is currently selected
359 // (it should already be the one the user chose earlier), and fill the
360 // aggregates list for it. We won't enable anything yet.
363 if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
365 LPAGG_ENUM_TO_COMBOBOX_PACKET lpp = New (AGG_ENUM_TO_COMBOBOX_PACKET);
366 memset (lpp, 0x00, sizeof(AGG_ENUM_TO_COMBOBOX_PACKET));
367 lpp->hCombo = GetDlgItem (hDlg, IDC_AGGREGATE);
368 lpp->lpiServer = lpiServer;
369 lpp->lpiSelect = (lpi && (!lpi->fIsCell()) && (!lpi->fIsServer()) && (lpiServer == lpi->GetServer())) ? (lpi->GetAggregate()) : NULL;
370 StartTask (taskAGG_ENUM_TO_COMBOBOX, hDlg, lpp);
375 void Server_Salvage_OnEndTask_EnumAggregates (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp)
377 // We'll refill the Aggregates list any time the user selected a new server;
378 // and whenever it gets filled, we must next fill the filesets list.
381 if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
383 LPIDENT lpiAggregate;
384 if ((lpiAggregate = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE))) != NULL)
386 LPSET_ENUM_TO_COMBOBOX_PACKET lpp = New (SET_ENUM_TO_COMBOBOX_PACKET);
387 memset (lpp, 0x00, sizeof(SET_ENUM_TO_COMBOBOX_PACKET));
388 lpp->hCombo = GetDlgItem (hDlg, IDC_FILESET);
389 lpp->lpiServer = lpiServer;
390 lpp->lpiAggregate = lpiAggregate;
391 lpp->lpiSelect = ((lpiServer == lpi->GetServer()) && (lpi->fIsFileset())) ? (lpi) : NULL;
392 StartTask (taskSET_ENUM_TO_COMBOBOX, hDlg, lpp);
398 void Server_Salvage_OnEndTask_EnumFilesets (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp)
400 // The filesets list is finished; at this point, the user is free to go
401 // selecting any other server/aggregate/fileset; the OK button should also
404 EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
405 EnableWindow (GetDlgItem (hDlg, IDC_SERVER), TRUE);
406 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE_ALL), TRUE);
408 Server_Salvage_OnAllAggregates (hDlg);
412 BOOL CALLBACK Server_Salvage_Results_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
414 if (AfsAppLib_HandleHelp (IDD_SVR_SALVAGE_RESULTS, hDlg, msg, wp, lp))
417 if (msg == WM_INITDIALOG)
418 SetWindowLong (hDlg, DWL_USER, lp);
421 if ((lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER)) != NULL)
427 GetWindowRect (hDlg, &rWindow);
428 ResizeWindow (hDlg, awdSalvageResults, rwaMoveToHere, &rWindow);
430 Server_Salvage_Results_OnInitDialog (hDlg, lpi);
434 // if (lp==0), we're minimizing--don't call ResizeWindow().
436 ResizeWindow (hDlg, awdSalvageResults, rwaFixupGuts);
441 if ((ptp = (LPTASKPACKET)lp) != NULL)
443 if (ptp->idTask == taskSVR_SALVAGE)
444 Server_Salvage_OnEndTask_Salvage (hDlg, lpi, ptp);
445 FreeTaskPacket (ptp);
454 DestroyWindow (hDlg);
459 case WM_CTLCOLOREDIT:
460 if ((HWND)lp == GetDlgItem (hDlg, IDC_SALVAGE_DETAILS))
462 SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW));
463 return (BOOL)CreateSolidBrush (GetSysColor (COLOR_WINDOW));
472 void Server_Salvage_Results_OnInitDialog (HWND hDlg, LPIDENT lpiSalvage)
474 TCHAR szServer[ cchNAME ];
475 lpiSalvage->GetServerName (szServer);
477 TCHAR szAggregate[ cchNAME ];
478 if (!lpiSalvage->fIsServer())
479 lpiSalvage->GetAggregateName (szAggregate);
481 TCHAR szFileset[ cchNAME ];
482 if (lpiSalvage->fIsFileset())
483 lpiSalvage->GetFilesetName (szFileset);
486 if (lpiSalvage->fIsServer())
487 pszTitle = FormatString (IDS_SALVAGE_SVR, TEXT("%s"), szServer);
488 else if (lpiSalvage->fIsAggregate())
489 pszTitle = FormatString (IDS_SALVAGE_AGG, TEXT("%s%s"), szServer, szAggregate);
490 else // (lpiSalvage->fIsFileset())
491 pszTitle = FormatString (IDS_SALVAGE_SET, TEXT("%s%s%s"), szServer, szAggregate, szFileset);
492 SetDlgItemText (hDlg, IDC_SALVAGE_TITLE, pszTitle);
493 FreeString (pszTitle);
497 void Server_Salvage_OnEndTask_Salvage (HWND hDlg, LPIDENT lpiSalvage, LPTASKPACKET ptp)
501 ErrorDialog (ptp->status, IDS_ERROR_CANT_SALVAGE);
502 DestroyWindow (hDlg);
506 if (TASKDATA(ptp)->pszText1)
508 SetDlgItemText (hDlg, IDC_SALVAGE_DETAILS, TASKDATA(ptp)->pszText1);
512 TCHAR szServer[ cchNAME ];
513 lpiSalvage->GetServerName (szServer);
514 LPTSTR pszNoLog = FormatString (IDS_ERROR_CANT_READ_SALVAGE_LOG, TEXT("%s"), szServer);
515 SetDlgItemText (hDlg, IDC_SALVAGE_DETAILS, pszNoLog);
516 FreeString (pszNoLog);
519 ShowWindow (hDlg, SW_SHOW);