501 lines
12 KiB
C++
501 lines
12 KiB
C++
/***************************************************************************
|
|
*
|
|
* File Name: main.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-17-96 JLH Modified for unicode
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
***************************************************************************/
|
|
|
|
|
|
#include <string.h>
|
|
|
|
#include <pch_c.h>
|
|
|
|
#include <trace.h>
|
|
#include <applet.h>
|
|
#include <colashim.h>
|
|
#include <comdef.h>
|
|
#include <smonx.h>
|
|
|
|
#include "misc.h"
|
|
#include "smon.h"
|
|
|
|
#define GET_STA_OBJECT_TIMEOUT 2000
|
|
#define GET_CFG_OBJECT_TIMEOUT 5000
|
|
#define SET_OBJECT_TIMEOUT 5000
|
|
|
|
#ifdef WIN32
|
|
#pragma data_seg("SHAREDDATA")
|
|
#endif
|
|
|
|
int iDllUseCount = 0;
|
|
|
|
#ifdef WIN32
|
|
#pragma data_seg()
|
|
#endif
|
|
|
|
#ifdef WIN32
|
|
#ifdef WINNT
|
|
CRITICAL_SECTION CritSect;
|
|
BOOL EnterCritSem0(DWORD dwTimeout)
|
|
{
|
|
EnterCriticalSection(&CritSect);
|
|
return(TRUE);
|
|
}
|
|
|
|
void LeaveCritSem0(void)
|
|
{
|
|
LeaveCriticalSection(&CritSect);
|
|
}
|
|
|
|
#else // not WINNT
|
|
|
|
#define HPPJL_SEM_0 TEXT("HPPJL_SEM_0" )
|
|
HANDLE hCritSem0 = NULL;
|
|
|
|
BOOL EnterCritSem0(DWORD dwTimeout)
|
|
{
|
|
return(WaitForSingleObject(hCritSem0, dwTimeout) != WAIT_TIMEOUT);
|
|
}
|
|
|
|
void LeaveCritSem0(void)
|
|
{
|
|
ReleaseSemaphore(hCritSem0, 1, NULL);
|
|
}
|
|
|
|
#endif // not WINNT
|
|
|
|
#else // WIN16
|
|
BOOL EnterCritSem0(DWORD dwTimeout)
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
#define LeaveCritSem0()
|
|
|
|
#endif // WIN32
|
|
|
|
// Local functions
|
|
void SetGetObjects(LPPJLobjects pjlObjects)
|
|
{
|
|
pjlObjects->bAutoCont = TRUE;
|
|
pjlObjects->bBinding = TRUE;
|
|
pjlObjects->bClearableWarnings = TRUE;
|
|
pjlObjects->bCopies = TRUE;
|
|
pjlObjects->bCpLock = TRUE;
|
|
pjlObjects->bDensity = TRUE;
|
|
pjlObjects->bDiskLock = TRUE;
|
|
pjlObjects->bDuplex = TRUE;
|
|
pjlObjects->bEconoMode = TRUE;
|
|
pjlObjects->bFormLines = TRUE;
|
|
pjlObjects->bImageAdapt = TRUE;
|
|
pjlObjects->bIObuffer = TRUE;
|
|
pjlObjects->bJobOffset = TRUE;
|
|
pjlObjects->bLang = TRUE;
|
|
pjlObjects->bManualFeed = TRUE;
|
|
pjlObjects->bOrientation = TRUE;
|
|
pjlObjects->bOutbin = TRUE;
|
|
pjlObjects->bPageProtect = TRUE;
|
|
pjlObjects->bPaper = TRUE;
|
|
pjlObjects->bPassWord = TRUE;
|
|
pjlObjects->bPersonality = TRUE;
|
|
pjlObjects->bPowerSave = TRUE;
|
|
pjlObjects->bResolution = TRUE;
|
|
pjlObjects->bResourceSave = TRUE;
|
|
pjlObjects->bPCLResSaveSize = FALSE; // Postscript only
|
|
pjlObjects->bPSResSaveSize = FALSE; // Postscript only
|
|
pjlObjects->bRET = TRUE;
|
|
pjlObjects->bTimeout = TRUE;
|
|
pjlObjects->bJamRecovery = FALSE; // Postscript only
|
|
pjlObjects->bPrintPSerrors = FALSE; // Postscript only
|
|
pjlObjects->bAvailMemory = TRUE;
|
|
pjlObjects->bMPTray = TRUE;
|
|
pjlObjects->bLangServiceMode = TRUE;
|
|
pjlObjects->bPSAdobeMBT = FALSE; // Postscript only
|
|
}
|
|
|
|
// DLL required functions
|
|
/****************************************************************************
|
|
FUNCTION: LibMain(HANDLE, DWORD, LPVOID)
|
|
|
|
PURPOSE: LibMain is called by Windows when
|
|
the DLL is initialized, Thread Attached, and other times.
|
|
Refer to SDK documentation, as to the different ways this
|
|
may be called.
|
|
|
|
The LibMain function should perform additional initialization
|
|
tasks required by the DLL. In this example, no initialization
|
|
tasks are required. LibMain should return a value of 1 if
|
|
the initialization is successful.
|
|
|
|
*******************************************************************************/
|
|
|
|
#ifdef WIN32
|
|
INT WINAPI DllMain
|
|
(
|
|
HINSTANCE hInstance,
|
|
DWORD ul_reason_being_called,
|
|
LPVOID lpReserved
|
|
)
|
|
{
|
|
int rv = 1;
|
|
|
|
switch (ul_reason_being_called)
|
|
{
|
|
case DLL_PROCESS_ATTACH: /* process attaches */
|
|
|
|
TRACE0(TEXT("HPPJL.DLL Initializing!\n"));
|
|
// initialize sub-modules
|
|
MonQP_Init();
|
|
CFGInit();
|
|
|
|
#ifdef WINNT
|
|
InitializeCriticalSection(&CritSect);
|
|
if (FALSE)
|
|
{
|
|
//connect with else stmt below
|
|
}
|
|
#else
|
|
if ((hCritSem0 = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, HPPJL_SEM_0)) == NULL &&
|
|
(hCritSem0 = CreateSemaphore(NULL, 1, 1, HPPJL_SEM_0)) == NULL)
|
|
rv = 0;
|
|
#endif
|
|
else
|
|
{
|
|
if (PJLAllocBufs() == RC_FAILURE) rv = 0;
|
|
}
|
|
|
|
if (rv != 0) iDllUseCount++;
|
|
|
|
break;
|
|
|
|
case DLL_THREAD_ATTACH: /* thread attaches */
|
|
break;
|
|
|
|
case DLL_THREAD_DETACH: /* thread detaches */
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH: /* process detaches */
|
|
TRACE0(TEXT("HPPJL.DLL Terminating!\n"));
|
|
|
|
PJLFreeBufs();
|
|
|
|
#ifdef WINNT
|
|
//DeleteCriticalSection(&CritSect);
|
|
#else
|
|
CloseHandle(hCritSem0);
|
|
#endif
|
|
|
|
if (--iDllUseCount == 0) PJLClosePorts();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return(rv);
|
|
UNREFERENCED_PARAMETER(hInstance);
|
|
UNREFERENCED_PARAMETER(lpReserved);
|
|
}
|
|
#else
|
|
// 16 bit initialization
|
|
static int init = 0;
|
|
extern "C" int __export CALLBACK LibMain
|
|
(
|
|
HINSTANCE hInstance,
|
|
WORD wDataSeg,
|
|
WORD cbHeapSize,
|
|
LPSTR lpszCmdLine
|
|
)
|
|
{
|
|
TRACE0(TEXT("HPPJL.DLL Initializing!\n"));
|
|
|
|
init = 1; // LibMain successfully called
|
|
|
|
// initialize sub-modules
|
|
MonQP_Init();
|
|
CFGInit();
|
|
|
|
// unlock the DLL data segment allowing the heap to be moveable
|
|
if (cbHeapSize != 0) UnlockData(0);
|
|
|
|
return(1);
|
|
}
|
|
|
|
extern "C" int __export CALLBACK WEP
|
|
(
|
|
int nExitType
|
|
)
|
|
{
|
|
TRACE0(TEXT("HPPJL.DLL Terminating!\n"));
|
|
|
|
if (init == 1) // check if LibMain successfully completed
|
|
{
|
|
PJLFreeBufs();
|
|
PJLClosePorts();
|
|
}
|
|
|
|
return(1);
|
|
}
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Add API functions here
|
|
extern DLL_EXPORT(DWORD) CALLING_CONVEN AppletInfo(
|
|
DWORD dwCommand,
|
|
LPARAM lParam1,
|
|
LPARAM lParam2)
|
|
|
|
{
|
|
APPLETDEVICE info[] = {
|
|
#ifdef WIN32
|
|
{sizeof(APPLETDEVICE), TEXT("HPPJL.HPA"),
|
|
TEXT("PJL"),
|
|
APPLET_LANGUAGE, APPLET_LIBRARY_CMD,
|
|
OBJ_PJL, APPLET_DEFAULTS},
|
|
#else
|
|
{sizeof(APPLETDEVICE), TEXT("HPPJL16.HPA"),
|
|
TEXT("PJL"),
|
|
APPLET_LANGUAGE, APPLET_LIBRARY_CMD,
|
|
OBJ_PJL, APPLET_DEFAULTS},
|
|
#endif
|
|
};
|
|
|
|
switch(dwCommand)
|
|
{
|
|
case APPLET_INFO_GETCOUNT:
|
|
return(sizeof(info) / sizeof(APPLETDEVICE));
|
|
break;
|
|
|
|
case APPLET_INFO_DEVICE:
|
|
if ( lParam1 < sizeof(info) / sizeof(APPLETDEVICE) )
|
|
{
|
|
memcpy((LPAPPLETDEVICE)lParam2, &(info[lParam1]), sizeof(APPLETDEVICE));
|
|
return(TRUE);
|
|
}
|
|
return(FALSE);
|
|
break;
|
|
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
extern "C" DLL_EXPORT(DWORD) CALLING_CONVEN AppletGetObject
|
|
(
|
|
HPERIPHERAL hPeripheral,
|
|
AOID objectType,
|
|
DWORD level,
|
|
LPVOID buffer,
|
|
LPDWORD bufferSize
|
|
)
|
|
{
|
|
DWORD returnCode = RC_SUCCESS;
|
|
BOOL bLocked;
|
|
|
|
// Validate object type
|
|
if (!(objectType & OBJ_PJL)) return(RC_FAILURE);
|
|
|
|
if ( SCANNER_DEVICE(hPeripheral) ) return(RC_FAILURE);
|
|
|
|
TRACE0(TEXT("--PJLGetObject Entry\r\n"));
|
|
|
|
if ( LOCAL_DEVICE(hPeripheral) )
|
|
{
|
|
if ( BITRONICS_SUPPORTED(hPeripheral) || SIR_SUPPORTED(hPeripheral) )
|
|
{
|
|
if (objectType == OT_PERIPHERAL_STATUS ||
|
|
objectType == OT_PERIPHERAL_PANEL ||
|
|
objectType == OT_PERIPHERAL_DEVICE_STATUS)
|
|
bLocked = EnterCritSem0(GET_STA_OBJECT_TIMEOUT);
|
|
else
|
|
bLocked = EnterCritSem0(GET_CFG_OBJECT_TIMEOUT);
|
|
|
|
switch (objectType)
|
|
{
|
|
case OT_PERIPHERAL_PJL:
|
|
{
|
|
LPPJLobjects pjlObjects = (LPPJLobjects) buffer;
|
|
SetGetObjects(pjlObjects);
|
|
returnCode = CFGGetObjects(hPeripheral, pjlObjects, bLocked);
|
|
}
|
|
break;
|
|
|
|
case OT_PERIPHERAL_CAPABILITIES:
|
|
{
|
|
PeripheralCaps* periphCaps = (PeripheralCaps *) buffer;
|
|
returnCode = CFGGetCapabilities(hPeripheral, periphCaps, bLocked);
|
|
}
|
|
break;
|
|
|
|
case OT_PERIPHERAL_STATUS:
|
|
{
|
|
PeripheralStatus* periphStatus = (PeripheralStatus *) buffer;
|
|
returnCode = STAGetStatus(hPeripheral, &periphStatus->peripheralStatus, bLocked);
|
|
}
|
|
break;
|
|
|
|
case OT_PERIPHERAL_PANEL:
|
|
{
|
|
PeripheralPanel* periphPanel = (PeripheralPanel*) buffer;
|
|
returnCode = STAGetDisplay(hPeripheral, periphPanel->frontPanel, bLocked);
|
|
}
|
|
break;
|
|
|
|
case OT_PERIPHERAL_DEVICE_STATUS:
|
|
{
|
|
LPDEVSTATE lpDeviceStatus = (LPDEVSTATE) buffer;
|
|
returnCode = STAGetDeviceStatus(hPeripheral, lpDeviceStatus, bLocked);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
returnCode = RC_INVALID_OBJECT;
|
|
break;
|
|
}
|
|
|
|
if (bLocked) LeaveCritSem0();
|
|
}
|
|
else
|
|
returnCode = RC_FAILURE;
|
|
}
|
|
else
|
|
returnCode = RC_FAILURE;
|
|
|
|
TRACE0(TEXT("--PJLGetObject Exit\r\n"));
|
|
|
|
return(returnCode);
|
|
}
|
|
|
|
extern "C" DLL_EXPORT(DWORD) CALLING_CONVEN AppletSetObject
|
|
(
|
|
HPERIPHERAL hPeripheral,
|
|
AOID objectType,
|
|
DWORD level,
|
|
LPVOID buffer,
|
|
LPDWORD bufferSize
|
|
)
|
|
{
|
|
DWORD returnCode = RC_SUCCESS;
|
|
HCHANNEL hChannel;
|
|
BOOL bLocked;
|
|
|
|
// Validate object type
|
|
if (!(objectType & OBJ_PJL)) return(RC_FAILURE);
|
|
|
|
if ( SCANNER_DEVICE(hPeripheral) ) return(RC_FAILURE);
|
|
|
|
TRACE0(TEXT("--PJLSetObject Entry\r\n"));
|
|
|
|
if ( LOCAL_DEVICE(hPeripheral) )
|
|
{
|
|
if ( BITRONICS_SUPPORTED(hPeripheral) || SIR_SUPPORTED(hPeripheral) )
|
|
{
|
|
bLocked = EnterCritSem0(SET_OBJECT_TIMEOUT);
|
|
|
|
switch (objectType)
|
|
{
|
|
case OT_PERIPHERAL_PJL:
|
|
returnCode = CFGSetObjects(hPeripheral, (PJLobjects *)buffer, 5000, bLocked);
|
|
break;
|
|
|
|
default:
|
|
returnCode = RC_INVALID_OBJECT;
|
|
break;
|
|
}
|
|
|
|
if (bLocked) LeaveCritSem0();
|
|
}
|
|
else
|
|
returnCode = RC_FAILURE;
|
|
}
|
|
else
|
|
{
|
|
if ( NETWORK_DEVICE(hPeripheral) )
|
|
{
|
|
if ( IPX_SUPPORTED(hPeripheral) )
|
|
{
|
|
// If we are a NetWare client and are trying to send a PJL job
|
|
// then we must have queue access to the device.
|
|
if ( COLAHPNWShimNetWarePresent() )
|
|
{
|
|
if ( PALModifyAccess(hPeripheral) & ACCESS_QUEUE_JOB )
|
|
hChannel = NULL;
|
|
else
|
|
return(RC_READ_ONLY_OBJECT);
|
|
}
|
|
else
|
|
{ // Direct-Mode, we actually open a channel
|
|
returnCode = TALOpenChannel(hPeripheral, DIRM_SOCKET, CHANNEL_CONNECTION | CHANNEL_SPXCONNECT,
|
|
NULL, &hChannel);
|
|
if ( ( returnCode ISNT RC_SUCCESS ) OR ( hChannel IS NULL ) )
|
|
return(RC_FAILURE);
|
|
}
|
|
}
|
|
else if ( TCP_SUPPORTED(hPeripheral) )
|
|
{ // TCP/IP
|
|
returnCode = TALOpenChannel(hPeripheral, 0, CHANNEL_CONNECTION, NULL, &hChannel);
|
|
if ( ( returnCode ISNT RC_SUCCESS ) OR ( hChannel IS NULL ) )
|
|
return(RC_FAILURE);
|
|
}
|
|
else
|
|
{ // Unknown connection type
|
|
return(RC_FAILURE);
|
|
}
|
|
switch (objectType)
|
|
{
|
|
case OT_PERIPHERAL_PANEL:
|
|
returnCode = SetControlPanel(hPeripheral, hChannel, (LPTSTR)buffer);
|
|
break;
|
|
|
|
case OT_PERIPHERAL_PJL:
|
|
returnCode = SetControlPanelSettings(hPeripheral, hChannel, (PJLobjects *)buffer);
|
|
break;
|
|
|
|
default:
|
|
returnCode = RC_INVALID_OBJECT;
|
|
break;
|
|
}
|
|
if ( hChannel ISNT NULL )
|
|
TALCloseChannel(hChannel);
|
|
}
|
|
else
|
|
returnCode = RC_FAILURE;
|
|
}
|
|
|
|
TRACE0(TEXT("--PJLSetObject Exit\r\n"));
|
|
|
|
return(returnCode);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|