windows-nt/Source/XPSP1/NT/printscan/fax/itg/client/faxqueue.cpp
2020-09-26 16:20:57 +08:00

182 lines
3.1 KiB
C++

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