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.
277 lines
4.5 KiB
277 lines
4.5 KiB
/*++
|
|
|
|
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);
|
|
}
|