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
14 #include <afs/param.h>
19 #include "svr_salvage.h"
20 #include "propcache.h"
24 * DEFINITIONS ________________________________________________________________
28 #define cxMIN_SALVAGE_R 250 // minimum size of Salvage Results dialog
29 #define cyMIN_SALVAGE_R 200 // minimum size of Salvage Results dialog
33 * RESIZING WINDOWS ___________________________________________________________
37 rwWindowData awdSalvageResults[] = {
38 { IDC_SALVAGE_TITLE, raSizeX | raRepaint, 0, 0 },
39 { IDC_SALVAGE_DETAILS, raSizeX | raSizeY | raRepaint, MAKELONG(cxMIN_SALVAGE_R,cyMIN_SALVAGE_R), 0 },
40 { IDOK, raMoveX | raMoveY, 0, 0 },
41 { idENDLIST, 0, 0, 0 }
46 * PROTOTYPES _________________________________________________________________
50 BOOL CALLBACK Server_Salvage_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
51 void Server_Salvage_OnInitDialog (HWND hDlg, LPIDENT lpi);
52 void Server_Salvage_OnServer (HWND hDlg, LPIDENT lpi);
53 void Server_Salvage_OnAggregate (HWND hDlg, LPIDENT lpi);
54 void Server_Salvage_OnAllAggregates (HWND hDlg);
55 void Server_Salvage_OnAllFilesets (HWND hDlg);
56 void Server_Salvage_OnSimultaneous (HWND hDlg);
57 void Server_Salvage_OnAdvanced (HWND hDlg);
58 void Server_Salvage_OnOK (HWND hDlg);
60 void Server_Salvage_OnEndTask_EnumServers (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp);
61 void Server_Salvage_OnEndTask_EnumAggregates (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp);
62 void Server_Salvage_OnEndTask_EnumFilesets (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp);
64 BOOL CALLBACK Server_Salvage_Results_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
65 void Server_Salvage_Results_OnInitDialog (HWND hDlg, LPIDENT lpiSalvage);
66 void Server_Salvage_OnEndTask_Salvage (HWND hDlg, LPIDENT lpiSalvage, LPTASKPACKET ptp);
70 * ROUTINES ___________________________________________________________________
74 void Server_Salvage (LPIDENT lpi)
77 if ((hCurrent = PropCache_Search (pcSVR_SALVAGE, lpi)) != NULL)
83 HWND hDlg = ModelessDialogParam (IDD_SVR_SALVAGE, NULL, (DLGPROC)Server_Salvage_DlgProc, (LPARAM)lpi);
84 ShowWindow (hDlg, SW_SHOW);
89 BOOL CALLBACK Server_Salvage_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
91 if (AfsAppLib_HandleHelp (IDD_SVR_SALVAGE, hDlg, msg, wp, lp))
94 if (msg == WM_INITDIALOG)
95 SetWindowLongPtr (hDlg, DWLP_USER, lp);
98 if ((lpi = (LPIDENT)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL)
103 PropCache_Add (pcSVR_SALVAGE, lpi, hDlg);
104 Server_Salvage_OnInitDialog (hDlg, lpi);
105 Server_Salvage_OnAdvanced (hDlg);
110 if ((ptp = (LPTASKPACKET)lp) != NULL)
112 if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX)
113 Server_Salvage_OnEndTask_EnumServers (hDlg, lpi, ptp);
114 else if (ptp->idTask == taskAGG_ENUM_TO_COMBOBOX)
115 Server_Salvage_OnEndTask_EnumAggregates (hDlg, lpi, ptp);
116 else if (ptp->idTask == taskSET_ENUM_TO_COMBOBOX)
117 Server_Salvage_OnEndTask_EnumFilesets (hDlg, lpi, ptp);
118 FreeTaskPacket (ptp);
126 Server_Salvage_OnOK (hDlg);
128 DestroyWindow (hDlg);
132 Server_Salvage_OnServer (hDlg, lpi);
135 Server_Salvage_OnAggregate (hDlg, lpi);
137 case IDC_AGGREGATE_ALL:
138 Server_Salvage_OnAllAggregates (hDlg);
140 case IDC_FILESET_ALL:
141 Server_Salvage_OnAllFilesets (hDlg);
143 case IDC_SALVAGE_SIMUL:
144 Server_Salvage_OnSimultaneous (hDlg);
148 Server_Salvage_OnAdvanced (hDlg);
154 PropCache_Delete (pcSVR_SALVAGE, lpi);
163 void Server_Salvage_OnAdvanced (HWND hDlg)
165 HWND hGroup = GetDlgItem (hDlg, IDC_ADVANCED_GROUP);
171 GetWindowRect (hDlg, &rWindow);
172 GetClientRect (hDlg, &rClient);
173 GetRectInParent (hGroup, &rGroup);
175 if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR)))
177 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR), TRUE);
178 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_SIMUL), TRUE);
179 Server_Salvage_OnSimultaneous (hDlg);
180 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_READONLY), TRUE);
181 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_BLOCK), TRUE);
182 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FORCE), TRUE);
183 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FIXDIRS), TRUE);
184 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_FILE), TRUE);
185 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_INODES), TRUE);
186 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_ROOT), TRUE);
188 SetWindowPos (hDlg, NULL,
191 cyRECT(rWindow) + cyRECT(rGroup) + 14,
192 SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
194 TCHAR szText[ cchRESOURCE ];
195 GetString (szText, IDS_ADVANCEDIN_BUTTON);
196 SetDlgItemText (hDlg, IDC_ADVANCED, szText);
200 SetWindowPos (hDlg, NULL,
203 cyRECT(rWindow) - cyRECT(rGroup) - 14,
204 SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
206 TCHAR szText[ cchRESOURCE ];
207 GetString (szText, IDS_ADVANCEDOUT_BUTTON);
208 SetDlgItemText (hDlg, IDC_ADVANCED, szText);
210 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR), FALSE);
211 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_SIMUL), FALSE);
212 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_NUM), FALSE);
213 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_READONLY), FALSE);
214 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_BLOCK), FALSE);
215 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FORCE), FALSE);
216 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_FIXDIRS), FALSE);
217 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_FILE), FALSE);
218 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_INODES), FALSE);
219 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_LOG_ROOT), FALSE);
224 void Server_Salvage_OnInitDialog (HWND hDlg, LPIDENT lpi)
226 CheckDlgButton (hDlg, IDC_AGGREGATE_ALL, (lpi->fIsServer()) ? TRUE : FALSE);
227 CheckDlgButton (hDlg, IDC_FILESET_ALL, (lpi->fIsFileset()) ? FALSE : TRUE);
229 EnableWindow (GetDlgItem (hDlg, IDC_SERVER), FALSE);
230 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), FALSE);
231 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE_ALL), FALSE);
232 EnableWindow (GetDlgItem (hDlg, IDC_FILESET), FALSE);
233 EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), FALSE);
234 EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
236 LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET);
237 memset (lpp, 0x00, sizeof(SVR_ENUM_TO_COMBOBOX_PACKET));
238 lpp->hCombo = GetDlgItem (hDlg, IDC_SERVER);
239 lpp->lpiSelect = lpi->GetServer();
240 StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp);
242 CheckDlgButton (hDlg, IDC_SALVAGE_SIMUL, TRUE);
243 CreateSpinner (GetDlgItem(hDlg,IDC_SALVAGE_NUM), 10, FALSE, 2, 4, 12);
247 void Server_Salvage_OnServer (HWND hDlg, LPIDENT lpi)
250 if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
252 LPAGG_ENUM_TO_COMBOBOX_PACKET lpp = New (AGG_ENUM_TO_COMBOBOX_PACKET);
253 memset (lpp, 0x00, sizeof(AGG_ENUM_TO_COMBOBOX_PACKET));
254 lpp->hCombo = GetDlgItem (hDlg, IDC_AGGREGATE);
255 lpp->lpiServer = lpiServer;
256 lpp->lpiSelect = (lpi && (!lpi->fIsCell()) && (!lpi->fIsServer()) && (lpiServer == lpi->GetServer())) ? (lpi->GetAggregate()) : NULL;
257 StartTask (taskAGG_ENUM_TO_COMBOBOX, hDlg, lpp);
262 void Server_Salvage_OnAggregate (HWND hDlg, LPIDENT lpi)
265 if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
267 LPIDENT lpiAggregate;
268 if ((lpiAggregate = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE))) != NULL)
270 LPSET_ENUM_TO_COMBOBOX_PACKET lpp = New (SET_ENUM_TO_COMBOBOX_PACKET);
271 memset (lpp, 0x00, sizeof(SET_ENUM_TO_COMBOBOX_PACKET));
272 lpp->hCombo = GetDlgItem (hDlg, IDC_FILESET);
273 lpp->lpiServer = lpiServer;
274 lpp->lpiAggregate = lpiAggregate;
275 lpp->lpiSelect = ((lpiServer == lpi) && (lpi->fIsFileset())) ? (lpi->GetFileset()) : NULL;
276 StartTask (taskSET_ENUM_TO_COMBOBOX, hDlg, lpp);
282 void Server_Salvage_OnAllAggregates (HWND hDlg)
284 BOOL fAllAggs = IsDlgButtonChecked (hDlg, IDC_AGGREGATE_ALL);
285 BOOL fAllSets = IsDlgButtonChecked (hDlg, IDC_FILESET_ALL);
289 CheckDlgButton (hDlg, IDC_FILESET_ALL, TRUE);
290 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), FALSE);
291 EnableWindow (GetDlgItem (hDlg, IDC_FILESET), FALSE);
292 EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), FALSE);
296 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), TRUE);
297 EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), TRUE);
298 EnableWindow (GetDlgItem (hDlg, IDC_FILESET), !fAllSets);
303 void Server_Salvage_OnAllFilesets (HWND hDlg)
305 BOOL fAllSets = IsDlgButtonChecked (hDlg, IDC_FILESET_ALL);
306 EnableWindow (GetDlgItem (hDlg, IDC_FILESET), !fAllSets);
310 void Server_Salvage_OnSimultaneous (HWND hDlg)
312 BOOL fSimul = IsDlgButtonChecked (hDlg, IDC_SALVAGE_SIMUL);
313 EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_NUM), fSimul);
317 void Server_Salvage_OnOK (HWND hDlg)
319 // Prepare a taskSVR_SALVAGE packet
321 LPSVR_SALVAGE_PARAMS lpp = New (SVR_SALVAGE_PARAMS);
322 memset (lpp, 0x00, sizeof(SVR_SALVAGE_PARAMS));
323 GetDlgItemText (hDlg, IDC_SALVAGE_TEMPDIR, lpp->szTempDir, MAX_PATH);
324 GetDlgItemText (hDlg, IDC_SALVAGE_LOG_FILE, lpp->szLogFile, MAX_PATH);
325 lpp->fForce = IsDlgButtonChecked (hDlg, IDC_SALVAGE_FORCE);
326 lpp->fReadonly = IsDlgButtonChecked (hDlg, IDC_SALVAGE_READONLY);
327 lpp->fLogInodes = IsDlgButtonChecked (hDlg, IDC_SALVAGE_LOG_INODES);
328 lpp->fLogRootInodes = IsDlgButtonChecked (hDlg, IDC_SALVAGE_LOG_ROOT);
329 lpp->fRebuildDirs = IsDlgButtonChecked (hDlg, IDC_SALVAGE_FIXDIRS);
330 lpp->fReadBlocks = IsDlgButtonChecked (hDlg, IDC_SALVAGE_BLOCK);
331 if (IsDlgButtonChecked (hDlg, IDC_SALVAGE_SIMUL))
332 lpp->nProcesses = (int)SP_GetPos (GetDlgItem (hDlg, IDC_SALVAGE_NUM));
334 lpp->lpiSalvage = NULL;
335 if (!IsDlgButtonChecked (hDlg, IDC_FILESET_ALL))
336 lpp->lpiSalvage = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_FILESET));
337 if (!lpp->lpiSalvage && !IsDlgButtonChecked (hDlg, IDC_AGGREGATE_ALL))
338 lpp->lpiSalvage = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE));
339 if (!lpp->lpiSalvage) // salvage the whole server
340 lpp->lpiSalvage = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER));
341 if (!lpp->lpiSalvage)
345 // Create (but don't show) a results dialog for this operation.
347 HWND hResults = ModelessDialogParam (IDD_SVR_SALVAGE_RESULTS, NULL, (DLGPROC)Server_Salvage_Results_DlgProc, (LPARAM)(lpp->lpiSalvage));
348 AfsAppLib_RegisterModelessDialog (hDlg);
350 // Fire up the background task; when it finishes, have the task scheduler
351 // send the result packet to that results dialog.
353 StartTask (taskSVR_SALVAGE, hResults, lpp);
358 void Server_Salvage_OnEndTask_EnumServers (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp)
360 // We'll only fill the Servers list once, and that during initialization.
361 // When the filling completes, find out what server is currently selected
362 // (it should already be the one the user chose earlier), and fill the
363 // aggregates list for it. We won't enable anything yet.
366 if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
368 LPAGG_ENUM_TO_COMBOBOX_PACKET lpp = New (AGG_ENUM_TO_COMBOBOX_PACKET);
369 memset (lpp, 0x00, sizeof(AGG_ENUM_TO_COMBOBOX_PACKET));
370 lpp->hCombo = GetDlgItem (hDlg, IDC_AGGREGATE);
371 lpp->lpiServer = lpiServer;
372 lpp->lpiSelect = (lpi && (!lpi->fIsCell()) && (!lpi->fIsServer()) && (lpiServer == lpi->GetServer())) ? (lpi->GetAggregate()) : NULL;
373 StartTask (taskAGG_ENUM_TO_COMBOBOX, hDlg, lpp);
378 void Server_Salvage_OnEndTask_EnumAggregates (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp)
380 // We'll refill the Aggregates list any time the user selected a new server;
381 // and whenever it gets filled, we must next fill the filesets list.
384 if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
386 LPIDENT lpiAggregate;
387 if ((lpiAggregate = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE))) != NULL)
389 LPSET_ENUM_TO_COMBOBOX_PACKET lpp = New (SET_ENUM_TO_COMBOBOX_PACKET);
390 memset (lpp, 0x00, sizeof(SET_ENUM_TO_COMBOBOX_PACKET));
391 lpp->hCombo = GetDlgItem (hDlg, IDC_FILESET);
392 lpp->lpiServer = lpiServer;
393 lpp->lpiAggregate = lpiAggregate;
394 lpp->lpiSelect = ((lpiServer == lpi->GetServer()) && (lpi->fIsFileset())) ? (lpi) : NULL;
395 StartTask (taskSET_ENUM_TO_COMBOBOX, hDlg, lpp);
401 void Server_Salvage_OnEndTask_EnumFilesets (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp)
403 // The filesets list is finished; at this point, the user is free to go
404 // selecting any other server/aggregate/fileset; the OK button should also
407 EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
408 EnableWindow (GetDlgItem (hDlg, IDC_SERVER), TRUE);
409 EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE_ALL), TRUE);
411 Server_Salvage_OnAllAggregates (hDlg);
415 BOOL CALLBACK Server_Salvage_Results_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
417 if (AfsAppLib_HandleHelp (IDD_SVR_SALVAGE_RESULTS, hDlg, msg, wp, lp))
420 if (msg == WM_INITDIALOG)
421 SetWindowLongPtr (hDlg, DWLP_USER, lp);
424 if ((lpi = (LPIDENT)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL)
430 GetWindowRect (hDlg, &rWindow);
431 ResizeWindow (hDlg, awdSalvageResults, rwaMoveToHere, &rWindow);
433 Server_Salvage_Results_OnInitDialog (hDlg, lpi);
437 // if (lp==0), we're minimizing--don't call ResizeWindow().
439 ResizeWindow (hDlg, awdSalvageResults, rwaFixupGuts);
444 if ((ptp = (LPTASKPACKET)lp) != NULL)
446 if (ptp->idTask == taskSVR_SALVAGE)
447 Server_Salvage_OnEndTask_Salvage (hDlg, lpi, ptp);
448 FreeTaskPacket (ptp);
457 DestroyWindow (hDlg);
462 case WM_CTLCOLOREDIT:
463 if ((HWND)lp == GetDlgItem (hDlg, IDC_SALVAGE_DETAILS))
465 SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW));
466 return CreateSolidBrush (GetSysColor (COLOR_WINDOW))?TRUE:FALSE;
475 void Server_Salvage_Results_OnInitDialog (HWND hDlg, LPIDENT lpiSalvage)
477 TCHAR szServer[ cchNAME ];
478 lpiSalvage->GetServerName (szServer);
480 TCHAR szAggregate[ cchNAME ];
481 if (!lpiSalvage->fIsServer())
482 lpiSalvage->GetAggregateName (szAggregate);
484 TCHAR szFileset[ cchNAME ];
485 if (lpiSalvage->fIsFileset())
486 lpiSalvage->GetFilesetName (szFileset);
489 if (lpiSalvage->fIsServer())
490 pszTitle = FormatString (IDS_SALVAGE_SVR, TEXT("%s"), szServer);
491 else if (lpiSalvage->fIsAggregate())
492 pszTitle = FormatString (IDS_SALVAGE_AGG, TEXT("%s%s"), szServer, szAggregate);
493 else // (lpiSalvage->fIsFileset())
494 pszTitle = FormatString (IDS_SALVAGE_SET, TEXT("%s%s%s"), szServer, szAggregate, szFileset);
495 SetDlgItemText (hDlg, IDC_SALVAGE_TITLE, pszTitle);
496 FreeString (pszTitle);
500 void Server_Salvage_OnEndTask_Salvage (HWND hDlg, LPIDENT lpiSalvage, LPTASKPACKET ptp)
504 ErrorDialog (ptp->status, IDS_ERROR_CANT_SALVAGE);
505 DestroyWindow (hDlg);
509 if (TASKDATA(ptp)->pszText1)
511 SetDlgItemText (hDlg, IDC_SALVAGE_DETAILS, TASKDATA(ptp)->pszText1);
515 TCHAR szServer[ cchNAME ];
516 lpiSalvage->GetServerName (szServer);
517 LPTSTR pszNoLog = FormatString (IDS_ERROR_CANT_READ_SALVAGE_LOG, TEXT("%s"), szServer);
518 SetDlgItemText (hDlg, IDC_SALVAGE_DETAILS, pszNoLog);
519 FreeString (pszNoLog);
522 ShowWindow (hDlg, SW_SHOW);