115 lines
2.8 KiB
C++

//----------------------------------------------------------------------------
//
// Copyright (C) Intel Corporation, 2006 - 2010.
//
// File: TunnelHandler.h
//
// Contents: Handles Soap connection
//
// Notes:
//----------------------------------------------------------------------------
#include "SoapServerHandler.h"
#include "global.h"
#include "OptionsUtils.h"
// Constructor
SOAP_Server_Handler::SOAP_Server_Handler(void):
flg_mask_ (ACE_Event_Handler::NULL_MASK)
{
}
SOAP_Server_Handler::~SOAP_Server_Handler(void)
{
ACE_DEBUG((MY_DEBUG
ACE_TEXT("--->SOAP_Server_Handler dtor\n")));
SOAP_COUNTER.Decrement();
peer().close();
}
// Receive and process incoming SOAP request.
int SOAP_Server_Handler::handle_input (ACE_HANDLE)
{
ACE_TRACE(ACE_TEXT("SOAP_Server_Handler::handle_input"));
ACE_DEBUG((MY_TRACE
ACE_TEXT ("SOAP_Server_Handler::handle_input - (%x)\n"), this));
if (!SoapServer.RunServer((SOAP_SOCKET)this->get_handle()))
return -1;
return 0;
}
// handle close
int SOAP_Server_Handler::handle_close(ACE_HANDLE, ACE_Reactor_Mask close_mask)
{
ACE_TRACE(ACE_TEXT("SOAP_Server_Handler::handle_close"));
ACE_DEBUG((MY_TRACE ACE_TEXT("SOAP_Server_Handler handle_close (%x)\n"), this));
// We will only receive a close on a read, since gSoap is handling the output
if (ACE_BIT_ENABLED (close_mask, ACE_Event_Handler::READ_MASK))
{
peer().close_reader();
}
ACE_Reactor * TPReactor = ACE_Reactor::instance ();
TPReactor->remove_handler (this,
ACE_Event_Handler::ALL_EVENTS_MASK |
ACE_Event_Handler::DONT_CALL); // Don't call handle_close
this->reactor(0);
this->destroy();
return 0;
}
// Upcall from the <ACE_Acceptor> that delegates
// control to our Connection_Handler.
int SOAP_Server_Handler::open(void *)
{
ACE_TRACE(ACE_TEXT("SOAP_Server_Handler::open"));
if (!SOAP_COUNTER.IncrementCheckMax()){
ACE_DEBUG((MY_INFO ACE_TEXT("Connection closed. Maximum number of %d SOAP tunnels exceeded.\n"),MAX_SOAP_COUNTER));
return -1;
}
if (initiate_io (ACE_Event_Handler::READ_MASK) != STATUS_SUCCESS)
{
ACE_DEBUG((MY_DEBUG
ACE_TEXT("SOAP_Server_Handler failed to initiate_io with READ_MASK\n")));
return -1;
}
return 0;
}
int SOAP_Server_Handler::handle_output (ACE_HANDLE)
{
return 0;
}
// Schedule this handle for a new events (given in mask)
STATUS SOAP_Server_Handler::initiate_io (ACE_Reactor_Mask mask)
{
ACE_TRACE(ACE_TEXT("SOAP_Server_Handler::initiate_io"));
if (ACE_BIT_ENABLED (flg_mask_, mask))
{
return STATUS_SUCCESS;
}
if (ACE_Reactor::instance()->register_handler(this, mask) == -1)
{
ACE_DEBUG((MY_DEBUG ACE_TEXT("SOAP_Server_Handler::initiate_io - failed to register to reactor for READ mask\n")));
return STATUS_FATAL_ERROR;
}
ACE_SET_BITS (flg_mask_, mask);
return STATUS_SUCCESS;
}