529 lines
14 KiB
C
529 lines
14 KiB
C
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
faxsvc.c
|
|
|
|
Abstract:
|
|
|
|
This module contains the windows code for the
|
|
FAX service debug window.
|
|
|
|
Author:
|
|
|
|
Wesley Witt (wesw) 28-Feb-1996
|
|
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "faxsvc.h"
|
|
#pragma hdrstop
|
|
|
|
#include "resource.h"
|
|
|
|
|
|
HWND hwndSvcMain;
|
|
HWND hwndEdit;
|
|
HWND hwndListMsg;
|
|
HWND hwndListLines;
|
|
HWND hwndListState;
|
|
DWORD EditHeight;
|
|
DWORD ListMsgHeight;
|
|
DWORD ListLinesHeight;
|
|
DWORD ListStateHeight;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DWORD
|
|
DebugServiceWindowThread(
|
|
HANDLE hEvent
|
|
);
|
|
|
|
LRESULT
|
|
WndProc(
|
|
HWND hwnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
);
|
|
|
|
|
|
int
|
|
DebugService(
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Starts the service in debug mode. In this mode the FAX service
|
|
runs as a regular WIN32 process. This is implemented as an aid
|
|
to debugging the service.
|
|
|
|
Arguments:
|
|
|
|
argc - argument count
|
|
argv - argument array
|
|
|
|
Return Value:
|
|
|
|
Return code. Return zero for success, all other
|
|
values indicate errors.
|
|
|
|
--*/
|
|
|
|
{
|
|
LONG Rslt;
|
|
HANDLE WaitHandles[2];
|
|
|
|
|
|
ServiceDebug = TRUE;
|
|
ConsoleDebugOutput = TRUE;
|
|
|
|
WaitHandles[1] = CreateEvent( NULL, FALSE, FALSE, NULL );
|
|
|
|
WaitHandles[0] = CreateThread(
|
|
NULL,
|
|
0,
|
|
(LPTHREAD_START_ROUTINE) DebugServiceWindowThread,
|
|
WaitHandles[1],
|
|
0,
|
|
&Rslt
|
|
);
|
|
|
|
if (!WaitHandles[0]) {
|
|
return GetLastError();
|
|
}
|
|
|
|
if (WaitForMultipleObjects( 2, WaitHandles, FALSE, INFINITE ) == WAIT_OBJECT_0) {
|
|
//
|
|
// the window initialization did not complete successfuly
|
|
//
|
|
GetExitCodeThread( WaitHandles[0], &Rslt );
|
|
return Rslt;
|
|
}
|
|
|
|
return ServiceStart();
|
|
}
|
|
|
|
|
|
DWORD
|
|
DebugServiceWindowThread(
|
|
HANDLE hEvent
|
|
)
|
|
{
|
|
WNDCLASS wndclass;
|
|
MSG msg;
|
|
HINSTANCE hInstance;
|
|
|
|
|
|
hInstance = GetModuleHandle( NULL );
|
|
|
|
wndclass.style = CS_HREDRAW | CS_VREDRAW;
|
|
wndclass.lpfnWndProc = (WNDPROC) WndProc;
|
|
wndclass.cbClsExtra = 0;
|
|
wndclass.cbWndExtra = 0;
|
|
wndclass.hInstance = hInstance;
|
|
wndclass.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_APPICON) );
|
|
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
|
|
wndclass.hbrBackground = (HBRUSH) (COLOR_3DFACE + 1);
|
|
wndclass.lpszMenuName = NULL;
|
|
wndclass.lpszClassName = TEXT("FaxService");
|
|
|
|
RegisterClass( &wndclass );
|
|
|
|
hwndSvcMain = CreateWindow (
|
|
TEXT("FaxService"), // window class name
|
|
TEXT("Fax Service"), // window caption
|
|
WS_OVERLAPPEDWINDOW, // window style
|
|
CW_USEDEFAULT, // initial x position
|
|
CW_USEDEFAULT, // initial y position
|
|
CW_USEDEFAULT, // initial x size
|
|
CW_USEDEFAULT, // initial y size
|
|
NULL, // parent window handle
|
|
NULL, // window menu handle
|
|
hInstance, // program instance handle
|
|
NULL // creation parameters
|
|
);
|
|
|
|
if (!hwndSvcMain) {
|
|
return 0;
|
|
}
|
|
|
|
ShowWindow( hwndSvcMain, SW_SHOWNORMAL );
|
|
UpdateWindow (hwndSvcMain) ;
|
|
|
|
SetEvent( hEvent );
|
|
|
|
while (GetMessage (&msg, NULL, 0, 0)) {
|
|
TranslateMessage (&msg) ;
|
|
DispatchMessage (&msg) ;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
VOID
|
|
ConsoleDebugPrint(
|
|
LPTSTR buf
|
|
)
|
|
{
|
|
static WPARAM cxExtent = 0;
|
|
static DWORD MsgCount = 0;
|
|
SIZE size;
|
|
HDC hdc;
|
|
HFONT hFont;
|
|
|
|
|
|
if (!ConsoleDebugOutput) {
|
|
return;
|
|
}
|
|
|
|
SendMessage( hwndListMsg, LB_ADDSTRING, 0, (LPARAM) buf );
|
|
SendMessage( hwndListMsg, LB_SETCURSEL, MsgCount, 0 );
|
|
|
|
MsgCount += 1;
|
|
|
|
hdc = GetDC( hwndListMsg );
|
|
hFont = (HFONT)SendMessage( hwndListMsg, WM_GETFONT, 0, 0 );
|
|
if (hFont != NULL) {
|
|
SelectObject( hdc, hFont );
|
|
}
|
|
GetTextExtentPoint( hdc, buf, _tcslen(buf), &size );
|
|
if (size.cx > (LONG)cxExtent) {
|
|
cxExtent = size.cx;
|
|
}
|
|
ReleaseDC( hwndListMsg, hdc );
|
|
|
|
SendMessage( hwndListMsg, LB_SETHORIZONTALEXTENT, cxExtent, 0 );
|
|
}
|
|
|
|
|
|
void
|
|
lbprintf(
|
|
HWND hwndList,
|
|
LPTSTR Format,
|
|
...
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Prints a debug string
|
|
|
|
Arguments:
|
|
|
|
format - printf() format string
|
|
... - Variable data
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
TCHAR buf[1024];
|
|
va_list arg_ptr;
|
|
va_start(arg_ptr, Format);
|
|
_vsntprintf(buf, sizeof(buf), Format, arg_ptr);
|
|
va_end(arg_ptr);
|
|
SendMessage( hwndList, LB_ADDSTRING, 0, (LPARAM) buf );
|
|
}
|
|
|
|
|
|
LRESULT
|
|
WndProc(
|
|
HWND hwnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Window procedure for the TIFF image viewer main window.
|
|
|
|
Arguments:
|
|
|
|
hwnd - Window handle
|
|
message - message identifier
|
|
wParam - Parameter
|
|
lParam - Parameter
|
|
|
|
Return Value:
|
|
|
|
Return result, zero for success.
|
|
|
|
--*/
|
|
|
|
{
|
|
RECT Rect;
|
|
HDC hDC;
|
|
TEXTMETRIC tm;
|
|
HFONT hFont;
|
|
DWORD Height;
|
|
TCHAR CmdBuf[128];
|
|
DWORD i;
|
|
|
|
|
|
switch (message) {
|
|
case WM_CREATE:
|
|
|
|
GetClientRect( hwnd, &Rect );
|
|
|
|
hFont = GetStockObject( SYSTEM_FIXED_FONT );
|
|
SendMessage( hwnd, WM_SETFONT, (WPARAM)hFont, (LPARAM)FALSE );
|
|
|
|
hDC = GetDC( hwnd );
|
|
GetTextMetrics( hDC, &tm );
|
|
ReleaseDC( hwnd, hDC );
|
|
|
|
EditHeight = (DWORD)(tm.tmHeight * 1.5);
|
|
Height = (Rect.bottom - Rect.top) - EditHeight;
|
|
ListMsgHeight = (DWORD) (Height * .40);
|
|
ListLinesHeight = (DWORD) (Height * .60);
|
|
ListStateHeight = (DWORD) (Height * .60);
|
|
|
|
hwndEdit = CreateWindowEx(
|
|
WS_EX_CLIENTEDGE,
|
|
TEXT("EDIT"),
|
|
NULL,
|
|
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_LEFT | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL,
|
|
Rect.left,
|
|
Rect.bottom - EditHeight,
|
|
Rect.right - Rect.left,
|
|
EditHeight,
|
|
hwnd,
|
|
NULL,
|
|
GetModuleHandle(NULL),
|
|
NULL
|
|
);
|
|
|
|
SendMessage( hwndEdit, EM_LIMITTEXT, 128, 0 );
|
|
SendMessage( hwndEdit, WM_SETFONT, (WPARAM)hFont, (LPARAM)FALSE );
|
|
|
|
hwndListMsg = CreateWindowEx(
|
|
WS_EX_CLIENTEDGE,
|
|
TEXT("LISTBOX"),
|
|
NULL,
|
|
WS_VSCROLL |
|
|
WS_HSCROLL |
|
|
WS_CHILD |
|
|
WS_VISIBLE |
|
|
WS_BORDER |
|
|
LBS_NOTIFY |
|
|
LBS_NOINTEGRALHEIGHT |
|
|
LBS_WANTKEYBOARDINPUT,
|
|
Rect.left,
|
|
Rect.bottom - EditHeight - ListMsgHeight,
|
|
Rect.right - Rect.left,
|
|
ListMsgHeight,
|
|
hwnd,
|
|
NULL,
|
|
GetModuleHandle(NULL),
|
|
NULL
|
|
);
|
|
|
|
SendMessage( hwndListMsg, WM_SETFONT, (WPARAM)hFont, (LPARAM)FALSE );
|
|
|
|
hwndListLines = CreateWindowEx(
|
|
WS_EX_CLIENTEDGE,
|
|
TEXT("LISTBOX"),
|
|
NULL,
|
|
WS_VSCROLL |
|
|
WS_HSCROLL |
|
|
WS_CHILD |
|
|
WS_VISIBLE |
|
|
WS_BORDER |
|
|
LBS_NOTIFY |
|
|
LBS_NOINTEGRALHEIGHT |
|
|
LBS_WANTKEYBOARDINPUT,
|
|
Rect.left,
|
|
Rect.bottom - EditHeight - ListMsgHeight - ListLinesHeight,
|
|
(Rect.right - Rect.left) / 2,
|
|
ListLinesHeight,
|
|
hwnd,
|
|
NULL,
|
|
GetModuleHandle(NULL),
|
|
NULL
|
|
);
|
|
|
|
SendMessage( hwndListLines, WM_SETFONT, (WPARAM)hFont, (LPARAM)FALSE );
|
|
|
|
hwndListState = CreateWindowEx(
|
|
WS_EX_CLIENTEDGE,
|
|
TEXT("LISTBOX"),
|
|
NULL,
|
|
WS_VSCROLL |
|
|
WS_HSCROLL |
|
|
WS_CHILD |
|
|
WS_VISIBLE |
|
|
WS_BORDER |
|
|
LBS_NOTIFY |
|
|
LBS_NOINTEGRALHEIGHT |
|
|
LBS_WANTKEYBOARDINPUT,
|
|
Rect.left + ((Rect.right - Rect.left) / 2),
|
|
Rect.bottom - EditHeight - ListMsgHeight,
|
|
(Rect.right - Rect.left) / 2,
|
|
ListStateHeight,
|
|
hwnd,
|
|
NULL,
|
|
GetModuleHandle(NULL),
|
|
NULL
|
|
);
|
|
|
|
SendMessage( hwndListState, WM_SETFONT, (WPARAM)hFont, (LPARAM)FALSE );
|
|
|
|
SetFocus( hwndEdit );
|
|
|
|
return 0;
|
|
|
|
case WM_ACTIVATEAPP:
|
|
case WM_SETFOCUS:
|
|
SetFocus( hwndEdit );
|
|
return 0;
|
|
|
|
case WM_WINDOWPOSCHANGED:
|
|
GetClientRect( hwnd, &Rect );
|
|
|
|
Height = (Rect.bottom - Rect.top) - EditHeight;
|
|
ListMsgHeight = (DWORD) (Height * .40);
|
|
ListLinesHeight = (DWORD) (Height * .60);
|
|
ListStateHeight = (DWORD) (Height * .60);
|
|
|
|
MoveWindow(
|
|
hwndEdit,
|
|
Rect.left,
|
|
Rect.bottom - Rect.top - EditHeight,
|
|
Rect.right - Rect.left,
|
|
EditHeight,
|
|
TRUE
|
|
);
|
|
MoveWindow(
|
|
hwndListMsg,
|
|
Rect.left,
|
|
Rect.bottom - Rect.top - EditHeight - ListMsgHeight,
|
|
Rect.right - Rect.left,
|
|
ListMsgHeight,
|
|
TRUE
|
|
);
|
|
MoveWindow(
|
|
hwndListLines,
|
|
Rect.left,
|
|
Rect.bottom - Rect.top - EditHeight - ListMsgHeight - ListLinesHeight,
|
|
(Rect.right - Rect.left) / 2,
|
|
ListLinesHeight,
|
|
TRUE
|
|
);
|
|
MoveWindow(
|
|
hwndListState,
|
|
Rect.left + ((Rect.right - Rect.left) / 2),
|
|
Rect.bottom - Rect.top - EditHeight - ListMsgHeight - ListLinesHeight,
|
|
(Rect.right - Rect.left) / 2,
|
|
ListStateHeight,
|
|
TRUE
|
|
);
|
|
return 0;
|
|
|
|
case WM_COMMAND:
|
|
switch ( HIWORD(wParam) ) {
|
|
case EN_CHANGE:
|
|
GetWindowText( hwndEdit, CmdBuf, sizeof(CmdBuf) );
|
|
i = _tcslen(CmdBuf);
|
|
if (i && CmdBuf[i-1] == TEXT('\n')) {
|
|
SetWindowText( hwndEdit, TEXT("") );
|
|
CmdBuf[i-2] = 0;
|
|
ConsoleDebugPrint( CmdBuf );
|
|
switch( _totlower( CmdBuf[0] ) ) {
|
|
case TEXT('q'):
|
|
DestroyWindow( hwnd );
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case LBN_SELCHANGE:
|
|
if ((HWND)lParam == hwndListLines) {
|
|
extern PLINE_INFO TapiLines;
|
|
extern CRITICAL_SECTION CsLine;
|
|
|
|
print_line_state:
|
|
i = SendMessage( hwndListLines, LB_GETCURSEL, 0, 0 );
|
|
|
|
if (i != LB_ERR) {
|
|
|
|
SendMessage( hwndListState, WM_SETREDRAW, FALSE, 0 );
|
|
SendMessage( hwndListState, LB_RESETCONTENT, 0, 0 );
|
|
|
|
if (TapiLines[i].Provider) {
|
|
lbprintf( hwndListState, TEXT("Provider: %s"), TapiLines[i].Provider->ProviderName );
|
|
lbprintf( hwndListState, TEXT("Heap: 0x%08x"), TapiLines[i].Provider->HeapHandle );
|
|
lbprintf( hwndListState, TEXT("Base: 0x%08x"), TapiLines[i].Provider->hModule );
|
|
}
|
|
|
|
lbprintf( hwndListState, TEXT("DeviceId: %d"), TapiLines[i].DeviceId );
|
|
lbprintf( hwndListState, TEXT("Line Handle: 0x%08x"), TapiLines[i].hLine );
|
|
lbprintf( hwndListState, TEXT("Job: 0x%08x"), TapiLines[i].JobEntry );
|
|
|
|
SendMessage( hwndListState, WM_SETREDRAW, TRUE, 0 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
|
|
case WM_SERVICE_INIT:
|
|
SendMessage( hwndListLines, LB_SETCURSEL, 0, 0 );
|
|
goto print_line_state;
|
|
return 0;
|
|
|
|
case WM_CTLCOLOREDIT:
|
|
SetBkColor( (HDC)wParam, RGB(128,128,0) );
|
|
return (LPARAM)CreateSolidBrush( RGB(128,128,0) );
|
|
|
|
case WM_CTLCOLORLISTBOX:
|
|
if ((HWND)lParam == hwndListLines || (HWND)lParam == hwndListState) {
|
|
SetBkColor( (HDC)wParam, RGB(192,192,192) );
|
|
return (LPARAM)CreateSolidBrush( RGB(192,192,192) );
|
|
}
|
|
if ((HWND)lParam == hwndListMsg) {
|
|
SetBkColor( (HDC)wParam, RGB(192,192,192) );
|
|
return (LPARAM)CreateSolidBrush( RGB(192,192,192) );
|
|
}
|
|
return 0;
|
|
|
|
case WM_DESTROY:
|
|
ServiceStop();
|
|
#ifdef FAX_HEAP_DEBUG
|
|
PrintAllocations();
|
|
#endif
|
|
PostQuitMessage( 0 );
|
|
return 0;
|
|
}
|
|
|
|
return DefWindowProc( hwnd, message, wParam, lParam );
|
|
}
|