115 lines
2.8 KiB
C++
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;
|
|
}
|
|
|