ntmakefile-clean-20040401
[openafs.git] / src / WINNT / afssvrmgr / svr_salvage.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
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
8  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include "svrmgr.h"
16 #include "svr_salvage.h"
17 #include "propcache.h"
18
19
20 /*
21  * DEFINITIONS ________________________________________________________________
22  *
23  */
24
25 #define cxMIN_SALVAGE_R  250 // minimum size of Salvage Results dialog
26 #define cyMIN_SALVAGE_R  200 // minimum size of Salvage Results dialog
27
28
29 /*
30  * RESIZING WINDOWS ___________________________________________________________
31  *
32  */
33
34 rwWindowData awdSalvageResults[] = {
35     { IDC_SALVAGE_TITLE,        raSizeX | raRepaint,            0,      0 },
36     { IDC_SALVAGE_DETAILS,      raSizeX | raSizeY | raRepaint,  MAKELONG(cxMIN_SALVAGE_R,cyMIN_SALVAGE_R), 0 },
37     { IDOK,                     raMoveX | raMoveY,              0,      0 },
38     { idENDLIST, 0,                                             0,      0 }
39  };
40
41
42 /*
43  * PROTOTYPES _________________________________________________________________
44  *
45  */
46
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);
56
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);
60
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);
64
65
66 /*
67  * ROUTINES ___________________________________________________________________
68  *
69  */
70
71 void Server_Salvage (LPIDENT lpi)
72 {
73    HWND hCurrent;
74    if ((hCurrent = PropCache_Search (pcSVR_SALVAGE, lpi)) != NULL)
75       {
76       SetFocus (hCurrent);
77       }
78    else
79       {
80       HWND hDlg = ModelessDialogParam (IDD_SVR_SALVAGE, NULL, (DLGPROC)Server_Salvage_DlgProc, (LPARAM)lpi);
81       ShowWindow (hDlg, SW_SHOW);
82       }
83 }
84
85
86 BOOL CALLBACK Server_Salvage_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
87 {
88    if (AfsAppLib_HandleHelp (IDD_SVR_SALVAGE, hDlg, msg, wp, lp))
89       return TRUE;
90
91    if (msg == WM_INITDIALOG)
92       SetWindowLong (hDlg, DWL_USER, lp);
93
94    LPIDENT lpi;
95    if ((lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER)) != NULL)
96       {
97       switch (msg)
98          {
99          case WM_INITDIALOG:
100             PropCache_Add (pcSVR_SALVAGE, lpi, hDlg);
101             Server_Salvage_OnInitDialog (hDlg, lpi);
102             Server_Salvage_OnAdvanced (hDlg);
103             break;
104
105          case WM_ENDTASK:
106             LPTASKPACKET ptp;
107             if ((ptp = (LPTASKPACKET)lp) != NULL)
108                {
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);
116                }
117             break;
118
119          case WM_COMMAND:
120             switch (LOWORD(wp))
121                {
122                case IDOK:
123                   Server_Salvage_OnOK (hDlg);
124                case IDCANCEL:
125                   DestroyWindow (hDlg);
126                   break;
127
128                case IDC_SERVER:
129                   Server_Salvage_OnServer (hDlg, lpi);
130                   break;
131                case IDC_AGGREGATE:
132                   Server_Salvage_OnAggregate (hDlg, lpi);
133                   break;
134                case IDC_AGGREGATE_ALL:
135                   Server_Salvage_OnAllAggregates (hDlg);
136                   break;
137                case IDC_FILESET_ALL:
138                   Server_Salvage_OnAllFilesets (hDlg);
139                   break;
140                case IDC_SALVAGE_SIMUL:
141                   Server_Salvage_OnSimultaneous (hDlg);
142                   break;
143
144                case IDC_ADVANCED:
145                   Server_Salvage_OnAdvanced (hDlg);
146                   break;
147                }
148             break;
149
150          case WM_DESTROY:
151             PropCache_Delete (pcSVR_SALVAGE, lpi);
152             break;
153          }
154       }
155
156    return FALSE;
157 }
158
159
160 void Server_Salvage_OnAdvanced (HWND hDlg)
161 {
162    HWND hGroup = GetDlgItem (hDlg, IDC_ADVANCED_GROUP);
163
164    RECT rWindow;
165    RECT rClient;
166    RECT rGroup;
167
168    GetWindowRect (hDlg, &rWindow);
169    GetClientRect (hDlg, &rClient);
170    GetRectInParent (hGroup, &rGroup);
171
172    if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_SALVAGE_TEMPDIR)))
173       {
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);
184
185       SetWindowPos (hDlg, NULL,
186                     0, 0,
187                     cxRECT(rWindow),
188                     cyRECT(rWindow) + cyRECT(rGroup) + 14,
189                     SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
190
191       TCHAR szText[ cchRESOURCE ];
192       GetString (szText, IDS_ADVANCEDIN_BUTTON);
193       SetDlgItemText (hDlg, IDC_ADVANCED, szText);
194       }
195    else // open now?
196       {
197       SetWindowPos (hDlg, NULL,
198                     0, 0,
199                     cxRECT(rWindow),
200                     cyRECT(rWindow) - cyRECT(rGroup) - 14,
201                     SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
202
203       TCHAR szText[ cchRESOURCE ];
204       GetString (szText, IDS_ADVANCEDOUT_BUTTON);
205       SetDlgItemText (hDlg, IDC_ADVANCED, szText);
206
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);
217       }
218 }
219
220
221 void Server_Salvage_OnInitDialog (HWND hDlg, LPIDENT lpi)
222 {
223    CheckDlgButton (hDlg, IDC_AGGREGATE_ALL, (lpi->fIsServer()) ? TRUE : FALSE);
224    CheckDlgButton (hDlg, IDC_FILESET_ALL,  (lpi->fIsFileset()) ? FALSE : TRUE);
225
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);
232
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);
238
239    CheckDlgButton (hDlg, IDC_SALVAGE_SIMUL, TRUE);
240    CreateSpinner (GetDlgItem(hDlg,IDC_SALVAGE_NUM), 10, FALSE, 2, 4, 12);
241 }
242
243
244 void Server_Salvage_OnServer (HWND hDlg, LPIDENT lpi)
245 {
246    LPIDENT lpiServer;
247    if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
248       {
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);
255       }
256 }
257
258
259 void Server_Salvage_OnAggregate (HWND hDlg, LPIDENT lpi)
260 {
261    LPIDENT lpiServer;
262    if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
263       {
264       LPIDENT lpiAggregate;
265       if ((lpiAggregate = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE))) != NULL)
266          {
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);
274          }
275       }
276 }
277
278
279 void Server_Salvage_OnAllAggregates (HWND hDlg)
280 {
281    BOOL fAllAggs = IsDlgButtonChecked (hDlg, IDC_AGGREGATE_ALL);
282    BOOL fAllSets = IsDlgButtonChecked (hDlg, IDC_FILESET_ALL);
283
284    if (fAllAggs)
285       {
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);
290       }
291    else
292       {
293       EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE), TRUE);
294       EnableWindow (GetDlgItem (hDlg, IDC_FILESET_ALL), TRUE);
295       EnableWindow (GetDlgItem (hDlg, IDC_FILESET), !fAllSets);
296       }
297 }
298
299
300 void Server_Salvage_OnAllFilesets (HWND hDlg)
301 {
302    BOOL fAllSets = IsDlgButtonChecked (hDlg, IDC_FILESET_ALL);
303    EnableWindow (GetDlgItem (hDlg, IDC_FILESET), !fAllSets);
304 }
305
306
307 void Server_Salvage_OnSimultaneous (HWND hDlg)
308 {
309    BOOL fSimul = IsDlgButtonChecked (hDlg, IDC_SALVAGE_SIMUL);
310    EnableWindow (GetDlgItem (hDlg, IDC_SALVAGE_NUM), fSimul);
311 }
312
313
314 void Server_Salvage_OnOK (HWND hDlg)
315 {
316    // Prepare a taskSVR_SALVAGE packet
317    //
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));
330
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)
339       Delete (lpp);
340    else
341       {
342       // Create (but don't show) a results dialog for this operation.
343       //
344       HWND hResults = ModelessDialogParam (IDD_SVR_SALVAGE_RESULTS, NULL, (DLGPROC)Server_Salvage_Results_DlgProc, (LPARAM)(lpp->lpiSalvage));
345       AfsAppLib_RegisterModelessDialog (hDlg);
346
347       // Fire up the background task; when it finishes, have the task scheduler
348       // send the result packet to that results dialog.
349       //
350       StartTask (taskSVR_SALVAGE, hResults, lpp);
351       }
352 }
353
354
355 void Server_Salvage_OnEndTask_EnumServers (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp)
356 {
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.
361    //
362    LPIDENT lpiServer;
363    if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
364       {
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);
371       }
372 }
373
374
375 void Server_Salvage_OnEndTask_EnumAggregates (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp)
376 {
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.
379    //
380    LPIDENT lpiServer;
381    if ((lpiServer = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SERVER))) != NULL)
382       {
383       LPIDENT lpiAggregate;
384       if ((lpiAggregate = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_AGGREGATE))) != NULL)
385          {
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);
393          }
394       }
395 }
396
397
398 void Server_Salvage_OnEndTask_EnumFilesets (HWND hDlg, LPIDENT lpi, LPTASKPACKET ptp)
399 {
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
402    // get enabled.
403    //
404    EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
405    EnableWindow (GetDlgItem (hDlg, IDC_SERVER), TRUE);
406    EnableWindow (GetDlgItem (hDlg, IDC_AGGREGATE_ALL), TRUE);
407
408    Server_Salvage_OnAllAggregates (hDlg);
409 }
410
411
412 BOOL CALLBACK Server_Salvage_Results_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
413 {
414    if (AfsAppLib_HandleHelp (IDD_SVR_SALVAGE_RESULTS, hDlg, msg, wp, lp))
415       return TRUE;
416
417    if (msg == WM_INITDIALOG)
418       SetWindowLong (hDlg, DWL_USER, lp);
419
420    LPIDENT lpi;
421    if ((lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER)) != NULL)
422       {
423       switch (msg)
424          {
425          case WM_INITDIALOG:
426             RECT rWindow;
427             GetWindowRect (hDlg, &rWindow);
428             ResizeWindow (hDlg, awdSalvageResults, rwaMoveToHere, &rWindow);
429
430             Server_Salvage_Results_OnInitDialog (hDlg, lpi);
431             break;
432
433          case WM_SIZE:
434             // if (lp==0), we're minimizing--don't call ResizeWindow().
435             if (lp != 0)
436                ResizeWindow (hDlg, awdSalvageResults, rwaFixupGuts);
437             break;
438
439          case WM_ENDTASK:
440             LPTASKPACKET ptp;
441             if ((ptp = (LPTASKPACKET)lp) != NULL)
442                {
443                if (ptp->idTask == taskSVR_SALVAGE)
444                   Server_Salvage_OnEndTask_Salvage (hDlg, lpi, ptp);
445                FreeTaskPacket (ptp);
446                }
447             break;
448
449          case WM_COMMAND:
450             switch (LOWORD(wp))
451                {
452                case IDOK:
453                case IDCANCEL:
454                   DestroyWindow (hDlg);
455                   break;
456                }
457             break;
458
459          case WM_CTLCOLOREDIT:
460             if ((HWND)lp == GetDlgItem (hDlg, IDC_SALVAGE_DETAILS))
461                {
462                SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW));
463                return (BOOL)CreateSolidBrush (GetSysColor (COLOR_WINDOW));
464                }
465             break;
466          }
467       }
468    return FALSE;
469 }
470
471
472 void Server_Salvage_Results_OnInitDialog (HWND hDlg, LPIDENT lpiSalvage)
473 {
474    TCHAR szServer[ cchNAME ];
475    lpiSalvage->GetServerName (szServer);
476
477    TCHAR szAggregate[ cchNAME ];
478    if (!lpiSalvage->fIsServer())
479       lpiSalvage->GetAggregateName (szAggregate);
480
481    TCHAR szFileset[ cchNAME ];
482    if (lpiSalvage->fIsFileset())
483       lpiSalvage->GetFilesetName (szFileset);
484
485    LPTSTR pszTitle;
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);
494 }
495
496
497 void Server_Salvage_OnEndTask_Salvage (HWND hDlg, LPIDENT lpiSalvage, LPTASKPACKET ptp)
498 {
499    if (!ptp->rc)
500       {
501       ErrorDialog (ptp->status, IDS_ERROR_CANT_SALVAGE);
502       DestroyWindow (hDlg);
503       }
504    else
505       {
506       if (TASKDATA(ptp)->pszText1)
507          {
508          SetDlgItemText (hDlg, IDC_SALVAGE_DETAILS, TASKDATA(ptp)->pszText1);
509          }
510       else
511          {
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);
517          }
518
519       ShowWindow (hDlg, SW_SHOW);
520       }
521 }
522