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.
382 lines
9.0 KiB
382 lines
9.0 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 (ID_TEMPLATE == ((PJOBID) apidl[i])->_id )
|
|
{
|
|
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, OUT
|
|
//
|
|
// Returns: void
|
|
//
|
|
// History: 2/8/1996 RaviR Created
|
|
//
|
|
//____________________________________________________________________________
|
|
|
|
void
|
|
EnsureUniquenessOfFileName(
|
|
LPTSTR pszFile,
|
|
size_t bufLen)
|
|
{
|
|
Win4Assert( NULL != pszFile );
|
|
|
|
int iPostFix = 2;
|
|
|
|
LPTSTR pszName = PathFindFileName(pszFile);
|
|
LPTSTR pszExt = PathFindExtension(pszName);
|
|
|
|
TCHAR szBufExt[10];
|
|
StringCchCopy(szBufExt, 10, 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)
|
|
{
|
|
DWORD dwErr = GetLastError();
|
|
if (dwErr == ERROR_FILE_NOT_FOUND)
|
|
{
|
|
//
|
|
// 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];
|
|
StringCchPrintf(szBufPostFix, 10, TEXT(" %d"), iPostFix++);
|
|
StringCchCopy(&pszFile[lenUpToExt], (bufLen - lenUpToExt), szBufPostFix);
|
|
StringCchCat(&pszFile[lenUpToExt], (bufLen - 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 WCHAR s_szTimeStamp[20]; // space for time & date in format below
|
|
|
|
StringCchPrintf(s_szTimeStamp,
|
|
20,
|
|
TEXT("%02d:%02d:%02d %d/%02d/%d"),
|
|
st.wHour,
|
|
st.wMinute,
|
|
st.wSecond,
|
|
st.wMonth,
|
|
st.wDay,
|
|
st.wYear);
|
|
|
|
return s_szTimeStamp;
|
|
}
|
|
|
|
#endif
|