|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
faxitg.cpp
Abstract:
This file implements the FaxQueue object. The purpose of this object is to gain access to the fax service's fax queue and retrieve a received fax from the queue.
Author:
Wesley Witt (wesw) 13-May-1997
Environment:
User Mode
--*/
#include "stdafx.h"
#include "faxitg.h"
#include "faxqueue.h"
#include "faxsvr.h"
extern WCHAR g_ClientDir[MAX_PATH*2];
CFaxQueue::CFaxQueue() { }
CFaxQueue::~CFaxQueue() { }
STDMETHODIMP CFaxQueue::get_GetNextFax(BSTR * pVal) { INT Bytes; FAX_QUEUE_MESSAGE Msg; LPWSTR FileName; WCHAR SrcName[MAX_PATH]; WCHAR DstName[MAX_PATH];
//
// request the next avail fax
//
Msg.Request = REQ_NEXT_FAX;
Bytes = send( m_Socket, (char*)&Msg, sizeof(Msg), 0 ); if (Bytes == SOCKET_ERROR) { return E_FAIL; }
//
// receive the file name
//
Bytes = recv( m_Socket, (char*)&Msg, sizeof(Msg), 0 ); if (Bytes == SOCKET_ERROR) { return E_FAIL; }
FileName = (LPWSTR) Msg.Buffer;
if (FileName[0] == 0 || Msg.Response != RSP_GOOD) { return E_FAIL; }
//
// copy the file from the server
//
wcscpy( SrcName, m_ServerDir ); wcscat( SrcName, FileName );
wcscpy( DstName, g_ClientDir ); wcscat( DstName, FileName );
if (CopyFile( SrcName, DstName, FALSE )) { Msg.Response = 1; } else { Msg.Response = 0; }
Msg.Request = REQ_ACK;
//
// send our response
//
Bytes = send( m_Socket, (char*)&Msg, sizeof(Msg), 0 ); if (Bytes == SOCKET_ERROR) { return E_FAIL; }
*pVal = SysAllocString( FileName ); if (*pVal == NULL) { return E_FAIL; }
return S_OK; }
STDMETHODIMP CFaxQueue::put_Connect(BSTR ServerName) { PHOSTENT Host; SOCKADDR_IN cli_addr; CHAR ServerNameA[MAX_COMPUTERNAME_LENGTH]; DWORD Size;
Size = WideCharToMultiByte( CP_ACP, 0, ServerName, -1, ServerNameA, sizeof(ServerNameA), NULL, NULL ); if (Size == 0) { return E_FAIL; }
Host = gethostbyname( ServerNameA ); if (Host == NULL || *Host->h_addr_list == NULL) { return E_FAIL; }
CopyMemory ((char *) &m_RemoteIpAddress, Host->h_addr, Host->h_length);
//
// set up client socket
//
m_Socket = socket( PF_INET, SOCK_STREAM, 0 ); if (m_Socket == INVALID_SOCKET){ return E_FAIL; }
//
// connect to the server
//
ZeroMemory( &cli_addr, sizeof(cli_addr) );
cli_addr.sin_family = AF_INET; cli_addr.sin_port = htons( SERVICE_PORT ); cli_addr.sin_addr = m_RemoteIpAddress;
if (connect( m_Socket, (LPSOCKADDR)&cli_addr, sizeof(cli_addr) ) == SOCKET_ERROR){ return E_FAIL; }
//
// create the server dir name
//
wcscpy( m_ServerDir, L"\\\\" ); wcscat( m_ServerDir, ServerName ); wcscat( m_ServerDir, L"\\itg\\" );
//
// return success
//
return S_OK; }
|