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.
367 lines
8.9 KiB
367 lines
8.9 KiB
/** FILE: util.c *********** Module Header ********************************
|
|
*
|
|
* Ports applet utility library routines. This file contains string,
|
|
* cursor, SendWinIniChange() 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
|
|
* 15:30 on Thur 03 May 1994 -by- Steve Cathcart [stevecat]
|
|
* Increased MyMessageBox buffers, Restart dialog changes
|
|
* 17:00 on Mon 18 Sep 1995 -by- Steve Cathcart [stevecat]
|
|
* Changes for product update - SUR release NT v4.0
|
|
* Nov 1997 -by- Doron Holan [stevecat]
|
|
* Removed obsolete cpl code
|
|
*
|
|
* Copyright (C) 1990-1995 Microsoft Corporation
|
|
*
|
|
*************************************************************************/
|
|
/* Notes -
|
|
|
|
Global Functions:
|
|
|
|
U T I L I T Y
|
|
|
|
BackslashTerm () - add backslash char to path
|
|
ErrMemDlg () - display Memory Error message box
|
|
MyAtoi () - To convert from Unicode to ANSI string before calling atoi
|
|
myatoi () - local implementation of atoi for Unicode strings
|
|
MyItoa () - To convert from ANSI to Unicode string after calling itoa
|
|
MyMessageBox () - display message to user, with parameters
|
|
MyUltoa () - To convert from Unicode to ANSI string before calling ultoa
|
|
SendWinIniChange () - broadcast system change message via USER
|
|
strscan () - Find a string within another string
|
|
StripBlanks () - Strip leading and trailing blanks from a string
|
|
|
|
|
|
Local Functions:
|
|
|
|
*/
|
|
|
|
//==========================================================================
|
|
// Include files
|
|
//==========================================================================
|
|
|
|
// C Runtime
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
|
|
// Application specific
|
|
#include "cyyports.h"
|
|
|
|
|
|
#define INT_SIZE_LENGTH 20
|
|
#define LONG_SIZE_LENGTH 40
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
void
|
|
ErrMemDlg(HWND hParent)
|
|
{
|
|
MessageBox(hParent, g_szErrMem, g_szPortsApplet,
|
|
MB_OK | MB_ICONHAND | MB_SYSTEMMODAL );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// MyAtoi
|
|
//
|
|
// Desc: To convert from Unicode to ANSI string before
|
|
// calling CRT atoi and atol functions.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
int
|
|
MyAtoi(LPTSTR string)
|
|
{
|
|
CHAR szAnsi[ INT_SIZE_LENGTH ];
|
|
BOOL fDefCharUsed;
|
|
|
|
#ifdef UNICODE
|
|
WideCharToMultiByte(CP_ACP, 0, string, INT_SIZE_LENGTH,
|
|
szAnsi, INT_SIZE_LENGTH, NULL, &fDefCharUsed);
|
|
|
|
return atoi(szAnsi);
|
|
#else
|
|
return atoi(string);
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
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);
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// MyItoa
|
|
//
|
|
// Desc: To convert from ANSI to Unicode string after calling
|
|
// CRT itoa function.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
LPTSTR
|
|
MyItoa(INT value, LPTSTR string, INT radix)
|
|
{
|
|
CHAR szAnsi[INT_SIZE_LENGTH];
|
|
|
|
#ifdef UNICODE
|
|
|
|
_itoa(value, szAnsi, radix);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szAnsi, -1,
|
|
string, INT_SIZE_LENGTH );
|
|
#else
|
|
|
|
_itoa(value, string, radix);
|
|
|
|
#endif
|
|
|
|
return (string);
|
|
|
|
} // end of MyItoa()
|
|
|
|
|
|
LPTSTR
|
|
MyUltoa(unsigned long value,
|
|
LPTSTR string,
|
|
INT radix)
|
|
{
|
|
CHAR szAnsi[ LONG_SIZE_LENGTH ];
|
|
|
|
#ifdef UNICODE
|
|
|
|
_ultoa(value, szAnsi, radix);
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szAnsi, -1,
|
|
string, LONG_SIZE_LENGTH );
|
|
#else
|
|
|
|
_ultoa(value, string, radix);
|
|
|
|
#endif
|
|
|
|
return( string );
|
|
|
|
} // end of MyUltoa()
|
|
|
|
|
|
int
|
|
MyMessageBox(HWND hWnd,
|
|
DWORD wText,
|
|
DWORD wCaption,
|
|
DWORD wType,
|
|
...)
|
|
{
|
|
TCHAR szText[4 * PATHMAX],
|
|
szCaption[2 * PATHMAX];
|
|
int ival;
|
|
va_list parg;
|
|
|
|
va_start(parg, wType);
|
|
|
|
if (wText == INITS)
|
|
goto NoMem;
|
|
|
|
if (!LoadString(g_hInst, wText, szCaption, CharSizeOf(szCaption)))
|
|
goto NoMem;
|
|
|
|
wvsprintf(szText, szCaption, parg);
|
|
|
|
if (!LoadString(g_hInst, wCaption, szCaption, CharSizeOf(szCaption)))
|
|
goto NoMem;
|
|
|
|
if ((ival = MessageBox(hWnd, szText, szCaption, wType)) == 0)
|
|
goto NoMem;
|
|
|
|
va_end(parg);
|
|
|
|
return ival;
|
|
|
|
NoMem:
|
|
va_end(parg);
|
|
ErrMemDlg(hWnd);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
MyMessageBoxWithErr(
|
|
HWND hWnd,
|
|
DWORD wText,
|
|
DWORD wCaption,
|
|
DWORD wType,
|
|
DWORD wError
|
|
)
|
|
{
|
|
int ival;
|
|
LPVOID lpMessageBuffer;
|
|
|
|
FormatMessage(
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
|
NULL,
|
|
wError,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
(LPTSTR) &lpMessageBuffer,
|
|
0,
|
|
NULL );
|
|
|
|
ival = MyMessageBox(hWnd,wText,wCaption,wType,lpMessageBuffer);
|
|
|
|
LocalFree( lpMessageBuffer ); // Free the buffer allocated by the system
|
|
|
|
return ival;
|
|
}
|
|
|
|
void
|
|
SendWinIniChange(LPTSTR lpSection)
|
|
{
|
|
// NOTE: We have (are) gone through several iterations of which USER
|
|
// api is the correct one to use. The main problem for the Control
|
|
// Panel is to avoid being HUNG if another app (top-level window)
|
|
// is HUNG. Another problem is that we pass a pointer to a message
|
|
// string in our address space. SendMessage will 'thunk' this properly
|
|
// for each window, but PostMessage and SendNotifyMessage will not.
|
|
// That finally brings us to try to use SendMessageTimeout(). 9/21/92
|
|
//
|
|
// Try SendNotifyMessage in build 260 or later - kills earlier builds
|
|
// SendNotifyMessage ((HWND)-1, WM_WININICHANGE, 0L, (LONG)lpSection);
|
|
// PostMessage ((HWND)-1, WM_WININICHANGE, 0L, (LONG)lpSection);
|
|
// [stevecat] 4/4/92
|
|
//
|
|
// SendMessage ((HWND)-1, WM_WININICHANGE, 0L, (LPARAM)lpSection);
|
|
//
|
|
// NOTE: The final parameter (LPDWORD lpdwResult) must be NULL
|
|
|
|
SendMessageTimeout((HWND)-1,
|
|
WM_WININICHANGE,
|
|
0L,
|
|
(WPARAM) lpSection,
|
|
SMTO_ABORTIFHUNG,
|
|
1000,
|
|
NULL);
|
|
}
|
|
|
|
LPTSTR
|
|
strscan(LPTSTR pszString,
|
|
LPTSTR pszTarget)
|
|
{
|
|
LPTSTR psz;
|
|
|
|
if (psz = _tcsstr( pszString, pszTarget))
|
|
return (psz);
|
|
else
|
|
return (pszString + lstrlen(pszString));
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// StripBlanks()
|
|
//
|
|
// Strips leading and trailing blanks from a string.
|
|
// Alters the memory where the string sits.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
void
|
|
StripBlanks(LPTSTR pszString)
|
|
{
|
|
LPTSTR pszPosn;
|
|
|
|
//
|
|
// strip leading blanks
|
|
//
|
|
|
|
pszPosn = pszString;
|
|
|
|
while (*pszPosn == TEXT(' '))
|
|
pszPosn++;
|
|
|
|
if (pszPosn != pszString)
|
|
lstrcpy(pszString, pszPosn);
|
|
|
|
//
|
|
// strip trailing blanks
|
|
//
|
|
|
|
if ((pszPosn = pszString + lstrlen(pszString)) != pszString) {
|
|
pszPosn = CharPrev(pszString, pszPosn);
|
|
|
|
while (*pszPosn == TEXT(' '))
|
|
pszPosn = CharPrev(pszString, pszPosn);
|
|
|
|
pszPosn = CharNext(pszPosn);
|
|
|
|
*pszPosn = TEXT('\0');
|
|
}
|
|
}
|
|
|
|
BOOL ReadRegistryByte(HKEY hKey,
|
|
PTCHAR valueName,
|
|
PBYTE regData)
|
|
{
|
|
DWORD regDataType = 0;
|
|
DWORD regDataSize = 0;
|
|
|
|
regDataSize = sizeof(*regData);
|
|
if ((ERROR_SUCCESS != RegQueryValueEx(hKey,
|
|
valueName,
|
|
NULL,
|
|
®DataType,
|
|
regData,
|
|
®DataSize))
|
|
|| (regDataSize != sizeof(BYTE))
|
|
|| (regDataType != REG_BINARY))
|
|
{
|
|
//
|
|
// Read was unsuccessful or not a binary value, regData is not set
|
|
//
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Read was a success, regData contains the value read in
|
|
//
|
|
return TRUE;
|
|
}
|
|
|