11 #include "svr_security.h"
13 #include "propcache.h"
20 #include <afs/afs_AdminErrors.h>
25 * DEFINITIONS ________________________________________________________________
31 * VARIABLES __________________________________________________________________
40 * PROTOTYPES _________________________________________________________________
44 BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow);
45 void ExitApplication (void);
49 * ROUTINES ___________________________________________________________________
53 int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pszCmdLineA, int nCmdShow)
55 LPTSTR pszCmdLine = AnsiToString (pszCmdLineA);
57 if (InitApplication (hInst, pszCmdLine, nCmdShow))
64 FreeString (pszCmdLine, pszCmdLineA);
69 BOOL InitApplication (HINSTANCE hInst, LPTSTR pszCmdLine, int nCmdShow)
71 TaLocale_LoadCorrespondingModule (hInst);
73 memset (&g, 0x00, sizeof(g));
75 g.hAccel = TaLocale_LoadAccelerators (ACCEL_MAIN);
78 TCHAR szTitle[ cchRESOURCE ];
79 GetString (szTitle, IDS_APP_TITLE);
80 if ((hPrevious = FindWindow (TEXT("AFSManagerClass"), szTitle)) != NULL)
83 SendMessage (hPrevious, WM_SHOW_YOURSELF, 0, 0);
87 AfsAppLib_SetAppName(szTitle);
88 AfsAppLib_SetPumpRoutine(PumpMessage);
91 memset (&tqp, 0x00, sizeof(tqp));
93 tqp.fnCreateTaskPacket = CreateTaskPacket;
94 tqp.fnPerformTask = PerformTask;
95 tqp.fnFreeTaskPacket = FreeTaskPacket;
96 AfsAppLib_InitTaskQueue (&tqp);
100 // Determine how the app is supposed to look--that is, remember what it
101 // looked like last time, and if there was no "last time", pick some
104 if (!RestoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED))
106 memset (&gr, 0x00, sizeof(gr));
107 SetRectEmpty (&gr.rMain);
108 SetRectEmpty (&gr.rMainPreview);
109 SetRectEmpty (&gr.rServerLast);
110 SetRectEmpty (&gr.rViewLog);
111 SetRectEmpty (&gr.rActions);
117 gr.tabLast = tabFILESETS;
119 Server_SetDefaultView_Horz (&gr.diHorz.viewSvr);
120 Server_SetDefaultView_Vert (&gr.diVert.viewSvr);
121 Services_SetDefaultView (&gr.viewSvc);
122 Aggregates_SetDefaultView (&gr.viewAgg);
123 Filesets_SetDefaultView (&gr.viewSet);
124 Replicas_SetDefaultView (&gr.viewRep);
125 Action_SetDefaultView (&gr.viewAct);
126 Server_Key_SetDefaultView (&gr.viewKey);
128 gr.diHorz.cSplitter = -100;
129 gr.diVert.cSplitter = -89;
131 gr.cbQuotaUnits = cb1KB;
133 gr.fOpenMonitors = TRUE;
134 gr.fCloseUnmonitors = TRUE;
135 gr.fServerLongNames = FALSE;
136 gr.fDoubleClickOpens = 2;
137 gr.fWarnBadCreds = TRUE;
146 if (!AfsClass_Initialize (&status))
148 if (status == ADMCLIENTCANTINITAFSLOCATION)
149 ImmediateErrorDialog (status, IDS_ERROR_CANT_INIT_AFSCLASS_INSTALL);
151 ImmediateErrorDialog (status, IDS_ERROR_CANT_INIT_AFSCLASS_UNKNOWN);
155 AfsClass_RequestLongServerNames (gr.fServerLongNames);
156 AfsClass_SpecifyRefreshDomain (AFSCLASS_WANT_VOLUMES);
158 // Create a notification object for the AFSClass library, so that it can
159 // let us know when anything changes. The notification handler we'll
160 // install will take requests from the rest of the SVRMGR package and
161 // forward notifications around to whichever windows are actually
164 CreateNotificationDispatch();
166 // Create a few variations on WC_DIALOG, so we get appropriate icons on
170 GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc);
171 wc.hInstance = THIS_HINST;
172 wc.hIcon = TaLocale_LoadIcon (IDI_MAIN);
173 wc.lpszClassName = TEXT("AFSManagerClass");
174 wc.style |= CS_GLOBALCLASS;
177 GetClassInfo (THIS_HINST, MAKEINTRESOURCE( WC_DIALOG ), &wc);
178 wc.hInstance = THIS_HINST;
179 wc.hIcon = TaLocale_LoadIcon (IDI_SERVER);
180 wc.lpszClassName = TEXT("ServerWindowClass");
181 wc.style |= CS_GLOBALCLASS;
184 // Okay, the big step: create the main window (ie, the servers list).
185 // Note that it doesn't get shown yet!
187 CMDLINEOP op = ParseCommandLine (pszCmdLine);
188 if (op == opCLOSEAPP)
191 if (op == opLOOKUPERRORCODE)
197 g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DialogProc);
201 if (op != opNOCELLDIALOG)
203 if (OpenCellDialog() != IDOK)
211 void ExitApplication (void)
218 if (g.hMain && IsWindow(g.hMain))
220 if (gr.fPreview && !gr.fVert)
221 FL_StoreView (GetDlgItem (g.hMain, IDC_SERVERS), &gr.diHorz.viewSvr);
223 FL_StoreView (GetDlgItem (g.hMain, IDC_SERVERS), &gr.diVert.viewSvr);
226 wpl.length = sizeof(wpl);
227 if (GetWindowPlacement (g.hMain, &wpl))
230 gr.rMainPreview = wpl.rcNormalPosition;
232 gr.rMain = wpl.rcNormalPosition;
236 StoreSettings (REGSTR_SETTINGS_BASE, REGSTR_SETTINGS_PATH, REGVAL_SETTINGS, &gr, sizeof(gr), wVerGLOBALS_RESTORED);
238 if (Subsets_SaveIfDirty (g.sub))
240 if (Action_fAnyActive()) // just *pretend* to close the app
242 Action_WindowToTop (FALSE);
243 ShowWindow (g.hMain, SW_HIDE);
248 PostQuitMessage (g.rc);
254 void PumpMessage (MSG *lpm)
256 if (g.hMain && IsWindow (g.hMain))
258 if (GetActiveWindow())
260 if (TranslateAccelerator (GetActiveWindow(), g.hAccel, lpm))
265 if (!IsMemoryManagerMessage (lpm))
267 TranslateMessage (lpm);
268 DispatchMessage (lpm);
273 BOOL cdecl StartThread (DWORD (WINAPI *lpfnStart)(PVOID lp), ...)
276 va_start (arg, lpfnStart);
277 PVOID lp = va_arg (arg, PVOID);
282 if ((hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)lpfnStart, lp, 0, &dwThreadID)) == NULL)
285 SetThreadPriority (hThread, THREAD_PRIORITY_BELOW_NORMAL);