blob: 8a0b89420c5161fd5cd0ec8878bcb5eb7101d5cf [file] [log] [blame]
/* Copyright (c) 2003,2004, Stefan Haustein, Oberhausen, Rhld., Germany
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE. */
package org.ksoap2;
import java.io.*;
import org.ksoap2.kdom.*;
import org.xmlpull.v1.*;
/**
* A SOAP envelope, holding head and body objects. While this basic envelope
* supports literal encoding as content format via KDom, The
* SoapSerializationEnvelope provides support for the SOAP Serialization format
* specification and simple object serialization.
*/
public class SoapEnvelope {
/** SOAP Version 1.0 constant */
public static final int VER10 = 100;
/** SOAP Version 1.1 constant */
public static final int VER11 = 110;
/** SOAP Version 1.2 constant */
public static final int VER12 = 120;
public static final String ENV2003 = "http://www.w3.org/2003/05/soap-envelope";
public static final String ENC2003 = "http://www.w3.org/2003/05/soap-encoding";
/** Namespace constant: http://schemas.xmlsoap.org/soap/envelope/ */
public static final String ENV = "http://schemas.xmlsoap.org/soap/envelope/";
/** Namespace constant: http://schemas.xmlsoap.org/soap/encoding/ */
public static final String ENC = "http://schemas.xmlsoap.org/soap/encoding/";
/** Namespace constant: http://www.w3.org/2001/XMLSchema */
public static final String XSD = "http://www.w3.org/2001/XMLSchema";
/** Namespace constant: http://www.w3.org/2001/XMLSchema */
public static final String XSI = "http://www.w3.org/2001/XMLSchema-instance";
/** Namespace constant: http://www.w3.org/1999/XMLSchema */
public static final String XSD1999 = "http://www.w3.org/1999/XMLSchema";
/** Namespace constant: http://www.w3.org/1999/XMLSchema */
public static final String XSI1999 = "http://www.w3.org/1999/XMLSchema-instance";
//public static final String NS20 = "http://www.wi-fi-org/specifications/hotspot2dot0/spp/1.0/";
public static final String NS20 = "http://www.wi-fi.org/specifications/hotspot2dot0/v1.0/spp";
//public static final String OMADM12 = "http://www.openmobilealliance.org/tech/DTD/dm_ddf-v1_2.dtd";
/**
* Returns true for the string values "1" and "true", ignoring upper/lower
* case and whitespace, false otherwise.
*/
public static boolean stringToBoolean(String booleanAsString) {
if (booleanAsString == null) {
return false;
}
booleanAsString = booleanAsString.trim().toLowerCase();
return (booleanAsString.equals("1") || booleanAsString.equals("true"));
}
/**
* The body object received with this envelope. Will be an KDom Node for
* literal encoding. For SOAP Serialization, please refer to
* SoapSerializationEnvelope.
*/
public Object bodyIn;
/**
* The body object to be sent with this envelope. Must be a KDom Node
* modelling the remote call including all parameters for literal encoding.
* For SOAP Serialization, please refer to SoapSerializationEnvelope
*/
public Object bodyOut;
/**
* Incoming header elements
*/
public Element[] headerIn;
/**
* Outgoing header elements
*/
public Element[] headerOut;
public String encodingStyle;
/**
* The SOAP version, set by the constructor
*/
public int version;
/** Envelope namespace, set by the constructor */
public String env;
/** Encoding namespace, set by the constructor */
public String enc;
/** Xml Schema instance namespace, set by the constructor */
public String xsi;
/** Xml Schema data namespace, set by the constructor */
public String xsd;
///M: HS20 Add by Jungo
public String ns;
public String omadm;
/**
* Initializes a SOAP Envelope. The version parameter must be set to one of
* VER10, VER11 or VER12
*/
public SoapEnvelope(int version) {
this.version = version;
if (version == SoapEnvelope.VER10) {
xsi = SoapEnvelope.XSI1999;
xsd = SoapEnvelope.XSD1999;
} else {
xsi = SoapEnvelope.XSI;
xsd = SoapEnvelope.XSD;
}
if (version < SoapEnvelope.VER12) {
enc = SoapEnvelope.ENC;
env = SoapEnvelope.ENV;
} else {
enc = SoapEnvelope.ENC2003;
env = SoapEnvelope.ENV2003;
}
ns = SoapEnvelope.NS20;
//omadm = SoapEnvelope.OMADM12;
}
/** Parses the SOAP envelope from the given parser */
public void parse(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.nextTag();
parser.require(XmlPullParser.START_TAG, env, "Envelope");
encodingStyle = parser.getAttributeValue(env, "encodingStyle");
parser.nextTag();
if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getNamespace().equals(env)
&& parser.getName().equals("Header")) {
parseHeader(parser);
parser.require(XmlPullParser.END_TAG, env, "Header");
parser.nextTag();
}
parser.require(XmlPullParser.START_TAG, env, "Body");
encodingStyle = parser.getAttributeValue(env, "encodingStyle");
parseBody(parser);
parser.require(XmlPullParser.END_TAG, env, "Body");
parser.nextTag();
parser.require(XmlPullParser.END_TAG, env, "Envelope");
}
public void parseHeader(XmlPullParser parser) throws IOException, XmlPullParserException {
// consume start header
parser.nextTag();
// look at all header entries
Node headers = new Node();
headers.parse(parser);
int count = 0;
for (int i = 0; i < headers.getChildCount(); i++) {
Element child = headers.getElement(i);
if (child != null) {
count++;
}
}
headerIn = new Element[count];
count = 0;
for (int i = 0; i < headers.getChildCount(); i++) {
Element child = headers.getElement(i);
if (child != null) {
headerIn[count++] = child;
}
}
}
public void parseBody(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.nextTag();
// insert fault generation code here
if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getNamespace().equals(env)
&& parser.getName().equals("Fault")) {
SoapFault fault;
if (this.version < SoapEnvelope.VER12) {
fault = new SoapFault(this.version);
} else {
fault = new SoapFault12(this.version);
}
fault.parse(parser);
bodyIn = fault;
} else {
Node node = (bodyIn instanceof Node) ? (Node) bodyIn : new Node();
node.parse(parser);
bodyIn = node;
}
}
/**
* Writes the complete envelope including header and body elements to the
* given XML writer.
*/
public void write(XmlSerializer writer) throws IOException {
///M: HS20 modify by Jungo
//writer.setPrefix("i", xsi);
//writer.setPrefix("d", xsd);
//writer.setPrefix("c", enc);
writer.setPrefix("soap", env);//the prefix for namespace env in xml output
writer.setPrefix("spp", ns);
//writer.setPrefix("omadm", omadm);
writer.startTag(env, "Envelope");
writer.startTag(env, "Header");
writeHeader(writer);
writer.endTag(env, "Header");
writer.startTag(env, "Body");
writeBody(writer);
writer.endTag(env, "Body");
writer.endTag(env, "Envelope");
}
/**
* Writes the header elements contained in headerOut
*/
public void writeHeader(XmlSerializer writer) throws IOException {
if (headerOut != null) {
for (int i = 0; i < headerOut.length; i++) {
headerOut[i].write(writer);
}
}
}
/**
* Writes the SOAP body stored in the object variable bodyIn, Overwrite this
* method for customized writing of the soap message body.
*/
public void writeBody(XmlSerializer writer) throws IOException {
if (encodingStyle != null) {
writer.attribute(env, "encodingStyle", encodingStyle);
}
((Node) bodyOut).write(writer);
}
/**
* Assigns the object to the envelope as the outbound message for the soap call.
* @param soapObject the object to send in the soap call.
*/
public void setOutputSoapObject(Object soapObject) {
bodyOut = soapObject;
}
}