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