Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

376 lines
8.2 KiB

//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1996.
//
// File: util.cxx
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 1/8/1996 RaviR Created (Copied from BruceFo's lmshare)
//
//____________________________________________________________________________
#include "..\pch\headers.hxx"
#pragma hdrstop
#include "dbg.h"
#include <mstask.h> // Necessary for util.hxx
#include "jobidl.hxx"
#include "util.hxx"
#include "resource.h"
#include "commdlg.h"
#include "..\inc\sadat.hxx"
extern HINSTANCE g_hInstance;
HRESULT
GetSchSvcState(
DWORD &dwCurrState);
//___________________________________________________________________________
//___________________________________________________________________________
//___________________________________________________________________________
//___________________________________________________________________________
//
// Menu merging routines
//___________________________________________________________________________
//___________________________________________________________________________
//___________________________________________________________________________
//___________________________________________________________________________
HMENU
LoadPopupMenu(
HINSTANCE hinst,
UINT id)
{
HMENU hmParent = LoadMenu(hinst, MAKEINTRESOURCE(id));
if (NULL == hmParent)
{
return NULL;
}
HMENU hmPopup = GetSubMenu(hmParent, 0);
RemoveMenu(hmParent, 0, MF_BYPOSITION);
DestroyMenu(hmParent);
return hmPopup;
}
HMENU
UtGetMenuFromID(
HMENU hmMain,
UINT uID
)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_SUBMENU;
mii.cch = 0; // just in case
if (!GetMenuItemInfo(hmMain, uID, FALSE, &mii))
{
return NULL;
}
return mii.hSubMenu;
}
int
UtMergePopupMenus(
HMENU hmMain,
HMENU hmMerge,
int idCmdFirst,
int idCmdLast)
{
int i;
int idTemp;
int idMax = idCmdFirst;
for (i = GetMenuItemCount(hmMerge) - 1; i >= 0; --i)
{
MENUITEMINFO mii;
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_SUBMENU;
mii.cch = 0; // just in case
if (!GetMenuItemInfo(hmMerge, i, TRUE, &mii))
{
continue;
}
idTemp = Shell_MergeMenus(
UtGetMenuFromID(hmMain, mii.wID),
mii.hSubMenu,
0,
idCmdFirst,
idCmdLast,
MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS);
if (idMax < idTemp)
{
idMax = idTemp;
}
}
return idMax;
}
void
UtMergeMenu(
HINSTANCE hinst,
UINT idMainMerge,
UINT idPopupMerge,
LPQCMINFO pqcm)
{
HMENU hmMerge;
UINT idMax = pqcm->idCmdFirst;
UINT idTemp;
if (idMainMerge
&& (hmMerge = LoadPopupMenu(hinst, idMainMerge)) != NULL)
{
idMax = Shell_MergeMenus(
pqcm->hmenu,
hmMerge,
pqcm->indexMenu,
pqcm->idCmdFirst,
pqcm->idCmdLast,
MM_SUBMENUSHAVEIDS);
DestroyMenu(hmMerge);
}
if (idPopupMerge
&& (hmMerge = LoadMenu(hinst, MAKEINTRESOURCE(idPopupMerge))) != NULL)
{
idTemp = UtMergePopupMenus(
pqcm->hmenu,
hmMerge,
pqcm->idCmdFirst,
pqcm->idCmdLast);
if (idMax < idTemp)
{
idMax = idTemp;
}
DestroyMenu(hmMerge);
}
pqcm->idCmdFirst = idMax;
}
//+--------------------------------------------------------------------------
//
// Function: ContainsTemplateObject
//
// Synopsis: Return TRUE if [apidl] contains a CJobID object which is
// marked as a template object.
//
// Arguments: [cidl] - number of item id lists in [apidl]
// [apidl] - array of item id lists, each of which can contain
// only one itemid.
//
// History: 5-09-1997 DavidMun Created
//
//---------------------------------------------------------------------------
BOOL
ContainsTemplateObject(
UINT cidl,
LPCITEMIDLIST *apidl)
{
UINT i;
for (i = 0; i < cidl; i++)
{
if (JF_IsValidID(apidl[i]))
{
if (((PJOBID) apidl[i])->IsTemplate())
{
return TRUE;
}
}
else
{
DEBUG_OUT((DEB_WARN, "ContainsTemplateObject: item %u not jobid\n", i));
}
}
return FALSE;
}
//____________________________________________________________________________
//
// Function: EnsureUniquenessOfFileName
//
// Synopsis: Internal function. pszFile's buffer size assumed to be
// greater than MAX_PATH.
//
// Arguments: [pszFile] -- IN
//
// Returns: void
//
// History: 2/8/1996 RaviR Created
//
//____________________________________________________________________________
void
EnsureUniquenessOfFileName(
LPTSTR pszFile)
{
Win4Assert( NULL != pszFile );
int iPostFix = 2;
LPTSTR pszName = PathFindFileName(pszFile);
LPTSTR pszExt = PathFindExtension(pszName);
TCHAR szBufExt[10];
lstrcpy(szBufExt, pszExt);
int lenUpToExt = (int)(pszExt - pszFile); // lstrlen(pszFile) - lstrlen(pszExt)
Win4Assert(lenUpToExt >= 0);
//
// Ensure uniqueness of the file
//
while (1)
{
HANDLE hFile = CreateFile(pszFile, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
// No file with this name exists. So this name is unique.
break;
}
else
{
CloseHandle(hFile);
// post fix a number to make the file name unique
TCHAR szBufPostFix[10];
wsprintf(szBufPostFix, TEXT(" %d"), iPostFix++);
lstrcpy(&pszFile[lenUpToExt], szBufPostFix);
lstrcat(&pszFile[lenUpToExt], szBufExt);
}
}
}
//+--------------------------------------------------------------------------
//
// Function: CheckSaDat
//
// Synopsis: Update or create the sa.dat file if it is missing or its
// waitable timer support flag disagrees with what the system
// reports.
//
// Arguments: [tszFolderPath] - path to tasks folder
//
// History: 11-12-1997 DavidMun Created
//
// Notes: Call only with [tszFolderPath] a path on the local machine.
//
//---------------------------------------------------------------------------
VOID
CheckSaDat(
LPCTSTR tszFolderPath)
{
HRESULT hr;
DWORD dwVersion;
BYTE bSvcFlags;
BYTE bPlatformId;
hr = SADatGetData(tszFolderPath,
&dwVersion,
&bPlatformId,
&bSvcFlags);
BOOL fNeedUpdate = FALSE;
if (SUCCEEDED(hr))
{
BOOL fSaDatTimersFlag = bSvcFlags & SA_DAT_SVCFLAG_RESUME_TIMERS;
BOOL fTimers = ResumeTimersSupported();
if (fSaDatTimersFlag && !fTimers || !fSaDatTimersFlag && fTimers)
{
fNeedUpdate = TRUE;
}
}
else
{
fNeedUpdate = TRUE;
}
if (fNeedUpdate)
{
DWORD dwState;
hr = GetSchSvcState(dwState);
if (SUCCEEDED(hr))
{
BOOL fRunning = (dwState != SERVICE_STOPPED &&
dwState != SERVICE_STOP_PENDING);
SADatCreate(tszFolderPath, fRunning);
}
}
}
#if DBG==1
LPTSTR DbgGetTimeStr(FILETIME &ft)
{
SYSTEMTIME st;
FileTimeToSystemTime(&ft, &st);
return DbgGetTimeStr(st);
}
LPTSTR DbgGetTimeStr(SYSTEMTIME &st)
{
static TCHAR s_szTimeStamp[20]; // space for time & date in format below
wsprintf(s_szTimeStamp,
TEXT("%02d:%02d:%02d %d/%02d/%d"),
st.wHour,
st.wMinute,
st.wSecond,
st.wMonth,
st.wDay,
st.wYear);
return s_szTimeStamp;
}
#endif