82b80eb3192316fd479d3608be6c369bd4f9e1c4
[openafs.git] / src / WINNT / client_config / tab_general.cpp
1 extern "C" {
2 #include <afs/param.h>
3 #include <afs/stds.h>
4 }
5
6 #include "afs_config.h"
7 #include "tab_general.h"
8 #include "tab_hosts.h"
9 #include "tab_advanced.h"
10
11
12 /*
13  * VARIABLES __________________________________________________________________
14  *
15  */
16
17 static struct l
18    {
19    BOOL fWarnIfStopped;
20    BOOL fWarnIfNotStopped;
21    BOOL fRestartIfStopped;
22    BOOL fServiceIsRunning;
23    BOOL fStarting;
24    HWND hStatus;
25    } l;
26
27
28 /*
29  * DEFINITIONS ________________________________________________________________
30  *
31  */
32
33 #define ID_TIMER                0
34
35 #define cmsecIDLE_REFRESH   10000
36 #define cmsecFAST_REFRESH    1000
37
38
39 /*
40  * PROTOTYPES _________________________________________________________________
41  *
42  */
43
44 void GeneralTab_OnInitDialog (HWND hDlg);
45 void GeneralTab_OnTimer (HWND hDlg);
46 BOOL GeneralTab_OnApply (HWND hDlg, BOOL fForce, BOOL fComplainIfInvalid);
47 void GeneralTab_OnRefresh (HWND hDlg, BOOL fRequery);
48 void GeneralTab_OnStartStop (HWND hDlg, BOOL fStart);
49 void GeneralTab_OnConnect (HWND hDlg);
50 void GeneralTab_OnGateway (HWND hDlg);
51 void GeneralTab_OnCell (HWND hDlg);
52
53 void GeneralTab_DoStartStop (HWND hDlg, BOOL fStart, BOOL fRestart);
54 void GeneralTab_FixRefreshTimer (HWND hDlg, UINT cmsec = 0);
55 DWORD GeneralTab_GetDisplayState (HWND hDlg);
56 void GeneralTab_ShowCurrentState (HWND hDlg);
57 BOOL GeneralTab_AskIfStopped (HWND hDlg);
58
59 BOOL fIsCellInCellServDB (LPCTSTR pszCell);
60
61 BOOL CALLBACK Status_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
62 void Status_OnRefresh (HWND hDlg);
63
64
65 /*
66  * ROUTINES ___________________________________________________________________
67  *
68  */
69
70 BOOL CALLBACK GeneralTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
71 {
72    switch (msg)
73       {
74       case WM_INITDIALOG:
75          Main_OnInitDialog (GetParent(hDlg));
76          GeneralTab_OnInitDialog (hDlg);
77          break;
78
79       case WM_DESTROY:
80          GeneralTab_FixRefreshTimer (hDlg, 0);
81          break;
82
83       case WM_TIMER:
84          GeneralTab_OnTimer (hDlg);
85          break;
86
87       case WM_COMMAND:
88          switch (LOWORD(wp))
89             {
90             case IDAPPLY:
91                if (!GeneralTab_OnApply (hDlg, FALSE, TRUE))
92                   SetWindowLong (hDlg, DWL_MSGRESULT, TRUE);
93                else if (g.fIsWinNT && !GeneralTab_AskIfStopped (hDlg))
94                   SetWindowLong (hDlg, DWL_MSGRESULT, TRUE);
95                break;
96
97             case IDC_REFRESH:
98                GeneralTab_OnRefresh (hDlg, FALSE);
99                break;
100
101             case IDC_SERVICE_START:
102                GeneralTab_OnStartStop (hDlg, TRUE);
103                break;
104
105             case IDC_SERVICE_STOP:
106                GeneralTab_OnStartStop (hDlg, FALSE);
107                break;
108
109             case IDC_GATEWAY_CONN:
110                GeneralTab_OnConnect (hDlg);
111                break;
112
113             case IDC_GATEWAY:
114                GeneralTab_OnGateway (hDlg);
115                break;
116
117             case IDC_CELL:
118                GeneralTab_OnCell (hDlg);
119                break;
120
121             case IDHELP:
122                GeneralTab_DlgProc (hDlg, WM_HELP, 0, 0);
123                break;
124             }
125          break;
126
127       case WM_HELP:
128          if (g.fIsWinNT)
129             WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_GENERAL_NT);
130          else
131             WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_GENERAL_95);
132          break;
133       }
134
135    return FALSE;
136 }
137
138
139 void GeneralTab_OnInitDialog (HWND hDlg)
140 {
141    DWORD CurrentState = Config_GetServiceState();
142    BOOL fNeedFastRefresh = ((CurrentState == SERVICE_STOPPED) || (CurrentState == SERVICE_RUNNING)) ? FALSE : TRUE;
143    GeneralTab_FixRefreshTimer (hDlg, ((fNeedFastRefresh) ? cmsecFAST_REFRESH : cmsecIDLE_REFRESH));
144    GeneralTab_OnTimer (hDlg);
145    GeneralTab_OnRefresh (hDlg, TRUE);
146 }
147
148
149 BOOL GeneralTab_VerifyCell (HWND hDlg, BOOL fComplainIfInvalid, LPCTSTR pszCell)
150 {
151    TCHAR szNoCell[ cchRESOURCE ];
152    GetString (szNoCell, IDS_CELL_UNKNOWN);
153
154    TCHAR szCell[ cchRESOURCE ];
155    if (pszCell)
156       lstrcpy (szCell, pszCell);
157    else
158       GetDlgItemText (hDlg, IDC_CELL, szCell, cchRESOURCE);
159    if ((!szCell[0]) || (!lstrcmpi (szNoCell, szCell)))
160       {
161       if (fComplainIfInvalid)
162          {
163          if (g.fIsWinNT)
164             Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_NOCELL_DESC);
165          else
166             Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADGATEWAY_DESC);
167          }
168       return FALSE;
169       }
170
171    if (!fIsCellInCellServDB (szCell))
172       {
173       if (fComplainIfInvalid)
174          {
175          if (g.fIsWinNT)
176             Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADCELL_DESC);
177          else
178             Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADGWCELL_DESC, TEXT("%s"), szCell);
179          }
180       return FALSE;
181       }
182
183    return TRUE;
184 }
185
186
187 BOOL GeneralTab_VerifyOK (HWND hDlg, BOOL fComplainIfInvalid)
188 {
189    // If it's Windows 95, make sure there's a valid Gateway entry
190    //
191    if (!g.fIsWinNT)
192       {
193       TCHAR szGateway[ cchRESOURCE ];
194       GetDlgItemText (hDlg, IDC_GATEWAY, szGateway, cchRESOURCE);
195       if (!szGateway[0])
196          {
197          if (fComplainIfInvalid)
198             Message (MB_ICONASTERISK | MB_OK, IDS_NOGATEWAY_TITLE, IDS_NOGATEWAY_DESC);
199          return FALSE;
200          }
201       }
202
203    // Make sure the cell is in our CellServDB.
204    //
205    if (g.fIsWinNT)
206       {
207       if (!GeneralTab_VerifyCell (hDlg, fComplainIfInvalid, NULL))
208          return FALSE;
209       }
210
211    return TRUE;
212 }
213
214
215 BOOL GeneralTab_OnApply (HWND hDlg, BOOL fForce, BOOL fComplainIfInvalid)
216 {
217    if (!fForce)
218       {
219       // Don't try to do anything if we've already failed the apply
220       if (GetWindowLong (hDlg, DWL_MSGRESULT))
221          return FALSE;
222       }
223
224    // If the user has changed CellServDB, configuration parameters for
225    // the driver or anything else, we want to commit those changes first.
226    // We *won't* commit server prefs changes yet, because we haven't yet
227    // checked to see if the service is running.
228    //
229    if (!HostsTab_CommitChanges (fForce))
230       return FALSE;
231
232    if (!AdvancedTab_CommitChanges (fForce))
233       return FALSE;
234
235    if (!GeneralTab_VerifyOK (hDlg, fComplainIfInvalid))
236       return FALSE;
237
238    TCHAR szText[ MAX_PATH ];
239
240    if (g.fIsWinNT)
241       {
242       GetDlgItemText (hDlg, IDC_CELL, szText, MAX_PATH);
243       if (lstrcmpi (szText, g.Configuration.szCell))
244          {
245          if (!Config_SetCellName (szText))
246             return FALSE;
247          lstrcpy (g.Configuration.szCell, szText);
248          }
249       }
250
251    BOOL fLogonAuthent = IsDlgButtonChecked (hDlg, IDC_LOGON);
252    if (fLogonAuthent != g.Configuration.fLogonAuthent)
253       {
254       if (!Config_SetAuthentFlag (fLogonAuthent))
255          return FALSE;
256       g.Configuration.fLogonAuthent = fLogonAuthent;
257       }
258
259    Config_SetTrayIconFlag (IsDlgButtonChecked (hDlg, IDC_TRAYICON));
260
261    if (g.fIsWinNT)
262       {
263       BOOL fBeGateway = IsDlgButtonChecked (hDlg, IDC_GATEWAY);
264       if (fBeGateway != g.Configuration.fBeGateway)
265          {
266          if (!Config_SetGatewayFlag (fBeGateway))
267             return FALSE;
268          g.fNeedRestart = TRUE;
269          g.Configuration.fBeGateway = fBeGateway;
270          }
271       }
272    else // (!g.fIsWinNT)
273       {
274       GetDlgItemText (hDlg, IDC_GATEWAY, szText, MAX_PATH);
275       if (lstrcmpi (szText, g.Configuration.szGateway))
276          {
277          TCHAR szNewCell[ MAX_PATH ];
278          if (!Config_ContactGateway (szText, szNewCell))
279             {
280             Message (MB_ICONASTERISK | MB_OK, GetErrorTitle(), IDS_BADGATEWAY_DESC);
281             return FALSE;
282             }
283
284          if (!GeneralTab_VerifyCell (hDlg, fComplainIfInvalid, szNewCell))
285             return FALSE;
286
287          if (!Config_SetGatewayName (szText))
288             return FALSE;
289
290          if (!Config_SetCellName (szNewCell))
291             return FALSE;
292
293          Config_FixGatewayDrives();
294
295          SetDlgItemText (hDlg, IDC_CELL, szNewCell);
296          lstrcpy (g.Configuration.szGateway, szText);
297          lstrcpy (g.Configuration.szCell, szNewCell);
298
299          GeneralTab_OnGateway (hDlg);
300          }
301       }
302
303    return TRUE;
304 }
305
306
307 void GeneralTab_OnRefresh (HWND hDlg, BOOL fRequery)
308 {
309    // If necessary, update any fields in g.Configuration that we care about
310    //
311    if (fRequery)
312       {
313       if (g.fIsWinNT)
314          Config_GetGatewayFlag (&g.Configuration.fBeGateway);
315       else
316          Config_GetGatewayName (g.Configuration.szGateway);
317
318       Config_GetCellName (g.Configuration.szCell);
319       Config_GetAuthentFlag (&g.Configuration.fLogonAuthent);
320       Config_GetTrayIconFlag (&g.Configuration.fShowTrayIcon);
321
322       if (!g.fIsWinNT)
323          SetDlgItemText (hDlg, IDC_GATEWAY, g.Configuration.szGateway);
324       else
325          CheckDlgButton (hDlg, IDC_GATEWAY, g.Configuration.fBeGateway);
326
327       SetDlgItemText (hDlg, IDC_CELL, g.Configuration.szCell);
328       CheckDlgButton (hDlg, IDC_LOGON, g.Configuration.fLogonAuthent);
329       CheckDlgButton (hDlg, IDC_TRAYICON, g.Configuration.fShowTrayIcon);
330       }
331
332    // Update our display of the service's status
333    //
334    DWORD CurrentState = Config_GetServiceState();
335    BOOL fIfServiceStopped = !(g.fIsWinNT && !g.fIsAdmin);
336    BOOL fIfServiceRunning = fIfServiceStopped && (CurrentState == SERVICE_RUNNING);
337
338    GeneralTab_ShowCurrentState (hDlg);
339
340    EnableWindow (GetDlgItem (hDlg, IDC_CELL), fIfServiceStopped && g.fIsWinNT);
341
342    EnableWindow (GetDlgItem (hDlg, IDC_LOGON), fIfServiceStopped);
343    EnableWindow (GetDlgItem (hDlg, IDC_GATEWAY), fIfServiceStopped);
344
345    // Update our warning. Note that under WinNT, this tab doesn't have any
346    // controls (other than Start Service) which disable just because the
347    // service isn't running...so don't show that warning in that case.
348    //
349    TCHAR szText[ cchRESOURCE ];
350    if ((!g.fIsWinNT) && (CurrentState != SERVICE_RUNNING))
351       {
352       GetString (szText, IDS_WARN_STOPPED);
353       SetDlgItemText (hDlg, IDC_WARN, szText);
354       ShowWindow (GetDlgItem (hDlg, IDC_WARN), SW_SHOW);
355       }
356    else if (g.fIsWinNT && !g.fIsAdmin)
357       {
358       GetString (szText, IDS_WARN_ADMIN);
359       SetDlgItemText (hDlg, IDC_WARN, szText);
360       ShowWindow (GetDlgItem (hDlg, IDC_WARN), SW_SHOW);
361       }
362    else // ((CurrentState == SERVICE_RUNNING) && (g.fIsAdmin))
363       {
364       ShowWindow (GetDlgItem (hDlg, IDC_WARN), SW_HIDE);
365       }
366
367    GeneralTab_OnGateway (hDlg);
368
369    // If the service isn't running/stopped, we may need to complain
370    //
371    if ((CurrentState == SERVICE_RUNNING) && (l.fWarnIfNotStopped))
372       {
373       Message (MB_ICONHAND, GetErrorTitle(), IDS_SERVICE_FAIL_STOP, TEXT("%08lX"), ERROR_SERVICE_SPECIFIC_ERROR);
374       }
375    else if ((CurrentState == SERVICE_STOPPED) && (l.fWarnIfStopped))
376       {
377       Message (MB_ICONHAND, GetErrorTitle(), IDS_SERVICE_FAIL_START, TEXT("%08lX"), ERROR_SERVICE_SPECIFIC_ERROR);
378       }
379
380    if ((CurrentState == SERVICE_RUNNING) || (CurrentState == SERVICE_STOPPED))
381       {
382       BOOL fRestart = ((CurrentState == SERVICE_STOPPED) && (l.fRestartIfStopped));
383       l.fWarnIfStopped = FALSE;
384       l.fWarnIfNotStopped = FALSE;
385       l.fRestartIfStopped = FALSE;
386       l.fServiceIsRunning = (CurrentState == SERVICE_RUNNING);
387
388       if (fRestart)
389          {
390          GeneralTab_DoStartStop (hDlg, TRUE, FALSE);
391          }
392       }
393 }
394
395
396 void GeneralTab_OnTimer (HWND hDlg)
397 {
398    DWORD CurrentState = Config_GetServiceState();
399    DWORD DisplayState = GeneralTab_GetDisplayState(hDlg);
400
401    BOOL fInEndState = ((CurrentState == SERVICE_RUNNING) || (CurrentState == SERVICE_STOPPED));
402    if (fInEndState && l.hStatus)
403       {
404       if (IsWindow (l.hStatus))
405          DestroyWindow (l.hStatus);
406       l.hStatus = NULL;
407       }
408    else if (!fInEndState && !l.hStatus)
409       {
410       l.hStatus = ModelessDialog (IDD_STARTSTOP, GetParent (hDlg), (DLGPROC)Status_DlgProc);
411       }
412
413    if (CurrentState != DisplayState)
414       {
415       GeneralTab_OnRefresh (hDlg, FALSE);
416       Main_RefreshAllTabs();
417
418       if (l.hStatus && IsWindow (l.hStatus))
419          PostMessage (l.hStatus, WM_COMMAND, IDINIT, 0);
420       }
421
422    BOOL fNeedFastRefresh = ((CurrentState == SERVICE_STOPPED) || (CurrentState == SERVICE_RUNNING)) ? FALSE : TRUE;
423    BOOL fHaveFastRefresh = ((DisplayState == SERVICE_STOPPED) || (DisplayState == SERVICE_RUNNING)) ? FALSE : TRUE;
424
425    if (fNeedFastRefresh != fHaveFastRefresh)
426       {
427       GeneralTab_FixRefreshTimer (hDlg, ((fNeedFastRefresh) ? cmsecFAST_REFRESH : cmsecIDLE_REFRESH));
428       }
429 }
430
431
432 void GeneralTab_OnStartStop (HWND hDlg, BOOL fStart)
433 {
434    BOOL fSuccess = FALSE;
435    ULONG error = 0;
436
437    // Don't let the user stop the service on a whim; warn him first
438    //
439    if (!fStart)
440       {
441       if (Message (MB_ICONEXCLAMATION | MB_OKCANCEL, GetCautionTitle(), IDS_STOP_DESC) != IDOK)
442          return;
443       }
444
445    // To start the service, we'll need to successfully commit our new
446    // configuration. To stop the service, we'll *try*, but it's not
447    // fatal if something goes wrong.
448    //
449    if (!GeneralTab_OnApply (hDlg, TRUE, ((fStart) ? TRUE : FALSE)))
450       {
451       if (fStart)
452          return;
453       }
454
455    // Okay, start the service
456    //
457    GeneralTab_DoStartStop (hDlg, fStart, FALSE);
458 }
459
460
461 void GeneralTab_OnConnect (HWND hDlg)
462 {
463    if (!GeneralTab_OnApply (hDlg, TRUE, TRUE))
464       return;
465    GeneralTab_OnGateway (hDlg);
466    GeneralTab_OnApply (hDlg, TRUE, TRUE);
467 }
468
469
470 void GeneralTab_OnGateway (HWND hDlg)
471 {
472    if (!g.fIsWinNT)
473       {
474       TCHAR szGateway[ cchRESOURCE ];
475       GetDlgItemText (hDlg, IDC_GATEWAY, szGateway, cchRESOURCE);
476
477       BOOL fEnable = TRUE;
478       if (!szGateway[0])
479          fEnable = FALSE;
480       if (!lstrcmpi (szGateway, g.Configuration.szGateway))
481          fEnable = FALSE;
482       EnableWindow (GetDlgItem (hDlg, IDC_GATEWAY_CONN), fEnable);
483       }
484 }
485
486
487 void GeneralTab_OnCell (HWND hDlg)
488 {
489    if (g.fIsWinNT)
490       {
491       GeneralTab_ShowCurrentState (hDlg);
492       }
493 }
494
495
496 void GeneralTab_FixRefreshTimer (HWND hDlg, UINT cmsec)
497 {
498    static BOOL fTimerActive = FALSE;
499    if (fTimerActive)
500       {
501       KillTimer (hDlg, ID_TIMER);
502       fTimerActive = FALSE;
503       }
504
505    if (g.fIsWinNT && (cmsec != 0))
506       {
507       SetTimer (hDlg, ID_TIMER, cmsec, NULL);
508       }
509 }
510
511
512 DWORD GeneralTab_GetDisplayState (HWND hDlg)
513 {
514    TCHAR szText[ cchRESOURCE ];
515    TCHAR szTextNow[ cchRESOURCE ];
516    GetDlgItemText (hDlg, IDC_STATUS, szTextNow, cchRESOURCE);
517
518    GetString (szText, IDS_STATE_STOPPED);
519    if (!lstrcmpi (szTextNow, szText))
520       return SERVICE_STOPPED;
521
522    GetString (szText, IDS_STATE_RUNNING);
523    if (!lstrcmpi (szTextNow, szText))
524       return SERVICE_RUNNING;
525
526    GetString (szText, IDS_STATE_STARTING);
527    if (!lstrcmpi (szTextNow, szText))
528       return SERVICE_START_PENDING;
529
530    GetString (szText, IDS_STATE_STOPPING);
531    if (!lstrcmpi (szTextNow, szText))
532       return SERVICE_STOP_PENDING;
533
534    return 0;
535 }
536
537
538 void GeneralTab_ShowCurrentState (HWND hDlg)
539 {
540    TCHAR szNoCell[ cchRESOURCE ];
541    GetString (szNoCell, IDS_CELL_UNKNOWN);
542
543    TCHAR szCell[ cchRESOURCE ];
544    GetDlgItemText (hDlg, IDC_CELL, szCell, cchRESOURCE);
545
546    BOOL fValidCell = TRUE;
547    if (!szCell[0])
548       fValidCell = FALSE;
549    if (!lstrcmpi (szCell, szNoCell))
550       fValidCell = FALSE;
551
552    DWORD CurrentState = Config_GetServiceState();
553
554    TCHAR szText[ cchRESOURCE ];
555    switch (CurrentState)
556       {
557       case SERVICE_STOPPED:
558          GetString (szText, (fValidCell) ? IDS_STATE_STOPPED : IDS_STOPPED_NOCELL);
559          break;
560       case SERVICE_RUNNING:
561          GetString (szText, IDS_STATE_RUNNING);
562          break;
563       case SERVICE_START_PENDING:
564          GetString (szText, IDS_STATE_STARTING);
565          break;
566       case SERVICE_STOP_PENDING:
567          GetString (szText, IDS_STATE_STOPPING);
568          break;
569       default:
570          GetString (szText, IDS_STATE_UNKNOWN);
571          break;
572       }
573    SetDlgItemText (hDlg, IDC_STATUS, szText);
574
575    // Enable or disable controls as necessary
576    //
577    BOOL fIfServiceStopped = !(g.fIsWinNT && !g.fIsAdmin);
578    BOOL fIfServiceRunning = fIfServiceStopped && (CurrentState == SERVICE_RUNNING);
579
580    EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_START), ((CurrentState == SERVICE_STOPPED) && (g.fIsAdmin) && (fValidCell)));
581    EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_STOP),  ((CurrentState == SERVICE_RUNNING) && (g.fIsAdmin)));
582 }
583
584
585 BOOL GeneralTab_AskIfStopped (HWND hDlg)
586 {
587    BOOL fStopService = FALSE;
588    BOOL fStartService = FALSE;
589
590    // If we changed things, ask if we should restart the service.
591    // Otherwise, if it's stopped, ask the user if we should start the service.
592    //
593    DWORD CurrentState = Config_GetServiceState();
594    if (g.fIsAdmin)
595       {
596       if ((CurrentState == SERVICE_RUNNING) && (g.fNeedRestart))
597          {
598          if (Message (MB_YESNO | MB_ICONQUESTION, IDS_RESTART_TITLE, IDS_RESTART_DESC) == IDYES)
599             {
600             fStopService = TRUE;
601             fStartService = TRUE;
602             }
603          }
604       if (CurrentState == SERVICE_STOPPED)
605          {
606          if (Message (MB_YESNO | MB_ICONQUESTION, GetCautionTitle(), IDS_OKSTOP_DESC) == IDYES)
607             {
608             fStartService = TRUE;
609             }
610          }
611       }
612
613    // If we need to, start or stop-n-restart the service
614    //
615    if (fStartService && fStopService)
616       {
617       GeneralTab_DoStartStop (hDlg, FALSE, TRUE); // Stop and restart the thing
618       }
619    else if (fStartService && !fStopService)
620       {
621       GeneralTab_DoStartStop (hDlg, TRUE, FALSE); // Just start it
622       }
623
624    if (fStartService)
625       {
626       while ( (l.fRestartIfStopped) ||
627               (l.fWarnIfNotStopped) ||
628               (l.fWarnIfStopped) )
629          {
630          MSG msg;
631          if (!GetMessage (&msg, NULL, 0, 0))
632             break;
633          if (IsMemoryManagerMessage (&msg))
634             continue;
635          TranslateMessage (&msg);
636          DispatchMessage (&msg);
637          }
638       }
639
640    if (fStartService && !l.fServiceIsRunning)
641       return FALSE;
642
643    return TRUE;
644 }
645
646
647 BOOL fIsCellInCellServDB (LPCTSTR pszCell)
648 {
649    BOOL fFound = FALSE;
650
651    CELLSERVDB CellServDB;
652    if (CSDB_ReadFile (&CellServDB, NULL))
653       {
654       if (CSDB_FindCell (&CellServDB, pszCell))
655          fFound = TRUE;
656       CSDB_FreeFile (&CellServDB);
657       }
658
659    return fFound;
660 }
661
662
663 void GeneralTab_DoStartStop (HWND hDlg, BOOL fStart, BOOL fRestart)
664 {
665    BOOL fSuccess = FALSE;
666    ULONG error = 0;
667
668    SC_HANDLE hManager;
669    if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS)) != NULL)
670       {
671       SC_HANDLE hService;
672       if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), SERVICE_ALL_ACCESS)) != NULL)
673          {
674          if (fStart)
675             {
676             g.fNeedRestart = FALSE;
677             if (StartService (hService, 0, 0))
678                fSuccess = TRUE;
679             }
680          else // (!fStart)
681             {
682             SERVICE_STATUS Status;
683             if (ControlService (hService, SERVICE_CONTROL_STOP, &Status))
684                fSuccess = TRUE;
685             }
686
687          CloseServiceHandle (hService);
688          }
689
690       CloseServiceHandle (hManager);
691       }
692
693    if (fSuccess)
694       {
695       l.fWarnIfStopped = fStart;
696       l.fWarnIfNotStopped = !fStart;
697       l.fRestartIfStopped = fRestart && !fStart;
698       l.fStarting = fStart;
699       GeneralTab_OnTimer (hDlg);
700       }
701    else
702       {
703       l.fWarnIfStopped = FALSE;
704       l.fWarnIfNotStopped = FALSE;
705       l.fRestartIfStopped = FALSE;
706       GeneralTab_OnTimer (hDlg);
707
708       if (!error)
709          error = GetLastError();
710       Message (MB_OK | MB_ICONHAND, GetErrorTitle(), ((fStart) ? IDS_SERVICE_FAIL_START : IDS_SERVICE_FAIL_STOP), TEXT("%08lX"), error);
711       }
712 }
713
714
715 BOOL CALLBACK Status_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
716 {
717    switch (msg)
718       {
719       case WM_INITDIALOG:
720          l.hStatus = hDlg;
721          ShowWindow (l.hStatus, SW_SHOW);
722          Status_OnRefresh (hDlg);
723          break;
724
725       case WM_DESTROY:
726          l.hStatus = NULL;
727          break;
728
729       case WM_COMMAND:
730          switch (LOWORD(wp))
731             {
732             case IDCANCEL:
733                DestroyWindow (hDlg);
734                break;
735
736             case IDINIT:
737                Status_OnRefresh (hDlg);
738                break;
739             }
740          break;
741       }
742
743    return FALSE;
744 }
745
746
747 void Status_OnRefresh (HWND hDlg)
748 {
749    DWORD CurrentState = Config_GetServiceState();
750    if (CurrentState == SERVICE_START_PENDING)
751       l.fStarting = TRUE;
752    else if (CurrentState == SERVICE_STOP_PENDING)
753       l.fStarting = FALSE;
754
755    ShowWindow (GetDlgItem (l.hStatus, IDC_STARTING), l.fStarting);
756    ShowWindow (GetDlgItem (l.hStatus, IDC_STOPPING), !l.fStarting);
757 }
758