//---------------------------------------------------------------------------- // // 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 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; }