mirror of https://github.com/lianthony/NT4.0
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.
372 lines
9.9 KiB
372 lines
9.9 KiB
/** FILE: utiltext.c ******* Module Header ********************************
|
|
*
|
|
* Control panel utility library routines. This file contains error
|
|
* reporting message routines, System Time/Date routines, and other
|
|
* misc. support routines.
|
|
*
|
|
* History:
|
|
* 15:30 on Thur 25 Apr 1991 -by- Steve Cathcart [stevecat]
|
|
* Took base code from Win 3.1 source
|
|
* 10:30 on Tues 04 Feb 1992 -by- Steve Cathcart [stevecat]
|
|
* Updated code to latest Win 3.1 sources
|
|
*
|
|
* Copyright (C) 1990-1992 Microsoft Corporation
|
|
*
|
|
*************************************************************************/
|
|
//==========================================================================
|
|
// Include Files
|
|
//==========================================================================
|
|
// C Runtime
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
// Local App specific
|
|
#include "main.h"
|
|
|
|
#include <lzexpand.h>
|
|
|
|
//==========================================================================
|
|
// Definitions
|
|
//==========================================================================
|
|
#define MAX_RHS 256
|
|
|
|
//==========================================================================
|
|
// External Declarations
|
|
//==========================================================================
|
|
|
|
|
|
//==========================================================================
|
|
// Local Data Declarations
|
|
//==========================================================================
|
|
|
|
short wDateTime[7]; /* values for first 7 date/time items */
|
|
//short wModulos[3] = {23, 59, 59 }; /* highest value for hour, minute, second */
|
|
short wPrevDateTime[7]; /* only repaint fields if nec */
|
|
|
|
|
|
//==========================================================================
|
|
// Local Function Prototypes
|
|
//==========================================================================
|
|
|
|
BOOL RootPath (LPTSTR lpchFile, LPTSTR lppath);
|
|
int AlertBox (HWND hwndParent,
|
|
LPTSTR pszCaption,
|
|
LPTSTR pszText1,
|
|
LPTSTR pszText2,
|
|
unsigned style);
|
|
|
|
/* ** Post a message box */
|
|
int AlertBox (hwndParent, pszCaption, pszText1, pszText2, style)
|
|
HWND hwndParent;
|
|
LPTSTR pszCaption;
|
|
LPTSTR pszText1;
|
|
LPTSTR pszText2;
|
|
unsigned style;
|
|
{
|
|
TCHAR szMessage[256];
|
|
|
|
wsprintf (szMessage, pszText1, pszText2);
|
|
|
|
return MessageBox (hwndParent, szMessage, pszCaption, style);
|
|
}
|
|
|
|
int myatoi (LPTSTR pszInt)
|
|
{
|
|
int retval;
|
|
TCHAR cSave;
|
|
|
|
for (retval = 0; *pszInt; ++pszInt)
|
|
{
|
|
if ((cSave = (TCHAR) (*pszInt - TEXT('0'))) > (TCHAR) 9)
|
|
break;
|
|
retval = (int) (retval * 10 + (int)cSave);
|
|
}
|
|
return (retval);
|
|
}
|
|
|
|
|
|
void ErrMemDlg (HWND hParent)
|
|
{
|
|
MessageBox (hParent, szErrMem, szCtlPanel, MB_OK | MB_ICONHAND | MB_SYSTEMMODAL);
|
|
}
|
|
|
|
extern LPTIME_ZONE_INFORMATION SelectedTimeZone;
|
|
|
|
void GetDateTime (void)
|
|
{
|
|
SYSTEMTIME UniversalSystemTime;
|
|
SYSTEMTIME SystemTime;
|
|
|
|
GetSystemTime (&UniversalSystemTime);
|
|
|
|
if (!SystemTimeToTzSpecificLocalTime(SelectedTimeZone,
|
|
&UniversalSystemTime,
|
|
&SystemTime))
|
|
{
|
|
GetLocalTime (&SystemTime);
|
|
}
|
|
|
|
wDateTime[HOUR] = SystemTime.wHour;
|
|
wDateTime[MINUTE] = SystemTime.wMinute;
|
|
wDateTime[SECOND] = SystemTime.wSecond;
|
|
wDateTime[MONTH] = SystemTime.wMonth;
|
|
wDateTime[DAY] = SystemTime.wDay;
|
|
wDateTime[YEAR] = SystemTime.wYear;
|
|
wDateTime[WEEKDAY] = SystemTime.wDayOfWeek;
|
|
}
|
|
|
|
void GetTime (void)
|
|
{
|
|
SYSTEMTIME SystemTime;
|
|
|
|
GetLocalTime (&SystemTime);
|
|
|
|
wDateTime[HOUR] = SystemTime.wHour;
|
|
wDateTime[MINUTE] = SystemTime.wMinute;
|
|
wDateTime[SECOND] = SystemTime.wSecond;
|
|
}
|
|
|
|
void GetDate (void)
|
|
{
|
|
SYSTEMTIME SystemTime;
|
|
|
|
GetLocalTime (&SystemTime);
|
|
|
|
wDateTime[MONTH] = SystemTime.wMonth;
|
|
wDateTime[DAY] = SystemTime.wDay;
|
|
wDateTime[YEAR] = SystemTime.wYear;
|
|
wDateTime[WEEKDAY] = SystemTime.wDayOfWeek;
|
|
}
|
|
|
|
void SetDateTime (void)
|
|
{
|
|
SetTime ();
|
|
}
|
|
|
|
void SetTime (void)
|
|
{
|
|
SYSTEMTIME SystemTime;
|
|
SYSTEMTIME UniversalSystemTime;
|
|
|
|
SystemTime.wHour = wDateTime[HOUR];
|
|
SystemTime.wMinute = wDateTime[MINUTE];
|
|
SystemTime.wSecond = wDateTime[SECOND];
|
|
|
|
SystemTime.wMilliseconds = 0;
|
|
|
|
SystemTime.wMonth = wDateTime[MONTH];
|
|
SystemTime.wDay = wDateTime[DAY];
|
|
SystemTime.wYear = wDateTime[YEAR];
|
|
|
|
SetLocalTime (&SystemTime);
|
|
}
|
|
|
|
void SetDate ()
|
|
{
|
|
SetTime ();
|
|
}
|
|
|
|
int GetSection(LPTSTR lpFile, LPTSTR lpSection, LPHANDLE hSection, LPINT pSize)
|
|
{
|
|
ULONG nCount;
|
|
ULONG nSize;
|
|
HANDLE hLocal, hTemp;
|
|
TCHAR *pszSect;
|
|
|
|
if (!(hLocal = AllocMem(nSize = 4096)))
|
|
return (0);
|
|
|
|
/* Now that a buffer exists, Enumerate all LHS of the section. If the
|
|
* buffer overflows, reallocate it and try again.
|
|
*/
|
|
do
|
|
{
|
|
pszSect = (TCHAR *) hLocal;
|
|
if (!lpFile)
|
|
nCount = GetProfileString (lpSection, NULL, szNull, pszSect, nSize/sizeof(TCHAR));
|
|
else
|
|
nCount = GetPrivateProfileString (lpSection, NULL, szNull, pszSect,
|
|
nSize/sizeof(TCHAR), lpFile);
|
|
if (nCount != (nSize/sizeof(TCHAR))-2)
|
|
break;
|
|
|
|
if (!(hLocal = ReallocMem(hTemp=hLocal, nSize, nSize+2048)))
|
|
{
|
|
FreeMem (hTemp, nSize+2048);
|
|
return(0);
|
|
}
|
|
nSize += 2048;
|
|
|
|
} while (1) ;
|
|
|
|
*hSection = hLocal;
|
|
*pSize = nSize;
|
|
return(nCount);
|
|
}
|
|
|
|
|
|
HANDLE StringToLocalHandle (LPTSTR lpStr)
|
|
{
|
|
HANDLE hStr;
|
|
LPTSTR pStr;
|
|
|
|
if (!(hStr = LocalAlloc (LMEM_MOVEABLE, ByteCountOf(lstrlen (lpStr)+1))))
|
|
return (NULL);
|
|
|
|
if (!(pStr = LocalLock (hStr)))
|
|
{
|
|
LocalFree (hStr);
|
|
return (NULL);
|
|
}
|
|
lstrcpy (pStr, lpStr);
|
|
LocalUnlock (hStr);
|
|
return (hStr);
|
|
}
|
|
|
|
HANDLE FindRHSIni (LPTSTR pFile, LPTSTR pSection, LPTSTR pRHS)
|
|
{
|
|
HANDLE hSection;
|
|
HANDLE hSide = NULL;
|
|
TCHAR szRoot[MAX_RHS];
|
|
TCHAR *pszSect;
|
|
int nSize;
|
|
|
|
if (!pRHS || !(*pRHS) || !(GetSection (pFile, pSection, &hSection, &nSize)))
|
|
goto Error1;
|
|
|
|
pszSect = hSection; /* not tested because GetSection did */
|
|
|
|
while (*pszSect) /* while not eolist */
|
|
{
|
|
/* Must get the RHS for every LHS. If it matches, copy LHS into buffer. */
|
|
GetPrivateProfileString (pSection, pszSect, szNull, szRoot,
|
|
CharSizeOf(szRoot), pFile);
|
|
if (!(_tcsicmp (szRoot, pRHS)))
|
|
{
|
|
hSide = StringToLocalHandle (pszSect);
|
|
break;
|
|
}
|
|
pszSect += lstrlen (pszSect) + 1; /* advance to next LHS */
|
|
}
|
|
|
|
FreeMem (hSection, nSize);
|
|
Error1:
|
|
return (hSide);
|
|
}
|
|
|
|
LPTSTR BackslashTerm (LPTSTR pszPath)
|
|
{
|
|
LPTSTR pszEnd;
|
|
|
|
pszEnd = pszPath + lstrlen (pszPath);
|
|
/* Get the end of the source directory */
|
|
|
|
switch (*CharPrev (pszPath, pszEnd))
|
|
{
|
|
case TEXT('\\'):
|
|
case TEXT(':'):
|
|
break;
|
|
|
|
default:
|
|
*pszEnd++ = TEXT('\\');
|
|
*pszEnd = TEXT('\0');
|
|
}
|
|
return (pszEnd);
|
|
}
|
|
|
|
/* Copy file from one directory to another. */
|
|
int Copy (HWND hParent, TCHAR *szSrcFile, TCHAR *szDestFile)
|
|
{
|
|
TCHAR szSrcPath[PATHMAX],szDestPath[PATHMAX];
|
|
OFSTRUCT ofstruct;
|
|
int fhW, fhR;
|
|
long cch;
|
|
TCHAR szErrMsg[128];
|
|
BOOL bErrMem = FALSE;
|
|
FILETIME CreationTime;
|
|
FILETIME LastAccessTime;
|
|
FILETIME LastWriteTime;
|
|
TCHAR szStr[PATHMAX];
|
|
|
|
|
|
/* get the real pathnames here */
|
|
if (!RootPath (szSrcFile, szSrcPath)
|
|
|| !RootPath (szDestFile, szDestPath))
|
|
return (COPY_DRIVEOPEN); /* curdir drive door open; already hit abort */
|
|
|
|
if ((fhR = LZOpenFile (szSrcPath, &ofstruct, OF_READ)) != -1)
|
|
{
|
|
/* check for illegal copy move */
|
|
|
|
#ifdef UNICODE
|
|
MultiByteToWideChar (CP_OEMCP, MB_PRECOMPOSED, ofstruct.szPathName, -1, szStr, PATHMAX);
|
|
#else
|
|
lstrcpy (szStr, ofstruct.szPathName);
|
|
#endif
|
|
if (_tcsicmp (szStr, szDestPath) == 0)
|
|
{
|
|
LZClose (fhR);
|
|
return (COPY_SELF);
|
|
}
|
|
|
|
if ((fhW = LZOpenFile (szDestPath, &ofstruct, OF_CREATE | OF_WRITE )) != -1)
|
|
{
|
|
cch = LZCopy (fhR, fhW); /* LZCopy handles DOS opened files */
|
|
LZClose (fhW);
|
|
LZClose (fhR);
|
|
if (cch >= 0)
|
|
{
|
|
HANDLE fhR, fhW;
|
|
|
|
fhR = MyOpenFile (szSrcPath, NULL, OF_READ);
|
|
fhW = MyOpenFile (szDestPath, NULL, OF_READ);
|
|
|
|
GetFileTime (fhR, &CreationTime, &LastAccessTime,
|
|
&LastWriteTime);
|
|
SetFileTime (fhW, &CreationTime, &LastAccessTime,
|
|
&LastWriteTime);
|
|
|
|
MyCloseFile (fhW);
|
|
MyCloseFile (fhR);
|
|
}
|
|
else
|
|
{
|
|
// cch -= LZERROR_BADINHANDLE;
|
|
return (cch);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LZClose (fhR);
|
|
bErrMem = !LoadString (hModule, ERRORS + 13, szErrMsg, CharSizeOf(szErrMsg));
|
|
CharUpper (szDestPath);
|
|
if (bErrMem)
|
|
ErrMemDlg (hParent);
|
|
else
|
|
AlertBox (hParent, szCtlPanel, szErrMsg, szDestPath, MB_OK | MB_ICONEXCLAMATION);
|
|
return (COPY_NOCREATE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* system already threw up a "insert foo in drive a:" msg box */
|
|
return (COPY_CANCEL);
|
|
}
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
BOOL RootPath (lpchFile, lppath)
|
|
LPTSTR lpchFile; /* starting path/filename */
|
|
LPTSTR lppath; /* buffer to fill with fuller pathname */
|
|
{
|
|
|
|
if (MyOpenFile (lpchFile, lppath, OF_PARSE) != INVALID_HANDLE_VALUE)
|
|
return (TRUE);
|
|
else
|
|
return (FALSE);
|
|
}
|
|
|
|
|
|
|