2020-09-30 17:12:29 +02:00

294 lines
7.2 KiB
C++

/***************************************************************************
*
* File Name: mon_qp.cpp
*
* Copyright (C) 1993-1996 Hewlett-Packard Company.
* All rights reserved.
*
* 11311 Chinden Blvd.
* Boise, Idaho 83714
*
* This is a part of the HP JetAdmin Printer Utility
*
* This source code is only intended as a supplement for support and
* localization of HP JetAdmin by 3rd party Operating System vendors.
* Modification of source code cannot be made without the express written
* consent of Hewlett-Packard.
*
*
* Description:
*
* Author: Name
*
*
* Modification history:
*
* date initials change description
*
* mm-dd-yy MJB
*
* 01-18-96 JLH Unicode changes (TRACE statements only)
*
*
*
*
***************************************************************************/
//---------------------------------------------------------------------------
// $Header: W:/projects/shaqii/vcs/mon/mon_qp.cpv 2.1 19 Sep 1994 11:09:28 RICHARD $
// File: mon_qp.cpp
//
// Copyright (C) Hewlett-Packard Company 1993. All Rights Reserved.
// Copying or other reproduction of this material is prohibited without
// the prior written consent of Hewlett-Packard Company.
//
// What: Print Monitor Module containing the interface for the QP
//
// Author: Sylvan Butler (sdb) Start: Jul 22 93
//
// Notes:
//
// History:
//
// $Log: W:/projects/shaqii/vcs/mon/mon_qp.cpv $
//
// Rev 2.1 19 Sep 1994 11:09:28 RICHARD
// Deleted the port name parameter to the YieldToStatusWindow function.
//
// Rev 2.0 23 Aug 1994 13:54:10 RICHARD
// Changed references of "FAR *" to type definitons of LP...
// Changed references of HANDLE to PORTHANDLE
//
// Rev 1.10 11 Nov 1993 11:08:00 SYLVAN
// Added validity checking for DisplayStatus to pass correct port names
//
// Rev 1.9 08 Nov 1993 17:38:16 SYLVAN
// added comments, made PollReduction really work this time :)
//
// Rev 1.8 03 Nov 1993 17:25:54 SYLVAN
// Changed parameter to Yield...
//
// Rev 1.7 02 Nov 1993 16:46:46 SYLVAN
// Added YieldToStatus Window
//
// Rev 1.6 17 Sep 1993 11:22:58 SYLVAN
// Port not paused after EOJ
//
// Rev 1.5 15 Sep 1993 11:46:32 SYLVAN
// Added MonQP_Init for .ini entry for WritePollRate interval
// Use GetBiDiTicks instead of Windows function
//
// Rev 1.4 14 Sep 1993 10:52:32 SYLVAN
// Added algorithm choices for poll reduction
//
// Rev 1.3 31 Aug 1993 15:09:28 SYLVAN
// several, see history section
//
// Rev 1.2 16 Aug 1993 11:50:48 SYLVAN
// fix keywords in header (case sensitive)
//
// Who When What
// --- --------- ----
// sdb Jul 22 93 Module created by extraction from smon.cpp
// sdb Jul 29 93 Changed to use WritePort call
// sdb Aug 4 93 Added PJL output to Begin/End job, qualified it
// sdb Aug 5 93 Null terminate stored job name
// sdb Aug 20 93 Added check for job in ValidHandle
// sdb Aug 30 93 Added hack to prevent polling for ustatus in Write
// sdb Sep 7 93 Added alternate poll reduction algorithm
// Fixed multiple printer interaction bug in Aug 30 hack
// sdb Sep 15 93 Changed alternate poll algo not to use Win GetTicks...
// sdb Sep 17 93 Not paused after EOJ
//---------------------------------------------------------------------------
#include <pch_c.h>
#include <trace.h>
#include <comdef.h>
#include <smonx.h>
#include "smon.h"
#define BEGIN_JOB_TIMEOUT 5000
static DWORD PollRate = 0;
//---------------------------------------------------------------------------
// shared functions
//---------------------------------------------------------------------------
void MonQP_Init(void)
{
PollRate = 2000;
}
//---------------------------------------------------------------------------
// local functions
//---------------------------------------------------------------------------
#define ValidHandle(n) ( \
hPort > 0 && \
hPort <= MAXSPCB && \
SPCBTable[hPort].DeviceState.bJobPresent && \
(SPCBTable[hPort].bPortOwner & PORT_OWN_QP) \
)
//---------------------------------------------------------------------------
// interface functions for the QP
//---------------------------------------------------------------------------
PORTHANDLE BeginJob(HPERIPHERAL hPeripheral,LPTSTR lpszPortName,
LPTSTR lpszJobName)
{
int hPort;
PSPCB pSPCB;
TRACE0(TEXT("--BeginJob\r\n"));
hPort = FindHandle(lpszPortName);
if (!hPort)
{
TRACE0(TEXT("--BeginJob: Bad parameter\r\n"));
return(QP_BEGIN_JOB_FAIL);
}
pSPCB = &SPCBTable[hPort];
if (pSPCB->DeviceState.bJobPresent)
{
TRACE1(TEXT("--BeginJob: Prior job (%s)\r\n"),pSPCB->DeviceState.szJobName);
return(QP_BEGIN_JOB_FAIL);
}
if (!EnterCritSem0(BEGIN_JOB_TIMEOUT))
{
return(QP_BEGIN_JOB_FAIL);
}
// open the port
if (OpenPort(hPeripheral,PORT_OWN_QP,pSPCB))
{
TRACE0(TEXT("--BeginJob: OpenPort failed\r\n"));
return(QP_BEGIN_JOB_FAIL);
}
LeaveCritSem0();
if ( lpszJobName )
{
_tcsncpy(pSPCB->DeviceState.szJobName,lpszJobName,sizeof(pSPCB->DeviceState.szJobName));
pSPCB->DeviceState.szJobName[sizeof(pSPCB->DeviceState.szJobName) - 1] = '\0';
}
else
pSPCB->DeviceState.szJobName[0] = '\0';
pSPCB->DeviceState.bJobPresent = TRUE;
pSPCB->DeviceState.nJobPage = 0;
return(hPort);
}
int WriteJob(PORTHANDLE hPort,LPCVOID lpvBuf,int cbBufLen,LPINT lpcbWrite)
{
PSPCB pSPCB;
int rv;
TRACE0(TEXT("--WriteJob\r\n"));
if (!ValidHandle(hPort))
{
return(QP_BAD_PARAMETER);
}
pSPCB = &SPCBTable[hPort];
rv = (int) WritePort(lpvBuf,cbBufLen,lpcbWrite,pSPCB);
TRACE3(TEXT("--Poll@%8u,Last = %8u,Curr = %8u\r\n"),PollRate,pSPCB->nTimeAtLastPoll,
GetTickCount());
// read device status ?
if (pSPCB->bTwoWay)
{
if (PollRate != 0 && GetTickCount() - pSPCB->nTimeAtLastPoll > PollRate)
{
PJLGetMessage(pSPCB,NULL,NULL);
pSPCB->nTimeAtLastPoll = GetTickCount();
}
else
TRACE1(TEXT("--WriteJob: Skip Poll %s\r\n"),pSPCB->szPortName);
}
#ifndef WIN32
switch (rv)
{
case RC_SUCCESS:
rv = QP_PORT_OK;
break;
case RC_CE_PTO:
rv = QP_PORT_BUSY;
break;
default:
rv = QP_PORT_ERROR;
break;
}
#endif
return(rv);
}
int EndJob(PORTHANDLE hPort)
{
PSPCB pSPCB;
TRACE0(TEXT("--EndJob\r\n"));
if (!ValidHandle(hPort))
{
return(QP_BAD_PARAMETER);
}
pSPCB = &SPCBTable[hPort];
pSPCB->DeviceState.bJobPresent = FALSE;
pSPCB->DeviceState.bManualPaused = FALSE;
// close the port
if (ClosePort(PORT_OWN_QP,pSPCB))
{
TRACE0(TEXT("--ClosePort failed\r\n"));
return(QP_FAIL);
}
return(QP_SUCCESS);
}
int JobPause(PORTHANDLE hPort)
{
TRACE0(TEXT("--JobPause\r\n"));
if (!ValidHandle(hPort))
{
TRACE0(TEXT("--Bad parameter\r\n"));
return(QP_BAD_PARAMETER);
}
SPCBTable[hPort].DeviceState.bManualPaused = TRUE;
return(QP_SUCCESS);
}
int JobResume(PORTHANDLE hPort)
{
TRACE0(TEXT("--JobResume\r\n"));
if (!ValidHandle(hPort))
{
TRACE0(TEXT("--Bad parameter\r\n"));
return(QP_BAD_PARAMETER);
}
SPCBTable[hPort].DeviceState.bManualPaused = FALSE;
return(QP_SUCCESS);
}