windows-nt/Source/XPSP1/NT/printscan/fax/service/server/svcwin.c
2020-09-26 16:20:57 +08:00

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 );
}