/* event.cpp C++-style client Events based on one-way SOAP messaging using HTTP keep-alive for persistent connections. C++ style with Proxy object. The 'synchronous' global flag illustrates SOAP one-way messaging, which requires an HTTP OK or HTTP Accept response with an empty body to be returned by the server. Compile: soapcpp2 -i event.h c++ -o event event.cpp stdsoap2.cpp soapC.cpp soapEventProxy.cpp Run (first start the event handler on localhost port 18000): event -------------------------------------------------------------------------------- gSOAP XML Web services tools Copyright (C) 2001-2008, Robert van Engelen, Genivia, Inc. All Rights Reserved. This software is released under one of the following two licenses: GPL or Genivia's license for commercial use. -------------------------------------------------------------------------------- GPL license. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author contact information: engelen@genivia.com / engelen@acm.org -------------------------------------------------------------------------------- A commercial use license is available from Genivia, Inc., contact@genivia.com -------------------------------------------------------------------------------- */ #include "soapEventProxy.h" #include "Event.nsmap" int synchronous = 1; /* synchronous=0: asynchronous one-way messaging over HTTP (no HTTP response) */ /* synchronous=1: SOAP interoperable synchronous one-way messaging over HTTP */ /* Service details (copied from event.h): */ const char *event_handler_endpoint = "http://localhost:18000"; const char *event_handler_action = "event"; int main() { EventProxy e(SOAP_IO_KEEPALIVE | SOAP_XML_INDENT); // Events A to C do not generate a response from the server fprintf(stderr, "Client Sends Event: A\n"); if (e.send_handle(EVENT_A)) e.soap_print_fault(stderr); else if (synchronous && e.recv_handle_empty_response()) e.soap_print_fault(stderr); fprintf(stderr, "Client Sends Event: B\n"); if (e.send_handle(EVENT_B)) e.soap_print_fault(stderr); else if (synchronous && e.recv_handle_empty_response()) e.soap_print_fault(stderr); // connection should not be kept alive after the last call: be nice to the server and tell it that we close the connection after this call soap_clr_omode(&e, SOAP_IO_KEEPALIVE); fprintf(stderr, "Client Sends Event: C\n"); if (e.send_handle(EVENT_C)) e.soap_print_fault(stderr); else if (synchronous && e.recv_handle_empty_response()) e.soap_print_fault(stderr); e.soap_close_socket(); // Re-enable keep-alive soap_set_omode(&e, SOAP_IO_KEEPALIVE); // Events Z generates a series of responses from the server fprintf(stderr, "Client Sends Event: Z\n"); if (e.send_handle(EVENT_Z)) e.soap_print_fault(stderr); else { struct ns__handle response; for (;;) { if (!soap_valid_socket(e.socket)) { fprintf(stderr, "Connection was terminated (keep alive disabled?)\n"); break; } if (e.recv_handle(response)) { if (e.error == SOAP_EOF) fprintf(stderr, "Connection was gracefully closed by server\n"); else e.soap_print_fault(stderr); break; } else { switch (response.event) { case EVENT_A: fprintf(stderr, "Client Received Event: A\n"); break; case EVENT_B: fprintf(stderr, "Client Received Event: B\n"); break; case EVENT_C: fprintf(stderr, "Client Received Event: C\n"); break; case EVENT_Z: fprintf(stderr, "Client Received Event: Z\n"); break; } } } } return 0; }