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