|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
util.cpp
Abstract:
This module contains utility routines for the fax transport provider.
Author:
Wesley Witt (wesw) 13-Aug-1996
--*/
#include "faxext.h"
#include "debugex.h"
//
// globals
//
BOOL oleInitialized;
LPVOID MapiMemAlloc( SIZE_T Size )
/*++
Routine Description:
Memory allocator.
Arguments:
Size - Number of bytes to allocate.
Return Value:
Pointer to the allocated memory or NULL for failure.
--*/
{ LPVOID ptr=NULL; HRESULT hResult;
// [Win64bug] MAPIAllocateBuffer should accpet size_t as allocating size
hResult = MAPIAllocateBuffer( DWORD(Size), &ptr ); if (S_OK == hResult) { ZeroMemory( ptr, Size ); }
return ptr; }
LPVOID MapiMemReAlloc( LPVOID ptr, SIZE_T Size )
/*++
Routine Description:
Memory re-allocator.
Arguments:
ptr - pointer to pre allocated buffer
Size - Number of bytes to allocate.
Return Value:
Pointer to the allocated memory or NULL for failure.
--*/
{ LPVOID NewPtr = NULL; HRESULT hResult;
// [Win64bug] MAPIAllocateBuffer should accpet size_t as allocating size
hResult = MAPIAllocateMore(DWORD(Size), ptr ,&NewPtr); if (S_OK == hResult) { ZeroMemory( NewPtr, Size ); } return NewPtr; }
VOID MapiMemFree( LPVOID ptr )
/*++
Routine Description:
Memory de-allocator.
Arguments:
ptr - Pointer to the memory block.
Return Value:
None.
--*/
{ if (ptr) { MAPIFreeBuffer( ptr ); } }
PVOID MyGetPrinter( LPTSTR PrinterName, DWORD level )
/*++
Routine Description:
Wrapper function for GetPrinter spooler API
Arguments:
hPrinter - Identifies the printer in question level - Specifies the level of PRINTER_INFO_x structure requested
Return Value:
Pointer to a PRINTER_INFO_x structure, NULL if there is an error
--*/
{ HANDLE hPrinter; PBYTE pPrinterInfo = NULL; DWORD cbNeeded; PRINTER_DEFAULTS PrinterDefaults;
PrinterDefaults.pDatatype = NULL; PrinterDefaults.pDevMode = NULL; PrinterDefaults.DesiredAccess = PRINTER_READ; //PRINTER_ALL_ACCESS;
if (!OpenPrinter( PrinterName, &hPrinter, &PrinterDefaults )) { return NULL; }
if (!GetPrinter( hPrinter, level, NULL, 0, &cbNeeded ) && GetLastError() == ERROR_INSUFFICIENT_BUFFER && (pPrinterInfo = (PBYTE) MemAlloc( cbNeeded )) && GetPrinter( hPrinter, level, pPrinterInfo, cbNeeded, &cbNeeded )) { ClosePrinter( hPrinter ); return pPrinterInfo; }
ClosePrinter( hPrinter ); MemFree( pPrinterInfo ); return NULL; }
LPTSTR RemoveLastNode( LPTSTR Path )
/*++
Routine Description:
Removes the last node from a path string.
Arguments:
Path - Path string.
Return Value:
Pointer to the path string.
--*/
{ LPTSTR Pstr = NULL;
if (Path == NULL || Path[0] == 0) { return Path; }
Pstr = _tcsrchr(Path,TEXT('\\')); if( Pstr && (*_tcsinc(Pstr)) == '\0' ) { // the last character is a backslash, truncate it...
_tcsset(Pstr,TEXT('\0')); Pstr = _tcsdec(Path,Pstr); }
Pstr = _tcsrchr(Path,TEXT('\\')); if( Pstr ) { _tcsnset(_tcsinc(Pstr),TEXT('\0'),1); }
return Path; }
void ErrorMsgBox( HINSTANCE hInstance, HWND hWnd, DWORD dwMsgId ) /*++
Routine Description:
Display error message box
Arguments:
hInstance - [in] resource instance handle hWnd - [in] window handle dwMsgId - [in] string resource ID
Return Value:
none
--*/ { TCHAR* ptCaption=NULL; TCHAR tszCaption[MAX_PATH]; TCHAR tszMessage[MAX_PATH];
DBG_ENTER(TEXT("ErrorMsgBox"));
if(!LoadString( hInstance, IDS_FAX_EXT_MESSAGE, tszCaption, sizeof(tszCaption)/sizeof(TCHAR))) { CALL_FAIL(GENERAL_ERR, TEXT("LoadString"), ::GetLastError()); } else { ptCaption = tszCaption; }
if(!LoadString( hInstance, dwMsgId, tszMessage, sizeof(tszMessage)/sizeof(TCHAR))) { CALL_FAIL(GENERAL_ERR, TEXT("LoadString"), ::GetLastError()); Assert(FALSE); return; }
MessageBeep(MB_ICONEXCLAMATION); AlignedMessageBox(hWnd, tszMessage, ptCaption, MB_OK | MB_ICONERROR); }
|