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>
15 #include <WINNT/afsapplib.h>
16 #include "al_dynlink.h"
17 #include <WINNT/TaAfsAdmSvrClient.h>
21 * DEFINITIONS ________________________________________________________________
25 #define GWD_ANIMATIONFRAME TEXT("afsapplib/al_misc.cpp - next animation frame")
29 * PROTOTYPES _________________________________________________________________
33 BOOL CALLBACK AfsAppLib_TranslateErrorFunc (LPTSTR pszText, ULONG code, LANGID idLanguage);
37 * STARTUP ____________________________________________________________________
41 static HINSTANCE g_hInst = NULL;
42 static HINSTANCE g_hInstApp = NULL;
44 HINSTANCE AfsAppLib_GetInstance (void)
50 EXPORTED HINSTANCE AfsAppLib_GetAppInstance (void)
53 g_hInstApp = GetModuleHandle(NULL);
58 EXPORTED void AfsAppLib_SetAppInstance (HINSTANCE hInst)
64 extern "C" BOOLEAN _stdcall DllEntryPoint (HANDLE hInst, DWORD dwReason, PVOID pReserved)
68 case DLL_PROCESS_ATTACH:
71 g_hInst = (HINSTANCE)hInst;
72 TaLocale_LoadCorrespondingModule (g_hInst);
73 SetErrorTranslationFunction ((LPERRORPROC)AfsAppLib_TranslateErrorFunc);
76 RegisterSpinnerClass();
77 RegisterElapsedClass();
80 RegisterSockAddrClass();
81 RegisterCheckListClass();
82 RegisterFastListClass();
91 * IMAGE LISTS ________________________________________________________________
95 HIMAGELIST AfsAppLib_CreateImageList (BOOL fLarge)
98 hil = ImageList_Create ((fLarge)?32:16, (fLarge)?32:16, TRUE, 4, 0);
100 AfsAppLib_AddToImageList (hil, IDI_SERVER, fLarge);
101 AfsAppLib_AddToImageList (hil, IDI_SERVER_ALERT, fLarge);
102 AfsAppLib_AddToImageList (hil, IDI_SERVER_UNMON, fLarge);
103 AfsAppLib_AddToImageList (hil, IDI_SERVICE, fLarge);
104 AfsAppLib_AddToImageList (hil, IDI_SERVICE_ALERT, fLarge);
105 AfsAppLib_AddToImageList (hil, IDI_SERVICE_STOPPED, fLarge);
106 AfsAppLib_AddToImageList (hil, IDI_AGGREGATE, fLarge);
107 AfsAppLib_AddToImageList (hil, IDI_AGGREGATE_ALERT, fLarge);
108 AfsAppLib_AddToImageList (hil, IDI_FILESET, fLarge);
109 AfsAppLib_AddToImageList (hil, IDI_FILESET_ALERT, fLarge);
110 AfsAppLib_AddToImageList (hil, IDI_FILESET_LOCKED, fLarge);
111 AfsAppLib_AddToImageList (hil, IDI_BOSSERVICE, fLarge);
112 AfsAppLib_AddToImageList (hil, IDI_CELL, fLarge);
113 AfsAppLib_AddToImageList (hil, IDI_SERVER_KEY, fLarge);
114 AfsAppLib_AddToImageList (hil, IDI_USER, fLarge);
115 AfsAppLib_AddToImageList (hil, IDI_GROUP, fLarge);
121 void AfsAppLib_AddToImageList (HIMAGELIST hil, int idi, BOOL fLarge)
123 HICON hi = TaLocale_LoadIcon (idi);
124 ImageList_AddIcon (hil, hi);
129 * ANIMATION __________________________________________________________________
133 void AfsAppLib_AnimateIcon (HWND hIcon, int *piFrameLast)
136 static HICON hiFrame[8];
137 static BOOL fLoaded = FALSE;
141 hiStop = TaLocale_LoadIcon (IDI_SPINSTOP);
142 hiFrame[0] = TaLocale_LoadIcon (IDI_SPIN1);
143 hiFrame[1] = TaLocale_LoadIcon (IDI_SPIN2);
144 hiFrame[2] = TaLocale_LoadIcon (IDI_SPIN3);
145 hiFrame[3] = TaLocale_LoadIcon (IDI_SPIN4);
146 hiFrame[4] = TaLocale_LoadIcon (IDI_SPIN5);
147 hiFrame[5] = TaLocale_LoadIcon (IDI_SPIN6);
148 hiFrame[6] = TaLocale_LoadIcon (IDI_SPIN7);
149 hiFrame[7] = TaLocale_LoadIcon (IDI_SPIN8);
155 *piFrameLast = (*piFrameLast == 7) ? 0 : (1+*piFrameLast);
158 SendMessage (hIcon, STM_SETICON, (WPARAM)((piFrameLast) ? hiFrame[ *piFrameLast ] : hiStop), 0);
162 BOOL CALLBACK AnimationHook (HWND hIcon, UINT msg, WPARAM wp, LPARAM lp)
164 PVOID oldProc = Subclass_FindNextHook (hIcon, AnimationHook);
170 iFrame = GetWindowData (hIcon, GWD_ANIMATIONFRAME);
171 AfsAppLib_AnimateIcon (hIcon, &iFrame);
172 SetWindowData (hIcon, GWD_ANIMATIONFRAME, iFrame);
176 Subclass_RemoveHook (hIcon, AnimationHook);
181 return CallWindowProc ((WNDPROC)oldProc, hIcon, msg, wp, lp);
183 return DefWindowProc (hIcon, msg, wp, lp);
187 void AfsAppLib_StartAnimation (HWND hIcon, int fps)
189 Subclass_AddHook (hIcon, AnimationHook);
190 SetTimer (hIcon, 0, 1000/((fps) ? fps : 8), NULL);
191 AfsAppLib_AnimateIcon (hIcon);
195 void AfsAppLib_StopAnimation (HWND hIcon)
197 KillTimer (hIcon, 0);
198 AfsAppLib_AnimateIcon (hIcon);
199 Subclass_RemoveHook (hIcon, AnimationHook);
204 * ERROR TRANSLATION __________________________________________________________
208 BOOL CALLBACK AfsAppLib_TranslateErrorFunc (LPTSTR pszText, ULONG code, LANGID idLanguage)
211 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
214 return asc_ErrorCodeTranslate (idClient, code, idLanguage, pszText, &status);
216 else if (OpenUtilLibrary())
218 const char *pszTextA = NULL;
220 if (util_AdminErrorCodeTranslate (code, idLanguage, &pszTextA, &status) && (pszTextA))
222 CopyAnsiToString (pszText, pszTextA);
232 BOOL AfsAppLib_TranslateError (LPTSTR pszText, ULONG status, LANGID idLanguage)
234 LANGID idLangOld = TaLocale_GetLanguage();
235 TaLocale_SetLanguage (idLanguage);
237 BOOL rc = FormatError (pszText, TEXT("%s"), status);
239 TaLocale_SetLanguage (idLangOld);
245 * CELL LIST __________________________________________________________________
249 #define cREALLOC_CELLLIST 4
251 LPCELLLIST AfsAppLib_GetCellList (HKEY hkBase, LPTSTR pszRegPath)
253 LPCELLLIST lpcl = New (CELLLIST);
254 memset (lpcl, 0x00, sizeof(CELLLIST));
256 if (hkBase && pszRegPath)
258 lpcl->hkBase = hkBase;
259 lstrcpy (lpcl->szRegPath, pszRegPath);
262 if (RegOpenKey (hkBase, pszRegPath, &hk) == 0)
264 TCHAR szCell[ cchNAME ];
265 for (size_t ii = 0; RegEnumKey (hk, ii, szCell, cchNAME) == 0; ++ii)
267 if (REALLOC (lpcl->aCells, lpcl->nCells, 1+ii, cREALLOC_CELLLIST))
269 lpcl->aCells[ ii ] = CloneString (szCell);
275 else // Get cell list from AFS
280 TCHAR szDefCell[ cchNAME ];
281 if (AfsAppLib_GetLocalCell (szDefCell))
283 for (size_t iclDef = 0; iclDef < lpcl->nCells; ++iclDef)
285 if (lpcl->aCells[ iclDef ] == NULL)
287 if (!lstrcmpi (lpcl->aCells[ iclDef ], szDefCell))
290 if (iclDef == lpcl->nCells) // default cell not currently in list?
292 for (iclDef = 0; iclDef < lpcl->nCells; ++iclDef)
294 if (lpcl->aCells[ iclDef ] == NULL)
297 if (REALLOC (lpcl->aCells, lpcl->nCells, 1+iclDef, cREALLOC_CELLLIST))
299 lpcl->aCells[iclDef] = CloneString (szDefCell);
302 if ((iclDef > 0) && (iclDef < lpcl->nCells) && (lpcl->aCells[ iclDef ]))
304 LPTSTR pszZero = lpcl->aCells[0];
305 lpcl->aCells[0] = lpcl->aCells[iclDef];
306 lpcl->aCells[iclDef] = pszZero;
310 for ( ; (lpcl->nCells != 0); (lpcl->nCells)--)
312 if (lpcl->aCells[ lpcl->nCells-1 ] != NULL)
320 LPCELLLIST AfsAppLib_GetCellList (LPCELLLIST lpclCopy)
322 LPCELLLIST lpcl = New (CELLLIST);
323 memset (lpcl, 0x00, sizeof(CELLLIST));
327 if (REALLOC (lpcl->aCells, lpcl->nCells, lpclCopy->nCells, cREALLOC_CELLLIST))
329 for (size_t icl = 0; icl < lpcl->nCells; ++icl)
331 if (lpclCopy->aCells[ icl ])
333 lpcl->aCells[ icl ] = CloneString (lpclCopy->aCells[ icl ]);
343 void AfsAppLib_AddToCellList (LPCELLLIST lpcl, LPTSTR pszCell)
345 if (lpcl && lpcl->hkBase && lpcl->szRegPath[0])
347 TCHAR szPath[ MAX_PATH ];
348 wsprintf (szPath, TEXT("%s\\%s"), lpcl->szRegPath, pszCell);
351 if (RegCreateKey (lpcl->hkBase, szPath, &hk) == 0)
359 void AfsAppLib_FreeCellList (LPCELLLIST lpcl)
365 for (size_t icl = 0; icl < lpcl->nCells; ++icl)
367 if (lpcl->aCells[icl] != NULL)
368 FreeString (lpcl->aCells[icl]);
378 * TRULY MISCELLANEOUS ________________________________________________________
382 BOOL AfsAppLib_IsTimeInFuture (LPSYSTEMTIME pstTest)
385 GetSystemTime (&stNow);
388 SystemTimeToFileTime (&stNow, &ftNowGMT);
391 SystemTimeToFileTime (pstTest, &ftTest);
393 if (CompareFileTime (&ftTest, &ftNowGMT) >= 0)
400 void AfsAppLib_UnixTimeToSystemTime (LPSYSTEMTIME pst, ULONG ut, BOOL fElapsed)
402 // A Unix time is the number of seconds since 1/1/1970.
403 // The first step in this conversion is to change that count-of-seconds
404 // into a count-of-100ns-intervals...
407 ldw.QuadPart = (LONGLONG)10000000 * (LONGLONG)ut;
409 // Then adjust the count to be a count-of-100ns-intervals since
410 // 1/1/1601, instead of 1/1/1970. That means adding a *big* number...
412 ldw.QuadPart += (LONGLONG)0x019db1ded53e8000;
414 // Now the count is effectively a FILETIME, which we can convert
415 // to a SYSTEMTIME with a Win32 API.
418 ft.dwHighDateTime = (DWORD)ldw.HighPart;
419 ft.dwLowDateTime = (DWORD)ldw.LowPart;
420 FileTimeToSystemTime (&ft, pst);
426 pst->wDayOfWeek -= 1;
432 void AfsAppLib_SplitCredentials (LPTSTR pszCreds, LPTSTR pszCell, LPTSTR pszID)
434 LPTSTR pszSlash = (LPTSTR)lstrrchr (pszCreds, TEXT('/'));
435 if (pszSlash == NULL)
438 AfsAppLib_GetLocalCell (pszCell);
440 lstrcpy (pszID, pszCreds);
442 else // a cell was specified
445 lstrzcpy (pszCell, pszCreds, pszSlash -pszCreds);
447 lstrcpy (pszID, 1+pszSlash);
452 BOOL AfsAppLib_GetLocalCell (LPTSTR pszCell, ULONG *pStatus)
454 static TCHAR szCell[ cchRESOURCE ] = TEXT("");
459 if (szCell[0] == TEXT('\0'))
462 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
464 rc = asc_LocalCellGet (idClient, szCell, &status);
466 else if (OpenClientLibrary())
468 char szCellNameA[ MAX_PATH ];
469 if ((rc = afsclient_LocalCellGet (szCellNameA, (afs_status_p)&status)) == TRUE)
471 CopyAnsiToString (szCell, szCellNameA);
473 CloseClientLibrary();
478 lstrcpy (pszCell, szCell);
485 BOOL AfsAppLib_ReallocFunction (LPVOID *ppTarget, size_t cbElement, size_t *pcTarget, size_t cReq, size_t cInc)
490 if (cReq <= *pcTarget)
493 if ((cNew = cInc * ((cReq + cInc-1) / cInc)) <= 0)
496 if ((pNew = (LPVOID)Allocate (cbElement * cNew)) == NULL)
498 memset (pNew, 0x00, cbElement * cNew);
502 memcpy (pNew, *ppTarget, cbElement * (*pcTarget));
512 HFONT AfsAppLib_CreateFont (int idsFont)
514 TCHAR szFont[ cchRESOURCE ];
515 GetString (szFont, idsFont);
517 HFONT hf = (HFONT)GetStockObject (DEFAULT_GUI_FONT);
520 GetObject (hf, sizeof(lf), &lf);
521 lf.lfWeight = FW_NORMAL;
523 LPTSTR pszSection = szFont;
524 LPTSTR pszNextSection;
525 if ((pszNextSection = (LPTSTR)lstrchr (pszSection, TEXT(','))) != NULL)
526 *pszNextSection++ = TEXT('\0');
527 if (!pszSection || !*pszSection)
530 lstrcpy (lf.lfFaceName, pszSection);
532 pszSection = pszNextSection;
533 if ((pszNextSection = (LPTSTR)lstrchr (pszSection, TEXT(','))) != NULL)
534 *pszNextSection++ = TEXT('\0');
535 if (!pszSection || !*pszSection)
538 HDC hdc = GetDC (NULL);
539 lf.lfHeight = -MulDiv (_ttol(pszSection), GetDeviceCaps (hdc, LOGPIXELSY), 72);
540 ReleaseDC (NULL, hdc);
542 pszSection = pszNextSection;
543 if ((pszNextSection = (LPTSTR)lstrchr (pszSection, TEXT(','))) != NULL)
544 *pszNextSection++ = TEXT('\0');
545 if (pszSection && *pszSection)
547 if (lstrchr (pszSection, TEXT('b')) || lstrchr (pszSection, TEXT('B')))
548 lf.lfWeight = FW_BOLD;
549 if (lstrchr (pszSection, TEXT('i')) || lstrchr (pszSection, TEXT('I')))
551 if (lstrchr (pszSection, TEXT('u')) || lstrchr (pszSection, TEXT('U')))
552 lf.lfUnderline = TRUE;
555 return CreateFontIndirect(&lf);