axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From di...@apache.org
Subject cvs commit: ws-axis/c/src/soap/xsd Integer.cpp Integer.hpp
Date Fri, 14 Jan 2005 13:42:20 GMT
dicka       2005/01/14 05:42:20

  Modified:    c/src/common ArrayBean.cpp BasicTypeSerializer.cpp
                        BasicTypeSerializer.h Param.h
               c/src/engine/client Call.cpp
               c/src/platforms/unix PlatformSpecificUnix.hpp
               c/src/platforms/windows PlatformSpecificWindows.hpp
               c/src/soap SoapDeSerializer.cpp SoapDeSerializer.h
                        SoapSerializer.cpp
  Added:       c/src/soap/xsd Integer.cpp Integer.hpp
  Log:
  Add Integer type to Simple types OO model.  Also associated changes for 64bit integers being
added to platform files.
  
  Submitted by: Adrian Dick
  
  Revision  Changes    Path
  1.31      +2 -13     ws-axis/c/src/common/ArrayBean.cpp
  
  Index: ArrayBean.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/common/ArrayBean.cpp,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- ArrayBean.cpp	10 Nov 2004 17:04:44 -0000	1.30
  +++ ArrayBean.cpp	14 Jan 2005 13:42:18 -0000	1.31
  @@ -82,17 +82,11 @@
                   break;
               case XSD_LONG:
               case XSD_UNSIGNEDLONG:
  -//FJP v Added
   			{
  -#ifdef WIN32
  -                __int64* a = (__int64*)m_value.sta;
  -#else
  -                long long* a = (long long *)m_value.sta;
  -#endif
  +                LONGLONG* a = (LONGLONG *)m_value.sta;
                   delete [] a;
               }
                   break;
  -//FJP ^ Added
               case XSD_INTEGER:
               case XSD_DURATION:		
               {
  @@ -246,13 +240,8 @@
                   break;
               case XSD_LONG:
               case XSD_UNSIGNEDLONG:
  -//FJP v Added
   			{
  -#ifdef WIN32
  -                __int64* p = (__int64*)m_value.sta;
  -#else
  -                long long* p = (long long*)m_value.sta;
  -#endif
  +                LONGLONG* p = (LONGLONG*)m_value.sta;
                   for (int ix=0;ix<m_nSize;ix++)
                   {
                       pSZ.serializeAsElement(m_ItemName.c_str(), (void*)p, m_type);
  
  
  
  1.39      +10 -18    ws-axis/c/src/common/BasicTypeSerializer.cpp
  
  Index: BasicTypeSerializer.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/common/BasicTypeSerializer.cpp,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- BasicTypeSerializer.cpp	12 Jan 2005 16:43:46 -0000	1.38
  +++ BasicTypeSerializer.cpp	14 Jan 2005 13:42:18 -0000	1.39
  @@ -86,18 +86,14 @@
               m_sSZ += m_Buf;
               break;
           case XSD_LONG:
  -//FJP v Added
  -#ifdef WIN32
  -            AxisSprintf (m_Buf, BTS_BUFFSIZE, "%I64d", *((__int64*)(pValue)));
  -#else
  -            AxisSprintf (m_Buf, BTS_BUFFSIZE, "%lld", *((long long*)(pValue)));
  -#endif
  +            AxisSprintf (m_Buf, BTS_BUFFSIZE, PRINTF_LONGLONG_FORMAT_SPECIFIER, *((LONGLONG*)(pValue)));
               m_sSZ += m_Buf;
               break;
  -//FJP ^ Added
           case XSD_INTEGER:
  -            AxisSprintf (m_Buf, BTS_BUFFSIZE, "%ld", *((long*)(pValue)));
  -            m_sSZ += m_Buf;
  +            {
  +                Integer integerSerializer;
  +                m_sSZ += integerSerializer.serialize(pValue);
  +            }
               break;
           case XSD_DURATION:
           	{
  @@ -305,18 +301,14 @@
               m_sSZ += m_Buf;
               break;
           case XSD_LONG:
  -//FJP v Added
  -#ifdef WIN32
  -            AxisSprintf (m_Buf, BTS_BUFFSIZE, "%lld", *((__int64*)(pValue)));
  -#else
  -            AxisSprintf (m_Buf, BTS_BUFFSIZE, "%lld", *((long long*)(pValue)));
  -#endif
  +            AxisSprintf (m_Buf, BTS_BUFFSIZE, PRINTF_LONGLONG_FORMAT_SPECIFIER, *((LONGLONG*)(pValue)));
               m_sSZ += m_Buf;
               break;
  -//FJP ^ Added
           case XSD_INTEGER:
  -            AxisSprintf (m_Buf, BTS_BUFFSIZE, "%ld", *((long*)(pValue)));
  -            m_sSZ += m_Buf;
  +            {
  +                Integer integerSerializer;
  +                m_sSZ += integerSerializer.serialize(pValue);
  +            }
               break;
           case XSD_DURATION:
           	{
  
  
  
  1.23      +1 -0      ws-axis/c/src/common/BasicTypeSerializer.h
  
  Index: BasicTypeSerializer.h
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/common/BasicTypeSerializer.h,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- BasicTypeSerializer.h	12 Jan 2005 16:43:46 -0000	1.22
  +++ BasicTypeSerializer.h	14 Jan 2005 13:42:18 -0000	1.23
  @@ -43,6 +43,7 @@
   #include "../soap/xsd/Float.hpp"
   #include "../soap/xsd/Double.hpp"
   #include "../soap/xsd/Decimal.hpp"
  +#include "../soap/xsd/Integer.hpp"
   
   using namespace std;
   
  
  
  
  1.26      +2 -7      ws-axis/c/src/common/Param.h
  
  Index: Param.h
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/common/Param.h,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- Param.h	22 Nov 2004 10:40:00 -0000	1.25
  +++ Param.h	14 Jan 2005 13:42:18 -0000	1.26
  @@ -22,6 +22,7 @@
   #define _PARAM_H____OF_AXIS_INCLUDED_
   
   #include "ComplexObjectHandler.h"
  +#include "../platforms/PlatformAutoSense.hpp"
   
   AXIS_CPP_NAMESPACE_START
   
  @@ -36,13 +37,7 @@
       unsigned short usValue;
       long lValue;
       unsigned ulValue;
  -//FJP v Added
  -#ifdef WIN32
  -    __int64 llValue;
  -#else
  -    long long llValue;
  -#endif
  -//FJP ^ Added
  +    LONGLONG llValue;
       char cValue;
       unsigned char ucValue;
       float fValue;
  
  
  
  1.91      +2 -8      ws-axis/c/src/engine/client/Call.cpp
  
  Index: Call.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/engine/client/Call.cpp,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -r1.90 -r1.91
  --- Call.cpp	11 Jan 2005 16:58:00 -0000	1.90
  +++ Call.cpp	14 Jan 2005 13:42:19 -0000	1.91
  @@ -476,17 +476,11 @@
       return m_pIWSDZ->getElementAsUnsignedByte (pName, pNamespace);
   }
   
  -#ifdef WIN32
  -__int64 Call::getElementAsLong (const AxisChar* pName, const AxisChar* pNamespace)
  +LONGLONG Call::getElementAsLong (const AxisChar* pName, const AxisChar* pNamespace)
   {
       return m_pIWSDZ->getElementAsLong (pName, pNamespace);
   }
  -#else
  -long long Call::getElementAsLong (const AxisChar* pName, const AxisChar* pNamespace)
  -{
  -    return m_pIWSDZ->getElementAsLong (pName, pNamespace);
  -}
  -#endif
  +
   long Call::getElementAsInteger (const AxisChar* pName, 
       const AxisChar* pNamespace)
   {
  
  
  
  1.12      +10 -1     ws-axis/c/src/platforms/unix/PlatformSpecificUnix.hpp
  
  Index: PlatformSpecificUnix.hpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/platforms/unix/PlatformSpecificUnix.hpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- PlatformSpecificUnix.hpp	13 Jan 2005 17:03:06 -0000	1.11
  +++ PlatformSpecificUnix.hpp	14 Jan 2005 13:42:19 -0000	1.12
  @@ -83,7 +83,6 @@
    */
   #define GETLASTERROR errno;
   
  -
   /**
    * From the last error number get a sensible std::string representing it
    * @param errorNumber the error Number you are trying to get a message for
  @@ -91,6 +90,16 @@
    */
   #include <string>
   #define PLATFORM_GET_ERROR_MESSAGE(errorNumber) new string(strerror(errorNumber));
  +
  +/**
  + * type to be used for 64bit integers
  + */
  +#define LONGLONG long long
  +
  +/**
  + * Format string to be used in printf for 64bit integers
  + */
  +#define PRINTF_LONGLONG_FORMAT_SPECIFIER "%lld"
   
   #endif
   
  
  
  
  1.12      +10 -1     ws-axis/c/src/platforms/windows/PlatformSpecificWindows.hpp
  
  Index: PlatformSpecificWindows.hpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/platforms/windows/PlatformSpecificWindows.hpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- PlatformSpecificWindows.hpp	14 Jan 2005 09:00:33 -0000	1.11
  +++ PlatformSpecificWindows.hpp	14 Jan 2005 13:42:19 -0000	1.12
  @@ -86,8 +86,17 @@
    */
   #define PLATFORM_GET_ERROR_MESSAGE(errorNumber) getPlatformErrorMessage(errorNumber);
   
  -std::string* getPlatformErrorMessage(long errorNumber);
  +/**
  + * type to be used for 64bit integers
  + */
  +#define LONGLONG __int64
  +
  +/**
  + * Format string to be used in printf for 64bit integers
  + */
  +#define PRINTF_LONGLONG_FORMAT_SPECIFIER "%I64d"
   
  +std::string* getPlatformErrorMessage(long errorNumber);
   
   #endif
   
  
  
  
  1.124     +27 -21    ws-axis/c/src/soap/SoapDeSerializer.cpp
  
  Index: SoapDeSerializer.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapDeSerializer.cpp,v
  retrieving revision 1.123
  retrieving revision 1.124
  diff -u -r1.123 -r1.124
  --- SoapDeSerializer.cpp	12 Jan 2005 16:43:46 -0000	1.123
  +++ SoapDeSerializer.cpp	14 Jan 2005 13:42:19 -0000	1.124
  @@ -70,11 +70,6 @@
   
   AXIS_CPP_NAMESPACE_START
   #define INITIAL_ARRAY_SIZE 1
  -#ifdef WIN32
  -#define LONGLONG __int64
  -#else
  -#define LONGLONG long long
  -#endif
       SoapDeSerializer::SoapDeSerializer ()
   {
       m_pParser = XMLParserFactory::getParserObject ();
  @@ -879,6 +874,7 @@
   
   /* Following macros are used just to shorten the coding */
   #define CONV_STRTOL(str) strtol(str, &m_pEndptr, 10)
  +#define CONV_STRTOINTEGER(str) AxisSoapDeSerializerStringToInteger(str)
   #define CONV_STRTOUL(str) strtoul(str, &m_pEndptr, 10)
   #define CONV_STRTODECIMAL(str) AxisSoapDeSerializerStringToDecimal(str)
   #define CONV_STRTOFLOAT(str) AxisSoapDeSerializerStringToFloat(str)
  @@ -895,6 +891,12 @@
   #define CONV_STRTOQNAME(str) AxisSoapDeSerializerStringToQName(str)
   #define CONV_STRTONOTATION(str) AxisSoapDeSerializerStringToNotation(str)
   
  +LONGLONG AxisSoapDeSerializerStringToInteger(const char *valueAsChar)
  +{
  +    Integer integerDeserializer;
  +    return *( integerDeserializer.deserializeInteger(valueAsChar));
  +}
  +
   double AxisSoapDeSerializerStringToDecimal(const char *valueAsChar)
   {
   	Decimal decimalDeserializer;
  @@ -1175,7 +1177,7 @@
   		    case XSD_LONG:
   		    	DESERIALIZE_ENCODED_ARRAY_BLOCK (LONGLONG, CONV_STRTOUL)
   		    case XSD_INTEGER:
  -		    	DESERIALIZE_ENCODED_ARRAY_BLOCK (long, CONV_STRTOL)
  +		    	DESERIALIZE_ENCODED_ARRAY_BLOCK (LONGLONG, CONV_STRTOINTEGER)
   		    case XSD_UNSIGNEDLONG:
   		    	DESERIALIZE_ENCODED_ARRAY_BLOCK (unsigned long, CONV_STRTOUL)
   		    case XSD_FLOAT:
  @@ -1453,7 +1455,7 @@
   	
   		// < FJP
   		case XSD_INTEGER:
  -		    DESERIALIZE_LITERAL_ARRAY_BLOCK (long, CONV_STRTOL)
  +		    DESERIALIZE_LITERAL_ARRAY_BLOCK (LONGLONG, CONV_STRTOINTEGER)
   		case XSD_UNSIGNEDLONG:
   			DESERIALIZE_LITERAL_ARRAY_BLOCK (unsigned long, CONV_STRTOUL)
   		case XSD_FLOAT:
  @@ -2121,7 +2123,7 @@
   SoapDeSerializer::getAttributeAsInteger (const AxisChar * pName, const
   					 AxisChar * pNamespace)
   {
  -DESERIALIZE_GET_ATTRIBUTE_AS (long, CONV_STRTOL, INIT_VALUE_NUMBER)}
  +DESERIALIZE_GET_ATTRIBUTE_AS (LONGLONG, CONV_STRTOINTEGER, INIT_VALUE_NUMBER)}
   unsigned long
   SoapDeSerializer::getAttributeAsUnsignedLong (const AxisChar *
   					      pName, const
  @@ -2792,7 +2794,7 @@
   SoapDeSerializer::getElementAsInteger (const AxisChar * pName,
   				       const AxisChar * pNamespace)
   {
  -    long ret = 0;
  +    LONGLONG ret = 0;
       if (AXIS_SUCCESS != m_nStatus)
   	return ret;
       if (RPC_ENCODED == m_nStyle)
  @@ -2806,9 +2808,10 @@
   	    m_pNode = m_pParser->next (true);	/* charactor node */
   	    if (m_pNode && (CHARACTER_ELEMENT == m_pNode->m_type))
   	    {
  -		ret = strtol (m_pNode->m_pchNameOrValue, &m_pEndptr, 10);
  -		m_pNode = m_pParser->next ();	/* skip end element node too */
  -		return ret;
  +            Integer integerDeserializer;
  +    		ret = *(integerDeserializer.deserializeInteger(m_pNode->m_pchNameOrValue));
  +    	   	m_pNode = m_pParser->next ();	/* skip end element node too */
  +    		return ret;
   	    }
   	}
   	else
  @@ -2831,13 +2834,14 @@
   	    m_pNode = m_pParser->next (true);	/* charactor node */
   	    if (m_pNode && (CHARACTER_ELEMENT == m_pNode->m_type))
   	    {
  -		ret = strtol (m_pNode->m_pchNameOrValue, &m_pEndptr, 10);
  -		m_pNode = m_pParser->next ();	/* skip end element node too */
  -		m_pNode = NULL;
  -		/* this is important in doc/lit style when deserializing
  -		 * arrays 
  -		 */
  -		return ret;
  +    		Integer integerDeserializer;
  +            ret = *(integerDeserializer.deserializeInteger(m_pNode->m_pchNameOrValue));
  +    		m_pNode = m_pParser->next ();	/* skip end element node too */
  +    		m_pNode = NULL;
  +    		/* this is important in doc/lit style when deserializing
  +    		 * arrays 
  +    		 */
  +    		return ret;
   	    }
   	    else
   	    {
  @@ -4365,8 +4369,10 @@
   		strtol (m_pNode->m_pchNameOrValue, &m_pEndptr, 10);
   	    break;
   	case XSD_INTEGER:
  -	    *((long *) (pValue)) =
  -		strtol (m_pNode->m_pchNameOrValue, &m_pEndptr, 10);
  +        {
  +            Integer integerDeserializer;
  +            pValue = integerDeserializer.deserialize(m_pNode->m_pchNameOrValue);
  +        }
   	    break;
   	case XSD_DURATION:
   		{
  
  
  
  1.25      +4 -11     ws-axis/c/src/soap/SoapDeSerializer.h
  
  Index: SoapDeSerializer.h
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapDeSerializer.h,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- SoapDeSerializer.h	12 Jan 2005 16:43:47 -0000	1.24
  +++ SoapDeSerializer.h	14 Jan 2005 13:42:19 -0000	1.25
  @@ -34,6 +34,8 @@
   #include "xsd/Float.hpp"
   #include "xsd/Double.hpp"
   #include "xsd/Decimal.hpp"
  +#include "xsd/Integer.hpp"
  +#include "../platforms/PlatformAutoSense.hpp"
   
   AXIS_CPP_NAMESPACE_START
   
  @@ -146,13 +148,8 @@
           const AxisChar* pNamespace);
       unsigned char AXISCALL getElementAsUnsignedByte(const AxisChar* pName, 
           const AxisChar* pNamespace);
  -#ifdef WIN32
  -    __int64 AXISCALL getElementAsLong(const AxisChar* pName, 
  +    LONGLONG AXISCALL getElementAsLong(const AxisChar* pName, 
           const AxisChar* pNamespace);
  -#else
  -    long long AXISCALL getElementAsLong(const AxisChar* pName, 
  -        const AxisChar* pNamespace);
  -#endif
       long AXISCALL getElementAsInteger(const AxisChar* pName, 
           const AxisChar* pNamespace);
       unsigned long AXISCALL getElementAsUnsignedLong(const AxisChar* pName, 
  @@ -263,11 +260,7 @@
       xsd__base64Binary decodeFromBase64Binary(const AxisChar* pValue);
       xsd__hexBinary decodeFromHexBinary(const AxisChar* pValue);
   
  -#ifdef WIN32
  -	__int64 strtoll(const char *);
  -#else
  -	long long strtoll(const char *);
  -#endif
  +	LONGLONG strtoll(const char *);
   };
   
   AXIS_CPP_NAMESPACE_END
  
  
  
  1.86      +2 -14     ws-axis/c/src/soap/SoapSerializer.cpp
  
  Index: SoapSerializer.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapSerializer.cpp,v
  retrieving revision 1.85
  retrieving revision 1.86
  diff -u -r1.85 -r1.86
  --- SoapSerializer.cpp	13 Jan 2005 14:05:42 -0000	1.85
  +++ SoapSerializer.cpp	14 Jan 2005 13:42:19 -0000	1.86
  @@ -604,14 +604,8 @@
           pParam->m_Value.ucValue = *((unsigned char*)(pValue));
           break;
       case XSD_LONG:
  -//FJP v Added
  -#ifdef WIN32
  -        pParam->m_Value.llValue = *((__int64*)(pValue));
  -#else
  -        pParam->m_Value.llValue = *((long long*)(pValue));
  -#endif
  +        pParam->m_Value.llValue = *((LONGLONG*)(pValue));
           break;
  -//FJP ^ Added
       case XSD_INTEGER:
           pParam->m_Value.lValue = *((long*)(pValue));
           break;        
  @@ -890,14 +884,8 @@
               *((unsigned char*)(pValue)));
           break;
       case XSD_LONG:
  -//FJP v Added
  -#ifdef WIN32
  -        AxisSprintf (m_Buf, BTS_BUFFSIZE, "%lld", *((__int64*)(pValue)));
  -#else
  -        AxisSprintf (m_Buf, BTS_BUFFSIZE, "%lld", *((long long*)(pValue)));
  -#endif
  +        AxisSprintf (m_Buf, BTS_BUFFSIZE, PRINTF_LONGLONG_FORMAT_SPECIFIER, *((LONGLONG*)(pValue)));
           break;
  -//FJP ^ Added
       case XSD_INTEGER:
           AxisSprintf (m_Buf, BTS_BUFFSIZE, "%ld", *((long*)(pValue)));
           break;
  
  
  
  1.1                  ws-axis/c/src/soap/xsd/Integer.cpp
  
  Index: Integer.cpp
  ===================================================================
  #include "Integer.hpp"
  
  AXIS_CPP_NAMESPACE_START
  
  AxisChar* Integer::serialize(const void* value) throw (AxisSoapException)
  {
      return serialize((LONGLONG*) value);  
  }
  
  void* Integer::deserialize(const AxisChar* valueAsChar) throw (AxisSoapException)
  {
     return (void*) deserializeInteger(valueAsChar);
  }
  
  
  AxisChar* Integer::serialize(const LONGLONG* value) throw (AxisSoapException)
  {
      AxisSprintf (m_Buf, 80, "%lld", *value);
      return m_Buf;
  }
  
  LONGLONG* Integer::deserializeInteger(const AxisChar* valueAsChar) throw (AxisSoapException)
  {
      AxisChar* end;
      m_Integer = new LONGLONG;
      *m_Integer = strtol (valueAsChar, &end, 10);
    
      return m_Integer;
  }
  
  AXIS_CPP_NAMESPACE_END
  
  
  
  1.1                  ws-axis/c/src/soap/xsd/Integer.hpp
  
  Index: Integer.hpp
  ===================================================================
  /* -*- C++ -*- */
  /*
   *   Copyright 2003-2004 The Apache Software Foundation.
   *
   *   Licensed under the Apache License, Version 2.0 (the "License");
   *   you may not use this file except in compliance with the License.
   *   You may obtain a copy of the License at
   *
   *       http://www.apache.org/licenses/LICENSE-2.0
   *
   *   Unless required by applicable law or agreed to in writing, software
   *   distributed under the License is distributed on an "AS IS" BASIS,
   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *   See the License for the specific language governing permissions and
   *   limitations under the License.
   *
   *
   * @author Adrian Dick (adrian.dick@uk.ibm.com)
   *
   */
  
  #if !defined(_INTEGER_HPP____OF_AXIS_INCLUDED_)
  #define _INTEGER_HPP____OF_AXIS_INCLUDED_
  
  #include "Decimal.hpp"
  #include "../../platforms/PlatformAutoSense.hpp"
  
  AXIS_CPP_NAMESPACE_START
  
  using namespace std;
  
  class Integer : public Decimal {
  public:
  
      /**
      * Serialize value to it's on-the-wire string form.
      * @param value The value to be serialized.
      * @return Serialized form of value.
     */
      AxisChar* serialize(const void* value) throw (AxisSoapException);
      
    /**
      * Deserialize value from it's on-the-wire string form.
      * @param valueAsChar Serialized form of value.
      * @return Deserialized value.
       */
      void* deserialize(const AxisChar* valueAsChar) throw (AxisSoapException);
      
    /**
      * Serialize Integer value to it's on-the-wire string form.
      * @param value The Integer value to be serialized.
      * @return Serialized form of Integer value.
     */
      AxisChar* serialize(const LONGLONG* value) throw (AxisSoapException);
    
    /**
      * Deserialized Integer value from it's on-the-wire string form.
     * @param valueAsChar Serialized form of Integer value.
      * @return Deserialized Integer value.
       */
      LONGLONG* deserializeInteger(const AxisChar* valueAsChar) throw (AxisSoapException);
  
  private:
     AxisChar m_Buf[80];
     LONGLONG* m_Integer;
  };
  
  AXIS_CPP_NAMESPACE_END
  
  #endif
  
  
  

Mime
View raw message