skyrope-mit-merge-hell-20040226
[openafs.git] / src / WINNT / client_creds / window.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 "afscreds.h"
16 #include "afskfw.h"
17
18
19 /*
20  * DEFINITIONS ________________________________________________________________
21  *
22  */
23
24 #define ID_REMIND_TIMER      1000
25 #define ID_SERVICE_TIMER     1001
26
27 #define cREALLOC_TABS        4
28
29 #define dwTABPARAM_MOUNT     (LPTSTR)0
30 #define dwTABPARAM_ADVANCED  (LPTSTR)1
31 #define ISCELLTAB(_psz)      ((HIWORD((LONG)(_psz))) != 0)
32
33
34 /*
35  * PROTOTYPES _________________________________________________________________
36  *
37  */
38
39 void Main_OnInitDialog (HWND hDlg);
40 void Main_OnCheckMenuRemind (void);
41 void Main_OnRemindTimer (void);
42 void Main_OnMouseOver (void);
43 void Main_OnSelectTab (void);
44 void Main_OnCheckTerminate (void);
45 HWND Main_CreateTabDialog (HWND hTab, size_t iTab);
46
47 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
48 void Terminate_OnInitDialog (HWND hDlg);
49 void Terminate_OnOK (HWND hDlg);
50
51
52 /*
53  * ROUTINES ___________________________________________________________________
54  *
55  */
56
57 BOOL CALLBACK Main_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
58 {
59    static UINT msgCheckTerminate = 0;
60    if (msgCheckTerminate == 0)
61       msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate"));
62
63    if (msg == msgCheckTerminate)
64       {
65       Main_OnCheckTerminate();
66       }
67    else switch (msg)
68       {
69       case WM_INITDIALOG:
70          g.hMain = hDlg;
71          Main_OnInitDialog (hDlg);
72          break;
73
74       case WM_DESTROY:
75          Creds_CloseLibraries();
76          ChangeTrayIcon (NIM_DELETE);
77          break;
78
79       case WM_ACTIVATEAPP:
80          if (wp)
81             {
82             Main_RepopulateTabs (FALSE);
83             }
84          break;
85
86       case WM_COMMAND:
87          switch (LOWORD(wp))
88             {
89             case IDOK:
90             case IDCANCEL:
91                Main_Show (FALSE);
92                break;
93
94             case M_ACTIVATE:
95                if (g.fIsWinNT || IsServiceRunning())
96                   {
97                   if (!lp) // Got here from "/show" parameter? switch tabs.
98                      {
99                      HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
100                      TabCtrl_SetCurSel (hTab, 0);
101                      Main_OnSelectTab();
102                      }
103                   Main_Show (TRUE);
104                   }
105                else
106                   {
107                   Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
108                   }
109                break;
110
111             case M_TERMINATE:
112                if (g.fIsWinNT && IsServiceRunning())
113                   ModalDialog (IDD_TERMINATE, NULL, (DLGPROC)Terminate_DlgProc);
114                else if (g.fIsWinNT)
115                   ModalDialog (IDD_TERMINATE_SMALL, NULL, (DLGPROC)Terminate_DlgProc);
116                else // (!g.fIsWinNT)
117                   ModalDialog (IDD_TERMINATE_SMALL_95, NULL, (DLGPROC)Terminate_DlgProc);
118                break;
119
120             case M_TERMINATE_NOW:
121                Quit();
122                break;
123
124             case M_REMIND:
125                Main_OnCheckMenuRemind();
126                break;
127             }
128          break;
129
130       case WM_TIMER:
131          Main_OnRemindTimer();
132          break;
133
134       case WM_NOTIFY:
135          switch (((NMHDR*)lp)->code)
136             {
137             case TCN_SELCHANGE:
138                Main_OnSelectTab();
139                break;
140             }
141          break;
142
143       case WM_TRAYICON:
144          switch (lp)
145             {
146             case WM_LBUTTONDOWN:
147                if (IsServiceRunning() || !IsServiceConfigured())
148                   Main_Show (TRUE);
149                else if (!g.fIsWinNT)
150                   Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
151                else
152                   ShowStartupWizard();
153                break;
154
155             case WM_RBUTTONDOWN:
156                HMENU hm;
157                if ((hm = TaLocale_LoadMenu (MENU_TRAYICON)) != 0)
158                   {
159                   POINT pt;
160                   GetCursorPos(&pt);
161
162                   HMENU hmDummy = CreateMenu();
163                   InsertMenu (hmDummy, 0, MF_POPUP, (UINT)hm, NULL);
164
165                   BOOL fRemind = FALSE;
166                   lock_ObtainMutex(&g.credsLock);
167                   for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
168                      {
169                      if (g.aCreds[ iCreds ].fRemind)
170                         fRemind = TRUE;
171                      }
172                   lock_ReleaseMutex(&g.credsLock);
173                   CheckMenuItem (hm, M_REMIND, MF_BYCOMMAND | ((fRemind) ? MF_CHECKED : MF_UNCHECKED));
174
175                   TrackPopupMenu (GetSubMenu (hmDummy, 0),
176                                   TPM_RIGHTALIGN | TPM_RIGHTBUTTON,
177                                   pt.x, pt.y, NULL, hDlg, NULL);
178
179                   DestroyMenu (hmDummy);
180                   }
181                break;
182
183             case WM_MOUSEMOVE:
184                Main_OnMouseOver();
185                break;
186             }
187          break;
188       case WM_OBTAIN_TOKENS:
189           if ( InterlockedIncrement (&g.fShowingMessage) != 1 )
190               InterlockedDecrement (&g.fShowingMessage);
191           else
192               ShowObtainCreds (wp, (char *)lp);
193           GlobalFree((void *)lp);
194           break;
195
196       case WM_START_SERVICE:
197           {
198               SC_HANDLE hManager;
199               if ((hManager = OpenSCManager ( NULL, NULL, 
200                                               SC_MANAGER_CONNECT |
201                                               SC_MANAGER_ENUMERATE_SERVICE |
202                                               SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
203               {
204                   SC_HANDLE hService;
205                   if ((hService = OpenService ( hManager, TEXT("TransarcAFSDaemon"), 
206                                                 SERVICE_CHANGE_CONFIG | SERVICE_QUERY_CONFIG |
207                                                 SERVICE_QUERY_STATUS)) != NULL)
208                   {
209                       if (StartService (hService, 0, 0))
210                           TestAndDoMapShare(SERVICE_START_PENDING);
211                                   if ( KFW_is_available() && KFW_AFS_wait_for_service_start() ) {
212                                           KFW_AFS_renew_tokens_for_all_cells();
213                                                   }
214
215                       CloseServiceHandle (hService);
216                   }
217
218                   CloseServiceHandle (hManager);
219               }
220               KFW_AFS_wait_for_service_start();
221               ObtainTokensFromUserIfNeeded(g.hMain);
222           }
223           break;
224       }
225
226    return FALSE;
227 }
228
229
230 void Main_Show (BOOL fShow)
231 {
232    if (fShow)
233       {
234       ShowWindow (g.hMain, SW_SHOW);
235       SetWindowPos (g.hMain, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
236       SetForegroundWindow (g.hMain);
237       }
238    else
239       {
240       SetWindowPos (g.hMain, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
241       }
242 }
243
244
245 void Main_OnInitDialog (HWND hDlg)
246 {
247    if (!g.fIsWinNT)
248       {
249       TCHAR szTitle[256];
250       GetString (szTitle, IDS_TITLE_95);
251       SetWindowText (hDlg, szTitle);
252       }
253
254    TCHAR szVersion[256];
255    DWORD dwPatch = 0;
256    TCHAR szUser[256];
257    GetString (szVersion, IDS_UNKNOWN);
258    GetString (szUser, IDS_UNKNOWN);
259
260    HKEY hk;
261    if (RegOpenKey (HKEY_LOCAL_MACHINE, REGSTR_PATH_AFS, &hk) == 0)
262       {
263       DWORD dwSize = sizeof(szVersion);
264       DWORD dwType = REG_SZ;
265       RegQueryValueEx (hk, REGVAL_AFS_VERSION, NULL, &dwType, (PBYTE)szVersion, &dwSize);
266
267       dwSize = sizeof(dwPatch);
268       dwType = REG_DWORD;
269       RegQueryValueEx (hk, REGVAL_AFS_PATCH, NULL, &dwType, (PBYTE)&dwPatch, &dwSize);
270       RegCloseKey (hk);
271       }
272
273    BOOL fFoundUserName = FALSE;
274    if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
275       {
276       DWORD dwSize = sizeof(szUser);
277       DWORD dwType = REG_SZ;
278       if (RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
279          fFoundUserName = TRUE;
280       RegCloseKey (hk);
281       }
282    if (!fFoundUserName)
283       {
284       if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Network\\Logon"), &hk) == 0)
285          {
286          DWORD dwSize = sizeof(szUser);
287          DWORD dwType = REG_SZ;
288          if (RegQueryValueEx (hk, TEXT("UserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
289             fFoundUserName = TRUE;
290          RegCloseKey (hk);
291          }
292       }
293
294    TCHAR szSource[ cchRESOURCE ];
295    TCHAR szTarget[ cchRESOURCE ];
296
297    GetString (szSource, (dwPatch) ? IDS_TITLE_VERSION : IDS_TITLE_VERSION_NOPATCH);
298    wsprintf (szTarget, szSource, szVersion, dwPatch);
299    SetDlgItemText (hDlg, IDC_TITLE_VERSION, szTarget);
300
301    GetDlgItemText (hDlg, IDC_TITLE_NT, szSource, cchRESOURCE);
302    wsprintf (szTarget, szSource, szUser);
303    SetDlgItemText (hDlg, IDC_TITLE_NT, szTarget);
304 }
305
306
307 void Main_OnCheckMenuRemind (void)
308 {
309    BOOL fRemind = FALSE;
310    lock_ObtainMutex(&g.credsLock);
311    for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
312       {
313       if (g.aCreds[ iCreds ].fRemind)
314          fRemind = TRUE;
315       }
316
317    fRemind = !fRemind;
318    for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
319       {
320       if (g.aCreds[ iCreds ].fRemind != fRemind)
321          {
322          g.aCreds[ iCreds ].fRemind = fRemind;
323          SaveRemind (iCreds);
324          }
325       }
326    lock_ReleaseMutex(&g.credsLock);
327
328    // Check the active tab, and fix its checkbox if necessary
329    //
330    HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
331    LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
332    if (ISCELLTAB(pszTab) && (*pszTab))
333       {
334       HWND hDlg = GetTabChild (hTab);
335       if (hDlg)
336          CheckDlgButton (hDlg, IDC_CREDS_REMIND, fRemind);
337       }
338
339    // Make sure the reminder timer is going
340    //
341    Main_EnableRemindTimer (fRemind);
342 }
343
344
345 void Main_OnRemindTimer (void)
346 {
347    Main_RepopulateTabs (TRUE);
348
349    // See if anything is close to expiring; if so, display a warning
350    // dialog. Make sure we never display a warning more than once.
351    //
352    size_t iExpired;
353    if ((iExpired = Main_FindExpiredCreds()) != -1)
354       {
355       if (InterlockedIncrement (&g.fShowingMessage) != 1)
356          InterlockedDecrement (&g.fShowingMessage);
357       else
358          ShowObtainCreds (TRUE, g.aCreds[ iExpired ].szCell);
359       }
360 }
361
362
363 void Main_OnMouseOver (void)
364 {
365    if ((GetTickCount() - g.tickLastRetest) > cmsecMOUSEOVER)
366       {
367       Main_RepopulateTabs (TRUE);
368       }
369 }
370
371
372 void Main_OnSelectTab (void)
373 {
374    HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
375    size_t iTab = TabCtrl_GetCurSel (hTab);
376
377    HWND hDlgOld = GetTabChild (hTab);
378
379    HWND hDlgNew;
380    if ((hDlgNew = Main_CreateTabDialog (hTab, iTab)) != NULL)
381       ShowWindow (hDlgNew, SW_SHOW);
382
383    if (hDlgOld)
384       DestroyWindow (hDlgOld);
385 }
386
387
388 void Main_OnCheckTerminate (void)
389 {
390    HKEY hk;
391    if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
392       {
393       DWORD dwSize = sizeof(g.fStartup);
394       DWORD dwType = REG_DWORD;
395       RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
396       RegCloseKey (hk);
397       }
398
399    Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
400
401    if (!g.fStartup)
402       Quit();
403 }
404
405
406 HWND Main_CreateTabDialog (HWND hTab, size_t iTab)
407 {
408    HWND hDlg = NULL;
409    LPTSTR psz = NULL;
410
411    TC_ITEM Item;
412    memset (&Item, 0x00, sizeof(Item));
413    Item.mask = TCIF_PARAM;
414    if (TabCtrl_GetItem (hTab, iTab, &Item))
415       {
416       psz = (LPTSTR)(Item.lParam);
417       }
418
419    if (psz == dwTABPARAM_ADVANCED)    // Advanced tab
420       {
421       hDlg = ModelessDialog (IDD_TAB_ADVANCED, hTab, (DLGPROC)Advanced_DlgProc);
422       }
423    else if (psz == dwTABPARAM_MOUNT)  // Mount Points tab
424       {
425       hDlg = ModelessDialog (IDD_TAB_MOUNT, hTab, (DLGPROC)Mount_DlgProc);
426       }
427    else if (ISCELLTAB(psz) && !*psz)  // No Creds tab
428       {
429       hDlg = ModelessDialogParam (IDD_TAB_NOCREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
430       }
431    else if (ISCELLTAB(psz) && *psz)   // Creds tab for a particular cell
432       {
433       hDlg = ModelessDialogParam (IDD_TAB_CREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
434       }
435
436    return hDlg;
437 }
438
439
440 void Main_RepopulateTabs (BOOL fDestroyInvalid)
441 {
442    static BOOL fInHere = FALSE;
443    if (!fInHere)
444       {
445       fInHere = TRUE;
446
447       if (IsWindowVisible (g.hMain))
448          fDestroyInvalid = FALSE;
449
450       // First we'll have to look around and see what credentials we currently
451       // have. This call just updates g.aCreds[]; it doesn't do anything else.
452       //
453       (void)GetCurrentCredentials();
454
455       // We want one tab on the main dialog for each g.aCredentials entry,
456       // and one tab for Advanced.
457       //
458       HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
459
460       // Generate a list of the lParams we'll be giving tabs...
461       //
462       LPTSTR *aTabs = NULL;
463       size_t cTabs = 0;
464       size_t iTabOut = 0;
465
466       size_t nCreds = 0;
467       lock_ObtainMutex(&g.credsLock);
468       for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
469          {
470          if (g.aCreds[ iCreds ].szCell[0])
471             ++nCreds;
472          }
473       if (!nCreds)
474          {
475          fDestroyInvalid = TRUE;
476          }
477
478       if (!fDestroyInvalid)
479          {
480          int nTabs = TabCtrl_GetItemCount(hTab);
481          for (int iTab = 0; iTab < nTabs; ++iTab)
482             {
483             LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
484             if (ISCELLTAB(pszTab) && (*pszTab))
485                {
486                if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
487                   aTabs[ iTabOut++ ] = CloneString(pszTab);
488                }
489             }
490          }
491
492       if (nCreds == 0)
493          {
494          if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
495             aTabs[ iTabOut++ ] = CloneString (TEXT(""));
496          }
497       else for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
498          {
499          if (g.aCreds[ iCreds ].szCell[0])
500             {
501             for (size_t ii = 0; ii < iTabOut; ++ii)
502                {
503                if (!ISCELLTAB (aTabs[ii]))
504                   continue;
505                if (!lstrcmpi (g.aCreds[ iCreds ].szCell, aTabs[ ii ]))
506                   break;
507                }
508             if (ii == iTabOut)
509                {
510                if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
511                   aTabs[ iTabOut++ ] = CloneString (g.aCreds[ iCreds ].szCell);
512                }
513             }
514          }
515       lock_ReleaseMutex(&g.credsLock);
516
517       if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
518          aTabs[ iTabOut++ ] = dwTABPARAM_MOUNT;
519
520       if (g.fIsWinNT)
521          {
522          if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
523             aTabs[ iTabOut++ ] = dwTABPARAM_ADVANCED;
524          }
525
526       // Now erase the current tabs, and re-add new ones. Remember which tab is
527       // currently selected, so we can try to go back to it later.
528       //
529       int iTabSel = 0;
530       if (TabCtrl_GetItemCount(hTab))
531          {
532          LPTSTR pszTabSel = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
533          for (size_t iSel = 0; iSel < iTabOut; ++iSel)
534             {
535             if ((!ISCELLTAB(pszTabSel))  && (!ISCELLTAB(aTabs[iSel])) && (pszTabSel == aTabs[iSel]))
536                iTabSel = iSel;
537             else if (ISCELLTAB(pszTabSel) && ISCELLTAB(aTabs[iSel]) && !lstrcmpi (pszTabSel, aTabs[iSel]))
538                iTabSel = iSel;
539             }
540          }
541
542       int nTabs = TabCtrl_GetItemCount(hTab);
543       for (int iTab = 0; iTab < nTabs; ++iTab)
544          {
545          LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
546          if (ISCELLTAB(pszTab))
547             FreeString (pszTab);
548          }
549       TabCtrl_DeleteAllItems (hTab);
550
551       for (size_t ii = 0; ii < iTabOut; ++ii)
552          {
553          TCHAR szTitle[cchRESOURCE];
554          if (aTabs[ii] == dwTABPARAM_ADVANCED)
555             GetString (szTitle, IDS_ADVANCED);
556          else if (aTabs[ii] == dwTABPARAM_MOUNT)
557             GetString (szTitle, IDS_MOUNT);
558          else if ((nCreds <= 1) || (aTabs[ii][0] == TEXT('\0')))
559             GetString (szTitle, IDS_CREDENTIALS);
560          else
561             lstrcpy (szTitle, aTabs[ii]);
562
563          TC_ITEM Item;
564          memset (&Item, 0x00, sizeof(Item));
565          Item.mask = TCIF_PARAM | TCIF_TEXT;
566          Item.pszText = szTitle;
567          Item.cchTextMax = cchRESOURCE;
568          Item.lParam = (LPARAM)(aTabs[ii]);
569
570          TabCtrl_InsertItem (hTab, ii, &Item);
571          }
572
573       if (aTabs != NULL)
574          Free (aTabs);
575
576       TabCtrl_SetCurSel (hTab, iTabSel);
577       Main_OnSelectTab ();
578
579       fInHere = FALSE;
580       }
581 }
582
583
584 void Main_EnableRemindTimer (BOOL fEnable)
585 {
586    static BOOL bEnabled = FALSE;
587
588    if ( fEnable == FALSE && bEnabled == TRUE ) {
589        KillTimer (g.hMain, ID_REMIND_TIMER);
590        bEnabled = FALSE;
591    } else if ( fEnable == TRUE && bEnabled == FALSE ) {
592       SetTimer (g.hMain, ID_REMIND_TIMER, (ULONG)cmsec1MINUTE * cminREMIND_TEST, NULL);
593       bEnabled = TRUE;
594    }
595 }
596
597
598 size_t Main_FindExpiredCreds (void)
599 {
600    size_t retval = (size_t) -1;
601    lock_ObtainMutex(&g.expirationCheckLock);
602    if ( KFW_is_available() )
603        KFW_AFS_renew_expiring_credentials();
604    lock_ObtainMutex(&g.credsLock);
605    for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
606       {
607       if (!g.aCreds[ iCreds ].szCell[0])
608          continue;
609       if (!g.aCreds[ iCreds ].fRemind)
610          continue;
611
612       SYSTEMTIME stNow;
613       GetLocalTime (&stNow);
614
615       FILETIME ftNow;
616       SystemTimeToFileTime (&stNow, &ftNow);
617
618       FILETIME ftExpires;
619       SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftExpires);
620
621       LONGLONG llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime);
622       LONGLONG llExpires = (((LONGLONG)ftExpires.dwHighDateTime) << 32) + (LONGLONG)(ftExpires.dwLowDateTime);
623
624       llNow /= c100ns1SECOND;
625       llExpires /= c100ns1SECOND;
626
627       if (llExpires <= (llNow + (LONGLONG)cminREMIND_WARN * csec1MINUTE))
628          {
629          if ( KFW_is_available() &&
630               KFW_AFS_renew_token_for_cell(g.aCreds[ iCreds ].szCell) )
631              continue;
632          retval = (size_t) iCreds;
633          break;
634          }
635       }
636    
637    lock_ReleaseMutex(&g.credsLock);
638    lock_ReleaseMutex(&g.expirationCheckLock);
639
640    return retval;
641 }
642
643
644 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
645 {
646    switch (msg)
647       {
648       case WM_INITDIALOG:
649          Terminate_OnInitDialog (hDlg);
650          break;
651
652       case WM_COMMAND:
653          switch (LOWORD(wp))
654             {
655             case IDOK:
656                Terminate_OnOK (hDlg);
657                break;
658
659             case IDCANCEL:
660                EndDialog (hDlg, IDCANCEL);
661                break;
662             }
663          break;
664       }
665
666    return FALSE;
667 }
668
669
670 void Terminate_OnInitDialog (HWND hDlg)
671 {
672    BOOL fPersistent = IsServicePersistent();
673
674    CheckDlgButton (hDlg, IDC_STARTUP, g.fStartup);
675    CheckDlgButton (hDlg, IDC_LEAVE, fPersistent);
676    CheckDlgButton (hDlg, IDC_STOP, !fPersistent);
677 }
678
679
680 void Terminate_OnOK (HWND hDlg)
681 {
682    if (IsServiceRunning())
683       {
684       if (IsDlgButtonChecked (hDlg, IDC_STOP))
685          {
686          SC_HANDLE hManager;
687              if ((hManager = OpenSCManager (NULL, NULL, 
688                                             SC_MANAGER_CONNECT |
689                                             SC_MANAGER_ENUMERATE_SERVICE |
690                                             SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
691             {
692             SC_HANDLE hService;
693             if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), 
694                                          SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
695                {
696                SERVICE_STATUS Status;
697                ControlService (hService, SERVICE_CONTROL_STOP, &Status);
698
699                CloseServiceHandle (hService);
700                }
701
702             CloseServiceHandle (hManager);
703             }
704          }
705       }
706
707    g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP);
708
709    HKEY hk;
710    if (RegCreateKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
711       {
712       DWORD dwSize = sizeof(g.fStartup);
713       DWORD dwType = REG_DWORD;
714       RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize);
715       RegCloseKey (hk);
716       }
717
718    Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
719
720    Quit();
721    EndDialog (hDlg, IDOK);
722 }
723