2 * Copyright 2000, International Business Machines Corporation and others.
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
11 #include <afs/param.h>
20 #include "svr_security.h"
22 #include "propcache.h"
29 #include <afs/afs_AdminErrors.h>
34 * DEFINITIONS ________________________________________________________________
40 * VARIABLES __________________________________________________________________
49 * PROTOTYPES _________________________________________________________________
53 BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow);
54 void ExitApplication (void);
58 * ROUTINES ___________________________________________________________________
62 extern "C" int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pszCmdLineA, int nCmdShow)
64 LPTSTR pszCmdLine = AnsiToString (pszCmdLineA);
66 if (InitApplication (hInst, pszCmdLine, nCmdShow))
73 FreeString (pszCmdLine, pszCmdLineA);
78 BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow)
80 TaLocale_LoadCorrespondingModule (hInst);
82 memset (&g, 0x00, sizeof(g));
84 g.hAccel = TaLocale_LoadAccelerators (ACCEL_MAIN);
87 TCHAR szTitle[ cchRESOURCE ];
88 GetString (szTitle, IDS_APP_TITLE);
89 if ((hPrevious = FindWindow (TEXT("AFSManagerClass"), szTitle)) != NULL)
92 SendMessage (hPrevious, WM_SHOW_YOURSELF, 0, 0);
96 AfsAppLib_SetAppName(szTitle);
97 AfsAppLib_SetPumpRoutine(PumpMessage);
100 memset (&tqp, 0x00, sizeof(tqp));
101 tqp.nThreadsMax = 10;
102 tqp.fnCreateTaskPacket = CreateTaskPacket;
103 tqp.fnPerformTask = PerformTask;
104 tqp.fnFreeTaskPacket = FreeTaskPacket;
105 AfsAppLib_InitTaskQueue (&tqp);
107 Main_ConfigureHelp();
109 // Determine how the app is supposed to look--that is, remember what it
110 // looked like last time, and if there was no "last time", pick some
113 if (!RestoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED))
115 memset (&gr, 0x00, sizeof(gr));
116 SetRectEmpty (&gr.rMain);
117 SetRectEmpty (&gr.rMainPreview);
118 SetRectEmpty (&gr.rServerLast);
119 SetRectEmpty (&gr.rViewLog);
120 SetRectEmpty (&gr.rActions);
126 gr.tabLast = tabFILESETS;
128 Server_SetDefaultView_Horz (&gr.diHorz.viewSvr);
129 Server_SetDefaultView_Vert (&gr.diVert.viewSvr);
130 Services_SetDefaultView (&gr.viewSvc);
131 Aggregates_SetDefaultView (&gr.viewAgg);
132 Filesets_SetDefaultView (&gr.viewSet);
133 Replicas_SetDefaultView (&gr.viewRep);
134 Action_SetDefaultView (&gr.viewAct);
135 Server_Key_SetDefaultView (&gr.viewKey);
137 gr.diHorz.cSplitter = -100;
138 gr.diVert.cSplitter = -89;
140 gr.cbQuotaUnits = cb1KB;
142 gr.fOpenMonitors = TRUE;
143 gr.fCloseUnmonitors = TRUE;
144 gr.fServerLongNames = FALSE;
145 gr.fDoubleClickOpens = 2;
146 gr.fWarnBadCreds = TRUE;
155 if (!AfsClass_Initialize (&status))
157 if (status == ADMCLIENTCANTINITAFSLOCATION)
158 ImmediateErrorDialog (status, IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL);
160 ImmediateErrorDialog (status, IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN);
164 AfsClass_RequestLongServerNames (gr.fServerLongNames);
165 AfsClass_SpecifyRefreshDomain (AFSCLASS_WANT_VOLUMES);
167 // Create a notification object for the AFSClass library, so that it can
168 // let us know when anything changes. The notification handler we'll
169 // install will take requests from the rest of the SVRMGR package and
170 // forward notifications around to whichever windows are actually
173 CreateNotificationDispatch();
175 // Create a few variations on WC_DIALOG, so we get appropriate icons on
179 GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc);
180 wc.hInstance = THIS_HINST;
181 wc.hIcon = TaLocale_LoadIcon (IDI_MAIN);
182 wc.lpszClassName = TEXT("AFSManagerClass");
183 wc.style |= CS_GLOBALCLASS;
186 GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc);
187 wc.hInstance = THIS_HINST;
188 wc.hIcon = TaLocale_LoadIcon (IDI_SERVER);
189 wc.lpszClassName = TEXT("ServerWindowClass");
190 wc.style |= CS_GLOBALCLASS;
193 // Okay, the big step: create the main window (ie, the servers list).
194 // Note that it doesn't get shown yet!
196 CMDLINEOP op = ParseCommandLine (pszCmdLine);
197 if (op == opCLOSEAPP)
200 if (op == opLOOKUPERRORCODE)
206 g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DialogProc);
210 if (op != opNOCELLDIALOG)
212 if (OpenCellDialog() != IDOK)
220 void ExitApplication (void)
227 if (g.hMain && IsWindow(g.hMain))
229 if (gr.fPreview && !gr.fVert)
230 FL_StoreView (GetDlgItem (g.hMain, IDC_SERVERS), &gr.diHorz.viewSvr);
232 FL_StoreView (GetDlgItem (g.hMain, IDC_SERVERS), &gr.diVert.viewSvr);
235 wpl.length = sizeof(wpl);
236 if (GetWindowPlacement (g.hMain, &wpl))
239 gr.rMainPreview = wpl.rcNormalPosition;
241 gr.rMain = wpl.rcNormalPosition;
245 StoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED);
247 if (Subsets_SaveIfDirty (g.sub))
249 if (Action_fAnyActive()) // just *pretend* to close the app
251 Action_WindowToTop (FALSE);
252 ShowWindow (g.hMain, SW_HIDE);
257 PostQuitMessage (g.rc);
263 void PumpMessage (MSG *lpm)
265 if (g.hMain && IsWindow (g.hMain))
267 if (GetActiveWindow())
269 if (TranslateAccelerator (GetActiveWindow(), g.hAccel, lpm))
274 if (!IsMemoryManagerMessage (lpm))
276 TranslateMessage (lpm);
277 DispatchMessage (lpm);
282 BOOL cdecl StartThread (DWORD (WINAPI *lpfnStart)(PVOID lp), ...)
285 va_start (arg, lpfnStart);
286 PVOID lp = va_arg (arg, PVOID);
291 if ((hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)lpfnStart, lp, 0, &dwThreadID)) == NULL)
294 SetThreadPriority (hThread, THREAD_PRIORITY_BELOW_NORMAL);