/*

mtom-test.c

This application includes a MTOM test client and server. As a client
application, it fires four different base64 or MTOM attachments to the server.
As a server, it will respond to the messages by converting base64 into MTOM
attachments and vice versa.

Usage (server):
mtom-test <port>

Usage (client):
mtom-test http://localhost:<port> "<message>" "<MIME-type>"

Usage (client):
mtom-test http://localhost:<port> "<message>" "<MIME-type>" "<message2>" "<message3>" ...

--------------------------------------------------------------------------------
gSOAP XML Web services tools
Copyright (C) 2001-2004, 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 "soapH.h"
#include "mtom_test.nsmap"

int cgi_serve();
int run_serve(int port);
int run_tests(int,char**);

int main(int argc, char **argv)
{ if (argc < 2)
    return cgi_serve();
  if (argc < 3)
    return run_serve(atoi(argv[1]));
  return run_tests(argc, argv);
}

int cgi_serve()
{ /* CGI-style: serve request from stdin */
  return soap_serve(soap_new1(SOAP_ENC_MTOM)); /* enable MTOM XOP attachments */
}

int run_serve(int port)
{ struct soap *soap = soap_new1(SOAP_ENC_MTOM);
  int ret;
  if (!soap_valid_socket(soap_bind(soap, NULL, port, 100)))
    soap_print_fault(soap, stderr);
  else
  { fprintf(stderr, "Bind to port %d successful\n", port);
    soap->accept_timeout = 3600; /* let server time out after one hour */
    for (;;)
    { int sock = soap_accept(soap);
      if (!soap_valid_socket(sock))
      { if (soap->errnum)
          soap_print_fault(soap, stderr);
        else
        { fprintf(stderr, "Server timed out\n");
          break;
        }
      }
      fprintf(stderr, "Accepting socket %d connection from IP %d.%d.%d.%d... ", sock, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF);
      if (soap_serve(soap))
        soap_print_fault(soap, stderr);
      fprintf(stderr, "done\n");
      soap_destroy(soap);
      soap_end(soap);
    } 
  }
  ret = soap->error;
  soap_done(soap);
  free(soap);
  return ret;
}

