blob: 82d7f26ec0414642d09afdefc6d1fd08fcd5e9be [file] [log] [blame]
/* varparam.cpp
Example use of variable parameter lists with the full XML
schema type hierarchy implemented as a C++ class hierarchy.
Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved.
Demonstrates the use of variable number of parameters and polymorphic
parameters. The 'trick' is to use __size parameters. The __size fields
can be used in structs/classes to embed arrays. Because a request message
of a remote method is essentially a struct, the use of __size in
parameters of a method has the effect of sending a variable number of
parameters.
Use option -i with soapcpp2 to compile the header file varparam.h
Run the executable as client from the command line with one argument
to test the polymorphic parameter exchange. Run with more arguments
to send the arguments as a variable parameter list to the server.
*/
#include "soapH.h"
#include "varparam.nsmap"
char *endpoint = "http://websrv.cs.fsu.edu/~engelen/varparam.cgi";
#define N 100 // max number of parameters
int main(int argc, char **argv)
{ struct soap soap;
struct ns__varPolyParamTestResponse r;
int n;
xsd__anyType *p[N]; // array of polymorphic parameters
soap_init(&soap);
if (argc < 2)
{ soap_serve(&soap);
soap_destroy(&soap);
soap_end(&soap);
return 0;
}
if (argc < 3)
{ p[0] = new xsd__anyURI(endpoint);
p[1] = new xsd__string(argv[1]);
p[2] = new xsd__boolean(true);
p[3] = new xsd__dateTime(time(NULL));
p[4] = new xsd__double(1234567.89);
p[5] = new xsd__base64Binary("encoded in base64");
p[6] = new xsd__hexBinary("encoded in hex");
p[7] = new array(4);
(*p[7])[0] = new xsd__int(7);
(*p[7])[1] = NULL;
(*p[7])[2] = new xsd__token("x");
(*p[7])[3] = p[1];
p[8] = p[1];
n = 9; // actual number of parameters
if (soap_call_ns__varPolyParamTest(&soap, endpoint, "", n, p, r))
soap_print_fault(&soap, stderr);
else
{ std::cout << "Server has echoed:" << std::endl;
for (int i = 0; i < r.__size; i++)
r.param[i]->print(std::cout);
std::cout << std::endl;
}
for (int i = 0; i < n; i++)
delete p[i];
}
else
{ if (soap_call_ns__varStringParamTest(&soap, endpoint, "", argc, argv, n))
soap_print_fault(&soap, stderr);
else
printf("Server has responded to %d strings\n", n);
}
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
return 0;
}
////////////////////////////////////////////////////////////////////////////////
//
// Remote method implementations
//
////////////////////////////////////////////////////////////////////////////////
int ns__varStringParamTest(struct soap *soap, int __size, char **param, int &return_)
{ return_ = __size;
return SOAP_OK;
}
int ns__varPolyParamTest(struct soap *soap, int __size, xsd__anyType **param, struct ns__varPolyParamTestResponse &out)
{ out.__size = __size;
out.param = param;
return SOAP_OK;
}
////////////////////////////////////////////////////////////////////////////////
//
// XSD schema class hierarchy
//
////////////////////////////////////////////////////////////////////////////////
xsd__anyType::xsd__anyType()
{ soap = NULL; // This will be set by gSOAP environment later (upon deserialization or calling soap_new_X()
}
xsd__anyType::~xsd__anyType()
{ soap_unlink(soap, this); // Let gSOAP not deallocate this object again if this object was explicitly removed
}
xsd__anyType*& xsd__anyType::operator[](int i)
{ static xsd__anyType *p = this; // trick: we don't expect the operator to be applied, but we need a method
return p;
}
void xsd__anyType::print(std::ostream &s) const
{ s << "<anyType>"; }
xsd__anySimpleType::xsd__anySimpleType()
{ }
xsd__anySimpleType::~xsd__anySimpleType()
{ }
void xsd__anySimpleType::print(std::ostream &s) const
{ s << "<anySimpleType>"; }
xsd__anyURI::xsd__anyURI()
{ }
xsd__anyURI::~xsd__anyURI()
{ }
xsd__anyURI::xsd__anyURI(char *s)
{ __item = s; }
void xsd__anyURI::print(std::ostream &s) const
{ s << "<anyURI=" << (__item ? __item : "(null)") << ">"; }
xsd__boolean::xsd__boolean()
{ }
xsd__boolean::~xsd__boolean()
{ }
xsd__boolean::xsd__boolean(bool b)
{ __item = b; }
void xsd__boolean::print(std::ostream &s) const
{ s << "<boolean=" << __item << ">"; }
xsd__date::xsd__date()
{ }
xsd__date::~xsd__date()
{ }
xsd__date::xsd__date(char *s)
{ __item = s; }
void xsd__date::print(std::ostream &s) const
{ s << "<date=" << (__item ? __item : "(null)") << ">"; }
xsd__dateTime::xsd__dateTime()
{ }
xsd__dateTime::~xsd__dateTime()
{ }
xsd__dateTime::xsd__dateTime(time_t t)
{ __item = t; }
void xsd__dateTime::print(std::ostream &s) const
{ s << "<dateTime=" << __item << ">"; }
xsd__double::xsd__double()
{ }
xsd__double::~xsd__double()
{ }
xsd__double::xsd__double(double d)
{ __item = d; }
void xsd__double::print(std::ostream &s) const
{ s << "<double=" << __item << ">"; }
xsd__duration::xsd__duration()
{ }
xsd__duration::~xsd__duration()
{ }
xsd__duration::xsd__duration(char *s)
{ __item = s; }
void xsd__duration::print(std::ostream &s) const
{ s << "<duration=" << (__item ? __item : "(null)") << ">"; }
xsd__float::xsd__float()
{ }
xsd__float::~xsd__float()
{ }
xsd__float::xsd__float(float f)
{ __item = f; }
void xsd__float::print(std::ostream &s) const
{ s << "<float=" << __item << ">"; }
xsd__time::xsd__time()
{ }
xsd__time::~xsd__time()
{ }
xsd__time::xsd__time(char *s)
{ __item = s; }
void xsd__time::print(std::ostream &s) const
{ s << "<time=" << (__item ? __item : "(null)") << ">"; }
xsd__string::xsd__string()
{ }
xsd__string::~xsd__string()
{ }
xsd__string::xsd__string(char *s)
{ __item = s; }
void xsd__string::print(std::ostream &s) const
{ s << "<string=" << (__item ? __item : "(null)") << ">"; }
xsd__normalizedString::xsd__normalizedString()
{ }
xsd__normalizedString::~xsd__normalizedString()
{ }
xsd__normalizedString::xsd__normalizedString(char *s)
{ __item = s; }
void xsd__normalizedString::print(std::ostream &s) const
{ s << "<normalizedString=" << (__item ? __item : "(null)") << ">"; }
xsd__token::xsd__token()
{ }
xsd__token::~xsd__token()
{ }
xsd__token::xsd__token(char *s)
{ __item = s; }
void xsd__token::print(std::ostream &s) const
{ s << "<token=" << (__item ? __item : "(null)") << ">"; }
xsd__decimal::xsd__decimal()
{ }
xsd__decimal::~xsd__decimal()
{ }
xsd__decimal::xsd__decimal(char *s)
{ __item = s; }
void xsd__decimal::print(std::ostream &s) const
{ s << "<decimal=" << (__item ? __item : "(null)") << ">"; }
xsd__integer::xsd__integer()
{ }
xsd__integer::~xsd__integer()
{ }
xsd__integer::xsd__integer(char *s)
{ __item = s; }
void xsd__integer::print(std::ostream &s) const
{ s << "<integer=" << (__item ? __item : "(null)") << ">"; }
xsd__nonPositiveInteger::xsd__nonPositiveInteger()
{ }
xsd__nonPositiveInteger::~xsd__nonPositiveInteger()
{ }
xsd__nonPositiveInteger::xsd__nonPositiveInteger(char *s)
{ __item = s; }
void xsd__nonPositiveInteger::print(std::ostream &s) const
{ s << "<nonPositiveInteger=" << (__item ? __item : "(null)") << ">"; }
xsd__negativeInteger::xsd__negativeInteger()
{ }
xsd__negativeInteger::~xsd__negativeInteger()
{ }
xsd__negativeInteger::xsd__negativeInteger(char *s)
{ __item = s; }
void xsd__negativeInteger::print(std::ostream &s) const
{ s << "<negativeInteger=" << (__item ? __item : "(null)") << ">"; }
xsd__nonNegativeInteger::xsd__nonNegativeInteger()
{ }
xsd__nonNegativeInteger::~xsd__nonNegativeInteger()
{ }
xsd__nonNegativeInteger::xsd__nonNegativeInteger(char *s)
{ __item = s; }
void xsd__nonNegativeInteger::print(std::ostream &s) const
{ s << "<nonNegativeInteger=" << (__item ? __item : "(null)") << ">"; }
xsd__positiveInteger::xsd__positiveInteger()
{ }
xsd__positiveInteger::~xsd__positiveInteger()
{ }
xsd__positiveInteger::xsd__positiveInteger(char *s)
{ __item = s; }
void xsd__positiveInteger::print(std::ostream &s) const
{ s << "<positiveInteger=" << (__item ? __item : "(null)") << ">"; }
xsd__long::xsd__long()
{ }
xsd__long::~xsd__long()
{ }
xsd__long::xsd__long(LONG64 ll)
{ __item = ll; }
void xsd__long::print(std::ostream &s) const
{ s << "<long=" << __item << ">"; }
xsd__int::xsd__int()
{ }
xsd__int::~xsd__int()
{ }
xsd__int::xsd__int(int i)
{ __item = i; }
void xsd__int::print(std::ostream &s) const
{ s << "<int=" << __item << ">"; }
xsd__short::xsd__short()
{ }
xsd__short::~xsd__short()
{ }
xsd__short::xsd__short(short h)
{ __item = h; }
void xsd__short::print(std::ostream &s) const
{ s << "<short=" << __item << ">"; }
xsd__byte::xsd__byte()
{ }
xsd__byte::~xsd__byte()
{ }
xsd__byte::xsd__byte(char c)
{ __item = c; }
void xsd__byte::print(std::ostream &s) const
{ s << "<byte=" << __item << ">"; }
xsd__unsignedLong::xsd__unsignedLong()
{ }
xsd__unsignedLong::~xsd__unsignedLong()
{ }
xsd__unsignedLong::xsd__unsignedLong(ULONG64 ull)
{ __item = ull; }
void xsd__unsignedLong::print(std::ostream &s) const
{ s << "<unsignedLong=" << __item << ">"; }
xsd__unsignedInt::xsd__unsignedInt()
{ }
xsd__unsignedInt::~xsd__unsignedInt()
{ }
xsd__unsignedInt::xsd__unsignedInt(unsigned int ui)
{ __item = ui; }
void xsd__unsignedInt::print(std::ostream &s) const
{ s << "<unsignedInt=" << __item << ">"; }
xsd__unsignedShort::xsd__unsignedShort()
{ }
xsd__unsignedShort::~xsd__unsignedShort()
{ }
xsd__unsignedShort::xsd__unsignedShort(unsigned short uh)
{ __item = uh; }
void xsd__unsignedShort::print(std::ostream &s) const
{ s << "<unsignedShort=" << __item << ">"; }
xsd__unsignedByte::xsd__unsignedByte()
{ }
xsd__unsignedByte::~xsd__unsignedByte()
{ }
xsd__unsignedByte::xsd__unsignedByte(unsigned char uc)
{ __item = uc; }
void xsd__unsignedByte::print(std::ostream &s) const
{ s << "<unsignedByte=" << __item << ">"; }
xsd__base64Binary::xsd__base64Binary()
{ }
xsd__base64Binary::~xsd__base64Binary()
{ }
xsd__base64Binary::xsd__base64Binary(char *s)
{ __size = strlen(s)+1;
__ptr = (unsigned char*)s;
}
void xsd__base64Binary::print(std::ostream &s) const
{ s << "<base64Binary=" << __size << " bytes>"; }
xsd__hexBinary::xsd__hexBinary()
{ }
xsd__hexBinary::~xsd__hexBinary()
{ }
xsd__hexBinary::xsd__hexBinary(char *s)
{ __size = strlen(s)+1;
__ptr = (unsigned char*)s;
}
void xsd__hexBinary::print(std::ostream &s) const
{ s << "<hexBinary=" << __size << " bytes>"; }
array::array()
{ }
array::~array()
{ }
array::array(int n)
{ __size = n;
__ptr = (xsd__anyType**)soap_malloc(soap, n*sizeof(xsd__anyType*));
}
xsd__anyType*& array::operator[](int i)
{ return __ptr[i];
}
void array::print(std::ostream &s) const
{ s << "<array=";
for (int i = 0; i < __size; i++)
if (__ptr[i])
__ptr[i]->print(s);
else
s << "<[none]>";
s << ">";
}