/* -*-C++-*-
 *****************************************************************************
 *
 * File:         NAIpc.C
 * Description:  Interprocess communication among SQL/ARK processes. Defines
 *               servers, requestors, and messages.
 *               
 * Created:      10/17/95
 * Language:     C++
 *
 *
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
 *
 *
 *****************************************************************************
 */

// -----------------------------------------------------------------------
#include "Platform.h"

#include "NAIpc.h"


// -----------------------------------------------------------------------
// A method that implements a global variable for the IPC environment
// -----------------------------------------------------------------------
IpcEnvironment *GetIpcEnv()
{

  // a static (global) pointer to the environment that IPC routines need
  static IpcEnvironment *NAIpcEnvironment = NULL;

  if (NAIpcEnvironment == NULL)
    {
      NAIpcEnvironment = new IpcEnvironment();
    }

  return NAIpcEnvironment;
}

// -----------------------------------------------------------------------
// How many requestors do we have (if we are a server process)
// -----------------------------------------------------------------------

Lng32 GetNumRequestors()
{
  IpcEnvironment *e = GetIpcEnv();
  IpcControlConnection *cc = e->getControlConnection();

  if (cc == NULL)
    return 0;
  else
    return cc->getNumRequestors();
}

// -----------------------------------------------------------------------
// methods for class NASingleServer
// -----------------------------------------------------------------------

NASingleServer::NASingleServer(ComDiagsArea **diags,
			       CollHeap *diagsHeap,
			       IpcServerType serverType,
			       const char *node,
			       IpcServerAllocationMethod allocationMethod)
{
  NAString serverName;

  sc_ = new IpcServerClass(GetIpcEnv(),serverType,allocationMethod);
  s_ = sc_->allocateServerProcess(diags,diagsHeap,node);
}

// -----------------------------------------------------------------------
// methods for class NAMessage
// -----------------------------------------------------------------------

NAMessage::NAMessage(IpcNetworkDomain domain) :
     IpcMessageStream(GetIpcEnv(),
		      IPC_MSG_INVALID,
		      100,
		      0,
		      TRUE)
{
  // the message will be using the control connection of the server
  // check whether the control connection exists already

  IpcControlConnection *cc = GetIpcEnv()->getControlConnection();
  if (cc == NULL)
    {
      switch (domain)
	{
	case IPC_DOM_GUA_PHANDLE:

	  // open $RECEIVE
	  cc = new(GetIpcEnv()) GuaReceiveControlConnection(GetIpcEnv(),5);

	  // wait for the open message of the client
	  while (cc->getConnection() == NULL)
	    cc->castToGuaReceiveControlConnection()->wait(IpcInfiniteTimeout);
	  break;

	case IPC_DOM_INTERNET:

	  // open a connection on the stdin/stdout socket
	  cc = new(GetIpcEnv()) SockControlConnection(GetIpcEnv());
	  break;

	default:
	  ABORT("Invalid domain specified in NAMessage::NAMessage()");
	}
      GetIpcEnv()->setControlConnection(cc);
    }

  // can't have requestors from two different domains in the same process
  // (note that it is possible to talk to servers in different domains)
  assert(domain == cc->getDomain());

  // associate the control connection with the message stream
  addRecipient(cc->getConnection());
}

NAMessage::NAMessage(
     NASingleServer *destination) : IpcMessageStream(GetIpcEnv(),
						     IPC_MSG_INVALID,
						     100,
						     0,
						     TRUE)
{
  // add a single recipient to the message
  addRecipient(destination->s_->getControlConnection());
}

void NAMessage::clear()
{
  // clear all objects, don't reset the communications partners, since
  // they are specified in the constructor, so we can only delete them
  // by deleting the object itself
  clearAllObjects();
}

void NAMessage::send(NABoolean wait)
{
  IpcMessageStream::send(wait);
}

void NAMessage::receive(NABoolean wait)
{
  IpcMessageStream::receive(wait);
}