int run_tests(int argc, char **argv)
{ struct soap *soap = soap_new1(SOAP_ENC_MTOM);
  int i, ret;
  struct x__DataType data;
  struct x__WrapperType wrap;
  struct __m__EchoTestSingleResponse single;
  struct __m__EchoTestMultipleResponse multiple;
  soap_default_x__DataType(soap, &data);
  soap_default_x__WrapperType(soap, &wrap);

  /* First test call */
  data.__union = SOAP_UNION_x__data_base64;
  data.choice.base64.__ptr = (unsigned char*)argv[2];
  data.choice.base64.__size = (int)strlen(argv[2]) + 1;
  if (argc > 3)
    data.xmlmime__contentType = argv[3];
  if (soap_call___m__EchoTestSingle(soap, argv[1], NULL, &data, &single))
    soap_print_fault(soap, stderr);
  else
  { if (!single.x__Data || single.x__Data->__union != SOAP_UNION_x__data_xop__Include || !single.x__Data->choice.xop__Include.__ptr || single.x__Data->choice.xop__Include.__size != data.choice.base64.__size || strcmp((char*)single.x__Data->choice.xop__Include.__ptr, (char*)data.choice.base64.__ptr))
      fprintf(stderr, "EchoTestSingle 1: data transcription error\n");
    else
      fprintf(stderr, "EchoTestSingle 1: OK\n");
    /* Second test call */
    data.__union = SOAP_UNION_x__data_xop__Include;
    data.choice.xop__Include.__ptr = (unsigned char*)argv[2];
    data.choice.xop__Include.__size = (int)strlen(argv[2]) + 1;
    data.choice.xop__Include.id = NULL;
    data.choice.xop__Include.type = "text/xml; charset=utf-8";
    data.choice.xop__Include.options = NULL;
    if (soap_call___m__EchoTestSingle(soap, argv[1], NULL, &data, &single))
      soap_print_fault(soap, stderr);
    else
    { if (!single.x__Data
       || single.x__Data->__union != SOAP_UNION_x__data_base64
       || !single.x__Data->choice.base64.__ptr
       || single.x__Data->choice.base64.__size != data.choice.xop__Include.__size
       || strcmp((char*)single.x__Data->choice.base64.__ptr, (char*)data.choice.xop__Include.__ptr))
        fprintf(stderr, "EchoTestSingle 2: data transcription error\n");
      else
      { fprintf(stderr, "EchoTestSingle 2: OK\n");
        /* Third test call */
        wrap.__size = argc - 2;
        wrap.Data = (struct x__DataType*)soap_malloc(soap, wrap.__size * sizeof(struct x__DataType));
        for (i = 0; i < wrap.__size; ++i)
        { soap_default_x__DataType(soap, &wrap.Data[i]);
          wrap.Data[i].__union = SOAP_UNION_x__data_base64;
          wrap.Data[i].choice.base64.__ptr = (unsigned char*)argv[i + 2];
          wrap.Data[i].choice.base64.__size = (int)strlen(argv[i + 2]) + 1;
          wrap.Data[i].xmlmime__contentType = "text/xml";
        }
        if (soap_call___m__EchoTestMultiple(soap, argv[1], NULL, &wrap, &multiple))
          soap_print_fault(soap, stderr);
        else
        { int okay = 1;
          if (!multiple.x__EchoTest
	   || multiple.x__EchoTest->__size != wrap.__size)
            okay = 0;
          else
          { for (i = 0; i < multiple.x__EchoTest->__size; ++i)
              if (multiple.x__EchoTest->Data[i].__union != SOAP_UNION_x__data_xop__Include
	       || !multiple.x__EchoTest->Data[i].choice.xop__Include.__ptr
	       || multiple.x__EchoTest->Data[i].choice.xop__Include.__size != wrap.Data[i].choice.base64.__size
	       || strcmp((char*)multiple.x__EchoTest->Data[i].choice.xop__Include.__ptr, (char*)wrap.Data[i].choice.base64.__ptr))
                okay = 0;
          }
          if (!okay)
            fprintf(stderr, "EchoTestMultiple 1: data transcription error\n");
          else
          { fprintf(stderr, "EchoTestMultiple 1: OK\n");
            /* Fourth test call */
            for (i = 0; i < wrap.__size; ++i)
            { soap_default_x__DataType(soap, &wrap.Data[i]);
              wrap.Data[i].__union = SOAP_UNION_x__data_xop__Include;
              wrap.Data[i].choice.xop__Include.__ptr = (unsigned char*)argv[i + 2];
              wrap.Data[i].choice.xop__Include.__size = (int)strlen(argv[i + 2]) + 1;
              wrap.Data[i].choice.xop__Include.id = NULL;
              wrap.Data[i].choice.xop__Include.type = "text/xml";
              wrap.Data[i].choice.xop__Include.options = NULL;
              wrap.Data[i].xmlmime__contentType = "text/xml";
            }
            if (soap_call___m__EchoTestMultiple(soap, argv[1], NULL, &wrap, &multiple))
              soap_print_fault(soap, stderr);
            else
            { int okay = 1;
              if (!multiple.x__EchoTest
	       || multiple.x__EchoTest->__size != wrap.__size)
                okay = 0;
              else
              { for (i = 0; i < multiple.x__EchoTest->__size; ++i)
                  if (multiple.x__EchoTest->Data[i].__union != SOAP_UNION_x__data_base64
		   || !multiple.x__EchoTest->Data[i].choice.base64.__ptr
		   || multiple.x__EchoTest->Data[i].choice.base64.__size != wrap.Data[i].choice.xop__Include.__size || strcmp((char*)multiple.x__EchoTest->Data[i].choice.base64.__ptr, (char*)wrap.Data[i].choice.xop__Include.__ptr))
                    okay = 0;
              }
              if (!okay)
                fprintf(stderr, "EchoTestMultiple 2: data transcription error\n");
              else
                fprintf(stderr, "EchoTestMultiple 2: OK\n");
            }
          }
        }
      }
    }
  }
  ret = soap->error;
  soap_destroy(soap);
  soap_end(soap);
  soap_done(soap);
  free(soap);
  return ret;
}

