#ifndef _SERVERCONTROLSOURCE_H
#define _SERVERCONTROLSOURCE_H

#include "DmControlSource.h"

/*
Class: ServerControlSource

Description: Provides interface between clients and internal Iview server 
objects. Subclass of DmControlSource.
*/
class ServerControlSource : public DmControlSource {

  public:

  ServerControlSource(int index, SEM_ID wakeupSem);
  ~ServerControlSource();

  // Process aperiodic request. Return TRUE if state change detected.
  MBool aperiodicUpdate();

  // Process periodic request. Return TRUE if state change detected.
  MBool periodicUpdate();

  // Return TRUE if ControlSource is active, else FALSE. ControlSource is
  // "active" if aperiodic request item has a provider, and that provider has
  // issued at least one aperiodic request.
  MBool isActive();
  
  // Activate ControlSource; initialize internal data
  virtual void activate(AperiodicRequest *request);

  // De-activate ControlSource; clean up, free resources
  virtual void deactivate();


  protected:

  // Return TRUE if client issuing request differs from most recent one
  MBool isNewClient(AperiodicRequest *request);
  
  // Return TRUE if request differs from most recent one
  MBool isNewRequest(PeriodicRequest *request);

  // Copy AperiodicRequest
  void saveRequest(AperiodicRequest *request);

  // Copy PeriodicRequest
  void saveRequest(PeriodicRequest *request);

  // ControlSource's aperiodic request item has a provider, and at that 
  // provider has issued at least one aperiodic request.
  MBool _active; 

  // Most recent AperiodicRequest
  AperiodicRequest _prevAperiodicRequest;

  // Most recent PeriodicRequest
  PeriodicRequest _prevPeriodicRequest;

  // Determine change(s) in requested state and process
  virtual void processAperiodicRequest(AperiodicRequest *request, 
                                       RequestStatus *status) = 0;

  // Determine change(s) in requested state and process
  virtual void processPeriodicRequest(PeriodicRequest *request, 
                                      RequestStatus *status) = 0;
};

#endif
