//=========================================================================
// Summary  : */
// Filename : TaskInterface.cc
// Author   : Tom O'Reilly                                                  */
// Project  : */
// Revision : 1
// Created  : 2000/08/19
// Modified : 2000/08/19
//=========================================================================
// Description :
//=========================================================================
#include <stdio.h>
#include <unistd.h>
#include <sys/proxy.h>
#include <sys/kernel.h>
#include "TaskInterface.h"
#include "TaskServer.h"
#include "Syslog.h"

//AMM
//TaskInterface::TaskInterface(const char *name, const char *serverName,
//			     int serverConnectTimeout)

TaskInterface::TaskInterface(const char *name, int foo, const char *serverName,
			     int serverConnectTimeout)
  : SharedObjectClient(name, serverName, serverConnectTimeout)
{
}


TaskInterface::TaskInterface(const char *name)
  : SharedObjectClient(name)
{
}


TaskInterface::~TaskInterface()
{
}


void TaskInterface::subscribe(EventCode eventCode, pid_t remoteProxyPid)
{
  if (!connected())
    findServer();

  Boolean debug = False;

  // Send subscription message to server.
  Subscription subscription;
  if ( remoteProxyPid == -1 )
  {
      subscription.subscriberPid = getpid();
      subscription.otherNode = False;
  }
  else
  {
      subscription.subscriberPid = remoteProxyPid;
      subscription.otherNode = True;
  }
  subscription.eventCode = eventCode;
  SubscriptionReply reply;

  dprintf("TaskInterface::subscribe() - "
	  "send subscription msg, subscriber=%d\n",
	  subscription.subscriberPid);

  while (True) {
    try {
      send(&subscription, sizeof(Subscription),
	   &reply, sizeof(SubscriptionReply));

    } catch (...) {
      // Wait, then keep trying
      sleep(1);
      continue;
    }
    // Successfully sent
    break;
  }

  dprintf("TaskInterface::subscribe() - sent.\n");

  // Subscription rejected for some reason
  if (!reply.confirmed) {
    throw Error("Subscription rejected");
  }
}


EventCode TaskInterface::waitForEvent()
{
  Boolean debug = False;
  while (True) {

    TaskServer::Event event;

    dprintf("TaskInterface::waitForEvent() - wait for msg\n");

    pid_t sender = Receive(AnyPid, (void *)&event, sizeof(TaskServer::Event));

    // If message is not actually an event generated by server,
    // it will be discarded, and we'll wait for the next one.
    if (event.marker == EventMarkerCode) {
      // This is a bonafide Event message

      // Remove the proxy
      dprintf("TaskInterface::waitForEvent() - detaching proxy %d.", sender );

      if (qnx_proxy_detach(sender) == -1) {
	      Syslog::write("TaskInterface::waitForEvent() - %s\n", strerror(errno));
      }

      return event.eventCode;
    }
  }
}


void TaskInterface::shutdown()
{
}


void TaskInterface::sendExternalMsg(ExternalMethodMessage *message)
{
}
