231 lines
5.1 KiB
C
231 lines
5.1 KiB
C
#include <windows.h>
|
|
#include <faxutil.h>
|
|
#include <winfax.h>
|
|
#include "faxstat.h"
|
|
|
|
HANDLE hFax;
|
|
LPBYTE StatusBuffer;
|
|
HANDLE FaxPortHandle;
|
|
|
|
|
|
VOID
|
|
WorkerThread(
|
|
PINSTANCE_DATA InstanceData
|
|
)
|
|
{
|
|
PFAX_EVENT FaxEvent;
|
|
HANDLE CompletionPort = NULL;
|
|
BOOL Rval;
|
|
DWORD Bytes;
|
|
DWORD CompletionKey;
|
|
PFAX_PORT_INFO PortInfo;
|
|
DWORD PortCount;
|
|
DWORD LastEventId = 0;
|
|
DWORD EventId;
|
|
PFAX_DEVICE_STATUS FaxDeviceStatus;
|
|
|
|
|
|
while (TRUE) {
|
|
|
|
if (FaxPortHandle) {
|
|
FaxClose( FaxPortHandle );
|
|
FaxPortHandle = NULL;
|
|
}
|
|
|
|
if (hFax) {
|
|
FaxClose( hFax );
|
|
hFax = NULL;
|
|
}
|
|
|
|
if (CompletionPort) {
|
|
CloseHandle( CompletionPort );
|
|
CompletionPort = NULL;
|
|
}
|
|
|
|
if( !FaxConnectFaxServer( InstanceData->ServerName, &hFax ) ){
|
|
|
|
hFax = NULL;
|
|
|
|
PostMessage( InstanceData->hWnd, STATUSUPDATE, FEI_FAXSVC_ENDED, 0 );
|
|
|
|
goto sleep;
|
|
}
|
|
|
|
CompletionPort = CreateIoCompletionPort(
|
|
INVALID_HANDLE_VALUE,
|
|
NULL,
|
|
0,
|
|
1
|
|
);
|
|
|
|
if (!CompletionPort) {
|
|
goto sleep;
|
|
}
|
|
|
|
if (!FaxInitializeEventQueue( hFax, CompletionPort, 0 )) {
|
|
goto sleep;
|
|
}
|
|
|
|
PortInfo = MyFaxEnumPorts( hFax, &PortCount );
|
|
|
|
if (!PortInfo) {
|
|
goto sleep;
|
|
}
|
|
|
|
if (PortCount == 0) {
|
|
//
|
|
// BUGBUG - should do something more intelligent if there are no ports
|
|
//
|
|
ExitProcess(0);
|
|
}
|
|
|
|
Rval = FaxOpenPort( hFax, PortInfo[0].DeviceId, PORT_OPEN_EVENTS, &FaxPortHandle );
|
|
|
|
if (!Rval) {
|
|
goto sleep;
|
|
}
|
|
|
|
FaxFreeBuffer( PortInfo );
|
|
|
|
if (StatusBuffer != NULL) {
|
|
FaxFreeBuffer( StatusBuffer );
|
|
StatusBuffer = NULL;
|
|
}
|
|
|
|
FaxDeviceStatus = (PFAX_DEVICE_STATUS) StatusBuffer;
|
|
|
|
Rval = FaxGetDeviceStatus( FaxPortHandle, &FaxDeviceStatus );
|
|
|
|
if (!Rval) {
|
|
goto sleep;
|
|
}
|
|
|
|
EventId = MapStatusIdToEventId( FaxDeviceStatus->Status );
|
|
|
|
PrintStatus( FaxDeviceStatus );
|
|
|
|
SendMessage( InstanceData->hWnd, STATUSUPDATE, EventId, (LPARAM) FaxDeviceStatus );
|
|
|
|
while (TRUE) {
|
|
|
|
Rval = GetQueuedCompletionStatus(
|
|
CompletionPort,
|
|
&Bytes,
|
|
&CompletionKey,
|
|
(LPOVERLAPPED*) &FaxEvent,
|
|
INFINITE
|
|
);
|
|
if (!Rval) {
|
|
return;
|
|
}
|
|
|
|
LastEventId = EventId;
|
|
|
|
EventId = FaxEvent->EventId;
|
|
|
|
DebugPrint(( TEXT( "Got event %x" ), EventId ));
|
|
|
|
switch (EventId) {
|
|
case FEI_SENDING:
|
|
case FEI_RECEIVING:
|
|
case FEI_DIALING:
|
|
if (EventId != LastEventId) {
|
|
|
|
if (StatusBuffer != NULL) {
|
|
FaxFreeBuffer( StatusBuffer );
|
|
StatusBuffer = NULL;
|
|
}
|
|
|
|
FaxDeviceStatus = (PFAX_DEVICE_STATUS) StatusBuffer;
|
|
|
|
Rval = FaxGetDeviceStatus( FaxPortHandle, &FaxDeviceStatus );
|
|
|
|
PrintStatus( FaxDeviceStatus );
|
|
}
|
|
}
|
|
|
|
SendMessage( InstanceData->hWnd, STATUSUPDATE, EventId, (LPARAM) FaxDeviceStatus );
|
|
|
|
LocalFree( FaxEvent );
|
|
|
|
if (EventId == FEI_FAXSVC_ENDED) {
|
|
break;
|
|
}
|
|
}
|
|
sleep:
|
|
if (EventId != FEI_FAXSVC_ENDED) {
|
|
SendMessage( InstanceData->hWnd, STATUSUPDATE, FEI_FAXSVC_ENDED, 0 );
|
|
}
|
|
Sleep(60000);
|
|
|
|
|
|
}
|
|
}
|
|
|
|
VOID
|
|
WorkerThreadInitialize(
|
|
PINSTANCE_DATA InstanceData
|
|
)
|
|
{
|
|
HANDLE WorkerThreadHandle;
|
|
DWORD WorkerThreadId;
|
|
|
|
WorkerThreadHandle = CreateThread(
|
|
NULL,
|
|
0,
|
|
(LPTHREAD_START_ROUTINE) WorkerThread,
|
|
InstanceData,
|
|
0,
|
|
&WorkerThreadId
|
|
);
|
|
}
|
|
|
|
VOID
|
|
Disconnect(
|
|
VOID
|
|
)
|
|
{
|
|
if (FaxPortHandle) {
|
|
FaxClose( FaxPortHandle );
|
|
FaxPortHandle = NULL;
|
|
}
|
|
|
|
if (hFax) {
|
|
FaxClose( hFax );
|
|
hFax = NULL;
|
|
}
|
|
}
|
|
|
|
PFAX_PORT_INFO
|
|
MyFaxEnumPorts(
|
|
HANDLE hFaxSvc,
|
|
LPDWORD pcPorts
|
|
)
|
|
{
|
|
PVOID pSvcPorts = NULL;
|
|
|
|
|
|
if (!FaxEnumPorts(hFaxSvc, (PFAX_PORT_INFO*) &pSvcPorts, pcPorts))
|
|
{
|
|
pSvcPorts = NULL;
|
|
}
|
|
|
|
return pSvcPorts;
|
|
}
|
|
|
|
VOID
|
|
PrintStatus(
|
|
PFAX_DEVICE_STATUS FaxStatus
|
|
)
|
|
{
|
|
DebugPrint(( TEXT( "Status 0x%x" ), FaxStatus->Status ));
|
|
DebugPrint(( TEXT( "Csid %s" ), FaxStatus->Csid ));
|
|
DebugPrint(( TEXT( "Tsid %s" ), FaxStatus->Tsid ));
|
|
DebugPrint(( TEXT( "PhoneNumber %s" ), FaxStatus->PhoneNumber ));
|
|
DebugPrint(( TEXT( "CurrentPage %d" ), FaxStatus->CurrentPage ));
|
|
DebugPrint(( TEXT( "TotalPages %d" ), FaxStatus->TotalPages ));
|
|
DebugPrint(( TEXT( "--------------------") ));
|
|
}
|
|
|
|
|