|
|
/*++
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 ); }
|