|
|
#define STRICT
#include "windows.h"
#include "windowsx.h"
#include "tapi.h"
#include "shellapi.h"
#include "watchit.h"
#include "tapiperf.h"
#if DBG
#define DBGOUT(arg) DbgPrt arg
VOID DbgPrt( IN DWORD dwDbgLevel, IN PCHAR DbgMessage, IN ... ); #define DOFUNC(arg1,arg2) DoFunc(arg1,arg2)
#else
#define DBGOUT(arg)
#define DOFUNC(arg1,arg2) DoFunc(arg1)
#endif
//***************************************************************************
static TCHAR gszHELPfilename [] = TEXT("watchit.HLP"); static TCHAR gszwatchitClassName[] = TEXT("WATCHIT_Class"); static TCHAR gszAppName[64];
#define MAXBUFSIZE (256)
typedef LONG (* PERFPROC)(PERFBLOCK *); PERFPROC glpfnInternalPerformance = NULL; BOOL gfTapiSrvRunning = FALSE; PPERFBLOCK gpPerfBlock = NULL;
HWND ghWndMain; HINSTANCE ghInst; HINSTANCE ghTapiInst; HLINEAPP ghLineApp;
TCHAR gszBuf[MAXBUFSIZE];
//***************************************************************************
//***************************************************************************
//***************************************************************************
UINT LoadUI() { return(0); }
//***************************************************************************
UINT ReadINI() { return( 0 ); }
//***************************************************************************
//***************************************************************************
//***************************************************************************
void CheckForTapiSrv() { SC_HANDLE sc, scTapiSrv; SERVICE_STATUS ServStat;
sc = OpenSCManager(NULL, NULL, GENERIC_READ);
if (NULL == sc) { return; }
gfTapiSrvRunning = FALSE;
scTapiSrv = OpenService(sc, TEXT("TAPISRV"), SERVICE_QUERY_STATUS);
if (!QueryServiceStatus(scTapiSrv, &ServStat)) { }
if (ServStat.dwCurrentState != SERVICE_RUNNING) { } else { gfTapiSrvRunning = TRUE; }
if (gfTapiSrvRunning) { ghTapiInst = LoadLibrary(TEXT("tapi32.dll"));
if (!ghTapiInst) { } else { glpfnInternalPerformance = (PERFPROC)GetProcAddress( ghTapiInst, "internalPerformance"); }
if (!glpfnInternalPerformance) { //TODO: Say something!
}
}
CloseServiceHandle(sc);
}
//***************************************************************************
//***************************************************************************
//***************************************************************************
INT_PTR CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HICON hIconLarge; static HICON hIconSmall; static HICON hIconDeadTapiSrv; static BOOL fStarted = FALSE; static BOOL fDoSmall = FALSE; static const DWORD aMenuHelpIDs[] = { // IDD_DBUTTONPOUND, IDH_DIALER_DIAL_KEYPAD,
0, 0 };
//MessageBox(GetFocus(), "WM_INI", "Hitting", MB_OK);
switch (msg) { case WM_ERASEBKGND: return( 1 ); // We handled it. No, really... would I lie? :-)
case WM_TIMER: { RECT rect;
if ( fStarted ) { // SetDlgItemText( ghWndMain, IDC_AVG_TIME_TO_NEXT_CUE, szInfo );
fStarted = TRUE; }
DBGOUT((0, "Heartbeat..."));
// InvalidateRect( ghWndMain, NULL, TRUE );
rect.left = 0; rect.top = 0; rect.right = 32; rect.bottom = 32; InvalidateRect( ghWndMain, &rect, FALSE );
fDoSmall = !(fDoSmall); } break;
case WM_INITDIALOG: { //MessageBox(GetFocus(), "WM_INI", "Hitting", MB_OK);
hIconLarge = LoadIcon( ghInst, (LPCTSTR) MAKEINTRESOURCE( IDI_LARGE ) ); hIconSmall = LoadIcon( ghInst, (LPCTSTR) MAKEINTRESOURCE( IDI_SMALL ) ); hIconDeadTapiSrv = LoadIcon( ghInst, (LPCTSTR) MAKEINTRESOURCE( IDI_DEADTAPISRV ) );
SetTimer( hwnd, 1, 1000, NULL );
return TRUE; }
case WM_SYSCOMMAND: switch( (DWORD) wParam ) { case SC_CLOSE: PostQuitMessage(0); } break;
//
// processes clicks on controls when
// context mode help is selected
//
case WM_HELP: WinHelp ( (HWND)( (LPHELPINFO) lParam)->hItemHandle, gszHELPfilename, HELP_WM_HELP, (ULONG_PTR)(LPVOID) aMenuHelpIDs ); return TRUE;
//
// processes right-clicks on controls
//
case WM_CONTEXTMENU: WinHelp ( (HWND)wParam, gszHELPfilename, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)aMenuHelpIDs ); return TRUE;
case WM_COMMAND: {
switch( LOWORD( (DWORD)wParam ) ) { // FILE menu
case IDM_EXIT: PostQuitMessage(0); return TRUE;
// HELP menu
case IDM_HELP_CONTENTS: WinHelp(ghWndMain, gszHELPfilename, HELP_CONTENTS, 0); return TRUE;
case IDM_HELP_WHATSTHIS: PostMessage(ghWndMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0); return TRUE;
case IDM_ABOUT: ShellAbout( ghWndMain, gszAppName, TEXT(""), LoadIcon(ghInst, (LPCTSTR)IDI_LARGE) ); // DialogBoxParam(
// ghInst,
// MAKEINTRESOURCE(IDD_ABOUT),
// ghWndMain,
// (DLGPROC)AboutProc,
// 0
// );
return TRUE;
} // end switch (LOWORD((DWORD)wParam)) { ... }
break; // end case WM_COMMAND
}
case WM_PAINT: { PAINTSTRUCT ps; RECT rc; HDC hdcMem; HBITMAP hbmMem, hbmOld;
BeginPaint(hwnd, &ps);
//
// Get the size of the client rectangle.
//
GetClientRect(hwnd, &rc);
//
// Create a compatible DC.
//
hdcMem = CreateCompatibleDC(ps.hdc);
//
// Create a bitmap big enough for our client rectangle.
//
hbmMem = CreateCompatibleBitmap(ps.hdc, rc.right-rc.left, rc.bottom-rc.top);
//
// Select the bitmap into the off-screen DC.
//
hbmOld = (HBITMAP)SelectObject(hdcMem, hbmMem);
//
// Erase the background.
//
// hbrBkGnd = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
// hbrBkGnd = CreateSolidBrush(COLOR_3DFACE + 1);
// FillRect(hdcMem, &rc, hbrBkGnd);
FillRect(hdcMem, &rc, (HBRUSH)(COLOR_3DFACE + 1) ); // DeleteObject(hbrBkGnd);
//
// Render the image into the offscreen DC.
//
SetBkMode(hdcMem, TRANSPARENT);
// if(IsIconic(ghWndMain))
// DrawIcon(ps.hdc, 0, 0, fDoSmall ? hIconSmall : hIconLarge);
// else
{ int nSize;
if ( gpPerfBlock ) { if ( ( NULL == glpfnInternalPerformance ) || ( LINEERR_OPERATIONFAILED == glpfnInternalPerformance(gpPerfBlock) ) ) { gpPerfBlock->dwClientApps = 1;
DrawIcon( hdcMem, 0, 0, hIconDeadTapiSrv );
//
// Check again so that next time around, we'll
// display stuff if TAPISRV has started
//
CheckForTapiSrv();
} else { DrawIcon( hdcMem, 0, 0, fDoSmall ? hIconSmall : hIconLarge );
}
//
// Blt the changes to the screen DC.
//
BitBlt(ps.hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, hdcMem, 0, 0, SRCCOPY);
nSize = wsprintf( gszBuf, TEXT("%ld"), gpPerfBlock->dwClientApps - 1 // don't count me
);
SetDlgItemText( ghWndMain, IDC_NUMCLIENTSTEXT, gszBuf );
nSize = wsprintf( gszBuf, TEXT("%ld"), gpPerfBlock->dwCurrentOutgoingCalls );
SetDlgItemText( ghWndMain, IDC_NUMOUTCALLSTEXT, gszBuf );
nSize = wsprintf( gszBuf, TEXT("%ld"), gpPerfBlock->dwCurrentIncomingCalls );
SetDlgItemText( ghWndMain, IDC_NUMINCALLSTEXT, gszBuf );
}
}
//
// Done with off-screen bitmap and DC.
//
SelectObject(hdcMem, hbmOld); DeleteObject(hbmMem); DeleteDC(hdcMem);
EndPaint(ghWndMain, &ps);
return TRUE; }
default: ; // return DefDlgProc( hwnd, msg, wParam, lParam );
// return DefWindowProc( hwnd, msg, wParam, lParam );
} // switch (msg) { ... }
return FALSE; }
//***************************************************************************
//***************************************************************************
//***************************************************************************
void FAR PASCAL TAPICallback( DWORD hDevice, DWORD dwMsg, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3 ) { }
//***************************************************************************
//***************************************************************************
//***************************************************************************
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // HACCEL hAccel;
MSG msg; // DWORD errCode;
// HANDLE hImHere;
// DWORD dwNumDevs;
// DWORD dwAPIVersion = 0x00020000;
// LINEINITIALIZEEXPARAMS LineInitializeExParams = {
// sizeof( LINEINITIALIZEEXPARAMS ),
// 0,
// 0,
// 0,
// 0,
// 0
// };
// MessageBox(GetFocus(), "Starting", "Starting", MB_OK);
DBGOUT((0, "starting"));
ghInst = GetModuleHandle( NULL ); LoadString( ghInst, WATCHIT_STRING_FRIENDLYNAME, gszAppName, sizeof(gszAppName)/sizeof(TCHAR) );
//
// //
// // Now, let's see if we've already got an instance of ourself
// //
// hImHere = CreateMutex(NULL, TRUE, "watchit_IveBeenStartedMutex");
//
//
// //
// // Is there another one of us already here?
// if ( ERROR_ALREADY_EXISTS == GetLastError() )
// {
// HWND hDialerWnd;
//
// hDialerWnd = FindWindow(gszDialerClassName,
// NULL);
//
// SetForegroundWindow(hDialerWnd);
//
// CloseHandle( hImHere );
// return 0;
// }
{ WNDCLASS wc; wc.style = CS_DBLCLKS | CS_SAVEBITS | CS_BYTEALIGNWINDOW; wc.lpfnWndProc = DefDlgProc; wc.cbClsExtra = 0; wc.cbWndExtra = DLGWINDOWEXTRA; wc.hInstance = ghInst; wc.hIcon = LoadIcon(ghInst, MAKEINTRESOURCE(IDI_LARGE) ); wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
wc.lpszMenuName = NULL; wc.lpszClassName = gszwatchitClassName; if ( 0 == RegisterClass(&wc) ) { DBGOUT((0, "RegisterClass failed. GetLastError() = 0x%08lx", GetLastError() ));
return 0; } }
DBGOUT((0, "about to create"));
// create the dialog box and set it with info
// from the .INI file
ghWndMain = CreateDialog ( ghInst, (LPCTSTR)MAKEINTRESOURCE(IDD_MAIN_WATCHIT), (HWND)NULL, MainWndProc );
if ( ReadINI() ) { MessageBox( GetFocus(), TEXT("INI File is broken."), TEXT("This is not good"), MB_OK ); }
if ( LoadUI() ) { MessageBox( GetFocus(), TEXT("UI Load is broken."), TEXT("This is not good"), MB_OK ); }
CheckForTapiSrv();
gpPerfBlock = (PPERFBLOCK)LocalAlloc(LPTR, sizeof(PERFBLOCK));
// errCode = lineInitializeEx(
// &ghLineApp,
// NULL,
// TAPICallback,
// gszAppName,
// &dwNumDevs,
// &dwAPIVersion,
// &LineInitializeExParams
// );
ShowWindow(ghWndMain, SW_SHOW);
UpdateWindow(ghWndMain);
// hAccel = LoadAccelerators(ghInst, gszAppName);
while ( GetMessage( &msg, NULL, 0, 0 ) ) { if ( ghWndMain == NULL || !IsDialogMessage( ghWndMain, &msg ) ) { // if(!TranslateAccelerator(ghWndMain, hAccel, &msg))
{ TranslateMessage(&msg); DispatchMessage(&msg); } } }
//
// CloseHandle( hImHere );
//
KillTimer( ghWndMain, 1);
if ( gpPerfBlock ) { LocalFree( gpPerfBlock ); }
if ( ghTapiInst ) { FreeLibrary( ghTapiInst ); }
return (int) msg.wParam; }
#if DBG
#include "stdarg.h"
#include "stdio.h"
VOID DbgPrt( IN DWORD dwDbgLevel, IN PCHAR lpszFormat, IN ... ) /*++
Routine Description:
Formats the incoming debug message & calls DbgPrint
Arguments:
DbgLevel - level of message verboseness
DbgMessage - printf-style format string, followed by appropriate list of arguments
Return Value:
--*/ { static DWORD gdwDebugLevel = 0; //HACKHACK
if (dwDbgLevel <= gdwDebugLevel) { CHAR buf[256] = "WATCHIT: "; va_list ap;
va_start(ap, lpszFormat);
wvsprintfA (&buf[8], lpszFormat, ap );
lstrcatA(buf, "\n");
OutputDebugStringA(buf);
va_end(ap); } } #endif
// //***************************************************************************
// //***************************************************************************
// //***************************************************************************
// BOOL CALLBACK AboutProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
// {
// switch(msg)
// {
// case WM_INITDIALOG:
// {
// TCHAR sz[MAXBUFSIZE];
// TCHAR szLabel[MAXBUFSIZE];
//
// // sets up the version number for Windows
// GetDlgItemText(hwnd, IDD_ATEXTTITLE, sz, MAXBUFSIZE);
// wsprintf(
// szLabel,
// sz,
// LOWORD(GetVersion()) & 0xFF,
// HIBYTE(LOWORD(GetVersion)) == 10 ? 1 : 0
// );
// SetDlgItemText(hwnd, IDD_ATEXTTITLE, szLabel);
//
// /* // sets up version number for Dialer
// GetDlgItemText(hwnd, IDD_ATEXTVERSION, sz, MAXBUFSIZE);
// wsprintf(szLabel, sz, VER_MAJOR, VER_MINOR, VER_BUILD);
//
//
// { // strip off build number for release copies
// DWORD i;
// LPSTR ch = szLabel;
//
// for (i = 0; i < 2 && *ch; ++ch)
// {
// if(*ch == '.')
// ++i;
// if(i == 2)
// *ch = 0;
// }
//
// SetDlgItemText(hwnd ,IDD_ATEXTVERSION, szLabel);
// } */
//
//
// /* // get free memory information
// GetDlgItemText(hwnd, IDD_ATEXTFREEMEM, sz, MAXBUFSIZE);
// wsprintf(szLabel, sz, GetFreeSpace(0)>>10);
// SetDlgItemText(hwnd, IDD_ATEXTFREEMEM, szLabel);
//
// // get free resources information
// GetDlgItemText(hwnd, IDD_ATEXTRESOURCE, sz,MAXBUFSIZE);
// wsprintf(szLabel, sz, GetFreeSystemResources(0));
// SetDlgItemText(hwnd, IDD_ATEXTRESOURCE, szLabel); */
//
// return TRUE;
// }
//
// case WM_COMMAND:
// if(LOWORD((DWORD)wParam) == IDOK)
// {
// EndDialog(hwnd, TRUE);
// return TRUE;
// }
// break;
// }
// return FALSE;
// }
|