#include <string.h>
#include "ServerControlSource.h"

inline MBool ServerControlSource::isActive()
{
  return _active;
}


ServerControlSource::ServerControlSource(int index, SEM_ID wakeupSem) 
  : DmControlSource(index)
{
  setServerRole(wakeupSem);
  
  // ServerControlSource starts in inactive state
  deactivate();
}



ServerControlSource::~ServerControlSource()
{
}



MBool ServerControlSource::aperiodicUpdate() 
{
  AperiodicRequest request;

  readRequest(&request);

  if (isNewClient(&request)) {
    // Clean up after previous client
    deactivate();
  }

  // Since we've got at least one aperiodic request, client is now active
  if (!isActive())
    activate(&request);

  // Find changes in requested state and process
  RequestStatus status;
  processAperiodicRequest(&request, &status);

  writeStatus(&status);
 
  // Save request
  saveRequest(&request);

  return TRUE;
}


MBool ServerControlSource::periodicUpdate() 
{
  PeriodicRequest request;

  readRequest(&request);

  // Find changes in requested state and process
  RequestStatus status;
  processPeriodicRequest(&request, &status);

  if (isNewRequest(&request))
  {
    writeStatus(&status);

    // Save request
    saveRequest(&request);

    return TRUE;
  }
  else

  return FALSE;
}


void ServerControlSource::activate(AperiodicRequest *request) 
{
  // Mark source as having client
  _active = TRUE;

  bzero((char *)&_prevAperiodicRequest, sizeof(AperiodicRequest));
  bzero((char *)&_prevPeriodicRequest, sizeof(PeriodicRequest));
}


void ServerControlSource::deactivate()
{
  // Mark source as having no client
  _active = FALSE;

  bzero((char *)&_prevAperiodicRequest, sizeof(AperiodicRequest));
  bzero((char *)&_prevPeriodicRequest, sizeof(PeriodicRequest));
}


void ServerControlSource::saveRequest(AperiodicRequest *request)
{
  bcopy((char *)request, (char *)&_prevAperiodicRequest, 
	sizeof(AperiodicRequest));
}


void ServerControlSource::saveRequest(PeriodicRequest *request)
{
  bcopy((char *)request, (char *)&_prevPeriodicRequest, 
	sizeof(PeriodicRequest));
}




MBool ServerControlSource::isNewRequest(PeriodicRequest *request)
{
  return DmControlSource::isNewRequest(request, &_prevPeriodicRequest);
}



MBool ServerControlSource::isNewClient(AperiodicRequest *request)
{
  return DmControlSource::isNewClient(request, &_prevAperiodicRequest);
}

