blob: c5212605431bf6dd6271bb5ff43c3328c4218fb9 [file] [log] [blame]
//----------------------------------------------------------------------------
//
// This software is provided "AS IS". The JavaPOS working group (including
// each of the Corporate members, contributors and individuals) MAKES NO
// REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE SOFTWARE,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NON-INFRINGEMENT. The JavaPOS working group shall not be liable for
// any damages suffered as a result of using, modifying or distributing this
// software or its derivatives.Permission to use, copy, modify, and distribute
// the software and its documentation for any purpose is hereby granted.
//
// BaseJposControl.java - Abstract base class for all JavaPOS Device Controls.
//
//-----------------------------------------------------------------------------
package jpos;
import jpos.events.*;
import jpos.services.*;
import java.util.Vector;
import jpos.loader.*;
public abstract class BaseJposControl
implements BaseControl
{
//--------------------------------------------------------------------------
// Constants
//--------------------------------------------------------------------------
protected static final int deviceVersion12 = 1002000; // 1.2.0
protected static final int deviceVersion13 = 1003000; // 1.3.0
protected static final int deviceVersion14 = 1004000; // 1.4.0
protected static final int deviceVersion15 = 1005000; // 1.5.0
protected static final int deviceVersion16 = 1006000; // 1.6.0
protected static final int deviceVersion17 = 1007000; // 1.7.0
protected static final int deviceVersion18 = 1008000; // 1.8.0
protected static final int deviceVersion19 = 1009000; // 1.9.0
protected static final int deviceVersion110 = 1010000; // 1.10.0
protected static final int deviceVersion111 = 1011000; // 1.11.0
protected static final int deviceVersion112 = 1012000; // 1.12.0
protected static final int deviceVersion113 = 1013000; // 1.13.0
protected static final int deviceVersion114 = 1014000; // 1.14.0
//--------------------------------------------------------------------------
// Variables
//--------------------------------------------------------------------------
// Instance Data Set in Derived Class
protected String deviceControlDescription;
protected int deviceControlVersion;
// Instance Data Set in Base Class
protected JposServiceConnection serviceConnection;
protected int serviceVersion;
protected boolean bOpen;
protected BaseService service;
//--------------------------------------------------------------------------
// Constructor
//--------------------------------------------------------------------------
public BaseJposControl()
{
// Initialize instance data. Initializations are commented out for
// efficiency if the Java default is correct.
//serviceConnection = null;
//serviceVersion = 0;
//bOpen = false;
}
//--------------------------------------------------------------------------
// Properties
//--------------------------------------------------------------------------
public String getCheckHealthText()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
return service.getCheckHealthText();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public boolean getClaimed()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
return service.getClaimed();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public String getDeviceControlDescription()
{
return deviceControlDescription;
}
public int getDeviceControlVersion()
{
return deviceControlVersion;
}
public boolean getDeviceEnabled()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
return service.getDeviceEnabled();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public void setDeviceEnabled(boolean deviceEnabled)
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
service.setDeviceEnabled(deviceEnabled);
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public String getDeviceServiceDescription()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
return service.getDeviceServiceDescription();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public int getDeviceServiceVersion()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
return service.getDeviceServiceVersion();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public boolean getFreezeEvents()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
return service.getFreezeEvents();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public void setFreezeEvents(boolean freezeEvents)
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
service.setFreezeEvents(freezeEvents);
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public String getPhysicalDeviceDescription()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
return service.getPhysicalDeviceDescription();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public String getPhysicalDeviceName()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
try
{
return service.getPhysicalDeviceName();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public int getState()
{
// Preset result to JposConst.JPOS_S_CLOSED
int nState = JposConst.JPOS_S_CLOSED;
// If control is opened, get state from Device Service
if(bOpen)
{
try
{
nState = service.getState();
}
catch(Exception e)
{
}
}
return nState;
}
//--------------------------------------------------------------------------
// Methods
//--------------------------------------------------------------------------
public void claim(int timeout)
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
// Perform the operation
try
{
service.claim(timeout);
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public synchronized void close()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
else
{
// Perform the operation
try
{
service.close();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
try
{
serviceConnection.disconnect();
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_NOSERVICE,
"Unable to free service connection",
e);
}
finally
{
setDeviceService(null, 0);
serviceConnection = null;
service = null;
serviceVersion = 0;
bOpen = false;
}
}
}
public void checkHealth(int level)
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
// Perform the operation
try
{
service.checkHealth(level);
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public void directIO(int command, int[] data, Object object)
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
// Perform the operation
try
{
service.directIO(command, data, object);
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
public synchronized void open(String logicalDeviceName)
throws JposException
{
// Make sure the control is not already open
if(bOpen)
{
throw new JposException(JposConst.JPOS_E_ILLEGAL, "Device Control already open");
}
// Use JCL to get a connection to the device service
try
{
serviceConnection = JposServiceLoader.findService(logicalDeviceName);
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_NOEXIST,
"Device profile not found", e);
}
try
{
serviceConnection.connect();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_NOSERVICE,
"Could not connect to service", e);
}
// Get an instance of the BaseService interface
try
{
service = (BaseService)serviceConnection.getService();
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_NOSERVICE,
"Could not get service instance", e);
}
// Now attempt to process the open command
JposException jposException = null;
boolean bRealOpenSucceeded = false;
try
{
// Create callback subclass and attach it to the device service
EventCallbacks callbacks = createEventCallbacks();
service.open(logicalDeviceName, callbacks);
// If we got this far, the real open call succeeded
bRealOpenSucceeded = true;
// If the open succeeds, remember the service instance and determine
// the actual service version
serviceVersion = service.getDeviceServiceVersion();
setDeviceService(service, serviceVersion);
// If everything worked to this point, the open has succeeded.
bOpen = true;
}
catch(JposException je)
{
jposException = je;
}
catch(Exception e)
{
jposException = new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service",
e);
}
// If the overall open failed, clean up then throw the specified exception
if(!bOpen)
{
// If the Device Service open call succeeded, close it
try
{
service.close();
}
catch(Exception e)
{
// Eat any exceptions - we're trying to clean up as best we can
}
// Attenpt to disconnect the service instance
try
{
serviceConnection.disconnect();
}
catch(Exception e)
{
// Eat any exceptions - we're trying to clean up as best we can
}
// Reset instance data to allow for another open attempt later
serviceConnection = null;
serviceVersion = 0;
// Now that we've cleaned up, throw the exception that caused all this
throw jposException;
}
}
public void release()
throws JposException
{
// Make sure control is opened
if(!bOpen)
{
throw new JposException(JposConst.JPOS_E_CLOSED, "Control not opened");
}
// Perform the operation
try
{
service.release();
}
catch(JposException je)
{
throw je;
}
catch(Exception e)
{
throw new JposException(JposConst.JPOS_E_FAILURE,
"Unhandled exception from Device Service", e);
}
}
//--------------------------------------------------------------------------
// Framework Methods
//--------------------------------------------------------------------------
// Create an EventCallbacks interface implementation object for this Control
abstract protected EventCallbacks createEventCallbacks();
// Store the reference to the Device Service
abstract protected void setDeviceService(BaseService service, int nServiceVersion)
throws JposException;
}