windows-nt/Source/XPSP1/NT/printscan/fax/service/faxroute/util.cpp
2020-09-26 16:20:57 +08:00

237 lines
4 KiB
C++

#include "faxrtp.h"
#pragma hdrstop
typedef struct _STRING_TABLE {
DWORD ResourceId;
DWORD InternalId;
LPCTSTR String;
} STRING_TABLE, *PSTRING_TABLE;
static STRING_TABLE StringTable[] =
{
{ IDS_NO_MAPI_LOGON, IDS_NO_MAPI_LOGON, NULL },
{ IDS_SERVICE_NAME, IDS_SERVICE_NAME, NULL },
{ IDS_DEFAULT, IDS_DEFAULT, NULL }
};
#define CountStringTable (sizeof(StringTable)/sizeof(STRING_TABLE))
LPTSTR
GetLastErrorText(
DWORD ErrorCode
)
/*++
Routine Description:
Gets a string for a given WIN32 error code.
Arguments:
ErrorCode - WIN32 error code.
Return Value:
Pointer to a string representing the ErrorCode.
--*/
{
static TCHAR ErrorBuf[256];
DWORD Count;
Count = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
NULL,
ErrorCode,
LANG_NEUTRAL,
ErrorBuf,
sizeof(ErrorBuf),
NULL
);
if (Count) {
if (ErrorBuf[Count-1] == TEXT('\n')) {
ErrorBuf[Count-1] = 0;
}
if ((Count>1) && (ErrorBuf[Count-2] == TEXT('\r'))) {
ErrorBuf[Count-2] = 0;
}
}
return ErrorBuf;
}
VOID
InitializeStringTable(
VOID
)
{
DWORD i;
HINSTANCE hInstance;
TCHAR Buffer[256];
hInstance = GetModuleHandle(NULL);
for (i=0; i<CountStringTable; i++) {
if (LoadString(
hInstance,
StringTable[i].ResourceId,
Buffer,
sizeof(Buffer)/sizeof(TCHAR)
)) {
StringTable[i].String = (LPCTSTR) MemAlloc( StringSize( Buffer ) );
if (!StringTable[i].String) {
StringTable[i].String = TEXT("");
} else {
_tcscpy( (LPTSTR)StringTable[i].String, Buffer );
}
} else {
StringTable[i].String = TEXT("");
}
}
}
LPCTSTR
GetString(
DWORD InternalId
)
/*++
Routine Description:
Loads a resource string and returns a pointer to the string.
The caller must free the memory.
Arguments:
ResourceId - resource string id
Return Value:
pointer to the string
--*/
{
DWORD i;
for (i=0; i<CountStringTable; i++) {
if (StringTable[i].InternalId == InternalId) {
return StringTable[i].String;
}
}
return NULL;
}
DWORD
MessageBoxThread(
IN PMESSAGEBOX_DATA MsgBox
)
{
DWORD Answer = (DWORD) MessageBox(
NULL,
MsgBox->Text,
GetString( IDS_SERVICE_NAME ),
MsgBox->Type | MB_SERVICE_NOTIFICATION
);
if (MsgBox->Response) {
*MsgBox->Response = Answer;
}
MemFree( (LPBYTE) MsgBox->Text );
MemFree( MsgBox );
return 0;
}
BOOL
ServiceMessageBox(
IN LPCTSTR MsgString,
IN DWORD Type,
IN BOOL UseThread,
IN LPDWORD Response,
IN ...
)
{
#define BUFSIZE 1024
PMESSAGEBOX_DATA MsgBox;
DWORD ThreadId;
HANDLE hThread;
DWORD Answer;
LPTSTR buf;
va_list arg_ptr;
buf = (LPTSTR) MemAlloc( BUFSIZE );
if (!buf) {
return FALSE;
}
va_start( arg_ptr, Response );
_vsntprintf( buf, BUFSIZE, MsgString, arg_ptr );
va_end( arg_ptr );
if (UseThread) {
MsgBox = (PMESSAGEBOX_DATA) MemAlloc( sizeof(MESSAGEBOX_DATA) );
if (!MsgBox) {
return FALSE;
}
MsgBox->Text = buf;
MsgBox->Response = Response;
MsgBox->Type = Type;
hThread = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE) MessageBoxThread,
(LPVOID) MsgBox,
0,
&ThreadId
);
if (!hThread) {
return FALSE;
}
return TRUE;
}
Answer = MessageBox(
NULL,
buf,
GetString( IDS_SERVICE_NAME ),
Type | MB_SERVICE_NOTIFICATION
);
if (Response) {
*Response = Answer;
}
MemFree( buf );
return TRUE;
}