OpenVMS Source Code Demos
SIMPLE_SERVICE_CLIENT_100.C
#define VERSION "simple_service_client_100.2" // <<<--- change as required
//===============================================================================================================================
// title : simple_service_client_xxx.c
// author : Neil Rieck
// created: 2011-10-14
// Build : @build_simple_service_step1_common.com (only need to do this once for every new WSDL)
// @build_simple_service_step2_server.com
// @build_simple_service_step3_client.com
// Notes : Attention Hackers! be prepared to inspect file "GSOAP$ROOT:[000000.INCLUDE]stdsoap2.h"
// looking at the SOAP structure to find variable names then working backwards
//===============================================================================================================================
// history:
// ver who when what
// --- --- ------ ---------------------------------------------------------------------------------------------------------------
// 100 NSR 111014 1. initial work (new program)
// NSR 111015 2. more work
//
// remember to modify VERSION on the first line of this file
//===============================================================================================================================
#define PATH "csmis$root3:[dvlp._gsoap_simple_service_2011]" // our current development directory
#define NSR_DEBUG 0 // must link with gsoap$root:[lib]gsoapdbg.olb
#define NSR_STRICT 1 // XML must be well-formed and valid
#define PRODUCTION 0 // 1=Apache Server, 0=Green Screen Server
#if (PRODUCTION == 1) //
char server[] = "http://www.bellics.com/simple_service"; // served-up by Apache
#else //
char server[] = "127.0.0.1:8123"; //
#endif //
//
// import the usual stuff
//
#include <stdio.h> //
#include <stdlib.h> //
#include <string.h> //
#include <time.h> //
//
// stuff needed for our gSOAP app
//
#include "SIMPLE_SERVICE_GSC_H.H" // generated by tool "soapcpp2"
#include "SIMPLESERVICESOAP11BINDING.NSMAP" // generated by tool "soapcpp2"
//==============================================================================
// main
//==============================================================================
int gDcl; // global variable
void display_help(){
fprintf(stderr, "Example Usage: cmd ADD 123 456\n");
fprintf(stderr, "Example Usage: cmd SUBTRACT 123 456\n");
fprintf(stderr, "Example Usage: cmd ECHO \"this is a test\"\n");
}
int main(int argc, char **argv) //
{ int m, s; // master and slave sockets
char choice; //
int reqd_params; //
struct soap soap; //
//
// note: this command-line option stuff will only be used for developing skelton code.
// For production mode it might make more sense to build three stand-alone clients.
//
fprintf(stderr,"Program: %s\n",VERSION);
if (argc < 2){
display_help();
exit(0);
}
choice = *argv[1];
switch (choice) {
case 'a':
case 'A':
choice = 'a';
reqd_params = 3+1;
break;
case 's':
case 'S':
choice = 's';
reqd_params = 3+1;
break;
case 'e':
case 'E':
choice = 'e';
reqd_params = 2+1;
break;
default:
fprintf(stderr, "Unsupported operation\n");
display_help();
exit(0);
}
if (argc != reqd_params) {
fprintf(stderr, "Expected %d command line params but received %d\n",reqd_params, argc);
display_help();
exit(0);
}
soap_init(&soap); // magic
#if (NSR_DEBUG==1)
char logf1[255];
char logf2[255];
char logf3[255];
sprintf(logf1,"%s%s",PATH,"aaa_c_recv.log"); // for extensive client logging
sprintf(logf2,"%s%s",PATH,"aaa_c_sent.log"); //
sprintf(logf3,"%s%s",PATH,"aaa_c_test.log"); //
soap_set_recv_logfile(&soap, logf1); //
soap_set_sent_logfile(&soap, logf2); //
soap_set_test_logfile(&soap, logf3); //
#endif
#ifdef NSR_STRICT
printf("-i- set strict\n"); //
soap_set_imode(&soap, SOAP_XML_STRICT); // set input mode strict
#endif
printf("-i- server: %s\n",server);
//------------------------------------------------------------------------------
// "ssAdd"
//
// 1. the following declaration was found in file: SOAPCLIENT.C
// 2. it can also be found in file "SOAPSTUB.H" near "Client-Side Call Stubs"
//
// soap_call___ns2__ssAdd( struct soap *soap,
// const char *soap_endpoint,
// const char *soap_action,
// struct _ns1__ssAdd *ns1__ssAdd,
// struct _ns1__ssAddResponse *ns1__ssAddResponse)
//------------------------------------------------------------------------------
//trek1
if (choice == 'a') {
printf("firing: ssAdd\n"); //
struct _ns1__ssAdd myAddRequest; //
struct _ns1__ssAddResponse myAddResponse; //
int param0, param1;
param0 = strtod(argv[2], NULL);
param1 = strtod(argv[3], NULL);
myAddRequest.param0 = ¶m0; //
myAddRequest.param1 = ¶m1; //
soap_call___ns2__ssAdd(&soap, server, "", &myAddRequest, &myAddResponse);
if (soap.error) //
{ soap_print_fault(&soap, stderr); //
printf("oops\n"); //
exit(1); //
}else{
printf("cool\n");
printf("response: %d\n",*myAddResponse.return_);
}
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
printf("exiting\n");
return 1; // vms-ok
}
//------------------------------------------------------------------------------
// "ssSubtract"
//
// 1. the following declaration was found in file: SOAPCLIENT.C
// 2. it can also be found in file "SOAPSTUB.H" near "Client-Side Call Stubs"
//
// soap_call___ns2__ssSubtract( struct soap *soap,
// const char *soap_endpoint,
// const char *soap_action,
// struct _ns1__ssSubtract *ns1__ssSubtract,
// struct _ns1__ssSubtractResponse *ns1__ssSubtractResponse)
//------------------------------------------------------------------------------
//trek2
if (choice == 's') {
printf("firing: ssSubtract\n"); //
struct _ns1__ssSubtract mySubtractRequest; //
struct _ns1__ssSubtractResponse mySubtractResponse; //
int param3, param4;
param3 = strtod(argv[2], NULL);
param4 = strtod(argv[3], NULL);
mySubtractRequest.param0 = ¶m3; //
mySubtractRequest.param1 = ¶m4; //
soap_call___ns2__ssSubtract(&soap, server, "", &mySubtractRequest, &mySubtractResponse);
if (soap.error) //
{ soap_print_fault(&soap, stderr); //
printf("oops\n"); //
exit(1); //
}else{
printf("cool\n");
printf("response: %d\n",*mySubtractResponse.return_);
}
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
printf("exiting\n");
return 1; // vms-ok
}
//------------------------------------------------------------------------------
// "ssEcho"
//
// 1. the following declaration was found in file: SOAPCLIENT.C
// 2. it can also be found in file "SOAPSTUB.H" near "Client-Side Call Stubs"
//
// soap_call___ns2__ssEcho( struct soap *soap,
// const char *soap_endpoint,
// const char *soap_action,
// struct _ns1__ssEcho *ns1__ssEcho,
/// struct _ns1__ssEchoResponse *ns1__ssEchoResponse)
//------------------------------------------------------------------------------
//trek3
if (choice == 'e') {
printf("firing: ssEcho\n"); //
struct _ns1__ssEcho myEchoRequest; //
struct _ns1__ssEchoResponse myEchoResponse; //
myEchoRequest.param0 = argv[2]; //
soap_call___ns2__ssEcho(&soap, server, "", &myEchoRequest, &myEchoResponse);
if (soap.error) //
{ soap_print_fault(&soap, stderr); //
printf("oops\n"); //
exit(1); //
}else{
printf("cool\n");
printf("result: %s\n",myEchoResponse.return_);
}
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
printf("exiting\n");
return 1; // vms-ok
}
//
// catch-all
//
printf("Oops, nothing fired\n"); //
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
printf("exiting\n");
return 2; // vms-error
}