// ATM Simulation Implementation - Individual Sessions

ATM Simulation Implementation - Individual Sessions


/*
 * Example ATM simulation - file session.cc
 *
 * This file implements the class that represents a single customer session
 * with the ATM, declared in session.h
 *
 * Copyright (c) 1996 - Russell C. Bjork
 *
 */

#include "sysdep.h"
#include "bank.h"
#include "session.h"
#include "transaction.h"
#include "atm.h"


//


Session::Session(int cardNumber)
  : _state(RUNNING),
    _cardNumber(cardNumber)
  { }


//


void Session::doSessionUseCase()
  {
    _PIN = theATM.getPIN();

    do
      {
	_currentTransaction = 
	    Transaction::makeTransaction(theATM.getTransactionChoice(), * this);
	_currentTransaction -> doTransactionUseCase();
	delete _currentTransaction;
      }
    while (_state == RUNNING && theATM.getDoAnotherTransactionChoice());

    if (_state != ABORTED) 
	theATM.ejectCard();
  }


//


Bank::ApprovalCode Session::doInvalidPINExtension()
  { 
    Bank::ApprovalCode code;
    for (int i = 0; i < 3; i ++)
      { _PIN = theATM.reEnterPIN();
	code = _currentTransaction -> sendToBank();     
	if (code != Bank::INVALID_PIN)
	    return code;
      }
    theATM.retainCard();
    _state = ABORTED;
  }


//


int Session::cardNumber() const
  { return _cardNumber; }


//


int Session::PIN() const
  { return _PIN; }

//