//===================================================================================
//
//    (C) COPYRIGHT International Business Machines Corp., 2002 All Rights Reserved
//    Licensed Materials - Property of IBM
//    US Government Users Restricted Rights - Use, duplication or
//    disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
//
//    IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
//    ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
//    PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
//    CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
//    USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
//    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
//    OR PERFORMANCE OF THIS SOFTWARE.
//
//    The program may be used, executed, copied, modified, and distributed
//    without royalty for the purpose of developing, using, marketing, or distributing.
// 
//=======================================================================================
// gSOAP v2 Interop B test round 2
#include "soapH.h"
extern "C" void displayText(char *text);
extern "C" int interopC(const char *site);


struct Namespace namespacesC[] =
{ {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"},
  {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"},
  {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance"},
  {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema"},
  {"m", "http://soapinterop.org/"},
  {"s", "http://soapinterop.org/xsd"},
  {"a", "http://xml.apache.org/xml-soap"},
  {"h", "http://soapinterop.org/echoheader/"},
  {NULL, NULL}
};
int interopC(const char *url)
{ struct soap *soap;
  char *site=(char*)url;
  bool ok=true;
  xsd__int n = 42;
  float f  = 3.40282e+38;
  struct SOAP_ENV__Header h;
  struct m__echoVoidResponse r;
  struct s__SOAPStruct s;

  h.h__echoMeStringRequest = NULL;
  h.h__echoMeStringRequest_ = NULL;
  h.h__echoMeStringResponse = NULL;
  h.h__echoMeStructRequest = NULL;
  h.h__echoMeStructRequest_ = NULL;
  h.h__echoMeStructResponse = NULL;
  h.h__someUnknownRequest = NULL;
  h.h__someUnknownRequest_ = NULL;
  s.varString = "hello world";
  s.varInt = &n;
  s.varFloat = &f;


  displayText("running test C on");
  displayText((char*)url);
  soap = soap_new();
  soap->namespaces = (struct Namespace *)namespacesC;

  soap->send_timeout = 300;
  soap->recv_timeout = 300;

  // request from client (with mustUnderstand="0", recipient is target)
  h.h__echoMeStringRequest = "hello world";
  soap->header = &h;
  soap->actor = "http://schemas.xmlsoap.org/soap/actor/next";
  if (soap_call_m__echoVoid(soap, site, "http://soapinterop.org/", r))
  { 
    displayText("echo1 failed");
    ok=false;
  }
  else
    displayText("echo1 passed");

  // request from client (with mustUnderstand="0", recipient is not target)
  soap->header = &h;
  soap->actor = "http://some/other/actor";
  if (soap_call_m__echoVoid(soap, site, "http://soapinterop.org/", r))
  { 
    displayText("echo2 failed");
    ok=false;
  }
  else
    displayText("echo2 passed");

  // request from client (with mustUnderstand="1", recipient is target)
  h.h__echoMeStringRequest = NULL;
  h.h__echoMeStructRequest_ = &s;
  soap->header = &h;
  soap->actor = "http://schemas.xmlsoap.org/soap/actor/next";
  if (soap_call_m__echoVoid(soap, site, "http://soapinterop.org/", r))
  { 
    displayText("echo3 failed");
    ok=false;
  }
  else
    displayText("echo3 passed");

  // request from client (with mustUnderstand="1", recipient is not target)
  soap->header = &h;
  soap->actor = "http://some/other/actor";
  if (soap_call_m__echoVoid(soap,site, "http://soapinterop.org/", r))
  { 
    displayText("echo4 failed");
    ok=false;
  }
  else if (soap->header && soap->header->h__echoMeStructResponse)
  { 
    displayText("echo4 should be no response header");
    ok=false;
   }
  else
    displayText("echo4 passed");

  // Unknown header element: request from client (with mustUnderstand="0", recipient is target)
  h.h__echoMeStructRequest_ = NULL;
  h.h__someUnknownRequest = "XYZ";
  soap->header = &h;
  soap->actor = "http://schemas.xmlsoap.org/soap/actor/next";
  if (soap_call_m__echoVoid(soap, site, "http://soapinterop.org/", r))
  { 
    displayText("echo5 failed");
    ok=false;
  }
  else
    displayText("echo5 passed");

  // Unknown header element: request from client (with mustUnderstand="1", recipient is target)
  h.h__someUnknownRequest = NULL;
  h.h__someUnknownRequest_ = "XYZ";
  soap->header = &h;
  soap->actor = "http://schemas.xmlsoap.org/soap/actor/next";
  if (soap_call_m__echoVoid(soap, site, "http://soapinterop.org/", r) != SOAP_MUSTUNDERSTAND)
  { 
    displayText("echo6 failed");
    ok=false;
  }
  else
    displayText("echo6 passed");

  // Unknown header element: request from client (with mustUnderstand="0", recipient is not target)
  h.h__someUnknownRequest_ = NULL;
  h.h__someUnknownRequest = "XYZ";
  soap->header = &h;
  soap->actor = "http://some/other/actor";
  if (soap_call_m__echoVoid(soap, site, "http://soapinterop.org/", r))
  { 
    displayText("echo7 failed");
    ok=false;
  }
  else
    displayText("echo7 passed");

  // Unknown header element: request from client (with mustUnderstand="1", recipient is not target)
  h.h__someUnknownRequest = NULL;
  h.h__someUnknownRequest_ = "XYZ";
  soap->header = &h;
  soap->actor = "http://some/other/actor";
  if (soap_call_m__echoVoid(soap, site, "http://soapinterop.org/", r))
  { 
    displayText("echo8 failed");
    ok=false;
  }
  else
    displayText("echo8 passed");


  if (ok)
  	displayText("All Passed");
  else
	  displayText("FAILURES");

  return 0;
}