int __m__EchoTestSingle(struct soap *soap, struct x__DataType *data, struct __m__EchoTestSingleResponse *response)
{ if (!data)
    return soap_sender_fault(soap, "No data", NULL);
  /* allocate response */
  response->x__Data = (struct x__DataType*)soap_malloc(soap, sizeof(struct x__DataType));
  if (!response->x__Data)
    return SOAP_EOM;
  /* copy data into response, switching from base64 to MTOM and vice versa */
  switch (data->__union)
  { case SOAP_UNION_x__data_xop__Include:
      /* convert MTOM attachment to base64Binary */
      response->x__Data->__union = SOAP_UNION_x__data_base64;
      response->x__Data->choice.base64.__ptr = data->choice.xop__Include.__ptr;
      response->x__Data->choice.base64.__size = data->choice.xop__Include.__size;
      response->x__Data->xmlmime__contentType = data->choice.xop__Include.type;
      break;
    case SOAP_UNION_x__data_base64:
      /* convert base64Binary to MTOM attachment */
      response->x__Data->__union = SOAP_UNION_x__data_xop__Include;
      response->x__Data->choice.xop__Include.__ptr = data->choice.base64.__ptr;
      response->x__Data->choice.xop__Include.__size = data->choice.base64.__size;
      response->x__Data->choice.xop__Include.id = NULL;
      response->x__Data->choice.xop__Include.type = data->xmlmime__contentType;
      response->x__Data->choice.xop__Include.options = NULL;
      response->x__Data->xmlmime__contentType = data->xmlmime__contentType;
      break;
    default:
      return soap_sender_fault(soap, "Wrong data format", NULL);
  }
  return SOAP_OK;
}

int __m__EchoTestMultiple(struct soap *soap, struct x__WrapperType *x__EchoTest, struct __m__EchoTestMultipleResponse *response)
{ int i;
  if (!x__EchoTest)
    return soap_sender_fault(soap, "No data", NULL);
  /* allocate response */
  response->x__EchoTest = (struct x__WrapperType*)soap_malloc(soap, sizeof(struct x__WrapperType));
  if (!response->x__EchoTest)
    return SOAP_EOM;
  response->x__EchoTest->__size = x__EchoTest->__size;
  response->x__EchoTest->Data = (struct x__DataType*)soap_malloc(soap, sizeof(struct x__DataType) * x__EchoTest->__size);
  if (!response->x__EchoTest->Data)
    return SOAP_EOM;
  /* copy data into response, switching from base64 to MTOM and vice versa */
  for (i = 0; i < x__EchoTest->__size; ++i)
  { switch (x__EchoTest->Data[i].__union)
    { case SOAP_UNION_x__data_xop__Include:
        /* convert MTOM attachment to base64Binary */
        response->x__EchoTest->Data[i].__union = SOAP_UNION_x__data_base64;
        response->x__EchoTest->Data[i].choice.base64.__ptr = x__EchoTest->Data[i].choice.xop__Include.__ptr;
        response->x__EchoTest->Data[i].choice.base64.__size = x__EchoTest->Data[i].choice.xop__Include.__size;
        response->x__EchoTest->Data[i].xmlmime__contentType = x__EchoTest->Data[i].choice.xop__Include.type;
        break;
      case SOAP_UNION_x__data_base64:
        /* convert base64Binary to MTOM attachment */
        response->x__EchoTest->Data[i].__union = SOAP_UNION_x__data_xop__Include;
        response->x__EchoTest->Data[i].choice.xop__Include.__ptr = x__EchoTest->Data[i].choice.base64.__ptr;
        response->x__EchoTest->Data[i].choice.xop__Include.__size = x__EchoTest->Data[i].choice.base64.__size;
        response->x__EchoTest->Data[i].choice.xop__Include.id = NULL;
        response->x__EchoTest->Data[i].choice.xop__Include.type = x__EchoTest->Data[i].xmlmime__contentType;
        response->x__EchoTest->Data[i].choice.xop__Include.options = NULL;
        response->x__EchoTest->Data[i].xmlmime__contentType = x__EchoTest->Data[i].xmlmime__contentType;
        break;
      default:
        return soap_sender_fault(soap, "Wrong data format", NULL);
    }
  }
  return SOAP_OK;
}
